From: Lang Hames Date: Thu, 18 Jul 2019 22:47:18 +0000 (+0000) Subject: Update the SimpleJIT class in the clang-interpreter example to use ORCv2. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ffd82a053c3b9dcfc4789ba8c9b1f0230359cb53;p=clang Update the SimpleJIT class in the clang-interpreter example to use ORCv2. This will remove the ORCv1 deprecation warnings. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@366511 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/examples/clang-interpreter/main.cpp b/examples/clang-interpreter/main.cpp index 8fb52700a7..69808428a3 100644 --- a/examples/clang-interpreter/main.cpp +++ b/examples/clang-interpreter/main.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h" +#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" #include "llvm/ExecutionEngine/SectionMemoryManager.h" @@ -50,65 +51,69 @@ namespace orc { class SimpleJIT { private: ExecutionSession ES; - std::shared_ptr Resolver; std::unique_ptr TM; const DataLayout DL; - LegacyRTDyldObjectLinkingLayer ObjectLayer; - LegacyIRCompileLayer CompileLayer; + MangleAndInterner Mangle{ES, DL}; + RTDyldObjectLinkingLayer ObjectLayer{ES, createMemMgr}; + IRCompileLayer CompileLayer{ES, ObjectLayer, SimpleCompiler(*TM)}; -public: - SimpleJIT() - : Resolver(createLegacyLookupResolver( - ES, - [this](const std::string &Name) -> JITSymbol { - if (auto Sym = CompileLayer.findSymbol(Name, false)) - return Sym; - else if (auto Err = Sym.takeError()) - return std::move(Err); - if (auto SymAddr = - RTDyldMemoryManager::getSymbolAddressInProcess(Name)) - return JITSymbol(SymAddr, JITSymbolFlags::Exported); - return nullptr; - }, - [](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })), - TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()), - ObjectLayer(ES, - [this](VModuleKey) { - return LegacyRTDyldObjectLinkingLayer::Resources{ - std::make_shared(), Resolver}; - }), - CompileLayer(ObjectLayer, SimpleCompiler(*TM)) { + static std::unique_ptr createMemMgr() { + return llvm::make_unique(); + } + + SimpleJIT(std::unique_ptr TM, DataLayout DL, + DynamicLibrarySearchGenerator ProcessSymbolsGenerator) + : TM(std::move(TM)), DL(std::move(DL)) { llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr); + ES.getMainJITDylib().setGenerator(std::move(ProcessSymbolsGenerator)); } - const TargetMachine &getTargetMachine() const { return *TM; } +public: + static Expected> Create() { + auto JTMB = JITTargetMachineBuilder::detectHost(); + if (!JTMB) + return JTMB.takeError(); + + auto TM = JTMB->createTargetMachine(); + if (!TM) + return TM.takeError(); + + auto DL = (*TM)->createDataLayout(); - VModuleKey addModule(std::unique_ptr M) { - // Add the module to the JIT with a new VModuleKey. - auto K = ES.allocateVModule(); - cantFail(CompileLayer.addModule(K, std::move(M))); - return K; + auto ProcessSymbolsGenerator = + DynamicLibrarySearchGenerator::GetForCurrentProcess( + DL.getGlobalPrefix()); + + if (!ProcessSymbolsGenerator) + return ProcessSymbolsGenerator.takeError(); + + return std::unique_ptr(new SimpleJIT( + std::move(*TM), std::move(DL), std::move(*ProcessSymbolsGenerator))); } - JITSymbol findSymbol(const StringRef &Name) { - std::string MangledName; - raw_string_ostream MangledNameStream(MangledName); - Mangler::getNameWithPrefix(MangledNameStream, Name, DL); - return CompileLayer.findSymbol(MangledNameStream.str(), true); + const TargetMachine &getTargetMachine() const { return *TM; } + + Error addModule(ThreadSafeModule M) { + return CompileLayer.add(ES.getMainJITDylib(), std::move(M)); } - JITTargetAddress getSymbolAddress(const StringRef &Name) { - return cantFail(findSymbol(Name).getAddress()); + Expected findSymbol(const StringRef &Name) { + return ES.lookup({&ES.getMainJITDylib()}, Mangle(Name)); } - void removeModule(VModuleKey K) { - cantFail(CompileLayer.removeModule(K)); + Expected getSymbolAddress(const StringRef &Name) { + auto Sym = findSymbol(Name); + if (!Sym) + return Sym.takeError(); + return Sym->getAddress(); } }; } // end namespace orc } // end namespace llvm +llvm::ExitOnError ExitOnErr; + int main(int argc, const char **argv) { // This just needs to be some symbol in the binary; C++ doesn't // allow taking the address of ::main however. @@ -130,6 +135,8 @@ int main(int argc, const char **argv) { T.setObjectFormat(llvm::Triple::ELF); #endif + ExitOnErr.setBanner("clang interpreter"); + Driver TheDriver(Path, T.str(), Diags); TheDriver.setTitle("clang interpreter"); TheDriver.setCheckInputsExist(false); @@ -204,14 +211,16 @@ int main(int argc, const char **argv) { llvm::InitializeNativeTargetAsmPrinter(); int Res = 255; + std::unique_ptr Ctx(Act->takeLLVMContext()); std::unique_ptr Module = Act->takeModule(); if (Module) { - llvm::orc::SimpleJIT J; - auto H = J.addModule(std::move(Module)); - auto Main = (int(*)(...))J.getSymbolAddress("main"); + auto J = ExitOnErr(llvm::orc::SimpleJIT::Create()); + + ExitOnErr(J->addModule( + llvm::orc::ThreadSafeModule(std::move(Module), std::move(Ctx)))); + auto Main = (int (*)(...))ExitOnErr(J->getSymbolAddress("main")); Res = Main(); - J.removeModule(H); } // Shutdown.