diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-02-27 03:40:09 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-02-27 03:40:09 +0000 |
commit | 4a7e390c12157bd8e48295eae47291e05d292afa (patch) | |
tree | 38f057bbf9cc4e629c80368cfcb9b65da350b3a5 /clang/lib/Serialization/ASTWriter.cpp | |
parent | 4a528dd5be29ca72493205c1b9aeab88ce1e872f (diff) | |
download | bcm5719-llvm-4a7e390c12157bd8e48295eae47291e05d292afa.tar.gz bcm5719-llvm-4a7e390c12157bd8e48295eae47291e05d292afa.zip |
[modules] Don't write out name lookup table entries merely because the module
happened to query them; only write them out if something new was added.
llvm-svn: 230727
Diffstat (limited to 'clang/lib/Serialization/ASTWriter.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 3af2a4003ba..c70935c0c7d 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -3663,17 +3663,22 @@ public: } // end anonymous namespace template<typename Visitor> -static void visitLocalLookupResults(const DeclContext *ConstDC, - bool NeedToReconcileExternalVisibleStorage, - Visitor AddLookupResult) { +void ASTWriter::visitLocalLookupResults(const DeclContext *ConstDC, + Visitor AddLookupResult) { // FIXME: We need to build the lookups table, which is logically const. DeclContext *DC = const_cast<DeclContext*>(ConstDC); assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table"); SmallVector<DeclarationName, 16> ExternalNames; for (auto &Lookup : *DC->buildLookup()) { + // If there are no local declarations in our lookup result, we don't + // need to write an entry for the name at all unless we're rewriting + // the decl context. + if (!Lookup.second.hasLocalDecls() && !isRewritten(cast<Decl>(DC))) + continue; + if (Lookup.second.hasExternalDecls() || - NeedToReconcileExternalVisibleStorage) { + DC->NeedToReconcileExternalVisibleStorage) { // We don't know for sure what declarations are found by this name, // because the external source might have a different set from the set // that are in the lookup map, and we can't update it now without @@ -3697,9 +3702,8 @@ static void visitLocalLookupResults(const DeclContext *ConstDC, void ASTWriter::AddUpdatedDeclContext(const DeclContext *DC) { if (UpdatedDeclContexts.insert(DC).second && WritingAST) { // Ensure we emit all the visible declarations. - visitLocalLookupResults(DC, DC->NeedToReconcileExternalVisibleStorage, - [&](DeclarationName Name, - DeclContext::lookup_result Result) { + visitLocalLookupResults(DC, [&](DeclarationName Name, + DeclContext::lookup_result Result) { for (auto *Decl : Result) GetDeclRef(getDeclForLocalLookup(getLangOpts(), Decl)); }); @@ -3721,9 +3725,8 @@ ASTWriter::GenerateNameLookupTable(const DeclContext *DC, SmallVector<NamedDecl *, 8> ConstructorDecls; SmallVector<NamedDecl *, 4> ConversionDecls; - visitLocalLookupResults(DC, DC->NeedToReconcileExternalVisibleStorage, - [&](DeclarationName Name, - DeclContext::lookup_result Result) { + visitLocalLookupResults(DC, [&](DeclarationName Name, + DeclContext::lookup_result Result) { if (Result.empty()) return; |