[fuzz] Validate IR modules against fuzzer-specific capabilities
Different IR fuzzers have different predconditions and therefore
require the IR module to be validated against different IR
capabilities. Add a parameter to the TINT_IR_MODULE_FUZZER macro that
fuzzers use to set their supported capabilities.
Instead of validating the IR module once after decoding, move
validation into the Run loop so that we can validate against these
per-fuzzer capabilities.
Move capability lists to transform header files so that they can be
shared between fuzzers and the transforms themselves.
Change-Id: I38cf6aaa337320a63acb57ad1cfa5362dee84ec1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/213955
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/cmd/fuzz/ir/fuzz.cc b/src/tint/cmd/fuzz/ir/fuzz.cc
index a917336..bd65e7b 100644
--- a/src/tint/cmd/fuzz/ir/fuzz.cc
+++ b/src/tint/cmd/fuzz/ir/fuzz.cc
@@ -129,6 +129,12 @@
std::cout << " • [" << i << "] Running: " << currently_running << '\n';
}
auto mod = acquire_module();
+ if (tint::core::ir::Validate(mod, fuzzer.capabilities) != tint::Success) {
+ if (options.verbose) {
+ std::cout << " Failed to validate against fuzzer capabilities\n";
+ }
+ return;
+ }
fuzzer.fn(mod, data);
}));
}
@@ -148,6 +154,12 @@
std::cout << " • Running: " << currently_running << '\n';
}
auto mod = acquire_module();
+ if (tint::core::ir::Validate(mod, fuzzer.capabilities) != tint::Success) {
+ if (options.verbose) {
+ std::cout << " Failed to validate against fuzzer capabilities\n";
+ }
+ continue;
+ }
fuzzer.fn(mod, data);
}
}
diff --git a/src/tint/cmd/fuzz/ir/fuzz.h b/src/tint/cmd/fuzz/ir/fuzz.h
index 209f41e..7c51d1b 100644
--- a/src/tint/cmd/fuzz/ir/fuzz.h
+++ b/src/tint/cmd/fuzz/ir/fuzz.h
@@ -33,6 +33,7 @@
#include <tuple>
#include <utility>
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/bytes/buffer_reader.h"
#include "src/tint/utils/bytes/decoder.h"
#include "src/tint/utils/containers/slice.h"
@@ -58,10 +59,13 @@
struct IRFuzzer {
/// @param name the name of the fuzzer
/// @param fn the fuzzer function
+ /// @param capabilities the capabilities that the fuzzer can accept
/// @returns an IRFuzzer that invokes the function @p fn with the IR module, along with any
/// additional arguments which are deserialized from the fuzzer input.
template <typename... ARGS>
- static IRFuzzer Create(std::string_view name, void (*fn)(core::ir::Module&, ARGS...)) {
+ static IRFuzzer Create(std::string_view name,
+ void (*fn)(core::ir::Module&, ARGS...),
+ core::ir::Capabilities capabilities) {
if constexpr (sizeof...(ARGS) > 0) {
auto fn_with_decode = [fn](core::ir::Module& module, Slice<const std::byte> data) {
if (!data.data) {
@@ -75,11 +79,12 @@
std::apply(*fn, all_args);
}
};
- return IRFuzzer{name, std::move(fn_with_decode)};
+ return IRFuzzer{name, std::move(fn_with_decode), capabilities};
} else {
return IRFuzzer{
name,
[fn](core::ir::Module& module, Slice<const std::byte>) { fn(module); },
+ capabilities,
};
}
}
@@ -88,6 +93,8 @@
std::string_view name;
/// The fuzzer function
std::function<void(core::ir::Module&, Slice<const std::byte> data)> fn;
+ /// The IR capabilities that the fuzzer can accept.
+ core::ir::Capabilities capabilities;
};
/// Registers the fuzzer function with the IR fuzzer executable.
@@ -105,9 +112,9 @@
#endif // TINT_BUILD_IR_BINARY
/// TINT_IR_MODULE_FUZZER registers the fuzzer function.
-#define TINT_IR_MODULE_FUZZER(FUNCTION) \
- TINT_STATIC_INIT( \
- ::tint::fuzz::ir::Register(::tint::fuzz::ir::IRFuzzer::Create(#FUNCTION, FUNCTION)))
+#define TINT_IR_MODULE_FUZZER(FUNCTION, CAPABILITIES) \
+ TINT_STATIC_INIT(::tint::fuzz::ir::Register( \
+ ::tint::fuzz::ir::IRFuzzer::Create(#FUNCTION, FUNCTION, (CAPABILITIES))))
} // namespace tint::fuzz::ir
diff --git a/src/tint/cmd/fuzz/ir/main_fuzz.cc b/src/tint/cmd/fuzz/ir/main_fuzz.cc
index 606230e..7965a57 100644
--- a/src/tint/cmd/fuzz/ir/main_fuzz.cc
+++ b/src/tint/cmd/fuzz/ir/main_fuzz.cc
@@ -50,20 +50,15 @@
}
DEFINE_BINARY_PROTO_FUZZER(const tint::cmd::fuzz::ir::pb::Root& pb) {
- /// As the fuzzers are free to mutate the module, we need to deserialize a few module for each
+ /// As the fuzzers are free to mutate the module, we need to deserialize a new module for each
/// sub-fuzzer. Because the protobuf may error when deserializing and the module may be invalid,
- /// we early deserialize and validate the first module. If this fails, then we do not call
- /// Run().
+ /// we early deserialize. If this fails, then we do not call Run().
std::optional<tint::core::ir::Module> module;
{
auto decoded = tint::core::ir::binary::Decode(pb.module());
if (decoded != tint::Success) {
return; // Failed to decode
}
- tint::core::ir::Capabilities caps;
- if (tint::core::ir::Validate(decoded.Get(), caps) != tint::Success) {
- return; // Failed to validate
- }
module = std::move(decoded.Move());
}
auto acquire_module = [&] {
diff --git a/src/tint/lang/core/ir/binary/roundtrip_fuzz.cc b/src/tint/lang/core/ir/binary/roundtrip_fuzz.cc
index 17cfe54..a7ee926 100644
--- a/src/tint/lang/core/ir/binary/roundtrip_fuzz.cc
+++ b/src/tint/lang/core/ir/binary/roundtrip_fuzz.cc
@@ -68,4 +68,5 @@
} // namespace
} // namespace tint::core::ir::binary
-TINT_IR_MODULE_FUZZER(tint::core::ir::binary::IRBinaryRoundtripFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::binary::IRBinaryRoundtripFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/add_empty_entry_point.cc b/src/tint/lang/core/ir/transform/add_empty_entry_point.cc
index 8b25aa6..c51b08a 100644
--- a/src/tint/lang/core/ir/transform/add_empty_entry_point.cc
+++ b/src/tint/lang/core/ir/transform/add_empty_entry_point.cc
@@ -55,9 +55,8 @@
} // namespace
Result<SuccessType> AddEmptyEntryPoint(Module& ir) {
- auto result = ValidateAndDumpIfNeeded(
- ir, "core.AddEmptyEntryPoint",
- core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings});
+ auto result =
+ ValidateAndDumpIfNeeded(ir, "core.AddEmptyEntryPoint", kAddEmptyEntryPointCapabilities);
if (result != Success) {
return result.Failure();
}
diff --git a/src/tint/lang/core/ir/transform/add_empty_entry_point.h b/src/tint/lang/core/ir/transform/add_empty_entry_point.h
index 786377d..46ca5ca 100644
--- a/src/tint/lang/core/ir/transform/add_empty_entry_point.h
+++ b/src/tint/lang/core/ir/transform/add_empty_entry_point.h
@@ -30,6 +30,7 @@
#include <string>
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -39,6 +40,11 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kAddEmptyEntryPointCapabilities{
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+};
+
/// Add an empty entry point to the module, if no other entry points exist.
/// @param module the module to transform
/// @returns success or failure
diff --git a/src/tint/lang/core/ir/transform/add_empty_entry_point_fuzz.cc b/src/tint/lang/core/ir/transform/add_empty_entry_point_fuzz.cc
index 70056f6..60f87df 100644
--- a/src/tint/lang/core/ir/transform/add_empty_entry_point_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/add_empty_entry_point_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::AddEmptyEntryPointFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::AddEmptyEntryPointFuzzer,
+ tint::core::ir::transform::kAddEmptyEntryPointCapabilities);
diff --git a/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc b/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc
index 8228b05..61cb9d9 100644
--- a/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/array_length_from_uniform_fuzz.cc
@@ -51,4 +51,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ArrayLengthFromUniformFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ArrayLengthFromUniformFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc
index cbb95fe..65fc3a5 100644
--- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::Bgra8UnormPolyfillFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::Bgra8UnormPolyfillFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc
index 13875ea..37b427b 100644
--- a/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/binary_polyfill_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BinaryPolyfillFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BinaryPolyfillFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc b/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc
index 68ba651..f26f770 100644
--- a/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/binding_remapper_fuzz.cc
@@ -48,4 +48,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BindingRemapperFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BindingRemapperFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc b/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc
index a13427d..cc97e02 100644
--- a/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/block_decorated_structs_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BlockDecoratedStructsFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BlockDecoratedStructsFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc
index 298bbaa..3435ede 100644
--- a/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/builtin_polyfill_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BuiltinPolyfillFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::BuiltinPolyfillFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/combine_access_instructions_fuzz.cc b/src/tint/lang/core/ir/transform/combine_access_instructions_fuzz.cc
index ea0f01d..b37e662 100644
--- a/src/tint/lang/core/ir/transform/combine_access_instructions_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/combine_access_instructions_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::CombineAccessInstructionsFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::CombineAccessInstructionsFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc b/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc
index 9d8f963..b8a4de5 100644
--- a/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/conversion_polyfill_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ConversionPolyfillFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ConversionPolyfillFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper.cc b/src/tint/lang/core/ir/transform/demote_to_helper.cc
index ceb6f8f..bc69ec2 100644
--- a/src/tint/lang/core/ir/transform/demote_to_helper.cc
+++ b/src/tint/lang/core/ir/transform/demote_to_helper.cc
@@ -214,11 +214,7 @@
} // namespace
Result<SuccessType> DemoteToHelper(Module& ir) {
- auto result = ValidateAndDumpIfNeeded(ir, "core.DemoteToHelper",
- core::ir::Capabilities{
- core::ir::Capability::kAllowVectorElementPointer,
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ auto result = ValidateAndDumpIfNeeded(ir, "core.DemoteToHelper", kDemoteToHelperCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper.h b/src/tint/lang/core/ir/transform/demote_to_helper.h
index 1558b70..8131d9d 100644
--- a/src/tint/lang/core/ir/transform/demote_to_helper.h
+++ b/src/tint/lang/core/ir/transform/demote_to_helper.h
@@ -30,6 +30,7 @@
#include <string>
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -39,6 +40,12 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kDemoteToHelperCapabilities{
+ core::ir::Capability::kAllowVectorElementPointer,
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// DemoteToHelper is a transform that emulates demote-to-helper semantics for discard instructions.
///
/// For backend targets that implement discard by terminating the invocation, we need to change the
diff --git a/src/tint/lang/core/ir/transform/demote_to_helper_fuzz.cc b/src/tint/lang/core/ir/transform/demote_to_helper_fuzz.cc
index ad896ab..3afc25d 100644
--- a/src/tint/lang/core/ir/transform/demote_to_helper_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/demote_to_helper_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::DemoteToHelperFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::DemoteToHelperFuzzer,
+ tint::core::ir::transform::kDemoteToHelperCapabilities);
diff --git a/src/tint/lang/core/ir/transform/direct_variable_access.cc b/src/tint/lang/core/ir/transform/direct_variable_access.cc
index 67686ea..b5917e3 100644
--- a/src/tint/lang/core/ir/transform/direct_variable_access.cc
+++ b/src/tint/lang/core/ir/transform/direct_variable_access.cc
@@ -704,10 +704,8 @@
} // namespace
Result<SuccessType> DirectVariableAccess(Module& ir, const DirectVariableAccessOptions& options) {
- auto result = ValidateAndDumpIfNeeded(ir, "core.DirectVariableAccess",
- core::ir::Capabilities{
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ auto result =
+ ValidateAndDumpIfNeeded(ir, "core.DirectVariableAccess", kDirectVariableAccessCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/direct_variable_access.h b/src/tint/lang/core/ir/transform/direct_variable_access.h
index 65f220f..6abe171 100644
--- a/src/tint/lang/core/ir/transform/direct_variable_access.h
+++ b/src/tint/lang/core/ir/transform/direct_variable_access.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_DIRECT_VARIABLE_ACCESS_H_
#define SRC_TINT_LANG_CORE_IR_TRANSFORM_DIRECT_VARIABLE_ACCESS_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/reflection/reflection.h"
#include "src/tint/utils/result/result.h"
@@ -38,6 +39,11 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kDirectVariableAccessCapabilities{
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// DirectVariableAccessOptions adjusts the behaviour of the transform.
struct DirectVariableAccessOptions {
/// If true, then 'private' sub-object pointer arguments will be transformed.
diff --git a/src/tint/lang/core/ir/transform/direct_variable_access_fuzz.cc b/src/tint/lang/core/ir/transform/direct_variable_access_fuzz.cc
index 33f0306..dd22995 100644
--- a/src/tint/lang/core/ir/transform/direct_variable_access_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/direct_variable_access_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::DirectVariableAccessFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::DirectVariableAccessFuzzer,
+ tint::core::ir::transform::kDirectVariableAccessCapabilities);
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc b/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc
index ab95aa9..cc6d261 100644
--- a/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture_fuzz.cc
@@ -49,4 +49,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::MultiplanarExternalTextureFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::MultiplanarExternalTextureFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/preserve_padding.cc b/src/tint/lang/core/ir/transform/preserve_padding.cc
index 463ebfa..82b5896 100644
--- a/src/tint/lang/core/ir/transform/preserve_padding.cc
+++ b/src/tint/lang/core/ir/transform/preserve_padding.cc
@@ -173,9 +173,7 @@
} // namespace
Result<SuccessType> PreservePadding(Module& ir) {
- auto result = ValidateAndDumpIfNeeded(
- ir, "core.PreservePadding",
- core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings});
+ auto result = ValidateAndDumpIfNeeded(ir, "core.PreservePadding", kPreservePaddingCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/preserve_padding.h b/src/tint/lang/core/ir/transform/preserve_padding.h
index 6c7dd0a..ba135cf 100644
--- a/src/tint/lang/core/ir/transform/preserve_padding.h
+++ b/src/tint/lang/core/ir/transform/preserve_padding.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_PRESERVE_PADDING_H_
#define SRC_TINT_LANG_CORE_IR_TRANSFORM_PRESERVE_PADDING_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -37,6 +38,11 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kPreservePaddingCapabilities{
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+};
+
/// PreservePadding is a transform that decomposes stores of whole structure and array types to
/// preserve padding bytes.
///
diff --git a/src/tint/lang/core/ir/transform/preserve_padding_fuzz.cc b/src/tint/lang/core/ir/transform/preserve_padding_fuzz.cc
index 1dddfd9..e14957e 100644
--- a/src/tint/lang/core/ir/transform/preserve_padding_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/preserve_padding_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::PreservePaddingFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::PreservePaddingFuzzer,
+ tint::core::ir::transform::kPreservePaddingCapabilities);
diff --git a/src/tint/lang/core/ir/transform/remove_terminator_args.cc b/src/tint/lang/core/ir/transform/remove_terminator_args.cc
index 7feb71d..2e92362 100644
--- a/src/tint/lang/core/ir/transform/remove_terminator_args.cc
+++ b/src/tint/lang/core/ir/transform/remove_terminator_args.cc
@@ -164,14 +164,8 @@
} // namespace
Result<SuccessType> RemoveTerminatorArgs(Module& ir) {
- auto result = ValidateAndDumpIfNeeded(ir, "core.RemoveTerminatorArgs",
- core::ir::Capabilities{
- core::ir::Capability::kAllow8BitIntegers,
- core::ir::Capability::kAllowPointersInStructures,
- core::ir::Capability::kAllowVectorElementPointer,
- core::ir::Capability::kAllowHandleVarsWithoutBindings,
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ auto result =
+ ValidateAndDumpIfNeeded(ir, "core.RemoveTerminatorArgs", kRemoveTerminatorArgsCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/remove_terminator_args.h b/src/tint/lang/core/ir/transform/remove_terminator_args.h
index 98fbc65..0b366b8 100644
--- a/src/tint/lang/core/ir/transform/remove_terminator_args.h
+++ b/src/tint/lang/core/ir/transform/remove_terminator_args.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_REMOVE_TERMINATOR_ARGS_H_
#define SRC_TINT_LANG_CORE_IR_TRANSFORM_REMOVE_TERMINATOR_ARGS_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -37,6 +38,15 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kRemoveTerminatorArgsCapabilities{
+ core::ir::Capability::kAllow8BitIntegers,
+ core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowVectorElementPointer,
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// RemoveTerminatorArgs is a transform that removes all arguments from terminator instructions and
/// replaces them with stores to temporary variables instead. This is needed to prepare codegen for
/// textual languages.
diff --git a/src/tint/lang/core/ir/transform/remove_terminator_args_fuzz.cc b/src/tint/lang/core/ir/transform/remove_terminator_args_fuzz.cc
index 4cefe7f..076719e 100644
--- a/src/tint/lang/core/ir/transform/remove_terminator_args_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/remove_terminator_args_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RemoveTerminatorArgsFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RemoveTerminatorArgsFuzzer,
+ tint::core::ir::transform::kRemoveTerminatorArgsCapabilities);
diff --git a/src/tint/lang/core/ir/transform/rename_conflicts.cc b/src/tint/lang/core/ir/transform/rename_conflicts.cc
index d79ad9d..fa58c4e 100644
--- a/src/tint/lang/core/ir/transform/rename_conflicts.cc
+++ b/src/tint/lang/core/ir/transform/rename_conflicts.cc
@@ -293,14 +293,7 @@
} // namespace
Result<SuccessType> RenameConflicts(core::ir::Module& ir) {
- auto result = ValidateAndDumpIfNeeded(ir, "core.RenameConflicts",
- core::ir::Capabilities{
- core::ir::Capability::kAllow8BitIntegers,
- core::ir::Capability::kAllowPointersInStructures,
- core::ir::Capability::kAllowVectorElementPointer,
- core::ir::Capability::kAllowHandleVarsWithoutBindings,
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ auto result = ValidateAndDumpIfNeeded(ir, "core.RenameConflicts", kRenameConflictsCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/rename_conflicts.h b/src/tint/lang/core/ir/transform/rename_conflicts.h
index 29b6d4a..a56cab3 100644
--- a/src/tint/lang/core/ir/transform/rename_conflicts.h
+++ b/src/tint/lang/core/ir/transform/rename_conflicts.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_RENAME_CONFLICTS_H_
#define SRC_TINT_LANG_CORE_IR_TRANSFORM_RENAME_CONFLICTS_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -37,6 +38,15 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kRenameConflictsCapabilities{
+ core::ir::Capability::kAllow8BitIntegers,
+ core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowVectorElementPointer,
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// RenameConflicts is a transform that renames declarations which prevent identifiers from
/// resolving to the correct declaration, and those with identical identifiers declared in the same
/// scope or a parent scope.
diff --git a/src/tint/lang/core/ir/transform/rename_conflicts_fuzz.cc b/src/tint/lang/core/ir/transform/rename_conflicts_fuzz.cc
index c125848..39c2c8d 100644
--- a/src/tint/lang/core/ir/transform/rename_conflicts_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/rename_conflicts_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RenameConflictsFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RenameConflictsFuzzer,
+ tint::core::ir::transform::kRenameConflictsCapabilities);
diff --git a/src/tint/lang/core/ir/transform/robustness_fuzz.cc b/src/tint/lang/core/ir/transform/robustness_fuzz.cc
index 930ed84..410d212 100644
--- a/src/tint/lang/core/ir/transform/robustness_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/robustness_fuzz.cc
@@ -52,4 +52,4 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RobustnessFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::RobustnessFuzzer, tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/core/ir/transform/std140.cc b/src/tint/lang/core/ir/transform/std140.cc
index c799741..ac9a685 100644
--- a/src/tint/lang/core/ir/transform/std140.cc
+++ b/src/tint/lang/core/ir/transform/std140.cc
@@ -450,9 +450,7 @@
} // namespace
Result<SuccessType> Std140(Module& ir) {
- auto result = ValidateAndDumpIfNeeded(
- ir, "core.Std140",
- core::ir::Capabilities{core::ir::Capability::kAllowHandleVarsWithoutBindings});
+ auto result = ValidateAndDumpIfNeeded(ir, "core.Std140", kStd140Capabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/std140.h b/src/tint/lang/core/ir/transform/std140.h
index 89852db..2f83e04 100644
--- a/src/tint/lang/core/ir/transform/std140.h
+++ b/src/tint/lang/core/ir/transform/std140.h
@@ -30,6 +30,7 @@
#include <string>
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -39,6 +40,11 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kStd140Capabilities{
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+};
+
/// Std140 is a transform that rewrites matrix types in the uniform address space to conform to
/// GLSL's std140 layout rules.
/// @note requires the DirectVariableAccess transform to have been run first to remove uniform
diff --git a/src/tint/lang/core/ir/transform/std140_fuzz.cc b/src/tint/lang/core/ir/transform/std140_fuzz.cc
index 091def8..e8134f8 100644
--- a/src/tint/lang/core/ir/transform/std140_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/std140_fuzz.cc
@@ -66,4 +66,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::Std140Fuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::Std140Fuzzer,
+ tint::core::ir::transform::kStd140Capabilities);
diff --git a/src/tint/lang/core/ir/transform/value_to_let.cc b/src/tint/lang/core/ir/transform/value_to_let.cc
index 3794625..ffa5f44 100644
--- a/src/tint/lang/core/ir/transform/value_to_let.cc
+++ b/src/tint/lang/core/ir/transform/value_to_let.cc
@@ -257,14 +257,7 @@
} // namespace
Result<SuccessType> ValueToLet(Module& ir, const ValueToLetConfig& cfg) {
- auto result = ValidateAndDumpIfNeeded(ir, "core.ValueToLet",
- core::ir::Capabilities{
- core::ir::Capability::kAllow8BitIntegers,
- core::ir::Capability::kAllowPointersInStructures,
- core::ir::Capability::kAllowVectorElementPointer,
- core::ir::Capability::kAllowHandleVarsWithoutBindings,
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ auto result = ValidateAndDumpIfNeeded(ir, "core.ValueToLet", kValueToLetCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/value_to_let.h b/src/tint/lang/core/ir/transform/value_to_let.h
index 6b72f1a..b0c5b35 100644
--- a/src/tint/lang/core/ir/transform/value_to_let.h
+++ b/src/tint/lang/core/ir/transform/value_to_let.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_VALUE_TO_LET_H_
#define SRC_TINT_LANG_CORE_IR_TRANSFORM_VALUE_TO_LET_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/reflection/reflection.h"
#include "src/tint/utils/result/result.h"
@@ -38,6 +39,15 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kValueToLetCapabilities{
+ core::ir::Capability::kAllow8BitIntegers,
+ core::ir::Capability::kAllowPointersInStructures,
+ core::ir::Capability::kAllowVectorElementPointer,
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// Configuration for ValueToLet transform.
struct ValueToLetConfig {
/// Replace pointer lets with their value
diff --git a/src/tint/lang/core/ir/transform/value_to_let_fuzz.cc b/src/tint/lang/core/ir/transform/value_to_let_fuzz.cc
index d593e2d..544a760 100644
--- a/src/tint/lang/core/ir/transform/value_to_let_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/value_to_let_fuzz.cc
@@ -62,4 +62,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ValueToLetFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ValueToLetFuzzer,
+ tint::core::ir::transform::kValueToLetCapabilities);
diff --git a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.cc b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.cc
index ec96c26..96996bf 100644
--- a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.cc
+++ b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.cc
@@ -95,11 +95,7 @@
Result<SuccessType> VectorizeScalarMatrixConstructors(Module& ir) {
auto result = ValidateAndDumpIfNeeded(ir, "core.VectorizeScalarMatrixConstructors",
- core::ir::Capabilities{
- core::ir::Capability::kAllowVectorElementPointer,
- core::ir::Capability::kAllowHandleVarsWithoutBindings,
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ kVectorizeScalarMatrixConstructorsCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h
index ff4ef93..a57bf66 100644
--- a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h
+++ b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_CORE_IR_TRANSFORM_VECTORIZE_SCALAR_MATRIX_CONSTRUCTORS_H_
#define SRC_TINT_LANG_CORE_IR_TRANSFORM_VECTORIZE_SCALAR_MATRIX_CONSTRUCTORS_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -37,6 +38,13 @@
namespace tint::core::ir::transform {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kVectorizeScalarMatrixConstructorsCapabilities{
+ core::ir::Capability::kAllowVectorElementPointer,
+ core::ir::Capability::kAllowHandleVarsWithoutBindings,
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// VectorizeScalarMatrixConstructors is a transform that replaces construct instructions that
/// produce matrices from scalar operands to construct individual columns first.
///
diff --git a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_fuzz.cc b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_fuzz.cc
index c3fb9c1..f1776d9 100644
--- a/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/vectorize_scalar_matrix_constructors_fuzz.cc
@@ -48,4 +48,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::VectorizeScalarMatrixConstructorsFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::VectorizeScalarMatrixConstructorsFuzzer,
+ tint::core::ir::transform::kVectorizeScalarMatrixConstructorsCapabilities);
diff --git a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc
index 3c7f868..6a897df 100644
--- a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc
+++ b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory_fuzz.cc
@@ -47,4 +47,5 @@
} // namespace
} // namespace tint::core::ir::transform
-TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ZeroInitWorkgroupMemoryFuzzer);
+TINT_IR_MODULE_FUZZER(tint::core::ir::transform::ZeroInitWorkgroupMemoryFuzzer,
+ tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/glsl/writer/writer_fuzz.cc b/src/tint/lang/glsl/writer/writer_fuzz.cc
index 2421817..bc27f5d 100644
--- a/src/tint/lang/glsl/writer/writer_fuzz.cc
+++ b/src/tint/lang/glsl/writer/writer_fuzz.cc
@@ -272,4 +272,4 @@
} // namespace
} // namespace tint::glsl::writer
-TINT_IR_MODULE_FUZZER(tint::glsl::writer::IRFuzzer);
+TINT_IR_MODULE_FUZZER(tint::glsl::writer::IRFuzzer, tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/hlsl/writer/raise/promote_initializers.cc b/src/tint/lang/hlsl/writer/raise/promote_initializers.cc
index e09b39f..b5f5132 100644
--- a/src/tint/lang/hlsl/writer/raise/promote_initializers.cc
+++ b/src/tint/lang/hlsl/writer/raise/promote_initializers.cc
@@ -238,11 +238,8 @@
} // namespace
Result<SuccessType> PromoteInitializers(core::ir::Module& ir) {
- auto result = ValidateAndDumpIfNeeded(ir, "hlsl.PromoteInitializers",
- core::ir::Capabilities{
- core::ir::Capability::kAllowVectorElementPointer,
- core::ir::Capability::kAllowClipDistancesOnF32,
- });
+ auto result =
+ ValidateAndDumpIfNeeded(ir, "hlsl.PromoteInitializers", kPromoteInitializersCapabilities);
if (result != Success) {
return result;
}
diff --git a/src/tint/lang/hlsl/writer/raise/promote_initializers.h b/src/tint/lang/hlsl/writer/raise/promote_initializers.h
index 768a8ce..8c80001 100644
--- a/src/tint/lang/hlsl/writer/raise/promote_initializers.h
+++ b/src/tint/lang/hlsl/writer/raise/promote_initializers.h
@@ -28,6 +28,7 @@
#ifndef SRC_TINT_LANG_HLSL_WRITER_RAISE_PROMOTE_INITIALIZERS_H_
#define SRC_TINT_LANG_HLSL_WRITER_RAISE_PROMOTE_INITIALIZERS_H_
+#include "src/tint/lang/core/ir/validator.h"
#include "src/tint/utils/result/result.h"
// Forward declarations.
@@ -37,6 +38,12 @@
namespace tint::hlsl::writer::raise {
+/// The capabilities that the transform can support.
+const core::ir::Capabilities kPromoteInitializersCapabilities{
+ core::ir::Capability::kAllowVectorElementPointer,
+ core::ir::Capability::kAllowClipDistancesOnF32,
+};
+
/// PromoteInitializers is a transform that moves inline struct and array initializers to a `let`
/// unless the initializer is already in a `let ` or `var`. For any `var` at the module scope it
/// will recursively break any array or struct initializers out of the constant into their own
diff --git a/src/tint/lang/hlsl/writer/raise/promote_initializers_fuzz.cc b/src/tint/lang/hlsl/writer/raise/promote_initializers_fuzz.cc
index 7683d95..7864eb7 100644
--- a/src/tint/lang/hlsl/writer/raise/promote_initializers_fuzz.cc
+++ b/src/tint/lang/hlsl/writer/raise/promote_initializers_fuzz.cc
@@ -48,4 +48,5 @@
} // namespace
} // namespace tint::hlsl::writer::raise
-TINT_IR_MODULE_FUZZER(tint::hlsl::writer::raise::PromoteInitializersFuzzer);
+TINT_IR_MODULE_FUZZER(tint::hlsl::writer::raise::PromoteInitializersFuzzer,
+ tint::hlsl::writer::raise::kPromoteInitializersCapabilities);
diff --git a/src/tint/lang/msl/writer/writer_fuzz.cc b/src/tint/lang/msl/writer/writer_fuzz.cc
index 667d299..332e364 100644
--- a/src/tint/lang/msl/writer/writer_fuzz.cc
+++ b/src/tint/lang/msl/writer/writer_fuzz.cc
@@ -79,4 +79,4 @@
} // namespace
} // namespace tint::msl::writer
-TINT_IR_MODULE_FUZZER(tint::msl::writer::IRFuzzer);
+TINT_IR_MODULE_FUZZER(tint::msl::writer::IRFuzzer, tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/spirv/writer/writer_ir_fuzz.cc b/src/tint/lang/spirv/writer/writer_ir_fuzz.cc
index 35191fd..e5ace56 100644
--- a/src/tint/lang/spirv/writer/writer_ir_fuzz.cc
+++ b/src/tint/lang/spirv/writer/writer_ir_fuzz.cc
@@ -54,4 +54,4 @@
} // namespace
} // namespace tint::spirv::writer
-TINT_IR_MODULE_FUZZER(tint::spirv::writer::IRFuzzer);
+TINT_IR_MODULE_FUZZER(tint::spirv::writer::IRFuzzer, tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/wgsl/writer/raise/ptr_to_ref_fuzz.cc b/src/tint/lang/wgsl/writer/raise/ptr_to_ref_fuzz.cc
index b67fb22..0b7dba8 100644
--- a/src/tint/lang/wgsl/writer/raise/ptr_to_ref_fuzz.cc
+++ b/src/tint/lang/wgsl/writer/raise/ptr_to_ref_fuzz.cc
@@ -47,4 +47,4 @@
} // namespace
} // namespace tint::wgsl::writer::raise
-TINT_IR_MODULE_FUZZER(tint::wgsl::writer::raise::PtrToRefFuzzer);
+TINT_IR_MODULE_FUZZER(tint::wgsl::writer::raise::PtrToRefFuzzer, tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/wgsl/writer/raise/raise_fuzz.cc b/src/tint/lang/wgsl/writer/raise/raise_fuzz.cc
index e63783c..9ab4bd7 100644
--- a/src/tint/lang/wgsl/writer/raise/raise_fuzz.cc
+++ b/src/tint/lang/wgsl/writer/raise/raise_fuzz.cc
@@ -47,4 +47,4 @@
} // namespace
} // namespace tint::wgsl::writer::raise
-TINT_IR_MODULE_FUZZER(tint::wgsl::writer::raise::RaiseFuzzer);
+TINT_IR_MODULE_FUZZER(tint::wgsl::writer::raise::RaiseFuzzer, tint::core::ir::Capabilities{});
diff --git a/src/tint/lang/wgsl/writer/raise/value_to_let_fuzz.cc b/src/tint/lang/wgsl/writer/raise/value_to_let_fuzz.cc
index 84755d0..58a489b 100644
--- a/src/tint/lang/wgsl/writer/raise/value_to_let_fuzz.cc
+++ b/src/tint/lang/wgsl/writer/raise/value_to_let_fuzz.cc
@@ -47,4 +47,4 @@
} // namespace
} // namespace tint::wgsl::writer::raise
-TINT_IR_MODULE_FUZZER(tint::wgsl::writer::raise::ValueToLetFuzzer);
+TINT_IR_MODULE_FUZZER(tint::wgsl::writer::raise::ValueToLetFuzzer, tint::core::ir::Capabilities{});