summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-01-26 04:06:48 +0000
committerChris Lattner <sabre@nondot.org>2009-01-26 04:06:48 +0000
commit5a5d67101b71577a89a1a3ee89f1b85994d83304 (patch)
tree95a5414a131ec84b5657d687d9cac8da7ccc1c0d /clang
parentdd9babc79a82804010381912d879eafbf4d8fe1a (diff)
downloadbcm5719-llvm-5a5d67101b71577a89a1a3ee89f1b85994d83304.tar.gz
bcm5719-llvm-5a5d67101b71577a89a1a3ee89f1b85994d83304.zip
Eagerly resolve the spelling location of the tokens in a definition
of a macro. Since these tokens may themselves be from macro expansions, we need to resolve down to the spelling loc when the macro ends up being instantiated. Instead of resolving this for each token expanded from the macro definition, just do it once when the macro is defined. This speeds up clang on c99-intconst-1.c from 2.66s to 2.43s (9.5%), reducing the FileID lookups from 407244 linear and 114175649 binary to 2529040 linear and 64771121 binary. llvm-svn: 62993
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Lex/PPDirectives.cpp12
-rw-r--r--clang/lib/Lex/PPMacroExpansion.cpp6
2 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index ef26aeb79a6..ec5b67fb788 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -991,6 +991,12 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) {
if (MI->isObjectLike()) {
// Object-like macros are very simple, just read their body.
while (Tok.isNot(tok::eom)) {
+ // If this token has a virtual location, resolve it down to its spelling
+ // location. This is not strictly needed, but avoids extra resolutions
+ // for macros that are expanded frequently.
+ if (!Tok.getLocation().isFileID())
+ Tok.setLocation(SourceMgr.getSpellingLoc(Tok.getLocation()));
+
MI->AddTokenToBody(Tok);
// Get the next token of the macro.
LexUnexpandedToken(Tok);
@@ -1000,6 +1006,12 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) {
// Otherwise, read the body of a function-like macro. This has to validate
// the # (stringize) operator.
while (Tok.isNot(tok::eom)) {
+ // If this token has a virtual location, resolve it down to its spelling
+ // location. This is not strictly needed, but avoids extra resolutions
+ // for macros that are expanded frequently.
+ if (!Tok.getLocation().isFileID())
+ Tok.setLocation(SourceMgr.getSpellingLoc(Tok.getLocation()));
+
MI->AddTokenToBody(Tok);
// Check C99 6.10.3.2p1: ensure that # operators are followed by macro
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index 63caafaf504..518c84e8c38 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -340,6 +340,12 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
if (!MI->isEnabled())
Tok.setFlag(Token::DisableExpand);
}
+
+ // If this token has instantiation location, resolve it down to its
+ // spelling location. This is not strictly needed, but avoids extra
+ // resolutions for macros that are expanded frequently.
+ if (!Tok.getLocation().isFileID())
+ Tok.setLocation(SourceMgr.getSpellingLoc(Tok.getLocation()));
ArgTokens.push_back(Tok);
}
OpenPOWER on IntegriCloud