}
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();
-
- delete TargetMach;
- TargetMach = nullptr;
-}
+LTOCodeGenerator::~LTOCodeGenerator() {}
// Initialize LTO passes. Please keep this funciton in sync with
// PassManagerBuilder::populateLTOPassManager(), and make sure all LTO
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)
llvm_unreachable("Unknown debug format!");
}
-void LTOCodeGenerator::setCodePICModel(lto_codegen_model model) {
- switch (model) {
- case LTO_CODEGEN_PIC_MODEL_STATIC:
- case LTO_CODEGEN_PIC_MODEL_DYNAMIC:
- case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:
- case LTO_CODEGEN_PIC_MODEL_DEFAULT:
- CodeModel = model;
- return;
+void LTOCodeGenerator::setOptLevel(unsigned level) {
+ OptLevel = level;
+ switch (OptLevel) {
+ case 0:
+ CGOptLevel = CodeGenOpt::None;
+ break;
+ case 1:
+ CGOptLevel = CodeGenOpt::Less;
+ break;
+ case 2:
+ CGOptLevel = CodeGenOpt::Default;
+ break;
+ case 3:
+ CGOptLevel = CodeGenOpt::Aggressive;
+ break;
}
- llvm_unreachable("Unknown PIC model!");
}
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()) {
if (TargetMach)
return true;
- std::string TripleStr = IRLinker.getModule()->getTargetTriple();
- if (TripleStr.empty())
+ std::string TripleStr = MergedModule->getTargetTriple();
+ if (TripleStr.empty()) {
TripleStr = sys::getDefaultTargetTriple();
+ MergedModule->setTargetTriple(TripleStr);
+ }
llvm::Triple Triple(TripleStr);
// create target machine from info for merged modules
if (!march)
return false;
- // The relocation model is actually a static member of TargetMachine and
- // needs to be set before the TargetMachine is instantiated.
- Reloc::Model RelocModel = Reloc::Default;
- switch (CodeModel) {
- case LTO_CODEGEN_PIC_MODEL_STATIC:
- RelocModel = Reloc::Static;
- break;
- case LTO_CODEGEN_PIC_MODEL_DYNAMIC:
- RelocModel = Reloc::PIC_;
- break;
- case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:
- RelocModel = Reloc::DynamicNoPIC;
- break;
- case LTO_CODEGEN_PIC_MODEL_DEFAULT:
- // RelocModel is already the default, so leave it that way.
- break;
- }
-
// Construct LTOModule, hand over ownership of module and target. Use MAttr as
// the default set of features.
SubtargetFeatures Features(MAttr);
Features.getDefaultSubtargetFeatures(Triple);
- std::string FeatureStr = Features.getString();
+ FeatureStr = Features.getString();
// Set a default CPU for Darwin triples.
if (MCpu.empty() && Triple.isOSDarwin()) {
if (Triple.getArch() == llvm::Triple::x86_64)
MCpu = "cyclone";
}
- CodeGenOpt::Level CGOptLevel;
- switch (OptLevel) {
- case 0:
- CGOptLevel = CodeGenOpt::None;
- break;
- case 1:
- CGOptLevel = CodeGenOpt::Less;
- break;
- case 2:
- CGOptLevel = CodeGenOpt::Default;
- break;
- case 3:
- CGOptLevel = CodeGenOpt::Aggressive;
- break;
- }
-
- TargetMach = march->createTargetMachine(TripleStr, MCpu, FeatureStr, Options,
- RelocModel, CodeModel::Default,
- CGOptLevel);
+ TargetMach.reset(march->createTargetMachine(TripleStr, MCpu, FeatureStr,
+ Options, RelocModel,
+ CodeModel::Default, CGOptLevel));
return true;
}
void LTOCodeGenerator::applyScopeRestrictions() {
if (ScopeRestrictionsDone || !ShouldInternalize)
return;
- Module *mergedModule = IRLinker.getModule();
// Start off with a verification pass.
legacy::PassManager passes;
TargetLibraryInfoImpl TLII(Triple(TargetMach->getTargetTriple()));
TargetLibraryInfo TLI(TLII);
- accumulateAndSortLibcalls(Libcalls, TLI, *mergedModule, *TargetMach);
+ accumulateAndSortLibcalls(Libcalls, TLI, *MergedModule, *TargetMach);
- for (Module::iterator f = mergedModule->begin(),
- e = mergedModule->end(); f != e; ++f)
- applyRestriction(*f, Libcalls, MustPreserveList, AsmUsed, Mangler);
- for (Module::global_iterator v = mergedModule->global_begin(),
- e = mergedModule->global_end(); v != e; ++v)
- applyRestriction(*v, Libcalls, MustPreserveList, AsmUsed, Mangler);
- for (Module::alias_iterator a = mergedModule->alias_begin(),
- e = mergedModule->alias_end(); a != e; ++a)
- applyRestriction(*a, Libcalls, MustPreserveList, AsmUsed, Mangler);
+ for (Function &f : *MergedModule)
+ applyRestriction(f, Libcalls, MustPreserveList, AsmUsed, Mangler);
+ for (GlobalVariable &v : MergedModule->globals())
+ applyRestriction(v, Libcalls, MustPreserveList, AsmUsed, Mangler);
+ for (GlobalAlias &a : MergedModule->aliases())
+ applyRestriction(a, Libcalls, MustPreserveList, AsmUsed, Mangler);
GlobalVariable *LLVMCompilerUsed =
- mergedModule->getGlobalVariable("llvm.compiler.used");
+ MergedModule->getGlobalVariable("llvm.compiler.used");
findUsedValues(LLVMCompilerUsed, AsmUsed);
if (LLVMCompilerUsed)
LLVMCompilerUsed->eraseFromParent();
llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, asmUsed2.size());
LLVMCompilerUsed =
- new llvm::GlobalVariable(*mergedModule, ATy, false,
+ new llvm::GlobalVariable(*MergedModule, ATy, false,
llvm::GlobalValue::AppendingLinkage,
llvm::ConstantArray::get(ATy, asmUsed2),
"llvm.compiler.used");
passes.add(createInternalizePass(MustPreserveList));
// apply scope restrictions
- passes.run(*mergedModule);
+ passes.run(*MergedModule);
ScopeRestrictionsDone = true;
}
if (!this->determineTarget(errMsg))
return false;
- Module *mergedModule = IRLinker.getModule();
-
// Mark which symbols can not be internalized
this->applyScopeRestrictions();
legacy::PassManager passes;
// Add an appropriate DataLayout instance for this module...
- mergedModule->setDataLayout(TargetMach->createDataLayout());
+ MergedModule->setDataLayout(TargetMach->createDataLayout());
passes.add(
createTargetTransformInfoWrapperPass(TargetMach->getTargetIRAnalysis()));
PMB.populateLTOPassManager(passes);
// Run our queue of passes all at once now, efficiently.
- passes.run(*mergedModule);
+ passes.run(*MergedModule);
return true;
}
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,
return false;
}
- // Run the code generator, and write assembly file
- codeGenPasses.run(*mergedModule);
+ // Run the code generator, and write object file
+ codeGenPasses.run(*MergedModule);
return true;
}