diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-10-19 22:15:20 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-10-19 22:15:20 +0000 |
commit | 9714a2385cb66b6efa373fc668641de602dd9adb (patch) | |
tree | 263ec08a6f2762158b26333921142a155915ec6b /lib/Lex | |
parent | a1194775dc3bc3c9471e089797ca08fdbe773794 (diff) |
Really^2 fix <rdar://problem/8361834>, this time without crashing.
Now MICache is a linked list (per the FIXME), where we tradeoff between MacroInfo objects being in MICache
and MIChainHead. MacroInfo objects in the MICache chain are already "Destroy()'ed", so they can be reused. When
inserting into MICache, we need to remove them from the regular linked list so that they aren't destroyed more than
once.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116869 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex')
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 44 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 3 |
2 files changed, 33 insertions, 14 deletions
diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index b958d9e489..8f66d99b18 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -28,18 +28,23 @@ using namespace clang; //===----------------------------------------------------------------------===// MacroInfo *Preprocessor::AllocateMacroInfo() { - MacroInfo *MI; + MacroInfoChain *MIChain; - if (!MICache.empty()) { - MI = MICache.back(); - MICache.pop_back(); - } else { - MacroInfoChain *MIChain = BP.Allocate<MacroInfoChain>(); - MIChain->Next = MIChainHead; - MIChainHead = MIChain; - MI = &(MIChain->MI); + if (MICache) { + MIChain = MICache; + MICache = MICache->Next; } - return MI; + else { + MIChain = BP.Allocate<MacroInfoChain>(); + } + + MIChain->Next = MIChainHead; + MIChain->Prev = 0; + if (MIChainHead) + MIChainHead->Prev = MIChain; + MIChainHead = MIChain; + + return &(MIChain->MI); } MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) { @@ -57,10 +62,23 @@ MacroInfo *Preprocessor::CloneMacroInfo(const MacroInfo &MacroToClone) { /// ReleaseMacroInfo - Release the specified MacroInfo. This memory will /// be reused for allocating new MacroInfo objects. void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) { - MICache.push_back(MI); - MI->FreeArgumentList(); -} + MacroInfoChain *MIChain = (MacroInfoChain*) MI; + if (MacroInfoChain *Prev = MIChain->Prev) { + MacroInfoChain *Next = MIChain->Next; + Prev->Next = Next; + if (Next) + Next->Prev = Prev; + } + else { + assert(MIChainHead == MIChain); + MIChainHead = MIChain->Next; + MIChainHead->Prev = 0; + } + MIChain->Next = MICache; + MICache = MIChain; + MI->Destroy(); +} /// DiscardUntilEndOfDirective - Read and discard all tokens remaining on the /// current line until the tok::eom token is found. diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index a0782aa868..1be22df6b1 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -56,7 +56,8 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts, SourceMgr(SM), HeaderInfo(Headers), ExternalSource(0), Identifiers(opts, IILookup), BuiltinInfo(Target), CodeComplete(0), CodeCompletionFile(0), SkipMainFilePreamble(0, true), CurPPLexer(0), - CurDirLookup(0), Callbacks(0), MacroArgCache(0), Record(0), MIChainHead(0) { + CurDirLookup(0), Callbacks(0), MacroArgCache(0), Record(0), MIChainHead(0), + MICache(0) { ScratchBuf = new ScratchBuffer(SourceMgr); CounterValue = 0; // __COUNTER__ starts at 0. OwnsHeaderSearch = OwnsHeaders; |