On Sun, May 15, 2016 at 12:48 PM, Connor Abbott <cwabbo...@gmail.com> wrote: > On Sat, May 14, 2016 at 3:47 PM, Rob Clark <robdcl...@gmail.com> wrote: >> From: Rob Clark <robcl...@freedesktop.org> >> >> Log all the errors, and at the end dump the shader w/ error annotations >> to make it easier to see where the problems are. >> >> Signed-off-by: Rob Clark <robcl...@freedesktop.org> >> --- >> src/compiler/nir/nir_validate.c | 58 >> +++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 58 insertions(+) >> >> diff --git a/src/compiler/nir/nir_validate.c >> b/src/compiler/nir/nir_validate.c >> index 84334d4..a26f480 100644 >> --- a/src/compiler/nir/nir_validate.c >> +++ b/src/compiler/nir/nir_validate.c >> @@ -69,6 +69,9 @@ typedef struct { >> /* the current instruction being validated */ >> nir_instr *instr; >> >> + /* the current variable being validated */ >> + nir_variable *var; >> + >> /* the current basic block being validated */ >> nir_block *block; >> >> @@ -95,8 +98,29 @@ typedef struct { >> >> /* map of local variable -> function implementation where it is defined >> */ >> struct hash_table *var_defs; >> + >> + /* map of instruction/var/etc to failed assert string */ >> + struct hash_table *errors; >> } validate_state; >> >> +static void >> +log_error(validate_state *state, const char *failed) >> +{ >> + const void *obj; >> + >> + if (state->instr) >> + obj = state->instr; >> + else if (state->var) >> + obj = state->var; >> + else >> + obj = failed; >> + >> + _mesa_hash_table_insert(state->errors, obj, (void *)failed); >> +} >> + >> +#undef assert >> +#define assert(x) do { if (!(x)) log_error(state, "error: "#x); } while (0) > > Redefining assert here, and also implicitly using "state", isn't so > great. I'd rather we first did s/assert(foo)/validate_assert(foo, > state)/ before this patch.
fair enough, just wanted to make sure folks liked the basic idea before much-churn.. although I think I'd go w/ s/assert(/validate_assert(state, /... (ie. state as first arg) BR, -R >> + >> static void validate_src(nir_src *src, validate_state *state); >> >> static void >> @@ -901,6 +925,8 @@ postvalidate_reg_decl(nir_register *reg, validate_state >> *state) >> static void >> validate_var_decl(nir_variable *var, bool is_global, validate_state *state) >> { >> + state->var = var; >> + >> assert(is_global == nir_variable_is_global(var)); >> >> /* Must have exactly one mode set */ >> @@ -914,6 +940,8 @@ validate_var_decl(nir_variable *var, bool is_global, >> validate_state *state) >> if (!is_global) { >> _mesa_hash_table_insert(state->var_defs, var, state->impl); >> } >> + >> + state->var = NULL; >> } >> >> static bool >> @@ -1042,7 +1070,12 @@ init_validate_state(validate_state *state) >> state->regs_found = NULL; >> state->var_defs = _mesa_hash_table_create(NULL, _mesa_hash_pointer, >> _mesa_key_pointer_equal); >> + state->errors = _mesa_hash_table_create(NULL, _mesa_hash_pointer, >> + _mesa_key_pointer_equal); >> + >> state->loop = NULL; >> + state->instr = NULL; >> + state->var = NULL; >> } >> >> static void >> @@ -1053,6 +1086,28 @@ destroy_validate_state(validate_state *state) >> free(state->ssa_defs_found); >> free(state->regs_found); >> _mesa_hash_table_destroy(state->var_defs, NULL); >> + _mesa_hash_table_destroy(state->errors, NULL); >> +} >> + >> +static void >> +dump_errors(validate_state *state) >> +{ >> + struct hash_table *errors = state->errors; >> + >> + fprintf(stderr, "%d errors:\n", _mesa_hash_table_num_entries(errors)); >> + >> + nir_print_shader_annotated(state->shader, stderr, errors); >> + >> + if (_mesa_hash_table_num_entries(errors) > 0) { >> + fprintf(stderr, "%d additional errors:\n", >> + _mesa_hash_table_num_entries(errors)); >> + struct hash_entry *entry; >> + hash_table_foreach(errors, entry) { >> + fprintf(stderr, "%s\n", (char *)entry->data); >> + } >> + } >> + >> + abort(); >> } >> >> void >> @@ -1112,6 +1167,9 @@ nir_validate_shader(nir_shader *shader) >> postvalidate_reg_decl(reg, &state); >> } >> >> + if (_mesa_hash_table_num_entries(state.errors) > 0) >> + dump_errors(&state); >> + >> destroy_validate_state(&state); >> } >> >> -- >> 2.5.5 >> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev