[Mesa-dev] [PATCH 5/7] radv: record LLVM IR when debugging shaders

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Mar 14 11:27:07 UTC 2018


If AMD_shader_info or RADV_TRACE_FILE is used we might need to
keep trace of LLVM IR.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/amd/vulkan/radv_nir_to_llvm.c | 6 ++++++
 src/amd/vulkan/radv_shader.c      | 3 +++
 src/amd/vulkan/radv_shader.h      | 2 ++
 3 files changed, 11 insertions(+)

diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c
index 298150b809..1a323adf46 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -3234,6 +3234,12 @@ static void ac_compile_llvm_module(LLVMTargetMachineRef tm,
 		fprintf(stderr, "compile failed\n");
 	}
 
+	if (options->record_llvm_ir) {
+		char *llvm_ir = LLVMPrintModuleToString(llvm_module);
+		binary->llvm_ir_string = strdup(llvm_ir);
+		LLVMDisposeMessage(llvm_ir);
+	}
+
 	if (options->dump_shader)
 		fprintf(stderr, "disasm:\n%s\n", binary->disasm_string);
 
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 2462fe57e3..327ae9fe3d 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -464,6 +464,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;
@@ -499,6 +500,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;
@@ -562,6 +564,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 6550c7da1d..5c3f0ff6c4 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.16.2



More information about the mesa-dev mailing list