From 7ba01e7be4ae8ed10057ca315c3c49df8d6ad14b Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 29 Oct 2022 18:40:06 +0100 Subject: [PATCH] Support JIT compilation for LLVM 13+ --- m4/ax_llvm_c.m4 | 4 ++-- src/jit/jit-llvm.c | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/m4/ax_llvm_c.m4 b/m4/ax_llvm_c.m4 index 73407b30..0dd54610 100644 --- a/m4/ax_llvm_c.m4 +++ b/m4/ax_llvm_c.m4 @@ -91,8 +91,8 @@ AC_DEFUN([AX_LLVM_C], [ AC_MSG_ERROR([LLVM version 16.0 or later not yet supported]) fi - # Minimum version should be 9.0 but I've not tested 9..14 - if test "$llvm_ver_num" -ge "150"; then + # Minimum version should be 9.0 but I've not tested 9..12 + if test "$llvm_ver_num" -ge "130"; then AC_DEFINE_UNQUOTED(LLVM_HAS_LLJIT, [1], [LLVM has LLJIT API]) fi diff --git a/src/jit/jit-llvm.c b/src/jit/jit-llvm.c index 9989ad6a..d6d9f927 100644 --- a/src/jit/jit-llvm.c +++ b/src/jit/jit-llvm.c @@ -145,6 +145,13 @@ typedef struct { } \ } while (0) +#ifdef LLVM_HAS_OPAQUE_POINTERS +#define PTR(x) x +#else +#define PTR(x) \ + LLVMBuildPointerCast(req->builder, (x), req->types[LLVM_PTR], "") +#endif + static LLVMValueRef llvm_int1(cgen_req_t *req, bool b) { return LLVMConstInt(req->types[LLVM_INT1], b, false); @@ -634,7 +641,13 @@ static void cgen_op_send(cgen_req_t *req, cgen_block_t *cgb, jit_ir_t *ir) fatal_trace("cannot extend LLVM type to 64 bits"); } +#ifdef LLVM_HAS_OPAQUE_POINTERS LLVMBuildStore(req->builder, value, ptr); +#else + LLVMTypeRef ptr_type = LLVMPointerType(LLVMTypeOf(value), 0); + LLVMValueRef cast = LLVMBuildPointerCast(req->builder, ptr, ptr_type, ""); + LLVMBuildStore(req->builder, value, cast); +#endif } static void cgen_op_store(cgen_req_t *req, cgen_block_t *cgb, jit_ir_t *ir) @@ -643,7 +656,13 @@ static void cgen_op_store(cgen_req_t *req, cgen_block_t *cgb, jit_ir_t *ir) LLVMValueRef value = cgen_coerce_value(req, cgb, ir->arg1, type); LLVMValueRef ptr = cgen_coerce_value(req, cgb, ir->arg2, LLVM_PTR); +#ifdef LLVM_HAS_OPAQUE_POINTERS LLVMBuildStore(req->builder, value, ptr); +#else + LLVMTypeRef ptr_type = LLVMPointerType(LLVMTypeOf(value), 0); + LLVMValueRef cast = LLVMBuildPointerCast(req->builder, ptr, ptr_type, ""); + LLVMBuildStore(req->builder, value, cast); +#endif } static void cgen_op_load(cgen_req_t *req, cgen_block_t *cgb, jit_ir_t *ir) @@ -918,12 +937,18 @@ static void cgen_op_call(cgen_req_t *req, cgen_block_t *cgb, jit_ir_t *ir) LLVMSetInitializer(global, llvm_ptr(req, callee->entry)); } +#ifdef LLVM_HAS_OPAQUE_POINTERS LLVMValueRef fnptr = LLVMBuildLoad2(req->builder, req->types[LLVM_PTR], global, ""); +#else + LLVMTypeRef ptr_type = LLVMPointerType(req->types[LLVM_ENTRY_FN], 0); + LLVMValueRef cast = LLVMBuildPointerCast(req->builder, global, ptr_type, ""); + LLVMValueRef fnptr = LLVMBuildLoad2(req->builder, ptr_type, cast, ""); +#endif LLVMValueRef args[] = { llvm_ptr(req, callee), - req->anchor, + PTR(req->anchor), req->args }; LLVMBuildCall2(req->builder, req->types[LLVM_ENTRY_FN], fnptr, @@ -1000,7 +1025,7 @@ static void cgen_macro_exit(cgen_req_t *req, cgen_block_t *cgb, jit_ir_t *ir) LLVMValueRef args[] = { which, - req->anchor, + PTR(req->anchor), req->args }; LLVMBuildCall2(req->builder, req->fntypes[LLVM_DO_EXIT], fn, @@ -1382,7 +1407,6 @@ static void cgen_module(cgen_req_t *req) LLVMSetModuleDataLayout(req->module, data_ref); req->types[LLVM_VOID] = LLVMVoidTypeInContext(req->context); - req->types[LLVM_PTR] = LLVMPointerTypeInContext(req->context, 0); req->types[LLVM_INT1] = LLVMInt1TypeInContext(req->context); req->types[LLVM_INT8] = LLVMInt8TypeInContext(req->context); req->types[LLVM_INT16] = LLVMInt16TypeInContext(req->context); @@ -1391,6 +1415,13 @@ static void cgen_module(cgen_req_t *req) req->types[LLVM_INTPTR] = LLVMIntPtrTypeInContext(req->context, data_ref); req->types[LLVM_DOUBLE] = LLVMDoubleTypeInContext(req->context); + +#ifdef LLVM_HAS_OPAQUE_POINTERS + req->types[LLVM_PTR] = LLVMPointerTypeInContext(req->context, 0); +#else + req->types[LLVM_PTR] = LLVMPointerType(req->types[LLVM_INT8], 0); +#endif + LLVMTypeRef atypes[] = { req->types[LLVM_PTR], // Function req->types[LLVM_PTR], // Anchor -- 2.39.2