1# Copyright 2021 The Tint Authors 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15import("${skia_root_dir}/build_overrides/build.gni") 16import("../tint_overrides_with_defaults.gni") 17 18# Fuzzers - Libfuzzer based fuzzing targets for Chromium 19# To run the fuzzers outside of Chromium, use the CMake based builds. 20 21if (build_with_chromium) { 22 import("${skia_root_dir}/testing/libfuzzer/fuzzer_test.gni") 23 24 fuzzer_corpus_wgsl_dir = "${target_gen_dir}/fuzzer_corpus_wgsl" 25 action("tint_generate_wgsl_corpus") { 26 script = "generate_wgsl_corpus.py" 27 sources = [ "generate_wgsl_corpus.py" ] 28 args = [ 29 rebase_path("${tint_root_dir}/test", root_build_dir), 30 rebase_path(fuzzer_corpus_wgsl_dir, root_build_dir), 31 ] 32 outputs = [ fuzzer_corpus_wgsl_dir ] 33 } 34 35 tint_fuzzer_common_libfuzzer_options = [ 36 "only_ascii=1", 37 "max_len=10000", 38 ] 39 40 tint_ast_fuzzer_common_libfuzzer_options = 41 tint_fuzzer_common_libfuzzer_options + [ 42 "cross_over=0", 43 "mutate_depth=1", 44 "tint_enable_all_mutations=false", 45 "tint_mutation_batch_size=5", 46 ] 47 48 tint_regex_fuzzer_common_libfuzzer_options = 49 tint_fuzzer_common_libfuzzer_options + [ 50 "cross_over=0", 51 "mutate_depth=1", 52 ] 53 54 # fuzzer_test doesn't have configs members, so need to define them in an empty 55 # source_set. 56 57 source_set("tint_fuzzer_common_src") { 58 public_configs = [ 59 "${tint_root_dir}/src:tint_config", 60 "${tint_root_dir}/src:tint_common_config", 61 ] 62 63 public_deps = [ 64 "${tint_root_dir}/src:libtint", 65 "${tint_spirv_tools_dir}/:spvtools_val", 66 ] 67 68 sources = [ 69 "data_builder.h", 70 "mersenne_twister_engine.cc", 71 "mersenne_twister_engine.h", 72 "random_generator.cc", 73 "random_generator.h", 74 "random_generator_engine.cc", 75 "random_generator_engine.h", 76 "tint_common_fuzzer.cc", 77 "tint_common_fuzzer.h", 78 "tint_reader_writer_fuzzer.h", 79 "transform_builder.h", 80 ] 81 } 82 83 source_set("tint_fuzzer_common_with_init_src") { 84 public_deps = [ ":tint_fuzzer_common_src" ] 85 86 sources = [ 87 "cli.cc", 88 "cli.h", 89 "fuzzer_init.cc", 90 "fuzzer_init.h", 91 ] 92 } 93 94 if (tint_build_wgsl_reader && tint_build_wgsl_writer) { 95 fuzzer_test("tint_ast_clone_fuzzer") { 96 sources = [ "tint_ast_clone_fuzzer.cc" ] 97 deps = [ ":tint_fuzzer_common_with_init_src" ] 98 dict = "dictionary.txt" 99 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 100 seed_corpus = fuzzer_corpus_wgsl_dir 101 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 102 } 103 104 fuzzer_test("tint_ast_wgsl_writer_fuzzer") { 105 sources = [ "tint_ast_fuzzer/tint_ast_wgsl_writer_fuzzer.cc" ] 106 deps = [ "tint_ast_fuzzer:tint_ast_fuzzer" ] 107 libfuzzer_options = tint_ast_fuzzer_common_libfuzzer_options 108 seed_corpus = fuzzer_corpus_wgsl_dir 109 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 110 } 111 112 fuzzer_test("tint_regex_wgsl_writer_fuzzer") { 113 sources = [ "tint_regex_fuzzer/tint_regex_wgsl_writer_fuzzer.cc" ] 114 deps = [ "tint_regex_fuzzer:tint_regex_fuzzer" ] 115 libfuzzer_options = tint_regex_fuzzer_common_libfuzzer_options 116 seed_corpus = fuzzer_corpus_wgsl_dir 117 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 118 } 119 120 fuzzer_test("tint_wgsl_reader_wgsl_writer_fuzzer") { 121 sources = [ "tint_wgsl_reader_wgsl_writer_fuzzer.cc" ] 122 deps = [ ":tint_fuzzer_common_with_init_src" ] 123 dict = "dictionary.txt" 124 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 125 seed_corpus = fuzzer_corpus_wgsl_dir 126 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 127 } 128 } 129 130 if (tint_build_wgsl_reader && tint_build_spv_writer) { 131 fuzzer_test("tint_all_transforms_fuzzer") { 132 sources = [ "tint_all_transforms_fuzzer.cc" ] 133 deps = [ ":tint_fuzzer_common_with_init_src" ] 134 dict = "dictionary.txt" 135 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 136 seed_corpus = fuzzer_corpus_wgsl_dir 137 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 138 } 139 140 fuzzer_test("tint_ast_spv_writer_fuzzer") { 141 sources = [ "tint_ast_fuzzer/tint_ast_spv_writer_fuzzer.cc" ] 142 deps = [ "tint_ast_fuzzer:tint_ast_fuzzer" ] 143 libfuzzer_options = tint_ast_fuzzer_common_libfuzzer_options 144 seed_corpus = fuzzer_corpus_wgsl_dir 145 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 146 } 147 148 fuzzer_test("tint_binding_remapper_fuzzer") { 149 sources = [ "tint_binding_remapper_fuzzer.cc" ] 150 deps = [ ":tint_fuzzer_common_with_init_src" ] 151 dict = "dictionary.txt" 152 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 153 seed_corpus = fuzzer_corpus_wgsl_dir 154 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 155 } 156 157 fuzzer_test("tint_first_index_offset_fuzzer") { 158 sources = [ "tint_first_index_offset_fuzzer.cc" ] 159 deps = [ ":tint_fuzzer_common_with_init_src" ] 160 dict = "dictionary.txt" 161 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 162 seed_corpus = fuzzer_corpus_wgsl_dir 163 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 164 } 165 166 fuzzer_test("tint_regex_spv_writer_fuzzer") { 167 sources = [ "tint_regex_fuzzer/tint_regex_spv_writer_fuzzer.cc" ] 168 deps = [ "tint_regex_fuzzer:tint_regex_fuzzer" ] 169 libfuzzer_options = tint_regex_fuzzer_common_libfuzzer_options 170 seed_corpus = fuzzer_corpus_wgsl_dir 171 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 172 } 173 174 fuzzer_test("tint_renamer_fuzzer") { 175 sources = [ "tint_renamer_fuzzer.cc" ] 176 deps = [ ":tint_fuzzer_common_with_init_src" ] 177 dict = "dictionary.txt" 178 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 179 seed_corpus = fuzzer_corpus_wgsl_dir 180 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 181 } 182 183 fuzzer_test("tint_robustness_fuzzer") { 184 sources = [ "tint_robustness_fuzzer.cc" ] 185 deps = [ ":tint_fuzzer_common_with_init_src" ] 186 dict = "dictionary.txt" 187 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 188 seed_corpus = fuzzer_corpus_wgsl_dir 189 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 190 } 191 192 fuzzer_test("tint_single_entry_point_fuzzer") { 193 sources = [ "tint_single_entry_point_fuzzer.cc" ] 194 deps = [ ":tint_fuzzer_common_with_init_src" ] 195 dict = "dictionary.txt" 196 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 197 seed_corpus = fuzzer_corpus_wgsl_dir 198 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 199 } 200 201 fuzzer_test("tint_vertex_pulling_fuzzer") { 202 sources = [ "tint_vertex_pulling_fuzzer.cc" ] 203 deps = [ ":tint_fuzzer_common_with_init_src" ] 204 dict = "dictionary.txt" 205 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 206 seed_corpus = fuzzer_corpus_wgsl_dir 207 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 208 } 209 210 fuzzer_test("tint_wgsl_reader_spv_writer_fuzzer") { 211 sources = [ "tint_wgsl_reader_spv_writer_fuzzer.cc" ] 212 deps = [ ":tint_fuzzer_common_with_init_src" ] 213 dict = "dictionary.txt" 214 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 215 seed_corpus = fuzzer_corpus_wgsl_dir 216 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 217 } 218 } 219 220 if (tint_build_wgsl_reader && tint_build_hlsl_writer) { 221 fuzzer_test("tint_ast_hlsl_writer_fuzzer") { 222 sources = [ "tint_ast_fuzzer/tint_ast_hlsl_writer_fuzzer.cc" ] 223 deps = [ "tint_ast_fuzzer:tint_ast_fuzzer" ] 224 libfuzzer_options = tint_ast_fuzzer_common_libfuzzer_options 225 seed_corpus = fuzzer_corpus_wgsl_dir 226 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 227 } 228 229 fuzzer_test("tint_regex_hlsl_writer_fuzzer") { 230 sources = [ "tint_regex_fuzzer/tint_regex_hlsl_writer_fuzzer.cc" ] 231 deps = [ "tint_regex_fuzzer:tint_regex_fuzzer" ] 232 libfuzzer_options = tint_regex_fuzzer_common_libfuzzer_options 233 seed_corpus = fuzzer_corpus_wgsl_dir 234 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 235 } 236 237 fuzzer_test("tint_wgsl_reader_hlsl_writer_fuzzer") { 238 sources = [ "tint_wgsl_reader_hlsl_writer_fuzzer.cc" ] 239 deps = [ ":tint_fuzzer_common_with_init_src" ] 240 dict = "dictionary.txt" 241 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 242 seed_corpus = fuzzer_corpus_wgsl_dir 243 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 244 } 245 } 246 247 if (tint_build_wgsl_reader && tint_build_msl_writer) { 248 fuzzer_test("tint_ast_msl_writer_fuzzer") { 249 sources = [ "tint_ast_fuzzer/tint_ast_msl_writer_fuzzer.cc" ] 250 deps = [ "tint_ast_fuzzer:tint_ast_fuzzer" ] 251 libfuzzer_options = tint_ast_fuzzer_common_libfuzzer_options 252 seed_corpus = fuzzer_corpus_wgsl_dir 253 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 254 } 255 256 fuzzer_test("tint_regex_msl_writer_fuzzer") { 257 sources = [ "tint_regex_fuzzer/tint_regex_msl_writer_fuzzer.cc" ] 258 deps = [ "tint_regex_fuzzer:tint_regex_fuzzer" ] 259 libfuzzer_options = tint_regex_fuzzer_common_libfuzzer_options 260 seed_corpus = fuzzer_corpus_wgsl_dir 261 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 262 } 263 264 fuzzer_test("tint_wgsl_reader_msl_writer_fuzzer") { 265 sources = [ "tint_wgsl_reader_msl_writer_fuzzer.cc" ] 266 deps = [ ":tint_fuzzer_common_with_init_src" ] 267 dict = "dictionary.txt" 268 libfuzzer_options = tint_fuzzer_common_libfuzzer_options 269 seed_corpus = fuzzer_corpus_wgsl_dir 270 seed_corpus_deps = [ ":tint_generate_wgsl_corpus" ] 271 } 272 } 273 274 if (tint_build_wgsl_reader && tint_build_hlsl_writer && 275 tint_build_msl_writer && tint_build_spv_writer && 276 tint_build_wgsl_writer) { 277 executable("tint_black_box_fuzz_target") { 278 sources = [ "tint_black_box_fuzz_target.cc" ] 279 deps = [ ":tint_fuzzer_common_src" ] 280 } 281 } 282 283 group("fuzzers") { 284 testonly = true 285 deps = [] 286 287 if (tint_build_wgsl_reader && tint_build_wgsl_writer) { 288 deps += [ 289 ":tint_ast_clone_fuzzer", 290 ":tint_ast_wgsl_writer_fuzzer", 291 ":tint_regex_wgsl_writer_fuzzer", 292 ":tint_wgsl_reader_wgsl_writer_fuzzer", 293 ] 294 } 295 if (tint_build_wgsl_reader && tint_build_spv_writer) { 296 deps += [ 297 ":tint_all_transforms_fuzzer", 298 ":tint_ast_spv_writer_fuzzer", 299 ":tint_binding_remapper_fuzzer", 300 ":tint_first_index_offset_fuzzer", 301 ":tint_regex_spv_writer_fuzzer", 302 ":tint_renamer_fuzzer", 303 ":tint_robustness_fuzzer", 304 ":tint_single_entry_point_fuzzer", 305 ":tint_vertex_pulling_fuzzer", 306 ":tint_wgsl_reader_spv_writer_fuzzer", 307 ] 308 } 309 if (tint_build_wgsl_reader && tint_build_hlsl_writer) { 310 deps += [ 311 ":tint_ast_hlsl_writer_fuzzer", 312 ":tint_regex_hlsl_writer_fuzzer", 313 ":tint_wgsl_reader_hlsl_writer_fuzzer", 314 ] 315 } 316 if (tint_build_wgsl_reader && tint_build_msl_writer) { 317 deps += [ 318 ":tint_ast_msl_writer_fuzzer", 319 ":tint_regex_msl_writer_fuzzer", 320 ":tint_wgsl_reader_msl_writer_fuzzer", 321 ] 322 } 323 if (tint_build_wgsl_reader && tint_build_hlsl_writer && 324 tint_build_msl_writer && tint_build_spv_writer && 325 tint_build_wgsl_writer) { 326 deps += [ ":tint_black_box_fuzz_target" ] 327 } 328 } 329} else { 330 group("fuzzers") { 331 } 332} 333