11#include " JitFromScratch.h"
22
3+ #include < llvm/ExecutionEngine/Orc/CompileUtils.h>
4+ #include < llvm/ExecutionEngine/Orc/ExecutionUtils.h>
35#include < llvm/ExecutionEngine/Orc/ThreadSafeModule.h>
6+ #include < llvm/ExecutionEngine/SectionMemoryManager.h>
7+ #include < llvm/IR/Mangler.h>
48#include < llvm/Support/Debug.h>
9+ #include < llvm/Support/raw_ostream.h>
510
611#define DEBUG_TYPE " jitfromscratch"
712
813using namespace llvm ;
914using namespace llvm ::orc;
1015
11- JitFromScratch::JitFromScratch (ExitOnError ExitOnErr) {
12- LLJITBuilder Builder;
13- ExitOnErr (Builder.prepareForConstruction ());
14- TT = Builder.JTMB ->getTargetTriple ();
15- LLJIT = ExitOnErr (Builder.create ());
16-
17- if (auto R = createHostProcessResolver (LLJIT->getDataLayout ()))
18- LLJIT->getMainJITDylib ().setGenerator (std::move (R));
16+ JitFromScratch::JitFromScratch (ExitOnError ExitOnErr)
17+ : ES(std::make_unique<ExecutionSession>()),
18+ TM(createTargetMachine(ExitOnErr)),
19+ ObjLinkingLayer(*ES, createMemoryManagerFtor()),
20+ CompileLayer(*ES, ObjLinkingLayer, SimpleCompiler(*TM)) {
21+ if (auto R = createHostProcessResolver ())
22+ ES->getMainJITDylib ().setGenerator (std::move (R));
1923}
2024
21- JITDylib::GeneratorFunction
22- JitFromScratch::createHostProcessResolver (DataLayout DL) {
23- char Prefix = DL.getGlobalPrefix ();
25+ JITDylib::GeneratorFunction JitFromScratch::createHostProcessResolver () {
26+ char Prefix = TM->createDataLayout ().getGlobalPrefix ();
2427 Expected<JITDylib::GeneratorFunction> R =
2528 DynamicLibrarySearchGenerator::GetForCurrentProcess (Prefix);
2629
2730 if (!R) {
28- LLJIT-> getExecutionSession (). reportError (R.takeError ());
31+ ES-> reportError (R.takeError ());
2932 return nullptr ;
3033 }
3134
3235 if (!*R) {
33- LLJIT-> getExecutionSession (). reportError (createStringError (
36+ ES-> reportError (createStringError (
3437 inconvertibleErrorCode (),
3538 " Generator function for host process symbols must not be null" ));
3639 return nullptr ;
@@ -39,14 +42,61 @@ JitFromScratch::createHostProcessResolver(DataLayout DL) {
3942 return *R;
4043}
4144
45+ std::unique_ptr<TargetMachine>
46+ JitFromScratch::createTargetMachine (ExitOnError ExitOnErr) {
47+ auto JTMB = ExitOnErr (JITTargetMachineBuilder::detectHost ());
48+ return ExitOnErr (JTMB.createTargetMachine ());
49+ }
50+
51+ using GetMemoryManagerFunction =
52+ RTDyldObjectLinkingLayer::GetMemoryManagerFunction;
53+
54+ GetMemoryManagerFunction JitFromScratch::createMemoryManagerFtor () {
55+ return []() -> GetMemoryManagerFunction::result_type {
56+ return std::make_unique<SectionMemoryManager>();
57+ };
58+ }
59+
60+ std::string JitFromScratch::mangle (StringRef UnmangledName) {
61+ std::string MangledName;
62+ {
63+ DataLayout DL = TM->createDataLayout ();
64+ raw_string_ostream MangledNameStream (MangledName);
65+ Mangler::getNameWithPrefix (MangledNameStream, UnmangledName, DL);
66+ }
67+ return MangledName;
68+ }
69+
70+ Error JitFromScratch::applyDataLayout (Module &M) {
71+ DataLayout DL = TM->createDataLayout ();
72+ if (M.getDataLayout ().isDefault ())
73+ M.setDataLayout (DL);
74+
75+ if (M.getDataLayout () != DL)
76+ return make_error<StringError>(
77+ " Added modules have incompatible data layouts" ,
78+ inconvertibleErrorCode ());
79+
80+ return Error::success ();
81+ }
82+
4283Error JitFromScratch::submitModule (std::unique_ptr<Module> M,
4384 std::unique_ptr<LLVMContext> C) {
4485 LLVM_DEBUG (dbgs () << " Submit IR module:\n\n " << *M << " \n\n " );
45- return LLJIT->addIRModule (ThreadSafeModule (std::move (M), std::move (C)));
86+
87+ if (auto Err = applyDataLayout (*M))
88+ return Err;
89+
90+ return CompileLayer.add (ES->getMainJITDylib (),
91+ ThreadSafeModule (std::move (M), std::move (C)),
92+ ES->allocateVModule ());
4693}
4794
4895Expected<JITTargetAddress> JitFromScratch::getFunctionAddr (StringRef Name) {
49- Expected<JITEvaluatedSymbol> S = LLJIT->lookup (Name);
96+ SymbolStringPtr NamePtr = ES->intern (mangle (Name));
97+ JITDylibSearchList JDs{{&ES->getMainJITDylib (), true }};
98+
99+ Expected<JITEvaluatedSymbol> S = ES->lookup (JDs, NamePtr);
50100 if (!S)
51101 return S.takeError ();
52102
0 commit comments