[cfe-commits] r62994 - in /cfe/trunk/lib/Lex: MacroArgs.cpp PPMacroExpansion.cpp

Chris Lattner sabre at nondot.org
Sun Jan 25 20:33:12 PST 2009


Author: lattner
Date: Sun Jan 25 22:33:10 2009
New Revision: 62994

URL: http://llvm.org/viewvc/llvm-project?rev=62994&view=rev
Log:
eagerly resolve the spelling locations of macro argument preexpansions.
This reduces fsyntax-only time on c99-intconst-1.c from 2.43s down to 
2.01s (20%), reducing the number of fileid lookups from 2529040 linear 
and 64771121 binary to 5625902 linear and 4151182 binary.

This knocks getFileID down to only 4.6% of compile time on this testcase.
At this point, malloc/free is over 35% of compile time, primarily allocating
MacroArgs objects and their argument preexpansion vectors.

I don't feel like malloc avoiding right now, so I'm just going to call
this good.


Modified:
    cfe/trunk/lib/Lex/MacroArgs.cpp
    cfe/trunk/lib/Lex/PPMacroExpansion.cpp

Modified: cfe/trunk/lib/Lex/MacroArgs.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/MacroArgs.cpp?rev=62994&r1=62993&r2=62994&view=diff

==============================================================================
--- cfe/trunk/lib/Lex/MacroArgs.cpp (original)
+++ cfe/trunk/lib/Lex/MacroArgs.cpp Sun Jan 25 22:33:10 2009
@@ -23,7 +23,7 @@
                              unsigned NumToks, bool VarargsElided) {
   assert(MI->isFunctionLike() &&
          "Can't have args for an object-like macro!");
-
+  
   // Allocate memory for the MacroArgs object with the lexer tokens at the end.
   MacroArgs *Result = (MacroArgs*)malloc(sizeof(MacroArgs) +
                                          NumToks*sizeof(Token));
@@ -118,7 +118,14 @@
   // Lex all of the macro-expanded tokens into Result.
   do {
     Result.push_back(Token());
-    PP.Lex(Result.back());
+    Token &Tok = Result.back();
+    PP.Lex(Tok);
+    
+    // Eagerly resolve instantiation ID's to their spelling location.  This
+    // makes it so we only have to get the spelling loc once per macro argument
+    // preexpansion instead of once per each time the token is expanded.
+    if (!Tok.getLocation().isFileID())
+      Tok.setLocation(PP.getSourceManager().getSpellingLoc(Tok.getLocation()));
   } while (Result.back().isNot(tok::eof));
   
   // Pop the token stream off the top of the stack.  We know that the internal

Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=62994&r1=62993&r2=62994&view=diff

==============================================================================
--- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
+++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Sun Jan 25 22:33:10 2009
@@ -359,7 +359,7 @@
     Token EOFTok;
     EOFTok.startToken();
     EOFTok.setKind(tok::eof);
-    EOFTok.setLocation(Tok.getLocation());
+    EOFTok.setLocation(SourceMgr.getSpellingLoc(Tok.getLocation()));
     EOFTok.setLength(0);
     ArgTokens.push_back(EOFTok);
     ++NumActuals;





More information about the cfe-commits mailing list