]> granicus.if.org Git - clang/commitdiff
Make the deserialization of PendingMacroIDs deterministic.
authorDouglas Gregor <dgregor@apple.com>
Thu, 11 Oct 2012 17:31:34 +0000 (17:31 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 11 Oct 2012 17:31:34 +0000 (17:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165727 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Serialization/ASTReader.h
lib/Serialization/ASTReader.cpp

index 3a938a24c75e0769fd7b28e4afa1c554b734ec28..2a9afc92e9b80924a4a964ff1229c9f8314a3093 100644 (file)
@@ -495,8 +495,8 @@ private:
   /// global method pool for this selector.
   llvm::DenseMap<Selector, unsigned> SelectorGeneration;
 
-  typedef llvm::DenseMap<IdentifierInfo *,
-                         llvm::SmallVector<serialization::MacroID, 2> >
+  typedef llvm::MapVector<IdentifierInfo *,
+                          llvm::SmallVector<serialization::MacroID, 2> >
     PendingMacroIDsMap;
 
   /// \brief Mapping from identifiers that have a macro history to the global
@@ -1606,10 +1606,6 @@ public:
   /// \brief Note that this identifier is up-to-date.
   void markIdentifierUpToDate(IdentifierInfo *II);
 
-  /// \brief Read the macro definition corresponding to this iterator
-  /// into the unread macro record offsets table.
-  void LoadMacroDefinition(PendingMacroIDsMap::iterator Pos);
-
   /// \brief Load all external visible decls in the given DeclContext.
   void completeVisibleDeclsMap(const DeclContext *DC);
 
index 861d99ee64d26923846f38b4a26a0943c33e6644..736f082d6f38f61628eb4f21bbf3f5d274af2206 100644 (file)
@@ -1542,14 +1542,6 @@ void ASTReader::ReadDefinedMacros() {
   }
 }
 
-void ASTReader::LoadMacroDefinition(PendingMacroIDsMap::iterator Pos) {
-  assert(Pos != PendingMacroIDs.end() && "Unknown macro definition");
-  SmallVector<MacroID, 2> GlobalIDs = Pos->second;
-  PendingMacroIDs.erase(Pos);
-  for (unsigned I = 0, N = GlobalIDs.size(); I != N; ++I)
-    getMacro(GlobalIDs[I]);
-}
-
 namespace {
   /// \brief Visitor class used to look up identifirs in an AST file.
   class IdentifierLookupVisitor {
@@ -6517,9 +6509,15 @@ void ASTReader::finishPendingActions() {
     PendingDeclChains.clear();
 
     // Load any pending macro definitions.
-    // FIXME: Non-determinism here.
-    while (!PendingMacroIDs.empty())
-      LoadMacroDefinition(PendingMacroIDs.begin());
+    for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
+      // FIXME: std::move here
+      SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second;
+      for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx !=  NumIDs;
+           ++IDIdx) {
+        getMacro(GlobalIDs[IDIdx]);
+      }
+    }
+    PendingMacroIDs.clear();
   }
   
   // If we deserialized any C++ or Objective-C class definitions, any