From 2aa2515fe161ba717ed49bc92047a29d9f0ab359 Mon Sep 17 00:00:00 2001 From: Dibyendu Majumdar Date: Sat, 10 Aug 2019 22:30:53 +0100 Subject: [PATCH] issue #164 optimizeModule() no longer static --- include/ravi_llvmcodegen.h | 10 ++++--- src/ravi_llvmjit.cpp | 57 +++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/include/ravi_llvmcodegen.h b/include/ravi_llvmcodegen.h index f2b4ce0..4fa6b17 100644 --- a/include/ravi_llvmcodegen.h +++ b/include/ravi_llvmcodegen.h @@ -400,6 +400,7 @@ class RaviJITState { std::unique_ptr DL; std::unique_ptr Mangle; std::unique_ptr Ctx; + std::unique_ptr TM; #elif USE_ORC_JIT @@ -438,7 +439,7 @@ class RaviJITState { std::unique_ptr CompileLayer; std::unique_ptr OptimizeLayer; #if LLVM_VERSION_MAJOR >= 8 - std::map> Resolvers; + std::map > Resolvers; std::shared_ptr StringPool; std::unique_ptr ES; std::unique_ptr CompileCallbackManager; @@ -451,7 +452,7 @@ class RaviJITState { // The LLVM Context llvm::LLVMContext *context_; -#endif // USE_ORCv2_JIT +#endif // USE_ORCv2_JIT // The triple represents the host target std::string triple_; @@ -506,7 +507,8 @@ class RaviJITState { llvm::LLVMContext &context() { return *Ctx->getContext(); } - static llvm::Expected optimizeModule(llvm::orc::ThreadSafeModule TSM, const llvm::orc::MaterializationResponsibility &R); + llvm::Expected optimizeModule(llvm::orc::ThreadSafeModule TSM, + const llvm::orc::MaterializationResponsibility &R); llvm::Error addModule(std::unique_ptr M); @@ -528,7 +530,7 @@ class RaviJITState { ModuleHandle addModule(std::unique_ptr M); - llvm::JITSymbol findSymbol(const std::string& Name); + llvm::JITSymbol findSymbol(const std::string &Name); void removeModule(ModuleHandle H); diff --git a/src/ravi_llvmjit.cpp b/src/ravi_llvmjit.cpp index 4ddbbf1..3c180f2 100644 --- a/src/ravi_llvmjit.cpp +++ b/src/ravi_llvmjit.cpp @@ -146,17 +146,21 @@ RaviJITState::RaviJITState() auto JTMB = llvm::orc::JITTargetMachineBuilder::detectHost(); auto dataLayout = JTMB->getDefaultDataLayoutForTarget(); - + TM = llvm::cantFail(JTMB->createTargetMachine()); ES = std::unique_ptr(new llvm::orc::ExecutionSession()); - ObjectLayer = std::unique_ptr(new llvm::orc::RTDyldObjectLinkingLayer(*ES, - []() { return llvm::make_unique(); })); - CompileLayer = std::unique_ptr(new llvm::orc::IRCompileLayer(*ES, *ObjectLayer, llvm::orc::ConcurrentIRCompiler(std::move(*JTMB)))); - OptimizeLayer = std::unique_ptr(new llvm::orc::IRTransformLayer(*ES, *CompileLayer, optimizeModule)); + ObjectLayer = std::unique_ptr( + new llvm::orc::RTDyldObjectLinkingLayer(*ES, []() { return llvm::make_unique(); })); + CompileLayer = std::unique_ptr( + new llvm::orc::IRCompileLayer(*ES, *ObjectLayer, llvm::orc::ConcurrentIRCompiler(std::move(*JTMB)))); + OptimizeLayer = std::unique_ptr(new llvm::orc::IRTransformLayer( + *ES, *CompileLayer, [this](llvm::orc::ThreadSafeModule TSM, const llvm::orc::MaterializationResponsibility &R) { + return this->optimizeModule(std::move(TSM), R); + })); DL = std::unique_ptr(new llvm::DataLayout(std::move(*dataLayout))); Mangle = std::unique_ptr(new llvm::orc::MangleAndInterner(*ES, *this->DL)); - Ctx = std::unique_ptr(new llvm::orc::ThreadSafeContext(llvm::make_unique())); - ES->getMainJITDylib().setGenerator( - cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(*DL))); + Ctx = std::unique_ptr( + new llvm::orc::ThreadSafeContext(llvm::make_unique())); + ES->getMainJITDylib().setGenerator(cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(*DL))); types_ = new LuaLLVMTypes(*Ctx->getContext()); @@ -193,8 +197,7 @@ RaviJITState::RaviJITState() #if LLVM_VERSION_MAJOR >= 8 OptimizeLayer = std::unique_ptr(new OptimizerLayerT( *CompileLayer, [this](std::unique_ptr M) { return optimizeModule(std::move(M)); })); - CompileCallbackManager = - cantFail(llvm::orc::createLocalCompileCallbackManager(TM->getTargetTriple(), *ES, 0)); + CompileCallbackManager = cantFail(llvm::orc::createLocalCompileCallbackManager(TM->getTargetTriple(), *ES, 0)); CompileOnDemandLayer = std::unique_ptr(new CODLayerT( *ES, *OptimizeLayer, [&](llvm::orc::VModuleKey K) { return Resolvers[K]; }, [&](llvm::orc::VModuleKey K, std::shared_ptr R) { Resolvers[K] = std::move(R); }, @@ -209,7 +212,7 @@ RaviJITState::RaviJITState() types_ = new LuaLLVMTypes(*context_); -#endif // USE_ORCv2_JIT +#endif // USE_ORCv2_JIT for (int i = 0; global_syms[i].name != nullptr; i++) { llvm::sys::DynamicLibrary::AddSymbol(global_syms[i].name, global_syms[i].address); @@ -228,7 +231,8 @@ RaviJITState::~RaviJITState() { #if USE_ORC_JIT || USE_ORCv2_JIT #if USE_ORCv2_JIT -llvm::Expected RaviJITState::optimizeModule(llvm::orc::ThreadSafeModule TSM, const llvm::orc::MaterializationResponsibility &R) { +llvm::Expected RaviJITState::optimizeModule( + llvm::orc::ThreadSafeModule TSM, const llvm::orc::MaterializationResponsibility &R) { #else #if LLVM_VERSION_MAJOR >= 8 std::unique_ptr RaviJITState::optimizeModule(std::unique_ptr M) { @@ -236,11 +240,12 @@ std::unique_ptr RaviJITState::optimizeModule(std::unique_ptr RaviJITState::optimizeModule(std::shared_ptr M) { #endif #endif - using llvm::legacy::FunctionPassManager; using llvm::legacy::PassManager; -#if !USE_ORCv2_JIT +#if USE_ORCv2_JIT + auto M = TSM.getModule(); +#endif if (get_verbosity() >= 1) M->print(llvm::errs(), nullptr, false, true); if (get_verbosity() >= 3) @@ -251,7 +256,6 @@ std::shared_ptr RaviJITState::optimizeModule(std::shared_ptrOptions.EnableFastISel = 1; else TM->Options.EnableFastISel = 0; -#endif // We use the PassManagerBuilder to setup optimization // passes - the PassManagerBuilder allows easy configuration of @@ -261,13 +265,8 @@ std::shared_ptr RaviJITState::optimizeModule(std::shared_ptr RaviJITState::optimizeModule(std::shared_ptrrun(F); #endif } -#if USE_ORCv2_JIT - std::unique_ptr MPM(new PassManager()); - pmb.populateModulePassManager(*MPM); - MPM->run(*TSM.getModule()); - return TSM; -#else std::string codestr; { llvm::raw_string_ostream ostream(codestr); @@ -315,11 +308,18 @@ std::shared_ptr RaviJITState::optimizeModule(std::shared_ptrrun(*TSM.getModule()); +#else MPM->run(*M); +#endif } if (get_verbosity() == 2 && codestr.length() > 0) llvm::errs() << codestr << "\n"; +#if USE_ORCv2_JIT + return TSM; +#else return M; #endif } @@ -332,8 +332,7 @@ void RaviJITState::addGlobalSymbol(const std::string &name, void *address) { #if USE_ORCv2_JIT llvm::Error RaviJITState::addModule(std::unique_ptr M) { - return OptimizeLayer->add(ES->getMainJITDylib(), - llvm::orc::ThreadSafeModule(std::move(M), *Ctx)); + return OptimizeLayer->add(ES->getMainJITDylib(), llvm::orc::ThreadSafeModule(std::move(M), *Ctx)); } #elif USE_ORC_JIT RaviJITState::ModuleHandle RaviJITState::addModule(std::unique_ptr M) { @@ -379,7 +378,7 @@ RaviJITState::ModuleHandle RaviJITState::addModule(std::unique_ptr #endif } -llvm::JITSymbol RaviJITState::findSymbol(const std::string& Name) { +llvm::JITSymbol RaviJITState::findSymbol(const std::string &Name) { std::string MangledName; llvm::raw_string_ostream MangledNameStream(MangledName); llvm::Mangler::getNameWithPrefix(MangledNameStream, Name, *DL);