diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp index 6fe4e1169ad7..0d3593844f09 100644 --- a/lld/ELF/LTO.cpp +++ b/lld/ELF/LTO.cpp @@ -142,7 +142,8 @@ static void internalize(GlobalValue &GV) { GV.setLinkage(GlobalValue::InternalLinkage); } -std::vector> BitcodeCompiler::runSplitCodegen() { +std::vector> BitcodeCompiler::runSplitCodegen( + const std::function()> &TMFactory) { unsigned NumThreads = Config->LtoJobs; OwningData.resize(NumThreads); @@ -153,8 +154,7 @@ std::vector> BitcodeCompiler::runSplitCodegen() { OSPtrs.push_back(&OSs.back()); } - splitCodeGen(std::move(Combined), OSPtrs, {}, - [this]() { return getTargetMachine(); }); + splitCodeGen(std::move(Combined), OSPtrs, {}, TMFactory); std::vector> ObjFiles; for (SmallString<0> &Obj : OwningData) @@ -181,19 +181,20 @@ std::vector> BitcodeCompiler::compile() { if (Config->SaveTemps) saveBCFile(*Combined, ".lto.bc"); - std::unique_ptr TM(getTargetMachine()); - runLTOPasses(*Combined, *TM); - - return runSplitCodegen(); -} - -std::unique_ptr BitcodeCompiler::getTargetMachine() { std::string Msg; const Target *T = TargetRegistry::lookupTarget(TheTriple, Msg); if (!T) fatal("target not found: " + Msg); TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); Reloc::Model R = Config->Pic ? Reloc::PIC_ : Reloc::Static; - return std::unique_ptr( - T->createTargetMachine(TheTriple, "", "", Options, R)); + + auto CreateTargetMachine = [&]() { + return std::unique_ptr( + T->createTargetMachine(TheTriple, "", "", Options, R)); + }; + + std::unique_ptr TM = CreateTargetMachine(); + runLTOPasses(*Combined, *TM); + + return runSplitCodegen(CreateTargetMachine); } diff --git a/lld/ELF/LTO.h b/lld/ELF/LTO.h index c06c49e83249..2208891a584a 100644 --- a/lld/ELF/LTO.h +++ b/lld/ELF/LTO.h @@ -45,8 +45,8 @@ public: } private: - std::vector> runSplitCodegen(); - std::unique_ptr getTargetMachine(); + std::vector> runSplitCodegen( + const std::function()> &TMFactory); llvm::LLVMContext Context; std::unique_ptr Combined;