Merge "Optimization : Do not recurse into unexported Abi."
am: 4a67eaddd6
Change-Id: I1e6941f7be5bb85775625487227813cf6c1b4874
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 ¤t_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";
|
||||
|
||||
@@ -38,7 +38,8 @@ class HeaderASTVisitor
|
||||
const clang::ASTContext *ast_contextp,
|
||||
const clang::CompilerInstance *compiler_instance_p,
|
||||
const std::string ¤t_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 {
|
||||
|
||||
Reference in New Issue
Block a user