Make the deserialization of PendingMacroIDs deterministic.

llvm-svn: 165727
This commit is contained in:
Douglas Gregor 2012-10-11 17:31:34 +00:00
parent 083189730e
commit d2acff9c3e
2 changed files with 11 additions and 17 deletions

View 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);

View 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