[LTO API] fix memory leakage introduced at r230290.
authorManman Ren <manman.ren@gmail.com>
Wed, 25 Feb 2015 21:20:53 +0000 (21:20 +0000)
committerManman Ren <manman.ren@gmail.com>
Wed, 25 Feb 2015 21:20:53 +0000 (21:20 +0000)
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
lib/LTO/LTOCodeGenerator.cpp

index cdfc543ec243d96a090afd40c7a92bbbc9fe1fa4..56d27ca9a77ae3bfb0f376e17649a4e2d2a12717 100644 (file)
@@ -155,6 +155,7 @@ private:
   typedef StringMap<uint8_t> StringSet;
 
   void initialize();
+  void destroyMergedModule();
   std::unique_ptr<LLVMContext> OwnedContext;
   LLVMContext &Context;
   Linker IRLinker;
@@ -172,6 +173,7 @@ private:
   TargetOptions Options;
   lto_diagnostic_handler_t DiagHandler;
   void *DiagContext;
+  LTOModule *OwnedModule;
 };
 }
 #endif
index 1ba4159c9bf14f2eec3686b07d0e1aac35d45f8a..61c274916571c8cc3edcd3fe0082b3cbd244ddc3 100644 (file)
@@ -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<char *>::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<const char*> &Undefs = Mod->getAsmUndefinedRefs();