spirv-reader: Add a disassembler helper

This helped me debug a problem.

Change-Id: I665aaa482c6f20d24966f0990bfe4e15cdd82915
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33800
Commit-Queue: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Auto-Submit: David Neto <dneto@google.com>
diff --git a/src/reader/spirv/spirv_tools_helpers_test.cc b/src/reader/spirv/spirv_tools_helpers_test.cc
index 81dd5e7..4849a7a 100644
--- a/src/reader/spirv/spirv_tools_helpers_test.cc
+++ b/src/reader/spirv/spirv_tools_helpers_test.cc
@@ -26,8 +26,6 @@
 namespace spirv {
 namespace test {
 
-/// @returns the SPIR-V module assembled from the given text.  Numeric IDs
-/// are preserved.
 std::vector<uint32_t> Assemble(const std::string& spirv_assembly) {
   // TODO(dneto): Use ScopedTrace?
 
@@ -69,6 +67,23 @@
   return errors.str();
 }
 
+std::string Disassemble(const std::vector<uint32_t>& spirv_module) {
+  spvtools::SpirvTools tools(SPV_ENV_UNIVERSAL_1_0);
+  std::stringstream errors;
+  tools.SetMessageConsumer([&errors](spv_message_level_t, const char*,
+                                     const spv_position_t& position,
+                                     const char* message) {
+    errors << "disassmbly error:" << position.line << ":" << position.column
+           << ": " << message;
+  });
+
+  std::string result;
+  const auto success = tools.Disassemble(spirv_module, &result);
+  EXPECT_TRUE(success) << errors.str();
+
+  return result;
+}
+
 }  // namespace test
 }  // namespace spirv
 }  // namespace reader
diff --git a/src/reader/spirv/spirv_tools_helpers_test.h b/src/reader/spirv/spirv_tools_helpers_test.h
index ba4ad68..654d85a 100644
--- a/src/reader/spirv/spirv_tools_helpers_test.h
+++ b/src/reader/spirv/spirv_tools_helpers_test.h
@@ -24,14 +24,20 @@
 namespace spirv {
 namespace test {
 
+/// @param spirv_assembly SPIR-V assembly text
 /// @returns the SPIR-V module assembled from the given text.  Numeric IDs
 /// are preserved.
 std::vector<uint32_t> Assemble(const std::string& spirv_assembly);
 
 /// Attempts to assemble given SPIR-V assembly text.  Expect it to fail.
+/// @param spirv_assembly the SPIR-V assembly
 /// @returns the failure message.
 std::string AssembleFailure(const std::string& spirv_assembly);
 
+/// @param spirv_module a SPIR-V binary module
+/// @returns the disassembled module
+std::string Disassemble(const std::vector<uint32_t>& spirv_module);
+
 }  // namespace test
 }  // namespace spirv
 }  // namespace reader