From: Chris Lattner Date: Mon, 26 Jan 2009 04:33:10 +0000 (+0000) Subject: eagerly resolve the spelling locations of macro argument preexpansions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c35122df2998d9f615c3ebd4b71a91a2c6287d6;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62994 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/MacroArgs.cpp b/lib/Lex/MacroArgs.cpp index b634f6a62c..77c96e0ab3 100644 --- a/lib/Lex/MacroArgs.cpp +++ b/lib/Lex/MacroArgs.cpp @@ -23,7 +23,7 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI, 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 @@ MacroArgs::getPreExpArgument(unsigned Arg, Preprocessor &PP) { // 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 diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 518c84e8c3..b14df735ad 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -359,7 +359,7 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 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;