Skip to content

Commit 1931d3c

Browse files
committed
Merging r366511:
------------------------------------------------------------------------ r366511 | lhames | 2019-07-19 00:47:18 +0200 (Fri, 19 Jul 2019) | 3 lines Update the SimpleJIT class in the clang-interpreter example to use ORCv2. This will remove the ORCv1 deprecation warnings. ------------------------------------------------------------------------ llvm-svn: 366556
1 parent b51b64e commit 1931d3c

File tree

1 file changed

+53
-44
lines changed
  • clang/examples/clang-interpreter

1 file changed

+53
-44
lines changed

clang/examples/clang-interpreter/main.cpp

+53-44
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ADT/SmallString.h"
1919
#include "llvm/ExecutionEngine/ExecutionEngine.h"
2020
#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
21+
#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
2122
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
2223
#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
2324
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
@@ -50,65 +51,69 @@ namespace orc {
5051
class SimpleJIT {
5152
private:
5253
ExecutionSession ES;
53-
std::shared_ptr<SymbolResolver> Resolver;
5454
std::unique_ptr<TargetMachine> TM;
5555
const DataLayout DL;
56-
LegacyRTDyldObjectLinkingLayer ObjectLayer;
57-
LegacyIRCompileLayer<decltype(ObjectLayer), SimpleCompiler> CompileLayer;
56+
MangleAndInterner Mangle{ES, DL};
57+
RTDyldObjectLinkingLayer ObjectLayer{ES, createMemMgr};
58+
IRCompileLayer CompileLayer{ES, ObjectLayer, SimpleCompiler(*TM)};
5859

59-
public:
60-
SimpleJIT()
61-
: Resolver(createLegacyLookupResolver(
62-
ES,
63-
[this](const std::string &Name) -> JITSymbol {
64-
if (auto Sym = CompileLayer.findSymbol(Name, false))
65-
return Sym;
66-
else if (auto Err = Sym.takeError())
67-
return std::move(Err);
68-
if (auto SymAddr =
69-
RTDyldMemoryManager::getSymbolAddressInProcess(Name))
70-
return JITSymbol(SymAddr, JITSymbolFlags::Exported);
71-
return nullptr;
72-
},
73-
[](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); })),
74-
TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()),
75-
ObjectLayer(ES,
76-
[this](VModuleKey) {
77-
return LegacyRTDyldObjectLinkingLayer::Resources{
78-
std::make_shared<SectionMemoryManager>(), Resolver};
79-
}),
80-
CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {
60+
static std::unique_ptr<SectionMemoryManager> createMemMgr() {
61+
return llvm::make_unique<SectionMemoryManager>();
62+
}
63+
64+
SimpleJIT(std::unique_ptr<TargetMachine> TM, DataLayout DL,
65+
DynamicLibrarySearchGenerator ProcessSymbolsGenerator)
66+
: TM(std::move(TM)), DL(std::move(DL)) {
8167
llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
68+
ES.getMainJITDylib().setGenerator(std::move(ProcessSymbolsGenerator));
8269
}
8370

84-
const TargetMachine &getTargetMachine() const { return *TM; }
71+
public:
72+
static Expected<std::unique_ptr<SimpleJIT>> Create() {
73+
auto JTMB = JITTargetMachineBuilder::detectHost();
74+
if (!JTMB)
75+
return JTMB.takeError();
76+
77+
auto TM = JTMB->createTargetMachine();
78+
if (!TM)
79+
return TM.takeError();
80+
81+
auto DL = (*TM)->createDataLayout();
8582

86-
VModuleKey addModule(std::unique_ptr<Module> M) {
87-
// Add the module to the JIT with a new VModuleKey.
88-
auto K = ES.allocateVModule();
89-
cantFail(CompileLayer.addModule(K, std::move(M)));
90-
return K;
83+
auto ProcessSymbolsGenerator =
84+
DynamicLibrarySearchGenerator::GetForCurrentProcess(
85+
DL.getGlobalPrefix());
86+
87+
if (!ProcessSymbolsGenerator)
88+
return ProcessSymbolsGenerator.takeError();
89+
90+
return std::unique_ptr<SimpleJIT>(new SimpleJIT(
91+
std::move(*TM), std::move(DL), std::move(*ProcessSymbolsGenerator)));
9192
}
9293

93-
JITSymbol findSymbol(const StringRef &Name) {
94-
std::string MangledName;
95-
raw_string_ostream MangledNameStream(MangledName);
96-
Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
97-
return CompileLayer.findSymbol(MangledNameStream.str(), true);
94+
const TargetMachine &getTargetMachine() const { return *TM; }
95+
96+
Error addModule(ThreadSafeModule M) {
97+
return CompileLayer.add(ES.getMainJITDylib(), std::move(M));
9898
}
9999

100-
JITTargetAddress getSymbolAddress(const StringRef &Name) {
101-
return cantFail(findSymbol(Name).getAddress());
100+
Expected<JITEvaluatedSymbol> findSymbol(const StringRef &Name) {
101+
return ES.lookup({&ES.getMainJITDylib()}, Mangle(Name));
102102
}
103103

104-
void removeModule(VModuleKey K) {
105-
cantFail(CompileLayer.removeModule(K));
104+
Expected<JITTargetAddress> getSymbolAddress(const StringRef &Name) {
105+
auto Sym = findSymbol(Name);
106+
if (!Sym)
107+
return Sym.takeError();
108+
return Sym->getAddress();
106109
}
107110
};
108111

109112
} // end namespace orc
110113
} // end namespace llvm
111114

115+
llvm::ExitOnError ExitOnErr;
116+
112117
int main(int argc, const char **argv) {
113118
// This just needs to be some symbol in the binary; C++ doesn't
114119
// allow taking the address of ::main however.
@@ -130,6 +135,8 @@ int main(int argc, const char **argv) {
130135
T.setObjectFormat(llvm::Triple::ELF);
131136
#endif
132137

138+
ExitOnErr.setBanner("clang interpreter");
139+
133140
Driver TheDriver(Path, T.str(), Diags);
134141
TheDriver.setTitle("clang interpreter");
135142
TheDriver.setCheckInputsExist(false);
@@ -204,14 +211,16 @@ int main(int argc, const char **argv) {
204211
llvm::InitializeNativeTargetAsmPrinter();
205212

206213
int Res = 255;
214+
std::unique_ptr<llvm::LLVMContext> Ctx(Act->takeLLVMContext());
207215
std::unique_ptr<llvm::Module> Module = Act->takeModule();
208216

209217
if (Module) {
210-
llvm::orc::SimpleJIT J;
211-
auto H = J.addModule(std::move(Module));
212-
auto Main = (int(*)(...))J.getSymbolAddress("main");
218+
auto J = ExitOnErr(llvm::orc::SimpleJIT::Create());
219+
220+
ExitOnErr(J->addModule(
221+
llvm::orc::ThreadSafeModule(std::move(Module), std::move(Ctx))));
222+
auto Main = (int (*)(...))ExitOnErr(J->getSymbolAddress("main"));
213223
Res = Main();
214-
J.removeModule(H);
215224
}
216225

217226
// Shutdown.

0 commit comments

Comments
 (0)