Always run `SubstituteOverrides`

This Cl moves `SubstituteOverrides` from being optional based on either
options being provided or the `--transform` flag to always being called.
A `--disable-substitute-overrides` flag is added in order to skip
running `SubstituteOverrides` if needed.

Bug: 378726537
Change-Id: I06000dc7f7b42cb81cf762b147cd4f5a98c1685b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/217260
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index cc66710..b94b18a 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -381,7 +381,6 @@
         options.Add<StringOption>("transform", R"(Runs transforms, name list is comma separated
 Available transforms:
     first_index_offset
-    substitute_override
 )",
                                   ShortName{"t"});
     TINT_DEFER({
@@ -644,14 +643,9 @@
     return true;
 }
 
-[[maybe_unused]] tint::Result<tint::Program> ProcessASTTransforms(
-    Options& options,
-    tint::inspector::Inspector& inspector,
-    tint::Program& program) {
-    tint::ast::transform::Manager transform_manager;
-    tint::ast::transform::DataMap transform_inputs;
-
-    // Renaming must always come first
+[[maybe_unused]] void AddRenamer(Options& options,
+                                 tint::ast::transform::Manager& transform_manager,
+                                 tint::ast::transform::DataMap& transform_inputs) {
     switch (options.format) {
         case Format::kMsl: {
             if (!options.rename_all) {
@@ -691,49 +685,66 @@
         case Format::kUnknown:
             break;
     }
+}
 
-    // If overrides are provided, add the SubstituteOverride transform.
-    if (!options.overrides.IsEmpty()) {
-        options.transforms.Push("substitute_override");
+[[maybe_unused]] tint::Result<tint::SuccessType> AddSubstituteOverrides(
+    Options& options,
+    tint::inspector::Inspector& inspector,
+    tint::ast::transform::Manager& transform_manager,
+    tint::ast::transform::DataMap& transform_inputs) {
+    auto override_names = inspector.GetNamedOverrideIds();
+
+    std::unordered_map<tint::OverrideId, double> values;
+    values.reserve(options.overrides.Count());
+    for (auto& override : options.overrides) {
+        const auto& override_name = override.key.Value();
+        const auto& override_value = override.value;
+        if (override_name.empty()) {
+            return tint::Failure("empty override name");
+        }
+
+        auto num = tint::strconv::ParseNumber<decltype(tint::OverrideId::value)>(override_name);
+        if (num == tint::Success) {
+            tint::OverrideId id{num.Get()};
+            values.emplace(id, override_value);
+            continue;
+        }
+
+        auto it = override_names.find(override_name);
+        if (it == override_names.end()) {
+            return tint::Failure("unknown override '" + override_name + "'");
+        }
+        values.emplace(it->second, override_value);
+    }
+
+    tint::ast::transform::SubstituteOverride::Config cfg;
+    cfg.map = std::move(values);
+
+    transform_inputs.Add<tint::ast::transform::SubstituteOverride::Config>(cfg);
+    transform_manager.Add<tint::ast::transform::SubstituteOverride>();
+
+    return tint::Success;
+}
+
+[[maybe_unused]] tint::Result<tint::Program> ProcessASTTransforms(
+    Options& options,
+    tint::inspector::Inspector& inspector,
+    tint::Program& program) {
+    tint::ast::transform::Manager transform_manager;
+    tint::ast::transform::DataMap transform_inputs;
+
+    // Renaming must always come first
+    AddRenamer(options, transform_manager, transform_inputs);
+
+    auto res = AddSubstituteOverrides(options, inspector, transform_manager, transform_inputs);
+    if (res != tint::Success) {
+        return res.Failure();
     }
 
     for (const auto& name : options.transforms) {
         if (name == "first_index_offset") {
             transform_inputs.Add<tint::ast::transform::FirstIndexOffset::BindingPoint>(0, 0);
             transform_manager.Add<tint::ast::transform::FirstIndexOffset>();
-        } else if (name == "substitute_override") {
-            auto override_names = inspector.GetNamedOverrideIds();
-
-            std::unordered_map<tint::OverrideId, double> values;
-            values.reserve(options.overrides.Count());
-            for (auto& override : options.overrides) {
-                const auto& override_name = override.key.Value();
-                const auto& override_value = override.value;
-                if (override_name.empty()) {
-                    return tint::Failure("empty override name");
-                }
-
-                auto num =
-                    tint::strconv::ParseNumber<decltype(tint::OverrideId::value)>(override_name);
-                if (num == tint::Success) {
-                    tint::OverrideId id{num.Get()};
-                    values.emplace(id, override_value);
-                    continue;
-                }
-
-                auto it = override_names.find(override_name);
-                if (it == override_names.end()) {
-                    return tint::Failure("unknown override '" + override_name + "'");
-                }
-                values.emplace(it->second, override_value);
-            }
-
-            tint::ast::transform::SubstituteOverride::Config cfg;
-            cfg.map = std::move(values);
-
-            transform_inputs.Add<tint::ast::transform::SubstituteOverride::Config>(cfg);
-            transform_manager.Add<tint::ast::transform::SubstituteOverride>();
-
         } else {
             return tint::Failure("Unknown transform: " + name);
         }
diff --git a/test/tint/bug/tint/1660.wgsl b/test/tint/bug/tint/1660.wgsl
index f06d17a..5fa2f54 100644
--- a/test/tint/bug/tint/1660.wgsl
+++ b/test/tint/bug/tint/1660.wgsl
@@ -1,5 +1,3 @@
-// flags: --transform substitute_override
-
 override size = 2;
 
 var<workgroup> a : array<f32, size>;
diff --git a/test/tint/bug/tint/1697.wgsl b/test/tint/bug/tint/1697.wgsl
index 05c9cf6..0db51f5 100644
--- a/test/tint/bug/tint/1697.wgsl
+++ b/test/tint/bug/tint/1697.wgsl
@@ -1,5 +1,3 @@
-// flags: --transform substitute_override
-
 override O = 0; // Try switching to 'const'
 
 fn f() {
diff --git a/test/tint/bug/tint/1764.wgsl b/test/tint/bug/tint/1764.wgsl
index 1448fbd..048618b 100644
--- a/test/tint/bug/tint/1764.wgsl
+++ b/test/tint/bug/tint/1764.wgsl
@@ -1,5 +1,3 @@
-// flags: --transform substitute_override
-
 override O = 123;
 alias A = array<i32, O*2>;
 
diff --git a/test/tint/types/functions/shader_io/compute_workgroup_expression.wgsl b/test/tint/types/functions/shader_io/compute_workgroup_expression.wgsl
index 971debb..8942333 100644
--- a/test/tint/types/functions/shader_io/compute_workgroup_expression.wgsl
+++ b/test/tint/types/functions/shader_io/compute_workgroup_expression.wgsl
@@ -1,9 +1,6 @@
-// flags: --transform substitute_override
-
 @id(0) override x_dim = 2;
 
 @compute
 @workgroup_size(1 + 2, x_dim, clamp((1 - 2) + 4, 0, 5))
 fn main() {
 }
-
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32.spvasm
index 2f5df01..4495762 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32_WithoutSpecId.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32_WithoutSpecId.spvasm
index dc7fac6..a4b993f 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32_WithoutSpecId.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32_WithoutSpecId.spvasm
@@ -1,4 +1,3 @@
-; flags: --transform substitute_override
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_F32_WithoutSpecId.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_False.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_False.spvasm
index c2cc3577..ae487d5 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_False.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_False.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_False.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_I32.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_I32.spvasm
index 04b2f5d..c955a79 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_I32.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_I32.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_I32.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_Id_MaxValid.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_Id_MaxValid.spvasm
index 7970680..c687c93 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_Id_MaxValid.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_Id_MaxValid.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_Id_MaxValid.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_True.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_True.spvasm
index 4f300c7..1f56e04 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_True.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_True.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_True.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_U32.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_U32.spvasm
index f7803c5..2ab2c75 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_U32.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_U32.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_DeclareConst_U32.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_UsedInFunction.spvasm b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_UsedInFunction.spvasm
index 902b5d7..096d33f 100644
--- a/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_UsedInFunction.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvModuleScopeVarParserTest_ScalarSpecConstant_UsedInFunction.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvModuleScopeVarParserTest_ScalarSpecConstant_UsedInFunction.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_LocalSize_And_WGSBuiltin_SpecConstant.spvasm b/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_LocalSize_And_WGSBuiltin_SpecConstant.spvasm
index a046d7d..5ffad5d 100644
--- a/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_LocalSize_And_WGSBuiltin_SpecConstant.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_LocalSize_And_WGSBuiltin_SpecConstant.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvParserTest_EmitFunctions_Function_EntryPoint_LocalSize_And_WGSBuiltin_SpecConstant.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSizeBuiltin_SpecConstant_Only.spvasm b/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSizeBuiltin_SpecConstant_Only.spvasm
index 4c82be3..839812e 100644
--- a/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSizeBuiltin_SpecConstant_Only.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSizeBuiltin_SpecConstant_Only.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSizeBuiltin_SpecConstant_Only.spvasm
 ; SPIR-V
 ; Version: 1.0
diff --git a/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSize_MixedConstantSpecConstant.spvasm b/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSize_MixedConstantSpecConstant.spvasm
index 61d100d..0c89e6b 100644
--- a/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSize_MixedConstantSpecConstant.spvasm
+++ b/test/tint/unittest/reader/spirv/SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSize_MixedConstantSpecConstant.spvasm
@@ -1,5 +1,3 @@
-; flags: --transform substitute_override
-;
 ; Test: SpvParserTest_EmitFunctions_Function_EntryPoint_WorkgroupSize_MixedConstantSpecConstant.spvasm
 ; SPIR-V
 ; Version: 1.0