Skip to content
This repository was archived by the owner on Jul 3, 2021. It is now read-only.

Commit 96f4c8e

Browse files
Break free from LLJIT
1 parent bf72028 commit 96f4c8e

File tree

2 files changed

+88
-23
lines changed

2 files changed

+88
-23
lines changed

JitFromScratch.cpp

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,39 @@
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

813
using namespace llvm;
914
using 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+
4283
Error 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

4895
Expected<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

JitFromScratch.h

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
#pragma once
22

33
#include <llvm/ADT/StringRef.h>
4-
#include <llvm/ADT/Triple.h>
54
#include <llvm/ExecutionEngine/JITSymbol.h>
6-
#include <llvm/ExecutionEngine/Orc/LLJIT.h>
5+
#include <llvm/ExecutionEngine/Orc/Core.h>
6+
#include <llvm/ExecutionEngine/Orc/IRCompileLayer.h>
7+
#include <llvm/ExecutionEngine/Orc/IRTransformLayer.h>
8+
#include <llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h>
79
#include <llvm/IR/DataLayout.h>
810
#include <llvm/IR/LLVMContext.h>
911
#include <llvm/IR/Module.h>
1012
#include <llvm/Support/Error.h>
13+
#include <llvm/Target/TargetMachine.h>
1114

1215
#include <functional>
1316
#include <memory>
17+
#include <string>
1418

1519
class JitFromScratch {
1620
public:
@@ -23,11 +27,11 @@ class JitFromScratch {
2327
JitFromScratch &operator=(JitFromScratch &&) = delete;
2428

2529
llvm::DataLayout getDataLayout() const {
26-
return LLJIT->getDataLayout();
30+
return TM->createDataLayout();
2731
}
2832

2933
const llvm::Triple &getTargetTriple() const {
30-
return TT;
34+
return TM->getTargetTriple();
3135
}
3236

3337
llvm::Error submitModule(std::unique_ptr<llvm::Module> M,
@@ -43,11 +47,22 @@ class JitFromScratch {
4347
}
4448

4549
private:
46-
std::unique_ptr<llvm::orc::LLJIT> LLJIT;
47-
llvm::Triple TT;
50+
std::unique_ptr<llvm::orc::ExecutionSession> ES;
51+
std::unique_ptr<llvm::TargetMachine> TM;
4852

49-
llvm::orc::JITDylib::GeneratorFunction
50-
createHostProcessResolver(llvm::DataLayout DL);
53+
llvm::orc::RTDyldObjectLinkingLayer ObjLinkingLayer;
54+
llvm::orc::IRCompileLayer CompileLayer;
55+
56+
llvm::orc::JITDylib::GeneratorFunction createHostProcessResolver();
57+
58+
std::unique_ptr<llvm::TargetMachine>
59+
createTargetMachine(llvm::ExitOnError ExitOnErr);
60+
61+
llvm::orc::RTDyldObjectLinkingLayer::GetMemoryManagerFunction
62+
createMemoryManagerFtor();
63+
64+
std::string mangle(llvm::StringRef UnmangledName);
65+
llvm::Error applyDataLayout(llvm::Module &M);
5166

5267
llvm::Expected<llvm::JITTargetAddress> getFunctionAddr(llvm::StringRef Name);
5368
};

0 commit comments

Comments
 (0)