diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-10-11 17:31:34 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-10-11 17:31:34 +0000 |
commit | e9652bf15246d6e08e953b52cdb7812ddb8a43e0 (patch) | |
tree | 2474e65c09a98737b7dd8026405bf22cf4226049 | |
parent | cadaf4b16a8425849c5de418b63af97728f93d5d (diff) |
Make the deserialization of PendingMacroIDs deterministic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165727 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Serialization/ASTReader.h | 8 | ||||
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 20 |
2 files changed, 11 insertions, 17 deletions
diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 3a938a24c7..2a9afc92e9 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -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); diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 861d99ee64..736f082d6f 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -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 |