radeon/llvm: show LLVM disassembly when available
authorJay Cornwall <jay@jcornwall.me>
Fri, 11 Oct 2013 01:06:48 +0000 (20:06 -0500)
committerTom Stellard <thomas.stellard@amd.com>
Sat, 12 Oct 2013 04:03:58 +0000 (00:03 -0400)
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 <thomas.stellard@amd.com>
Signed-off-by: Jay Cornwall <jay@jcornwall.me>
src/gallium/drivers/radeon/radeon_llvm_emit.c
src/gallium/drivers/radeon/radeon_llvm_emit.h
src/gallium/drivers/radeonsi/radeonsi_shader.c

index 2dd7bf7b935973bf6a9536c4fc6728de899bc8e4..8bf278bb99d3912b65b3b0e3a08269481f9ddc7c 100644 (file)
@@ -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, &section_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);
                }
        }
 
index 72c24c6559306aedee11ce88f3bf9fdfdc35768c..532b7b843f007329c63491b805d24c155cc3af54 100644 (file)
@@ -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);
index 97ed4e38125a9c4f61951e177423f9eb9485a15a..88fc0400a8315ac3a4ea5b2325f17a7fa6d94433 100644 (file)
@@ -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],