aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/TokenLexer.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-04 06:50:57 +0000
committerChris Lattner <sabre@nondot.org>2009-03-04 06:50:57 +0000
commit32fca722dd974b8202d0fb9c71b6c185c0767da6 (patch)
tree4dcab62d65cc30aec108b053b4b000433ba896ba /lib/Lex/TokenLexer.cpp
parent0b2b6e1cb1573bb295c0a65813dc4df8d57f305b (diff)
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
Diffstat (limited to 'lib/Lex/TokenLexer.cpp')
-rw-r--r--lib/Lex/TokenLexer.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/Lex/TokenLexer.cpp b/lib/Lex/TokenLexer.cpp
index f0e2fbdfa6..898b3a780d 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;
}
}