From: Peter Collingbourne Date: Mon, 24 Aug 2015 22:22:53 +0000 (+0000) Subject: LTO: Simplify merged module ownership. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=8c1602df5088d633d11437a1df2121fdd1946349 LTO: Simplify merged module ownership. This change moves LTOCodeGenerator's ownership of the merged module to a field of type std::unique_ptr. This helps simplify parts of the code and clears the way for the module to be consumed by LLVM CodeGen (see D12132 review comments). Differential Revision: http://reviews.llvm.org/D12205 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245891 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm-c/lto.h b/include/llvm-c/lto.h index cb3a6916045..691a0cd3f55 100644 --- a/include/llvm-c/lto.h +++ b/include/llvm-c/lto.h @@ -374,8 +374,8 @@ extern lto_bool_t 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. * diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index 33ac009c796..ca0578fdc7d 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -69,7 +69,7 @@ struct LTOCodeGenerator { 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 @@ private: 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 @@ private: unsigned OptLevel = 2; lto_diagnostic_handler_t DiagHandler = nullptr; void *DiagContext = nullptr; - LTOModule *OwnedModule = nullptr; bool ShouldInternalize = true; bool ShouldEmbedUselists = false; }; diff --git a/include/llvm/LTO/LTOModule.h b/include/llvm/LTO/LTOModule.h index c4e2be62739..eda5a3a09ce 100644 --- a/include/llvm/LTO/LTOModule.h +++ b/include/llvm/LTO/LTOModule.h @@ -113,6 +113,8 @@ public: return IRFile->getModule(); } + std::unique_ptr takeModule() { return IRFile->takeModule(); } + /// Return the Module's target triple. const std::string &getTargetTriple() { return getModule().getTargetTriple(); diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 3003113142a..60ce4f67e03 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -64,29 +64,20 @@ const char* LTOCodeGenerator::getVersionString() { } 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 @@ bool LTOCodeGenerator::addModule(LTOModule *mod) { 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 @@ bool LTOCodeGenerator::writeMergedModules(const char *path, } // 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 @@ bool LTOCodeGenerator::determineTarget(std::string &errMsg) { 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 @@ static void accumulateAndSortLibcalls(std::vector &Libcalls, void LTOCodeGenerator::applyScopeRestrictions() { if (ScopeRestrictionsDone || !ShouldInternalize) return; - Module *MergedModule = IRLinker.getModule(); // Start off with a verification pass. legacy::PassManager passes; @@ -475,8 +463,6 @@ bool LTOCodeGenerator::optimize(bool DisableInline, if (!this->determineTarget(errMsg)) return false; - Module *MergedModule = IRLinker.getModule(); - // Mark which symbols can not be internalized this->applyScopeRestrictions(); @@ -514,8 +500,6 @@ bool LTOCodeGenerator::compileOptimized(raw_pwrite_stream &out, 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, diff --git a/tools/llvm-lto/llvm-lto.cpp b/tools/llvm-lto/llvm-lto.cpp index b17f1ea307b..52e45296126 100644 --- a/tools/llvm-lto/llvm-lto.cpp +++ b/tools/llvm-lto/llvm-lto.cpp @@ -210,7 +210,7 @@ int main(int argc, char **argv) { // 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; } diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index aebb1c64a31..8f62929b326 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -260,7 +260,7 @@ bool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) { } 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) {