summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_print.c
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2016-05-14 15:37:32 -0400
committerRob Clark <[email protected]>2016-05-17 10:05:20 -0400
commita0ef26c1c2f0fcdebfa2699817cf63f644df8155 (patch)
tree11eedcc553860aef304327910ac8daf4e2b9ae7d /src/compiler/nir/nir_print.c
parente5e412cd272989fa801a027ab5dce7de48eb79c6 (diff)
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 <[email protected]> Reviewed-by: Eduardo Lima Mitev <[email protected]> Reviewed-by: Connor Abbott <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_print.c')
-rw-r--r--src/compiler/nir/nir_print.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c
index 583f66c2b08..021f0d618d2 100644
--- a/src/compiler/nir/nir_print.c
+++ b/src/compiler/nir/nir_print.c
@@ -53,9 +53,31 @@ typedef struct {
/* an index used to make new non-conflicting names */
unsigned index;
+
+ /**
+ * Optional table of annotations mapping nir object
+ * (such as instr or var) to message to print.
+ */
+ struct hash_table *annotations;
} 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
print_register(nir_register *reg, print_state *state)
{
FILE *fp = state->fp;
@@ -413,6 +435,7 @@ print_var_decl(nir_variable *var, print_state *state)
}
fprintf(fp, "\n");
+ print_annotation(state, var);
}
static void
@@ -924,6 +947,7 @@ print_block(nir_block *block, print_state *state, unsigned tabs)
nir_foreach_instr(instr, block) {
print_instr(instr, state, tabs);
fprintf(fp, "\n");
+ print_annotation(state, instr);
}
print_tabs(tabs, fp);
@@ -1096,11 +1120,14 @@ destroy_print_state(print_state *state)
}
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;
init_print_state(&state, shader, fp);
+ state.annotations = annotations;
+
fprintf(fp, "shader: %s\n", gl_shader_stage_name(shader->stage));
if (shader->info.name)
@@ -1150,6 +1177,12 @@ nir_print_shader(nir_shader *shader, FILE *fp)
}
void
+nir_print_shader(nir_shader *shader, FILE *fp)
+{
+ nir_print_shader_annotated(shader, fp, NULL);
+}
+
+void
nir_print_instr(const nir_instr *instr, FILE *fp)
{
print_state state = {