From 0fca80b3db64dc1d004f78e22b9de86a07e9de96 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Sat, 28 Jan 2017 17:32:05 +0100 Subject: [PATCH] various: Fix missing DumpModule with recent LLVM. Since LLVM revision 293359 DumpModule gets only implemented when either a debug build or LLVM_ENABLE_DUMP is set. This patch adds a direct replacement for the function for radv and radeonsi, However, as I don't know a good place to put common LLVM code for all three I inlined the implementation for LLVMPipe. v2: Use the new code for LLVM 3.4+ instead of LLVM 5+ & fixed indentation Signed-off-by: Bas Nieuwenhuizen Reviewed-by: Roland Scheidegger --- src/amd/common/ac_llvm_util.c | 8 ++++++++ src/amd/common/ac_llvm_util.h | 3 +++ src/amd/common/ac_nir_to_llvm.c | 2 +- src/gallium/drivers/llvmpipe/lp_jit.c | 8 +++++++- src/gallium/drivers/radeonsi/si_shader.c | 6 +++--- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c index 770e3bd13c1..7317db76baa 100644 --- a/src/amd/common/ac_llvm_util.c +++ b/src/amd/common/ac_llvm_util.c @@ -504,3 +504,11 @@ ac_prepare_cube_coords(struct ac_llvm_context *ctx, memcpy(coords_arg, coords, sizeof(coords)); } + +void +ac_dump_module(LLVMModuleRef module) +{ + char *str = LLVMPrintModuleToString(module); + fprintf(stderr, "%s", str); + LLVMDisposeMessage(str); +} diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h index 802c2662470..2d301c93575 100644 --- a/src/amd/common/ac_llvm_util.h +++ b/src/amd/common/ac_llvm_util.h @@ -95,6 +95,9 @@ ac_prepare_cube_coords(struct ac_llvm_context *ctx, LLVMValueRef *coords_arg, LLVMValueRef *derivs_arg); +void +ac_dump_module(LLVMModuleRef module); + #ifdef __cplusplus } #endif diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 72ae6eb0730..e83c7a2e488 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -4569,7 +4569,7 @@ static void ac_compile_llvm_module(LLVMTargetMachineRef tm, bool dump_shader) { if (dump_shader) - LLVMDumpModule(llvm_module); + ac_dump_module(llvm_module); memset(binary, 0, sizeof(*binary)); int v = ac_llvm_compile(llvm_module, binary, tm); diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c b/src/gallium/drivers/llvmpipe/lp_jit.c index 21260369aca..bb2b87f862f 100644 --- a/src/gallium/drivers/llvmpipe/lp_jit.c +++ b/src/gallium/drivers/llvmpipe/lp_jit.c @@ -222,7 +222,13 @@ lp_jit_create_types(struct lp_fragment_shader_variant *lp) } if (gallivm_debug & GALLIVM_DEBUG_IR) { - LLVMDumpModule(gallivm->module); +#if HAVE_LLVM >= 0x304 + char *str = LLVMPrintModuleToString(gallivm->module); + fprintf(stderr, "%s", str); + LLVMDisposeMessage(str); +#else + DumpModule(gallivm->module); +#endif } } diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 5ca974e48b4..cad7bf7a024 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -6400,7 +6400,7 @@ int si_compile_llvm(struct si_screen *sscreen, if (!(sscreen->b.debug_flags & (DBG_NO_IR | DBG_PREOPT_IR))) { fprintf(stderr, "%s LLVM IR:\n\n", name); - LLVMDumpModule(mod); + ac_dump_module(mod); fprintf(stderr, "\n"); } } @@ -6599,7 +6599,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen, /* Dump LLVM IR before any optimization passes */ if (sscreen->b.debug_flags & DBG_PREOPT_IR && r600_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY)) - LLVMDumpModule(bld_base->base.gallivm->module); + ac_dump_module(bld_base->base.gallivm->module); si_llvm_finalize_module(&ctx, r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_GEOMETRY)); @@ -7603,7 +7603,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen, /* Dump LLVM IR before any optimization passes */ if (sscreen->b.debug_flags & DBG_PREOPT_IR && r600_can_dump_shader(&sscreen->b, ctx.type)) - LLVMDumpModule(mod); + ac_dump_module(mod); si_llvm_finalize_module(&ctx, r600_extra_shader_checks(&sscreen->b, ctx.type)); -- 2.30.2