aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex
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
commit3ab50fe3fc8311fb68c4f5eb97e9bb3d0041bf1a (patch)
tree7ca68fb742508c859da0e4714b7d3f142f433f22 /lib/Lex
parente9652bf15246d6e08e953b52cdb7812ddb8a43e0 (diff)
Introduce a simple "hint" scheme to eliminate the quadratic behavior
associated with deserializing macro history for an identifier. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165729 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex')
-rw-r--r--lib/Lex/PPMacroExpansion.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp
index 8db74f28d4..c717816650 100644
--- a/lib/Lex/PPMacroExpansion.cpp
+++ b/lib/Lex/PPMacroExpansion.cpp
@@ -55,7 +55,8 @@ void Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) {
II->setChangedSinceDeserialization();
}
-void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) {
+void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI,
+ MacroInfo *Hint) {
assert(MI && "Missing macro?");
assert(MI->isFromAST() && "Macro is not from an AST?");
assert(!MI->getPreviousDefinition() && "Macro already in chain?");
@@ -105,8 +106,7 @@ void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) {
}
// The macro is not a definition; put it at the end of the list.
- // FIXME: Adding macro history is quadratic, but a hint could fix this.
- MacroInfo *Prev = StoredMI;
+ MacroInfo *Prev = Hint? Hint : StoredMI;
while (Prev->getPreviousDefinition())
Prev = Prev->getPreviousDefinition();
Prev->setPreviousDefinition(MI);