[tint] Move ParameterUsage from sem to core

Change-Id: Ide9d785bfbb52d45933406a953da490f3aaf2a70
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/144127
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index d353821..794d8ab 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -699,6 +699,8 @@
 libtint_source_set("libtint_sem_src") {
   sources = [
     "lang/core/evaluation_stage.h",
+    "lang/core/parameter_usage.cc",
+    "lang/core/parameter_usage.h",
     "lang/wgsl/sem/accessor_expression.cc",
     "lang/wgsl/sem/accessor_expression.h",
     "lang/wgsl/sem/array_count.cc",
@@ -744,8 +746,6 @@
     "lang/wgsl/sem/module.h",
     "lang/wgsl/sem/node.cc",
     "lang/wgsl/sem/node.h",
-    "lang/wgsl/sem/parameter_usage.cc",
-    "lang/wgsl/sem/parameter_usage.h",
     "lang/wgsl/sem/pipeline_stage_set.h",
     "lang/wgsl/sem/sampler_texture_pair.h",
     "lang/wgsl/sem/statement.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index ac00ecd..52f39e1 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -593,7 +593,7 @@
 tint_generated(lang/core/texel_format BENCH TEST)
 
 tint_generated(lang/core/intrinsic/ctor_conv)
-tint_generated(lang/wgsl/sem/parameter_usage)
+tint_generated(lang/core/parameter_usage)
 
 if(UNIX)
   list(APPEND TINT_LIB_SRCS utils/diagnostic/printer_posix.cc)
diff --git a/src/tint/lang/core/intrinsic/table.cc b/src/tint/lang/core/intrinsic/table.cc
index f6bd2dd..778db1a 100644
--- a/src/tint/lang/core/intrinsic/table.cc
+++ b/src/tint/lang/core/intrinsic/table.cc
@@ -334,10 +334,6 @@
 // TODO(bclayton): See if we can move more of this hand-rolled code to the
 // template
 ////////////////////////////////////////////////////////////////////////////////
-using TexelFormat = core::TexelFormat;
-using Access = core::Access;
-using AddressSpace = core::AddressSpace;
-using ParameterUsage = sem::ParameterUsage;
 using PipelineStage = ast::PipelineStage;
 
 /// Unique flag bits for overloads
@@ -1659,7 +1655,7 @@
             ss << ", ";
         }
         if (parameter.usage != ParameterUsage::kNone) {
-            ss << sem::str(parameter.usage) << ": ";
+            ss << ToString(parameter.usage) << ": ";
         }
         auto* indices = parameter.matcher_indices;
         ss << Match(templates, overload, indices, earliest_eval_stage).TypeName();
diff --git a/src/tint/lang/core/intrinsic/table.h b/src/tint/lang/core/intrinsic/table.h
index 1d7b68f..f5a5d1e 100644
--- a/src/tint/lang/core/intrinsic/table.h
+++ b/src/tint/lang/core/intrinsic/table.h
@@ -18,10 +18,10 @@
 #include <memory>
 #include <string>
 
+#include "src/tint/lang/core/binary_op.h"
 #include "src/tint/lang/core/constant/eval.h"
 #include "src/tint/lang/core/intrinsic/ctor_conv.h"
 #include "src/tint/lang/core/unary_op.h"
-#include "src/tint/lang/wgsl/ast/binary_expression.h"
 #include "src/tint/lang/wgsl/sem/builtin.h"
 #include "src/tint/utils/containers/vector.h"
 
diff --git a/src/tint/lang/core/intrinsic/table_test.cc b/src/tint/lang/core/intrinsic/table_test.cc
index 537de18..3bf47da 100644
--- a/src/tint/lang/core/intrinsic/table_test.cc
+++ b/src/tint/lang/core/intrinsic/table_test.cc
@@ -39,7 +39,7 @@
 using namespace tint::core::fluent_types;  // NOLINT
 
 using Parameter = sem::Parameter;
-using ParameterUsage = sem::ParameterUsage;
+using ParameterUsage = core::ParameterUsage;
 
 using AFloatV = vec3<AFloat>;
 using AIntV = vec3<AInt>;
diff --git a/src/tint/lang/wgsl/sem/parameter_usage.cc b/src/tint/lang/core/parameter_usage.cc
similarity index 92%
rename from src/tint/lang/wgsl/sem/parameter_usage.cc
rename to src/tint/lang/core/parameter_usage.cc
index d60f30b..7eb0f07 100644
--- a/src/tint/lang/wgsl/sem/parameter_usage.cc
+++ b/src/tint/lang/core/parameter_usage.cc
@@ -15,16 +15,16 @@
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by tools/src/cmd/gen
 // using the template:
-//   src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl
+//   src/tint/lang/core/parameter_usage.cc.tmpl
 //
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/wgsl/sem/parameter_usage.h"
+#include "src/tint/lang/core/parameter_usage.h"
 
-namespace tint::sem {
+namespace tint::core {
 
-const char* str(ParameterUsage usage) {
+std::string_view ToString(ParameterUsage usage) {
     switch (usage) {
         case ParameterUsage::kNone:
             return "none";
@@ -76,4 +76,4 @@
     return "<unknown>";
 }
 
-}  // namespace tint::sem
+}  // namespace tint::core
diff --git a/src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl b/src/tint/lang/core/parameter_usage.cc.tmpl
similarity index 83%
rename from src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl
rename to src/tint/lang/core/parameter_usage.cc.tmpl
index 1a3981c..be27105 100644
--- a/src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl
+++ b/src/tint/lang/core/parameter_usage.cc.tmpl
@@ -13,11 +13,11 @@
 
 {{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 
-#include "src/tint/lang/wgsl/sem/parameter_usage.h"
+#include "src/tint/lang/core/parameter_usage.h"
 
-namespace tint::sem {
+namespace tint::core {
 
-const char* str(ParameterUsage usage) {
+std::string_view ToString(ParameterUsage usage) {
     switch (usage) {
         case ParameterUsage::kNone:
             return "none";
@@ -29,4 +29,4 @@
     return "<unknown>";
 }
 
-}  // namespace tint::sem
+}  // namespace tint::core
diff --git a/src/tint/lang/wgsl/sem/parameter_usage.h b/src/tint/lang/core/parameter_usage.h
similarity index 63%
rename from src/tint/lang/wgsl/sem/parameter_usage.h
rename to src/tint/lang/core/parameter_usage.h
index 1f10df2..53c2604 100644
--- a/src/tint/lang/wgsl/sem/parameter_usage.h
+++ b/src/tint/lang/core/parameter_usage.h
@@ -15,15 +15,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by tools/src/cmd/gen
 // using the template:
-//   src/tint/lang/wgsl/sem/parameter_usage.h.tmpl
+//   src/tint/lang/core/parameter_usage.h.tmpl
 //
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#ifndef SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
-#define SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
+#ifndef SRC_TINT_LANG_CORE_PARAMETER_USAGE_H_
+#define SRC_TINT_LANG_CORE_PARAMETER_USAGE_H_
 
-namespace tint::sem {
+#include <string>
+
+#include "src/tint/utils/traits/traits.h"
+
+namespace tint::core {
 
 /// ParameterUsage is extra metadata for identifying a parameter based on its
 /// overload position
@@ -53,9 +57,18 @@
     kZyw,
 };
 
-/// @returns a string representation of the given parameter usage.
-const char* str(ParameterUsage usage);
+/// @param value the enum value
+/// @returns the string for the given enum value
+std::string_view ToString(ParameterUsage value);
 
-}  // namespace tint::sem
+/// @param out the stream to write to
+/// @param value the ParameterUsage
+/// @returns @p out so calls can be chained
+template <typename STREAM, typename = traits::EnableIfIsOStream<STREAM>>
+auto& operator<<(STREAM& out, ParameterUsage value) {
+    return out << ToString(value);
+}
 
-#endif  // SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
+}  // namespace tint::core
+
+#endif  // SRC_TINT_LANG_CORE_PARAMETER_USAGE_H_
diff --git a/src/tint/lang/core/parameter_usage.h.tmpl b/src/tint/lang/core/parameter_usage.h.tmpl
new file mode 100644
index 0000000..7c3af98
--- /dev/null
+++ b/src/tint/lang/core/parameter_usage.h.tmpl
@@ -0,0 +1,48 @@
+{{- /*
+--------------------------------------------------------------------------------
+Template file for use with tools/src/cmd/gen to generate parameter_usage.h
+
+To update the generated file, run:
+    ./tools/run gen
+
+See:
+* tools/src/cmd/gen for structures used by this template
+* https://golang.org/pkg/text/template/ for documentation on the template syntax
+--------------------------------------------------------------------------------
+*/ -}}
+
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
+#ifndef SRC_TINT_LANG_CORE_PARAMETER_USAGE_H_
+#define SRC_TINT_LANG_CORE_PARAMETER_USAGE_H_
+
+#include <string>
+
+#include "src/tint/utils/traits/traits.h"
+
+namespace tint::core {
+
+/// ParameterUsage is extra metadata for identifying a parameter based on its
+/// overload position
+enum class ParameterUsage {
+    kNone = -1,
+{{- range $I.Sem.UniqueParameterNames  }}
+    k{{PascalCase .}},
+{{- end  }}
+};
+
+/// @param value the enum value
+/// @returns the string for the given enum value
+std::string_view ToString(ParameterUsage value);
+
+/// @param out the stream to write to
+/// @param value the ParameterUsage
+/// @returns @p out so calls can be chained
+template <typename STREAM, typename = traits::EnableIfIsOStream<STREAM>>
+auto& operator<<(STREAM& out, ParameterUsage value) {
+    return out << ToString(value);
+}
+
+}  // namespace tint::core
+
+#endif  // SRC_TINT_LANG_CORE_PARAMETER_USAGE_H_
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
index 25f32a8..b768d00 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
@@ -1281,7 +1281,7 @@
 void ASTPrinter::EmitTextureCall(StringStream& out,
                                  const sem::Call* call,
                                  const sem::Builtin* builtin) {
-    using Usage = sem::ParameterUsage;
+    using Usage = core::ParameterUsage;
 
     auto& signature = builtin->Signature();
     auto* expr = call->Declaration();
@@ -1470,7 +1470,7 @@
             return;
     }
 
-    if (builtin->Signature().IndexOf(sem::ParameterUsage::kOffset) >= 0) {
+    if (builtin->Signature().IndexOf(core::ParameterUsage::kOffset) >= 0) {
         out << "Offset";
     }
 
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index 89eb49e..d3a8c26 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -2514,7 +2514,7 @@
 bool ASTPrinter::EmitTextureCall(StringStream& out,
                                  const sem::Call* call,
                                  const sem::Builtin* builtin) {
-    using Usage = sem::ParameterUsage;
+    using Usage = core::ParameterUsage;
 
     auto& signature = builtin->Signature();
     auto* expr = call->Declaration();
@@ -2749,7 +2749,7 @@
             break;
         case core::Function::kTextureGather:
             out << ".Gather";
-            if (builtin->Parameters()[0]->Usage() == sem::ParameterUsage::kComponent) {
+            if (builtin->Parameters()[0]->Usage() == core::ParameterUsage::kComponent) {
                 switch (call->Arguments()[0]->ConstantValue()->ValueAs<AInt>()) {
                     case 0:
                         out << "Red";
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index c835c6c..5154bc6 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -950,7 +950,7 @@
 bool ASTPrinter::EmitTextureCall(StringStream& out,
                                  const sem::Call* call,
                                  const sem::Builtin* builtin) {
-    using Usage = sem::ParameterUsage;
+    using Usage = core::ParameterUsage;
 
     auto& signature = builtin->Signature();
     auto* expr = call->Declaration();
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index 54038c5..971ee76 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -2578,7 +2578,7 @@
                                      const sem::Builtin* builtin,
                                      Operand result_type,
                                      Operand result_id) {
-    using Usage = sem::ParameterUsage;
+    using Usage = core::ParameterUsage;
 
     auto& signature = builtin->Signature();
     auto& arguments = call->Arguments();
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
index a2ff9e1..63716fa 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -1184,7 +1184,7 @@
                     case core::Function::kTextureSampleBaseClampToEdge:
                         if (cfg.builtins.texture_sample_base_clamp_to_edge_2d_f32) {
                             auto& sig = builtin->Signature();
-                            auto* tex = sig.Parameter(sem::ParameterUsage::kTexture);
+                            auto* tex = sig.Parameter(core::ParameterUsage::kTexture);
                             if (auto* stex = tex->Type()->As<type::SampledTexture>()) {
                                 if (stex->type()->Is<type::F32>()) {
                                     return builtin_polyfills.GetOrCreate(builtin, [&] {
@@ -1198,11 +1198,11 @@
                     case core::Function::kTextureStore:
                         if (cfg.builtins.bgra8unorm) {
                             auto& sig = builtin->Signature();
-                            auto* tex = sig.Parameter(sem::ParameterUsage::kTexture);
+                            auto* tex = sig.Parameter(core::ParameterUsage::kTexture);
                             if (auto* stex = tex->Type()->As<type::StorageTexture>()) {
                                 if (stex->texel_format() == core::TexelFormat::kBgra8Unorm) {
                                     size_t value_idx = static_cast<size_t>(
-                                        sig.IndexOf(sem::ParameterUsage::kValue));
+                                        sig.IndexOf(core::ParameterUsage::kValue));
                                     ctx.Replace(expr, [this, expr, value_idx] {
                                         tint::Vector<const Expression*, 3> args;
                                         for (auto* arg : expr->args) {
diff --git a/src/tint/lang/wgsl/ast/transform/combine_samplers.cc b/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
index 2a66dd0..404f872 100644
--- a/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
+++ b/src/tint/lang/wgsl/ast/transform/combine_samplers.cc
@@ -227,8 +227,8 @@
                 // Replace all texture builtin calls.
                 if (auto* builtin = call->Target()->As<sem::Builtin>()) {
                     const auto& signature = builtin->Signature();
-                    auto sampler_index = signature.IndexOf(sem::ParameterUsage::kSampler);
-                    auto texture_index = signature.IndexOf(sem::ParameterUsage::kTexture);
+                    auto sampler_index = signature.IndexOf(core::ParameterUsage::kSampler);
+                    auto texture_index = signature.IndexOf(core::ParameterUsage::kTexture);
                     if (texture_index == -1) {
                         return nullptr;
                     }
diff --git a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
index cefd907..a454d7c 100644
--- a/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
+++ b/src/tint/lang/wgsl/ast/transform/multiplanar_external_texture.cc
@@ -462,7 +462,7 @@
 
         auto texture_load_external_sym = texture_load_external_fns.GetOrCreate(call->Target(), [&] {
             auto& sig = call->Target()->Signature();
-            auto* coord_ty = sig.Parameter(sem::ParameterUsage::kCoords)->Type();
+            auto* coord_ty = sig.Parameter(core::ParameterUsage::kCoords)->Type();
 
             auto name = b.Symbols().New("textureLoadExternal");
 
diff --git a/src/tint/lang/wgsl/ast/transform/robustness.cc b/src/tint/lang/wgsl/ast/transform/robustness.cc
index 9c688d1..2f7b5a5 100644
--- a/src/tint/lang/wgsl/ast/transform/robustness.cc
+++ b/src/tint/lang/wgsl/ast/transform/robustness.cc
@@ -394,10 +394,10 @@
         // Indices of the mandatory texture and coords parameters, and the optional
         // array and level parameters.
         auto& signature = builtin->Signature();
-        auto texture_arg_idx = signature.IndexOf(sem::ParameterUsage::kTexture);
-        auto coords_arg_idx = signature.IndexOf(sem::ParameterUsage::kCoords);
-        auto array_arg_idx = signature.IndexOf(sem::ParameterUsage::kArrayIndex);
-        auto level_arg_idx = signature.IndexOf(sem::ParameterUsage::kLevel);
+        auto texture_arg_idx = signature.IndexOf(core::ParameterUsage::kTexture);
+        auto coords_arg_idx = signature.IndexOf(core::ParameterUsage::kCoords);
+        auto array_arg_idx = signature.IndexOf(core::ParameterUsage::kArrayIndex);
+        auto level_arg_idx = signature.IndexOf(core::ParameterUsage::kLevel);
 
         auto* texture_arg = expr->args[static_cast<size_t>(texture_arg_idx)];
 
@@ -486,10 +486,10 @@
         // Indices of the mandatory texture and coords parameters, and the optional
         // array and level parameters.
         auto& signature = builtin->Signature();
-        auto texture_arg_idx = signature.IndexOf(sem::ParameterUsage::kTexture);
-        auto coords_arg_idx = signature.IndexOf(sem::ParameterUsage::kCoords);
-        auto array_arg_idx = signature.IndexOf(sem::ParameterUsage::kArrayIndex);
-        auto level_arg_idx = signature.IndexOf(sem::ParameterUsage::kLevel);
+        auto texture_arg_idx = signature.IndexOf(core::ParameterUsage::kTexture);
+        auto coords_arg_idx = signature.IndexOf(core::ParameterUsage::kCoords);
+        auto array_arg_idx = signature.IndexOf(core::ParameterUsage::kArrayIndex);
+        auto level_arg_idx = signature.IndexOf(core::ParameterUsage::kLevel);
 
         auto* texture_arg = expr->args[static_cast<size_t>(texture_arg_idx)];
 
diff --git a/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc b/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
index f5d372a..e038ba1 100644
--- a/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
+++ b/src/tint/lang/wgsl/ast/transform/texture_1d_to_2d.cc
@@ -38,7 +38,7 @@
         if (auto* sem_fn = program->Sem().Get(fn)) {
             for (auto* builtin : sem_fn->DirectlyCalledBuiltins()) {
                 const auto& signature = builtin->Signature();
-                auto texture = signature.Parameter(sem::ParameterUsage::kTexture);
+                auto texture = signature.Parameter(core::ParameterUsage::kTexture);
                 if (texture) {
                     auto* tex = texture->Type()->As<type::Texture>();
                     if (tex->dim() == type::TextureDimension::k1d) {
@@ -131,7 +131,7 @@
                 return nullptr;
             }
             const auto& signature = builtin->Signature();
-            auto* texture = signature.Parameter(sem::ParameterUsage::kTexture);
+            auto* texture = signature.Parameter(core::ParameterUsage::kTexture);
             if (!texture) {
                 return nullptr;
             }
@@ -150,7 +150,7 @@
                 return ctx.dst->MemberAccessor(new_call, "x");
             }
 
-            auto coords_index = signature.IndexOf(sem::ParameterUsage::kCoords);
+            auto coords_index = signature.IndexOf(core::ParameterUsage::kCoords);
             if (coords_index == -1) {
                 return nullptr;
             }
diff --git a/src/tint/lang/wgsl/inspector/inspector.cc b/src/tint/lang/wgsl/inspector/inspector.cc
index 809d346..3163a3d 100644
--- a/src/tint/lang/wgsl/inspector/inspector.cc
+++ b/src/tint/lang/wgsl/inspector/inspector.cc
@@ -804,12 +804,12 @@
         }
 
         const auto& signature = i->Signature();
-        int sampler_index = signature.IndexOf(sem::ParameterUsage::kSampler);
+        int sampler_index = signature.IndexOf(core::ParameterUsage::kSampler);
         if (sampler_index == -1) {
             continue;
         }
 
-        int texture_index = signature.IndexOf(sem::ParameterUsage::kTexture);
+        int texture_index = signature.IndexOf(core::ParameterUsage::kTexture);
         if (texture_index == -1) {
             continue;
         }
diff --git a/src/tint/lang/wgsl/resolver/builtin_test.cc b/src/tint/lang/wgsl/resolver/builtin_test.cc
index 1f9e9ad..d9c0a96 100644
--- a/src/tint/lang/wgsl/resolver/builtin_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_test.cc
@@ -2200,7 +2200,7 @@
         if (!first) {
             out << ", ";
         }
-        out << sem::str(param->Usage());
+        out << param->Usage();
         first = false;
     }
     out << ")";
diff --git a/src/tint/lang/wgsl/resolver/resolver.cc b/src/tint/lang/wgsl/resolver/resolver.cc
index 404e73c..82d745e 100644
--- a/src/tint/lang/wgsl/resolver/resolver.cc
+++ b/src/tint/lang/wgsl/resolver/resolver.cc
@@ -804,7 +804,7 @@
 
     auto* sem = builder_->create<sem::Parameter>(
         param, index, ty, core::AddressSpace::kUndefined, core::Access::kUndefined,
-        sem::ParameterUsage::kNone, binding_point, location);
+        core::ParameterUsage::kNone, binding_point, location);
     builder_->Sem().Add(param, sem);
 
     if (!validator_.Parameter(sem)) {
@@ -2925,7 +2925,7 @@
                                           VectorRef<const sem::ValueExpression*> args) const {
     // Collect a texture/sampler pair for this builtin.
     const auto& signature = builtin->Signature();
-    int texture_index = signature.IndexOf(sem::ParameterUsage::kTexture);
+    int texture_index = signature.IndexOf(core::ParameterUsage::kTexture);
     if (TINT_UNLIKELY(texture_index == -1)) {
         StringStream err;
         err << "texture builtin without texture parameter";
@@ -2936,7 +2936,7 @@
             args[static_cast<size_t>(texture_index)]->UnwrapLoad()->As<sem::VariableUser>()) {
         auto* texture = user->Variable();
         if (!texture->Type()->UnwrapRef()->Is<type::StorageTexture>()) {
-            int sampler_index = signature.IndexOf(sem::ParameterUsage::kSampler);
+            int sampler_index = signature.IndexOf(core::ParameterUsage::kSampler);
             const sem::Variable* sampler = sampler_index != -1
                                                ? args[static_cast<size_t>(sampler_index)]
                                                      ->UnwrapLoad()
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index c1b7772..c91d2fc 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -1628,13 +1628,13 @@
     std::string func_name = builtin->str();
     auto& signature = builtin->Signature();
 
-    auto check_arg_is_constexpr = [&](sem::ParameterUsage usage, int min, int max) {
+    auto check_arg_is_constexpr = [&](core::ParameterUsage usage, int min, int max) {
         auto signed_index = signature.IndexOf(usage);
         if (signed_index < 0) {
             return true;
         }
         auto index = static_cast<size_t>(signed_index);
-        std::string name = sem::str(usage);
+        std::string name{core::ToString(usage)};
         auto* arg = call->Arguments()[index];
         if (auto values = arg->ConstantValue()) {
             if (auto* vector = values->Type()->As<type::Vector>()) {
@@ -1666,8 +1666,8 @@
         return false;
     };
 
-    return check_arg_is_constexpr(sem::ParameterUsage::kOffset, -8, 7) &&
-           check_arg_is_constexpr(sem::ParameterUsage::kComponent, 0, 3);
+    return check_arg_is_constexpr(core::ParameterUsage::kOffset, -8, 7) &&
+           check_arg_is_constexpr(core::ParameterUsage::kComponent, 0, 3);
 }
 
 bool Validator::WorkgroupUniformLoad(const sem::Call* call) const {
diff --git a/src/tint/lang/wgsl/sem/call_target.cc b/src/tint/lang/wgsl/sem/call_target.cc
index 1ffc602..08f709a 100644
--- a/src/tint/lang/wgsl/sem/call_target.cc
+++ b/src/tint/lang/wgsl/sem/call_target.cc
@@ -49,7 +49,7 @@
 CallTargetSignature::CallTargetSignature(const CallTargetSignature&) = default;
 CallTargetSignature::~CallTargetSignature() = default;
 
-int CallTargetSignature::IndexOf(ParameterUsage usage) const {
+int CallTargetSignature::IndexOf(core::ParameterUsage usage) const {
     for (size_t i = 0; i < parameters.Length(); i++) {
         if (parameters[i]->Usage() == usage) {
             return static_cast<int>(i);
diff --git a/src/tint/lang/wgsl/sem/call_target.h b/src/tint/lang/wgsl/sem/call_target.h
index 7edf10b..075b644 100644
--- a/src/tint/lang/wgsl/sem/call_target.h
+++ b/src/tint/lang/wgsl/sem/call_target.h
@@ -54,12 +54,12 @@
     /// @param usage the parameter usage to find
     /// @returns the index of the parameter with the given usage, or -1 if no
     /// parameter with the given usage exists.
-    int IndexOf(ParameterUsage usage) const;
+    int IndexOf(core::ParameterUsage usage) const;
 
     /// @param usage  the parameter usage to find
     /// @returns the the parameter with the given usage, or nullptr if no parameter with the given
     /// usage exists.
-    inline const sem::Parameter* Parameter(ParameterUsage usage) const {
+    inline const sem::Parameter* Parameter(core::ParameterUsage usage) const {
         auto idx = IndexOf(usage);
         return (idx >= 0) ? parameters[static_cast<size_t>(idx)] : nullptr;
     }
diff --git a/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl b/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl
deleted file mode 100644
index a13e1c4..0000000
--- a/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl
+++ /dev/null
@@ -1,35 +0,0 @@
-{{- /*
---------------------------------------------------------------------------------
-Template file for use with tools/src/cmd/gen to generate parameter_usage.h
-
-To update the generated file, run:
-    ./tools/run gen
-
-See:
-* tools/src/cmd/gen for structures used by this template
-* https://golang.org/pkg/text/template/ for documentation on the template syntax
---------------------------------------------------------------------------------
-*/ -}}
-
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
-
-#ifndef SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
-#define SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
-
-namespace tint::sem {
-
-/// ParameterUsage is extra metadata for identifying a parameter based on its
-/// overload position
-enum class ParameterUsage {
-    kNone = -1,
-{{- range $I.Sem.UniqueParameterNames  }}
-    k{{PascalCase .}},
-{{- end  }}
-};
-
-/// @returns a string representation of the given parameter usage.
-const char* str(ParameterUsage usage);
-
-}  // namespace tint::sem
-
-#endif  // SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
diff --git a/src/tint/lang/wgsl/sem/variable.cc b/src/tint/lang/wgsl/sem/variable.cc
index e234659..223cc5f 100644
--- a/src/tint/lang/wgsl/sem/variable.cc
+++ b/src/tint/lang/wgsl/sem/variable.cc
@@ -76,7 +76,7 @@
                      const type::Type* type,
                      core::AddressSpace address_space,
                      core::Access access,
-                     const ParameterUsage usage /* = ParameterUsage::kNone */,
+                     const core::ParameterUsage usage /* = ParameterUsage::kNone */,
                      std::optional<tint::BindingPoint> binding_point /* = {} */,
                      std::optional<uint32_t> location /* = std::nullopt */)
     : Base(declaration, type, core::EvaluationStage::kRuntime, address_space, access, nullptr),
diff --git a/src/tint/lang/wgsl/sem/variable.h b/src/tint/lang/wgsl/sem/variable.h
index ce8f4d2..e3ef281 100644
--- a/src/tint/lang/wgsl/sem/variable.h
+++ b/src/tint/lang/wgsl/sem/variable.h
@@ -23,9 +23,9 @@
 
 #include "src/tint/lang/core/access.h"
 #include "src/tint/lang/core/address_space.h"
+#include "src/tint/lang/core/parameter_usage.h"
 #include "src/tint/lang/core/type/type.h"
 #include "src/tint/lang/wgsl/ast/parameter.h"
-#include "src/tint/lang/wgsl/sem/parameter_usage.h"
 #include "src/tint/lang/wgsl/sem/value_expression.h"
 #include "src/tint/utils/containers/unique_vector.h"
 #include "tint/binding_point.h"
@@ -213,7 +213,7 @@
               const type::Type* type,
               core::AddressSpace address_space,
               core::Access access,
-              const ParameterUsage usage = ParameterUsage::kNone,
+              const core::ParameterUsage usage = core::ParameterUsage::kNone,
               std::optional<tint::BindingPoint> binding_point = {},
               std::optional<uint32_t> location = std::nullopt);
 
@@ -229,7 +229,7 @@
     uint32_t Index() const { return index_; }
 
     /// @returns the semantic usage for the parameter
-    ParameterUsage Usage() const { return usage_; }
+    core::ParameterUsage Usage() const { return usage_; }
 
     /// @returns the CallTarget owner of this parameter
     CallTarget const* Owner() const { return owner_; }
@@ -252,7 +252,7 @@
 
   private:
     const uint32_t index_;
-    const ParameterUsage usage_;
+    const core::ParameterUsage usage_;
     CallTarget const* owner_ = nullptr;
     const CastableBase* shadows_ = nullptr;
     const std::optional<tint::BindingPoint> binding_point_;