summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2019-07-18 22:47:18 +0000
committerLang Hames <lhames@gmail.com>2019-07-18 22:47:18 +0000
commitffd82a053c3b9dcfc4789ba8c9b1f0230359cb53 (patch)
tree070089923f8459a162ce9c9be68d1f3a58e5ec03 /examples
parent7f4b5247d9e4ea7cd86a0f5d411ad36a977482bb (diff)
downloadclang-ffd82a053c3b9dcfc4789ba8c9b1f0230359cb53.tar.gz
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
Diffstat (limited to 'examples')
-rw-r--r--examples/clang-interpreter/main.cpp97
1 files changed, 53 insertions, 44 deletions
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<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();
- 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;
+ auto ProcessSymbolsGenerator =
+ DynamicLibrarySearchGenerator::GetForCurrentProcess(
+ DL.getGlobalPrefix());
+
+ if (!ProcessSymbolsGenerator)
+ return ProcessSymbolsGenerator.takeError();
+
+ 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.