forked from OSchip/llvm-project
[PCH] Fix memory leak related to deserialized MacroInfo objects.
Deserialized MacroInfos were not destroyed and if their SmallVector did heap allocation, it was leaked. rdar://13768967 llvm-svn: 180771
This commit is contained in:
parent
95012aaa93
commit
d48b91dbbe
|
@ -397,6 +397,14 @@ private: // Cached tokens state.
|
|||
/// allocation.
|
||||
MacroInfoChain *MICache;
|
||||
|
||||
struct DeserializedMacroInfoChain {
|
||||
MacroInfo MI;
|
||||
unsigned OwningModuleID; // MUST be immediately after the MacroInfo object
|
||||
// so it can be accessed by MacroInfo::getOwningModuleID().
|
||||
DeserializedMacroInfoChain *Next;
|
||||
};
|
||||
DeserializedMacroInfoChain *DeserialMIChainHead;
|
||||
|
||||
public:
|
||||
Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
|
||||
DiagnosticsEngine &diags, LangOptions &opts,
|
||||
|
|
|
@ -61,9 +61,12 @@ MacroInfo *Preprocessor::AllocateDeserializedMacroInfo(SourceLocation L,
|
|||
unsigned SubModuleID) {
|
||||
LLVM_STATIC_ASSERT(llvm::AlignOf<MacroInfo>::Alignment >= sizeof(SubModuleID),
|
||||
"alignment for MacroInfo is less than the ID");
|
||||
MacroInfo *MI =
|
||||
(MacroInfo*)BP.Allocate(sizeof(MacroInfo) + sizeof(SubModuleID),
|
||||
llvm::AlignOf<MacroInfo>::Alignment);
|
||||
DeserializedMacroInfoChain *MIChain =
|
||||
BP.Allocate<DeserializedMacroInfoChain>();
|
||||
MIChain->Next = DeserialMIChainHead;
|
||||
DeserialMIChainHead = MIChain;
|
||||
|
||||
MacroInfo *MI = &MIChain->MI;
|
||||
new (MI) MacroInfo(L);
|
||||
MI->FromASTFile = true;
|
||||
MI->setOwningModuleID(SubModuleID);
|
||||
|
|
|
@ -67,7 +67,8 @@ Preprocessor::Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
|
|||
CodeComplete(0), CodeCompletionFile(0), CodeCompletionOffset(0),
|
||||
CodeCompletionReached(0), SkipMainFilePreamble(0, true), CurPPLexer(0),
|
||||
CurDirLookup(0), CurLexerKind(CLK_Lexer), Callbacks(0),
|
||||
MacroArgCache(0), Record(0), MIChainHead(0), MICache(0) {
|
||||
MacroArgCache(0), Record(0), MIChainHead(0), MICache(0),
|
||||
DeserialMIChainHead(0) {
|
||||
OwnsHeaderSearch = OwnsHeaders;
|
||||
|
||||
ScratchBuf = new ScratchBuffer(SourceMgr);
|
||||
|
@ -153,6 +154,9 @@ Preprocessor::~Preprocessor() {
|
|||
for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
|
||||
delete TokenLexerCache[i];
|
||||
|
||||
for (DeserializedMacroInfoChain *I = DeserialMIChainHead ; I ; I = I->Next)
|
||||
I->MI.Destroy();
|
||||
|
||||
// Free any cached MacroArgs.
|
||||
for (MacroArgs *ArgList = MacroArgCache; ArgList; )
|
||||
ArgList = ArgList->deallocate();
|
||||
|
|
Loading…
Reference in New Issue