From: Chris Lattner Date: Fri, 20 Feb 2009 22:46:43 +0000 (+0000) Subject: switch the macroinfo argument lists from being allocated off the heap X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=685befeb5f6472585bae473a6389e47cab9eac67;p=clang switch the macroinfo argument lists from being allocated off the heap to being allocated from the same bumpptr that the MacroInfo objects themselves are. This speeds up -Eonly cocoa.h pth by ~4%, fsyntax-only is barely measurable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65195 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/MacroInfo.h b/include/clang/Lex/MacroInfo.h index 7c3136ac11..ba1cfde405 100644 --- a/include/clang/Lex/MacroInfo.h +++ b/include/clang/Lex/MacroInfo.h @@ -16,6 +16,7 @@ #include "clang/Lex/Token.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/Support/Allocator.h" #include #include @@ -82,15 +83,15 @@ public: /// FreeArgumentList - Free the argument list of the macro, restoring it to a /// state where it can be reused for other devious purposes. - void FreeArgumentList() { - delete[] ArgumentList; + void FreeArgumentList(llvm::BumpPtrAllocator &PPAllocator) { + PPAllocator.Deallocate(ArgumentList); ArgumentList = 0; NumArguments = 0; } /// Destroy - destroy this MacroInfo object. - void Destroy() { - FreeArgumentList(); + void Destroy(llvm::BumpPtrAllocator &PPAllocator) { + FreeArgumentList(PPAllocator); this->~MacroInfo(); } @@ -117,13 +118,14 @@ public: /// setArgumentList - Set the specified list of identifiers as the argument /// list for this macro. - void setArgumentList(IdentifierInfo* const *List, unsigned NumArgs) { + void setArgumentList(IdentifierInfo* const *List, unsigned NumArgs, + llvm::BumpPtrAllocator &PPAllocator) { assert(ArgumentList == 0 && NumArguments == 0 && "Argument list already set!"); if (NumArgs == 0) return; NumArguments = NumArgs; - ArgumentList = new IdentifierInfo*[NumArgs]; + ArgumentList = PPAllocator.Allocate(NumArgs); for (unsigned i = 0; i != NumArgs; ++i) ArgumentList[i] = List[i]; } diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index e6b2f8464d..ce68207eb3 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -40,7 +40,7 @@ MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) { /// be reused for allocating new MacroInfo objects. void Preprocessor::ReleaseMacroInfo(MacroInfo* MI) { MICache.push_back(MI); - MI->FreeArgumentList(); + MI->FreeArgumentList(BP); } @@ -1115,7 +1115,7 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) { // Add the __VA_ARGS__ identifier as an argument. Arguments.push_back(Ident__VA_ARGS__); MI->setIsC99Varargs(); - MI->setArgumentList(&Arguments[0], Arguments.size()); + MI->setArgumentList(&Arguments[0], Arguments.size(), BP); return false; case tok::eom: // #define X( Diag(Tok, diag::err_pp_missing_rparen_in_macro_def); @@ -1149,7 +1149,7 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) { Diag(Tok, diag::err_pp_expected_comma_in_arg_list); return true; case tok::r_paren: // #define X(A) - MI->setArgumentList(&Arguments[0], Arguments.size()); + MI->setArgumentList(&Arguments[0], Arguments.size(), BP); return false; case tok::comma: // #define X(A, break; @@ -1165,7 +1165,7 @@ bool Preprocessor::ReadMacroDefinitionArgList(MacroInfo *MI) { } MI->setIsGNUVarargs(); - MI->setArgumentList(&Arguments[0], Arguments.size()); + MI->setArgumentList(&Arguments[0], Arguments.size(), BP); return false; } } diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index a85b5db6d6..ccb179d1e4 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -101,7 +101,7 @@ Preprocessor::~Preprocessor() { // will be released when the BumpPtrAllocator 'BP' object gets // destroyed. We still need to run the dstor, however, to free // memory alocated by MacroInfo. - I->second->Destroy(); + I->second->Destroy(BP); I->first->setHasMacroDefinition(false); }