various: Fix missing DumpModule with recent LLVM.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sat, 28 Jan 2017 16:32:05 +0000 (17:32 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 29 Jan 2017 09:25:00 +0000 (10:25 +0100)
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 <basni@google.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/amd/common/ac_llvm_util.c
src/amd/common/ac_llvm_util.h
src/amd/common/ac_nir_to_llvm.c
src/gallium/drivers/llvmpipe/lp_jit.c
src/gallium/drivers/radeonsi/si_shader.c

index 770e3bd13c1cea922e3c4899238c1a05c978b7c3..7317db76baaa73bf2d2801d4e41fbe8ccc6bad74 100644 (file)
@@ -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);
+}
index 802c266247035a863d2647df14c558239b093d1b..2d301c935754b433885bb429e714bf46683bcf34 100644 (file)
@@ -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
index 72ae6eb0730ac1209a4882c1d97580581d13fbee..e83c7a2e4887dc0c0a1ea5b309549e51d842a060 100644 (file)
@@ -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);
index 21260369acad356840ab0cad5197f0453bf707c0..bb2b87f862f0d25d28c7a8faab0b9fc07198dfae 100644 (file)
@@ -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
    }
 }
 
index 5ca974e48b45a4a13897056de3fdf37a4cc7195e..cad7bf7a024f59e4e067e75db9ea7ddf9bafb2b7 100644 (file)
@@ -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));