Merge "Optimization : Do not recurse into unexported Abi."

am: 4a67eaddd6

Change-Id: I1e6941f7be5bb85775625487227813cf6c1b4874
This commit is contained in:
Jayant Chowdhary
2017-02-24 20:15:50 +00:00
committed by android-build-merger
4 changed files with 42 additions and 33 deletions

View File

@@ -23,13 +23,14 @@ using namespace abi_wrapper;
ABIWrapper::ABIWrapper(
clang::MangleContext *mangle_contextp,
const clang::ASTContext *ast_contextp,
const clang::CompilerInstance *compiler_instance_p)
: mangle_contextp_(mangle_contextp),
ast_contextp_(ast_contextp),
cip_(compiler_instance_p) { }
const clang::CompilerInstance *cip)
: cip_(cip),
mangle_contextp_(mangle_contextp),
ast_contextp_(ast_contextp) { }
std::string ABIWrapper::GetDeclSourceFile(const clang::NamedDecl *decl) const {
clang::SourceManager &sm = cip_->getSourceManager();
std::string ABIWrapper::GetDeclSourceFile(const clang::Decl *decl,
const clang::CompilerInstance *cip) {
clang::SourceManager &sm = cip->getSourceManager();
clang::SourceLocation location = decl->getLocation();
llvm::StringRef file_name = sm.getFilename(location);
llvm::SmallString<128> abs_path(file_name.str());
@@ -199,7 +200,7 @@ std::unique_ptr<abi_dump::FunctionDecl>
FunctionDeclWrapper::GetFunctionDecl() const {
std::unique_ptr<abi_dump::FunctionDecl> abi_decl(
new abi_dump::FunctionDecl());
std::string source_file = GetDeclSourceFile(function_decl_);
std::string source_file = GetDeclSourceFile(function_decl_, cip_);
if (!SetupFunction(abi_decl.get(), source_file)) {
return nullptr;
}
@@ -316,7 +317,7 @@ void RecordDeclWrapper::SetupRecordInfo(abi_dump::RecordDecl *record_declp,
std::unique_ptr<abi_dump::RecordDecl> RecordDeclWrapper::GetRecordDecl() const {
std::unique_ptr<abi_dump::RecordDecl> abi_decl(new abi_dump::RecordDecl());
std::string source_file = GetDeclSourceFile(record_decl_);
std::string source_file = GetDeclSourceFile(record_decl_, cip_);
SetupRecordInfo(abi_decl.get(), source_file);
if (!SetupRecordFields(abi_decl.get(), source_file)) {
llvm::errs() << "Setting up Record Fields failed\n";
@@ -362,7 +363,7 @@ bool EnumDeclWrapper::SetupEnum(abi_dump::EnumDecl *enump,
std::unique_ptr<abi_dump::EnumDecl> EnumDeclWrapper::GetEnumDecl() const {
std::unique_ptr<abi_dump::EnumDecl> abi_decl(new abi_dump::EnumDecl());
std::string source_file = GetDeclSourceFile(enum_decl_);
std::string source_file = GetDeclSourceFile(enum_decl_, cip_);
if (!SetupEnum(abi_decl.get(), source_file)) {
llvm::errs() << "Setting up Enum fields failed\n";

View File

@@ -31,9 +31,10 @@ class ABIWrapper {
public:
ABIWrapper(clang::MangleContext *mangle_contextp,
const clang::ASTContext *ast_contextp,
const clang::CompilerInstance *compiler_instance_p);
const clang::CompilerInstance *cip);
std::string GetDeclSourceFile(const clang::NamedDecl *decl) const;
static std::string GetDeclSourceFile(const clang::Decl *decl,
const clang::CompilerInstance *cip);
protected:
std::string AccessToString(const clang::AccessSpecifier sp) const;
@@ -49,10 +50,13 @@ class ABIWrapper {
std::string QualTypeToString(const clang::QualType &sweet_qt) const;
std::string GetTagDeclQualifiedName(const clang::TagDecl *decl) const;
protected:
const clang::CompilerInstance *cip_;
private:
clang::MangleContext *mangle_contextp_;
const clang::ASTContext *ast_contextp_;
const clang::CompilerInstance *cip_;
};
class RecordDeclWrapper : public ABIWrapper {

View File

@@ -25,6 +25,7 @@
#include <iostream>
#include <string>
using abi_wrapper::ABIWrapper;
using abi_wrapper::FunctionDeclWrapper;
using abi_wrapper::RecordDeclWrapper;
using abi_wrapper::EnumDeclWrapper;
@@ -35,13 +36,15 @@ HeaderASTVisitor::HeaderASTVisitor(
const clang::ASTContext *ast_contextp,
const clang::CompilerInstance *compiler_instance_p,
const std::string &current_file_name,
const std::set<std::string> &exported_headers)
const std::set<std::string> &exported_headers,
const clang::Decl *tu_decl)
: tu_ptr_(tu_ptr),
mangle_contextp_(mangle_contextp),
ast_contextp_(ast_contextp),
cip_(compiler_instance_p),
current_file_name_(current_file_name),
exported_headers_(exported_headers) { }
exported_headers_(exported_headers),
tu_decl_(tu_decl) { }
bool HeaderASTVisitor::VisitRecordDecl(const clang::RecordDecl *decl) {
// Forward declaration
@@ -50,12 +53,6 @@ bool HeaderASTVisitor::VisitRecordDecl(const clang::RecordDecl *decl) {
}
RecordDeclWrapper record_decl_wrapper(
mangle_contextp_, ast_contextp_, cip_, decl);
// TODO: Optimize source file initial check by preferably moving this into
// TraverseTranslationUnitDecl.
std::string source_file = record_decl_wrapper.GetDeclSourceFile(decl);
if (exported_headers_.find(source_file) == exported_headers_.end()) {
return true;
}
std::unique_ptr<abi_dump::RecordDecl> wrapped_record_decl =
record_decl_wrapper.GetRecordDecl();
if (!wrapped_record_decl) {
@@ -76,10 +73,6 @@ bool HeaderASTVisitor::VisitEnumDecl(const clang::EnumDecl *decl) {
}
EnumDeclWrapper enum_decl_wrapper(
mangle_contextp_, ast_contextp_, cip_, decl);
std::string source_file = enum_decl_wrapper.GetDeclSourceFile(decl);
if (exported_headers_.find(source_file) == exported_headers_.end()) {
return true;
}
std::unique_ptr<abi_dump::EnumDecl> wrapped_enum_decl =
enum_decl_wrapper.GetEnumDecl();
if (!wrapped_enum_decl) {
@@ -97,12 +90,6 @@ bool HeaderASTVisitor::VisitEnumDecl(const clang::EnumDecl *decl) {
bool HeaderASTVisitor::VisitFunctionDecl(const clang::FunctionDecl *decl) {
FunctionDeclWrapper function_decl_wrapper(
mangle_contextp_, ast_contextp_, cip_, decl);
// TODO: Optimize source file initial check by preferably moving this into
// TraverseTranslationUnitDecl.
std::string source_file = function_decl_wrapper.GetDeclSourceFile(decl);
if (exported_headers_.find(source_file) == exported_headers_.end()) {
return true;
}
std::unique_ptr<abi_dump::FunctionDecl> wrapped_function_decl =
function_decl_wrapper.GetFunctionDecl();
if (!wrapped_function_decl) {
@@ -117,6 +104,18 @@ bool HeaderASTVisitor::VisitFunctionDecl(const clang::FunctionDecl *decl) {
return true;
}
// We don't need to recurse into Declarations which are not exported.
bool HeaderASTVisitor::TraverseDecl(clang::Decl *decl) {
if (!decl)
return true;
std::string source_file = ABIWrapper::GetDeclSourceFile(decl, cip_);
if ((decl != tu_decl_) &&
(exported_headers_.find(source_file) == exported_headers_.end())) {
return true;
}
return RecursiveASTVisitor<HeaderASTVisitor>::TraverseDecl(decl);
}
HeaderASTConsumer::HeaderASTConsumer(
const std::string &file_name,
clang::CompilerInstance *compiler_instancep,
@@ -131,13 +130,13 @@ void HeaderASTConsumer::HandleTranslationUnit(clang::ASTContext &ctx) {
GOOGLE_PROTOBUF_VERIFY_VERSION;
std::ofstream text_output(out_dump_name_);
google::protobuf::io::OstreamOutputStream text_os(&text_output);
clang::TranslationUnitDecl* translation_unit = ctx.getTranslationUnitDecl();
clang::TranslationUnitDecl *translation_unit = ctx.getTranslationUnitDecl();
std::unique_ptr<clang::MangleContext> mangle_contextp(
ctx.createMangleContext());
abi_dump::TranslationUnit tu;
std::string str_out;
HeaderASTVisitor v(&tu, mangle_contextp.get(), &ctx, cip_, file_name_,
exported_headers_);
exported_headers_, translation_unit);
if (!v.TraverseDecl(translation_unit) ||
!google::protobuf::TextFormat::Print(tu, &text_os)) {
llvm::errs() << "Serialization to ostream failed\n";

View File

@@ -38,7 +38,8 @@ class HeaderASTVisitor
const clang::ASTContext *ast_contextp,
const clang::CompilerInstance *compiler_instance_p,
const std::string &current_file_name,
const std::set<std::string> &exported_headers);
const std::set<std::string> &exported_headers,
const clang::Decl *tu_decl);
bool VisitRecordDecl(const clang::RecordDecl *decl);
@@ -46,6 +47,8 @@ class HeaderASTVisitor
bool VisitEnumDecl(const clang::EnumDecl *decl);
bool TraverseDecl(clang::Decl *decl);
// Enable recursive traversal of template instantiations.
bool shouldVisitTemplateInstantiations() const {
return true;
@@ -58,6 +61,8 @@ class HeaderASTVisitor
const clang::CompilerInstance *cip_;
const std::string current_file_name_;
const std::set<std::string> &exported_headers_;
// To optimize recursion into only exported abi.
const clang::Decl *tu_decl_;
};
class HeaderASTConsumer : public clang::ASTConsumer {