From d7d539a1cb8dcf50cb7cd534e6ae7df3f42914c8 Mon Sep 17 00:00:00 2001 From: Jay Cornwall Date: Thu, 10 Oct 2013 20:06:48 -0500 Subject: [PATCH] radeon/llvm: show LLVM disassembly when available With code dump enabled LLVM may generate disassembly during compilation. Show this disassembly when available and prefer it to SI bytecode dump. Reviewed-by: Tom Stellard Signed-off-by: Jay Cornwall --- src/gallium/drivers/radeon/radeon_llvm_emit.c | 7 +++++++ src/gallium/drivers/radeon/radeon_llvm_emit.h | 1 + src/gallium/drivers/radeonsi/radeonsi_shader.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index 2dd7bf7..8bf278b 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -143,6 +143,7 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_llvm_binary *binary, elf = elf_memory(elf_buffer, buffer_size); elf_getshdrstrndx(elf, §ion_str_index); + binary->disassembled = 0; while ((section = elf_nextscn(elf, section))) { const char *name; @@ -163,6 +164,12 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_llvm_binary *binary, binary->config_size = section_data->d_size; binary->config = MALLOC(binary->config_size * sizeof(unsigned char)); memcpy(binary->config, section_data->d_buf, binary->config_size); + } else if (dump && !strcmp(name, ".AMDGPU.disasm")) { + binary->disassembled = 1; + section_data = elf_getdata(section, section_data); + fprintf(stderr, "\nShader Disassembly:\n\n"); + fprintf(stderr, "%.*s\n", (int)section_data->d_size, + (char *)section_data->d_buf); } } diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.h b/src/gallium/drivers/radeon/radeon_llvm_emit.h index 72c24c6..532b7b8 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.h +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.h @@ -34,6 +34,7 @@ struct radeon_llvm_binary { unsigned code_size; unsigned char *config; unsigned config_size; + int disassembled; }; void radeon_llvm_shader_type(LLVMValueRef F, unsigned type); diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 97ed4e3..88fc040 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -1764,7 +1764,7 @@ int si_compile_llvm(struct r600_context *rctx, struct si_pipe_shader *shader, memset(&binary, 0, sizeof(binary)); radeon_llvm_compile(mod, &binary, r600_get_llvm_processor_name(rctx->screen->b.family), dump); - if (dump) { + if (dump && ! binary.disassembled) { fprintf(stderr, "SI CODE:\n"); for (i = 0; i < binary.code_size; i+=4 ) { fprintf(stderr, "%02x%02x%02x%02x\n", binary.code[i + 3], -- 2.7.4