44#ifndef LIME_JIT_LLVM_COMPAT_H
45#define LIME_JIT_LLVM_COMPAT_H
52#include <llvm/Config/llvm-config.h>
57#include <llvm-c/Core.h>
58#include <llvm-c/Orc.h>
60#if LLVM_VERSION_MAJOR >= 16
61#include <llvm-c/Transforms/PassBuilder.h>
63#include <llvm-c/Transforms/PassManagerBuilder.h>
75#if LLVM_VERSION_MAJOR >= 16
77#define LIME_JIT_RUN_O2_PASSES(module) \
79 LLVMModuleRef _lime_mod = (module); \
80 LLVMPassBuilderOptionsRef _lime_opts = LLVMCreatePassBuilderOptions(); \
81 LLVMErrorRef _lime_err = LLVMRunPasses(_lime_mod, "default<O2>", NULL, _lime_opts); \
82 if (_lime_err != LLVMErrorSuccess) { \
83 char *_lime_msg = LLVMGetErrorMessage(_lime_err); \
84 LLVMDisposeErrorMessage(_lime_msg); \
86 LLVMDisposePassBuilderOptions(_lime_opts); \
91#define LIME_JIT_RUN_O2_PASSES(module) \
93 LLVMModuleRef _lime_mod = (module); \
94 LLVMPassManagerBuilderRef _lime_pmb = LLVMPassManagerBuilderCreate(); \
95 LLVMPassManagerBuilderSetOptLevel(_lime_pmb, 2); \
96 LLVMPassManagerRef _lime_pm = LLVMCreatePassManager(); \
97 LLVMPassManagerBuilderPopulateModulePassManager(_lime_pmb, _lime_pm); \
98 LLVMRunPassManager(_lime_pm, _lime_mod); \
99 LLVMDisposePassManager(_lime_pm); \
100 LLVMPassManagerBuilderDispose(_lime_pmb); \
111#if LLVM_VERSION_MAJOR >= 15
112typedef LLVMOrcExecutorAddress LimeJitAddress;
114typedef LLVMOrcJITTargetAddress LimeJitAddress;
126static inline bool lime_jit_create_ts_ctx(LLVMOrcThreadSafeContextRef *ts_ctx_out,
127 LLVMContextRef *llvm_ctx_out) {
128#if LLVM_VERSION_MAJOR >= 21
132 LLVMContextRef llvm_ctx = LLVMContextCreate();
133 if (llvm_ctx == NULL) {
136 LLVMOrcThreadSafeContextRef ts_ctx = LLVMOrcCreateNewThreadSafeContextFromLLVMContext(llvm_ctx);
137 if (ts_ctx == NULL) {
138 LLVMContextDispose(llvm_ctx);
146 LLVMOrcThreadSafeContextRef ts_ctx = LLVMOrcCreateNewThreadSafeContext();
147 if (ts_ctx == NULL) {
150 LLVMContextRef llvm_ctx = LLVMOrcThreadSafeContextGetContext(ts_ctx);
151 if (llvm_ctx == NULL) {
152 LLVMOrcDisposeThreadSafeContext(ts_ctx);
156 *ts_ctx_out = ts_ctx;
157 *llvm_ctx_out = llvm_ctx;