[Mesa-dev] [PATCH 6/6] radeonsi: print LLVM IRs to ddebug logs
Nicolai Hähnle
nhaehnle at gmail.com
Mon Jul 4 19:23:03 UTC 2016
On 02.07.2016 19:20, Marek Olšák wrote:
> On Sat, Jul 2, 2016 at 11:44 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
>> On 01.07.2016 01:21, Marek Olšák wrote:
>>>
>>> From: Marek Olšák <marek.olsak at amd.com>
>>>
>>> Getting LLVM IRs of hanging shaders have never been easier.
>>> ---
>>> src/gallium/drivers/radeon/r600_pipe_common.c | 1 +
>>> src/gallium/drivers/radeon/r600_pipe_common.h | 1 +
>>> src/gallium/drivers/radeonsi/si_pipe.c | 3 +++
>>> src/gallium/drivers/radeonsi/si_pipe.h | 1 +
>>> src/gallium/drivers/radeonsi/si_shader.c | 12 ++++++++++++
>>> src/gallium/drivers/radeonsi/si_state_shaders.c | 9 ++++++++-
>>> 6 files changed, 26 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c
>>> b/src/gallium/drivers/radeon/r600_pipe_common.c
>>> index 5e981d6..74674e7 100644
>>> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
>>> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
>>> @@ -67,6 +67,7 @@ void radeon_shader_binary_clean(struct
>>> radeon_shader_binary *b)
>>> FREE(b->global_symbol_offsets);
>>> FREE(b->relocs);
>>> FREE(b->disasm_string);
>>> + FREE(b->llvm_ir_string);
>>> }
>>>
>>> /*
>>> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h
>>> b/src/gallium/drivers/radeon/r600_pipe_common.h
>>> index c145dc3..1ad69f8 100644
>>> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
>>> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
>>> @@ -155,6 +155,7 @@ struct radeon_shader_binary {
>>>
>>> /** Disassembled shader in a string. */
>>> char *disasm_string;
>>> + char *llvm_ir_string;
>>> };
>>>
>>> void radeon_shader_binary_init(struct radeon_shader_binary *b);
>>> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c
>>> b/src/gallium/drivers/radeonsi/si_pipe.c
>>> index f15e589..ad2a86a 100644
>>> --- a/src/gallium/drivers/radeonsi/si_pipe.c
>>> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
>>> @@ -139,6 +139,9 @@ static struct pipe_context *si_create_context(struct
>>> pipe_screen *screen,
>>> if (sscreen->b.debug_flags & DBG_CHECK_VM)
>>> flags |= PIPE_CONTEXT_DEBUG;
>>>
>>> + if (flags & PIPE_CONTEXT_DEBUG)
>>> + sscreen->record_llvm_ir = true; /* racy but not critical
>>> */
>>> +
>>> sctx->b.b.screen = screen; /* this must be set first */
>>> sctx->b.b.priv = priv;
>>> sctx->b.b.destroy = si_destroy_context;
>>> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h
>>> b/src/gallium/drivers/radeonsi/si_pipe.h
>>> index 9d15cbf..fc7e73e 100644
>>> --- a/src/gallium/drivers/radeonsi/si_pipe.h
>>> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
>>> @@ -87,6 +87,7 @@ struct si_screen {
>>>
>>> /* Whether shaders are monolithic (1-part) or separate (3-part).
>>> */
>>> bool use_monolithic_shaders;
>>> + bool record_llvm_ir;
>>>
>>> pipe_mutex shader_parts_mutex;
>>> struct si_shader_part *vs_prologs;
>>> diff --git a/src/gallium/drivers/radeonsi/si_shader.c
>>> b/src/gallium/drivers/radeonsi/si_shader.c
>>> index bba6a55..e2aae85 100644
>>> --- a/src/gallium/drivers/radeonsi/si_shader.c
>>> +++ b/src/gallium/drivers/radeonsi/si_shader.c
>>> @@ -6159,6 +6159,12 @@ void si_shader_dump(struct si_screen *sscreen,
>>> struct si_shader *shader,
>>> struct pipe_debug_callback *debug, unsigned processor,
>>> FILE *file)
>>> {
>>> + if (file != stderr && shader->binary.llvm_ir_string) {
>>> + fprintf(file, "\n%s - main shader part - LLVM IR:\n\n",
>>> + si_get_shader_name(shader, processor));
>>> + fprintf(file, "%s\n", shader->binary.llvm_ir_string);
>>> + }
>>> +
>>> if (file != stderr ||
>>> (r600_can_dump_shader(&sscreen->b, processor) &&
>>> !(sscreen->b.debug_flags & DBG_NO_ASM))) {
>>> @@ -6204,6 +6210,12 @@ int si_compile_llvm(struct si_screen *sscreen,
>>> }
>>> }
>>>
>>> + if (sscreen->record_llvm_ir) {
>>> + char *ir = LLVMPrintModuleToString(mod);
>>> + binary->llvm_ir_string = strdup(ir);
>>> + LLVMDisposeMessage(ir);
>>> + }
>>> +
>>> if (!si_replace_shader(count, binary)) {
>>> r = radeon_llvm_compile(mod, binary, tm, debug);
>>> if (r)
>>> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c
>>> b/src/gallium/drivers/radeonsi/si_state_shaders.c
>>> index 4bcdeb6..ed14288 100644
>>> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
>>> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
>>> @@ -96,6 +96,8 @@ static uint32_t *read_chunk(uint32_t *ptr, void **data,
>>> unsigned *size)
>>> {
>>> *size = *ptr++;
>>> assert(*data == NULL);
>>> + if (!*size)
>>> + return ptr;
>>> *data = malloc(*size);
>>> return read_data(ptr, *data, *size);
>>> }
>>> @@ -110,6 +112,8 @@ static void *si_get_shader_binary(struct si_shader
>>> *shader)
>>> unsigned relocs_size = shader->binary.reloc_count *
>>> sizeof(shader->binary.relocs[0]);
>>> unsigned disasm_size = strlen(shader->binary.disasm_string) + 1;
>>> + unsigned llvm_ir_size = shader->binary.llvm_ir_string ?
>>> + strlen(shader->binary.llvm_ir_string) + 1
>>> : 0;
>>
>>
>> I don't believe it's crashing right now, but this is a bit fragile: in the
>> case where llvm_ir_string is originally NULL, when the chunk is read back
>> one allocates a 0-sized buffer, which may be a non-NULL pointer at garbage.
>>
>> I'd be fine with fixing that by changing read_chunk accordingly.
>
> but read_chunk is already fixed above, isn't it?
>
> write_chunk writes size=0 and no data, read_chunk reads size=0,
> asserts (data == NULL) and doesn't allocate anything.
D'oh, my bad. This patch also
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
(and #5 as well, I think I forgot to send that out)
Nicolai
>
> Marek
>
More information about the mesa-dev
mailing list