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:
@@ -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");
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user