Add SPIR-V dump to the SPIR-V generator

This Cl adds utility classes to dump out SPIR-V disassembly of the
builder and instructions.

Bug: tint:5
Change-Id: Ib4c57025ac63cb0be456bd819461c98ffa94367f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/17560
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/spirv/builder_test.cc b/src/writer/spirv/builder_test.cc
index 8d06910..f92f62e 100644
--- a/src/writer/spirv/builder_test.cc
+++ b/src/writer/spirv/builder_test.cc
@@ -21,6 +21,7 @@
 #include "spirv/unified1/spirv.hpp11"
 #include "src/ast/import.h"
 #include "src/ast/module.h"
+#include "src/writer/spirv/spv_dump.h"
 
 namespace tint {
 namespace writer {
@@ -36,28 +37,21 @@
   ASSERT_TRUE(b.Build(m));
   ASSERT_EQ(b.preamble().size(), 4);
 
-  auto pre = b.preamble();
-  EXPECT_EQ(pre[0].opcode(), spv::Op::OpCapability);
-  EXPECT_EQ(pre[0].operands()[0].to_i(), SpvCapabilityShader);
-  EXPECT_EQ(pre[1].opcode(), spv::Op::OpCapability);
-  EXPECT_EQ(pre[1].operands()[0].to_i(), SpvCapabilityVulkanMemoryModel);
-  EXPECT_EQ(pre[2].opcode(), spv::Op::OpExtInstImport);
-  EXPECT_EQ(pre[2].operands()[1].to_s(), "GLSL.std.450");
-  EXPECT_EQ(pre[3].opcode(), spv::Op::OpMemoryModel);
+  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
+OpCapability VulkanMemoryModel
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical Vulkan
+)");
 }
 
 TEST_F(BuilderTest, InsertsPreambleWithoutImport) {
   ast::Module m;
   Builder b;
   ASSERT_TRUE(b.Build(m));
-  ASSERT_EQ(b.preamble().size(), 3);
-
-  auto pre = b.preamble();
-  EXPECT_EQ(pre[0].opcode(), spv::Op::OpCapability);
-  EXPECT_EQ(pre[0].operands()[0].to_i(), SpvCapabilityShader);
-  EXPECT_EQ(pre[1].opcode(), spv::Op::OpCapability);
-  EXPECT_EQ(pre[1].operands()[0].to_i(), SpvCapabilityVulkanMemoryModel);
-  EXPECT_EQ(pre[2].opcode(), spv::Op::OpMemoryModel);
+  EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
+OpCapability VulkanMemoryModel
+OpMemoryModel Logical Vulkan
+)");
 }
 
 TEST_F(BuilderTest, TracksIdBounds) {