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