Mesa (master): radv: record LLVM IR when debugging shaders

Samuel Pitoiset hakzsam at kemper.freedesktop.org
Thu Mar 15 16:22:37 UTC 2018


Module: Mesa
Branch: master
Commit: 81818662a5e5f252f95f4b4611b0840854d25beb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=81818662a5e5f252f95f4b4611b0840854d25beb

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Mar 14 10:34:13 2018 +0100

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 <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

---

 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 298150b809..8c31695928 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 8a6928e7cc..89875a56a0 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 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;
 };




More information about the mesa-commit mailing list