1*6777b538SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerimport("//build/buildflag_header.gni") 6*6777b538SAndroid Build Coastguard Workerimport("//build/config/rust.gni") 7*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/goma.gni") 8*6777b538SAndroid Build Coastguard Workerimport("clang.gni") 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Workerif (is_ios) { 11*6777b538SAndroid Build Coastguard Worker import("//build/config/ios/config.gni") # For `target_environment` 12*6777b538SAndroid Build Coastguard Worker} 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workerconfig("find_bad_constructs") { 15*6777b538SAndroid Build Coastguard Worker if (clang_use_chrome_plugins) { 16*6777b538SAndroid Build Coastguard Worker cflags = [] 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker # The plugin is built directly into clang, so there's no need to load it 19*6777b538SAndroid Build Coastguard Worker # dynamically. 20*6777b538SAndroid Build Coastguard Worker cflags += [ 21*6777b538SAndroid Build Coastguard Worker "-Xclang", 22*6777b538SAndroid Build Coastguard Worker "-add-plugin", 23*6777b538SAndroid Build Coastguard Worker "-Xclang", 24*6777b538SAndroid Build Coastguard Worker "find-bad-constructs", 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker "-Xclang", 27*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 28*6777b538SAndroid Build Coastguard Worker "-Xclang", 29*6777b538SAndroid Build Coastguard Worker "raw-ref-template-as-trivial-member", 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker "-Xclang", 32*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 33*6777b538SAndroid Build Coastguard Worker "-Xclang", 34*6777b538SAndroid Build Coastguard Worker "check-stack-allocated", 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker # TODO(danakj): Delete this after the next clang roll. 37*6777b538SAndroid Build Coastguard Worker "-Xclang", 38*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 39*6777b538SAndroid Build Coastguard Worker "-Xclang", 40*6777b538SAndroid Build Coastguard Worker "check-allow-auto-typedefs-better-nested", 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker "-Xclang", 43*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 44*6777b538SAndroid Build Coastguard Worker "-Xclang", 45*6777b538SAndroid Build Coastguard Worker "check-raw-ptr-to-stack-allocated", 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker "-Xclang", 48*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 49*6777b538SAndroid Build Coastguard Worker "-Xclang", 50*6777b538SAndroid Build Coastguard Worker "disable-check-raw-ptr-to-stack-allocated-error", 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1504043): Remove when raw_ptr check has been 53*6777b538SAndroid Build Coastguard Worker # enabled for the dawn repo. 54*6777b538SAndroid Build Coastguard Worker "-Xclang", 55*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 56*6777b538SAndroid Build Coastguard Worker "-Xclang", 57*6777b538SAndroid Build Coastguard Worker "raw-ptr-exclude-path=/third_party/dawn/", 58*6777b538SAndroid Build Coastguard Worker ] 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker if (is_linux || is_chromeos || is_android || is_fuchsia) { 61*6777b538SAndroid Build Coastguard Worker cflags += [ 62*6777b538SAndroid Build Coastguard Worker "-Xclang", 63*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 64*6777b538SAndroid Build Coastguard Worker "-Xclang", 65*6777b538SAndroid Build Coastguard Worker "check-ipc", 66*6777b538SAndroid Build Coastguard Worker ] 67*6777b538SAndroid Build Coastguard Worker } 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker if (enable_check_raw_ptr_fields) { 70*6777b538SAndroid Build Coastguard Worker cflags += [ 71*6777b538SAndroid Build Coastguard Worker "-Xclang", 72*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 73*6777b538SAndroid Build Coastguard Worker "-Xclang", 74*6777b538SAndroid Build Coastguard Worker "check-raw-ptr-fields", 75*6777b538SAndroid Build Coastguard Worker ] 76*6777b538SAndroid Build Coastguard Worker } 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker if (enable_check_raw_ref_fields) { 79*6777b538SAndroid Build Coastguard Worker cflags += [ 80*6777b538SAndroid Build Coastguard Worker "-Xclang", 81*6777b538SAndroid Build Coastguard Worker "-plugin-arg-find-bad-constructs", 82*6777b538SAndroid Build Coastguard Worker "-Xclang", 83*6777b538SAndroid Build Coastguard Worker "check-raw-ref-fields", 84*6777b538SAndroid Build Coastguard Worker ] 85*6777b538SAndroid Build Coastguard Worker } 86*6777b538SAndroid Build Coastguard Worker } 87*6777b538SAndroid Build Coastguard Worker} 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker# A plugin for incrementally applying the -Wunsafe-buffer-usage warning. 90*6777b538SAndroid Build Coastguard Worker# 91*6777b538SAndroid Build Coastguard Worker# To use the plugin, the project must specify a path as 92*6777b538SAndroid Build Coastguard Worker# `clang_unsafe_buffers_paths` in the `//.gn` file. This path points to a text 93*6777b538SAndroid Build Coastguard Worker# file that controls where the warning is checked. 94*6777b538SAndroid Build Coastguard Worker# 95*6777b538SAndroid Build Coastguard Worker# See //build/config/unsafe_buffers_paths.txt for an example file, this it the 96*6777b538SAndroid Build Coastguard Worker# file used by Chromium. 97*6777b538SAndroid Build Coastguard Workerconfig("unsafe_buffers") { 98*6777b538SAndroid Build Coastguard Worker if (clang_use_chrome_plugins && clang_unsafe_buffers_paths != "" && 99*6777b538SAndroid Build Coastguard Worker !use_goma) { 100*6777b538SAndroid Build Coastguard Worker cflags = [ 101*6777b538SAndroid Build Coastguard Worker "-Xclang", 102*6777b538SAndroid Build Coastguard Worker "-add-plugin", 103*6777b538SAndroid Build Coastguard Worker "-Xclang", 104*6777b538SAndroid Build Coastguard Worker "unsafe-buffers", 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker "-Xclang", 107*6777b538SAndroid Build Coastguard Worker "-plugin-arg-unsafe-buffers", 108*6777b538SAndroid Build Coastguard Worker "-Xclang", 109*6777b538SAndroid Build Coastguard Worker rebase_path(clang_unsafe_buffers_paths, root_build_dir), 110*6777b538SAndroid Build Coastguard Worker ] 111*6777b538SAndroid Build Coastguard Worker } 112*6777b538SAndroid Build Coastguard Worker} 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Workerbuildflag_header("unsafe_buffers_buildflags") { 115*6777b538SAndroid Build Coastguard Worker header = "unsafe_buffers_buildflags.h" 116*6777b538SAndroid Build Coastguard Worker flags = [ "UNSAFE_BUFFERS_WARNING_ENABLED=$clang_use_chrome_plugins" ] 117*6777b538SAndroid Build Coastguard Worker} 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker# Enables some extra Clang-specific warnings. Some third-party code won't 120*6777b538SAndroid Build Coastguard Worker# compile with these so may want to remove this config. 121*6777b538SAndroid Build Coastguard Workerconfig("extra_warnings") { 122*6777b538SAndroid Build Coastguard Worker cflags = [ 123*6777b538SAndroid Build Coastguard Worker "-Wheader-hygiene", 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker # Warns when a const char[] is converted to bool. 126*6777b538SAndroid Build Coastguard Worker "-Wstring-conversion", 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker "-Wtautological-overlap-compare", 129*6777b538SAndroid Build Coastguard Worker ] 130*6777b538SAndroid Build Coastguard Worker} 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Workergroup("llvm-symbolizer_data") { 133*6777b538SAndroid Build Coastguard Worker if (is_win) { 134*6777b538SAndroid Build Coastguard Worker data = [ "$clang_base_path/bin/llvm-symbolizer.exe" ] 135*6777b538SAndroid Build Coastguard Worker } else { 136*6777b538SAndroid Build Coastguard Worker data = [ "$clang_base_path/bin/llvm-symbolizer" ] 137*6777b538SAndroid Build Coastguard Worker } 138*6777b538SAndroid Build Coastguard Worker} 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Workertemplate("clang_lib") { 141*6777b538SAndroid Build Coastguard Worker if (!defined(invoker.libname)) { 142*6777b538SAndroid Build Coastguard Worker not_needed(invoker, "*") 143*6777b538SAndroid Build Coastguard Worker config(target_name) { 144*6777b538SAndroid Build Coastguard Worker } 145*6777b538SAndroid Build Coastguard Worker } else { 146*6777b538SAndroid Build Coastguard Worker config(target_name) { 147*6777b538SAndroid Build Coastguard Worker _dir = "" 148*6777b538SAndroid Build Coastguard Worker _libname = invoker.libname 149*6777b538SAndroid Build Coastguard Worker _prefix = "lib" 150*6777b538SAndroid Build Coastguard Worker _suffix = "" 151*6777b538SAndroid Build Coastguard Worker _ext = "a" 152*6777b538SAndroid Build Coastguard Worker if (is_win) { 153*6777b538SAndroid Build Coastguard Worker _dir = "windows" 154*6777b538SAndroid Build Coastguard Worker _prefix = "" 155*6777b538SAndroid Build Coastguard Worker _ext = "lib" 156*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 157*6777b538SAndroid Build Coastguard Worker _suffix = "-x86_64" 158*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "x86") { 159*6777b538SAndroid Build Coastguard Worker _suffix = "-i386" 160*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 161*6777b538SAndroid Build Coastguard Worker _suffix = "-aarch64" 162*6777b538SAndroid Build Coastguard Worker } else { 163*6777b538SAndroid Build Coastguard Worker assert(false) # Unhandled cpu type 164*6777b538SAndroid Build Coastguard Worker } 165*6777b538SAndroid Build Coastguard Worker } else if (is_apple) { 166*6777b538SAndroid Build Coastguard Worker _dir = "darwin" 167*6777b538SAndroid Build Coastguard Worker } else if (is_linux || is_chromeos) { 168*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 169*6777b538SAndroid Build Coastguard Worker _dir = "x86_64-unknown-linux-gnu" 170*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "x86") { 171*6777b538SAndroid Build Coastguard Worker _dir = "i386-unknown-linux-gnu" 172*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm") { 173*6777b538SAndroid Build Coastguard Worker _dir = "armv7-unknown-linux-gnueabihf" 174*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 175*6777b538SAndroid Build Coastguard Worker _dir = "aarch64-unknown-linux-gnu" 176*6777b538SAndroid Build Coastguard Worker } else { 177*6777b538SAndroid Build Coastguard Worker assert(false) # Unhandled cpu type 178*6777b538SAndroid Build Coastguard Worker } 179*6777b538SAndroid Build Coastguard Worker } else if (is_fuchsia) { 180*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 181*6777b538SAndroid Build Coastguard Worker _dir = "x86_64-unknown-fuchsia" 182*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 183*6777b538SAndroid Build Coastguard Worker _dir = "aarch64-unknown-fuchsia" 184*6777b538SAndroid Build Coastguard Worker } else { 185*6777b538SAndroid Build Coastguard Worker assert(false) # Unhandled cpu type 186*6777b538SAndroid Build Coastguard Worker } 187*6777b538SAndroid Build Coastguard Worker } else if (is_android) { 188*6777b538SAndroid Build Coastguard Worker _dir = "linux" 189*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 190*6777b538SAndroid Build Coastguard Worker _suffix = "-x86_64-android" 191*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "x86") { 192*6777b538SAndroid Build Coastguard Worker _suffix = "-i686-android" 193*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm") { 194*6777b538SAndroid Build Coastguard Worker _suffix = "-arm-android" 195*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 196*6777b538SAndroid Build Coastguard Worker _suffix = "-aarch64-android" 197*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "riscv64") { 198*6777b538SAndroid Build Coastguard Worker _suffix = "-riscv64-android" 199*6777b538SAndroid Build Coastguard Worker } else { 200*6777b538SAndroid Build Coastguard Worker assert(false) # Unhandled cpu type 201*6777b538SAndroid Build Coastguard Worker } 202*6777b538SAndroid Build Coastguard Worker } else { 203*6777b538SAndroid Build Coastguard Worker assert(false) # Unhandled target platform 204*6777b538SAndroid Build Coastguard Worker } 205*6777b538SAndroid Build Coastguard Worker 206*6777b538SAndroid Build Coastguard Worker _clang_lib_dir = "$clang_base_path/lib/clang/$clang_version/lib" 207*6777b538SAndroid Build Coastguard Worker _lib_file = "${_prefix}clang_rt.${_libname}${_suffix}.${_ext}" 208*6777b538SAndroid Build Coastguard Worker libs = [ "$_clang_lib_dir/$_dir/$_lib_file" ] 209*6777b538SAndroid Build Coastguard Worker } 210*6777b538SAndroid Build Coastguard Worker } 211*6777b538SAndroid Build Coastguard Worker} 212*6777b538SAndroid Build Coastguard Worker 213*6777b538SAndroid Build Coastguard Worker# Adds a dependency on the Clang runtime library clang_rt.builtins. 214*6777b538SAndroid Build Coastguard Workerclang_lib("compiler_builtins") { 215*6777b538SAndroid Build Coastguard Worker if (!toolchain_has_rust) { 216*6777b538SAndroid Build Coastguard Worker # Since there's no Rust in the toolchain, there's no concern that we'll use 217*6777b538SAndroid Build Coastguard Worker # the Rust stdlib's intrinsics here. 218*6777b538SAndroid Build Coastguard Worker # 219*6777b538SAndroid Build Coastguard Worker # Don't define libname which makes this target do nothing. 220*6777b538SAndroid Build Coastguard Worker } else if (is_mac) { 221*6777b538SAndroid Build Coastguard Worker libname = "osx" 222*6777b538SAndroid Build Coastguard Worker } else if (is_ios) { 223*6777b538SAndroid Build Coastguard Worker if (target_environment == "simulator") { 224*6777b538SAndroid Build Coastguard Worker libname = "iossim" 225*6777b538SAndroid Build Coastguard Worker } else if (target_environment == "catalyst") { 226*6777b538SAndroid Build Coastguard Worker libname = "osx" 227*6777b538SAndroid Build Coastguard Worker } else { 228*6777b538SAndroid Build Coastguard Worker libname = "ios" 229*6777b538SAndroid Build Coastguard Worker } 230*6777b538SAndroid Build Coastguard Worker } else { 231*6777b538SAndroid Build Coastguard Worker libname = "builtins" 232*6777b538SAndroid Build Coastguard Worker } 233*6777b538SAndroid Build Coastguard Worker} 234*6777b538SAndroid Build Coastguard Worker 235*6777b538SAndroid Build Coastguard Worker# Adds a dependency on the Clang runtime library clang_rt.profile. 236*6777b538SAndroid Build Coastguard Workerclang_lib("compiler_profile") { 237*6777b538SAndroid Build Coastguard Worker if (!toolchain_has_rust) { 238*6777b538SAndroid Build Coastguard Worker # This is only used when `toolchain_has_rust` to support Rust linking. 239*6777b538SAndroid Build Coastguard Worker # 240*6777b538SAndroid Build Coastguard Worker # Don't define libname which makes this target do nothing. 241*6777b538SAndroid Build Coastguard Worker } else if (is_mac) { 242*6777b538SAndroid Build Coastguard Worker libname = "profile_osx" 243*6777b538SAndroid Build Coastguard Worker } else if (is_ios) { 244*6777b538SAndroid Build Coastguard Worker if (target_environment == "simulator") { 245*6777b538SAndroid Build Coastguard Worker libname = "profile_iossim" 246*6777b538SAndroid Build Coastguard Worker } else if (target_environment == "catalyst") { 247*6777b538SAndroid Build Coastguard Worker # We don't enable clang coverage on iOS device builds, and the library is 248*6777b538SAndroid Build Coastguard Worker # not part of the Clang package tarball as a result. 249*6777b538SAndroid Build Coastguard Worker # 250*6777b538SAndroid Build Coastguard Worker # Don't define libname which makes this target do nothing. 251*6777b538SAndroid Build Coastguard Worker } else { 252*6777b538SAndroid Build Coastguard Worker # We don't enable clang coverage on iOS device builds, and the library is 253*6777b538SAndroid Build Coastguard Worker # not part of the Clang package tarball as a result. 254*6777b538SAndroid Build Coastguard Worker # 255*6777b538SAndroid Build Coastguard Worker # Don't define libname which makes this target do nothing. 256*6777b538SAndroid Build Coastguard Worker } 257*6777b538SAndroid Build Coastguard Worker } else { 258*6777b538SAndroid Build Coastguard Worker libname = "profile" 259*6777b538SAndroid Build Coastguard Worker } 260*6777b538SAndroid Build Coastguard Worker} 261