1
0
mirror of https://github.com/exaloop/codon.git synced 2025-06-03 15:03:52 +08:00
codon/codon/jit/engine.h
A. R. Shajii d80d882663 Refactor
2021-10-28 13:03:06 -04:00

66 lines
2.0 KiB
C++

#pragma once
#include <memory>
#include <vector>
#include "codon/sir/llvm/llvm.h"
#include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
#include "llvm/ExecutionEngine/Orc/CompileUtils.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
#include "llvm/ExecutionEngine/Orc/IRTransformLayer.h"
#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/Orc/TPCIndirectionUtils.h"
#include "llvm/ExecutionEngine/Orc/TargetProcessControl.h"
namespace codon {
namespace jit {
class Engine {
private:
std::unique_ptr<llvm::orc::TargetProcessControl> tpc;
std::unique_ptr<llvm::orc::ExecutionSession> sess;
std::unique_ptr<llvm::orc::TPCIndirectionUtils> tpciu;
llvm::DataLayout layout;
llvm::orc::MangleAndInterner mangle;
llvm::orc::RTDyldObjectLinkingLayer objectLayer;
llvm::orc::IRCompileLayer compileLayer;
llvm::orc::IRTransformLayer optimizeLayer;
llvm::orc::CompileOnDemandLayer codLayer;
llvm::orc::JITDylib &mainJD;
static void handleLazyCallThroughError();
static llvm::Expected<llvm::orc::ThreadSafeModule>
optimizeModule(llvm::orc::ThreadSafeModule module,
const llvm::orc::MaterializationResponsibility &R);
public:
Engine(std::unique_ptr<llvm::orc::TargetProcessControl> tpc,
std::unique_ptr<llvm::orc::ExecutionSession> sess,
std::unique_ptr<llvm::orc::TPCIndirectionUtils> tpciu,
llvm::orc::JITTargetMachineBuilder jtmb, llvm::DataLayout layout);
~Engine();
static llvm::Expected<std::unique_ptr<Engine>> create();
const llvm::DataLayout &getDataLayout() const { return layout; }
llvm::orc::JITDylib &getMainJITDylib() { return mainJD; }
llvm::Error addModule(llvm::orc::ThreadSafeModule module,
llvm::orc::ResourceTrackerSP rt = nullptr);
llvm::Expected<llvm::JITEvaluatedSymbol> lookup(llvm::StringRef name);
};
} // namespace jit
} // namespace codon