22
22
#include " llvm/Config/llvm-config.h"
23
23
#include " llvm/ExecutionEngine/GenericValue.h"
24
24
#include " llvm/ExecutionEngine/Interpreter.h"
25
+ #include " llvm/ExecutionEngine/JITSymbol.h"
25
26
#include " llvm/ExecutionEngine/JITEventListener.h"
26
27
#include " llvm/ExecutionEngine/MCJIT.h"
27
28
#include " llvm/ExecutionEngine/ObjectCache.h"
32
33
#include " llvm/ExecutionEngine/Orc/MachOPlatform.h"
33
34
#include " llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h"
34
35
#include " llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
36
+ #include " llvm/ExecutionEngine/Orc/SymbolStringPool.h"
37
+ #include " llvm/ExecutionEngine/Orc/TPCEHFrameRegistrar.h"
38
+ #include " llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"
35
39
#include " llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h"
36
40
#include " llvm/ExecutionEngine/SectionMemoryManager.h"
37
41
#include " llvm/IR/IRBuilder.h"
@@ -78,6 +82,7 @@ static codegen::RegisterCodeGenFlags CGF;
78
82
namespace {
79
83
80
84
enum class JITKind { MCJIT, OrcLazy };
85
+ enum class JITLinkerKind { Default, RuntimeDyld, JITLink };
81
86
82
87
cl::opt<std::string>
83
88
InputFile (cl::desc(" <input bitcode>" ), cl::Positional, cl::init(" -" ));
@@ -96,6 +101,16 @@ namespace {
96
101
clEnumValN(JITKind::OrcLazy, " orc-lazy" ,
97
102
" Orc-based lazy JIT." )));
98
103
104
+ cl::opt<JITLinkerKind>
105
+ JITLinker (" jit-linker" , cl::desc(" Choose the dynamic linker/loader." ),
106
+ cl::init(JITLinkerKind::Default),
107
+ cl::values(clEnumValN(JITLinkerKind::Default, " default" ,
108
+ " Default for platform and JIT-kind" ),
109
+ clEnumValN(JITLinkerKind::RuntimeDyld, " rtdyld" ,
110
+ " RuntimeDyld" ),
111
+ clEnumValN(JITLinkerKind::JITLink, " jitlink" ,
112
+ " Orc-specific linker" )));
113
+
99
114
cl::opt<unsigned >
100
115
LazyJITCompileThreads (" compile-threads" ,
101
116
cl::desc (" Choose the number of compile threads "
@@ -260,6 +275,11 @@ namespace {
260
275
ExitOnError ExitOnErr;
261
276
}
262
277
278
+ LLVM_ATTRIBUTE_USED void linkComponents () {
279
+ errs () << (void *)&llvm_orc_registerEHFrameSectionWrapper
280
+ << (void *)&llvm_orc_deregisterEHFrameSectionWrapper;
281
+ }
282
+
263
283
// ===----------------------------------------------------------------------===//
264
284
// Object cache
265
285
//
@@ -893,6 +913,20 @@ int runOrcLazyJIT(const char *ProgName) {
893
913
}
894
914
}
895
915
916
+ std::unique_ptr<orc::TargetProcessControl> TPC = nullptr ;
917
+ if (JITLinker == JITLinkerKind::JITLink) {
918
+ TPC = ExitOnErr (orc::SelfTargetProcessControl::Create (
919
+ std::make_shared<orc::SymbolStringPool>()));
920
+
921
+ Builder.setObjectLinkingLayerCreator ([&TPC](orc::ExecutionSession &ES,
922
+ const Triple &) {
923
+ auto L = std::make_unique<orc::ObjectLinkingLayer>(ES, TPC->getMemMgr ());
924
+ L->addPlugin (std::make_unique<orc::EHFrameRegistrationPlugin>(
925
+ ES, ExitOnErr (orc::TPCEHFrameRegistrar::Create (*TPC))));
926
+ return L;
927
+ });
928
+ }
929
+
896
930
auto J = ExitOnErr (Builder.create ());
897
931
898
932
auto *ObjLayer = &J->getObjLinkingLayer ();
@@ -997,13 +1031,19 @@ int runOrcLazyJIT(const char *ProgName) {
997
1031
AltEntryThreads.push_back (std::thread ([EntryPoint]() { EntryPoint (); }));
998
1032
}
999
1033
1000
- // Run main.
1001
- auto MainSym = ExitOnErr (J->lookup (" main" ));
1034
+ // Resolve and run the main function.
1035
+ JITEvaluatedSymbol MainSym = ExitOnErr (J->lookup (" main" ));
1036
+ int Result;
1002
1037
1003
- typedef int (*MainFnPtr)(int , char *[]);
1004
- auto Result = orc::runAsMain (
1005
- jitTargetAddressToFunction<MainFnPtr>(MainSym.getAddress ()), InputArgv,
1006
- StringRef (InputFile));
1038
+ if (TPC) {
1039
+ // TargetProcessControl-based execution with JITLink.
1040
+ Result = ExitOnErr (TPC->runAsMain (MainSym.getAddress (), InputArgv));
1041
+ } else {
1042
+ // Manual in-process execution with RuntimeDyld.
1043
+ using MainFnTy = int (int , char *[]);
1044
+ auto MainFn = jitTargetAddressToFunction<MainFnTy *>(MainSym.getAddress ());
1045
+ Result = orc::runAsMain (MainFn, InputArgv, StringRef (InputFile));
1046
+ }
1007
1047
1008
1048
// Wait for -entry-point threads.
1009
1049
for (auto &AltEntryThread : AltEntryThreads)
0 commit comments