From 4727dd052a326591c23aa3a8754ae9d63d51e949 Mon Sep 17 00:00:00 2001 From: Dibyendu Majumdar Date: Sun, 3 Nov 2019 22:16:17 +0000 Subject: [PATCH] issue #170 Add support for LLVM 9 --- CMakeLists.txt | 7 ++++--- include/lualib.h | 8 ++++---- include/ravi_llvm.h | 4 ++++ include/ravi_llvmcodegen.h | 7 +++++++ src/linit.c | 6 +++--- src/ravi_llvmarith2.cpp | 8 ++++++++ src/ravi_llvmcodegen.cpp | 33 +++++++++++++++++++++++++++++---- src/ravi_llvmjit.cpp | 7 +++++-- 8 files changed, 64 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 97497b0..be952b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -183,8 +183,7 @@ if (LLVM_JIT) src/ravi_llvmcodegen.cpp src/ravi_llvmforprep.cpp src/ravi_llvmcomp.cpp src/ravi_llvmreturn.cpp src/ravi_llvmload.cpp src/ravi_llvmforloop.cpp src/ravi_llvmarith1.cpp src/ravi_llvmcall.cpp src/ravi_llvmtable.cpp - src/ravi_llvmarith2.cpp src/ravi_llvmtforcall.cpp src/ravi_llvmrest.cpp - src/ravi_llvmluaapi.cpp) + src/ravi_llvmarith2.cpp src/ravi_llvmtforcall.cpp src/ravi_llvmrest.cpp) elseif (OMR_JIT) set(OMR_JIT_SRCS src/ravi_omrjit.c src/ravi_omrjitapi.c) else () @@ -323,11 +322,13 @@ if (LLVM_JIT) X86CodeGen X86AsmParser X86Disassembler - X86AsmPrinter X86Desc X86Info X86Utils ) + if (${LLVM_PACKAGE_VERSION} VERSION_LESS "9.0.0") + list(APPEND LLVM_LIBS_PROCESSOR X86AsmPrinter) + endif () elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm") set(LLVM_LIBS_PROCESSOR ARMCodeGen diff --git a/include/lualib.h b/include/lualib.h index 11ec110..e34f601 100644 --- a/include/lualib.h +++ b/include/lualib.h @@ -57,10 +57,10 @@ LUAMOD_API int (raviopen_llvmjit)(lua_State *L); #define LUA_ASTLIBNAME "ast" LUAMOD_API int (raviopen_ast_library)(lua_State *L); -#ifdef USE_LLVM -#define LUA_LLVMLIBNAME "llvm" -LUAMOD_API int (raviopen_llvmluaapi)(lua_State *L); -#endif +//#ifdef USE_LLVM +//#define LUA_LLVMLIBNAME "llvm" +//LUAMOD_API int (raviopen_llvmluaapi)(lua_State *L); +//#endif /** RAVI change end */ /* open all previous libraries */ LUALIB_API void (luaL_openlibs) (lua_State *L); diff --git a/include/ravi_llvm.h b/include/ravi_llvm.h index 5bfc7ae..f032576 100644 --- a/include/ravi_llvm.h +++ b/include/ravi_llvm.h @@ -43,6 +43,10 @@ #define USE_ORCv2_JIT 0 #endif +#if LLVM_VERSION_MAJOR >= 9 +#define USE_ORCv2_JIT 1 +#endif + // In lua.c we include this just to get version numbers // We cannot have C++ headers in that case #ifdef __cplusplus diff --git a/include/ravi_llvmcodegen.h b/include/ravi_llvmcodegen.h index 932e29f..eee8f8f 100644 --- a/include/ravi_llvmcodegen.h +++ b/include/ravi_llvmcodegen.h @@ -843,10 +843,17 @@ struct RaviFunctionDef { llvm::Function *ravi_debug_traceF; // standard C functions +#if LLVM_VERSION_MAJOR >= 9 + llvm::FunctionCallee printfFunc; + llvm::FunctionCallee fmodFunc; + llvm::FunctionCallee floorFunc; + llvm::FunctionCallee powFunc; +#else llvm::Constant *printfFunc; llvm::Constant *fmodFunc; llvm::Constant *floorFunc; llvm::Constant *powFunc; +#endif // Jump targets in the function std::vector jmp_targets; diff --git a/src/linit.c b/src/linit.c index a24896c..d5a24f3 100644 --- a/src/linit.c +++ b/src/linit.c @@ -52,9 +52,9 @@ static const luaL_Reg loadedlibs[] = { {LUA_UTF8LIBNAME, luaopen_utf8}, {LUA_DBLIBNAME, luaopen_debug}, {LUA_RAVILIBNAME, raviopen_llvmjit}, -#ifdef USE_LLVM - {LUA_LLVMLIBNAME, raviopen_llvmluaapi}, -#endif +//#ifdef USE_LLVM +// {LUA_LLVMLIBNAME, raviopen_llvmluaapi}, +//#endif { "dmrc", raviopen_dmrcluaapi }, #if defined(LUA_COMPAT_BITLIB) {LUA_BITLIBNAME, luaopen_bit32}, diff --git a/src/ravi_llvmarith2.cpp b/src/ravi_llvmarith2.cpp index 0301128..3657c70 100644 --- a/src/ravi_llvmarith2.cpp +++ b/src/ravi_llvmarith2.cpp @@ -676,7 +676,11 @@ void RaviCodeGenerator::emit_MOD(RaviFunctionDef *def, int A, int B, int C, lhs = emit_load_local_n(def, nb); rhs = emit_load_local_n(def, nc); +#if LLVM_VERSION_MAJOR >= 9 + llvm::Value *fmod_result = CreateCall2(def->builder, def->fmodFunc.getCallee(), lhs, rhs); +#else llvm::Value *fmod_result = CreateCall2(def->builder, def->fmodFunc, lhs, rhs); +#endif // if ((m)*(b) < 0) (m) += (b); llvm::Value *mb = def->builder->CreateFMul(fmod_result, rhs); @@ -1002,7 +1006,11 @@ void RaviCodeGenerator::emit_POW(RaviFunctionDef *def, int A, int B, int C, llvm::Instruction *lhs = emit_load_local_n(def, nb); llvm::Instruction *rhs = emit_load_local_n(def, nc); +#if LLVM_VERSION_MAJOR >= 9 + llvm::Value *pow_result = CreateCall2(def->builder, def->powFunc.getCallee(), lhs, rhs); +#else llvm::Value *pow_result = CreateCall2(def->builder, def->powFunc, lhs, rhs); +#endif emit_store_reg_n_withtype(def, pow_result, ra); diff --git a/src/ravi_llvmcodegen.cpp b/src/ravi_llvmcodegen.cpp index c44b236..093ae75 100644 --- a/src/ravi_llvmcodegen.cpp +++ b/src/ravi_llvmcodegen.cpp @@ -980,34 +980,59 @@ void RaviCodeGenerator::emit_raise_lua_error(RaviFunctionDef *def, } void RaviCodeGenerator::debug_printf(RaviFunctionDef *def, const char *str) { +#if LLVM_VERSION_MAJOR >= 9 + CreateCall1(def->builder, def->printfFunc.getCallee(), + def->builder->CreateGlobalStringPtr(str)); +#else CreateCall1(def->builder, def->printfFunc, def->builder->CreateGlobalStringPtr(str)); +#endif } void RaviCodeGenerator::debug_printf1(RaviFunctionDef *def, const char *str, llvm::Value *arg1) { - CreateCall2(def->builder, def->printfFunc, +#if LLVM_VERSION_MAJOR >= 9 + CreateCall2(def->builder, def->printfFunc.getCallee(), + def->builder->CreateGlobalStringPtr(str), arg1); +#else + CreateCall2(def->builder, def->printfFunc, def->builder->CreateGlobalStringPtr(str), arg1); +#endif } void RaviCodeGenerator::debug_printf2(RaviFunctionDef *def, const char *str, llvm::Value *arg1, llvm::Value *arg2) { - CreateCall3(def->builder, def->printfFunc, +#if LLVM_VERSION_MAJOR >= 9 + CreateCall3(def->builder, def->printfFunc.getCallee(), + def->builder->CreateGlobalStringPtr(str), arg1, arg2); +#else + CreateCall3(def->builder, def->printfFunc, def->builder->CreateGlobalStringPtr(str), arg1, arg2); +#endif } void RaviCodeGenerator::debug_printf3(RaviFunctionDef *def, const char *str, llvm::Value *arg1, llvm::Value *arg2, llvm::Value *arg3) { - CreateCall4(def->builder, def->printfFunc, +#if LLVM_VERSION_MAJOR >= 9 + CreateCall4(def->builder, def->printfFunc.getCallee(), + def->builder->CreateGlobalStringPtr(str), arg1, arg2, arg3); +#else + CreateCall4(def->builder, def->printfFunc, def->builder->CreateGlobalStringPtr(str), arg1, arg2, arg3); +#endif } void RaviCodeGenerator::debug_printf4(RaviFunctionDef *def, const char *str, llvm::Value *arg1, llvm::Value *arg2, llvm::Value *arg3, llvm::Value *arg4) { - CreateCall5(def->builder, def->printfFunc, +#if LLVM_VERSION_MAJOR >= 9 + CreateCall5(def->builder, def->printfFunc.getCallee(), + def->builder->CreateGlobalStringPtr(str), arg1, arg2, arg3, arg4); +#else + CreateCall5(def->builder, def->printfFunc, def->builder->CreateGlobalStringPtr(str), arg1, arg2, arg3, arg4); +#endif } void RaviCodeGenerator::emit_extern_declarations(RaviFunctionDef *def) { diff --git a/src/ravi_llvmjit.cpp b/src/ravi_llvmjit.cpp index a2eca40..19643fb 100644 --- a/src/ravi_llvmjit.cpp +++ b/src/ravi_llvmjit.cpp @@ -222,8 +222,11 @@ RaviJITState::RaviJITState() DL = llvm::make_unique(std::move(dataLayout)); Mangle = llvm::make_unique(*ES, *this->DL); Ctx = llvm::make_unique(llvm::make_unique()); - ES->getMainJITDylib().setGenerator(cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(*DL))); - +#if LLVM_VERSION_MAJOR >= 9 + ES->getMainJITDylib().setGenerator(llvm::cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(DL->getGlobalPrefix()))); +#else + ES->getMainJITDylib().setGenerator(llvm::cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(*DL))); +#endif types_ = llvm::make_unique(*Ctx->getContext()); #else