SpirvShaderDebugger: Improve ASSERT() messages
DXC is producing duplicate definitions for local variables.
Give more context in the `ASSERT()` so it's easier to diagnose whats going wrong.
Bug: b/170378370
Change-Id: Ic8c8f24a6dbd8ce23e04eb4f0265363b44bc174c
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/49128
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Pipeline/SpirvShaderDebugger.cpp b/src/Pipeline/SpirvShaderDebugger.cpp
index 12588f9..25331f6 100644
--- a/src/Pipeline/SpirvShaderDebugger.cpp
+++ b/src/Pipeline/SpirvShaderDebugger.cpp
@@ -885,6 +885,17 @@
return scope->parent ? find<T>(scope->parent) : nullptr;
}
+inline const char *tostring(LocalVariable::Definition def)
+{
+ switch(def)
+ {
+ case LocalVariable::Definition::Undefined: return "Undefined";
+ case LocalVariable::Definition::Declaration: return "Declaration";
+ case LocalVariable::Definition::Values: return "Values";
+ default: return "<unknown>";
+ }
+}
+
} // namespace debug
} // anonymous namespace
@@ -1735,7 +1746,13 @@
decl->local->declaration = decl;
- ASSERT(decl->local->definition == debug::LocalVariable::Definition::Undefined);
+ ASSERT_MSG(decl->local->definition == debug::LocalVariable::Definition::Undefined,
+ "DebugLocalVariable '%s' declared at %s:%d was previously defined as %s, now again as %s",
+ decl->local->name.c_str(),
+ decl->local->source ? decl->local->source->file.c_str() : "<unknown>",
+ (int)decl->local->line,
+ tostring(decl->local->definition),
+ tostring(debug::LocalVariable::Definition::Declaration));
decl->local->definition = debug::LocalVariable::Definition::Declaration;
});
break;
@@ -1749,7 +1766,16 @@
{
value->local->definition = debug::LocalVariable::Definition::Values;
}
- ASSERT(value->local->definition == debug::LocalVariable::Definition::Values);
+ else
+ {
+ ASSERT_MSG(value->local->definition == debug::LocalVariable::Definition::Values,
+ "DebugLocalVariable '%s' declared at %s:%d was previously defined as %s, now again as %s",
+ value->local->name.c_str(),
+ value->local->source ? value->local->source->file.c_str() : "<unknown>",
+ (int)value->local->line,
+ tostring(value->local->definition),
+ tostring(debug::LocalVariable::Definition::Values));
+ }
auto node = &value->local->values;
for(uint32_t i = 8; i < insn.wordCount(); i++)