[tint][wgsl][fuzz] Parse base64 encoded comments As additional data that can be used for other fuzzer input for WGSL fuzzer tests. Change-Id: I07d564879f28fd214eefc28ec105d1f044eaab3a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162305 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/cmd/fuzz/wgsl/BUILD.cmake b/src/tint/cmd/fuzz/wgsl/BUILD.cmake index 362fd58..ca70b10 100644 --- a/src/tint/cmd/fuzz/wgsl/BUILD.cmake +++ b/src/tint/cmd/fuzz/wgsl/BUILD.cmake
@@ -54,6 +54,7 @@ tint_lang_wgsl_program_fuzz tint_lang_wgsl_sem tint_lang_wgsl_fuzz + tint_utils_bytes tint_utils_cli tint_utils_containers tint_utils_diagnostic @@ -62,6 +63,7 @@ tint_utils_macros tint_utils_math tint_utils_memory + tint_utils_reflection tint_utils_result tint_utils_rtti tint_utils_strconv @@ -108,6 +110,7 @@ tint_lang_wgsl_common tint_lang_wgsl_program tint_lang_wgsl_sem + tint_utils_bytes tint_utils_containers tint_utils_diagnostic tint_utils_ice
diff --git a/src/tint/cmd/fuzz/wgsl/BUILD.gn b/src/tint/cmd/fuzz/wgsl/BUILD.gn index 090fb75..5b10e5a 100644 --- a/src/tint/cmd/fuzz/wgsl/BUILD.gn +++ b/src/tint/cmd/fuzz/wgsl/BUILD.gn
@@ -55,6 +55,7 @@ "${tint_src_dir}/lang/wgsl/common", "${tint_src_dir}/lang/wgsl/program", "${tint_src_dir}/lang/wgsl/sem", + "${tint_src_dir}/utils/bytes", "${tint_src_dir}/utils/containers", "${tint_src_dir}/utils/diagnostic", "${tint_src_dir}/utils/ice", @@ -89,6 +90,7 @@ "${tint_src_dir}/lang/wgsl/program", "${tint_src_dir}/lang/wgsl/program:fuzz", "${tint_src_dir}/lang/wgsl/sem", + "${tint_src_dir}/utils/bytes", "${tint_src_dir}/utils/cli", "${tint_src_dir}/utils/containers", "${tint_src_dir}/utils/diagnostic", @@ -97,6 +99,7 @@ "${tint_src_dir}/utils/macros", "${tint_src_dir}/utils/math", "${tint_src_dir}/utils/memory", + "${tint_src_dir}/utils/reflection", "${tint_src_dir}/utils/result", "${tint_src_dir}/utils/rtti", "${tint_src_dir}/utils/strconv",
diff --git a/src/tint/cmd/fuzz/wgsl/fuzz.cc b/src/tint/cmd/fuzz/wgsl/fuzz.cc index b5a09b0..d6b90ec 100644 --- a/src/tint/cmd/fuzz/wgsl/fuzz.cc +++ b/src/tint/cmd/fuzz/wgsl/fuzz.cc
@@ -60,7 +60,7 @@ Fuzzers().Push(fuzzer); } -void Run(std::string_view wgsl, const Options& options) { +void Run(std::string_view wgsl, Slice<const std::byte> data, const Options& options) { tint::SetInternalCompilerErrorReporter(&TintInternalCompilerErrorReporter); // Ensure that fuzzers are sorted. Without this, the fuzzers may be registered in any order, @@ -82,10 +82,10 @@ tint::Vector<std::thread, 32> threads; threads.Resize(n); for (size_t i = 0; i < n; i++) { - threads[i] = std::thread([i, &program] { + threads[i] = std::thread([i, &program, &data] { auto& fuzzer = Fuzzers()[i]; currently_running = fuzzer.name; - fuzzer.fn(program); + fuzzer.fn(program, data); }); } for (auto& thread : threads) { @@ -95,7 +95,7 @@ TINT_DEFER(currently_running = ""); for (auto& fuzzer : Fuzzers()) { currently_running = fuzzer.name; - fuzzer.fn(program); + fuzzer.fn(program, data); } } }
diff --git a/src/tint/cmd/fuzz/wgsl/fuzz.h b/src/tint/cmd/fuzz/wgsl/fuzz.h index 7e68732..744ceb5 100644 --- a/src/tint/cmd/fuzz/wgsl/fuzz.h +++ b/src/tint/cmd/fuzz/wgsl/fuzz.h
@@ -29,22 +29,47 @@ #define SRC_TINT_CMD_FUZZ_WGSL_FUZZ_H_ #include <string> +#include <tuple> +#include <utility> #include "src/tint/lang/wgsl/program/program.h" +#include "src/tint/utils/bytes/decoder.h" #include "src/tint/utils/containers/slice.h" #include "src/tint/utils/macros/static_init.h" +#include "src/tint/utils/reflection/reflection.h" namespace tint::fuzz::wgsl { /// ProgramFuzzer describes a fuzzer function that takes a WGSL program as input struct ProgramFuzzer { - /// The function signature - using Fn = void(const Program&); + /// @param name the name of the fuzzer + /// @param fn the fuzzer function + /// @returns a ProgramFuzzer that invokes the function @p fn with the Program, along with any + /// additional arguments which are deserialized from the fuzzer input. + template <typename... ARGS> + static ProgramFuzzer Create(std::string_view name, void (*fn)(const Program&, ARGS...)) { + if constexpr (sizeof...(ARGS) > 0) { + auto fn_with_decode = [fn](const Program& program, Slice<const std::byte> data) { + bytes::Reader reader{data}; + if (auto data_args = bytes::Decode<std::tuple<std::decay_t<ARGS>...>>(reader)) { + auto all_args = + std::tuple_cat(std::tuple<const Program&>{program}, data_args.Get()); + std::apply(*fn, all_args); + } + }; + return ProgramFuzzer{name, std::move(fn_with_decode)}; + } else { + return ProgramFuzzer{ + name, + [fn](const Program& program, Slice<const std::byte>) { fn(program); }, + }; + } + } /// Name of the fuzzer function std::string_view name; - /// The fuzzer function pointer - Fn* fn = nullptr; + /// The fuzzer function + std::function<void(const Program&, Slice<const std::byte> data)> fn; }; /// Options for Run() @@ -55,16 +80,18 @@ /// Runs all the registered WGSL fuzzers with the supplied WGSL /// @param wgsl the input WGSL +/// @param data additional data used for fuzzing /// @param options the options for running the fuzzers -void Run(std::string_view wgsl, const Options& options); +void Run(std::string_view wgsl, Slice<const std::byte> data, const Options& options); /// Registers the fuzzer function with the WGSL fuzzer executable. /// @param fuzzer the fuzzer void Register(const ProgramFuzzer& fuzzer); /// TINT_WGSL_PROGRAM_FUZZER registers the fuzzer function to run as part of `tint_wgsl_fuzzer` -#define TINT_WGSL_PROGRAM_FUZZER(FUNCTION) \ - TINT_STATIC_INIT(::tint::fuzz::wgsl::Register({#FUNCTION, FUNCTION})) +#define TINT_WGSL_PROGRAM_FUZZER(FUNCTION) \ + TINT_STATIC_INIT(::tint::fuzz::wgsl::Register( \ + ::tint::fuzz::wgsl::ProgramFuzzer::Create(#FUNCTION, FUNCTION))) } // namespace tint::fuzz::wgsl
diff --git a/src/tint/cmd/fuzz/wgsl/main_fuzz.cc b/src/tint/cmd/fuzz/wgsl/main_fuzz.cc index 9b65369..1edcd04 100644 --- a/src/tint/cmd/fuzz/wgsl/main_fuzz.cc +++ b/src/tint/cmd/fuzz/wgsl/main_fuzz.cc
@@ -29,17 +29,20 @@ #include "src/tint/cmd/fuzz/wgsl/fuzz.h" #include "src/tint/utils/cli/cli.h" +#include "src/tint/utils/macros/defer.h" +#include "src/tint/utils/text/base64.h" namespace { tint::fuzz::wgsl::Options options; -} +} // namespace -extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* input, size_t size) { if (size > 0) { - std::string_view wgsl(reinterpret_cast<const char*>(data), size); - tint::fuzz::wgsl::Run(wgsl, options); + std::string_view wgsl(reinterpret_cast<const char*>(input), size); + auto data = tint::DecodeBase64FromComments(wgsl); + tint::fuzz::wgsl::Run(wgsl, data.Slice(), options); } return 0; }
diff --git a/src/tint/lang/wgsl/BUILD.cmake b/src/tint/lang/wgsl/BUILD.cmake index 7e09df7..5c9aa4b 100644 --- a/src/tint/lang/wgsl/BUILD.cmake +++ b/src/tint/lang/wgsl/BUILD.cmake
@@ -190,6 +190,7 @@ tint_lang_wgsl_sem tint_lang_wgsl_writer_ir_to_program tint_lang_wgsl_writer_raise + tint_utils_bytes tint_utils_containers tint_utils_diagnostic tint_utils_ice
diff --git a/src/tint/lang/wgsl/BUILD.gn b/src/tint/lang/wgsl/BUILD.gn index e27e459..9aa5213 100644 --- a/src/tint/lang/wgsl/BUILD.gn +++ b/src/tint/lang/wgsl/BUILD.gn
@@ -164,6 +164,7 @@ "${tint_src_dir}/lang/wgsl/sem", "${tint_src_dir}/lang/wgsl/writer/ir_to_program", "${tint_src_dir}/lang/wgsl/writer/raise", + "${tint_src_dir}/utils/bytes", "${tint_src_dir}/utils/containers", "${tint_src_dir}/utils/diagnostic", "${tint_src_dir}/utils/ice",
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.cmake b/src/tint/lang/wgsl/ast/transform/BUILD.cmake index 9100dc7..ef57905 100644 --- a/src/tint/lang/wgsl/ast/transform/BUILD.cmake +++ b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
@@ -242,6 +242,7 @@ tint_lang_wgsl_ast_transform tint_lang_wgsl_program tint_lang_wgsl_sem + tint_utils_bytes tint_utils_containers tint_utils_diagnostic tint_utils_ice @@ -249,6 +250,7 @@ tint_utils_macros tint_utils_math tint_utils_memory + tint_utils_reflection tint_utils_result tint_utils_rtti tint_utils_symbol
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.gn b/src/tint/lang/wgsl/ast/transform/BUILD.gn index 0a1bc92..c4250ef 100644 --- a/src/tint/lang/wgsl/ast/transform/BUILD.gn +++ b/src/tint/lang/wgsl/ast/transform/BUILD.gn
@@ -229,6 +229,7 @@ "${tint_src_dir}/lang/wgsl/ast/transform", "${tint_src_dir}/lang/wgsl/program", "${tint_src_dir}/lang/wgsl/sem", + "${tint_src_dir}/utils/bytes", "${tint_src_dir}/utils/containers", "${tint_src_dir}/utils/diagnostic", "${tint_src_dir}/utils/ice", @@ -236,6 +237,7 @@ "${tint_src_dir}/utils/macros", "${tint_src_dir}/utils/math", "${tint_src_dir}/utils/memory", + "${tint_src_dir}/utils/reflection", "${tint_src_dir}/utils/result", "${tint_src_dir}/utils/rtti", "${tint_src_dir}/utils/symbol",
diff --git a/src/tint/lang/wgsl/program/BUILD.cmake b/src/tint/lang/wgsl/program/BUILD.cmake index 2e04315..d558e88 100644 --- a/src/tint/lang/wgsl/program/BUILD.cmake +++ b/src/tint/lang/wgsl/program/BUILD.cmake
@@ -129,6 +129,7 @@ tint_lang_wgsl_program tint_lang_wgsl_resolver tint_lang_wgsl_sem + tint_utils_bytes tint_utils_containers tint_utils_diagnostic tint_utils_ice
diff --git a/src/tint/lang/wgsl/program/BUILD.gn b/src/tint/lang/wgsl/program/BUILD.gn index 03d0b77..63b864e 100644 --- a/src/tint/lang/wgsl/program/BUILD.gn +++ b/src/tint/lang/wgsl/program/BUILD.gn
@@ -124,6 +124,7 @@ "${tint_src_dir}/lang/wgsl/program", "${tint_src_dir}/lang/wgsl/resolver", "${tint_src_dir}/lang/wgsl/sem", + "${tint_src_dir}/utils/bytes", "${tint_src_dir}/utils/containers", "${tint_src_dir}/utils/diagnostic", "${tint_src_dir}/utils/ice",
diff --git a/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake b/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake index 94c711f..bc7f349 100644 --- a/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake +++ b/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake
@@ -166,6 +166,7 @@ tint_lang_wgsl_ast tint_lang_wgsl_program tint_lang_wgsl_sem + tint_utils_bytes tint_utils_containers tint_utils_diagnostic tint_utils_generator @@ -174,6 +175,7 @@ tint_utils_macros tint_utils_math tint_utils_memory + tint_utils_reflection tint_utils_result tint_utils_rtti tint_utils_symbol
diff --git a/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn b/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn index 88734f2..a1c4700 100644 --- a/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn +++ b/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn
@@ -154,6 +154,7 @@ "${tint_src_dir}/lang/wgsl/ast", "${tint_src_dir}/lang/wgsl/program", "${tint_src_dir}/lang/wgsl/sem", + "${tint_src_dir}/utils/bytes", "${tint_src_dir}/utils/containers", "${tint_src_dir}/utils/diagnostic", "${tint_src_dir}/utils/generator", @@ -162,6 +163,7 @@ "${tint_src_dir}/utils/macros", "${tint_src_dir}/utils/math", "${tint_src_dir}/utils/memory", + "${tint_src_dir}/utils/reflection", "${tint_src_dir}/utils/result", "${tint_src_dir}/utils/rtti", "${tint_src_dir}/utils/symbol",