diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-10-11 17:41:54 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-10-11 17:41:54 +0000 |
commit | e740089d297199c43085e680cee0293c1af73193 (patch) | |
tree | 91dc0f4889580c941d4e24222293c68d64070dde /clang/lib/Serialization/ASTReader.cpp | |
parent | b29e6c6e84884e4c78d03df22ef9bd9f1e34bbce (diff) | |
download | bcm5719-llvm-e740089d297199c43085e680cee0293c1af73193.tar.gz bcm5719-llvm-e740089d297199c43085e680cee0293c1af73193.zip |
Introduce a simple "hint" scheme to eliminate the quadratic behavior
associated with deserializing macro history for an identifier.
llvm-svn: 165729
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 736f082d6f3..5657ee23bc1 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1241,7 +1241,8 @@ bool ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, } } -void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { +void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, + MacroInfo *Hint) { llvm::BitstreamCursor &Stream = F.MacroCursor; // Keep track of where we are in the stream, then jump back there @@ -1370,7 +1371,7 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { MI->setHidden(Hidden); // Finally, install the macro. - PP.addLoadedMacroInfo(II, MI); + PP.addLoadedMacroInfo(II, MI, Hint); // Remember that we saw this macro last so that we add the tokens that // form its body to it. @@ -5795,7 +5796,7 @@ IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { return LocalID + I->second; } -MacroInfo *ASTReader::getMacro(MacroID ID) { +MacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) { if (ID == 0) return 0; @@ -5811,7 +5812,7 @@ MacroInfo *ASTReader::getMacro(MacroID ID) { assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); ModuleFile *M = I->second; unsigned Index = ID - M->BaseMacroID; - ReadMacroRecord(*M, M->MacroOffsets[Index]); + ReadMacroRecord(*M, M->MacroOffsets[Index], Hint); } return MacrosLoaded[ID]; @@ -6512,9 +6513,10 @@ void ASTReader::finishPendingActions() { for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { // FIXME: std::move here SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second; + MacroInfo *Hint = 0; for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; ++IDIdx) { - getMacro(GlobalIDs[IDIdx]); + Hint = getMacro(GlobalIDs[IDIdx], Hint); } } PendingMacroIDs.clear(); |