18
18
#include " llvm/ADT/SmallString.h"
19
19
#include " llvm/ExecutionEngine/ExecutionEngine.h"
20
20
#include " llvm/ExecutionEngine/Orc/CompileUtils.h"
21
+ #include " llvm/ExecutionEngine/Orc/ExecutionUtils.h"
21
22
#include " llvm/ExecutionEngine/Orc/IRCompileLayer.h"
22
23
#include " llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
23
24
#include " llvm/ExecutionEngine/SectionMemoryManager.h"
@@ -50,65 +51,69 @@ namespace orc {
50
51
class SimpleJIT {
51
52
private:
52
53
ExecutionSession ES;
53
- std::shared_ptr<SymbolResolver> Resolver;
54
54
std::unique_ptr<TargetMachine> TM;
55
55
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)};
58
59
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)) {
81
67
llvm::sys::DynamicLibrary::LoadLibraryPermanently (nullptr );
68
+ ES.getMainJITDylib ().setGenerator (std::move (ProcessSymbolsGenerator));
82
69
}
83
70
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 ();
85
82
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)));
91
92
}
92
93
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));
98
98
}
99
99
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 ));
102
102
}
103
103
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 ();
106
109
}
107
110
};
108
111
109
112
} // end namespace orc
110
113
} // end namespace llvm
111
114
115
+ llvm::ExitOnError ExitOnErr;
116
+
112
117
int main (int argc, const char **argv) {
113
118
// This just needs to be some symbol in the binary; C++ doesn't
114
119
// allow taking the address of ::main however.
@@ -130,6 +135,8 @@ int main(int argc, const char **argv) {
130
135
T.setObjectFormat (llvm::Triple::ELF);
131
136
#endif
132
137
138
+ ExitOnErr.setBanner (" clang interpreter" );
139
+
133
140
Driver TheDriver (Path, T.str (), Diags);
134
141
TheDriver.setTitle (" clang interpreter" );
135
142
TheDriver.setCheckInputsExist (false );
@@ -204,14 +211,16 @@ int main(int argc, const char **argv) {
204
211
llvm::InitializeNativeTargetAsmPrinter ();
205
212
206
213
int Res = 255 ;
214
+ std::unique_ptr<llvm::LLVMContext> Ctx (Act->takeLLVMContext ());
207
215
std::unique_ptr<llvm::Module> Module = Act->takeModule ();
208
216
209
217
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" ));
213
223
Res = Main ();
214
- J.removeModule (H);
215
224
}
216
225
217
226
// Shutdown.
0 commit comments