From f2a351a514a29ca215ab8d2a14e6be8d82ffcd2e Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Wed, 25 Feb 2015 21:20:53 +0000 Subject: [PATCH] [LTO API] fix memory leakage introduced at r230290. r230290 released the LLVM module but not the LTOModule. rdar://19024554 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230544 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/LTO/LTOCodeGenerator.h | 2 ++ lib/LTO/LTOCodeGenerator.cpp | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index cdfc543ec24..56d27ca9a77 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -155,6 +155,7 @@ private: typedef StringMap StringSet; void initialize(); + void destroyMergedModule(); std::unique_ptr OwnedContext; LLVMContext &Context; Linker IRLinker; @@ -172,6 +173,7 @@ private: TargetOptions Options; lto_diagnostic_handler_t DiagHandler; void *DiagContext; + LTOModule *OwnedModule; }; } #endif diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 1ba4159c9bf..61c27491657 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -82,16 +82,27 @@ void LTOCodeGenerator::initialize() { CodeModel = LTO_CODEGEN_PIC_MODEL_DEFAULT; DiagHandler = nullptr; DiagContext = nullptr; + OwnedModule = nullptr; initializeLTOPasses(); } +void LTOCodeGenerator::destroyMergedModule() { + if (OwnedModule) { + assert(IRLinker.getModule() == &OwnedModule->getModule() && + "The linker's module should be the same as the owned module"); + delete OwnedModule; + OwnedModule = nullptr; + } else if (IRLinker.getModule()) + IRLinker.deleteModule(); +} + LTOCodeGenerator::~LTOCodeGenerator() { + destroyMergedModule(); + delete TargetMach; TargetMach = nullptr; - IRLinker.deleteModule(); - for (std::vector::iterator I = CodegenOptions.begin(), E = CodegenOptions.end(); I != E; ++I) @@ -146,10 +157,10 @@ void LTOCodeGenerator::setModule(LTOModule *Mod) { "Expected module in same context"); // Delete the old merged module. - if (IRLinker.getModule()) - IRLinker.deleteModule(); + destroyMergedModule(); AsmUndefinedRefs.clear(); + OwnedModule = Mod; IRLinker.setModule(&Mod->getModule()); const std::vector &Undefs = Mod->getAsmUndefinedRefs(); -- 2.34.1