diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-08-19 02:30:28 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-08-19 02:30:28 +0000 |
commit | c52efa7d4011a48ea91b353f2cbc40a359d19571 (patch) | |
tree | edd1bd081f23d3ebd966becab206533d8198cbca | |
parent | 72be1c1b64f912246dcada007f0dddf8a29be584 (diff) | |
download | bcm5719-llvm-c52efa7d4011a48ea91b353f2cbc40a359d19571.tar.gz bcm5719-llvm-c52efa7d4011a48ea91b353f2cbc40a359d19571.zip |
[modules] Don't eagerly deserialize so many ImportDecls. CodeGen basically ignores ImportDecls imported from modules, so only eagerly deserialize the ones from a PCH / preamble.
llvm-svn: 245406
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 7 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 17 |
2 files changed, 13 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 76e6f3dcde4..6352646f19c 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3363,11 +3363,8 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) { auto *Import = cast<ImportDecl>(D); // Ignore import declarations that come from imported modules. - if (clang::Module *Owner = Import->getImportedOwningModule()) { - if (getLangOpts().CurrentModule.empty() || - Owner->getTopLevelModule()->Name == getLangOpts().CurrentModule) - break; - } + if (Import->getImportedOwningModule()) + break; if (CGDebugInfo *DI = getModuleDebugInfo()) DI->EmitImportDecl(*Import); diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index fd6708dd5c3..02e1a4b0b9f 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -1994,14 +1994,19 @@ void ASTWriter::WriteDeclAbbrevs() { /// clients to use a separate API call to "realize" the decl. This should be /// relatively painless since they would presumably only do it for top-level /// decls. -static bool isRequiredDecl(const Decl *D, ASTContext &Context) { +static bool isRequiredDecl(const Decl *D, ASTContext &Context, + bool WritingModule) { // An ObjCMethodDecl is never considered as "required" because its // implementation container always is. - // File scoped assembly or obj-c implementation must be seen. ImportDecl is - // used by codegen to determine the set of imported modules to search for - // inputs for automatic linking. - if (isa<FileScopeAsmDecl>(D) || isa<ObjCImplDecl>(D) || isa<ImportDecl>(D)) + // File scoped assembly or obj-c implementation must be seen. + if (isa<FileScopeAsmDecl>(D) || isa<ObjCImplDecl>(D)) + return true; + + // ImportDecl is used by codegen to determine the set of imported modules to + // search for inputs for automatic linking; include it if it has a semantic + // effect. + if (isa<ImportDecl>(D) && !WritingModule) return true; return Context.DeclMustBeEmitted(D); @@ -2090,7 +2095,7 @@ void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) { // Note declarations that should be deserialized eagerly so that we can add // them to a record in the AST file later. - if (isRequiredDecl(D, Context)) + if (isRequiredDecl(D, Context, WritingModule)) EagerlyDeserializedDecls.push_back(ID); } |