From 32fca722dd974b8202d0fb9c71b6c185c0767da6 Mon Sep 17 00:00:00 2001 From: Chris Lattner <sabre@nondot.org> Date: Wed, 4 Mar 2009 06:50:57 +0000 Subject: [PATCH] make the token lexer allocate its temporary token buffers for preexpanded macro arguments from the preprocessor's bump pointer. This reduces # mallocs from 12444 to 11792. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66025 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Lex/Preprocessor.h | 2 ++ include/clang/Lex/TokenLexer.h | 5 ++++- lib/Lex/TokenLexer.cpp | 11 +++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index ae7d3b6220d..4f5def5c516 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -205,6 +205,8 @@ public: IdentifierTable &getIdentifierTable() { return Identifiers; } SelectorTable &getSelectorTable() { return Selectors; } + llvm::BumpPtrAllocator &getPreprocessorAllocator() { return BP; } + void setPTHManager(PTHManager* pm); diff --git a/include/clang/Lex/TokenLexer.h b/include/clang/Lex/TokenLexer.h index a3004b1c04b..c0a61cf93ee 100644 --- a/include/clang/Lex/TokenLexer.h +++ b/include/clang/Lex/TokenLexer.h @@ -42,7 +42,10 @@ class TokenLexer { /// Tokens - This is the pointer to an array of tokens that the macro is /// defined to, with arguments expanded for function-like macros. If this is - /// a token stream, these are the tokens we are returning. + /// a token stream, these are the tokens we are returning. This points into + /// the macro definition we are lexing from, a scratch buffer allocated from + /// the preprocessor's bump pointer allocator, or some other buffer that we + /// may or may not own (depending on OwnsTokens). const Token *Tokens; /// NumTokens - This is the length of the Tokens array. diff --git a/lib/Lex/TokenLexer.cpp b/lib/Lex/TokenLexer.cpp index f0e2fbdfa62..898b3a780dd 100644 --- a/lib/Lex/TokenLexer.cpp +++ b/lib/Lex/TokenLexer.cpp @@ -88,6 +88,7 @@ void TokenLexer::destroy() { if (OwnsTokens) { delete [] Tokens; Tokens = 0; + OwnsTokens = false; } // TokenLexer owns its formal arguments. @@ -264,13 +265,19 @@ void TokenLexer::ExpandFunctionArguments() { // If anything changed, install this as the new Tokens list. if (MadeChange) { + assert(!OwnsTokens && "This would leak if we already own the token list"); // This is deleted in the dtor. NumTokens = ResultToks.size(); - Token *Res = new Token[ResultToks.size()]; + llvm::BumpPtrAllocator &Alloc = PP.getPreprocessorAllocator(); + Token *Res = + static_cast<Token *>(Alloc.Allocate(sizeof(Token)*ResultToks.size(), + llvm::alignof<Token>())); if (NumTokens) memcpy(Res, &ResultToks[0], NumTokens*sizeof(Token)); Tokens = Res; - OwnsTokens = true; + + // The preprocessor bump pointer owns these tokens, not us. + OwnsTokens = false; } } -- GitLab