Use TestNamer in the SPIR-V backend.

This CL updates the SPIR-V generation tests to use the TestNamer.

Change-Id: I6a1d9a4c41f080ba3518509864bb06f1629ab0a9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/36941
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 071ceab..8736c59 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -278,8 +278,8 @@
 
 Builder::AccessorInfo::~AccessorInfo() {}
 
-Builder::Builder(ast::Module* mod)
-    : mod_(mod), namer_(std::make_unique<UnsafeNamer>(mod)), scope_stack_({}) {}
+Builder::Builder(ast::Module* mod, Namer* namer)
+    : mod_(mod), namer_(namer), scope_stack_({}) {}
 
 Builder::~Builder() = default;
 
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index 900af20..2c2c38d 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -85,7 +85,8 @@
 
   /// Constructor
   /// @param mod the module to generate from
-  explicit Builder(ast::Module* mod);
+  /// @param namer the namer to use
+  Builder(ast::Module* mod, Namer* namer);
   ~Builder();
 
   /// Generates the SPIR-V instructions for the given module
@@ -491,7 +492,7 @@
   Operand result_op();
 
   ast::Module* mod_;
-  std::unique_ptr<Namer> namer_;
+  Namer* namer_ = nullptr;
   std::string error_;
   uint32_t next_id_ = 1;
   uint32_t current_label_id_ = 0;
diff --git a/src/writer/spirv/builder_call_test.cc b/src/writer/spirv/builder_call_test.cc
index 51d9e9f..9a4cd8e 100644
--- a/src/writer/spirv/builder_call_test.cc
+++ b/src/writer/spirv/builder_call_test.cc
@@ -61,10 +61,10 @@
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 14u) << b.error();
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
-OpName %4 "a"
-OpName %5 "b"
-OpName %12 "main"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "test_a_func"
+OpName %4 "test_a"
+OpName %5 "test_b"
+OpName %12 "test_main"
 %2 = OpTypeFloat 32
 %1 = OpTypeFunction %2 %2 %2
 %11 = OpTypeVoid
@@ -110,10 +110,10 @@
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
 
   EXPECT_TRUE(b.GenerateStatement(expr)) << b.error();
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "a_func"
-OpName %5 "a"
-OpName %6 "b"
-OpName %12 "main"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "test_a_func"
+OpName %5 "test_a"
+OpName %6 "test_b"
+OpName %12 "test_main"
 %2 = OpTypeVoid
 %3 = OpTypeFloat 32
 %1 = OpTypeFunction %2 %3 %3
diff --git a/src/writer/spirv/builder_function_decoration_test.cc b/src/writer/spirv/builder_function_decoration_test.cc
index 16189d6..639e6f7 100644
--- a/src/writer/spirv/builder_function_decoration_test.cc
+++ b/src/writer/spirv/builder_function_decoration_test.cc
@@ -45,7 +45,7 @@
 
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
   EXPECT_EQ(DumpInstructions(b.entry_points()),
-            R"(OpEntryPoint Vertex %3 "main"
+            R"(OpEntryPoint Vertex %3 "test_main"
 )");
 }
 
@@ -105,10 +105,10 @@
   mod->AddGlobalVariable(v_wg);
 
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_in"
-OpName %4 "my_out"
-OpName %7 "my_wg"
-OpName %11 "main"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_my_in"
+OpName %4 "test_my_out"
+OpName %7 "test_my_wg"
+OpName %11 "test_main"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Input %3
@@ -122,7 +122,7 @@
 %9 = OpTypeFunction %10
 )");
   EXPECT_EQ(DumpInstructions(b.entry_points()),
-            R"(OpEntryPoint Vertex %11 "main"
+            R"(OpEntryPoint Vertex %11 "test_main"
 )");
 }
 
@@ -158,10 +158,10 @@
   mod->AddGlobalVariable(v_wg);
 
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_in"
-OpName %4 "my_out"
-OpName %7 "my_wg"
-OpName %11 "main"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_my_in"
+OpName %4 "test_my_out"
+OpName %7 "test_my_wg"
+OpName %11 "test_main"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Input %3
@@ -175,7 +175,7 @@
 %9 = OpTypeFunction %10
 )");
   EXPECT_EQ(DumpInstructions(b.entry_points()),
-            R"(OpEntryPoint Vertex %11 "main" %4 %1
+            R"(OpEntryPoint Vertex %11 "test_main" %4 %1
 )");
 }
 
@@ -235,12 +235,12 @@
   ASSERT_TRUE(b.GenerateFunction(func1)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func2)) << b.error();
   EXPECT_EQ(DumpBuilder(b),
-            R"(OpEntryPoint Fragment %3 "main1"
-OpEntryPoint Fragment %5 "main2"
+            R"(OpEntryPoint Fragment %3 "test_main1"
+OpEntryPoint Fragment %5 "test_main2"
 OpExecutionMode %3 OriginUpperLeft
 OpExecutionMode %5 OriginUpperLeft
-OpName %3 "main1"
-OpName %5 "main2"
+OpName %3 "test_main1"
+OpName %5 "test_main2"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index a50017b..69ebaee 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -50,7 +50,7 @@
                     ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -68,7 +68,7 @@
                     ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -89,8 +89,8 @@
   ASSERT_TRUE(td.DetermineFunction(func)) << td.error();
   ASSERT_TRUE(b.GenerateGlobalVariable(var_a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(func)) << b.error();
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "a"
-OpName %7 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "test_a"
+OpName %7 "test_a_func"
 %3 = OpTypeFloat 32
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -113,7 +113,7 @@
                     ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -136,9 +136,9 @@
   EXPECT_TRUE(td.DetermineFunction(func));
 
   ASSERT_TRUE(b.GenerateFunction(func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "a_func"
-OpName %5 "a"
-OpName %6 "b"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "test_a_func"
+OpName %5 "test_a"
+OpName %6 "test_b"
 %2 = OpTypeFloat 32
 %3 = OpTypeInt 32 1
 %1 = OpTypeFunction %2 %2 %3
@@ -160,7 +160,7 @@
                     ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -269,17 +269,17 @@
   ASSERT_TRUE(b.Build());
   EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
 OpMemoryModel Logical GLSL450
-OpEntryPoint GLCompute %7 "a"
-OpEntryPoint GLCompute %17 "b"
+OpEntryPoint GLCompute %7 "test_a"
+OpEntryPoint GLCompute %17 "test_b"
 OpExecutionMode %7 LocalSize 1 1 1
 OpExecutionMode %17 LocalSize 1 1 1
-OpName %3 "Data"
-OpMemberName %3 0 "d"
-OpName %1 "data"
-OpName %7 "a"
-OpName %14 "v"
-OpName %17 "b"
-OpName %21 "v"
+OpName %3 "test_Data"
+OpMemberName %3 0 "test_d"
+OpName %1 "test_data"
+OpName %7 "test_a"
+OpName %14 "test_v"
+OpName %17 "test_b"
+OpName %21 "test_v"
 OpDecorate %3 Block
 OpMemberDecorate %3 0 Offset 0
 OpDecorate %1 Binding 0
diff --git a/src/writer/spirv/builder_function_variable_test.cc b/src/writer/spirv/builder_function_variable_test.cc
index fef4b90..88ecc55 100644
--- a/src/writer/spirv/builder_function_variable_test.cc
+++ b/src/writer/spirv/builder_function_variable_test.cc
@@ -49,7 +49,7 @@
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Function %3
@@ -74,7 +74,7 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
@@ -103,7 +103,7 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %7 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %7 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 2
@@ -142,8 +142,8 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(v2)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "v"
-OpName %7 "v2"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_v"
+OpName %7 "test_v2"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 1
@@ -181,8 +181,8 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(v2)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "v"
-OpName %7 "v2"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_v"
+OpName %7 "test_v2"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 1
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 6d67e53..dd2a76d 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -52,7 +52,7 @@
 TEST_F(BuilderTest, GlobalVar_NoStorageClass) {
   auto* v = Var("var", ast::StorageClass::kNone, ty.f32);
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Private %3
@@ -64,7 +64,7 @@
 TEST_F(BuilderTest, GlobalVar_WithStorageClass) {
   auto* v = Var("var", ast::StorageClass::kOutput, ty.f32);
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Output %3
@@ -76,7 +76,7 @@
 TEST_F(BuilderTest, GlobalVar_WithStorageClass_Input) {
   auto* v = Var("var", ast::StorageClass::kInput, ty.f32);
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Input %3
@@ -95,7 +95,7 @@
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
@@ -118,7 +118,7 @@
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %5 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %5 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
@@ -183,7 +183,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 Location 5
 )");
@@ -202,7 +202,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 Binding 2
 OpDecorate %1 DescriptorSet 3
@@ -221,7 +221,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 BuiltIn Position
 )");
@@ -239,7 +239,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %2 SpecId 1200
 )");
@@ -257,7 +257,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 1200
 )");
@@ -275,7 +275,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %2 SpecId 0
 )");
@@ -293,7 +293,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 0
 )");
@@ -311,7 +311,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 0
 )");
@@ -329,7 +329,7 @@
                 });
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 0
 )");
@@ -392,10 +392,10 @@
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 OpMemberDecorate %3 1 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
-OpMemberName %3 0 "a"
-OpMemberName %3 1 "b"
-OpName %1 "b"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_A"
+OpMemberName %3 0 "test_a"
+OpMemberName %3 1 "test_b"
+OpName %1 "test_b"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4 %4
@@ -421,9 +421,9 @@
 
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
-OpMemberName %3 0 "a"
-OpName %1 "b"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_A"
+OpMemberName %3 0 "test_a"
+OpName %1 "test_b"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4
@@ -449,9 +449,9 @@
 
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
-OpMemberName %3 0 "a"
-OpName %1 "b"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_A"
+OpMemberName %3 0 "test_a"
+OpName %1 "test_b"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4
@@ -480,12 +480,12 @@
 
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
-OpMemberName %3 0 "a"
-OpName %1 "b"
-OpName %7 "A"
-OpMemberName %7 0 "a"
-OpName %5 "c"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "test_A"
+OpMemberName %3 0 "test_a"
+OpName %1 "test_b"
+OpName %7 "test_A"
+OpMemberName %7 0 "test_a"
+OpName %5 "test_c"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4
diff --git a/src/writer/spirv/builder_ident_expression_test.cc b/src/writer/spirv/builder_ident_expression_test.cc
index 453ef6b..1a92054 100644
--- a/src/writer/spirv/builder_ident_expression_test.cc
+++ b/src/writer/spirv/builder_ident_expression_test.cc
@@ -66,7 +66,7 @@
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Output %3
@@ -108,7 +108,7 @@
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Function %3
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index c2dde98..b47e1e5 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -45,6 +45,7 @@
 #include "src/type_determiner.h"
 #include "src/writer/spirv/builder.h"
 #include "src/writer/spirv/spv_dump.h"
+#include "src/writer/test_namer.h"
 
 namespace tint {
 namespace writer {
@@ -59,7 +60,8 @@
   }
 
   TypeDeterminer td{mod};
-  spirv::Builder b{mod};
+  TestNamer namer{mod};
+  spirv::Builder b{mod, &namer};
 };
 
 template <typename T>
@@ -479,8 +481,8 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 9u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%10 = OpExtInstImport "GLSL.std.450"
-OpName %1 "ident"
-OpName %7 "a_func"
+OpName %1 "test_ident"
+OpName %7 "test_a_func"
 %3 = OpTypeFloat 32
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -511,7 +513,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -538,7 +540,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -591,7 +593,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -615,7 +617,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -641,7 +643,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -672,7 +674,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -700,7 +702,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -736,7 +738,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -761,7 +763,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -789,7 +791,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -819,7 +821,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -848,7 +850,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -888,7 +890,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 1
@@ -915,7 +917,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 1
@@ -949,7 +951,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
@@ -976,7 +978,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 0
@@ -1010,7 +1012,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 1
@@ -1037,7 +1039,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 1
@@ -1072,7 +1074,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
@@ -1099,7 +1101,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 0
@@ -1134,7 +1136,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 1
@@ -1163,7 +1165,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 1
@@ -1197,7 +1199,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
@@ -1226,7 +1228,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
+OpName %3 "test_a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 0
@@ -1260,8 +1262,8 @@
   EXPECT_EQ(b.GenerateCallExpression(expr), 11u) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(%12 = OpExtInstImport "GLSL.std.450"
-OpName %3 "a_func"
-OpName %5 "var"
+OpName %3 "test_a_func"
+OpName %5 "test_var"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %9 = OpTypeFloat 32
diff --git a/src/writer/spirv/builder_intrinsic_texture_test.cc b/src/writer/spirv/builder_intrinsic_texture_test.cc
index a26bedd..1651f12 100644
--- a/src/writer/spirv/builder_intrinsic_texture_test.cc
+++ b/src/writer/spirv/builder_intrinsic_texture_test.cc
@@ -24,6 +24,7 @@
 #include "src/type_determiner.h"
 #include "src/writer/spirv/builder.h"
 #include "src/writer/spirv/spv_dump.h"
+#include "src/writer/test_namer.h"
 
 namespace tint {
 namespace writer {
@@ -2708,7 +2709,8 @@
   }
 
   TypeDeterminer td{mod};
-  spirv::Builder b{mod};
+  TestNamer namer{mod};
+  spirv::Builder b{mod, &namer};
 };
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index 7150529..8dcdd40 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -103,9 +103,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
-OpName %5 "a"
-OpName %7 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "test_v"
+OpName %5 "test_a"
+OpName %7 "test_a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -164,9 +164,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
-OpName %5 "a"
-OpName %7 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "test_v"
+OpName %5 "test_a"
+OpName %7 "test_a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -238,9 +238,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
-OpName %5 "a"
-OpName %7 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "test_v"
+OpName %5 "test_a"
+OpName %7 "test_a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -321,9 +321,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
-OpName %5 "a"
-OpName %7 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "test_v"
+OpName %5 "test_a"
+OpName %7 "test_a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -431,9 +431,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
-OpName %5 "a"
-OpName %7 "a_func"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "test_v"
+OpName %5 "test_a"
+OpName %7 "test_a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index db2f45a..6445c2c 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -251,7 +251,7 @@
   EXPECT_EQ(id, 1u);
 
   EXPECT_EQ(b.types().size(), 1u);
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_S"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeStruct
 )");
@@ -269,8 +269,8 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeStruct %2
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_struct"
-OpMemberName %1 0 "a"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_my_struct"
+OpMemberName %1 0 "test_a"
 )");
 }
 
@@ -289,8 +289,8 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeStruct %2
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_struct"
-OpMemberName %1 0 "a"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_my_struct"
+OpMemberName %1 0 "test_a"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 Block
 )");
@@ -310,9 +310,9 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeStruct %2 %2
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
-OpMemberName %1 0 "a"
-OpMemberName %1 1 "b"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_S"
+OpMemberName %1 0 "test_a"
+OpMemberName %1 1 "test_b"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %1 0 Offset 0
 OpMemberDecorate %1 1 Offset 8
@@ -340,10 +340,10 @@
 %7 = OpTypeMatrix %8 4
 %1 = OpTypeStruct %2 %5 %7
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
-OpMemberName %1 0 "a"
-OpMemberName %1 1 "b"
-OpMemberName %1 2 "c"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_S"
+OpMemberName %1 0 "test_a"
+OpMemberName %1 1 "test_b"
+OpMemberName %1 2 "test_c"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), "");
 }
@@ -370,10 +370,10 @@
 %7 = OpTypeMatrix %8 4
 %1 = OpTypeStruct %2 %5 %7
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
-OpMemberName %1 0 "a"
-OpMemberName %1 1 "b"
-OpMemberName %1 2 "c"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_S"
+OpMemberName %1 0 "test_a"
+OpMemberName %1 1 "test_b"
+OpMemberName %1 2 "test_c"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %1 0 Offset 0
 OpMemberDecorate %1 0 ColMajor
@@ -426,10 +426,10 @@
 %11 = OpTypeRuntimeArray %12
 %1 = OpTypeStruct %2 %8 %11
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
-OpMemberName %1 0 "a"
-OpMemberName %1 1 "b"
-OpMemberName %1 2 "c"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "test_S"
+OpMemberName %1 0 "test_a"
+OpMemberName %1 1 "test_b"
+OpMemberName %1 2 "test_c"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %1 0 Offset 0
 OpMemberDecorate %1 0 ColMajor
diff --git a/src/writer/spirv/generator.cc b/src/writer/spirv/generator.cc
index c28cb13..9a435e4 100644
--- a/src/writer/spirv/generator.cc
+++ b/src/writer/spirv/generator.cc
@@ -22,13 +22,15 @@
 
 Generator::Generator(ast::Module module)
     : writer::Writer(std::move(module)),
-      builder_(std::make_unique<Builder>(&module_)),
+      namer_(std::make_unique<UnsafeNamer>(&module_)),
+      builder_(std::make_unique<Builder>(&module_, namer_.get())),
       writer_(std::make_unique<BinaryWriter>()) {}
 
 Generator::~Generator() = default;
 
 void Generator::Reset() {
-  builder_ = std::make_unique<Builder>(&module_);
+  namer_->Reset();
+  builder_ = std::make_unique<Builder>(&module_, namer_.get());
   writer_ = std::make_unique<BinaryWriter>();
 }
 
diff --git a/src/writer/spirv/generator.h b/src/writer/spirv/generator.h
index f5968b2..b1f37d7 100644
--- a/src/writer/spirv/generator.h
+++ b/src/writer/spirv/generator.h
@@ -20,6 +20,7 @@
 #include <vector>
 
 #include "src/ast/module.h"
+#include "src/namer.h"
 #include "src/writer/spirv/binary_writer.h"
 #include "src/writer/spirv/builder.h"
 #include "src/writer/writer.h"
@@ -54,6 +55,7 @@
   const std::vector<uint32_t>& result() const { return writer_->result(); }
 
  private:
+  std::unique_ptr<Namer> namer_;
   std::unique_ptr<Builder> builder_;
   std::unique_ptr<BinaryWriter> writer_;
 };
diff --git a/src/writer/spirv/test_helper.h b/src/writer/spirv/test_helper.h
index cbc3d0e..fcec303 100644
--- a/src/writer/spirv/test_helper.h
+++ b/src/writer/spirv/test_helper.h
@@ -23,6 +23,7 @@
 #include "src/ast/module.h"
 #include "src/type_determiner.h"
 #include "src/writer/spirv/builder.h"
+#include "src/writer/test_namer.h"
 
 namespace tint {
 namespace writer {
@@ -32,11 +33,13 @@
 template <typename BASE>
 class TestHelperBase : public ast::BuilderWithModule, public BASE {
  public:
-  TestHelperBase() : td(mod), b(mod) {}
+  TestHelperBase() : td(mod), namer(mod), b(mod, &namer) {}
   ~TestHelperBase() override = default;
 
   /// The type determiner
   TypeDeterminer td;
+  /// The test namer
+  TestNamer namer;
   /// The generator
   spirv::Builder b;