21#include <llvm/ExecutionEngine/JITEventListener.h>
22#include <llvm/ExecutionEngine/ObjectCache.h>
23#include <llvm/ExecutionEngine/Orc/LLJIT.h>
24#include <llvm/Support/Error.h>
25#include <llvm/Support/TargetSelect.h>
37 std::unique_ptr<llvm::MemoryBuffer>
getObject(
const llvm::Module *m)
override;
53 std::unique_ptr<llvm::orc::LLJIT>
jit;
54 std::unique_ptr<srn_object_cache_t>
cache;
62 llvm::orc::JITTargetMachineBuilder
jtmb;
79 llvm::InitializeNativeTarget();
80 llvm::InitializeNativeTargetAsmPrinter();
82 auto jit_or_err = llvm::orc::LLJITBuilder().create();
84 llvm::consumeError(jit_or_err.takeError());
90 self->jit = std::move(*jit_or_err);
91 self->data_layout = self->jit->getDataLayout().getStringRepresentation();
92 self->triple = self->jit->getTargetTriple();
93 self->config = (config !=
nullptr)
95 : srn_jit_config_t{.opt_level = 2, .install_default_pipeline =
true};
122 ctx,
NOT_IMPLEMENTED,
"srn_jit_expose_process_symbols is not yet implemented"
srn_error_t * srn_errors_make(const srn_context_t *ctx, srn_error_tag_t tag, const char *msg, void *caller)
Build an error in ctx's memory, tagged tag and carrying msg.
srn_jit_t * srn_jit_create(srn_mm_t *mm, const srn_jit_config_t *config)
const char * srn_jit_data_layout(srn_jit_t *jit)
const char * srn_jit_triple(srn_jit_t *jit)
srn_error_t * srn_jit_remove(srn_jit_t *, srn_context_t *ctx, srn_jit_module_t *)
void srn_jit_destroy(srn_jit_t *jit)
srn_error_t * srn_jit_expose_process_symbols(srn_jit_t *, srn_context_t *ctx)
srn_error_t * srn_jit_lookup(srn_jit_t *, srn_context_t *ctx, const char *, void **)
srn_error_t * srn_jit_add_ir(srn_jit_t *, srn_context_t *ctx, const char *, size_t, srn_jit_module_t **)
srn_error_t * srn_jit_add_bitcode(srn_jit_t *, srn_context_t *ctx, const void *, size_t, srn_jit_module_t **)
srn_error_t * srn_jit_define(srn_jit_t *, srn_context_t *ctx, const char *, void *)
A runtime error, a tag classifying the failure and a human-readable message.
llvm::JITEventListener * perfListener
Perf notification listener.
llvm::JITEventListener * gdbListener
GDB notification listener.
std::unique_ptr< llvm::orc::LLJIT > jit
std::unique_ptr< srn_object_cache_t > cache
llvm::DataLayout & data_layout
llvm::orc::JITTargetMachineBuilder jtmb
Main memory manager structure that will own all the allocated blocks and data.
std::unique_ptr< llvm::MemoryBuffer > getObject(const llvm::Module *m) override
void dumpToObjectFile(llvm::StringRef filename)
Dump cached object to output file filename.
llvm::StringMap< std::unique_ptr< llvm::MemoryBuffer > > cachedObjects
void notifyObjectCompiled(const llvm::Module *m, llvm::MemoryBufferRef objBuffer) override
Cache the given objBuffer for the given module m.