[tint][fuzz] Use printer capabilities in writer_fuzz passes

Exposes the capabilities that are required after running all of the
transforms before the printer, and use them in the appropriate
writer_fuzz pass. This prevents spurious ICEs in the fuzzer due to IR
not being considered valid after running the transforms due to missing
capabilities.

Fixes: 426017505
Change-Id: I4a7eab200794da881b5b5894135f019e266ea88a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/248994
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: James Price <jrprice@google.com>
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/tint/lang/glsl/writer/BUILD.cmake b/src/tint/lang/glsl/writer/BUILD.cmake
index 168508d..3e8277e 100644
--- a/src/tint/lang/glsl/writer/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/BUILD.cmake
@@ -162,7 +162,6 @@
   tint_cmd_fuzz_ir_fuzz
   tint_lang_core
   tint_lang_core_constant
-  tint_lang_core_intrinsic
   tint_lang_core_ir
   tint_lang_core_ir_transform
   tint_lang_core_type
@@ -188,6 +187,7 @@
     tint_lang_glsl_writer
     tint_lang_glsl_writer_common
     tint_lang_glsl_writer_helpers
+    tint_lang_glsl_writer_printer
   )
 endif(TINT_BUILD_GLSL_WRITER)
 
diff --git a/src/tint/lang/glsl/writer/BUILD.gn b/src/tint/lang/glsl/writer/BUILD.gn
index 61aeae6..9afdceb 100644
--- a/src/tint/lang/glsl/writer/BUILD.gn
+++ b/src/tint/lang/glsl/writer/BUILD.gn
@@ -141,7 +141,6 @@
       "${tint_src_dir}/cmd/fuzz/ir:fuzz",
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
-      "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/ir/transform",
       "${tint_src_dir}/lang/core/type",
@@ -163,6 +162,7 @@
         "${tint_src_dir}/lang/glsl/writer",
         "${tint_src_dir}/lang/glsl/writer/common",
         "${tint_src_dir}/lang/glsl/writer/helpers",
+        "${tint_src_dir}/lang/glsl/writer/printer",
       ]
     }
   }
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index cbde070..c4eaa9f 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -126,10 +126,7 @@
 
     /// @returns the generated GLSL shader
     tint::Result<Output> Generate() {
-        auto valid = core::ir::ValidateAndDumpIfNeeded(
-            ir_, "glsl.Printer",
-            core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings,
-                                   core::ir::Capability::kAllowDuplicateBindings});
+        auto valid = core::ir::ValidateAndDumpIfNeeded(ir_, "glsl.Printer", kPrinterCapabilities);
         if (valid != Success) {
             return std::move(valid.Failure());
         }
diff --git a/src/tint/lang/glsl/writer/printer/printer.h b/src/tint/lang/glsl/writer/printer/printer.h
index 7a9d786..baf43ca 100644
--- a/src/tint/lang/glsl/writer/printer/printer.h
+++ b/src/tint/lang/glsl/writer/printer/printer.h
@@ -28,6 +28,7 @@
 #ifndef SRC_TINT_LANG_GLSL_WRITER_PRINTER_PRINTER_H_
 #define SRC_TINT_LANG_GLSL_WRITER_PRINTER_PRINTER_H_
 
+#include "src/tint/lang/core/ir/validator.h"
 #include "src/tint/lang/glsl/writer/common/output.h"
 #include "src/tint/utils/result.h"
 
@@ -41,6 +42,11 @@
 
 namespace tint::glsl::writer {
 
+// The capabilities that might be needed due to raising.
+const core::ir::Capabilities kPrinterCapabilities{
+    core::ir::Capability::kAllowHandleVarsWithoutBindings,
+    core::ir::Capability::kAllowDuplicateBindings};
+
 /// @returns the generated GLSL shader on success, or failure
 /// @param module the Tint IR module to generate
 /// @param options the options to use
diff --git a/src/tint/lang/glsl/writer/writer_fuzz.cc b/src/tint/lang/glsl/writer/writer_fuzz.cc
index de57e7e..814c652 100644
--- a/src/tint/lang/glsl/writer/writer_fuzz.cc
+++ b/src/tint/lang/glsl/writer/writer_fuzz.cc
@@ -28,14 +28,13 @@
 #include <iostream>
 
 #include "src/tint/cmd/fuzz/ir/fuzz.h"
-#include "src/tint/lang/core/ir/core_builtin_call.h"
 #include "src/tint/lang/core/ir/module.h"
 #include "src/tint/lang/core/ir/transform/single_entry_point.h"
 #include "src/tint/lang/core/ir/var.h"
-#include "src/tint/lang/core/type/input_attachment.h"
 #include "src/tint/lang/core/type/pointer.h"
 #include "src/tint/lang/core/type/storage_texture.h"
 #include "src/tint/lang/glsl/writer/helpers/generate_bindings.h"
+#include "src/tint/lang/glsl/writer/printer/printer.h"
 #include "src/tint/lang/glsl/writer/writer.h"
 
 namespace tint::glsl::writer {
@@ -148,5 +147,4 @@
 
 TINT_IR_MODULE_FUZZER(tint::glsl::writer::IRFuzzer,
                       tint::core::ir::Capabilities{},
-                      tint::core::ir::Capabilities{
-                          tint::core::ir::Capability::kAllowHandleVarsWithoutBindings});
+                      tint::glsl::writer::kPrinterCapabilities);
diff --git a/src/tint/lang/hlsl/writer/BUILD.cmake b/src/tint/lang/hlsl/writer/BUILD.cmake
index b0766e7..5703c4e 100644
--- a/src/tint/lang/hlsl/writer/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/BUILD.cmake
@@ -156,6 +156,7 @@
   tint_lang_core_type
   tint_lang_hlsl_writer_common
   tint_lang_hlsl_writer_helpers
+  tint_lang_hlsl_writer_printer
   tint_lang_wgsl_ast
   tint_utils
   tint_utils_bytes
diff --git a/src/tint/lang/hlsl/writer/BUILD.gn b/src/tint/lang/hlsl/writer/BUILD.gn
index 328b2ea..eadca96 100644
--- a/src/tint/lang/hlsl/writer/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/BUILD.gn
@@ -139,6 +139,7 @@
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/hlsl/writer/common",
       "${tint_src_dir}/lang/hlsl/writer/helpers",
+      "${tint_src_dir}/lang/hlsl/writer/printer",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/utils",
       "${tint_src_dir}/utils/bytes",
diff --git a/src/tint/lang/hlsl/writer/printer/printer.cc b/src/tint/lang/hlsl/writer/printer/printer.cc
index 7255e89..437e197 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.cc
+++ b/src/tint/lang/hlsl/writer/printer/printer.cc
@@ -175,14 +175,7 @@
 
     /// @returns the generated HLSL shader
     tint::Result<Output> Generate() {
-        core::ir::Capabilities capabilities{
-            core::ir::Capability::kAllowModuleScopeLets,
-            core::ir::Capability::kAllowVectorElementPointer,
-            core::ir::Capability::kAllowClipDistancesOnF32,
-            core::ir::Capability::kAllowDuplicateBindings,
-            core::ir::Capability::kAllowNonCoreTypes,
-        };
-        auto valid = core::ir::ValidateAndDumpIfNeeded(ir_, "hlsl.Printer", capabilities);
+        auto valid = core::ir::ValidateAndDumpIfNeeded(ir_, "hlsl.Printer", kPrinterCapabilities);
         if (valid != Success) {
             return std::move(valid.Failure());
         }
diff --git a/src/tint/lang/hlsl/writer/printer/printer.h b/src/tint/lang/hlsl/writer/printer/printer.h
index 97b5110..c258140 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.h
+++ b/src/tint/lang/hlsl/writer/printer/printer.h
@@ -28,6 +28,7 @@
 #ifndef SRC_TINT_LANG_HLSL_WRITER_PRINTER_PRINTER_H_
 #define SRC_TINT_LANG_HLSL_WRITER_PRINTER_PRINTER_H_
 
+#include "src/tint/lang/core/ir/validator.h"
 #include "src/tint/lang/hlsl/writer/common/options.h"
 #include "src/tint/lang/hlsl/writer/common/output.h"
 #include "src/tint/utils/result.h"
@@ -39,6 +40,15 @@
 
 namespace tint::hlsl::writer {
 
+// The capabilities that might be needed due to raising.
+const core::ir::Capabilities kPrinterCapabilities{
+    core::ir::Capability::kAllowModuleScopeLets,
+    core::ir::Capability::kAllowVectorElementPointer,
+    core::ir::Capability::kAllowClipDistancesOnF32,
+    core::ir::Capability::kAllowDuplicateBindings,
+    core::ir::Capability::kAllowNonCoreTypes,
+};
+
 /// @param module the Tint IR module to generate
 /// @param options the printer options
 /// @returns the result of printing the HLSL shader on success, or failure
diff --git a/src/tint/lang/hlsl/writer/writer_fuzz.cc b/src/tint/lang/hlsl/writer/writer_fuzz.cc
index 4c670af..e0b65d8 100644
--- a/src/tint/lang/hlsl/writer/writer_fuzz.cc
+++ b/src/tint/lang/hlsl/writer/writer_fuzz.cc
@@ -33,6 +33,7 @@
 #include "src/tint/lang/core/type/pointer.h"
 #include "src/tint/lang/hlsl/validate/validate.h"
 #include "src/tint/lang/hlsl/writer/helpers/generate_bindings.h"
+#include "src/tint/lang/hlsl/writer/printer/printer.h"
 #include "src/tint/lang/hlsl/writer/writer.h"
 #include "src/tint/utils/command/command.h"
 
@@ -133,5 +134,4 @@
 
 TINT_IR_MODULE_FUZZER(tint::hlsl::writer::IRFuzzer,
                       tint::core::ir::Capabilities{},
-                      tint::core::ir::Capabilities{
-                          tint::core::ir::Capability::kAllowModuleScopeLets});
+                      tint::hlsl::writer::kPrinterCapabilities);
diff --git a/src/tint/lang/msl/writer/BUILD.cmake b/src/tint/lang/msl/writer/BUILD.cmake
index 6a69fae..690b8db 100644
--- a/src/tint/lang/msl/writer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/BUILD.cmake
@@ -176,6 +176,7 @@
     tint_lang_msl_writer
     tint_lang_msl_writer_common
     tint_lang_msl_writer_helpers
+    tint_lang_msl_writer_printer
   )
 endif(TINT_BUILD_MSL_WRITER)
 
diff --git a/src/tint/lang/msl/writer/BUILD.gn b/src/tint/lang/msl/writer/BUILD.gn
index de4d62e..2412e0f 100644
--- a/src/tint/lang/msl/writer/BUILD.gn
+++ b/src/tint/lang/msl/writer/BUILD.gn
@@ -155,6 +155,7 @@
         "${tint_src_dir}/lang/msl/writer",
         "${tint_src_dir}/lang/msl/writer/common",
         "${tint_src_dir}/lang/msl/writer/helpers",
+        "${tint_src_dir}/lang/msl/writer/printer",
       ]
     }
   }
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index a95be18..9c38261 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -124,18 +124,7 @@
 
     /// @returns the generated MSL shader
     tint::Result<Output> Generate() {
-        auto valid = core::ir::ValidateAndDumpIfNeeded(
-            ir_, "msl.Printer",
-            core::ir::Capabilities{
-                core::ir::Capability::kAllow8BitIntegers,
-                core::ir::Capability::kAllow64BitIntegers,
-                core::ir::Capability::kAllowPointersAndHandlesInStructures,
-                core::ir::Capability::kAllowPrivateVarsInFunctions,
-                core::ir::Capability::kAllowAnyLetType,
-                core::ir::Capability::kAllowModuleScopeLets,
-                core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint,
-                core::ir::Capability::kAllowNonCoreTypes,
-            });
+        auto valid = core::ir::ValidateAndDumpIfNeeded(ir_, "msl.Printer", kPrinterCapabilities);
         if (valid != Success) {
             return std::move(valid.Failure());
         }
diff --git a/src/tint/lang/msl/writer/printer/printer.h b/src/tint/lang/msl/writer/printer/printer.h
index 956722b..3392793 100644
--- a/src/tint/lang/msl/writer/printer/printer.h
+++ b/src/tint/lang/msl/writer/printer/printer.h
@@ -28,6 +28,7 @@
 #ifndef SRC_TINT_LANG_MSL_WRITER_PRINTER_PRINTER_H_
 #define SRC_TINT_LANG_MSL_WRITER_PRINTER_PRINTER_H_
 
+#include "src/tint/lang/core/ir/validator.h"
 #include "src/tint/lang/msl/writer/common/options.h"
 #include "src/tint/lang/msl/writer/common/output.h"
 #include "src/tint/utils/result.h"
@@ -39,6 +40,18 @@
 
 namespace tint::msl::writer {
 
+// The capabilities that might be needed due to raising.
+const core::ir::Capabilities kPrinterCapabilities{
+    core::ir::Capability::kAllow8BitIntegers,
+    core::ir::Capability::kAllow64BitIntegers,
+    core::ir::Capability::kAllowPointersAndHandlesInStructures,
+    core::ir::Capability::kAllowPrivateVarsInFunctions,
+    core::ir::Capability::kAllowAnyLetType,
+    core::ir::Capability::kAllowModuleScopeLets,
+    core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint,
+    core::ir::Capability::kAllowNonCoreTypes,
+};
+
 /// @param module the Tint IR module to generate
 /// @returns the result of printing the MSL shader on success, or failure
 Result<Output> Print(core::ir::Module& module, const Options& options);
diff --git a/src/tint/lang/msl/writer/writer_fuzz.cc b/src/tint/lang/msl/writer/writer_fuzz.cc
index d35172f..46cb83b 100644
--- a/src/tint/lang/msl/writer/writer_fuzz.cc
+++ b/src/tint/lang/msl/writer/writer_fuzz.cc
@@ -32,6 +32,7 @@
 #include "src/tint/lang/core/ir/var.h"
 #include "src/tint/lang/core/type/pointer.h"
 #include "src/tint/lang/msl/writer/helpers/generate_bindings.h"
+#include "src/tint/lang/msl/writer/printer/printer.h"
 #include "src/tint/lang/msl/writer/writer.h"
 
 namespace tint::msl::writer {
@@ -80,5 +81,4 @@
 
 TINT_IR_MODULE_FUZZER(tint::msl::writer::IRFuzzer,
                       tint::core::ir::Capabilities{},
-                      tint::core::ir::Capabilities{
-                          tint::core::ir::Capability::kAllowWorkspacePointerInputToEntryPoint});
+                      tint::msl::writer::kPrinterCapabilities);
diff --git a/src/tint/lang/spirv/writer/BUILD.cmake b/src/tint/lang/spirv/writer/BUILD.cmake
index 1e81d00..e818506 100644
--- a/src/tint/lang/spirv/writer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/BUILD.cmake
@@ -205,6 +205,7 @@
     tint_lang_spirv_writer
     tint_lang_spirv_writer_common
     tint_lang_spirv_writer_helpers
+    tint_lang_spirv_writer_printer
   )
 endif(TINT_BUILD_SPV_WRITER)
 
diff --git a/src/tint/lang/spirv/writer/BUILD.gn b/src/tint/lang/spirv/writer/BUILD.gn
index 2c91907..d688bf0 100644
--- a/src/tint/lang/spirv/writer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/BUILD.gn
@@ -182,6 +182,7 @@
         "${tint_src_dir}/lang/spirv/writer",
         "${tint_src_dir}/lang/spirv/writer/common",
         "${tint_src_dir}/lang/spirv/writer/helpers",
+        "${tint_src_dir}/lang/spirv/writer/printer",
       ]
     }
   }
diff --git a/src/tint/lang/spirv/writer/writer_fuzz.cc b/src/tint/lang/spirv/writer/writer_fuzz.cc
index 6dc4993..d71f328 100644
--- a/src/tint/lang/spirv/writer/writer_fuzz.cc
+++ b/src/tint/lang/spirv/writer/writer_fuzz.cc
@@ -31,6 +31,7 @@
 #include "src/tint/lang/core/ir/disassembler.h"
 #include "src/tint/lang/spirv/validate/validate.h"
 #include "src/tint/lang/spirv/writer/helpers/generate_bindings.h"
+#include "src/tint/lang/spirv/writer/printer/printer.h"
 
 namespace tint::spirv::writer {
 namespace {
@@ -65,5 +66,4 @@
 
 TINT_IR_MODULE_FUZZER(tint::spirv::writer::IRFuzzer,
                       tint::core::ir::Capabilities{},
-                      tint::core::ir::Capabilities{
-                          tint::core::ir::Capability::kAllowAnyInputAttachmentIndexType});
+                      tint::spirv::writer::kPrinterCapabilities);