diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-12-15 19:56:42 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-12-15 19:56:42 +0000 |
commit | 0ea76727ae91bca918a8414ed85b530eddcfedeb (patch) | |
tree | 7a572aa8d11e2f4c95caabe869f41c5b0ca44b13 | |
parent | 55f7bcbda37964d3c0e8928d0e50a6e1692b7dce (diff) |
Preprocessor: Allocate MacroInfo objects using a BumpPtrAllocator instead using new/delete. This speeds up -Eonly on Cocoa.h using the regular lexer by 1.8% and the PTHLexer by 3%.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61042 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Lex/Preprocessor.h | 19 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 26 | ||||
-rw-r--r-- | lib/Lex/PPMacroExpansion.cpp | 2 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 6 |
4 files changed, 42 insertions, 11 deletions
diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 77136688aa..efe057e334 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -24,6 +24,7 @@ #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/OwningPtr.h" +#include "llvm/Support/Allocator.h" namespace clang { @@ -55,6 +56,10 @@ class Preprocessor { /// PTH - An optional PTHManager object used for getting tokens from /// a token cache rather than lexing the original source file. llvm::OwningPtr<PTHManager> PTH; + + /// BP - A BumpPtrAllocator object used to quickly allocate and release + /// objects internal to the Preprocessor. + llvm::BumpPtrAllocator BP; /// Identifiers for builtin macros and other builtins. IdentifierInfo *Ident__LINE__, *Ident__FILE__; // __LINE__, __FILE__ @@ -145,6 +150,10 @@ class Preprocessor { /// to the actual definition of the macro. llvm::DenseMap<IdentifierInfo*, MacroInfo*> Macros; + /// MICache - A "freelist" of MacroInfo objects that can be reused for quick + /// allocation. + std::vector<MacroInfo*> MICache; + // Various statistics we track for performance analysis. unsigned NumDirectives, NumIncluded, NumDefined, NumUndefined, NumPragma; unsigned NumIf, NumElse, NumEndif; @@ -530,6 +539,16 @@ private: IncludeMacroStack.pop_back(); } + /// AllocateMacroInfo - Allocate a new MacroInfo object with the provide + /// SourceLocation. + MacroInfo* AllocateMacroInfo(SourceLocation L); + + /// ReleaseMacroInfo - Release the specified MacroInfo. This memory will + /// be reused for allocating new MacroInfo objects. + void ReleaseMacroInfo(MacroInfo* MI) { + MICache.push_back(MI); + } + /// isInPrimaryFile - Return true if we're in the top-level file, not in a /// #include. bool isInPrimaryFile() const; diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 0e4dc9f34e..59df8255e3 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -22,6 +22,18 @@ using namespace clang; // Utility Methods for Preprocessor Directive Handling. //===----------------------------------------------------------------------===// +MacroInfo* Preprocessor::AllocateMacroInfo(SourceLocation L) { + MacroInfo *MI; + + if (!MICache.empty()) { + MI = MICache.back(); + MICache.pop_back(); + } + else MI = (MacroInfo*) BP.Allocate<MacroInfo>(); + new (MI) MacroInfo(L); + return MI; +} + /// DiscardUntilEndOfDirective - Read and discard all tokens remaining on the /// current line until the tok::eom token is found. void Preprocessor::DiscardUntilEndOfDirective() { @@ -920,7 +932,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments); // Create the new macro. - MacroInfo *MI = new MacroInfo(MacroNameTok.getLocation()); + MacroInfo *MI = AllocateMacroInfo(MacroNameTok.getLocation()); Token Tok; LexUnexpandedToken(Tok); @@ -935,7 +947,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { MI->setIsFunctionLike(); if (ReadMacroDefinitionArgList(MI)) { // Forget about MI. - delete MI; + ReleaseMacroInfo(MI); // Throw away the rest of the line. if (CurPPLexer->ParsingPreprocessorDirective) DiscardUntilEndOfDirective(); @@ -998,7 +1010,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { if (!Tok.getIdentifierInfo() || MI->getArgumentNum(Tok.getIdentifierInfo()) == -1) { Diag(Tok, diag::err_pp_stringize_not_parameter); - delete MI; + ReleaseMacroInfo(MI); // Disable __VA_ARGS__ again. Ident__VA_ARGS__->setIsPoisoned(true); @@ -1023,12 +1035,12 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { if (NumTokens != 0) { if (MI->getReplacementToken(0).is(tok::hashhash)) { Diag(MI->getReplacementToken(0), diag::err_paste_at_start); - delete MI; + ReleaseMacroInfo(MI); return; } if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) { Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end); - delete MI; + ReleaseMacroInfo(MI); return; } } @@ -1051,7 +1063,7 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { << MacroNameTok.getIdentifierInfo(); Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition); } - delete OtherMI; + ReleaseMacroInfo(OtherMI); } setMacroInfo(MacroNameTok.getIdentifierInfo(), MI); @@ -1082,7 +1094,7 @@ void Preprocessor::HandleUndefDirective(Token &UndefTok) { Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used); // Free macro definition. - delete MI; + ReleaseMacroInfo(MI); setMacroInfo(MacroNameTok.getIdentifierInfo(), 0); } diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 3ce35818f1..81e44f4823 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -42,7 +42,7 @@ IdentifierInfo *Preprocessor::RegisterBuiltinMacro(const char *Name) { IdentifierInfo *Id = getIdentifierInfo(Name); // Mark it as being a macro that is builtin. - MacroInfo *MI = new MacroInfo(SourceLocation()); + MacroInfo *MI = AllocateMacroInfo(SourceLocation()); MI->setIsBuiltinMacro(); setMacroInfo(Id, MI); return Id; diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 00d3d56e2e..3fa76fa161 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -95,9 +95,9 @@ Preprocessor::~Preprocessor() { // Free any macro definitions. for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I = Macros.begin(), E = Macros.end(); I != E; ++I) { - // Free the macro definition. - delete I->second; - I->second = 0; + // We don't need to free the MacroInfo objects directly. These + // will be released when the BumpPtrAllocator 'BP' object gets + // destroyed. I->first->setHasMacroDefinition(false); } |