Convert fuzzer to generating configuration data

This is instead of consuming a portion of the input, so that the seed
corpus of valid shaders can be more effective.

BUG=tint:1098

Change-Id: If3696527c82c23b09edeea6ddd2a0f935e5e1ac7
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/63301
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
Ryan Harrison
2021-09-22 14:37:46 +00:00
committed by Tint LUCI CQ
parent 28d6763ef8
commit a617d0f0fc
15 changed files with 164 additions and 183 deletions

View File

@@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "fuzzers/random_generator.h"
#include "fuzzers/tint_common_fuzzer.h"
#include "fuzzers/tint_init_fuzzer.h"
@@ -19,17 +20,17 @@ namespace tint {
namespace fuzzers {
struct Config {
Config(const uint8_t* data, size_t size) : reader(data, size) {}
Reader reader;
Config(const uint8_t* data, size_t size) : builder(data, size) {}
DataBuilder builder;
transform::Manager manager;
transform::DataMap inputs;
};
bool AddPlatformIndependentPasses(Config* config) {
ExtractFirstIndexOffsetInputs(&config->reader, &config->inputs);
ExtractBindingRemapperInputs(&config->reader, &config->inputs);
ExtractSingleEntryPointInputs(&config->reader, &config->inputs);
ExtractVertexPullingInputs(&config->reader, &config->inputs);
void AddPlatformIndependentPasses(Config* config) {
GenerateFirstIndexOffsetInputs(&config->builder, &config->inputs);
GenerateBindingRemapperInputs(&config->builder, &config->inputs);
GenerateSingleEntryPointInputs(&config->builder, &config->inputs);
GenerateVertexPullingInputs(&config->builder, &config->inputs);
config->manager.Add<transform::Robustness>();
config->manager.Add<transform::FirstIndexOffset>();
@@ -37,69 +38,55 @@ bool AddPlatformIndependentPasses(Config* config) {
config->manager.Add<transform::Renamer>();
config->manager.Add<tint::transform::SingleEntryPoint>();
config->manager.Add<tint::transform::VertexPulling>();
return !config->reader.failed();
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
{
Config config(data, size);
if (!AddPlatformIndependentPasses(&config)) {
return 0;
}
AddPlatformIndependentPasses(&config);
fuzzers::CommonFuzzer fuzzer(InputFormat::kWGSL, OutputFormat::kSpv);
fuzzer.SetTransformManager(&(config.manager), std::move(config.inputs));
fuzzer.SetDumpInput(GetCliParams().dump_input);
fuzzer.Run(config.reader.data(), config.reader.size());
fuzzer.Run(data, size);
}
#if TINT_BUILD_HLSL_WRITER
{
Config config(data, size);
if (!AddPlatformIndependentPasses(&config)) {
return 0;
}
AddPlatformIndependentPasses(&config);
fuzzers::CommonFuzzer fuzzer(InputFormat::kWGSL, OutputFormat::kHLSL);
fuzzer.SetTransformManager(&config.manager, std::move(config.inputs));
fuzzer.SetDumpInput(GetCliParams().dump_input);
fuzzer.Run(config.reader.data(), config.reader.size());
fuzzer.Run(data, size);
}
#endif // TINT_BUILD_HLSL_WRITER
#if TINT_BUILD_MSL_WRITER
{
Config config(data, size);
if (!AddPlatformIndependentPasses(&config)) {
return 0;
}
AddPlatformIndependentPasses(&config);
fuzzers::CommonFuzzer fuzzer(InputFormat::kWGSL, OutputFormat::kMSL);
fuzzer.SetTransformManager(&config.manager, std::move(config.inputs));
fuzzer.SetDumpInput(GetCliParams().dump_input);
fuzzer.Run(config.reader.data(), config.reader.size());
fuzzer.Run(data, size);
}
#endif // TINT_BUILD_MSL_WRITER
#if TINT_BUILD_SPV_WRITER
{
Config config(data, size);
if (!AddPlatformIndependentPasses(&config)) {
return 0;
}
AddPlatformIndependentPasses(&config);
fuzzers::CommonFuzzer fuzzer(InputFormat::kWGSL, OutputFormat::kSpv);
fuzzer.SetTransformManager(&config.manager, std::move(config.inputs));
fuzzer.SetDumpInput(GetCliParams().dump_input);
fuzzer.Run(config.reader.data(), config.reader.size());
fuzzer.Run(data, size);
}
#endif // TINT_BUILD_SPV_WRITER