Re: r366511 - Update the SimpleJIT class in the clang-interpreter example to use ORCv2.
Merged to 9.0 in r366556. On Fri, Jul 19, 2019 at 12:46 AM Lang Hames via cfe-commits wrote: > > Author: lhames > Date: Thu Jul 18 15:47:18 2019 > New Revision: 366511 > > URL: http://llvm.org/viewvc/llvm-project?rev=366511=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=366510=366511=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 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 ) -> 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 () 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(); > + > +auto ProcessSymbolsGenerator = > +DynamicLibrarySearchGenerator::GetForCurrentProcess( > +DL.getGlobalPrefix()); > + > +if (!ProcessSymbolsGenerator) > + return ProcessSymbolsGenerator.takeError(); > > - 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; > +return std::unique_ptr(new SimpleJIT( > +std::move(*TM), std::move(DL), std::move(*ProcessSymbolsGenerator))); >} > > - JITSymbol findSymbol(const StringRef ) { > -std::string MangledName; > -raw_string_ostream MangledNameStream(MangledName); > -Mangler::getNameWithPrefix(MangledNameStream, Name, DL); > -return CompileLayer.findSymbol(MangledNameStream.str(), true); > + const TargetMachine () const { return *TM; } > + > + Error addModule(ThreadSafeModule M) { > +return CompileLayer.add(ES.getMainJITDylib(), std::move(M)); >} > > - JITTargetAddress getSymbolAddress(const StringRef ) { > -return cantFail(findSymbol(Name).getAddress()); > + Expected findSymbol(const StringRef ) { > +return ES.lookup({()}, Mangle(Name)); >} > > - void removeModule(VModuleKey K) { > -cantFail(CompileLayer.removeModule(K)); > + Expected getSymbolAddress(const StringRef ) { > +auto Sym = findSymbol(Name); > +if (!Sym) > + return Sym.takeError(); > +return Sym->getAddress(); >
r366511 - Update the SimpleJIT class in the clang-interpreter example to use ORCv2.
Author: lhames Date: Thu Jul 18 15:47:18 2019 New Revision: 366511 URL: http://llvm.org/viewvc/llvm-project?rev=366511=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=366510=366511=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 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 ) -> 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 () 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(); + +auto ProcessSymbolsGenerator = +DynamicLibrarySearchGenerator::GetForCurrentProcess( +DL.getGlobalPrefix()); + +if (!ProcessSymbolsGenerator) + return ProcessSymbolsGenerator.takeError(); - 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; +return std::unique_ptr(new SimpleJIT( +std::move(*TM), std::move(DL), std::move(*ProcessSymbolsGenerator))); } - JITSymbol findSymbol(const StringRef ) { -std::string MangledName; -raw_string_ostream MangledNameStream(MangledName); -Mangler::getNameWithPrefix(MangledNameStream, Name, DL); -return CompileLayer.findSymbol(MangledNameStream.str(), true); + const TargetMachine () const { return *TM; } + + Error addModule(ThreadSafeModule M) { +return CompileLayer.add(ES.getMainJITDylib(), std::move(M)); } - JITTargetAddress getSymbolAddress(const StringRef ) { -return cantFail(findSymbol(Name).getAddress()); + Expected findSymbol(const StringRef ) { +return ES.lookup({()}, Mangle(Name)); } - void removeModule(VModuleKey K) { -cantFail(CompileLayer.removeModule(K)); + Expected getSymbolAddress(const StringRef ) { +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) {