Merged to 9.0 in r366556.
On Fri, Jul 19, 2019 at 12:46 AM Lang Hames via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: lhames > Date: Thu Jul 18 15:47:18 2019 > New Revision: 366511 > > URL: http://llvm.org/viewvc/llvm-project?rev=366511&view=rev > Log: > Update the SimpleJIT class in the clang-interpreter example to use ORCv2. > > This will remove the ORCv1 deprecation warnings. > > Modified: > cfe/trunk/examples/clang-interpreter/main.cpp > > Modified: cfe/trunk/examples/clang-interpreter/main.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/main.cpp?rev=366511&r1=366510&r2=366511&view=diff > ============================================================================== > --- cfe/trunk/examples/clang-interpreter/main.cpp (original) > +++ cfe/trunk/examples/clang-interpreter/main.cpp Thu Jul 18 15:47:18 2019 > @@ -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<SymbolResolver> Resolver; > std::unique_ptr<TargetMachine> TM; > const DataLayout DL; > - LegacyRTDyldObjectLinkingLayer ObjectLayer; > - LegacyIRCompileLayer<decltype(ObjectLayer), SimpleCompiler> 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<SectionMemoryManager>(), > Resolver}; > - }), > - CompileLayer(ObjectLayer, SimpleCompiler(*TM)) { > + static std::unique_ptr<SectionMemoryManager> createMemMgr() { > + return llvm::make_unique<SectionMemoryManager>(); > + } > + > + SimpleJIT(std::unique_ptr<TargetMachine> 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<std::unique_ptr<SimpleJIT>> Create() { > + auto JTMB = JITTargetMachineBuilder::detectHost(); > + if (!JTMB) > + return JTMB.takeError(); > + > + auto TM = JTMB->createTargetMachine(); > + if (!TM) > + return TM.takeError(); > + > + auto DL = (*TM)->createDataLayout(); > + > + auto ProcessSymbolsGenerator = > + DynamicLibrarySearchGenerator::GetForCurrentProcess( > + DL.getGlobalPrefix()); > + > + if (!ProcessSymbolsGenerator) > + return ProcessSymbolsGenerator.takeError(); > > - VModuleKey addModule(std::unique_ptr<Module> M) { > - // Add the module to the JIT with a new VModuleKey. > - auto K = ES.allocateVModule(); > - cantFail(CompileLayer.addModule(K, std::move(M))); > - return K; > + return std::unique_ptr<SimpleJIT>(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<JITEvaluatedSymbol> findSymbol(const StringRef &Name) { > + return ES.lookup({&ES.getMainJITDylib()}, Mangle(Name)); > } > > - void removeModule(VModuleKey K) { > - cantFail(CompileLayer.removeModule(K)); > + Expected<JITTargetAddress> 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<llvm::LLVMContext> Ctx(Act->takeLLVMContext()); > std::unique_ptr<llvm::Module> 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. > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits