transform/VertexPulling: s/_tint/tint

Don't use a leading underscore in identifiers. Tint cannot parse these, they're illegal in MSL.

Bug: tint:640
Change-Id: I6e923cf3317a646cc5f4f2a10a7a522036000c70
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/47634
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index df00a17..af4f00b 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -48,7 +48,6 @@
   CloneContext& ctx;
   VertexPulling::Config const cfg;
   std::unordered_map<uint32_t, ast::Variable*> location_to_var;
-  std::vector<LocationReplacement> location_replacements;
   Symbol vertex_index_name;
   Symbol instance_index_name;
   Symbol pulling_position_name;
@@ -60,7 +59,7 @@
   Symbol GetVertexBufferName(uint32_t index) {
     return utils::GetOrCreate(vertex_buffer_names, index, [&] {
       static const char kVertexBufferNamePrefix[] =
-          "_tint_pulling_vertex_buffer_";
+          "tint_pulling_vertex_buffer_";
       return ctx.dst->Symbols().New(kVertexBufferNamePrefix +
                                     std::to_string(index));
     });
@@ -69,7 +68,7 @@
   /// Lazily generates the pulling position symbol
   Symbol GetPullingPositionName() {
     if (!pulling_position_name.IsValid()) {
-      static const char kPullingPosVarName[] = "_tint_pulling_pos";
+      static const char kPullingPosVarName[] = "tint_pulling_pos";
       pulling_position_name = ctx.dst->Symbols().New(kPullingPosVarName);
     }
     return pulling_position_name;
@@ -78,7 +77,7 @@
   /// Lazily generates the structure buffer symbol
   Symbol GetStructBufferName() {
     if (!struct_buffer_name.IsValid()) {
-      static const char kStructBufferName[] = "_tint_vertex_data";
+      static const char kStructBufferName[] = "tint_vertex_data";
       struct_buffer_name = ctx.dst->Symbols().New(kStructBufferName);
     }
     return struct_buffer_name;
@@ -115,7 +114,7 @@
     }
 
     // We didn't find a vertex index builtin, so create one
-    static const char kDefaultVertexIndexName[] = "_tint_pulling_vertex_index";
+    static const char kDefaultVertexIndexName[] = "tint_pulling_vertex_index";
     vertex_index_name = ctx.dst->Symbols().New(kDefaultVertexIndexName);
 
     ctx.dst->Global(
@@ -158,7 +157,7 @@
 
     // We didn't find an instance index builtin, so create one
     static const char kDefaultInstanceIndexName[] =
-        "_tint_pulling_instance_index";
+        "tint_pulling_instance_index";
     instance_index_name = ctx.dst->Symbols().New(kDefaultInstanceIndexName);
 
     ctx.dst->Global(instance_index_name, ctx.dst->ty.u32(),
@@ -187,8 +186,7 @@
                                            ctx.Clone(v->declared_type()),
                                            ast::StorageClass::kPrivate);
           location_to_var[location] = replacement;
-          location_replacements.emplace_back(
-              LocationReplacement{v, replacement});
+          ctx.Replace(v, replacement);
           break;
         }
       }
@@ -415,15 +413,17 @@
   // following stages will pass
 
   CloneContext ctx(&out, in);
+
+  // Start by cloning all the symbols. This ensures that the authored symbols
+  // won't get renamed if they collide with new symbols below.
+  ctx.CloneSymbols();
+
   State state{ctx, cfg};
   state.FindOrInsertVertexIndexIfUsed();
   state.FindOrInsertInstanceIndexIfUsed();
   state.ConvertVertexInputVariablesToPrivate();
   state.AddVertexStorageBuffers();
 
-  for (auto& replacement : state.location_replacements) {
-    ctx.Replace(replacement.from, replacement.to);
-  }
   ctx.ReplaceAll([&](ast::Function* f) -> ast::Function* {
     if (f == func) {
       return CloneWithStatementsAtStart(&ctx, f,
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index ce01f87..827b6d4 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -81,13 +81,13 @@
   auto* expect = R"(
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
+    var tint_pulling_pos : u32;
   }
 }
 )";
@@ -111,23 +111,23 @@
 )";
 
   auto* expect = R"(
-[[builtin(vertex_index)]] var<in> _tint_pulling_vertex_index : u32;
+[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index : u32;
 
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), group(4)]] var<storage> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage> tint_pulling_vertex_buffer_0 : TintVertexData;
 
 var<private> var_a : f32;
 
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 4u) + 0u);
-    var_a = bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[(_tint_pulling_pos / 4u)]);
+    var tint_pulling_pos : u32;
+    tint_pulling_pos = ((tint_pulling_vertex_index * 4u) + 0u);
+    var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
   }
 }
 )";
@@ -153,23 +153,23 @@
 )";
 
   auto* expect = R"(
-[[builtin(instance_index)]] var<in> _tint_pulling_instance_index : u32;
+[[builtin(instance_index)]] var<in> tint_pulling_instance_index : u32;
 
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), group(4)]] var<storage> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage> tint_pulling_vertex_buffer_0 : TintVertexData;
 
 var<private> var_a : f32;
 
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
-    _tint_pulling_pos = ((_tint_pulling_instance_index * 4u) + 0u);
-    var_a = bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[(_tint_pulling_pos / 4u)]);
+    var tint_pulling_pos : u32;
+    tint_pulling_pos = ((tint_pulling_instance_index * 4u) + 0u);
+    var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
   }
 }
 )";
@@ -195,23 +195,23 @@
 )";
 
   auto* expect = R"(
-[[builtin(vertex_index)]] var<in> _tint_pulling_vertex_index : u32;
+[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index : u32;
 
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), group(5)]] var<storage> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(5)]] var<storage> tint_pulling_vertex_buffer_0 : TintVertexData;
 
 var<private> var_a : f32;
 
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 4u) + 0u);
-    var_a = bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[(_tint_pulling_pos / 4u)]);
+    var tint_pulling_pos : u32;
+    tint_pulling_pos = ((tint_pulling_vertex_index * 4u) + 0u);
+    var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
   }
 }
 )";
@@ -244,12 +244,12 @@
   auto* expect = R"(
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), group(4)]] var<storage> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[binding(1), group(4)]] var<storage> _tint_pulling_vertex_buffer_1 : TintVertexData;
+[[binding(1), group(4)]] var<storage> tint_pulling_vertex_buffer_1 : TintVertexData;
 
 var<private> var_a : f32;
 
@@ -262,11 +262,11 @@
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
-    _tint_pulling_pos = ((custom_vertex_index * 4u) + 0u);
-    var_a = bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[(_tint_pulling_pos / 4u)]);
-    _tint_pulling_pos = ((custom_instance_index * 4u) + 0u);
-    var_b = bitcast<f32>(_tint_pulling_vertex_buffer_1._tint_vertex_data[(_tint_pulling_pos / 4u)]);
+    var tint_pulling_pos : u32;
+    tint_pulling_pos = ((custom_vertex_index * 4u) + 0u);
+    var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
+    tint_pulling_pos = ((custom_instance_index * 4u) + 0u);
+    var_b = bitcast<f32>(tint_pulling_vertex_buffer_1.tint_vertex_data[(tint_pulling_pos / 4u)]);
   }
 }
 )";
@@ -303,14 +303,14 @@
 )";
 
   auto* expect = R"(
-[[builtin(vertex_index)]] var<in> _tint_pulling_vertex_index : u32;
+[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index : u32;
 
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), group(4)]] var<storage> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage> tint_pulling_vertex_buffer_0 : TintVertexData;
 
 var<private> var_a : f32;
 
@@ -319,11 +319,11 @@
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 16u) + 0u);
-    var_a = bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[(_tint_pulling_pos / 4u)]);
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 16u) + 0u);
-    var_b = vec4<f32>(bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[((_tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[((_tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[((_tint_pulling_pos + 8u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[((_tint_pulling_pos + 12u) / 4u)]));
+    var tint_pulling_pos : u32;
+    tint_pulling_pos = ((tint_pulling_vertex_index * 16u) + 0u);
+    var_a = bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[(tint_pulling_pos / 4u)]);
+    tint_pulling_pos = ((tint_pulling_vertex_index * 16u) + 0u);
+    var_b = vec4<f32>(bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 8u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 12u) / 4u)]));
   }
 }
 )";
@@ -353,18 +353,18 @@
 )";
 
   auto* expect = R"(
-[[builtin(vertex_index)]] var<in> _tint_pulling_vertex_index : u32;
+[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index : u32;
 
 [[block]]
 struct TintVertexData {
-  _tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : [[stride(4)]] array<u32>;
 };
 
-[[binding(0), group(4)]] var<storage> _tint_pulling_vertex_buffer_0 : TintVertexData;
+[[binding(0), group(4)]] var<storage> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[binding(1), group(4)]] var<storage> _tint_pulling_vertex_buffer_1 : TintVertexData;
+[[binding(1), group(4)]] var<storage> tint_pulling_vertex_buffer_1 : TintVertexData;
 
-[[binding(2), group(4)]] var<storage> _tint_pulling_vertex_buffer_2 : TintVertexData;
+[[binding(2), group(4)]] var<storage> tint_pulling_vertex_buffer_2 : TintVertexData;
 
 var<private> var_a : vec2<f32>;
 
@@ -375,13 +375,13 @@
 [[stage(vertex)]]
 fn main() {
   {
-    var _tint_pulling_pos : u32;
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 8u) + 0u);
-    var_a = vec2<f32>(bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[((_tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_0._tint_vertex_data[((_tint_pulling_pos + 4u) / 4u)]));
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 12u) + 0u);
-    var_b = vec3<f32>(bitcast<f32>(_tint_pulling_vertex_buffer_1._tint_vertex_data[((_tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_1._tint_vertex_data[((_tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_1._tint_vertex_data[((_tint_pulling_pos + 8u) / 4u)]));
-    _tint_pulling_pos = ((_tint_pulling_vertex_index * 16u) + 0u);
-    var_c = vec4<f32>(bitcast<f32>(_tint_pulling_vertex_buffer_2._tint_vertex_data[((_tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_2._tint_vertex_data[((_tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_2._tint_vertex_data[((_tint_pulling_pos + 8u) / 4u)]), bitcast<f32>(_tint_pulling_vertex_buffer_2._tint_vertex_data[((_tint_pulling_pos + 12u) / 4u)]));
+    var tint_pulling_pos : u32;
+    tint_pulling_pos = ((tint_pulling_vertex_index * 8u) + 0u);
+    var_a = vec2<f32>(bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0.tint_vertex_data[((tint_pulling_pos + 4u) / 4u)]));
+    tint_pulling_pos = ((tint_pulling_vertex_index * 12u) + 0u);
+    var_b = vec3<f32>(bitcast<f32>(tint_pulling_vertex_buffer_1.tint_vertex_data[((tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_1.tint_vertex_data[((tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_1.tint_vertex_data[((tint_pulling_pos + 8u) / 4u)]));
+    tint_pulling_pos = ((tint_pulling_vertex_index * 16u) + 0u);
+    var_c = vec4<f32>(bitcast<f32>(tint_pulling_vertex_buffer_2.tint_vertex_data[((tint_pulling_pos + 0u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_2.tint_vertex_data[((tint_pulling_pos + 4u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_2.tint_vertex_data[((tint_pulling_pos + 8u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_2.tint_vertex_data[((tint_pulling_pos + 12u) / 4u)]));
   }
 }
 )";
@@ -401,6 +401,63 @@
   EXPECT_EQ(expect, str(got));
 }
 
+TEST_F(VertexPullingTest, AttemptSymbolCollision) {
+  auto* src = R"(
+[[location(0)]] var<in> var_a : f32;
+[[location(1)]] var<in> var_b : vec4<f32>;
+
+[[stage(vertex)]]
+fn main() {
+  var tint_pulling_vertex_index : i32;
+  var tint_pulling_vertex_buffer_0 : i32;
+  var tint_vertex_data : i32;
+  var tint_pulling_pos : i32;
+}
+)";
+
+  auto* expect = R"(
+[[builtin(vertex_index)]] var<in> tint_pulling_vertex_index_1 : u32;
+
+[[block]]
+struct TintVertexData {
+  tint_vertex_data_1 : [[stride(4)]] array<u32>;
+};
+
+[[binding(0), group(4)]] var<storage> tint_pulling_vertex_buffer_0_1 : TintVertexData;
+
+var<private> var_a : f32;
+
+var<private> var_b : vec4<f32>;
+
+[[stage(vertex)]]
+fn main() {
+  {
+    var tint_pulling_pos_1 : u32;
+    tint_pulling_pos_1 = ((tint_pulling_vertex_index_1 * 16u) + 0u);
+    var_a = bitcast<f32>(tint_pulling_vertex_buffer_0_1.tint_vertex_data_1[(tint_pulling_pos_1 / 4u)]);
+    tint_pulling_pos_1 = ((tint_pulling_vertex_index_1 * 16u) + 0u);
+    var_b = vec4<f32>(bitcast<f32>(tint_pulling_vertex_buffer_0_1.tint_vertex_data_1[((tint_pulling_pos_1 + 0u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0_1.tint_vertex_data_1[((tint_pulling_pos_1 + 4u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0_1.tint_vertex_data_1[((tint_pulling_pos_1 + 8u) / 4u)]), bitcast<f32>(tint_pulling_vertex_buffer_0_1.tint_vertex_data_1[((tint_pulling_pos_1 + 12u) / 4u)]));
+  }
+  var tint_pulling_vertex_index : i32;
+  var tint_pulling_vertex_buffer_0 : i32;
+  var tint_vertex_data : i32;
+  var tint_pulling_pos : i32;
+}
+)";
+
+  VertexPulling::Config cfg;
+  cfg.vertex_state = {
+      {{16,
+        InputStepMode::kVertex,
+        {{VertexFormat::kF32, 0, 0}, {VertexFormat::kVec4F32, 0, 1}}}}};
+  cfg.entry_point_name = "main";
+
+  DataMap data;
+  data.Add<VertexPulling::Config>(cfg);
+  auto got = Run<VertexPulling>(src, std::move(data));
+
+  EXPECT_EQ(expect, str(got));
+}
 }  // namespace
 }  // namespace transform
 }  // namespace tint