xref: /aosp_15_r20/external/perfetto/gn/standalone/sanitizers/BUILD.gn (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker#
3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker#
7*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker#
9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/sanitizers/sanitizers.gni")
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker# Link dependencies for sanitizers for executables.
18*6dbdd20aSAndroid Build Coastguard Workergroup("deps") {
19*6dbdd20aSAndroid Build Coastguard Worker  visibility = [ "*" ]
20*6dbdd20aSAndroid Build Coastguard Worker  if (using_sanitizer) {
21*6dbdd20aSAndroid Build Coastguard Worker    public_configs = [ ":sanitizers_ldflags" ]
22*6dbdd20aSAndroid Build Coastguard Worker    deps = [ ":ignorelist_copy" ]
23*6dbdd20aSAndroid Build Coastguard Worker    if (is_android && sanitizer_lib != "" && !sanitizer_lib_dir_is_static) {
24*6dbdd20aSAndroid Build Coastguard Worker      deps += [ ":copy_sanitizer_lib" ]
25*6dbdd20aSAndroid Build Coastguard Worker    }
26*6dbdd20aSAndroid Build Coastguard Worker  }
27*6dbdd20aSAndroid Build Coastguard Worker}
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Workerif (is_android && sanitizer_lib != "" && !sanitizer_lib_dir_is_static) {
30*6dbdd20aSAndroid Build Coastguard Worker  copy("copy_sanitizer_lib") {
31*6dbdd20aSAndroid Build Coastguard Worker    sources = [ "${sanitizer_lib_dir}/lib${sanitizer_lib}.so" ]
32*6dbdd20aSAndroid Build Coastguard Worker    outputs = [ "${root_out_dir}/sanitizer_libs/lib${sanitizer_lib}.so" ]
33*6dbdd20aSAndroid Build Coastguard Worker  }
34*6dbdd20aSAndroid Build Coastguard Worker}
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard Worker# Add a dependency on the ignorelist.txt file to cause rebuilds when
37*6dbdd20aSAndroid Build Coastguard Worker# the file changes.
38*6dbdd20aSAndroid Build Coastguard Workercopy("ignorelist_copy") {
39*6dbdd20aSAndroid Build Coastguard Worker  sources = [ "ignorelist.txt" ]
40*6dbdd20aSAndroid Build Coastguard Worker  outputs = [ "${target_out_dir}/ignorelist.txt" ]
41*6dbdd20aSAndroid Build Coastguard Worker}
42*6dbdd20aSAndroid Build Coastguard Worker
43*6dbdd20aSAndroid Build Coastguard Workerconfig("sanitizers_cflags") {
44*6dbdd20aSAndroid Build Coastguard Worker  if (using_sanitizer) {
45*6dbdd20aSAndroid Build Coastguard Worker    ignorelist_path_ = rebase_path("ignorelist.txt", root_build_dir)
46*6dbdd20aSAndroid Build Coastguard Worker    cflags = [
47*6dbdd20aSAndroid Build Coastguard Worker      "-fno-omit-frame-pointer",
48*6dbdd20aSAndroid Build Coastguard Worker      "-fsanitize-ignorelist=$ignorelist_path_",
49*6dbdd20aSAndroid Build Coastguard Worker    ]
50*6dbdd20aSAndroid Build Coastguard Worker    defines = []
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker    if (is_asan) {
53*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-fsanitize=address" ]
54*6dbdd20aSAndroid Build Coastguard Worker      defines += [ "ADDRESS_SANITIZER" ]
55*6dbdd20aSAndroid Build Coastguard Worker    }
56*6dbdd20aSAndroid Build Coastguard Worker    if (is_lsan) {
57*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-fsanitize=leak" ]
58*6dbdd20aSAndroid Build Coastguard Worker      defines += [ "LEAK_SANITIZER" ]
59*6dbdd20aSAndroid Build Coastguard Worker    }
60*6dbdd20aSAndroid Build Coastguard Worker    if (is_tsan) {
61*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-fsanitize=thread" ]
62*6dbdd20aSAndroid Build Coastguard Worker      defines += [
63*6dbdd20aSAndroid Build Coastguard Worker        "THREAD_SANITIZER",
64*6dbdd20aSAndroid Build Coastguard Worker        "DYNAMIC_ANNOTATIONS_EXTERNAL_IMPL=1",
65*6dbdd20aSAndroid Build Coastguard Worker      ]
66*6dbdd20aSAndroid Build Coastguard Worker    }
67*6dbdd20aSAndroid Build Coastguard Worker    if (is_msan) {
68*6dbdd20aSAndroid Build Coastguard Worker      cflags += [
69*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=memory",
70*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize-memory-track-origins=2",
71*6dbdd20aSAndroid Build Coastguard Worker      ]
72*6dbdd20aSAndroid Build Coastguard Worker      defines += [ "MEMORY_SANITIZER" ]
73*6dbdd20aSAndroid Build Coastguard Worker    }
74*6dbdd20aSAndroid Build Coastguard Worker    if (is_ubsan) {
75*6dbdd20aSAndroid Build Coastguard Worker      cflags += [
76*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=bounds",
77*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=float-divide-by-zero",
78*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=integer-divide-by-zero",
79*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=null",
80*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=object-size",
81*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=return",
82*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=returns-nonnull-attribute",
83*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=shift-exponent",
84*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=signed-integer-overflow",
85*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=unreachable",
86*6dbdd20aSAndroid Build Coastguard Worker        "-fsanitize=vla-bound",
87*6dbdd20aSAndroid Build Coastguard Worker      ]
88*6dbdd20aSAndroid Build Coastguard Worker      defines += [ "UNDEFINED_SANITIZER" ]
89*6dbdd20aSAndroid Build Coastguard Worker    }
90*6dbdd20aSAndroid Build Coastguard Worker    if (is_fuzzer) {
91*6dbdd20aSAndroid Build Coastguard Worker      # FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION is also defined by oss-fuzz,
92*6dbdd20aSAndroid Build Coastguard Worker      # so using the same name.
93*6dbdd20aSAndroid Build Coastguard Worker      defines += [ "FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION" ]
94*6dbdd20aSAndroid Build Coastguard Worker      cflags += [ "-fsanitize=fuzzer-no-link" ]
95*6dbdd20aSAndroid Build Coastguard Worker      if (is_asan) {
96*6dbdd20aSAndroid Build Coastguard Worker        cflags += [
97*6dbdd20aSAndroid Build Coastguard Worker          "-mllvm",
98*6dbdd20aSAndroid Build Coastguard Worker          "-asan-use-private-alias",
99*6dbdd20aSAndroid Build Coastguard Worker        ]
100*6dbdd20aSAndroid Build Coastguard Worker      }
101*6dbdd20aSAndroid Build Coastguard Worker    }
102*6dbdd20aSAndroid Build Coastguard Worker  }
103*6dbdd20aSAndroid Build Coastguard Worker}
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard Workerconfig("sanitizer_options_link_helper") {
106*6dbdd20aSAndroid Build Coastguard Worker  if (is_mac) {
107*6dbdd20aSAndroid Build Coastguard Worker    ldflags = [ "-Wl,-U,_sanitizer_options_link_helper" ]
108*6dbdd20aSAndroid Build Coastguard Worker  }
109*6dbdd20aSAndroid Build Coastguard Worker}
110*6dbdd20aSAndroid Build Coastguard Worker
111*6dbdd20aSAndroid Build Coastguard Workerconfig("sanitizers_ldflags") {
112*6dbdd20aSAndroid Build Coastguard Worker  if (using_sanitizer) {
113*6dbdd20aSAndroid Build Coastguard Worker    visibility = [ ":deps" ]
114*6dbdd20aSAndroid Build Coastguard Worker    ldflags = []
115*6dbdd20aSAndroid Build Coastguard Worker    if (is_asan) {
116*6dbdd20aSAndroid Build Coastguard Worker      ldflags += [ "-fsanitize=address" ]
117*6dbdd20aSAndroid Build Coastguard Worker    }
118*6dbdd20aSAndroid Build Coastguard Worker    if (is_lsan) {
119*6dbdd20aSAndroid Build Coastguard Worker      # This is not a copy/paste mistake. The LSan runtime library has
120*6dbdd20aSAndroid Build Coastguard Worker      # moved into asan. So in order to make LSan work one has to build
121*6dbdd20aSAndroid Build Coastguard Worker      # .cc files with -fsanitize=leak but link with -fsanitize=address.
122*6dbdd20aSAndroid Build Coastguard Worker      ldflags += [ "-fsanitize=address" ]
123*6dbdd20aSAndroid Build Coastguard Worker    }
124*6dbdd20aSAndroid Build Coastguard Worker    if (is_tsan) {
125*6dbdd20aSAndroid Build Coastguard Worker      ldflags += [ "-fsanitize=thread" ]
126*6dbdd20aSAndroid Build Coastguard Worker    }
127*6dbdd20aSAndroid Build Coastguard Worker    if (is_msan) {
128*6dbdd20aSAndroid Build Coastguard Worker      ldflags += [ "-fsanitize=memory" ]
129*6dbdd20aSAndroid Build Coastguard Worker    }
130*6dbdd20aSAndroid Build Coastguard Worker    if (is_ubsan) {
131*6dbdd20aSAndroid Build Coastguard Worker      ldflags += [ "-fsanitize=undefined" ]
132*6dbdd20aSAndroid Build Coastguard Worker    }
133*6dbdd20aSAndroid Build Coastguard Worker    configs = [ ":sanitizer_options_link_helper" ]
134*6dbdd20aSAndroid Build Coastguard Worker  }
135*6dbdd20aSAndroid Build Coastguard Worker}
136