31#ifndef LIME_JIT_LLVM_COMPAT_H
32#define LIME_JIT_LLVM_COMPAT_H
39#include <llvm/Config/llvm-config.h>
44#include <llvm-c/Core.h>
45#include <llvm-c/Orc.h>
47#if LLVM_VERSION_MAJOR >= 16
48#include <llvm-c/Transforms/PassBuilder.h>
50#include <llvm-c/Transforms/PassManagerBuilder.h>
62#if LLVM_VERSION_MAJOR >= 16
64#define LIME_JIT_RUN_O2_PASSES(module) \
66 LLVMModuleRef _lime_mod = (module); \
67 LLVMPassBuilderOptionsRef _lime_opts = \
68 LLVMCreatePassBuilderOptions(); \
69 LLVMErrorRef _lime_err = \
70 LLVMRunPasses(_lime_mod, "default<O2>", NULL, _lime_opts); \
71 if (_lime_err != LLVMErrorSuccess) { \
72 char *_lime_msg = LLVMGetErrorMessage(_lime_err); \
73 LLVMDisposeErrorMessage(_lime_msg); \
75 LLVMDisposePassBuilderOptions(_lime_opts); \
80#define LIME_JIT_RUN_O2_PASSES(module) \
82 LLVMModuleRef _lime_mod = (module); \
83 LLVMPassManagerBuilderRef _lime_pmb = \
84 LLVMPassManagerBuilderCreate(); \
85 LLVMPassManagerBuilderSetOptLevel(_lime_pmb, 2); \
86 LLVMPassManagerRef _lime_pm = LLVMCreatePassManager(); \
87 LLVMPassManagerBuilderPopulateModulePassManager(_lime_pmb, \
89 LLVMRunPassManager(_lime_pm, _lime_mod); \
90 LLVMDisposePassManager(_lime_pm); \
91 LLVMPassManagerBuilderDispose(_lime_pmb); \
102#if LLVM_VERSION_MAJOR >= 15
103typedef LLVMOrcExecutorAddress LimeJitAddress;
105typedef LLVMOrcJITTargetAddress LimeJitAddress;
117static inline bool lime_jit_create_ts_ctx(
118 LLVMOrcThreadSafeContextRef *ts_ctx_out,
119 LLVMContextRef *llvm_ctx_out)
121#if LLVM_VERSION_MAJOR >= 15
122 LLVMContextRef llvm_ctx = LLVMContextCreate();
123 if (llvm_ctx == NULL) {
126 LLVMOrcThreadSafeContextRef ts_ctx =
127 LLVMOrcCreateNewThreadSafeContextFromLLVMContext(llvm_ctx);
128 if (ts_ctx == NULL) {
129 LLVMContextDispose(llvm_ctx);
136 LLVMOrcThreadSafeContextRef ts_ctx = LLVMOrcCreateNewThreadSafeContext();
137 if (ts_ctx == NULL) {
140 LLVMContextRef llvm_ctx = LLVMOrcThreadSafeContextGetContext(ts_ctx);
141 if (llvm_ctx == NULL) {
142 LLVMOrcDisposeThreadSafeContext(ts_ctx);
146 *ts_ctx_out = ts_ctx;
147 *llvm_ctx_out = llvm_ctx;