Index: include/llvm-c/lto.h =================================================================== --- include/llvm-c/lto.h +++ include/llvm-c/lto.h @@ -40,7 +40,7 @@ * @{ */ -#define LTO_API_VERSION 17 +#define LTO_API_VERSION 18 /** * \since prior to LTO_API_VERSION=3 @@ -374,8 +374,7 @@ 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 destroy the module. * * \c cg and \c mod must both be in the same context. * Index: include/llvm/LTO/LTOCodeGenerator.h =================================================================== --- include/llvm/LTO/LTOCodeGenerator.h +++ 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 OwnedModule; Linker IRLinker; TargetMachine *TargetMach = nullptr; bool EmitDwarfDebugInfo = false; @@ -173,7 +173,6 @@ unsigned OptLevel = 2; lto_diagnostic_handler_t DiagHandler = nullptr; void *DiagContext = nullptr; - LTOModule *OwnedModule = nullptr; bool ShouldInternalize = true; bool ShouldEmbedUselists = false; }; Index: include/llvm/LTO/LTOModule.h =================================================================== --- include/llvm/LTO/LTOModule.h +++ include/llvm/LTO/LTOModule.h @@ -113,6 +113,10 @@ return IRFile->getModule(); } + std::unique_ptr takeModule() { + return IRFile->takeModule(); + } + /// Return the Module's target triple. const std::string &getTargetTriple() { return getModule().getTargetTriple(); Index: include/llvm/Linker/Linker.h =================================================================== --- include/llvm/Linker/Linker.h +++ include/llvm/Linker/Linker.h @@ -62,7 +62,6 @@ Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler); Linker(Module *M); - ~Linker(); Module *getModule() const { return Composite; } void deleteModule(); Index: lib/LTO/LTOCodeGenerator.cpp =================================================================== --- lib/LTO/LTOCodeGenerator.cpp +++ lib/LTO/LTOCodeGenerator.cpp @@ -64,29 +64,20 @@ } LTOCodeGenerator::LTOCodeGenerator() - : Context(getGlobalContext()), IRLinker(new Module("ld-temp.o", Context)) { + : Context(getGlobalContext()), + OwnedModule(new Module("ld-temp.o", Context)), + IRLinker(OwnedModule.get()) { initializeLTOPasses(); } LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr Context) : OwnedContext(std::move(Context)), Context(*OwnedContext), - IRLinker(new Module("ld-temp.o", *OwnedContext)) { + OwnedModule(new Module("ld-temp.o", *OwnedContext)), + IRLinker(OwnedModule.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(); - delete TargetMach; TargetMach = nullptr; @@ -139,16 +130,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()); + OwnedModule = Mod->takeModule(); + IRLinker.setModule(OwnedModule.get()); const std::vector &Undefs = Mod->getAsmUndefinedRefs(); for (int I = 0, E = Undefs.size(); I != E; ++I) @@ -551,8 +540,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, @@ -566,7 +553,10 @@ } // Run the code generator, and write assembly file - codeGenPasses.run(*mergedModule); + codeGenPasses.run(*OwnedModule.get()); + + // Finally destroy the module as we no longer need it + OwnedModule.reset(); return true; } Index: lib/Linker/LinkModules.cpp =================================================================== --- lib/Linker/LinkModules.cpp +++ lib/Linker/LinkModules.cpp @@ -1754,9 +1754,6 @@ }); } -Linker::~Linker() { -} - void Linker::deleteModule() { delete Composite; Composite = nullptr; Index: tools/llvm-lto/llvm-lto.cpp =================================================================== --- tools/llvm-lto/llvm-lto.cpp +++ tools/llvm-lto/llvm-lto.cpp @@ -207,26 +207,24 @@ return 1; } - LTOModule *LTOMod = Module.get(); - - // We use the first input module as the destination module when - // SetMergedModule is true. - if (SetMergedModule && i == BaseArg) { - // Transfer ownership to the code generator. - CodeGen.setModule(Module.release()); - } else if (!CodeGen.addModule(Module.get())) - return 1; - - unsigned NumSyms = LTOMod->getSymbolCount(); + unsigned NumSyms = Module->getSymbolCount(); for (unsigned I = 0; I < NumSyms; ++I) { - StringRef Name = LTOMod->getSymbolName(I); + StringRef Name = Module->getSymbolName(I); if (!DSOSymbolsSet.count(Name)) continue; - lto_symbol_attributes Attrs = LTOMod->getSymbolAttributes(I); + lto_symbol_attributes Attrs = Module->getSymbolAttributes(I); unsigned Scope = Attrs & LTO_SYMBOL_SCOPE_MASK; if (Scope != LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN) KeptDSOSyms.push_back(Name); } + + // We use the first input module as the destination module when + // SetMergedModule is true. + if (SetMergedModule && i == BaseArg) { + // Transfer ownership to the code generator. + CodeGen.setModule(std::move(Module)); + } else if (!CodeGen.addModule(Module.get())) + return 1; } // Add all the exported symbols to the table of symbols to preserve. Index: tools/lto/lto.cpp =================================================================== --- tools/lto/lto.cpp +++ 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) {