summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTReader.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-10-11 17:41:54 +0000
committerDouglas Gregor <dgregor@apple.com>2012-10-11 17:41:54 +0000
commite740089d297199c43085e680cee0293c1af73193 (patch)
tree91dc0f4889580c941d4e24222293c68d64070dde /clang/lib/Serialization/ASTReader.cpp
parentb29e6c6e84884e4c78d03df22ef9bd9f1e34bbce (diff)
downloadbcm5719-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.cpp12
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();
OpenPOWER on IntegriCloud