Index: llvm/trunk/include/llvm-c/lto.h =================================================================== --- llvm/trunk/include/llvm-c/lto.h +++ llvm/trunk/include/llvm-c/lto.h @@ -374,8 +374,8 @@ lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod); /** - * Sets the object module for code generation. This will transfer the ownship of - * the module to code generator. + * Sets the object module for code generation. This will transfer the ownership + * of the module to the code generator. * * \c cg and \c mod must both be in the same context. * Index: llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h =================================================================== --- llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h +++ llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h @@ -69,7 +69,7 @@ bool addModule(struct LTOModule *); // Set the destination module. - void setModule(struct LTOModule *); + void setModule(std::unique_ptr M); void setTargetOptions(TargetOptions options); void setDebugInfo(lto_debug_model); @@ -155,9 +155,9 @@ typedef StringMap StringSet; - void destroyMergedModule(); std::unique_ptr OwnedContext; LLVMContext &Context; + std::unique_ptr MergedModule; Linker IRLinker; std::unique_ptr TargetMach; bool EmitDwarfDebugInfo = false; @@ -175,7 +175,6 @@ unsigned OptLevel = 2; lto_diagnostic_handler_t DiagHandler = nullptr; void *DiagContext = nullptr; - LTOModule *OwnedModule = nullptr; bool ShouldInternalize = true; bool ShouldEmbedUselists = false; }; Index: llvm/trunk/include/llvm/LTO/LTOModule.h =================================================================== --- llvm/trunk/include/llvm/LTO/LTOModule.h +++ llvm/trunk/include/llvm/LTO/LTOModule.h @@ -113,6 +113,8 @@ return IRFile->getModule(); } + std::unique_ptr takeModule() { return IRFile->takeModule(); } + /// Return the Module's target triple. const std::string &getTargetTriple() { return getModule().getTargetTriple(); Index: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp =================================================================== --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp @@ -64,29 +64,20 @@ } LTOCodeGenerator::LTOCodeGenerator() - : Context(getGlobalContext()), IRLinker(new Module("ld-temp.o", Context)) { + : Context(getGlobalContext()), + MergedModule(new Module("ld-temp.o", Context)), + IRLinker(MergedModule.get()) { initializeLTOPasses(); } LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr Context) : OwnedContext(std::move(Context)), Context(*OwnedContext), - IRLinker(new Module("ld-temp.o", *OwnedContext)) { + MergedModule(new Module("ld-temp.o", *OwnedContext)), + IRLinker(MergedModule.get()) { 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(); -} +LTOCodeGenerator::~LTOCodeGenerator() {} // Initialize LTO passes. Please keep this funciton in sync with // PassManagerBuilder::populateLTOPassManager(), and make sure all LTO @@ -131,16 +122,14 @@ return !ret; } -void LTOCodeGenerator::setModule(LTOModule *Mod) { +void LTOCodeGenerator::setModule(std::unique_ptr Mod) { assert(&Mod->getModule().getContext() == &Context && "Expected module in same context"); - // Delete the old merged module. - destroyMergedModule(); AsmUndefinedRefs.clear(); - OwnedModule = Mod; - IRLinker.setModule(&Mod->getModule()); + MergedModule = Mod->takeModule(); + IRLinker.setModule(MergedModule.get()); const std::vector &Undefs = Mod->getAsmUndefinedRefs(); for (int I = 0, E = Undefs.size(); I != E; ++I) @@ -200,7 +189,7 @@ } // write bitcode to it - WriteBitcodeToFile(IRLinker.getModule(), Out.os(), ShouldEmbedUselists); + WriteBitcodeToFile(MergedModule.get(), Out.os(), ShouldEmbedUselists); Out.os().close(); if (Out.os().has_error()) { @@ -296,10 +285,10 @@ if (TargetMach) return true; - std::string TripleStr = IRLinker.getModule()->getTargetTriple(); + std::string TripleStr = MergedModule->getTargetTriple(); if (TripleStr.empty()) { TripleStr = sys::getDefaultTargetTriple(); - IRLinker.getModule()->setTargetTriple(TripleStr); + MergedModule->setTargetTriple(TripleStr); } llvm::Triple Triple(TripleStr); @@ -412,7 +401,6 @@ void LTOCodeGenerator::applyScopeRestrictions() { if (ScopeRestrictionsDone || !ShouldInternalize) return; - Module *MergedModule = IRLinker.getModule(); // Start off with a verification pass. legacy::PassManager passes; @@ -475,8 +463,6 @@ if (!this->determineTarget(errMsg)) return false; - Module *MergedModule = IRLinker.getModule(); - // Mark which symbols can not be internalized this->applyScopeRestrictions(); @@ -514,8 +500,6 @@ if (!this->determineTarget(errMsg)) return false; - Module *MergedModule = IRLinker.getModule(); - legacy::PassManager codeGenPasses; // If the bitcode files contain ARC code and were compiled with optimization, Index: llvm/trunk/tools/llvm-lto/llvm-lto.cpp =================================================================== --- llvm/trunk/tools/llvm-lto/llvm-lto.cpp +++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp @@ -210,7 +210,7 @@ // SetMergedModule is true. if (SetMergedModule && i == BaseArg) { // Transfer ownership to the code generator. - CodeGen.setModule(Module.release()); + CodeGen.setModule(std::move(Module)); } else if (!CodeGen.addModule(Module.get())) return 1; } Index: llvm/trunk/tools/lto/lto.cpp =================================================================== --- llvm/trunk/tools/lto/lto.cpp +++ llvm/trunk/tools/lto/lto.cpp @@ -260,7 +260,7 @@ } void lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod) { - unwrap(cg)->setModule(unwrap(mod)); + unwrap(cg)->setModule(std::unique_ptr(unwrap(mod))); } bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) {