From b14fce113fa45da85c8c3528552ae446ced340ca Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Sat, 5 Nov 2022 23:24:05 +0100 Subject: llvm: small ORCv2 jit example --- content/2022-07-07-llvm-orc-jit/jit.h | 100 ++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 content/2022-07-07-llvm-orc-jit/jit.h (limited to 'content/2022-07-07-llvm-orc-jit/jit.h') diff --git a/content/2022-07-07-llvm-orc-jit/jit.h b/content/2022-07-07-llvm-orc-jit/jit.h new file mode 100644 index 0000000..10d6d4a --- /dev/null +++ b/content/2022-07-07-llvm-orc-jit/jit.h @@ -0,0 +1,100 @@ +#ifndef JIT_H +#define JIT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace jit { + +using llvm::DataLayout; +using llvm::Expected; +using llvm::JITEvaluatedSymbol; +using llvm::SectionMemoryManager; +using llvm::StringRef; + +using llvm::orc::ConcurrentIRCompiler; +// using llvm::orc::DynamicLibrarySearchGenerator; +using llvm::orc::ExecutionSession; +using llvm::orc::IRCompileLayer; +using llvm::orc::JITDylib; +using llvm::orc::JITTargetMachineBuilder; +using llvm::orc::MangleAndInterner; +using llvm::orc::ResourceTrackerSP; +using llvm::orc::RTDyldObjectLinkingLayer; +using llvm::orc::SelfExecutorProcessControl; +using llvm::orc::ThreadSafeModule; + +// Simple JIT engine based on the KaleidoscopeJIT. +// https://www.llvm.org/docs/tutorial/BuildingAJIT1.html +class Jit { +private: + std::unique_ptr ES; + + DataLayout DL; + MangleAndInterner Mangle; + + RTDyldObjectLinkingLayer ObjectLayer; + IRCompileLayer CompileLayer; + + JITDylib &JD; + +public: + Jit(std::unique_ptr ES, JITTargetMachineBuilder JTMB, + DataLayout DL) + : ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL), + ObjectLayer(*this->ES, + []() { return std::make_unique(); }), + CompileLayer(*this->ES, ObjectLayer, + std::make_unique(std::move(JTMB))), + JD(this->ES->createBareJITDylib("main")) { + // https://www.llvm.org/docs/ORCv2.html#how-to-add-process-and-library-symbols-to-jitdylibs + // JD.addGenerator( + // cantFail(DynamicLibrarySearchGenerator::GetForCurrentProcess( + // DL.getGlobalPrefix()))); + (void)JD.define(llvm::orc::absoluteSymbols( + {{Mangle("libc_puts"), llvm::JITEvaluatedSymbol::fromPointer(&puts)}})); + } + + ~Jit() { + if (auto Err = ES->endSession()) + ES->reportError(std::move(Err)); + } + + static std::unique_ptr Create() { + auto EPC = cantFail(SelfExecutorProcessControl::Create()); + auto ES = std::make_unique(std::move(EPC)); + + JITTargetMachineBuilder JTMB( + ES->getExecutorProcessControl().getTargetTriple()); + + auto DL = cantFail(JTMB.getDefaultDataLayoutForTarget()); + + return std::make_unique(std::move(ES), std::move(JTMB), std::move(DL)); + } + + // Error addModule(ThreadSafeModule TSM) { + Expected addModule(ThreadSafeModule TSM) { + auto RT = JD.createResourceTracker(); + if (auto E = CompileLayer.add(RT, std::move(TSM))) { + return E; + } + return RT; + } + + Expected lookup(StringRef Name) { + return ES->lookup({&JD}, Mangle(Name.str())); + } +}; + +} // namespace jit + +#endif -- cgit v1.2.3