QCOR
jit_utils.hpp
1 #pragma once
2 
3 #include "llvm/ADT/StringRef.h"
4 #include "llvm/ExecutionEngine/JITSymbol.h"
5 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
6 #include "llvm/ExecutionEngine/Orc/Core.h"
7 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
8 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
9 #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
10 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
11 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
12 #include "llvm/IR/DataLayout.h"
13 #include "llvm/IR/LLVMContext.h"
14 #include "llvm/Support/DynamicLibrary.h"
15 #include "llvm/Support/Error.h"
16 #include "llvm/Support/raw_ostream.h"
17 #include <memory>
18 
19 using namespace llvm;
20 using namespace llvm::orc;
21 
22 namespace qcor {
23 
24 class XACCJIT {
25 private:
26  ExecutionSession ES;
27  RTDyldObjectLinkingLayer ObjectLayer;
28  IRCompileLayer CompileLayer;
29 
30  DataLayout DL;
31  MangleAndInterner Mangle;
32  ThreadSafeContext Ctx;
33 
34  JITDylib &MainJD;
35 
36 public:
37  XACCJIT(JITTargetMachineBuilder JTMB, DataLayout DL)
38  : ObjectLayer(ES,
39  []() { return std::make_unique<SectionMemoryManager>(); }),
40  CompileLayer(ES, ObjectLayer, ConcurrentIRCompiler(std::move(JTMB))),
41  DL(std::move(DL)), Mangle(ES, this->DL),
42  Ctx(std::make_unique<LLVMContext>()),
43  MainJD(ES.createJITDylib("<main>")) {
44  MainJD.addGenerator(
45  cantFail(DynamicLibrarySearchGenerator::GetForCurrentProcess(
46  DL.getGlobalPrefix())));
47  llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
48  }
49 
50  static Expected<std::unique_ptr<XACCJIT>> Create() {
51  auto JTMB = JITTargetMachineBuilder::detectHost();
52 
53  if (!JTMB)
54  return JTMB.takeError();
55 
56  auto DL = JTMB->getDefaultDataLayoutForTarget();
57  if (!DL)
58  return DL.takeError();
59 
60  return std::make_unique<XACCJIT>(std::move(*JTMB), std::move(*DL));
61  }
62 
63  const DataLayout &getDataLayout() const { return DL; }
64 
65  LLVMContext &getContext() { return *Ctx.getContext(); }
66 
67  Error addModule(std::unique_ptr<Module> M) {
68 
69  MainJD.addGenerator(cantFail(DynamicLibrarySearchGenerator::Load(
70  "/home/cades/.xacc/lib/libxacc.so", DL.getGlobalPrefix())));
71  MainJD.addGenerator(cantFail(DynamicLibrarySearchGenerator::Load(
72  "/home/cades/.xacc/lib/libqrt.so", DL.getGlobalPrefix())));
73  MainJD.addGenerator(cantFail(DynamicLibrarySearchGenerator::Load(
74  "/home/cades/.xacc/lib/libqcor.so", DL.getGlobalPrefix())));
75  MainJD.addGenerator(cantFail(DynamicLibrarySearchGenerator::Load(
76  "/home/cades/.xacc/lib/libCppMicroServices.so", DL.getGlobalPrefix())));
77 
78  return CompileLayer.add(MainJD, ThreadSafeModule(std::move(M), Ctx));
79  }
80 
81  Expected<JITEvaluatedSymbol> lookup(StringRef Name) {
82  return ES.lookup({&MainJD}, Mangle(Name.str()));
83  }
84 
85 
86 };
87 
88 } // namespace qcor
qcor::XACCJIT
Definition: jit_utils.hpp:24
qcor
Definition: qcor_syntax_handler.cpp:15