diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-01-26 04:33:10 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-01-26 04:33:10 +0000 | 
| commit | ad13cf4e7a3ca27f2303156ee15c6eb06430cbde (patch) | |
| tree | 76a1f0a924580e992613e0579f44a9963f742b86 | |
| parent | 5a5d67101b71577a89a1a3ee89f1b85994d83304 (diff) | |
| download | bcm5719-llvm-ad13cf4e7a3ca27f2303156ee15c6eb06430cbde.tar.gz bcm5719-llvm-ad13cf4e7a3ca27f2303156ee15c6eb06430cbde.zip  | |
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.
llvm-svn: 62994
| -rw-r--r-- | clang/lib/Lex/MacroArgs.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 2 | 
2 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/Lex/MacroArgs.cpp b/clang/lib/Lex/MacroArgs.cpp index b634f6a62cb..77c96e0ab33 100644 --- a/clang/lib/Lex/MacroArgs.cpp +++ b/clang/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/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 518c84e8c38..b14df735ad1 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/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;  | 

