1 | //===- KaleidoscopeJIT.h - A simple JIT for Kaleidoscope --------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // Contains a simple JIT definition for use in the kaleidoscope tutorials. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H |
14 | #define LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H |
15 | |
16 | #include "llvm/ADT/StringRef.h" |
17 | #include "llvm/ExecutionEngine/Orc/CompileUtils.h" |
18 | #include "llvm/ExecutionEngine/Orc/Core.h" |
19 | #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" |
20 | #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h" |
21 | #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" |
22 | #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h" |
23 | #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" |
24 | #include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h" |
25 | #include "llvm/ExecutionEngine/SectionMemoryManager.h" |
26 | #include "llvm/IR/DataLayout.h" |
27 | #include "llvm/IR/LLVMContext.h" |
28 | #include <memory> |
29 | |
30 | namespace llvm { |
31 | namespace orc { |
32 | |
33 | class KaleidoscopeJIT { |
34 | private: |
35 | std::unique_ptr<ExecutionSession> ES; |
36 | |
37 | DataLayout DL; |
38 | MangleAndInterner Mangle; |
39 | |
40 | RTDyldObjectLinkingLayer ObjectLayer; |
41 | IRCompileLayer CompileLayer; |
42 | |
43 | JITDylib &MainJD; |
44 | |
45 | public: |
46 | KaleidoscopeJIT(std::unique_ptr<ExecutionSession> ES, |
47 | JITTargetMachineBuilder JTMB, DataLayout DL) |
48 | : ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL), |
49 | ObjectLayer(*this->ES, |
50 | []() { return std::make_unique<SectionMemoryManager>(); }), |
51 | CompileLayer(*this->ES, ObjectLayer, |
52 | std::make_unique<ConcurrentIRCompiler>(args: std::move(JTMB))), |
53 | MainJD(this->ES->createBareJITDylib(Name: "<main>" )) { |
54 | MainJD.addGenerator( |
55 | DefGenerator: cantFail(ValOrErr: DynamicLibrarySearchGenerator::GetForCurrentProcess( |
56 | GlobalPrefix: DL.getGlobalPrefix()))); |
57 | } |
58 | |
59 | ~KaleidoscopeJIT() { |
60 | if (auto Err = ES->endSession()) |
61 | ES->reportError(Err: std::move(Err)); |
62 | } |
63 | |
64 | static Expected<std::unique_ptr<KaleidoscopeJIT>> Create() { |
65 | auto EPC = SelfExecutorProcessControl::Create(); |
66 | if (!EPC) |
67 | return EPC.takeError(); |
68 | |
69 | auto ES = std::make_unique<ExecutionSession>(args: std::move(*EPC)); |
70 | |
71 | JITTargetMachineBuilder JTMB( |
72 | ES->getExecutorProcessControl().getTargetTriple()); |
73 | |
74 | auto DL = JTMB.getDefaultDataLayoutForTarget(); |
75 | if (!DL) |
76 | return DL.takeError(); |
77 | |
78 | return std::make_unique<KaleidoscopeJIT>(args: std::move(ES), args: std::move(JTMB), |
79 | args: std::move(*DL)); |
80 | } |
81 | |
82 | const DataLayout &getDataLayout() const { return DL; } |
83 | |
84 | JITDylib &getMainJITDylib() { return MainJD; } |
85 | |
86 | Error addModule(ThreadSafeModule TSM, ResourceTrackerSP RT = nullptr) { |
87 | if (!RT) |
88 | RT = MainJD.getDefaultResourceTracker(); |
89 | return CompileLayer.add(RT, TSM: std::move(TSM)); |
90 | } |
91 | |
92 | Expected<ExecutorSymbolDef> lookup(StringRef Name) { |
93 | return ES->lookup(SearchOrder: {&MainJD}, Symbol: Mangle(Name.str())); |
94 | } |
95 | }; |
96 | |
97 | } // end namespace orc |
98 | } // end namespace llvm |
99 | |
100 | #endif // LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H |
101 | |