]> granicus.if.org Git - clang/commitdiff
Reduce stack frame size by avoiding a large token vector on an error path.
authorBob Wilson <bob.wilson@apple.com>
Sat, 27 Jul 2013 21:59:57 +0000 (21:59 +0000)
committerBob Wilson <bob.wilson@apple.com>
Sat, 27 Jul 2013 21:59:57 +0000 (21:59 +0000)
Beginning with svn r186971, we noticed an internal test started to fail when
using clang built with LTO. After much investigation, it turns out that there
are no blatant bugs here, we are just running out of stack space and crashing.
Preprocessor::ReadFunctionLikeMacroArgs already has one vector of 64 Tokens,
and r186971 added another.  When built with LTO, that function is inlined into
Preprocessor::HandleMacroExpandedIdentifier, which for our internal test is
invoked in a deep recursive cycle. I'm leaving the original 64 Token vector
alone on the assumption that it is important for performance, but the new
FixedArgTokens vector is only used on an error path, so it should be OK if it
requires additional heap storage. It would be even better if we could avoid
the deep recursion, but I think this change is a good thing to do regardless.
<rdar://problem/14540345>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187315 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PPMacroExpansion.cpp

index 0a7f079df6f9b81e2b542e634d3ee1d48395d753..899fba600dc33b95a91736a15da7bc3b9e5b320b 100644 (file)
@@ -681,7 +681,7 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
     // TODO: See if this can be generalized to angle brackets for templates
     // inside macro arguments.
 
-    SmallVector<Token, 64> FixedArgTokens;
+    SmallVector<Token, 4> FixedArgTokens;
     unsigned FixedNumArgs = 0;
     SmallVector<SourceRange, 4> ParenHints, InitLists;
     if (!GenerateNewArgTokens(*this, ArgTokens, FixedArgTokens, FixedNumArgs,