r233172 - Revert "[Modules] When writing out the on-disk hash table for the decl context lookup tables, we need to establish a stable ordering for constructing the hash table. This is trickier than it might seem."

Rafael Espindola rafael.espindola at gmail.com
Tue Mar 24 21:43:16 PDT 2015


Author: rafael
Date: Tue Mar 24 23:43:15 2015
New Revision: 233172

URL: http://llvm.org/viewvc/llvm-project?rev=233172&view=rev
Log:
Revert "[Modules] When writing out the on-disk hash table for the decl context lookup tables, we need to establish a stable ordering for constructing the hash table. This is trickier than it might seem."

This reverts commit r233156. It broke the bots.

Modified:
    cfe/trunk/lib/Serialization/ASTWriter.cpp

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=233172&r1=233171&r2=233172&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Tue Mar 24 23:43:15 2015
@@ -3761,34 +3761,15 @@ ASTWriter::GenerateNameLookupTable(const
          !DC->HasLazyExternalLexicalLookups &&
          "must call buildLookups first");
 
-  // Create the on-disk hash table representation.
   llvm::OnDiskChainedHashTableGenerator<ASTDeclContextNameLookupTrait>
       Generator;
   ASTDeclContextNameLookupTrait Trait(*this);
 
-  // Store the sortable lookup results -- IE, those with meaningful names. We
-  // will sort them by the DeclarationName in order to stabilize the ordering
-  // of the hash table. We can't do this for constructors or conversion
-  // functions which are handled separately.
-  SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
-      NamedResults;
-
-  // We can't directly construct a nonce constructor or conversion name without
-  // tripping asserts, so we just recall the first one we see. Only the kind
-  // will actually be serialized.
+  // Create the on-disk hash table representation.
   DeclarationName ConstructorName;
   DeclarationName ConversionName;
-  // Retain a mapping from each actual declaration name to the results
-  // associated with it. We use a map here because the order in which we
-  // discover these lookup results isn't ordered. We have to re-establish
-  // a stable ordering which we do by walking the children of the decl context,
-  // and emitting these in the order in which their names first appeared. Note
-  // that the names' first appearance may not be one of the results or a result
-  // at all. We just use this to establish an ordering.
-  llvm::SmallDenseMap<DeclarationName, DeclContext::lookup_result, 8>
-      ConstructorResults;
-  llvm::SmallDenseMap<DeclarationName, DeclContext::lookup_result, 4>
-      ConversionResults;
+  SmallVector<NamedDecl *, 8> ConstructorDecls;
+  SmallVector<NamedDecl *, 4> ConversionDecls;
 
   visitLocalLookupResults(DC, [&](DeclarationName Name,
                                   DeclContext::lookup_result Result) {
@@ -3805,90 +3786,34 @@ ASTWriter::GenerateNameLookupTable(const
       // has the DeclarationName of the inherited constructors.
       if (!ConstructorName)
         ConstructorName = Name;
-      ConstructorResults.insert(std::make_pair(Name, Result));
+      ConstructorDecls.append(Result.begin(), Result.end());
       return;
 
     case DeclarationName::CXXConversionFunctionName:
       if (!ConversionName)
         ConversionName = Name;
-      ConversionResults.insert(std::make_pair(Name, Result));
+      ConversionDecls.append(Result.begin(), Result.end());
       return;
 
     default:
-      NamedResults.push_back(std::make_pair(Name, Result));
+      break;
     }
 
+    Generator.insert(Name, Result, Trait);
   });
 
-  // Sort and emit the named results first. This is the easy case.
-  std::sort(
-      NamedResults.begin(), NamedResults.end(),
-      [](const std::pair<DeclarationName, DeclContext::lookup_result> &LHS,
-         const std::pair<DeclarationName, DeclContext::lookup_result> &RHS) {
-        return LHS.first < RHS.first;
-      });
-  for (auto Results : NamedResults)
-    Generator.insert(Results.first, Results.second, Trait);
-
-  // We have to specially handle the constructor and conversion function
-  // declarations found.
-  if (ConstructorResults.size() == 1) {
-    // A special case that is easy is when we have just one constructor
-    // declaration name.
+  // Add the constructors.
+  if (!ConstructorDecls.empty()) {
     Generator.insert(ConstructorName,
-                     ConstructorResults.lookup(ConstructorName), Trait);
-    ConstructorResults.clear();
-  }
-  if (ConversionResults.size() == 1) {
-    // A special case that is easy is when we have just one conversion function
-    // declaration name.
-    Generator.insert(ConversionName, ConversionResults.lookup(ConversionName),
+                     DeclContext::lookup_result(ConstructorDecls),
                      Trait);
-    ConversionResults.clear();
   }
-  if (!ConstructorResults.empty() || !ConversionResults.empty()) {
-    SmallVector<NamedDecl *, 8> ConstructorDecls;
-    SmallVector<NamedDecl *, 8> ConversionDecls;
-
-    // Walk the decls in the context and collapse the results in that order. We
-    // handle both constructors and conversion functions in a single walk as
-    // the walk is a relative cache-hostile linked list walk.
-    for (Decl *ChildD : DC->decls())
-      if (auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
-        auto ConstructorResultsIt =
-            ConstructorResults.find(ChildND->getDeclName());
-        if (ConstructorResultsIt != ConstructorResults.end()) {
-          ConstructorDecls.append(ConstructorResultsIt->second.begin(),
-                                  ConstructorResultsIt->second.end());
-          ConstructorResults.erase(ConstructorResultsIt);
-        }
-
-        auto ConversionResultsIt =
-            ConversionResults.find(ChildND->getDeclName());
-        if (ConversionResultsIt != ConversionResults.end()) {
-          ConversionDecls.append(ConversionResultsIt->second.begin(),
-                                 ConversionResultsIt->second.end());
-          ConversionResults.erase(ConversionResultsIt);
-        }
-
-        // If we handle all of the results, we're done.
-        if (ConstructorResults.empty() && ConversionResults.empty())
-          break;
-      }
-    assert(ConstructorResults.empty() && "Have constructor lookup results not "
-                                         "associated with a declaration name "
-                                         "within the context!");
-    assert(ConversionResults.empty() && "Have conversion function lookup "
-                                        "results not associated with a "
-                                        "declaration name within the context!");
-
-    if (!ConstructorDecls.empty())
-      Generator.insert(ConstructorName,
-                       DeclContext::lookup_result(ConstructorDecls), Trait);
-
-    if (!ConversionDecls.empty())
-      Generator.insert(ConversionName,
-                       DeclContext::lookup_result(ConversionDecls), Trait);
+
+  // Add the conversion functions.
+  if (!ConversionDecls.empty()) {
+    Generator.insert(ConversionName,
+                     DeclContext::lookup_result(ConversionDecls),
+                     Trait);
   }
 
   // Create the on-disk hash table in a buffer.





More information about the cfe-commits mailing list