diff --git a/src/aotcompile.cpp b/src/aotcompile.cpp index e81f6a9f7fdf8..141f96b332340 100644 --- a/src/aotcompile.cpp +++ b/src/aotcompile.cpp @@ -551,17 +551,20 @@ void jl_dump_native_impl(void *native_code, if (TM->addPassesToEmitFile(emitter, asm_OS, nullptr, CGFT_AssemblyFile, false)) jl_safe_printf("ERROR: target does not support generation of object files\n"); - legacy::PassManager optimizer; - if (bc_fname || obj_fname || asm_fname) { - addTargetPasses(&optimizer, TM->getTargetTriple(), TM->getTargetIRAnalysis()); - addOptimizationPasses(&optimizer, jl_options.opt_level, true, true); - addMachinePasses(&optimizer, jl_options.opt_level); - } - // Reset the target triple to make sure it matches the new target machine auto dataM = data->M.getModuleUnlocked(); dataM->setTargetTriple(TM->getTargetTriple().str()); dataM->setDataLayout(jl_create_datalayout(*TM)); + +#ifndef JL_USE_NEW_PM + legacy::PassManager optimizer; + addTargetPasses(&optimizer, TM->getTargetTriple(), TM->getTargetIRAnalysis()); + addOptimizationPasses(&optimizer, jl_options.opt_level, true, true); + addMachinePasses(&optimizer, jl_options.opt_level); +#else + NewPM optimizer{std::move(TM), getOptLevel(jl_options.opt_level), {true, true, false}}; +#endif + Type *T_size; if (sizeof(size_t) == 8) T_size = Type::getInt64Ty(Context); @@ -588,7 +591,7 @@ void jl_dump_native_impl(void *native_code, // do the actual work auto add_output = [&] (Module &M, StringRef unopt_bc_Name, StringRef bc_Name, StringRef obj_Name, StringRef asm_Name) { preopt.run(M, empty.MAM); - optimizer.run(M); + if (bc_fname || obj_fname || asm_fname) optimizer.run(M); // We would like to emit an alias or an weakref alias to redirect these symbols // but LLVM doesn't let us emit a GlobalAlias to a declaration... @@ -1065,10 +1068,14 @@ void jl_get_llvmf_defn_impl(jl_llvmf_dump_t* dump, jl_method_instance_t *mi, siz for (auto &global : output.globals) global.second->setLinkage(GlobalValue::ExternalLinkage); if (optimize) { +#ifndef JL_USE_NEW_PM legacy::PassManager PM; addTargetPasses(&PM, jl_ExecutionEngine->getTargetTriple(), jl_ExecutionEngine->getTargetIRAnalysis()); addOptimizationPasses(&PM, jl_options.opt_level); addMachinePasses(&PM, jl_options.opt_level); +#else + NewPM PM{jl_ExecutionEngine->cloneTargetMachine(), getOptLevel(jl_options.opt_level)}; +#endif //Safe b/c context lock is held by output PM.run(*m.getModuleUnlocked()); } diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index b76b8769c4306..f85856b94d60e 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -973,7 +973,11 @@ namespace { namespace { +#ifndef JL_USE_NEW_PM typedef legacy::PassManager PassManager; +#else + typedef NewPM PassManager; +#endif orc::JITTargetMachineBuilder createJTMBFromTM(TargetMachine &TM, int optlevel) { return orc::JITTargetMachineBuilder(TM.getTargetTriple()) @@ -995,6 +999,7 @@ namespace { } }; +#ifndef JL_USE_NEW_PM struct PMCreator { std::unique_ptr TM; int optlevel; @@ -1010,7 +1015,7 @@ namespace { swap(*this, other); return *this; } - std::unique_ptr operator()() { + auto operator()() { auto PM = std::make_unique(); addTargetPasses(PM.get(), TM->getTargetTriple(), TM->getTargetIRAnalysis()); addOptimizationPasses(PM.get(), optlevel); @@ -1018,6 +1023,17 @@ namespace { return PM; } }; +#else + struct PMCreator { + orc::JITTargetMachineBuilder JTMB; + OptimizationLevel O; + PMCreator(TargetMachine &TM, int optlevel) : JTMB(createJTMBFromTM(TM, optlevel)), O(getOptLevel(optlevel)) {} + + auto operator()() { + return std::make_unique(cantFail(JTMB.createTargetMachine()), O); + } + }; +#endif struct OptimizerT { OptimizerT(TargetMachine &TM, int optlevel) : optlevel(optlevel), PMs(PMCreator(TM, optlevel)) {}