]> granicus.if.org Git - clang/commitdiff
[modules] Don't write out name lookup table entries merely because the module
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 27 Feb 2015 03:40:09 +0000 (03:40 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 27 Feb 2015 03:40:09 +0000 (03:40 +0000)
happened to query them; only write them out if something new was added.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230727 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclContextInternals.h
include/clang/Serialization/ASTWriter.h
lib/Serialization/ASTWriter.cpp

index ff37758c25511f01027c2dd57bde5ba8f24397ba..f83dd026b057fb309f34a1f18e4a09fc034383fd 100644 (file)
@@ -78,6 +78,17 @@ public:
     return getAsVectorAndHasExternal().getPointer();
   }
 
+  bool hasLocalDecls() const {
+    if (NamedDecl *Singleton = getAsDecl()) {
+      return !Singleton->isFromASTFile();
+    } else if (DeclsTy *Vec = getAsVector()) {
+      for (auto *D : *Vec)
+        if (!D->isFromASTFile())
+          return true;
+    }
+    return false;
+  }
+
   bool hasExternalDecls() const {
     return getAsVectorAndHasExternal().getInt();
   }
index 1d2fa556e22c34773872d4d84c553816f3f08578..bf7c2605b92f04c89120af5d2f41bcda9258a5c5 100644 (file)
@@ -477,6 +477,9 @@ private:
   void WriteTypeAbbrevs();
   void WriteType(QualType T);
 
+  template<typename Visitor>
+  void visitLocalLookupResults(const DeclContext *DC, Visitor AddLookupResult);
+
   uint32_t GenerateNameLookupTable(const DeclContext *DC,
                                    llvm::SmallVectorImpl<char> &LookupTable);
   uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext *DC);
index 3af2a4003ba3857e3415a145bbcc302b74e32612..c70935c0c7d4077e029a3c7bd7e7a735c127c4ef 100644 (file)
@@ -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;