[llvm] r245891 - LTO: Simplify merged module ownership.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 15:22:54 PDT 2015
Author: pcc
Date: Mon Aug 24 17:22:53 2015
New Revision: 245891
URL: http://llvm.org/viewvc/llvm-project?rev=245891&view=rev
Log:
LTO: Simplify merged module ownership.
This change moves LTOCodeGenerator's ownership of the merged module to a
field of type std::unique_ptr<Module>. 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
Modified:
llvm/trunk/include/llvm-c/lto.h
llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
llvm/trunk/include/llvm/LTO/LTOModule.h
llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
llvm/trunk/tools/llvm-lto/llvm-lto.cpp
llvm/trunk/tools/lto/lto.cpp
Modified: llvm/trunk/include/llvm-c/lto.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=245891&r1=245890&r2=245891&view=diff
==============================================================================
--- llvm/trunk/include/llvm-c/lto.h (original)
+++ llvm/trunk/include/llvm-c/lto.h Mon Aug 24 17:22:53 2015
@@ -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.
*
Modified: llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h?rev=245891&r1=245890&r2=245891&view=diff
==============================================================================
--- llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h (original)
+++ llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h Mon Aug 24 17:22:53 2015
@@ -69,7 +69,7 @@ struct LTOCodeGenerator {
bool addModule(struct LTOModule *);
// Set the destination module.
- void setModule(struct LTOModule *);
+ void setModule(std::unique_ptr<LTOModule> M);
void setTargetOptions(TargetOptions options);
void setDebugInfo(lto_debug_model);
@@ -155,9 +155,9 @@ private:
typedef StringMap<uint8_t> StringSet;
- void destroyMergedModule();
std::unique_ptr<LLVMContext> OwnedContext;
LLVMContext &Context;
+ std::unique_ptr<Module> MergedModule;
Linker IRLinker;
std::unique_ptr<TargetMachine> 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;
};
Modified: llvm/trunk/include/llvm/LTO/LTOModule.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOModule.h?rev=245891&r1=245890&r2=245891&view=diff
==============================================================================
--- llvm/trunk/include/llvm/LTO/LTOModule.h (original)
+++ llvm/trunk/include/llvm/LTO/LTOModule.h Mon Aug 24 17:22:53 2015
@@ -113,6 +113,8 @@ public:
return IRFile->getModule();
}
+ std::unique_ptr<Module> takeModule() { return IRFile->takeModule(); }
+
/// Return the Module's target triple.
const std::string &getTargetTriple() {
return getModule().getTargetTriple();
Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=245891&r1=245890&r2=245891&view=diff
==============================================================================
--- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
+++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Mon Aug 24 17:22:53 2015
@@ -64,29 +64,20 @@ const char* LTOCodeGenerator::getVersion
}
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<LLVMContext> 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(LTOModu
return !ret;
}
-void LTOCodeGenerator::setModule(LTOModule *Mod) {
+void LTOCodeGenerator::setModule(std::unique_ptr<LTOModule> 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<const char*> &Undefs = Mod->getAsmUndefinedRefs();
for (int I = 0, E = Undefs.size(); I != E; ++I)
@@ -200,7 +189,7 @@ bool LTOCodeGenerator::writeMergedModule
}
// 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(s
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(st
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 Dis
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(
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,
Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=245891&r1=245890&r2=245891&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)
+++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Mon Aug 24 17:22:53 2015
@@ -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;
}
Modified: llvm/trunk/tools/lto/lto.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=245891&r1=245890&r2=245891&view=diff
==============================================================================
--- llvm/trunk/tools/lto/lto.cpp (original)
+++ llvm/trunk/tools/lto/lto.cpp Mon Aug 24 17:22:53 2015
@@ -260,7 +260,7 @@ bool lto_codegen_add_module(lto_code_gen
}
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<LTOModule>(unwrap(mod)));
}
bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) {
More information about the llvm-commits
mailing list