[tint][fuzzers] Port IRRoundtripFuzzer to tint_wgsl_fuzzer
Change-Id: I8052f45136eb27ef63af98be3825e8128ff24375
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/154303
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Auto-Submit: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/cmd/fuzz/wgsl/BUILD.cmake b/src/tint/cmd/fuzz/wgsl/BUILD.cmake
index 86c8648..b485bef 100644
--- a/src/tint/cmd/fuzz/wgsl/BUILD.cmake
+++ b/src/tint/cmd/fuzz/wgsl/BUILD.cmake
@@ -52,6 +52,7 @@
tint_lang_wgsl_ast
tint_lang_wgsl_program
tint_lang_wgsl_sem
+ tint_lang_wgsl_fuzz
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 db26170..908cd3b 100644
--- a/src/tint/cmd/fuzz/wgsl/BUILD.gn
+++ b/src/tint/cmd/fuzz/wgsl/BUILD.gn
@@ -82,6 +82,7 @@
"${tint_src_dir}/lang/core/constant",
"${tint_src_dir}/lang/core/type",
"${tint_src_dir}/lang/wgsl",
+ "${tint_src_dir}/lang/wgsl:fuzz",
"${tint_src_dir}/lang/wgsl/ast",
"${tint_src_dir}/lang/wgsl/program",
"${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/fuzzers/CMakeLists.txt b/src/tint/fuzzers/CMakeLists.txt
index 2330ec0..cd5a057 100644
--- a/src/tint/fuzzers/CMakeLists.txt
+++ b/src/tint/fuzzers/CMakeLists.txt
@@ -71,11 +71,6 @@
add_tint_fuzzer(tint_wgsl_reader_spv_writer_fuzzer)
endif()
-if (TINT_BUILD_WGSL_READER AND TINT_BUILD_WGSL_WRITER)
- add_tint_fuzzer(tint_ir_roundtrip_fuzzer)
- target_link_libraries(tint_ir_roundtrip_fuzzer PRIVATE tint_lang_wgsl_writer_ir_to_program)
-endif()
-
if (${TINT_BUILD_WGSL_READER} AND ${TINT_BUILD_HLSL_WRITER})
add_tint_fuzzer(tint_wgsl_reader_hlsl_writer_fuzzer)
endif()
diff --git a/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc b/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc
deleted file mode 100644
index 9c888ec..0000000
--- a/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2023 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-// list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <iostream>
-#include <string>
-#include <unordered_set>
-
-#include "src/tint/lang/wgsl/helpers/apply_substitute_overrides.h"
-#include "src/tint/lang/wgsl/reader/lower/lower.h"
-#include "src/tint/lang/wgsl/reader/parser/parser.h"
-#include "src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.h"
-#include "src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.h"
-#include "src/tint/lang/wgsl/writer/raise/raise.h"
-#include "src/tint/lang/wgsl/writer/writer.h"
-
-[[noreturn]] void TintInternalCompilerErrorReporter(const tint::InternalCompilerError& err) {
- std::cerr << err.Error() << std::endl;
- __builtin_trap();
-}
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- std::string str(reinterpret_cast<const char*>(data), size);
-
- tint::SetInternalCompilerErrorReporter(&TintInternalCompilerErrorReporter);
-
- tint::Source::File file("test.wgsl", str);
-
- // Parse the wgsl, create the src program
- tint::wgsl::reader::Parser parser(&file);
- parser.set_max_errors(1);
- if (!parser.Parse()) {
- return 0;
- }
- auto src = parser.program();
- if (!src.IsValid()) {
- return 0;
- }
-
- auto is_unsupported = [](const tint::ast::Enable* enable) {
- for (auto ext : enable->extensions) {
- switch (ext->name) {
- case tint::wgsl::Extension::kChromiumExperimentalDp4A:
- case tint::wgsl::Extension::kChromiumExperimentalFullPtrParameters:
- case tint::wgsl::Extension::kChromiumExperimentalPixelLocal:
- case tint::wgsl::Extension::kChromiumExperimentalPushConstant:
- case tint::wgsl::Extension::kChromiumInternalDualSourceBlending:
- case tint::wgsl::Extension::kChromiumInternalRelaxedUniformLayout:
- return true;
- default:
- break;
- }
- }
- return false;
- };
-
- if (src.AST().Enables().Any(is_unsupported)) {
- return 0;
- }
-
- if (auto transformed = tint::wgsl::ApplySubstituteOverrides(src)) {
- src = std::move(*transformed);
- if (!src.IsValid()) {
- return 0;
- }
- }
-
- auto ir = tint::wgsl::reader::ProgramToIR(src);
- if (!ir) {
- std::cerr << ir.Failure() << std::endl;
- __builtin_trap();
- }
-
- if (auto res = tint::wgsl::reader::Lower(ir.Get()); !res) {
- std::cerr << res.Failure() << std::endl;
- __builtin_trap();
- }
-
- if (auto res = tint::wgsl::writer::Raise(ir.Get()); !res) {
- std::cerr << res.Failure() << std::endl;
- __builtin_trap();
- }
-
- auto dst = tint::wgsl::writer::IRToProgram(ir.Get());
- if (!dst.IsValid()) {
-#if TINT_BUILD_WGSL_WRITER
- if (auto result = tint::wgsl::writer::Generate(dst, {}); result) {
- std::cerr << result->wgsl << std::endl << std::endl;
- }
-#endif
-
- std::cerr << dst.Diagnostics() << std::endl;
- __builtin_trap();
- }
-
- return 0;
-}
diff --git a/src/tint/lang/wgsl/BUILD.cmake b/src/tint/lang/wgsl/BUILD.cmake
index cf1d40c..cea7aa0 100644
--- a/src/tint/lang/wgsl/BUILD.cmake
+++ b/src/tint/lang/wgsl/BUILD.cmake
@@ -161,3 +161,60 @@
tint_target_add_external_dependencies(tint_lang_wgsl_bench bench
"google-benchmark"
)
+
+################################################################################
+# Target: tint_lang_wgsl_fuzz
+# Kind: fuzz
+################################################################################
+tint_add_target(tint_lang_wgsl_fuzz fuzz
+)
+
+tint_target_add_dependencies(tint_lang_wgsl_fuzz fuzz
+ tint_api_common
+ tint_lang_core
+ tint_lang_core_constant
+ tint_lang_core_ir
+ tint_lang_core_type
+ tint_lang_wgsl
+ tint_lang_wgsl_ast
+ tint_lang_wgsl_helpers
+ tint_lang_wgsl_program
+ tint_lang_wgsl_reader_lower
+ tint_lang_wgsl_resolver
+ tint_lang_wgsl_sem
+ tint_lang_wgsl_writer_ir_to_program
+ tint_lang_wgsl_writer_raise
+ tint_utils_containers
+ tint_utils_diagnostic
+ tint_utils_ice
+ tint_utils_id
+ tint_utils_macros
+ tint_utils_math
+ tint_utils_memory
+ tint_utils_reflection
+ tint_utils_result
+ tint_utils_rtti
+ tint_utils_symbol
+ tint_utils_text
+ tint_utils_traits
+)
+
+if(TINT_BUILD_WGSL_READER)
+ tint_target_add_dependencies(tint_lang_wgsl_fuzz fuzz
+ tint_cmd_fuzz_wgsl_fuzz
+ tint_lang_wgsl_reader_parser
+ tint_lang_wgsl_reader_program_to_ir
+ )
+endif(TINT_BUILD_WGSL_READER)
+
+if(TINT_BUILD_WGSL_READER AND TINT_BUILD_WGSL_WRITER)
+ tint_target_add_sources(tint_lang_wgsl_fuzz fuzz
+ "lang/wgsl/ir_roundtrip_fuzz.cc"
+ )
+endif(TINT_BUILD_WGSL_READER AND TINT_BUILD_WGSL_WRITER)
+
+if(TINT_BUILD_WGSL_WRITER)
+ tint_target_add_dependencies(tint_lang_wgsl_fuzz fuzz
+ tint_lang_wgsl_writer
+ )
+endif(TINT_BUILD_WGSL_WRITER)
diff --git a/src/tint/lang/wgsl/BUILD.gn b/src/tint/lang/wgsl/BUILD.gn
index a2272f6..10d334a 100644
--- a/src/tint/lang/wgsl/BUILD.gn
+++ b/src/tint/lang/wgsl/BUILD.gn
@@ -141,3 +141,52 @@
]
}
}
+
+tint_fuzz_source_set("fuzz") {
+ sources = []
+ deps = [
+ "${tint_src_dir}/api/common",
+ "${tint_src_dir}/lang/core",
+ "${tint_src_dir}/lang/core/constant",
+ "${tint_src_dir}/lang/core/ir",
+ "${tint_src_dir}/lang/core/type",
+ "${tint_src_dir}/lang/wgsl",
+ "${tint_src_dir}/lang/wgsl/ast",
+ "${tint_src_dir}/lang/wgsl/helpers",
+ "${tint_src_dir}/lang/wgsl/program",
+ "${tint_src_dir}/lang/wgsl/reader/lower",
+ "${tint_src_dir}/lang/wgsl/resolver",
+ "${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/containers",
+ "${tint_src_dir}/utils/diagnostic",
+ "${tint_src_dir}/utils/ice",
+ "${tint_src_dir}/utils/id",
+ "${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",
+ "${tint_src_dir}/utils/text",
+ "${tint_src_dir}/utils/traits",
+ ]
+
+ if (tint_build_wgsl_reader) {
+ deps += [
+ "${tint_src_dir}/cmd/fuzz/wgsl:fuzz",
+ "${tint_src_dir}/lang/wgsl/reader/parser",
+ "${tint_src_dir}/lang/wgsl/reader/program_to_ir",
+ ]
+ }
+
+ if (tint_build_wgsl_reader && tint_build_wgsl_writer) {
+ sources += [ "ir_roundtrip_fuzz.cc" ]
+ }
+
+ if (tint_build_wgsl_writer) {
+ deps += [ "${tint_src_dir}/lang/wgsl/writer" ]
+ }
+}
diff --git a/src/tint/lang/wgsl/ir_roundtrip_fuzz.cc b/src/tint/lang/wgsl/ir_roundtrip_fuzz.cc
new file mode 100644
index 0000000..8671ac9
--- /dev/null
+++ b/src/tint/lang/wgsl/ir_roundtrip_fuzz.cc
@@ -0,0 +1,106 @@
+// Copyright 2023 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// GEN_BUILD:CONDITION(tint_build_wgsl_reader && tint_build_wgsl_writer)
+
+#include <iostream>
+
+#include "src/tint/cmd/fuzz/wgsl/wgsl_fuzz.h"
+#include "src/tint/lang/core/ir/disassembler.h"
+#include "src/tint/lang/wgsl/helpers/apply_substitute_overrides.h"
+#include "src/tint/lang/wgsl/reader/lower/lower.h"
+#include "src/tint/lang/wgsl/reader/parser/parser.h"
+#include "src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.h"
+#include "src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.h"
+#include "src/tint/lang/wgsl/writer/raise/raise.h"
+#include "src/tint/lang/wgsl/writer/writer.h"
+
+namespace tint::wgsl {
+namespace {
+
+bool IsUnsupported(const tint::ast::Enable* enable) {
+ for (auto ext : enable->extensions) {
+ switch (ext->name) {
+ case tint::wgsl::Extension::kChromiumExperimentalDp4A:
+ case tint::wgsl::Extension::kChromiumExperimentalFullPtrParameters:
+ case tint::wgsl::Extension::kChromiumExperimentalPixelLocal:
+ case tint::wgsl::Extension::kChromiumExperimentalPushConstant:
+ case tint::wgsl::Extension::kChromiumInternalDualSourceBlending:
+ case tint::wgsl::Extension::kChromiumInternalRelaxedUniformLayout:
+ return true;
+ default:
+ break;
+ }
+ }
+ return false;
+}
+
+} // namespace
+
+void IRRoundtripFuzzer(const tint::Program& program) {
+ if (program.AST().Enables().Any(IsUnsupported)) {
+ return;
+ }
+
+ auto transformed = tint::wgsl::ApplySubstituteOverrides(program);
+ auto& src = transformed ? transformed.value() : program;
+ if (!src.IsValid()) {
+ return;
+ }
+
+ auto ir = tint::wgsl::reader::ProgramToIR(src);
+ if (!ir) {
+ TINT_ICE() << ir.Failure();
+ return;
+ }
+
+ if (auto res = tint::wgsl::reader::Lower(ir.Get()); !res) {
+ TINT_ICE() << res.Failure();
+ return;
+ }
+
+ if (auto res = tint::wgsl::writer::Raise(ir.Get()); !res) {
+ TINT_ICE() << res.Failure();
+ return;
+ }
+
+ auto dst = tint::wgsl::writer::IRToProgram(ir.Get());
+ if (!dst.IsValid()) {
+ std::cerr << "IR:\n" << core::ir::Disassemble(ir.Get()) << std::endl;
+ if (auto result = tint::wgsl::writer::Generate(dst, {}); result) {
+ std::cerr << "WGSL:\n" << result->wgsl << std::endl << std::endl;
+ }
+ TINT_ICE() << dst.Diagnostics();
+ return;
+ }
+
+ return;
+}
+
+} // namespace tint::wgsl
+
+TINT_WGSL_PROGRAM_FUZZER(tint::wgsl::IRRoundtripFuzzer);
diff --git a/src/tint/utils/containers/slice.h b/src/tint/utils/containers/slice.h
index ca309ee..b88863a 100644
--- a/src/tint/utils/containers/slice.h
+++ b/src/tint/utils/containers/slice.h
@@ -148,6 +148,11 @@
constexpr Slice(T* d, size_t l, size_t c) : data(d), len(l), cap(c) {}
/// Constructor
+ /// @param d pointer to the first element in the slice
+ /// @param l total number of elements in the slice
+ constexpr Slice(T* d, size_t l) : data(d), len(l), cap(l) {}
+
+ /// Constructor
/// @param elements c-array of elements
template <size_t N>
constexpr Slice(T (&elements)[N]) // NOLINT