nir/print: add support for print annotations

Caller can pass a hashtable mapping NIR object (currently instr or var,
but I guess others could be added as needed) to annotation msg to print
inline with the shader dump.  As the annotation msg is printed, it is
removed from the hashtable to give the caller a way to know about any
unassociated msgs.

This is used in the next patch, for nir_validate to try to associate
error msgs to nir_print dump.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
Reviewed-by: Eduardo Lima Mitev <elima@igalia.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
This commit is contained in:
Rob Clark
2016-05-14 15:37:32 -04:00
parent e5e412cd27
commit a0ef26c1c2
2 changed files with 35 additions and 1 deletions

View File

@@ -2213,6 +2213,7 @@ unsigned nir_index_instrs(nir_function_impl *impl);
void nir_index_blocks(nir_function_impl *impl); void nir_index_blocks(nir_function_impl *impl);
void nir_print_shader(nir_shader *shader, FILE *fp); void nir_print_shader(nir_shader *shader, FILE *fp);
void nir_print_shader_annotated(nir_shader *shader, FILE *fp, struct hash_table *errors);
void nir_print_instr(const nir_instr *instr, FILE *fp); void nir_print_instr(const nir_instr *instr, FILE *fp);
nir_shader *nir_shader_clone(void *mem_ctx, const nir_shader *s); nir_shader *nir_shader_clone(void *mem_ctx, const nir_shader *s);

View File

@@ -53,8 +53,30 @@ typedef struct {
/* an index used to make new non-conflicting names */ /* an index used to make new non-conflicting names */
unsigned index; unsigned index;
/**
* Optional table of annotations mapping nir object
* (such as instr or var) to message to print.
*/
struct hash_table *annotations;
} print_state; } print_state;
static void
print_annotation(print_state *state, void *obj)
{
if (!state->annotations)
return;
struct hash_entry *entry = _mesa_hash_table_search(state->annotations, obj);
if (!entry)
return;
const char *note = entry->data;
_mesa_hash_table_remove(state->annotations, entry);
fprintf(stderr, "%s\n\n", note);
}
static void static void
print_register(nir_register *reg, print_state *state) print_register(nir_register *reg, print_state *state)
{ {
@@ -413,6 +435,7 @@ print_var_decl(nir_variable *var, print_state *state)
} }
fprintf(fp, "\n"); fprintf(fp, "\n");
print_annotation(state, var);
} }
static void static void
@@ -924,6 +947,7 @@ print_block(nir_block *block, print_state *state, unsigned tabs)
nir_foreach_instr(instr, block) { nir_foreach_instr(instr, block) {
print_instr(instr, state, tabs); print_instr(instr, state, tabs);
fprintf(fp, "\n"); fprintf(fp, "\n");
print_annotation(state, instr);
} }
print_tabs(tabs, fp); print_tabs(tabs, fp);
@@ -1096,11 +1120,14 @@ destroy_print_state(print_state *state)
} }
void void
nir_print_shader(nir_shader *shader, FILE *fp) nir_print_shader_annotated(nir_shader *shader, FILE *fp,
struct hash_table *annotations)
{ {
print_state state; print_state state;
init_print_state(&state, shader, fp); init_print_state(&state, shader, fp);
state.annotations = annotations;
fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->stage)); fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->stage));
if (shader->info.name) if (shader->info.name)
@@ -1149,6 +1176,12 @@ nir_print_shader(nir_shader *shader, FILE *fp)
destroy_print_state(&state); destroy_print_state(&state);
} }
void
nir_print_shader(nir_shader *shader, FILE *fp)
{
nir_print_shader_annotated(shader, fp, NULL);
}
void void
nir_print_instr(const nir_instr *instr, FILE *fp) nir_print_instr(const nir_instr *instr, FILE *fp)
{ {