]> granicus.if.org Git - clang/commitdiff
Eagerly resolve the spelling location of the tokens in a definition
authorChris Lattner <sabre@nondot.org>
Mon, 26 Jan 2009 04:06:48 +0000 (04:06 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Jan 2009 04:06:48 +0000 (04:06 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62993 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PPDirectives.cpp
lib/Lex/PPMacroExpansion.cpp

index ef26aeb79a6cc33ad409f80bdeda9ec3b8cf2c9a..ec5b67fb788e49bc58e9914788a904402dc2cdc1 100644 (file)
@@ -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
index 63caafaf504804d6c72a8d92b6030fdf25a0ba74..518c84e8c38a442cb17c117f31cdfa498df0747b 100644 (file)
@@ -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);
     }