summaryrefslogtreecommitdiff
path: root/chromium/third_party/dawn/src/fuzzers/BUILD.gn
blob: 57bdcf3a4a9d2528382a2098e272d79cb2a00505 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# Copyright 2018 The Dawn 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.

import("//build_overrides/build.gni")
import("../../scripts/dawn_overrides_with_defaults.gni")

# We only have libfuzzer in Chromium builds but if we build fuzzer targets only
# there, we would risk breaking fuzzer targets all the time when making changes
# to Dawn. To avoid that, we make fuzzer targets compile in standalone builds
# as well with a dawn_fuzzer_test target that acts like Chromium's fuzzer_test.
#
# The standalone fuzzer targets are able to run a single fuzzer input which
# could help reproduce fuzzer crashes more easily because you don't need a
# whole Chromium checkout.

if (build_with_chromium) {
  import("//testing/libfuzzer/fuzzer_test.gni")

  # In Chromium build we just proxy everything to the real fuzzer_test
  template("dawn_fuzzer_test") {
    fuzzer_test(target_name) {
      forward_variables_from(invoker, "*")
    }
  }
} else {
  import("//testing/test.gni")

  # In standalone build we do something similar to fuzzer_test.
  template("dawn_fuzzer_test") {
    test(target_name) {
      forward_variables_from(invoker,
                             [
                               "asan_options",
                               "cflags",
                               "cflags_cc",
                               "check_includes",
                               "defines",
                               "deps",
                               "include_dirs",
                               "sources",
                             ])

      if (defined(asan_options)) {
        not_needed([ "asan_options" ])
      }

      if (!defined(configs)) {
        configs = []
      }

      # Weirdly fuzzer_test uses a special variable for additional configs.
      if (defined(invoker.additional_configs)) {
        configs += invoker.additional_configs
      }

      sources += [ "StandaloneFuzzerMain.cpp" ]
    }
  }
}

static_library("dawn_spirv_cross_fuzzer_common") {
  sources = [
    "DawnSPIRVCrossFuzzer.cpp",
    "DawnSPIRVCrossFuzzer.h",
  ]
  public_deps = [
    "${dawn_shaderc_dir}:libshaderc_spvc",
  ]
}

# TODO(rharrison): Remove asan_options once signal trap is no longer
#                  needed.
# Uses Dawn specific options and varies input data
dawn_fuzzer_test("dawn_spirv_cross_glsl_fast_fuzzer") {
  sources = [
    "DawnSPIRVCrossGLSLFastFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
  asan_options = [ "allow_user_segv_handler=1" ]
}

# TODO(rharrison): Remove asan_options once signal trap is no longer
#                  needed.
# Uses Dawn specific options and varies input data
dawn_fuzzer_test("dawn_spirv_cross_hlsl_fast_fuzzer") {
  sources = [
    "DawnSPIRVCrossHLSLFastFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
  asan_options = [ "allow_user_segv_handler=1" ]
}

# TODO(rharrison): Remove asan_options once signal trap is no longer
#                  needed.
# Uses Dawn specific options and varies input data
dawn_fuzzer_test("dawn_spirv_cross_msl_fast_fuzzer") {
  sources = [
    "DawnSPIRVCrossMSLFastFuzzer.cpp",
  ]
  deps = [
    ":dawn_spirv_cross_fuzzer_common",
  ]
  asan_options = [ "allow_user_segv_handler=1" ]
}

dawn_fuzzer_test("dawn_wire_server_and_frontend_fuzzer") {
  sources = [
    "DawnWireServerAndFrontendFuzzer.cpp",
  ]

  deps = [
    "${dawn_root}/:libdawn_native_static",
    "${dawn_root}/:libdawn_wire_static",
    "${dawn_root}/src/common",
    "${dawn_root}/src/dawn:dawncpp",
    "${dawn_root}/src/dawn:libdawn_proc",
  ]

  additional_configs = [ "${dawn_root}/src/common:dawn_internal" ]
}