зеркало из https://github.com/microsoft/clang-1.git
Make the deserialization of PendingMacroIDs deterministic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165727 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cadaf4b16a
Коммит
e9652bf152
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче