From 81818662a5e5f252f95f4b4611b0840854d25beb Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 14 Mar 2018 10:34:13 +0100 Subject: [PATCH] radv: record LLVM IR when debugging shaders If AMD_shader_info or RADV_TRACE_FILE is used we might need to keep trace of LLVM IR. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_nir_to_llvm.c | 7 +++++++ src/amd/vulkan/radv_shader.c | 3 +++ src/amd/vulkan/radv_shader.h | 2 ++ 3 files changed, 12 insertions(+) diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index 298150b8092..8c316959280 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -3229,6 +3229,13 @@ static void ac_compile_llvm_module(LLVMTargetMachineRef tm, ac_dump_module(llvm_module); memset(binary, 0, sizeof(*binary)); + + if (options->record_llvm_ir) { + char *llvm_ir = LLVMPrintModuleToString(llvm_module); + binary->llvm_ir_string = strdup(llvm_ir); + LLVMDisposeMessage(llvm_ir); + } + int v = ac_llvm_compile(llvm_module, binary, tm); if (v) { fprintf(stderr, "compile failed\n"); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 8a6928e7ccd..89875a56a02 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -462,6 +462,7 @@ shader_variant_create(struct radv_device *device, options->dump_shader = radv_can_dump_shader(device, module); options->dump_preoptir = options->dump_shader && device->instance->debug_flags & RADV_DEBUG_PREOPTIR; + options->record_llvm_ir = device->keep_shader_info; if (options->supports_spill) tm_options |= AC_TM_SUPPORTS_SPILL; @@ -497,6 +498,7 @@ shader_variant_create(struct radv_device *device, if (device->keep_shader_info) { variant->disasm_string = binary.disasm_string; + variant->llvm_ir_string = binary.llvm_ir_string; if (!gs_copy_shader && !module->nir) { variant->nir = *shaders; variant->spirv = (uint32_t *)module->data; @@ -560,6 +562,7 @@ radv_shader_variant_destroy(struct radv_device *device, ralloc_free(variant->nir); free(variant->disasm_string); + free(variant->llvm_ir_string); free(variant); } diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 6550c7da1d6..5c3f0ff6c44 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -99,6 +99,7 @@ struct radv_nir_compiler_options { bool clamp_shadow_reference; bool dump_shader; bool dump_preoptir; + bool record_llvm_ir; enum radeon_family family; enum chip_class chip_class; }; @@ -261,6 +262,7 @@ struct radv_shader_variant { uint32_t spirv_size; struct nir_shader *nir; char *disasm_string; + char *llvm_ir_string; struct list_head slab_list; }; -- 2.30.2