| // Copyright 2021 The Tint Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef FUZZERS_TINT_SPIRV_TOOLS_FUZZER_CLI_H_ |
| #define FUZZERS_TINT_SPIRV_TOOLS_FUZZER_CLI_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "source/fuzz/fuzzer.h" |
| |
| namespace tint { |
| namespace fuzzers { |
| namespace spvtools_fuzzer { |
| |
| /// Default SPIR-V environment that will be used during fuzzing. |
| const auto kDefaultTargetEnv = SPV_ENV_VULKAN_1_1; |
| |
| /// The type of the mutator to run. |
| enum class MutatorType { |
| kNone = 0, |
| kFuzz = 1 << 0, |
| kReduce = 1 << 1, |
| kOpt = 1 << 2, |
| kAll = kFuzz | kReduce | kOpt |
| }; |
| |
| inline MutatorType operator|(MutatorType a, MutatorType b) { |
| return static_cast<MutatorType>(static_cast<int>(a) | static_cast<int>(b)); |
| } |
| |
| inline MutatorType operator&(MutatorType a, MutatorType b) { |
| return static_cast<MutatorType>(static_cast<int>(a) & static_cast<int>(b)); |
| } |
| |
| /// Shading language to target during fuzzing. |
| enum class FuzzingTarget { |
| kNone = 0, |
| kHlsl = 1 << 0, |
| kMsl = 1 << 1, |
| kSpv = 1 << 2, |
| kWgsl = 1 << 3, |
| kAll = kHlsl | kMsl | kSpv | kWgsl |
| }; |
| |
| inline FuzzingTarget operator|(FuzzingTarget a, FuzzingTarget b) { |
| return static_cast<FuzzingTarget>(static_cast<int>(a) | static_cast<int>(b)); |
| } |
| |
| inline FuzzingTarget operator&(FuzzingTarget a, FuzzingTarget b) { |
| return static_cast<FuzzingTarget>(static_cast<int>(a) & static_cast<int>(b)); |
| } |
| |
| /// These parameters are accepted by various mutators and thus they are accepted |
| /// by both the fuzzer and the mutator debugger. |
| struct MutatorCliParams { |
| /// SPIR-V target environment for fuzzing. |
| spv_target_env target_env = kDefaultTargetEnv; |
| |
| /// The number of spirv-fuzz transformations to apply at a time. |
| uint32_t transformation_batch_size = 3; |
| |
| /// The number of spirv-reduce reductions to apply at a time. |
| uint32_t reduction_batch_size = 3; |
| |
| /// The number of spirv-opt optimizations to apply at a time. |
| uint32_t opt_batch_size = 6; |
| |
| /// The vector of donors to use in spirv-fuzz (see the doc for spirv-fuzz to |
| /// learn more). |
| std::vector<spvtools::fuzz::fuzzerutil::ModuleSupplier> donors = {}; |
| |
| /// The strategy to use during fuzzing in spirv-fuzz (see the doc for |
| /// spirv-fuzz to learn more). |
| spvtools::fuzz::RepeatedPassStrategy repeated_pass_strategy = |
| spvtools::fuzz::RepeatedPassStrategy::kSimple; |
| |
| /// Whether to use all fuzzer passes or a randomly selected subset of them. |
| bool enable_all_fuzzer_passes = false; |
| |
| /// Whether to use all reduction passes or a randomly selected subset of them. |
| bool enable_all_reduce_passes = false; |
| |
| /// Whether to validate the SPIR-V binary after each optimization pass. |
| bool validate_after_each_opt_pass = true; |
| |
| /// Whether to validate the SPIR-V binary after each fuzzer pass. |
| bool validate_after_each_fuzzer_pass = true; |
| |
| /// Whether to validate the SPIR-V binary after each reduction pass. |
| bool validate_after_each_reduce_pass = true; |
| }; |
| |
| /// Parameters specific to the fuzzer. Type `-tint_help` in the CLI to learn |
| /// more. |
| struct FuzzerCliParams { |
| /// The size of the cache that records ongoing mutation sessions. |
| uint32_t mutator_cache_size = 20; |
| |
| /// The type of the mutator to run. |
| MutatorType mutator_type = MutatorType::kAll; |
| |
| /// Tint backend to fuzz. |
| FuzzingTarget fuzzing_target = FuzzingTarget::kAll; |
| |
| /// The path to the directory, that will be used to output buggy shaders. |
| std::string error_dir = ""; |
| |
| /// Parameters for various mutators. |
| MutatorCliParams mutator_params; |
| }; |
| |
| /// Parameters specific to the mutator debugger. Type `--help` in the CLI to |
| /// learn more. |
| struct MutatorDebuggerCliParams { |
| /// The type of the mutator to debug. |
| MutatorType mutator_type = MutatorType::kNone; |
| |
| /// The seed that was used to initialize the mutator. |
| uint32_t seed = 0; |
| |
| /// The binary that triggered a bug in the mutator. |
| std::vector<uint32_t> original_binary; |
| |
| /// Parameters for various mutators. |
| MutatorCliParams mutator_params; |
| }; |
| |
| /// Parses CLI parameters for the fuzzer. This function exits with an error code |
| /// and a message is printed to the console if some parameter has invalid |
| /// format. You can pass `-tint_help` to check out all available parameters. |
| /// This function will remove recognized parameters from the `argv` and adjust |
| /// the `argc` accordingly. |
| /// |
| /// @param argc - the number of parameters (identical to the `argc` in `main` |
| /// function). |
| /// @param argv - array of C strings of parameters. |
| /// @return the parsed parameters. |
| FuzzerCliParams ParseFuzzerCliParams(int* argc, char** argv); |
| |
| /// Parses CLI parameters for the mutator debugger. This function exits with an |
| /// error code and a message is printed to the console if some parameter has |
| /// invalid format. You can pass `--help` to check out all available parameters. |
| /// |
| /// @param argc - the number of parameters (identical to the `argc` in `main` |
| /// function). |
| /// @param argv - array of C strings of parameters. |
| /// @return the parsed parameters. |
| MutatorDebuggerCliParams ParseMutatorDebuggerCliParams(int argc, |
| const char* const* argv); |
| |
| } // namespace spvtools_fuzzer |
| } // namespace fuzzers |
| } // namespace tint |
| |
| #endif // FUZZERS_TINT_SPIRV_TOOLS_FUZZER_CLI_H_ |