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@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset
2018-03-14 10:34:13 +01:00
parent d07edf5fdf
commit 81818662a5
3 changed files with 12 additions and 0 deletions

View File

@@ -3229,6 +3229,13 @@ static void ac_compile_llvm_module(LLVMTargetMachineRef tm,
ac_dump_module(llvm_module); ac_dump_module(llvm_module);
memset(binary, 0, sizeof(*binary)); 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); int v = ac_llvm_compile(llvm_module, binary, tm);
if (v) { if (v) {
fprintf(stderr, "compile failed\n"); fprintf(stderr, "compile failed\n");

View File

@@ -462,6 +462,7 @@ shader_variant_create(struct radv_device *device,
options->dump_shader = radv_can_dump_shader(device, module); options->dump_shader = radv_can_dump_shader(device, module);
options->dump_preoptir = options->dump_shader && options->dump_preoptir = options->dump_shader &&
device->instance->debug_flags & RADV_DEBUG_PREOPTIR; device->instance->debug_flags & RADV_DEBUG_PREOPTIR;
options->record_llvm_ir = device->keep_shader_info;
if (options->supports_spill) if (options->supports_spill)
tm_options |= AC_TM_SUPPORTS_SPILL; tm_options |= AC_TM_SUPPORTS_SPILL;
@@ -497,6 +498,7 @@ shader_variant_create(struct radv_device *device,
if (device->keep_shader_info) { if (device->keep_shader_info) {
variant->disasm_string = binary.disasm_string; variant->disasm_string = binary.disasm_string;
variant->llvm_ir_string = binary.llvm_ir_string;
if (!gs_copy_shader && !module->nir) { if (!gs_copy_shader && !module->nir) {
variant->nir = *shaders; variant->nir = *shaders;
variant->spirv = (uint32_t *)module->data; variant->spirv = (uint32_t *)module->data;
@@ -560,6 +562,7 @@ radv_shader_variant_destroy(struct radv_device *device,
ralloc_free(variant->nir); ralloc_free(variant->nir);
free(variant->disasm_string); free(variant->disasm_string);
free(variant->llvm_ir_string);
free(variant); free(variant);
} }

View File

@@ -99,6 +99,7 @@ struct radv_nir_compiler_options {
bool clamp_shadow_reference; bool clamp_shadow_reference;
bool dump_shader; bool dump_shader;
bool dump_preoptir; bool dump_preoptir;
bool record_llvm_ir;
enum radeon_family family; enum radeon_family family;
enum chip_class chip_class; enum chip_class chip_class;
}; };
@@ -261,6 +262,7 @@ struct radv_shader_variant {
uint32_t spirv_size; uint32_t spirv_size;
struct nir_shader *nir; struct nir_shader *nir;
char *disasm_string; char *disasm_string;
char *llvm_ir_string;
struct list_head slab_list; struct list_head slab_list;
}; };