зеркало из https://github.com/microsoft/clang-1.git
use best-fit instead of first-fit when reusing a MacroArgs object,
this speeds up Eonly on the testcase in PR5888 from 30.5s to 0.85s git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92203 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
f5809a7b76
Коммит
4fe739f293
|
@ -24,25 +24,34 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI,
|
|||
Preprocessor &PP) {
|
||||
assert(MI->isFunctionLike() &&
|
||||
"Can't have args for an object-like macro!");
|
||||
MacroArgs *Result = 0;
|
||||
MacroArgs **ResultEnt = 0;
|
||||
unsigned ClosestMatch = ~0U;
|
||||
|
||||
// See if we have an entry with a big enough argument list to reuse on the
|
||||
// free list. If so, reuse it.
|
||||
for (MacroArgs **Entry = &PP.MacroArgCache; *Entry;
|
||||
Entry = &(*Entry)->ArgCache)
|
||||
if ((*Entry)->NumUnexpArgTokens >= NumToks) {
|
||||
Result = *Entry;
|
||||
// Unlink this node from the preprocessors singly linked list.
|
||||
*Entry = Result->ArgCache;
|
||||
break;
|
||||
if ((*Entry)->NumUnexpArgTokens >= NumToks &&
|
||||
(*Entry)->NumUnexpArgTokens < ClosestMatch) {
|
||||
ResultEnt = Entry;
|
||||
|
||||
// If we have an exact match, use it.
|
||||
if ((*Entry)->NumUnexpArgTokens == NumToks)
|
||||
break;
|
||||
// Otherwise, use the best fit.
|
||||
ClosestMatch = (*Entry)->NumUnexpArgTokens;
|
||||
}
|
||||
|
||||
if (Result == 0) {
|
||||
MacroArgs *Result;
|
||||
if (ResultEnt == 0) {
|
||||
// Allocate memory for a MacroArgs object with the lexer tokens at the end.
|
||||
Result = (MacroArgs*)malloc(sizeof(MacroArgs) + NumToks*sizeof(Token));
|
||||
// Construct the MacroArgs object.
|
||||
new (Result) MacroArgs(NumToks, VarargsElided);
|
||||
} else {
|
||||
Result = *ResultEnt;
|
||||
// Unlink this node from the preprocessors singly linked list.
|
||||
*ResultEnt = Result->ArgCache;
|
||||
Result->NumUnexpArgTokens = NumToks;
|
||||
Result->VarargsElided = VarargsElided;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче