mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
nir: Add variable debug info to instructions
Allows for annotating defs with variable names. Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33141>
This commit is contained in:
parent
ec89f88722
commit
ce0f30b230
4 changed files with 47 additions and 3 deletions
|
|
@ -2752,6 +2752,11 @@ typedef struct nir_instr_debug_info {
|
||||||
/* Line in the output of nir_print_shader. 0 if uninitialized. */
|
/* Line in the output of nir_print_shader. 0 if uninitialized. */
|
||||||
uint32_t nir_line;
|
uint32_t nir_line;
|
||||||
|
|
||||||
|
/* Contains the name of the variable/input/... that was lowered to this
|
||||||
|
* def by a pass like nir_lower_vars_to_ssa.
|
||||||
|
*/
|
||||||
|
char *variable_name;
|
||||||
|
|
||||||
/* The nir_instr has to be the last field since it has a varying size. */
|
/* The nir_instr has to be the last field since it has a varying size. */
|
||||||
nir_instr instr;
|
nir_instr instr;
|
||||||
} nir_instr_debug_info;
|
} nir_instr_debug_info;
|
||||||
|
|
|
||||||
|
|
@ -249,6 +249,7 @@ clone_debug_info(clone_state *state, nir_instr *ninstr, const nir_instr *instr)
|
||||||
const nir_instr_debug_info *debug_info = nir_instr_get_debug_info((void *)instr);
|
const nir_instr_debug_info *debug_info = nir_instr_get_debug_info((void *)instr);
|
||||||
|
|
||||||
ndebug_info->filename = clone_string(state, debug_info->filename);
|
ndebug_info->filename = clone_string(state, debug_info->filename);
|
||||||
|
ndebug_info->variable_name = clone_string(state, debug_info->variable_name);
|
||||||
|
|
||||||
ndebug_info->line = debug_info->line;
|
ndebug_info->line = debug_info->line;
|
||||||
ndebug_info->column = debug_info->column;
|
ndebug_info->column = debug_info->column;
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,12 @@ print_def(nir_def *def, print_state *state)
|
||||||
divergence_status(state, def->divergent),
|
divergence_status(state, def->divergent),
|
||||||
def->bit_size, sizes[def->num_components],
|
def->bit_size, sizes[def->num_components],
|
||||||
padding, "", state->def_prefix, def->index);
|
padding, "", state->def_prefix, def->index);
|
||||||
|
|
||||||
|
if (state->shader->has_debug_info) {
|
||||||
|
nir_instr_debug_info *debug_info = nir_instr_get_debug_info(def->parent_instr);
|
||||||
|
if (debug_info->variable_name)
|
||||||
|
fprintf(fp, ".%s", debug_info->variable_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
|
|
@ -400,6 +406,12 @@ print_src(const nir_src *src, print_state *state, nir_alu_type src_type)
|
||||||
fprintf(fp, "%s%u", state->def_prefix, src->ssa->index);
|
fprintf(fp, "%s%u", state->def_prefix, src->ssa->index);
|
||||||
nir_instr *instr = src->ssa->parent_instr;
|
nir_instr *instr = src->ssa->parent_instr;
|
||||||
|
|
||||||
|
if (state->shader->has_debug_info) {
|
||||||
|
nir_instr_debug_info *debug_info = nir_instr_get_debug_info(instr);
|
||||||
|
if (debug_info->variable_name)
|
||||||
|
fprintf(fp, ".%s", debug_info->variable_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (instr->type == nir_instr_type_load_const && !NIR_DEBUG(PRINT_NO_INLINE_CONSTS)) {
|
if (instr->type == nir_instr_type_load_const && !NIR_DEBUG(PRINT_NO_INLINE_CONSTS)) {
|
||||||
nir_load_const_instr *load_const = nir_instr_as_load_const(instr);
|
nir_load_const_instr *load_const = nir_instr_as_load_const(instr);
|
||||||
fprintf(fp, " ");
|
fprintf(fp, " ");
|
||||||
|
|
|
||||||
|
|
@ -1605,6 +1605,11 @@ read_call(read_ctx *ctx)
|
||||||
return call;
|
return call;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum nir_serialize_debug_info_flags {
|
||||||
|
NIR_SERIALIZE_FILENAME = 1 << 0,
|
||||||
|
NIR_SERIALIZE_VARIABLE_NAME = 1 << 1,
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_debug_info(write_ctx *ctx, const nir_instr *instr)
|
write_debug_info(write_ctx *ctx, const nir_instr *instr)
|
||||||
{
|
{
|
||||||
|
|
@ -1616,9 +1621,17 @@ write_debug_info(write_ctx *ctx, const nir_instr *instr)
|
||||||
|
|
||||||
blob_write_uint32(ctx->blob, debug_info->nir_line);
|
blob_write_uint32(ctx->blob, debug_info->nir_line);
|
||||||
|
|
||||||
blob_write_uint8(ctx->blob, !!debug_info->filename);
|
enum nir_serialize_debug_info_flags flags = 0;
|
||||||
|
if (debug_info->filename)
|
||||||
|
flags |= NIR_SERIALIZE_FILENAME;
|
||||||
|
if (debug_info->variable_name)
|
||||||
|
flags |= NIR_SERIALIZE_VARIABLE_NAME;
|
||||||
|
blob_write_uint8(ctx->blob, flags);
|
||||||
|
|
||||||
if (debug_info->filename)
|
if (debug_info->filename)
|
||||||
blob_write_string(ctx->blob, debug_info->filename);
|
blob_write_string(ctx->blob, debug_info->filename);
|
||||||
|
if (debug_info->variable_name)
|
||||||
|
blob_write_string(ctx->blob, debug_info->variable_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -1632,8 +1645,9 @@ read_debug_info(read_ctx *ctx, nir_instr_debug_info *debug_info)
|
||||||
|
|
||||||
debug_info->nir_line = blob_read_uint32(ctx->blob);
|
debug_info->nir_line = blob_read_uint32(ctx->blob);
|
||||||
|
|
||||||
bool has_filename = blob_read_uint8(ctx->blob);
|
enum nir_serialize_debug_info_flags flags = blob_read_uint8(ctx->blob);
|
||||||
if (has_filename) {
|
|
||||||
|
if (flags & NIR_SERIALIZE_FILENAME) {
|
||||||
const char *filename = blob_read_string(ctx->blob);
|
const char *filename = blob_read_string(ctx->blob);
|
||||||
|
|
||||||
struct hash_entry *entry = _mesa_hash_table_search(ctx->strings, filename);
|
struct hash_entry *entry = _mesa_hash_table_search(ctx->strings, filename);
|
||||||
|
|
@ -1644,6 +1658,18 @@ read_debug_info(read_ctx *ctx, nir_instr_debug_info *debug_info)
|
||||||
_mesa_hash_table_insert(ctx->strings, filename, debug_info->filename);
|
_mesa_hash_table_insert(ctx->strings, filename, debug_info->filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & NIR_SERIALIZE_VARIABLE_NAME) {
|
||||||
|
const char *variable_name = blob_read_string(ctx->blob);
|
||||||
|
|
||||||
|
struct hash_entry *entry = _mesa_hash_table_search(ctx->strings, variable_name);
|
||||||
|
if (entry) {
|
||||||
|
debug_info->variable_name = entry->data;
|
||||||
|
} else {
|
||||||
|
debug_info->variable_name = ralloc_strdup(ctx->nir, variable_name);
|
||||||
|
_mesa_hash_table_insert(ctx->strings, variable_name, debug_info->variable_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue