• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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