diff --git a/src/ravi_llvmjit.cpp b/src/ravi_llvmjit.cpp index 6decf47..d29779a 100644 --- a/src/ravi_llvmjit.cpp +++ b/src/ravi_llvmjit.cpp @@ -207,20 +207,20 @@ RaviJITState::RaviJITState() #if USE_ORCv2_JIT - auto JTMB = llvm::orc::JITTargetMachineBuilder::detectHost(); - //JTMB->setCodeGenOptLevel(llvm::CodeGenOpt::Default); - auto dataLayout = JTMB->getDefaultDataLayoutForTarget(); - TM = llvm::cantFail(JTMB->createTargetMachine()); + auto JTMB = llvm::cantFail(llvm::orc::JITTargetMachineBuilder::detectHost()); + JTMB.setCodeGenOptLevel(llvm::CodeGenOpt::Default); + auto dataLayout = llvm::cantFail(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)))); + 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))); + 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())); @@ -278,9 +278,21 @@ RaviJITState::RaviJITState() #endif // USE_ORCv2_JIT +#if USE_ORCv2_JIT + auto &JD = ES->getMainJITDylib(); + llvm::orc::MangleAndInterner mangle(*ES, *this->DL); + llvm::orc::SymbolMap Symbols; + for (int i = 0; global_syms[i].name != nullptr; i++) { + Symbols.insert( { mangle(global_syms[i].name), + llvm::JITEvaluatedSymbol(llvm::pointerToJITTargetAddress(global_syms[i].address), + llvm::JITSymbolFlags(llvm::JITSymbolFlags::FlagNames::Absolute)) }); + } + llvm::cantFail(JD.define(llvm::orc::absoluteSymbols(Symbols)), "Failed to install extern symbols"); +#else for (int i = 0; global_syms[i].name != nullptr; i++) { llvm::sys::DynamicLibrary::AddSymbol(global_syms[i].name, global_syms[i].address); } +#endif } // Destroy the JIT state freeing up any @@ -703,7 +715,7 @@ void RaviJITModule::finalize(bool doDump) { // The optimization passes are run via the callback module_handle_ = owner()->addModule(std::move(module_)); #else - owner()->addModule(std::move(module_)); + llvm::cantFail(owner()->addModule(std::move(module_))); #endif for (int i = 0; i < functions_.size(); i++) { if (functions_[i] == nullptr)