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/android/config.gni") 7*6777b538SAndroid Build Coastguard Workerimport("//build/config/c++/c++.gni") 8*6777b538SAndroid Build Coastguard Workerimport("//build/config/chrome_build.gni") 9*6777b538SAndroid Build Coastguard Workerimport("//build/config/chromeos/args.gni") 10*6777b538SAndroid Build Coastguard Workerimport("//build/config/chromeos/ui_mode.gni") 11*6777b538SAndroid Build Coastguard Workerimport("//build/config/clang/clang.gni") 12*6777b538SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni") 13*6777b538SAndroid Build Coastguard Workerimport("//build/config/coverage/coverage.gni") 14*6777b538SAndroid Build Coastguard Workerimport("//build/config/dcheck_always_on.gni") 15*6777b538SAndroid Build Coastguard Workerimport("//build/config/gclient_args.gni") 16*6777b538SAndroid Build Coastguard Workerimport("//build/config/host_byteorder.gni") 17*6777b538SAndroid Build Coastguard Workerimport("//build/config/pch.gni") 18*6777b538SAndroid Build Coastguard Workerimport("//build/config/rust.gni") 19*6777b538SAndroid Build Coastguard Workerimport("//build/config/ui.gni") 20*6777b538SAndroid Build Coastguard Workerimport("//build/config/unwind.gni") 21*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/cc_wrapper.gni") 22*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/cros/cros_config.gni") 23*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/rbe.gni") 24*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/toolchain.gni") 25*6777b538SAndroid Build Coastguard Workerimport("//build_overrides/build.gni") 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Workerif (current_cpu == "arm" || current_cpu == "arm64") { 28*6777b538SAndroid Build Coastguard Worker import("//build/config/arm.gni") 29*6777b538SAndroid Build Coastguard Worker} 30*6777b538SAndroid Build Coastguard Workerif (current_cpu == "mipsel" || current_cpu == "mips64el" || 31*6777b538SAndroid Build Coastguard Worker current_cpu == "mips" || current_cpu == "mips64") { 32*6777b538SAndroid Build Coastguard Worker import("//build/config/mips.gni") 33*6777b538SAndroid Build Coastguard Worker} 34*6777b538SAndroid Build Coastguard Workerif (is_mac) { 35*6777b538SAndroid Build Coastguard Worker import("//build/config/apple/symbols.gni") 36*6777b538SAndroid Build Coastguard Worker} 37*6777b538SAndroid Build Coastguard Workerif (is_ios) { 38*6777b538SAndroid Build Coastguard Worker import("//build/config/ios/ios_sdk.gni") 39*6777b538SAndroid Build Coastguard Worker} 40*6777b538SAndroid Build Coastguard Workerif (is_nacl) { 41*6777b538SAndroid Build Coastguard Worker # To keep NaCl variables out of builds that don't include NaCl, all 42*6777b538SAndroid Build Coastguard Worker # variables defined in nacl/config.gni referenced here should be protected by 43*6777b538SAndroid Build Coastguard Worker # is_nacl conditions. 44*6777b538SAndroid Build Coastguard Worker import("//build/config/nacl/config.gni") 45*6777b538SAndroid Build Coastguard Worker} 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Workerlld_path = "" 48*6777b538SAndroid Build Coastguard Workerif (!is_clang) { 49*6777b538SAndroid Build Coastguard Worker declare_args() { 50*6777b538SAndroid Build Coastguard Worker # This allows overriding the location of lld. 51*6777b538SAndroid Build Coastguard Worker lld_path = rebase_path("$clang_base_path/bin", root_build_dir) 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker} else { 54*6777b538SAndroid Build Coastguard Worker # clang looks for lld next to it, no need for -B. 55*6777b538SAndroid Build Coastguard Worker lld_path = "" 56*6777b538SAndroid Build Coastguard Worker} 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Workerdeclare_args() { 59*6777b538SAndroid Build Coastguard Worker # Normally, Android builds are lightly optimized, even for debug builds, to 60*6777b538SAndroid Build Coastguard Worker # keep binary size down. Setting this flag to true disables such optimization 61*6777b538SAndroid Build Coastguard Worker android_full_debug = false 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker # Compile in such a way as to make it possible for the profiler to unwind full 64*6777b538SAndroid Build Coastguard Worker # stack frames. Setting this flag has a large effect on the performance of the 65*6777b538SAndroid Build Coastguard Worker # generated code than just setting profiling, but gives the profiler more 66*6777b538SAndroid Build Coastguard Worker # information to analyze. 67*6777b538SAndroid Build Coastguard Worker # Requires profiling to be set to true. 68*6777b538SAndroid Build Coastguard Worker enable_full_stack_frames_for_profiling = false 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker # When we are going to use gold we need to find it. 71*6777b538SAndroid Build Coastguard Worker # This is initialized below, after use_gold might have been overridden. 72*6777b538SAndroid Build Coastguard Worker gold_path = "" 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker # Enable fatal linker warnings. Building Chromium with certain versions 75*6777b538SAndroid Build Coastguard Worker # of binutils can cause linker warning. 76*6777b538SAndroid Build Coastguard Worker fatal_linker_warnings = true 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker # Build with C++ RTTI enabled. Chromium builds without RTTI by default, 79*6777b538SAndroid Build Coastguard Worker # but some sanitizers are known to require it, like CFI diagnostics 80*6777b538SAndroid Build Coastguard Worker # and UBsan variants. 81*6777b538SAndroid Build Coastguard Worker use_rtti = use_cfi_diag || is_ubsan_vptr || is_ubsan_security 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker # AFDO (Automatic Feedback Directed Optimizer) is a form of profile-guided 84*6777b538SAndroid Build Coastguard Worker # optimization that GCC supports. It used by ChromeOS in their official 85*6777b538SAndroid Build Coastguard Worker # builds. To use it, set auto_profile_path to the path to a file containing 86*6777b538SAndroid Build Coastguard Worker # the needed gcov profiling data. 87*6777b538SAndroid Build Coastguard Worker auto_profile_path = "" 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker # Optimize for coverage guided fuzzing (balance between speed and number of 90*6777b538SAndroid Build Coastguard Worker # branches) 91*6777b538SAndroid Build Coastguard Worker optimize_for_fuzzing = false 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker # Path to an AFDO profile to use while building with clang, if any. Empty 94*6777b538SAndroid Build Coastguard Worker # implies none. 95*6777b538SAndroid Build Coastguard Worker clang_sample_profile_path = "" 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker # Some configurations have default sample profiles. If this is true and 98*6777b538SAndroid Build Coastguard Worker # clang_sample_profile_path is empty, we'll fall back to the default. 99*6777b538SAndroid Build Coastguard Worker # 100*6777b538SAndroid Build Coastguard Worker # We currently only have default profiles for Chromium in-tree, so we disable 101*6777b538SAndroid Build Coastguard Worker # this by default for all downstream projects, since these profiles are likely 102*6777b538SAndroid Build Coastguard Worker # nonsensical for said projects. 103*6777b538SAndroid Build Coastguard Worker clang_use_default_sample_profile = 104*6777b538SAndroid Build Coastguard Worker chrome_pgo_phase == 0 && build_with_chromium && is_official_build && 105*6777b538SAndroid Build Coastguard Worker (is_android || chromeos_is_browser_only) 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker # This configuration is used to select a default profile in Chrome OS based on 108*6777b538SAndroid Build Coastguard Worker # the microarchitectures we are using. This is only used if 109*6777b538SAndroid Build Coastguard Worker # clang_use_default_sample_profile is true and clang_sample_profile_path is 110*6777b538SAndroid Build Coastguard Worker # empty. 111*6777b538SAndroid Build Coastguard Worker chromeos_afdo_platform = "atom" 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker # Emit debug information for profiling wile building with clang. 114*6777b538SAndroid Build Coastguard Worker # Only enable this for ChromeOS official builds for AFDO. 115*6777b538SAndroid Build Coastguard Worker clang_emit_debug_info_for_profiling = is_chromeos_device && is_official_build 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker # Turn this on to have the compiler output extra timing information. 118*6777b538SAndroid Build Coastguard Worker compiler_timing = false 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker # Turn this on to use ghash feature of lld for faster debug link on Windows. 121*6777b538SAndroid Build Coastguard Worker # http://blog.llvm.org/2018/01/improving-link-time-on-windows-with.html 122*6777b538SAndroid Build Coastguard Worker use_ghash = true 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker # Whether to enable ThinLTO optimizations. Turning ThinLTO optimizations on 125*6777b538SAndroid Build Coastguard Worker # can substantially increase link time and binary size, but they generally 126*6777b538SAndroid Build Coastguard Worker # also make binaries a fair bit faster. 127*6777b538SAndroid Build Coastguard Worker # 128*6777b538SAndroid Build Coastguard Worker # TODO(gbiv): We disable optimizations by default on most platforms because 129*6777b538SAndroid Build Coastguard Worker # the space overhead is too great. We should use some mixture of profiles and 130*6777b538SAndroid Build Coastguard Worker # optimization settings to better tune the size increase. 131*6777b538SAndroid Build Coastguard Worker thin_lto_enable_optimizations = 132*6777b538SAndroid Build Coastguard Worker (is_chromeos || is_android || is_win || is_linux || is_mac || 133*6777b538SAndroid Build Coastguard Worker (is_ios && use_lld)) && is_official_build 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker # Whether to enable thin lto incremental builds. 136*6777b538SAndroid Build Coastguard Worker # See: https://clang.llvm.org/docs/ThinLTO.html#incremental 137*6777b538SAndroid Build Coastguard Worker # The cache can lead to non-determinism: https://crbug.com/1486045 138*6777b538SAndroid Build Coastguard Worker thin_lto_enable_cache = true 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker # Initialize all local variables with a pattern. This flag will fill 141*6777b538SAndroid Build Coastguard Worker # uninitialized floating-point types (and 32-bit pointers) with 0xFF and the 142*6777b538SAndroid Build Coastguard Worker # rest with 0xAA. This makes behavior of uninitialized memory bugs consistent, 143*6777b538SAndroid Build Coastguard Worker # recognizable in the debugger, and crashes on memory accesses through 144*6777b538SAndroid Build Coastguard Worker # uninitialized pointers. 145*6777b538SAndroid Build Coastguard Worker # 146*6777b538SAndroid Build Coastguard Worker # Flag discussion: https://crbug.com/977230 147*6777b538SAndroid Build Coastguard Worker # 148*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1131993): This regresses binary size by ~1MB on Android and 149*6777b538SAndroid Build Coastguard Worker # needs to be evaluated before enabling it there as well. 150*6777b538SAndroid Build Coastguard Worker init_stack_vars = !(is_android && is_official_build) 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker # Zero init has favorable performance/size tradeoffs for Chrome OS 153*6777b538SAndroid Build Coastguard Worker # but was not evaluated for other platforms. 154*6777b538SAndroid Build Coastguard Worker init_stack_vars_zero = is_chromeos 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker # This argument is to control whether enabling text section splitting in the 157*6777b538SAndroid Build Coastguard Worker # final binary. When enabled, the separated text sections with prefix 158*6777b538SAndroid Build Coastguard Worker # '.text.hot', '.text.unlikely', '.text.startup' and '.text.exit' will not be 159*6777b538SAndroid Build Coastguard Worker # merged to '.text' section. This allows us to identify the hot code section 160*6777b538SAndroid Build Coastguard Worker # ('.text.hot') in the binary, which allows our data collection pipelines to 161*6777b538SAndroid Build Coastguard Worker # more easily identify code that we assume to be hot/cold that doesn't turn 162*6777b538SAndroid Build Coastguard Worker # out to be such in the field. 163*6777b538SAndroid Build Coastguard Worker use_text_section_splitting = is_chromeos 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Worker # Enable DWARF v5. 166*6777b538SAndroid Build Coastguard Worker use_dwarf5 = false 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Worker # Override this to put full paths to PDBs in Windows PE files. This helps 169*6777b538SAndroid Build Coastguard Worker # windbg and Windows Performance Analyzer with finding the PDBs in some local- 170*6777b538SAndroid Build Coastguard Worker # build scenarios. This is never needed for bots or official builds. Because 171*6777b538SAndroid Build Coastguard Worker # this puts the output directory in the DLLs/EXEs it breaks build determinism. 172*6777b538SAndroid Build Coastguard Worker # Bugs have been reported to the windbg/WPA teams and this workaround will be 173*6777b538SAndroid Build Coastguard Worker # removed when they are fixed. 174*6777b538SAndroid Build Coastguard Worker use_full_pdb_paths = false 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker # Enable -H, which prints the include tree during compilation. 177*6777b538SAndroid Build Coastguard Worker # For use by tools/clang/scripts/analyze_includes.py 178*6777b538SAndroid Build Coastguard Worker show_includes = false 179*6777b538SAndroid Build Coastguard Worker 180*6777b538SAndroid Build Coastguard Worker # Enable Profi algorithm. Profi can infer block and edge counts. 181*6777b538SAndroid Build Coastguard Worker # https://clang.llvm.org/docs/UsersManual.html#using-sampling-profilers 182*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1375958i:) Possibly enable this for Android too. 183*6777b538SAndroid Build Coastguard Worker use_profi = is_chromeos 184*6777b538SAndroid Build Coastguard Worker 185*6777b538SAndroid Build Coastguard Worker # If true, linker crashes will be rerun with `--reproduce` which causes 186*6777b538SAndroid Build Coastguard Worker # a reproducer file to be saved. 187*6777b538SAndroid Build Coastguard Worker save_reproducers_on_lld_crash = false 188*6777b538SAndroid Build Coastguard Worker 189*6777b538SAndroid Build Coastguard Worker # Enable ShadowCallStack for compiled binaries. SCS stores a pointer to a 190*6777b538SAndroid Build Coastguard Worker # shadow call stack in register x18. Hence, x18 must not be used by the OS 191*6777b538SAndroid Build Coastguard Worker # or libraries. We assume that to be the case for high end Android 192*6777b538SAndroid Build Coastguard Worker # configurations. For more details see 193*6777b538SAndroid Build Coastguard Worker # https://clang.llvm.org/docs/ShadowCallStack.html 194*6777b538SAndroid Build Coastguard Worker enable_shadow_call_stack = false 195*6777b538SAndroid Build Coastguard Worker 196*6777b538SAndroid Build Coastguard Worker # Use DWARF simple template names, with the following exceptions: 197*6777b538SAndroid Build Coastguard Worker # 198*6777b538SAndroid Build Coastguard Worker # * Windows is not supported as it doesn't use DWARF. 199*6777b538SAndroid Build Coastguard Worker # * Apple platforms (e.g. MacOS, iPhone, iPad) aren't supported because xcode 200*6777b538SAndroid Build Coastguard Worker # lldb doesn't have the needed changes yet. 201*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1379070): Remove if the upstream default ever changes. 202*6777b538SAndroid Build Coastguard Worker # 203*6777b538SAndroid Build Coastguard Worker # This greatly reduces the size of debug builds, at the cost of 204*6777b538SAndroid Build Coastguard Worker # debugging information which is required by some specialized 205*6777b538SAndroid Build Coastguard Worker # debugging tools. 206*6777b538SAndroid Build Coastguard Worker simple_template_names = is_clang && !is_nacl && !is_win && !is_apple 207*6777b538SAndroid Build Coastguard Worker} 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Workerdeclare_args() { 210*6777b538SAndroid Build Coastguard Worker # Set to true to use icf, Identical Code Folding. 211*6777b538SAndroid Build Coastguard Worker # 212*6777b538SAndroid Build Coastguard Worker # icf=all is broken in older golds, see 213*6777b538SAndroid Build Coastguard Worker # https://sourceware.org/bugzilla/show_bug.cgi?id=17704 214*6777b538SAndroid Build Coastguard Worker # chromeos binutils has been patched with the fix, so always use icf there. 215*6777b538SAndroid Build Coastguard Worker # The bug only affects x86 and x64, so we can still use ICF when targeting 216*6777b538SAndroid Build Coastguard Worker # other architectures. 217*6777b538SAndroid Build Coastguard Worker # 218*6777b538SAndroid Build Coastguard Worker # lld doesn't have the bug. 219*6777b538SAndroid Build Coastguard Worker use_icf = (is_posix || is_fuchsia) && !is_debug && !using_sanitizer && 220*6777b538SAndroid Build Coastguard Worker !use_clang_coverage && current_os != "zos" && 221*6777b538SAndroid Build Coastguard Worker !(is_android && use_order_profiling) && 222*6777b538SAndroid Build Coastguard Worker (use_lld || (use_gold && (is_chromeos || !(current_cpu == "x86" || 223*6777b538SAndroid Build Coastguard Worker current_cpu == "x64")))) 224*6777b538SAndroid Build Coastguard Worker} 225*6777b538SAndroid Build Coastguard Worker 226*6777b538SAndroid Build Coastguard Workerif (is_android) { 227*6777b538SAndroid Build Coastguard Worker # Set the path to use orderfile for linking Chrome 228*6777b538SAndroid Build Coastguard Worker # Note that this is for using only one orderfile for linking 229*6777b538SAndroid Build Coastguard Worker # the Chrome binary/library. 230*6777b538SAndroid Build Coastguard Worker declare_args() { 231*6777b538SAndroid Build Coastguard Worker chrome_orderfile_path = "" 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard Worker if (defined(default_chrome_orderfile)) { 234*6777b538SAndroid Build Coastguard Worker # Allow downstream tools to set orderfile path with 235*6777b538SAndroid Build Coastguard Worker # another variable. 236*6777b538SAndroid Build Coastguard Worker chrome_orderfile_path = default_chrome_orderfile 237*6777b538SAndroid Build Coastguard Worker } 238*6777b538SAndroid Build Coastguard Worker } 239*6777b538SAndroid Build Coastguard Worker} 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Workerdeclare_args() { 242*6777b538SAndroid Build Coastguard Worker # Turn off the --call-graph-profile-sort flag for lld by default. Enable 243*6777b538SAndroid Build Coastguard Worker # selectively for targets where it's beneficial. 244*6777b538SAndroid Build Coastguard Worker enable_call_graph_profile_sort = 245*6777b538SAndroid Build Coastguard Worker chrome_pgo_phase == 2 || 246*6777b538SAndroid Build Coastguard Worker (is_chromeos && 247*6777b538SAndroid Build Coastguard Worker (clang_use_default_sample_profile || clang_sample_profile_path != "")) 248*6777b538SAndroid Build Coastguard Worker} 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Workerassert(!(llvm_force_head_revision && use_remoteexec), 251*6777b538SAndroid Build Coastguard Worker "can't use rbe with trunk clang") 252*6777b538SAndroid Build Coastguard Worker 253*6777b538SAndroid Build Coastguard Worker# default_include_dirs --------------------------------------------------------- 254*6777b538SAndroid Build Coastguard Worker# 255*6777b538SAndroid Build Coastguard Worker# This is a separate config so that third_party code (which would not use the 256*6777b538SAndroid Build Coastguard Worker# source root and might have conflicting versions of some headers) can remove 257*6777b538SAndroid Build Coastguard Worker# this and specify their own include paths. 258*6777b538SAndroid Build Coastguard Workerconfig("default_include_dirs") { 259*6777b538SAndroid Build Coastguard Worker include_dirs = [ 260*6777b538SAndroid Build Coastguard Worker "//", 261*6777b538SAndroid Build Coastguard Worker root_gen_dir, 262*6777b538SAndroid Build Coastguard Worker ] 263*6777b538SAndroid Build Coastguard Worker} 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard Worker# Compiler instrumentation can introduce dependencies in DSOs to symbols in 266*6777b538SAndroid Build Coastguard Worker# the executable they are loaded into, so they are unresolved at link-time. 267*6777b538SAndroid Build Coastguard Workerconfig("no_unresolved_symbols") { 268*6777b538SAndroid Build Coastguard Worker if (!using_sanitizer && 269*6777b538SAndroid Build Coastguard Worker (is_linux || is_chromeos || is_android || is_fuchsia)) { 270*6777b538SAndroid Build Coastguard Worker ldflags = [ 271*6777b538SAndroid Build Coastguard Worker "-Wl,-z,defs", 272*6777b538SAndroid Build Coastguard Worker "-Wl,--as-needed", 273*6777b538SAndroid Build Coastguard Worker ] 274*6777b538SAndroid Build Coastguard Worker } 275*6777b538SAndroid Build Coastguard Worker} 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker# compiler --------------------------------------------------------------------- 278*6777b538SAndroid Build Coastguard Worker# 279*6777b538SAndroid Build Coastguard Worker# Base compiler configuration. 280*6777b538SAndroid Build Coastguard Worker# 281*6777b538SAndroid Build Coastguard Worker# See also "runtime_library" below for related stuff and a discussion about 282*6777b538SAndroid Build Coastguard Worker# where stuff should go. Put warning related stuff in the "warnings" config. 283*6777b538SAndroid Build Coastguard Worker 284*6777b538SAndroid Build Coastguard Workerconfig("compiler") { 285*6777b538SAndroid Build Coastguard Worker asmflags = [] 286*6777b538SAndroid Build Coastguard Worker cflags = [] 287*6777b538SAndroid Build Coastguard Worker cflags_c = [] 288*6777b538SAndroid Build Coastguard Worker cflags_cc = [] 289*6777b538SAndroid Build Coastguard Worker cflags_objc = [] 290*6777b538SAndroid Build Coastguard Worker cflags_objcc = [] 291*6777b538SAndroid Build Coastguard Worker rustflags = [] 292*6777b538SAndroid Build Coastguard Worker ldflags = [] 293*6777b538SAndroid Build Coastguard Worker defines = [] 294*6777b538SAndroid Build Coastguard Worker configs = [] 295*6777b538SAndroid Build Coastguard Worker rustflags = [] 296*6777b538SAndroid Build Coastguard Worker 297*6777b538SAndroid Build Coastguard Worker # System-specific flags. If your compiler flags apply to one of the 298*6777b538SAndroid Build Coastguard Worker # categories here, add it to the associated file to keep this shared config 299*6777b538SAndroid Build Coastguard Worker # smaller. 300*6777b538SAndroid Build Coastguard Worker if (is_win) { 301*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/win:compiler" ] 302*6777b538SAndroid Build Coastguard Worker } else if (is_android) { 303*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/android:compiler" ] 304*6777b538SAndroid Build Coastguard Worker } else if (is_linux || is_chromeos) { 305*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/linux:compiler" ] 306*6777b538SAndroid Build Coastguard Worker } else if (is_nacl) { 307*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/nacl:compiler" ] 308*6777b538SAndroid Build Coastguard Worker } else if (is_mac) { 309*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/mac:compiler" ] 310*6777b538SAndroid Build Coastguard Worker } else if (is_ios) { 311*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/ios:compiler" ] 312*6777b538SAndroid Build Coastguard Worker } else if (is_fuchsia) { 313*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/fuchsia:compiler" ] 314*6777b538SAndroid Build Coastguard Worker } else if (current_os == "aix") { 315*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/aix:compiler" ] 316*6777b538SAndroid Build Coastguard Worker } else if (current_os == "zos") { 317*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/zos:compiler" ] 318*6777b538SAndroid Build Coastguard Worker } 319*6777b538SAndroid Build Coastguard Worker 320*6777b538SAndroid Build Coastguard Worker configs += [ 321*6777b538SAndroid Build Coastguard Worker # See the definitions below. 322*6777b538SAndroid Build Coastguard Worker ":clang_revision", 323*6777b538SAndroid Build Coastguard Worker ":rustc_revision", 324*6777b538SAndroid Build Coastguard Worker ":compiler_cpu_abi", 325*6777b538SAndroid Build Coastguard Worker ":compiler_codegen", 326*6777b538SAndroid Build Coastguard Worker ":compiler_deterministic", 327*6777b538SAndroid Build Coastguard Worker ] 328*6777b538SAndroid Build Coastguard Worker 329*6777b538SAndroid Build Coastguard Worker # Here we enable -fno-delete-null-pointer-checks, which makes various nullptr 330*6777b538SAndroid Build Coastguard Worker # operations (e.g. dereferencing) into defined behavior. This avoids deletion 331*6777b538SAndroid Build Coastguard Worker # of some security-critical code: see https://crbug.com/1139129. 332*6777b538SAndroid Build Coastguard Worker # Nacl does not support the flag. And, we still want UBSAN to catch undefined 333*6777b538SAndroid Build Coastguard Worker # behavior related to nullptrs, so do not add this flag if UBSAN is enabled. 334*6777b538SAndroid Build Coastguard Worker # GCC seems to have some bugs compiling constexpr code when this is defined, 335*6777b538SAndroid Build Coastguard Worker # so only enable it if using_clang. See: https://gcc.gnu.org/PR97913 336*6777b538SAndroid Build Coastguard Worker # TODO(mpdenton): remove is_clang once GCC bug is fixed. 337*6777b538SAndroid Build Coastguard Worker if (!is_nacl && !is_ubsan && is_clang) { 338*6777b538SAndroid Build Coastguard Worker cflags += [ "-fno-delete-null-pointer-checks" ] 339*6777b538SAndroid Build Coastguard Worker } 340*6777b538SAndroid Build Coastguard Worker 341*6777b538SAndroid Build Coastguard Worker # Don't emit the GCC version ident directives, they just end up in the 342*6777b538SAndroid Build Coastguard Worker # .comment section or debug info taking up binary size, and makes comparing 343*6777b538SAndroid Build Coastguard Worker # .o files built with different compiler versions harder. 344*6777b538SAndroid Build Coastguard Worker if (!is_win || is_clang) { 345*6777b538SAndroid Build Coastguard Worker cflags += [ "-fno-ident" ] 346*6777b538SAndroid Build Coastguard Worker } 347*6777b538SAndroid Build Coastguard Worker 348*6777b538SAndroid Build Coastguard Worker # In general, Windows is totally different, but all the other builds share 349*6777b538SAndroid Build Coastguard Worker # some common compiler and linker configuration. 350*6777b538SAndroid Build Coastguard Worker if (!is_win) { 351*6777b538SAndroid Build Coastguard Worker # Common POSIX compiler flags setup. 352*6777b538SAndroid Build Coastguard Worker # -------------------------------- 353*6777b538SAndroid Build Coastguard Worker cflags += [ "-fno-strict-aliasing" ] # See http://crbug.com/32204 354*6777b538SAndroid Build Coastguard Worker 355*6777b538SAndroid Build Coastguard Worker # Stack protection. ShadowCallStack and Stack protector address the same 356*6777b538SAndroid Build Coastguard Worker # problems. Therefore, we only enable one or the other. Clang advertises SCS as 357*6777b538SAndroid Build Coastguard Worker # a stronger alternative to StackProtector, so we give SCS precedence over SP. 358*6777b538SAndroid Build Coastguard Worker if (enable_shadow_call_stack) { 359*6777b538SAndroid Build Coastguard Worker # On Aarch64, SCS requires the x18 register to be unused because it will hold 360*6777b538SAndroid Build Coastguard Worker # a pointer to the shadow stack. For Android we know that Clang doesn't use 361*6777b538SAndroid Build Coastguard Worker # x18 by default. On other OSs adding "-ffixed-x18" might be required. 362*6777b538SAndroid Build Coastguard Worker assert(is_android) 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker scs_parameters = [ 365*6777b538SAndroid Build Coastguard Worker "-fsanitize=shadow-call-stack", 366*6777b538SAndroid Build Coastguard Worker "-fno-stack-protector", 367*6777b538SAndroid Build Coastguard Worker ] 368*6777b538SAndroid Build Coastguard Worker cflags += scs_parameters 369*6777b538SAndroid Build Coastguard Worker ldflags += scs_parameters 370*6777b538SAndroid Build Coastguard Worker } else { 371*6777b538SAndroid Build Coastguard Worker if (is_apple) { 372*6777b538SAndroid Build Coastguard Worker # The strong variant of the stack protector significantly increases 373*6777b538SAndroid Build Coastguard Worker # binary size, so only enable it in debug mode. 374*6777b538SAndroid Build Coastguard Worker if (is_debug) { 375*6777b538SAndroid Build Coastguard Worker cflags += [ "-fstack-protector-strong" ] 376*6777b538SAndroid Build Coastguard Worker } else { 377*6777b538SAndroid Build Coastguard Worker cflags += [ "-fstack-protector" ] 378*6777b538SAndroid Build Coastguard Worker } 379*6777b538SAndroid Build Coastguard Worker } else if ((is_posix && !is_chromeos && !is_nacl) || is_fuchsia) { 380*6777b538SAndroid Build Coastguard Worker if (current_os != "aix") { 381*6777b538SAndroid Build Coastguard Worker # Not available on aix. 382*6777b538SAndroid Build Coastguard Worker cflags += [ "-fstack-protector" ] 383*6777b538SAndroid Build Coastguard Worker } 384*6777b538SAndroid Build Coastguard Worker } 385*6777b538SAndroid Build Coastguard Worker } 386*6777b538SAndroid Build Coastguard Worker 387*6777b538SAndroid Build Coastguard Worker if (use_lld) { 388*6777b538SAndroid Build Coastguard Worker ldflags += [ "-fuse-ld=lld" ] 389*6777b538SAndroid Build Coastguard Worker if (lld_path != "") { 390*6777b538SAndroid Build Coastguard Worker ldflags += [ "-B$lld_path" ] 391*6777b538SAndroid Build Coastguard Worker } 392*6777b538SAndroid Build Coastguard Worker } 393*6777b538SAndroid Build Coastguard Worker 394*6777b538SAndroid Build Coastguard Worker # Linker warnings. 395*6777b538SAndroid Build Coastguard Worker if (fatal_linker_warnings && !is_apple && current_os != "aix" && 396*6777b538SAndroid Build Coastguard Worker current_os != "zos") { 397*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--fatal-warnings" ] 398*6777b538SAndroid Build Coastguard Worker } 399*6777b538SAndroid Build Coastguard Worker if (fatal_linker_warnings && is_apple) { 400*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-fatal_warnings" ] 401*6777b538SAndroid Build Coastguard Worker } 402*6777b538SAndroid Build Coastguard Worker } 403*6777b538SAndroid Build Coastguard Worker 404*6777b538SAndroid Build Coastguard Worker if (is_clang && is_debug) { 405*6777b538SAndroid Build Coastguard Worker # Allow comparing the address of references and 'this' against 0 406*6777b538SAndroid Build Coastguard Worker # in debug builds. Technically, these can never be null in 407*6777b538SAndroid Build Coastguard Worker # well-defined C/C++ and Clang can optimize such checks away in 408*6777b538SAndroid Build Coastguard Worker # release builds, but they may be used in asserts in debug builds. 409*6777b538SAndroid Build Coastguard Worker cflags_cc += [ 410*6777b538SAndroid Build Coastguard Worker "-Wno-undefined-bool-conversion", 411*6777b538SAndroid Build Coastguard Worker "-Wno-tautological-undefined-compare", 412*6777b538SAndroid Build Coastguard Worker ] 413*6777b538SAndroid Build Coastguard Worker } 414*6777b538SAndroid Build Coastguard Worker 415*6777b538SAndroid Build Coastguard Worker # Non-Apple Posix and Fuchsia compiler flags setup. 416*6777b538SAndroid Build Coastguard Worker # ----------------------------------- 417*6777b538SAndroid Build Coastguard Worker if ((is_posix && !is_apple) || is_fuchsia) { 418*6777b538SAndroid Build Coastguard Worker if (enable_profiling) { 419*6777b538SAndroid Build Coastguard Worker if (!is_debug) { 420*6777b538SAndroid Build Coastguard Worker cflags += [ "-g" ] 421*6777b538SAndroid Build Coastguard Worker 422*6777b538SAndroid Build Coastguard Worker if (enable_full_stack_frames_for_profiling) { 423*6777b538SAndroid Build Coastguard Worker cflags += [ 424*6777b538SAndroid Build Coastguard Worker "-fno-inline", 425*6777b538SAndroid Build Coastguard Worker "-fno-optimize-sibling-calls", 426*6777b538SAndroid Build Coastguard Worker ] 427*6777b538SAndroid Build Coastguard Worker } 428*6777b538SAndroid Build Coastguard Worker } 429*6777b538SAndroid Build Coastguard Worker } 430*6777b538SAndroid Build Coastguard Worker 431*6777b538SAndroid Build Coastguard Worker # Explicitly pass --build-id to ld. Compilers used to always pass this 432*6777b538SAndroid Build Coastguard Worker # implicitly but don't any more (in particular clang when built without 433*6777b538SAndroid Build Coastguard Worker # ENABLE_LINKER_BUILD_ID=ON). 434*6777b538SAndroid Build Coastguard Worker if (is_official_build) { 435*6777b538SAndroid Build Coastguard Worker # The sha1 build id has lower risk of collision but is more expensive to 436*6777b538SAndroid Build Coastguard Worker # compute, so only use it in the official build to avoid slowing down 437*6777b538SAndroid Build Coastguard Worker # links. 438*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--build-id=sha1" ] 439*6777b538SAndroid Build Coastguard Worker } else if (current_os != "aix" && current_os != "zos") { 440*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--build-id" ] 441*6777b538SAndroid Build Coastguard Worker } 442*6777b538SAndroid Build Coastguard Worker 443*6777b538SAndroid Build Coastguard Worker if (!is_android) { 444*6777b538SAndroid Build Coastguard Worker defines += [ 445*6777b538SAndroid Build Coastguard Worker # _FILE_OFFSET_BITS=64 should not be set on Android in order to maintain 446*6777b538SAndroid Build Coastguard Worker # the behavior of the Android NDK from earlier versions. 447*6777b538SAndroid Build Coastguard Worker # See https://android-developers.googleblog.com/2017/09/introducing-android-native-development.html 448*6777b538SAndroid Build Coastguard Worker "_FILE_OFFSET_BITS=64", 449*6777b538SAndroid Build Coastguard Worker "_LARGEFILE_SOURCE", 450*6777b538SAndroid Build Coastguard Worker "_LARGEFILE64_SOURCE", 451*6777b538SAndroid Build Coastguard Worker ] 452*6777b538SAndroid Build Coastguard Worker } 453*6777b538SAndroid Build Coastguard Worker 454*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 455*6777b538SAndroid Build Coastguard Worker if (exclude_unwind_tables) { 456*6777b538SAndroid Build Coastguard Worker cflags += [ 457*6777b538SAndroid Build Coastguard Worker "-fno-unwind-tables", 458*6777b538SAndroid Build Coastguard Worker "-fno-asynchronous-unwind-tables", 459*6777b538SAndroid Build Coastguard Worker ] 460*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Cforce-unwind-tables=no" ] 461*6777b538SAndroid Build Coastguard Worker defines += [ "NO_UNWIND_TABLES" ] 462*6777b538SAndroid Build Coastguard Worker } else { 463*6777b538SAndroid Build Coastguard Worker cflags += [ "-funwind-tables" ] 464*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Cforce-unwind-tables=yes" ] 465*6777b538SAndroid Build Coastguard Worker } 466*6777b538SAndroid Build Coastguard Worker } 467*6777b538SAndroid Build Coastguard Worker } 468*6777b538SAndroid Build Coastguard Worker 469*6777b538SAndroid Build Coastguard Worker # Apple compiler flags setup. 470*6777b538SAndroid Build Coastguard Worker # --------------------------------- 471*6777b538SAndroid Build Coastguard Worker if (is_apple) { 472*6777b538SAndroid Build Coastguard Worker # On Intel, clang emits both Apple's "compact unwind" information and 473*6777b538SAndroid Build Coastguard Worker # DWARF eh_frame unwind information by default, for compatibility reasons. 474*6777b538SAndroid Build Coastguard Worker # This flag limits emission of eh_frame information to functions 475*6777b538SAndroid Build Coastguard Worker # whose unwind information can't be expressed in the compact unwind format 476*6777b538SAndroid Build Coastguard Worker # (which in practice means almost everything gets only compact unwind 477*6777b538SAndroid Build Coastguard Worker # entries). This reduces object file size a bit and makes linking a bit 478*6777b538SAndroid Build Coastguard Worker # faster. 479*6777b538SAndroid Build Coastguard Worker # On arm64, this is already the default behavior. 480*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 481*6777b538SAndroid Build Coastguard Worker asmflags += [ "-femit-dwarf-unwind=no-compact-unwind" ] 482*6777b538SAndroid Build Coastguard Worker cflags += [ "-femit-dwarf-unwind=no-compact-unwind" ] 483*6777b538SAndroid Build Coastguard Worker } 484*6777b538SAndroid Build Coastguard Worker 485*6777b538SAndroid Build Coastguard Worker # dsymutil is not available in the system, on bots, for rustc to call. Our 486*6777b538SAndroid Build Coastguard Worker # linker_driver.py script runs dsymutil itself, which is set to be the 487*6777b538SAndroid Build Coastguard Worker # linker for Rust targets as well. 488*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Csplit-debuginfo=unpacked" ] 489*6777b538SAndroid Build Coastguard Worker } 490*6777b538SAndroid Build Coastguard Worker 491*6777b538SAndroid Build Coastguard Worker # Linux/Android/Fuchsia common flags setup. 492*6777b538SAndroid Build Coastguard Worker # --------------------------------- 493*6777b538SAndroid Build Coastguard Worker if (is_linux || is_chromeos || is_android || is_fuchsia) { 494*6777b538SAndroid Build Coastguard Worker asmflags += [ "-fPIC" ] 495*6777b538SAndroid Build Coastguard Worker cflags += [ "-fPIC" ] 496*6777b538SAndroid Build Coastguard Worker ldflags += [ "-fPIC" ] 497*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Crelocation-model=pic" ] 498*6777b538SAndroid Build Coastguard Worker 499*6777b538SAndroid Build Coastguard Worker if (!is_clang) { 500*6777b538SAndroid Build Coastguard Worker # Use pipes for communicating between sub-processes. Faster. 501*6777b538SAndroid Build Coastguard Worker # (This flag doesn't do anything with Clang.) 502*6777b538SAndroid Build Coastguard Worker cflags += [ "-pipe" ] 503*6777b538SAndroid Build Coastguard Worker } 504*6777b538SAndroid Build Coastguard Worker 505*6777b538SAndroid Build Coastguard Worker ldflags += [ 506*6777b538SAndroid Build Coastguard Worker "-Wl,-z,noexecstack", 507*6777b538SAndroid Build Coastguard Worker "-Wl,-z,relro", 508*6777b538SAndroid Build Coastguard Worker ] 509*6777b538SAndroid Build Coastguard Worker 510*6777b538SAndroid Build Coastguard Worker if (!is_component_build) { 511*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-z,now" ] 512*6777b538SAndroid Build Coastguard Worker } 513*6777b538SAndroid Build Coastguard Worker } 514*6777b538SAndroid Build Coastguard Worker 515*6777b538SAndroid Build Coastguard Worker # Linux-specific compiler flags setup. 516*6777b538SAndroid Build Coastguard Worker # ------------------------------------ 517*6777b538SAndroid Build Coastguard Worker if (use_gold) { 518*6777b538SAndroid Build Coastguard Worker ldflags += [ "-fuse-ld=gold" ] 519*6777b538SAndroid Build Coastguard Worker if (!is_android) { 520*6777b538SAndroid Build Coastguard Worker # On Android, this isn't needed. gcc in the NDK knows to look next to 521*6777b538SAndroid Build Coastguard Worker # it with -fuse-ld=gold, and clang gets a --gcc-toolchain flag passed 522*6777b538SAndroid Build Coastguard Worker # above. 523*6777b538SAndroid Build Coastguard Worker if (gold_path != "") { 524*6777b538SAndroid Build Coastguard Worker ldflags += [ "-B$gold_path" ] 525*6777b538SAndroid Build Coastguard Worker } 526*6777b538SAndroid Build Coastguard Worker 527*6777b538SAndroid Build Coastguard Worker ldflags += [ 528*6777b538SAndroid Build Coastguard Worker # Experimentation found that using four linking threads 529*6777b538SAndroid Build Coastguard Worker # saved ~20% of link time. 530*6777b538SAndroid Build Coastguard Worker # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36 531*6777b538SAndroid Build Coastguard Worker # Only apply this to the target linker, since the host 532*6777b538SAndroid Build Coastguard Worker # linker might not be gold, but isn't used much anyway. 533*6777b538SAndroid Build Coastguard Worker "-Wl,--threads", 534*6777b538SAndroid Build Coastguard Worker "-Wl,--thread-count=4", 535*6777b538SAndroid Build Coastguard Worker ] 536*6777b538SAndroid Build Coastguard Worker } 537*6777b538SAndroid Build Coastguard Worker 538*6777b538SAndroid Build Coastguard Worker # TODO(thestig): Make this flag work with GN. 539*6777b538SAndroid Build Coastguard Worker #if (!is_official_build && !is_chromeos && !(is_asan || is_lsan || is_tsan || is_msan)) { 540*6777b538SAndroid Build Coastguard Worker # ldflags += [ 541*6777b538SAndroid Build Coastguard Worker # "-Wl,--detect-odr-violations", 542*6777b538SAndroid Build Coastguard Worker # ] 543*6777b538SAndroid Build Coastguard Worker #} 544*6777b538SAndroid Build Coastguard Worker } 545*6777b538SAndroid Build Coastguard Worker 546*6777b538SAndroid Build Coastguard Worker if (use_icf && (!is_apple || use_lld)) { 547*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--icf=all" ] 548*6777b538SAndroid Build Coastguard Worker } 549*6777b538SAndroid Build Coastguard Worker 550*6777b538SAndroid Build Coastguard Worker if (is_linux || is_chromeos) { 551*6777b538SAndroid Build Coastguard Worker cflags += [ "-pthread" ] 552*6777b538SAndroid Build Coastguard Worker # Do not use the -pthread ldflag here since it becomes a no-op 553*6777b538SAndroid Build Coastguard Worker # when using -nodefaultlibs, which would cause an unused argument 554*6777b538SAndroid Build Coastguard Worker # error. "-lpthread" is added in //build/config:default_libs. 555*6777b538SAndroid Build Coastguard Worker } 556*6777b538SAndroid Build Coastguard Worker 557*6777b538SAndroid Build Coastguard Worker # Clang-specific compiler flags setup. 558*6777b538SAndroid Build Coastguard Worker # ------------------------------------ 559*6777b538SAndroid Build Coastguard Worker if (is_clang) { 560*6777b538SAndroid Build Coastguard Worker cflags += [ "-fcolor-diagnostics" ] 561*6777b538SAndroid Build Coastguard Worker 562*6777b538SAndroid Build Coastguard Worker # Enable -fmerge-all-constants. This used to be the default in clang 563*6777b538SAndroid Build Coastguard Worker # for over a decade. It makes clang non-conforming, but is fairly safe 564*6777b538SAndroid Build Coastguard Worker # in practice and saves some binary size. We might want to consider 565*6777b538SAndroid Build Coastguard Worker # disabling this (https://bugs.llvm.org/show_bug.cgi?id=18538#c13), 566*6777b538SAndroid Build Coastguard Worker # but for now it looks like our build might rely on it 567*6777b538SAndroid Build Coastguard Worker # (https://crbug.com/829795). 568*6777b538SAndroid Build Coastguard Worker cflags += [ "-fmerge-all-constants" ] 569*6777b538SAndroid Build Coastguard Worker } 570*6777b538SAndroid Build Coastguard Worker 571*6777b538SAndroid Build Coastguard Worker if (use_lld) { 572*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Make the driver pass --color-diagnostics to the linker 573*6777b538SAndroid Build Coastguard Worker # if -fcolor-diagnostics is passed to it, and pass -fcolor-diagnostics 574*6777b538SAndroid Build Coastguard Worker # in ldflags instead. 575*6777b538SAndroid Build Coastguard Worker if (is_win) { 576*6777b538SAndroid Build Coastguard Worker # On Windows, we call the linker directly, instead of calling it through 577*6777b538SAndroid Build Coastguard Worker # the driver. 578*6777b538SAndroid Build Coastguard Worker ldflags += [ "--color-diagnostics" ] 579*6777b538SAndroid Build Coastguard Worker } else { 580*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--color-diagnostics" ] 581*6777b538SAndroid Build Coastguard Worker } 582*6777b538SAndroid Build Coastguard Worker } 583*6777b538SAndroid Build Coastguard Worker 584*6777b538SAndroid Build Coastguard Worker # Enable text section splitting only on linux when using lld for now. Other 585*6777b538SAndroid Build Coastguard Worker # platforms can be added later if needed. 586*6777b538SAndroid Build Coastguard Worker if ((is_linux || is_chromeos) && use_lld && use_text_section_splitting) { 587*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-z,keep-text-section-prefix" ] 588*6777b538SAndroid Build Coastguard Worker } 589*6777b538SAndroid Build Coastguard Worker 590*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_nacl && current_os != "zos") { 591*6777b538SAndroid Build Coastguard Worker cflags += [ "-fcrash-diagnostics-dir=" + clang_diagnostic_dir ] 592*6777b538SAndroid Build Coastguard Worker if (save_reproducers_on_lld_crash && use_lld) { 593*6777b538SAndroid Build Coastguard Worker ldflags += [ 594*6777b538SAndroid Build Coastguard Worker "-fcrash-diagnostics=all", 595*6777b538SAndroid Build Coastguard Worker "-fcrash-diagnostics-dir=" + clang_diagnostic_dir, 596*6777b538SAndroid Build Coastguard Worker ] 597*6777b538SAndroid Build Coastguard Worker } 598*6777b538SAndroid Build Coastguard Worker 599*6777b538SAndroid Build Coastguard Worker # TODO(hans): Remove this once Clang generates better optimized debug info 600*6777b538SAndroid Build Coastguard Worker # by default. https://crbug.com/765793 601*6777b538SAndroid Build Coastguard Worker cflags += [ 602*6777b538SAndroid Build Coastguard Worker "-mllvm", 603*6777b538SAndroid Build Coastguard Worker "-instcombine-lower-dbg-declare=0", 604*6777b538SAndroid Build Coastguard Worker ] 605*6777b538SAndroid Build Coastguard Worker if (!is_debug && use_thin_lto && is_a_target_toolchain) { 606*6777b538SAndroid Build Coastguard Worker if (is_win) { 607*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mllvm:-instcombine-lower-dbg-declare=0" ] 608*6777b538SAndroid Build Coastguard Worker } else { 609*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-mllvm,-instcombine-lower-dbg-declare=0" ] 610*6777b538SAndroid Build Coastguard Worker } 611*6777b538SAndroid Build Coastguard Worker } 612*6777b538SAndroid Build Coastguard Worker 613*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1488374): This causes binary size growth and potentially 614*6777b538SAndroid Build Coastguard Worker # other problems. 615*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1491036): This isn't supported by Cronet's mainline llvm version. 616*6777b538SAndroid Build Coastguard Worker if (default_toolchain != "//build/toolchain/cros:target" && 617*6777b538SAndroid Build Coastguard Worker !llvm_android_mainline) { 618*6777b538SAndroid Build Coastguard Worker cflags += [ 619*6777b538SAndroid Build Coastguard Worker "-mllvm", 620*6777b538SAndroid Build Coastguard Worker "-split-threshold-for-reg-with-hint=0", 621*6777b538SAndroid Build Coastguard Worker ] 622*6777b538SAndroid Build Coastguard Worker if (use_thin_lto && is_a_target_toolchain) { 623*6777b538SAndroid Build Coastguard Worker if (is_win) { 624*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mllvm:-split-threshold-for-reg-with-hint=0" ] 625*6777b538SAndroid Build Coastguard Worker } else { 626*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-mllvm,-split-threshold-for-reg-with-hint=0" ] 627*6777b538SAndroid Build Coastguard Worker } 628*6777b538SAndroid Build Coastguard Worker } 629*6777b538SAndroid Build Coastguard Worker } 630*6777b538SAndroid Build Coastguard Worker 631*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1235145): Investigate why/if this should be needed. 632*6777b538SAndroid Build Coastguard Worker if (is_win) { 633*6777b538SAndroid Build Coastguard Worker cflags += [ "/clang:-ffp-contract=off" ] 634*6777b538SAndroid Build Coastguard Worker } else { 635*6777b538SAndroid Build Coastguard Worker cflags += [ "-ffp-contract=off" ] 636*6777b538SAndroid Build Coastguard Worker } 637*6777b538SAndroid Build Coastguard Worker } 638*6777b538SAndroid Build Coastguard Worker 639*6777b538SAndroid Build Coastguard Worker # C11/C++11 compiler flags setup. 640*6777b538SAndroid Build Coastguard Worker # --------------------------- 641*6777b538SAndroid Build Coastguard Worker if (is_linux || is_chromeos || is_android || (is_nacl && is_clang) || 642*6777b538SAndroid Build Coastguard Worker current_os == "aix") { 643*6777b538SAndroid Build Coastguard Worker if (is_clang) { 644*6777b538SAndroid Build Coastguard Worker standard_prefix = "c" 645*6777b538SAndroid Build Coastguard Worker 646*6777b538SAndroid Build Coastguard Worker # Since we build with -std=c* and not -std=gnu*, _GNU_SOURCE will not be 647*6777b538SAndroid Build Coastguard Worker # defined by the compiler. However, lots of code relies on the 648*6777b538SAndroid Build Coastguard Worker # non-standard features that _GNU_SOURCE enables, so define it manually. 649*6777b538SAndroid Build Coastguard Worker defines += [ "_GNU_SOURCE" ] 650*6777b538SAndroid Build Coastguard Worker 651*6777b538SAndroid Build Coastguard Worker if (is_nacl) { 652*6777b538SAndroid Build Coastguard Worker # Undefine __STRICT_ANSI__ to get non-standard features which would 653*6777b538SAndroid Build Coastguard Worker # otherwise not be enabled by NaCl's sysroots. 654*6777b538SAndroid Build Coastguard Worker cflags += [ "-U__STRICT_ANSI__" ] 655*6777b538SAndroid Build Coastguard Worker } 656*6777b538SAndroid Build Coastguard Worker } else { 657*6777b538SAndroid Build Coastguard Worker # Gcc does not support ##__VA_ARGS__ when in standards-conforming mode, 658*6777b538SAndroid Build Coastguard Worker # but we use this feature in several places in Chromium. 659*6777b538SAndroid Build Coastguard Worker # TODO(thomasanderson): Replace usages of ##__VA_ARGS__ with the 660*6777b538SAndroid Build Coastguard Worker # standard-compliant __VA_OPT__ added by C++20, and switch the gcc build 661*6777b538SAndroid Build Coastguard Worker # to -std=c*. 662*6777b538SAndroid Build Coastguard Worker standard_prefix = "gnu" 663*6777b538SAndroid Build Coastguard Worker } 664*6777b538SAndroid Build Coastguard Worker 665*6777b538SAndroid Build Coastguard Worker cflags_c += [ "-std=${standard_prefix}11" ] 666*6777b538SAndroid Build Coastguard Worker if (is_nacl && !is_nacl_saigo) { 667*6777b538SAndroid Build Coastguard Worker # This is for the pnacl_newlib toolchain. It's only used to build 668*6777b538SAndroid Build Coastguard Worker # a few independent ppapi test files that don't pull in any other 669*6777b538SAndroid Build Coastguard Worker # dependencies. 670*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-std=${standard_prefix}++14" ] 671*6777b538SAndroid Build Coastguard Worker if (is_clang) { 672*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-fno-trigraphs" ] 673*6777b538SAndroid Build Coastguard Worker } 674*6777b538SAndroid Build Coastguard Worker } else if (is_clang) { 675*6777b538SAndroid Build Coastguard Worker if (defined(use_cxx17) && use_cxx17) { 676*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-std=${standard_prefix}++17" ] 677*6777b538SAndroid Build Coastguard Worker } else { 678*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-std=${standard_prefix}++20" ] 679*6777b538SAndroid Build Coastguard Worker } 680*6777b538SAndroid Build Coastguard Worker } else { 681*6777b538SAndroid Build Coastguard Worker # The gcc bots are currently using GCC 9, which is not new enough to 682*6777b538SAndroid Build Coastguard Worker # support "c++20"/"gnu++20". 683*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-std=${standard_prefix}++2a" ] 684*6777b538SAndroid Build Coastguard Worker } 685*6777b538SAndroid Build Coastguard Worker } else if (is_win) { 686*6777b538SAndroid Build Coastguard Worker cflags_c += [ "/std:c11" ] 687*6777b538SAndroid Build Coastguard Worker if (defined(use_cxx17) && use_cxx17) { 688*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "/std:c++17" ] 689*6777b538SAndroid Build Coastguard Worker } else { 690*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "/std:c++20" ] 691*6777b538SAndroid Build Coastguard Worker } 692*6777b538SAndroid Build Coastguard Worker } else if (!is_nacl) { 693*6777b538SAndroid Build Coastguard Worker # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either 694*6777b538SAndroid Build Coastguard Worker # gnu11/gnu++11 or c11/c++11; we technically don't need this toolchain any 695*6777b538SAndroid Build Coastguard Worker # more, but there are still a few buildbots using it, so until those are 696*6777b538SAndroid Build Coastguard Worker # turned off we need the !is_nacl clause and the (is_nacl && is_clang) 697*6777b538SAndroid Build Coastguard Worker # clause, above. 698*6777b538SAndroid Build Coastguard Worker cflags_c += [ "-std=c11" ] 699*6777b538SAndroid Build Coastguard Worker 700*6777b538SAndroid Build Coastguard Worker if (defined(use_cxx17) && use_cxx17) { 701*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-std=c++17" ] 702*6777b538SAndroid Build Coastguard Worker } else { 703*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-std=c++20" ] 704*6777b538SAndroid Build Coastguard Worker } 705*6777b538SAndroid Build Coastguard Worker } 706*6777b538SAndroid Build Coastguard Worker 707*6777b538SAndroid Build Coastguard Worker if (is_clang && current_os != "zos") { 708*6777b538SAndroid Build Coastguard Worker # C++17 removes trigraph support, but clang still warns that it ignores 709*6777b538SAndroid Build Coastguard Worker # them when seeing them. Don't. 710*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-Wno-trigraphs" ] 711*6777b538SAndroid Build Coastguard Worker } 712*6777b538SAndroid Build Coastguard Worker 713*6777b538SAndroid Build Coastguard Worker if (use_relative_vtables_abi) { 714*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-fexperimental-relative-c++-abi-vtables" ] 715*6777b538SAndroid Build Coastguard Worker ldflags += [ "-fexperimental-relative-c++-abi-vtables" ] 716*6777b538SAndroid Build Coastguard Worker } 717*6777b538SAndroid Build Coastguard Worker 718*6777b538SAndroid Build Coastguard Worker # Add flags for link-time optimization. These flags enable 719*6777b538SAndroid Build Coastguard Worker # optimizations/transformations that require whole-program visibility at link 720*6777b538SAndroid Build Coastguard Worker # time, so they need to be applied to all translation units, and we may end up 721*6777b538SAndroid Build Coastguard Worker # with miscompiles if only part of the program is compiled with LTO flags. For 722*6777b538SAndroid Build Coastguard Worker # that reason, we cannot allow targets to enable or disable these flags, for 723*6777b538SAndroid Build Coastguard Worker # example by disabling the optimize configuration. 724*6777b538SAndroid Build Coastguard Worker # TODO(pcc): Make this conditional on is_official_build rather than on gn 725*6777b538SAndroid Build Coastguard Worker # flags for specific features. 726*6777b538SAndroid Build Coastguard Worker # 727*6777b538SAndroid Build Coastguard Worker # High-end Android: While Full LTO provides a small performance improvement 728*6777b538SAndroid Build Coastguard Worker # (according to Speedometer), it also results in an unacceptable increase in 729*6777b538SAndroid Build Coastguard Worker # build time. Thin LTO appears to provide the best build time-optimization 730*6777b538SAndroid Build Coastguard Worker # tradeoff. As of April 2024, Full LTO: 731*6777b538SAndroid Build Coastguard Worker # - Increases build time by ~1:30 hours, to ~2:40 hours (from ~1:10 hours 732*6777b538SAndroid Build Coastguard Worker # with Thin LTO) on Chromium builders. 733*6777b538SAndroid Build Coastguard Worker # - Increases Speedometer 2.1 score by 1.1% [0]. 734*6777b538SAndroid Build Coastguard Worker # - Increases Speedometer 3.0 score by 1.2% [1]. 735*6777b538SAndroid Build Coastguard Worker # ... over Thin LTO. 736*6777b538SAndroid Build Coastguard Worker # 737*6777b538SAndroid Build Coastguard Worker # [0]: https://pinpoint-dot-chromeperf.appspot.com/job/15efb0313e0000 738*6777b538SAndroid Build Coastguard Worker # [1]: https://pinpoint-dot-chromeperf.appspot.com/job/157f0b42be0000 739*6777b538SAndroid Build Coastguard Worker if (!is_debug && use_thin_lto && is_a_target_toolchain) { 740*6777b538SAndroid Build Coastguard Worker assert(use_lld, "LTO is only supported with lld") 741*6777b538SAndroid Build Coastguard Worker 742*6777b538SAndroid Build Coastguard Worker cflags += [ 743*6777b538SAndroid Build Coastguard Worker "-flto=thin", 744*6777b538SAndroid Build Coastguard Worker "-fsplit-lto-unit", 745*6777b538SAndroid Build Coastguard Worker ] 746*6777b538SAndroid Build Coastguard Worker 747*6777b538SAndroid Build Coastguard Worker if (thin_lto_enable_cache) { 748*6777b538SAndroid Build Coastguard Worker # Limit the size of the ThinLTO cache to the lesser of 10% of 749*6777b538SAndroid Build Coastguard Worker # available disk space, 40GB and 100000 files. 750*6777b538SAndroid Build Coastguard Worker cache_policy = 751*6777b538SAndroid Build Coastguard Worker "cache_size=10%:cache_size_bytes=40g:cache_size_files=100000" 752*6777b538SAndroid Build Coastguard Worker cache_dir = rebase_path("$root_out_dir/thinlto-cache", root_build_dir) 753*6777b538SAndroid Build Coastguard Worker if (is_win) { 754*6777b538SAndroid Build Coastguard Worker ldflags += [ 755*6777b538SAndroid Build Coastguard Worker "/lldltocache:$cache_dir", 756*6777b538SAndroid Build Coastguard Worker "/lldltocachepolicy:$cache_policy", 757*6777b538SAndroid Build Coastguard Worker ] 758*6777b538SAndroid Build Coastguard Worker } else { 759*6777b538SAndroid Build Coastguard Worker if (is_apple) { 760*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-cache_path_lto,$cache_dir" ] 761*6777b538SAndroid Build Coastguard Worker } else { 762*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--thinlto-cache-dir=$cache_dir" ] 763*6777b538SAndroid Build Coastguard Worker } 764*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--thinlto-cache-policy=$cache_policy" ] 765*6777b538SAndroid Build Coastguard Worker } 766*6777b538SAndroid Build Coastguard Worker } 767*6777b538SAndroid Build Coastguard Worker 768*6777b538SAndroid Build Coastguard Worker # An import limit of 30 has better performance (per speedometer) and lower 769*6777b538SAndroid Build Coastguard Worker # binary size than the default setting of 100. 770*6777b538SAndroid Build Coastguard Worker # TODO(gbiv): We ideally shouldn't need to specify this; ThinLTO 771*6777b538SAndroid Build Coastguard Worker # should be able to better manage binary size increases on its own. 772*6777b538SAndroid Build Coastguard Worker # 773*6777b538SAndroid Build Coastguard Worker # For high-end Android, 30 seems to be the right trade-off between performance 774*6777b538SAndroid Build Coastguard Worker # and binary size, at least based on Speedometer. For example, increasing 775*6777b538SAndroid Build Coastguard Worker # `import_instr_limit`to 50 improves Speedometer 2.1 score by 0.7% [0], while 776*6777b538SAndroid Build Coastguard Worker # Speedometer 3.0 score remains roughly the same (-0.1%) [1]. The binary size 777*6777b538SAndroid Build Coastguard Worker # increases by about 2MB [2] (or 1.1%: the arm64 native code size in M124 is 778*6777b538SAndroid Build Coastguard Worker # 178MB). 779*6777b538SAndroid Build Coastguard Worker # [0]: https://pinpoint-dot-chromeperf.appspot.com/job/16984a18be0000 780*6777b538SAndroid Build Coastguard Worker # [1]: https://pinpoint-dot-chromeperf.appspot.com/job/11984a18be0000 781*6777b538SAndroid Build Coastguard Worker # [2]: https://ci.chromium.org/ui/p/chromium/builders/try/android-binary-size/1848442 782*6777b538SAndroid Build Coastguard Worker import_instr_limit = 30 783*6777b538SAndroid Build Coastguard Worker 784*6777b538SAndroid Build Coastguard Worker if (is_win) { 785*6777b538SAndroid Build Coastguard Worker ldflags += [ 786*6777b538SAndroid Build Coastguard Worker "/opt:lldltojobs=all", 787*6777b538SAndroid Build Coastguard Worker "-mllvm:-import-instr-limit=$import_instr_limit", 788*6777b538SAndroid Build Coastguard Worker "-mllvm:-disable-auto-upgrade-debug-info", 789*6777b538SAndroid Build Coastguard Worker ] 790*6777b538SAndroid Build Coastguard Worker } else { 791*6777b538SAndroid Build Coastguard Worker ldflags += [ "-flto=thin" ] 792*6777b538SAndroid Build Coastguard Worker 793*6777b538SAndroid Build Coastguard Worker # Enabling ThinLTO on Chrome OS too, in an effort to reduce the memory 794*6777b538SAndroid Build Coastguard Worker # usage in crbug.com/1038040. Note this will increase build time in 795*6777b538SAndroid Build Coastguard Worker # Chrome OS. 796*6777b538SAndroid Build Coastguard Worker 797*6777b538SAndroid Build Coastguard Worker # In ThinLTO builds, we run at most one link process at a time, 798*6777b538SAndroid Build Coastguard Worker # and let it use all cores. 799*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Check if '=0' (that is, number of cores, instead 800*6777b538SAndroid Build Coastguard Worker # of "all" which means number of hardware threads) is faster. 801*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--thinlto-jobs=all" ] 802*6777b538SAndroid Build Coastguard Worker 803*6777b538SAndroid Build Coastguard Worker if (is_chromeos) { 804*6777b538SAndroid Build Coastguard Worker # ARM was originally set lower than x86 to keep the size 805*6777b538SAndroid Build Coastguard Worker # bloat of ThinLTO to <10%, but that's potentially no longer true. 806*6777b538SAndroid Build Coastguard Worker # FIXME(inglorion): maybe tune these? 807*6777b538SAndroid Build Coastguard Worker # TODO(b/271459198): Revert limit on amd64 to 30 when fixed. 808*6777b538SAndroid Build Coastguard Worker import_instr_limit = 20 809*6777b538SAndroid Build Coastguard Worker } else if (is_android && optimize_for_size) { 810*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1308318): Investigate if we can get the > 6% perf win 811*6777b538SAndroid Build Coastguard Worker # of import_instr_limit 30 with a binary size hit smaller than ~2 MiB. 812*6777b538SAndroid Build Coastguard Worker import_instr_limit = 5 813*6777b538SAndroid Build Coastguard Worker } 814*6777b538SAndroid Build Coastguard Worker 815*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-mllvm,-import-instr-limit=$import_instr_limit" ] 816*6777b538SAndroid Build Coastguard Worker 817*6777b538SAndroid Build Coastguard Worker if (is_apple) { 818*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wcrl,object_path_lto" ] 819*6777b538SAndroid Build Coastguard Worker } 820*6777b538SAndroid Build Coastguard Worker 821*6777b538SAndroid Build Coastguard Worker # We only use one version of LLVM within a build so there's no need to 822*6777b538SAndroid Build Coastguard Worker # upgrade debug info, which can be expensive since it runs the verifier. 823*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ] 824*6777b538SAndroid Build Coastguard Worker } 825*6777b538SAndroid Build Coastguard Worker 826*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1211155): investigate why this isn't effective on 827*6777b538SAndroid Build Coastguard Worker # arm32. 828*6777b538SAndroid Build Coastguard Worker if (!is_android || current_cpu == "arm64") { 829*6777b538SAndroid Build Coastguard Worker cflags += [ "-fwhole-program-vtables" ] 830*6777b538SAndroid Build Coastguard Worker 831*6777b538SAndroid Build Coastguard Worker if (toolchain_supports_rust_thin_lto) { 832*6777b538SAndroid Build Coastguard Worker # whole-program-vtables implies -fsplit-lto-unit, and Rust needs to match 833*6777b538SAndroid Build Coastguard Worker # behaviour. Rust needs to know the linker will be doing LTO in this case 834*6777b538SAndroid Build Coastguard Worker # or it rejects the Zsplit-lto-unit flag. 835*6777b538SAndroid Build Coastguard Worker rustflags += [ 836*6777b538SAndroid Build Coastguard Worker "-Zsplit-lto-unit", 837*6777b538SAndroid Build Coastguard Worker "-Clinker-plugin-lto=yes", 838*6777b538SAndroid Build Coastguard Worker ] 839*6777b538SAndroid Build Coastguard Worker } else { 840*6777b538SAndroid Build Coastguard Worker # Don't include bitcode if it won't be used. 841*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Cembed-bitcode=no" ] 842*6777b538SAndroid Build Coastguard Worker } 843*6777b538SAndroid Build Coastguard Worker 844*6777b538SAndroid Build Coastguard Worker if (!is_win) { 845*6777b538SAndroid Build Coastguard Worker ldflags += [ "-fwhole-program-vtables" ] 846*6777b538SAndroid Build Coastguard Worker } 847*6777b538SAndroid Build Coastguard Worker } 848*6777b538SAndroid Build Coastguard Worker 849*6777b538SAndroid Build Coastguard Worker # This flag causes LTO to create an .ARM.attributes section with the correct 850*6777b538SAndroid Build Coastguard Worker # architecture. This is necessary because LLD will refuse to link a program 851*6777b538SAndroid Build Coastguard Worker # unless the architecture revision in .ARM.attributes is sufficiently new. 852*6777b538SAndroid Build Coastguard Worker # TODO(pcc): The contents of .ARM.attributes should be based on the 853*6777b538SAndroid Build Coastguard Worker # -march flag passed at compile time (see llvm.org/pr36291). 854*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm") { 855*6777b538SAndroid Build Coastguard Worker ldflags += [ "-march=$arm_arch" ] 856*6777b538SAndroid Build Coastguard Worker } 857*6777b538SAndroid Build Coastguard Worker } 858*6777b538SAndroid Build Coastguard Worker 859*6777b538SAndroid Build Coastguard Worker if (compiler_timing) { 860*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_nacl) { 861*6777b538SAndroid Build Coastguard Worker cflags += [ "-ftime-trace" ] 862*6777b538SAndroid Build Coastguard Worker if (use_lld && is_mac) { 863*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--time-trace" ] 864*6777b538SAndroid Build Coastguard Worker } 865*6777b538SAndroid Build Coastguard Worker } else if (is_win) { 866*6777b538SAndroid Build Coastguard Worker cflags += [ 867*6777b538SAndroid Build Coastguard Worker # "Documented" here: 868*6777b538SAndroid Build Coastguard Worker # http://aras-p.info/blog/2017/10/23/Best-unknown-MSVC-flag-d2cgsummary/ 869*6777b538SAndroid Build Coastguard Worker "/d2cgsummary", 870*6777b538SAndroid Build Coastguard Worker ] 871*6777b538SAndroid Build Coastguard Worker } 872*6777b538SAndroid Build Coastguard Worker } 873*6777b538SAndroid Build Coastguard Worker 874*6777b538SAndroid Build Coastguard Worker # Pass flag to LLD so Android builds can allow debuggerd to properly symbolize 875*6777b538SAndroid Build Coastguard Worker # stack crashes (http://crbug.com/919499). 876*6777b538SAndroid Build Coastguard Worker if (use_lld && is_android) { 877*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--no-rosegment" ] 878*6777b538SAndroid Build Coastguard Worker } 879*6777b538SAndroid Build Coastguard Worker 880*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1374347): Cleanup undefined symbol errors caught by 881*6777b538SAndroid Build Coastguard Worker # --no-undefined-version. 882*6777b538SAndroid Build Coastguard Worker if (use_lld && !is_win && !is_mac && !is_ios) { 883*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--undefined-version" ] 884*6777b538SAndroid Build Coastguard Worker } 885*6777b538SAndroid Build Coastguard Worker 886*6777b538SAndroid Build Coastguard Worker if (use_lld && is_apple) { 887*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--strict-auto-link" ] 888*6777b538SAndroid Build Coastguard Worker } 889*6777b538SAndroid Build Coastguard Worker 890*6777b538SAndroid Build Coastguard Worker # LLD does call-graph-sorted binary layout by default when profile data is 891*6777b538SAndroid Build Coastguard Worker # present. On Android this increases binary size due to more thinks for long 892*6777b538SAndroid Build Coastguard Worker # jumps. Turn it off by default and enable selectively for targets where it's 893*6777b538SAndroid Build Coastguard Worker # beneficial. 894*6777b538SAndroid Build Coastguard Worker if (use_lld && !enable_call_graph_profile_sort) { 895*6777b538SAndroid Build Coastguard Worker if (is_win) { 896*6777b538SAndroid Build Coastguard Worker ldflags += [ "/call-graph-profile-sort:no" ] 897*6777b538SAndroid Build Coastguard Worker } else { 898*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--no-call-graph-profile-sort" ] 899*6777b538SAndroid Build Coastguard Worker } 900*6777b538SAndroid Build Coastguard Worker } 901*6777b538SAndroid Build Coastguard Worker 902*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_nacl && show_includes) { 903*6777b538SAndroid Build Coastguard Worker if (is_win) { 904*6777b538SAndroid Build Coastguard Worker cflags += [ 905*6777b538SAndroid Build Coastguard Worker "/clang:-H", 906*6777b538SAndroid Build Coastguard Worker "/clang:-fshow-skipped-includes", 907*6777b538SAndroid Build Coastguard Worker ] 908*6777b538SAndroid Build Coastguard Worker } else { 909*6777b538SAndroid Build Coastguard Worker cflags += [ 910*6777b538SAndroid Build Coastguard Worker "-H", 911*6777b538SAndroid Build Coastguard Worker "-fshow-skipped-includes", 912*6777b538SAndroid Build Coastguard Worker ] 913*6777b538SAndroid Build Coastguard Worker } 914*6777b538SAndroid Build Coastguard Worker } 915*6777b538SAndroid Build Coastguard Worker 916*6777b538SAndroid Build Coastguard Worker # This flag enforces that member pointer base types are complete. It helps 917*6777b538SAndroid Build Coastguard Worker # prevent us from running into problems in the Microsoft C++ ABI (see 918*6777b538SAndroid Build Coastguard Worker # https://crbug.com/847724). 919*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_nacl && target_os != "chromeos" && 920*6777b538SAndroid Build Coastguard Worker (is_win || use_custom_libcxx)) { 921*6777b538SAndroid Build Coastguard Worker cflags += [ "-fcomplete-member-pointers" ] 922*6777b538SAndroid Build Coastguard Worker } 923*6777b538SAndroid Build Coastguard Worker 924*6777b538SAndroid Build Coastguard Worker # Use DWARF simple template names. 925*6777b538SAndroid Build Coastguard Worker if (simple_template_names) { 926*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-gsimple-template-names" ] 927*6777b538SAndroid Build Coastguard Worker } 928*6777b538SAndroid Build Coastguard Worker 929*6777b538SAndroid Build Coastguard Worker # MLGO specific flags. These flags enable an ML-based inliner trained on 930*6777b538SAndroid Build Coastguard Worker # Chrome on Android (arm32) with ThinLTO enabled, optimizing for size. 931*6777b538SAndroid Build Coastguard Worker # The "release" ML model is embedded into clang as part of its build. 932*6777b538SAndroid Build Coastguard Worker # Currently, the ML inliner is only enabled when targeting Android due to: 933*6777b538SAndroid Build Coastguard Worker # a) Android is where size matters the most. 934*6777b538SAndroid Build Coastguard Worker # b) MLGO presently has the limitation of only being able to embed one model 935*6777b538SAndroid Build Coastguard Worker # at a time; It is unclear if the embedded model is beneficial for 936*6777b538SAndroid Build Coastguard Worker # non-Android targets. 937*6777b538SAndroid Build Coastguard Worker # MLGO is only officially supported on linux. 938*6777b538SAndroid Build Coastguard Worker if (use_ml_inliner && is_a_target_toolchain) { 939*6777b538SAndroid Build Coastguard Worker assert( 940*6777b538SAndroid Build Coastguard Worker is_android && host_os == "linux", 941*6777b538SAndroid Build Coastguard Worker "MLGO is currently only supported for targeting Android on a linux host") 942*6777b538SAndroid Build Coastguard Worker if (use_thin_lto) { 943*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-mllvm,-enable-ml-inliner=release" ] 944*6777b538SAndroid Build Coastguard Worker } 945*6777b538SAndroid Build Coastguard Worker } 946*6777b538SAndroid Build Coastguard Worker 947*6777b538SAndroid Build Coastguard Worker if (clang_embed_bitcode) { 948*6777b538SAndroid Build Coastguard Worker assert(!use_thin_lto, 949*6777b538SAndroid Build Coastguard Worker "clang_embed_bitcode is only supported in non-ThinLTO builds") 950*6777b538SAndroid Build Coastguard Worker cflags += [ 951*6777b538SAndroid Build Coastguard Worker "-Xclang", 952*6777b538SAndroid Build Coastguard Worker "-fembed-bitcode=all", 953*6777b538SAndroid Build Coastguard Worker ] 954*6777b538SAndroid Build Coastguard Worker } 955*6777b538SAndroid Build Coastguard Worker 956*6777b538SAndroid Build Coastguard Worker if (lld_emit_indexes_and_imports) { 957*6777b538SAndroid Build Coastguard Worker assert(use_thin_lto, 958*6777b538SAndroid Build Coastguard Worker "lld_emit_indexes_and_imports is only supported with ThinLTO builds") 959*6777b538SAndroid Build Coastguard Worker ldflags += [ 960*6777b538SAndroid Build Coastguard Worker "-Wl,--save-temps=import", 961*6777b538SAndroid Build Coastguard Worker "-Wl,--thinlto-emit-index-files", 962*6777b538SAndroid Build Coastguard Worker ] 963*6777b538SAndroid Build Coastguard Worker } 964*6777b538SAndroid Build Coastguard Worker 965*6777b538SAndroid Build Coastguard Worker # Pass the same C/C++ flags to the objective C/C++ compiler. 966*6777b538SAndroid Build Coastguard Worker cflags_objc += cflags_c 967*6777b538SAndroid Build Coastguard Worker cflags_objcc += cflags_cc 968*6777b538SAndroid Build Coastguard Worker 969*6777b538SAndroid Build Coastguard Worker # Assign any flags set for the C compiler to asmflags so that they are sent 970*6777b538SAndroid Build Coastguard Worker # to the assembler. The Windows assembler takes different types of flags 971*6777b538SAndroid Build Coastguard Worker # so only do so for posix platforms. 972*6777b538SAndroid Build Coastguard Worker if (is_posix || is_fuchsia) { 973*6777b538SAndroid Build Coastguard Worker asmflags += cflags 974*6777b538SAndroid Build Coastguard Worker asmflags += cflags_c 975*6777b538SAndroid Build Coastguard Worker } 976*6777b538SAndroid Build Coastguard Worker 977*6777b538SAndroid Build Coastguard Worker if (is_chromeos_device && !is_nacl) { 978*6777b538SAndroid Build Coastguard Worker # On ChromeOS devices, we want to ensure we're using Chrome's allocator 979*6777b538SAndroid Build Coastguard Worker # symbols for all C++ new/delete operator overloads. PartitionAlloc 980*6777b538SAndroid Build Coastguard Worker # and other local allocators should always take precedence over system or 981*6777b538SAndroid Build Coastguard Worker # preloaded allocators. These are the mangled symbol names. 982*6777b538SAndroid Build Coastguard Worker # See b/280115910 for details. 983*6777b538SAndroid Build Coastguard Worker ldflags += [ 984*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdaPv,-u,_ZdaPv", 985*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdaPvRKSt9nothrow_t,-u,_ZdaPvRKSt9nothrow_t", 986*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdlPv,-u,_ZdlPv", 987*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdlPvm,-u,_ZdlPvm", 988*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdlPvRKSt9nothrow_t,-u,_ZdlPvRKSt9nothrow_t", 989*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_Znam,-u,_Znam", 990*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZnamRKSt9nothrow_t,-u,_ZnamRKSt9nothrow_t", 991*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_Znwm,-u,_Znwm", 992*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZnwmRKSt9nothrow_t,-u,_ZnwmRKSt9nothrow_t", 993*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdaPvmSt11align_val_t,-u,_ZdaPvmSt11align_val_t", 994*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdaPvSt11align_val_t,-u,_ZdaPvSt11align_val_t", 995*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdaPvSt11align_val_tRKSt9nothrow_t,-u,_ZdaPvSt11align_val_tRKSt9nothrow_t", 996*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdlPvmSt11align_val_t,-u,_ZdlPvmSt11align_val_t", 997*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdlPvSt11align_val_t,-u,_ZdlPvSt11align_val_t", 998*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZdlPvSt11align_val_tRKSt9nothrow_t,-u,_ZdlPvSt11align_val_tRKSt9nothrow_t", 999*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZnamSt11align_val_t,-u,_ZnamSt11align_val_t", 1000*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZnamSt11align_val_tRKSt9nothrow_t,-u,_ZnamSt11align_val_tRKSt9nothrow_t", 1001*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZnwmSt11align_val_t,-u,_ZnwmSt11align_val_t", 1002*6777b538SAndroid Build Coastguard Worker "-Wl,--export-dynamic-symbol=_ZnwmSt11align_val_tRKSt9nothrow_t,-u,_ZnwmSt11align_val_tRKSt9nothrow_t", 1003*6777b538SAndroid Build Coastguard Worker ] 1004*6777b538SAndroid Build Coastguard Worker } 1005*6777b538SAndroid Build Coastguard Worker 1006*6777b538SAndroid Build Coastguard Worker # Rust compiler flags setup. 1007*6777b538SAndroid Build Coastguard Worker # --------------------------- 1008*6777b538SAndroid Build Coastguard Worker rustflags += [ 1009*6777b538SAndroid Build Coastguard Worker # Overflow checks are optional in Rust, but even if switched 1010*6777b538SAndroid Build Coastguard Worker # off they do not cause undefined behavior (the overflowing 1011*6777b538SAndroid Build Coastguard Worker # behavior is defined). Because containers are bounds-checked 1012*6777b538SAndroid Build Coastguard Worker # in safe Rust, they also can't provoke buffer overflows. 1013*6777b538SAndroid Build Coastguard Worker # As such these checks may be less important in Rust than C++. 1014*6777b538SAndroid Build Coastguard Worker # But in (simplistic) testing they have negligible performance 1015*6777b538SAndroid Build Coastguard Worker # overhead, and this helps to provide consistent behavior 1016*6777b538SAndroid Build Coastguard Worker # between different configurations, so we'll keep them on until 1017*6777b538SAndroid Build Coastguard Worker # we discover a reason to turn them off. 1018*6777b538SAndroid Build Coastguard Worker "-Coverflow-checks=on", 1019*6777b538SAndroid Build Coastguard Worker 1020*6777b538SAndroid Build Coastguard Worker # By default Rust passes `-nodefaultlibs` to the linker, however this 1021*6777b538SAndroid Build Coastguard Worker # conflicts with our `--unwind=none` flag for Android dylibs, as the latter 1022*6777b538SAndroid Build Coastguard Worker # is then unused and produces a warning/error. So this removes the 1023*6777b538SAndroid Build Coastguard Worker # `-nodefaultlibs` from the linker invocation from Rust, which would be used 1024*6777b538SAndroid Build Coastguard Worker # to compile dylibs on Android, such as for constructing unit test APKs. 1025*6777b538SAndroid Build Coastguard Worker "-Cdefault-linker-libraries", 1026*6777b538SAndroid Build Coastguard Worker 1027*6777b538SAndroid Build Coastguard Worker # To make Rust .d files compatible with ninja 1028*6777b538SAndroid Build Coastguard Worker "-Zdep-info-omit-d-target", 1029*6777b538SAndroid Build Coastguard Worker 1030*6777b538SAndroid Build Coastguard Worker # If a macro panics during compilation, show which macro and where it is 1031*6777b538SAndroid Build Coastguard Worker # defined. 1032*6777b538SAndroid Build Coastguard Worker "-Zmacro-backtrace", 1033*6777b538SAndroid Build Coastguard Worker 1034*6777b538SAndroid Build Coastguard Worker # For deterministic builds, keep the local machine's current working 1035*6777b538SAndroid Build Coastguard Worker # directory from appearing in build outputs. 1036*6777b538SAndroid Build Coastguard Worker "-Zremap-cwd-prefix=.", 1037*6777b538SAndroid Build Coastguard Worker ] 1038*6777b538SAndroid Build Coastguard Worker 1039*6777b538SAndroid Build Coastguard Worker if (!is_win || force_rustc_color_output) { 1040*6777b538SAndroid Build Coastguard Worker # Colorize error output. The analogous flag is passed for clang. This must 1041*6777b538SAndroid Build Coastguard Worker # be platform-gated since rustc will unconditionally output ANSI escape 1042*6777b538SAndroid Build Coastguard Worker # sequences, ignoring the platform, when stderr is not a terminal. 1043*6777b538SAndroid Build Coastguard Worker rustflags += [ "--color=always" ] 1044*6777b538SAndroid Build Coastguard Worker } 1045*6777b538SAndroid Build Coastguard Worker if (rust_abi_target != "") { 1046*6777b538SAndroid Build Coastguard Worker rustflags += [ "--target=$rust_abi_target" ] 1047*6777b538SAndroid Build Coastguard Worker } 1048*6777b538SAndroid Build Coastguard Worker if (!use_thin_lto || !toolchain_supports_rust_thin_lto) { 1049*6777b538SAndroid Build Coastguard Worker # Don't include bitcode if it won't be used. 1050*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Cembed-bitcode=no" ] 1051*6777b538SAndroid Build Coastguard Worker 1052*6777b538SAndroid Build Coastguard Worker # Disable "automatic" ThinLTO between codegen units. The weak symbol 1053*6777b538SAndroid Build Coastguard Worker # resolution across units can have surprising effects on linking, see 1054*6777b538SAndroid Build Coastguard Worker # crbug.com/324126269 and github.com/rust-lang/rust/issues/120842. 1055*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Clto=no" ] 1056*6777b538SAndroid Build Coastguard Worker } 1057*6777b538SAndroid Build Coastguard Worker if (is_official_build) { 1058*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Ccodegen-units=1" ] 1059*6777b538SAndroid Build Coastguard Worker } 1060*6777b538SAndroid Build Coastguard Worker if (!rust_prebuilt_stdlib) { 1061*6777b538SAndroid Build Coastguard Worker # When building against the Chromium Rust stdlib (which we compile) always 1062*6777b538SAndroid Build Coastguard Worker # abort instead of unwinding when panic occurs. In official builds, panics 1063*6777b538SAndroid Build Coastguard Worker # abort immediately (this is configured in the stdlib) to keep binary size 1064*6777b538SAndroid Build Coastguard Worker # down. So we unconditionally match behaviour in unofficial too. 1065*6777b538SAndroid Build Coastguard Worker rustflags += [ 1066*6777b538SAndroid Build Coastguard Worker "-Cpanic=abort", 1067*6777b538SAndroid Build Coastguard Worker "-Zpanic_abort_tests", 1068*6777b538SAndroid Build Coastguard Worker ] 1069*6777b538SAndroid Build Coastguard Worker } 1070*6777b538SAndroid Build Coastguard Worker 1071*6777b538SAndroid Build Coastguard Worker # Normally, this would be defined in the `runtime_library` config but NaCl 1072*6777b538SAndroid Build Coastguard Worker # saigo libc++ does not use the custom hermetic libc++. Unfortunately, there 1073*6777b538SAndroid Build Coastguard Worker # isn't really a better config to add this define for the define to 1074*6777b538SAndroid Build Coastguard Worker # consistently apply in both Chromium and non-Chromium code *and* non-NaCl 1075*6777b538SAndroid Build Coastguard Worker # and NaCl code. 1076*6777b538SAndroid Build Coastguard Worker # 1077*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/702997): Move this back to the `runtime_library` 1078*6777b538SAndroid Build Coastguard Worker # config when NaCl is removed. 1079*6777b538SAndroid Build Coastguard Worker if (use_safe_libcxx) { 1080*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1465186): Switch saigo to hardened mode once 1081*6777b538SAndroid Build Coastguard Worker # it's rolled in. 1082*6777b538SAndroid Build Coastguard Worker if (is_nacl_saigo) { 1083*6777b538SAndroid Build Coastguard Worker defines += [ "_LIBCPP_ENABLE_ASSERTIONS=1" ] 1084*6777b538SAndroid Build Coastguard Worker } else { 1085*6777b538SAndroid Build Coastguard Worker defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ] 1086*6777b538SAndroid Build Coastguard Worker } 1087*6777b538SAndroid Build Coastguard Worker } else { 1088*6777b538SAndroid Build Coastguard Worker defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ] 1089*6777b538SAndroid Build Coastguard Worker } 1090*6777b538SAndroid Build Coastguard Worker 1091*6777b538SAndroid Build Coastguard Worker # Enable libstdc++ hardening lightweight assertions. Those have a low 1092*6777b538SAndroid Build Coastguard Worker # performance penalty but are considered a bare minimum for security. 1093*6777b538SAndroid Build Coastguard Worker if (use_safe_libstdcxx) { 1094*6777b538SAndroid Build Coastguard Worker defines += [ "_GLIBCXX_ASSERTIONS=1" ] 1095*6777b538SAndroid Build Coastguard Worker } 1096*6777b538SAndroid Build Coastguard Worker} 1097*6777b538SAndroid Build Coastguard Worker 1098*6777b538SAndroid Build Coastguard Worker# The BUILDCONFIG file sets this config on targets by default, which means when 1099*6777b538SAndroid Build Coastguard Worker# building with ThinLTO, no optimization is performed in the link step. 1100*6777b538SAndroid Build Coastguard Workerconfig("thinlto_optimize_default") { 1101*6777b538SAndroid Build Coastguard Worker if (!is_debug && use_thin_lto && is_a_target_toolchain) { 1102*6777b538SAndroid Build Coastguard Worker lto_opt_level = 0 1103*6777b538SAndroid Build Coastguard Worker 1104*6777b538SAndroid Build Coastguard Worker if (is_win) { 1105*6777b538SAndroid Build Coastguard Worker ldflags = [ "/opt:lldlto=" + lto_opt_level ] 1106*6777b538SAndroid Build Coastguard Worker } else { 1107*6777b538SAndroid Build Coastguard Worker ldflags = [ "-Wl,--lto-O" + lto_opt_level ] 1108*6777b538SAndroid Build Coastguard Worker } 1109*6777b538SAndroid Build Coastguard Worker 1110*6777b538SAndroid Build Coastguard Worker if (toolchain_supports_rust_thin_lto) { 1111*6777b538SAndroid Build Coastguard Worker # We always point Rust to a linker that performs LTO, so we don't want Rust 1112*6777b538SAndroid Build Coastguard Worker # to preemptively do so during compilation too or they conflict. But we do 1113*6777b538SAndroid Build Coastguard Worker # want Rust to generate LTO metadata in order for the linker to do its job. 1114*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Clinker-plugin-lto=yes" ] 1115*6777b538SAndroid Build Coastguard Worker } else { 1116*6777b538SAndroid Build Coastguard Worker # Don't include bitcode if it won't be used. 1117*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Cembed-bitcode=no" ] 1118*6777b538SAndroid Build Coastguard Worker } 1119*6777b538SAndroid Build Coastguard Worker } 1120*6777b538SAndroid Build Coastguard Worker} 1121*6777b538SAndroid Build Coastguard Worker 1122*6777b538SAndroid Build Coastguard Worker# Use this to enable optimization in the ThinLTO link step for select targets 1123*6777b538SAndroid Build Coastguard Worker# when thin_lto_enable_optimizations is set by doing: 1124*6777b538SAndroid Build Coastguard Worker# 1125*6777b538SAndroid Build Coastguard Worker# configs -= [ "//build/config/compiler:thinlto_optimize_default" ] 1126*6777b538SAndroid Build Coastguard Worker# configs += [ "//build/config/compiler:thinlto_optimize_max" ] 1127*6777b538SAndroid Build Coastguard Worker# 1128*6777b538SAndroid Build Coastguard Worker# Since it makes linking significantly slower and more resource intensive, only 1129*6777b538SAndroid Build Coastguard Worker# use it on important targets such as the main browser executable or dll. 1130*6777b538SAndroid Build Coastguard Workerconfig("thinlto_optimize_max") { 1131*6777b538SAndroid Build Coastguard Worker if (!is_debug && use_thin_lto && is_a_target_toolchain) { 1132*6777b538SAndroid Build Coastguard Worker if (thin_lto_enable_optimizations) { 1133*6777b538SAndroid Build Coastguard Worker lto_opt_level = 2 1134*6777b538SAndroid Build Coastguard Worker } else { 1135*6777b538SAndroid Build Coastguard Worker lto_opt_level = 0 1136*6777b538SAndroid Build Coastguard Worker } 1137*6777b538SAndroid Build Coastguard Worker 1138*6777b538SAndroid Build Coastguard Worker if (is_win) { 1139*6777b538SAndroid Build Coastguard Worker ldflags = [ "/opt:lldlto=" + lto_opt_level ] 1140*6777b538SAndroid Build Coastguard Worker } else { 1141*6777b538SAndroid Build Coastguard Worker ldflags = [ "-Wl,--lto-O" + lto_opt_level ] 1142*6777b538SAndroid Build Coastguard Worker } 1143*6777b538SAndroid Build Coastguard Worker 1144*6777b538SAndroid Build Coastguard Worker if (toolchain_supports_rust_thin_lto) { 1145*6777b538SAndroid Build Coastguard Worker # We always point Rust to a linker that performs LTO, so we don't want Rust 1146*6777b538SAndroid Build Coastguard Worker # to preemptively do so during compilation too or they conflict. But we do 1147*6777b538SAndroid Build Coastguard Worker # want Rust to generate LTO metadata in order for the linker to do its job. 1148*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Clinker-plugin-lto=yes" ] 1149*6777b538SAndroid Build Coastguard Worker } else { 1150*6777b538SAndroid Build Coastguard Worker # Don't include bitcode if it won't be used. 1151*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Cembed-bitcode=no" ] 1152*6777b538SAndroid Build Coastguard Worker } 1153*6777b538SAndroid Build Coastguard Worker } 1154*6777b538SAndroid Build Coastguard Worker} 1155*6777b538SAndroid Build Coastguard Worker 1156*6777b538SAndroid Build Coastguard Worker# This provides the basic options to select the target CPU and ABI. 1157*6777b538SAndroid Build Coastguard Worker# It is factored out of "compiler" so that special cases can use this 1158*6777b538SAndroid Build Coastguard Worker# without using everything that "compiler" brings in. Options that 1159*6777b538SAndroid Build Coastguard Worker# tweak code generation for a particular CPU do not belong here! 1160*6777b538SAndroid Build Coastguard Worker# See "compiler_codegen", below. 1161*6777b538SAndroid Build Coastguard Workerconfig("compiler_cpu_abi") { 1162*6777b538SAndroid Build Coastguard Worker cflags = [] 1163*6777b538SAndroid Build Coastguard Worker ldflags = [] 1164*6777b538SAndroid Build Coastguard Worker defines = [] 1165*6777b538SAndroid Build Coastguard Worker 1166*6777b538SAndroid Build Coastguard Worker configs = [] 1167*6777b538SAndroid Build Coastguard Worker if (is_chromeos) { 1168*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/chromeos:compiler_cpu_abi" ] 1169*6777b538SAndroid Build Coastguard Worker } 1170*6777b538SAndroid Build Coastguard Worker 1171*6777b538SAndroid Build Coastguard Worker if ((is_posix && !is_apple) || is_fuchsia) { 1172*6777b538SAndroid Build Coastguard Worker # CPU architecture. We may or may not be doing a cross compile now, so for 1173*6777b538SAndroid Build Coastguard Worker # simplicity we always explicitly set the architecture. 1174*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 1175*6777b538SAndroid Build Coastguard Worker cflags += [ 1176*6777b538SAndroid Build Coastguard Worker "-m64", 1177*6777b538SAndroid Build Coastguard Worker "-msse3", 1178*6777b538SAndroid Build Coastguard Worker ] 1179*6777b538SAndroid Build Coastguard Worker 1180*6777b538SAndroid Build Coastguard Worker # Minimum SIMD support for devices running lacros. 1181*6777b538SAndroid Build Coastguard Worker # See https://crbug.com/1475858 1182*6777b538SAndroid Build Coastguard Worker if (is_chromeos_lacros) { 1183*6777b538SAndroid Build Coastguard Worker cflags += [ 1184*6777b538SAndroid Build Coastguard Worker "-mssse3", 1185*6777b538SAndroid Build Coastguard Worker "-msse4", 1186*6777b538SAndroid Build Coastguard Worker "-msse4.1", 1187*6777b538SAndroid Build Coastguard Worker "-msse4.2", 1188*6777b538SAndroid Build Coastguard Worker ] 1189*6777b538SAndroid Build Coastguard Worker } 1190*6777b538SAndroid Build Coastguard Worker ldflags += [ "-m64" ] 1191*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "x86") { 1192*6777b538SAndroid Build Coastguard Worker cflags += [ "-m32" ] 1193*6777b538SAndroid Build Coastguard Worker ldflags += [ "-m32" ] 1194*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 1195*6777b538SAndroid Build Coastguard Worker cflags += [ 1196*6777b538SAndroid Build Coastguard Worker "-mfpmath=sse", 1197*6777b538SAndroid Build Coastguard Worker "-msse3", 1198*6777b538SAndroid Build Coastguard Worker ] 1199*6777b538SAndroid Build Coastguard Worker } 1200*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm") { 1201*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_android && !is_nacl && 1202*6777b538SAndroid Build Coastguard Worker !(is_chromeos_lacros && is_chromeos_device)) { 1203*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=arm-linux-gnueabihf" ] 1204*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=arm-linux-gnueabihf" ] 1205*6777b538SAndroid Build Coastguard Worker } 1206*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 1207*6777b538SAndroid Build Coastguard Worker cflags += [ 1208*6777b538SAndroid Build Coastguard Worker "-march=$arm_arch", 1209*6777b538SAndroid Build Coastguard Worker "-mfloat-abi=$arm_float_abi", 1210*6777b538SAndroid Build Coastguard Worker ] 1211*6777b538SAndroid Build Coastguard Worker } 1212*6777b538SAndroid Build Coastguard Worker if (arm_tune != "") { 1213*6777b538SAndroid Build Coastguard Worker cflags += [ "-mtune=$arm_tune" ] 1214*6777b538SAndroid Build Coastguard Worker } 1215*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 1216*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_android && !is_nacl && !is_fuchsia && 1217*6777b538SAndroid Build Coastguard Worker !(is_chromeos_lacros && is_chromeos_device)) { 1218*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=aarch64-linux-gnu" ] 1219*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=aarch64-linux-gnu" ] 1220*6777b538SAndroid Build Coastguard Worker } 1221*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "mipsel" && !is_nacl) { 1222*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--hash-style=sysv" ] 1223*6777b538SAndroid Build Coastguard Worker if (custom_toolchain == "") { 1224*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1225*6777b538SAndroid Build Coastguard Worker if (is_android) { 1226*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=mipsel-linux-android" ] 1227*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=mipsel-linux-android" ] 1228*6777b538SAndroid Build Coastguard Worker } else { 1229*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=mipsel-linux-gnu" ] 1230*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=mipsel-linux-gnu" ] 1231*6777b538SAndroid Build Coastguard Worker } 1232*6777b538SAndroid Build Coastguard Worker } else { 1233*6777b538SAndroid Build Coastguard Worker cflags += [ "-EL" ] 1234*6777b538SAndroid Build Coastguard Worker ldflags += [ "-EL" ] 1235*6777b538SAndroid Build Coastguard Worker } 1236*6777b538SAndroid Build Coastguard Worker } 1237*6777b538SAndroid Build Coastguard Worker 1238*6777b538SAndroid Build Coastguard Worker if (mips_arch_variant == "r6") { 1239*6777b538SAndroid Build Coastguard Worker cflags += [ "-mno-odd-spreg" ] 1240*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips32r6" ] 1241*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1242*6777b538SAndroid Build Coastguard Worker cflags += [ 1243*6777b538SAndroid Build Coastguard Worker "-march=mipsel", 1244*6777b538SAndroid Build Coastguard Worker "-mcpu=mips32r6", 1245*6777b538SAndroid Build Coastguard Worker ] 1246*6777b538SAndroid Build Coastguard Worker } else { 1247*6777b538SAndroid Build Coastguard Worker cflags += [ 1248*6777b538SAndroid Build Coastguard Worker "-mips32r6", 1249*6777b538SAndroid Build Coastguard Worker "-Wa,-mips32r6", 1250*6777b538SAndroid Build Coastguard Worker ] 1251*6777b538SAndroid Build Coastguard Worker if (is_android) { 1252*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-melf32ltsmip" ] 1253*6777b538SAndroid Build Coastguard Worker } 1254*6777b538SAndroid Build Coastguard Worker } 1255*6777b538SAndroid Build Coastguard Worker if (mips_use_msa == true) { 1256*6777b538SAndroid Build Coastguard Worker cflags += [ 1257*6777b538SAndroid Build Coastguard Worker "-mmsa", 1258*6777b538SAndroid Build Coastguard Worker "-mfp64", 1259*6777b538SAndroid Build Coastguard Worker ] 1260*6777b538SAndroid Build Coastguard Worker } 1261*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "r2") { 1262*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips32r2" ] 1263*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1264*6777b538SAndroid Build Coastguard Worker cflags += [ 1265*6777b538SAndroid Build Coastguard Worker "-march=mipsel", 1266*6777b538SAndroid Build Coastguard Worker "-mcpu=mips32r2", 1267*6777b538SAndroid Build Coastguard Worker ] 1268*6777b538SAndroid Build Coastguard Worker } else { 1269*6777b538SAndroid Build Coastguard Worker cflags += [ 1270*6777b538SAndroid Build Coastguard Worker "-mips32r2", 1271*6777b538SAndroid Build Coastguard Worker "-Wa,-mips32r2", 1272*6777b538SAndroid Build Coastguard Worker ] 1273*6777b538SAndroid Build Coastguard Worker if (mips_float_abi == "hard" && mips_fpu_mode != "") { 1274*6777b538SAndroid Build Coastguard Worker cflags += [ "-m$mips_fpu_mode" ] 1275*6777b538SAndroid Build Coastguard Worker } 1276*6777b538SAndroid Build Coastguard Worker } 1277*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "r1") { 1278*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips32" ] 1279*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1280*6777b538SAndroid Build Coastguard Worker cflags += [ 1281*6777b538SAndroid Build Coastguard Worker "-march=mipsel", 1282*6777b538SAndroid Build Coastguard Worker "-mcpu=mips32", 1283*6777b538SAndroid Build Coastguard Worker ] 1284*6777b538SAndroid Build Coastguard Worker } else { 1285*6777b538SAndroid Build Coastguard Worker cflags += [ 1286*6777b538SAndroid Build Coastguard Worker "-mips32", 1287*6777b538SAndroid Build Coastguard Worker "-Wa,-mips32", 1288*6777b538SAndroid Build Coastguard Worker ] 1289*6777b538SAndroid Build Coastguard Worker } 1290*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "loongson3") { 1291*6777b538SAndroid Build Coastguard Worker defines += [ "_MIPS_ARCH_LOONGSON" ] 1292*6777b538SAndroid Build Coastguard Worker cflags += [ 1293*6777b538SAndroid Build Coastguard Worker "-march=loongson3a", 1294*6777b538SAndroid Build Coastguard Worker "-mno-branch-likely", 1295*6777b538SAndroid Build Coastguard Worker "-Wa,-march=loongson3a", 1296*6777b538SAndroid Build Coastguard Worker ] 1297*6777b538SAndroid Build Coastguard Worker } 1298*6777b538SAndroid Build Coastguard Worker 1299*6777b538SAndroid Build Coastguard Worker if (mips_dsp_rev == 1) { 1300*6777b538SAndroid Build Coastguard Worker cflags += [ "-mdsp" ] 1301*6777b538SAndroid Build Coastguard Worker } else if (mips_dsp_rev == 2) { 1302*6777b538SAndroid Build Coastguard Worker cflags += [ "-mdspr2" ] 1303*6777b538SAndroid Build Coastguard Worker } 1304*6777b538SAndroid Build Coastguard Worker 1305*6777b538SAndroid Build Coastguard Worker cflags += [ "-m${mips_float_abi}-float" ] 1306*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "mips" && !is_nacl) { 1307*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--hash-style=sysv" ] 1308*6777b538SAndroid Build Coastguard Worker if (custom_toolchain == "") { 1309*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1310*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=mips-linux-gnu" ] 1311*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=mips-linux-gnu" ] 1312*6777b538SAndroid Build Coastguard Worker } else { 1313*6777b538SAndroid Build Coastguard Worker cflags += [ "-EB" ] 1314*6777b538SAndroid Build Coastguard Worker ldflags += [ "-EB" ] 1315*6777b538SAndroid Build Coastguard Worker } 1316*6777b538SAndroid Build Coastguard Worker } 1317*6777b538SAndroid Build Coastguard Worker 1318*6777b538SAndroid Build Coastguard Worker if (mips_arch_variant == "r6") { 1319*6777b538SAndroid Build Coastguard Worker cflags += [ 1320*6777b538SAndroid Build Coastguard Worker "-mips32r6", 1321*6777b538SAndroid Build Coastguard Worker "-Wa,-mips32r6", 1322*6777b538SAndroid Build Coastguard Worker ] 1323*6777b538SAndroid Build Coastguard Worker if (mips_use_msa == true) { 1324*6777b538SAndroid Build Coastguard Worker cflags += [ 1325*6777b538SAndroid Build Coastguard Worker "-mmsa", 1326*6777b538SAndroid Build Coastguard Worker "-mfp64", 1327*6777b538SAndroid Build Coastguard Worker ] 1328*6777b538SAndroid Build Coastguard Worker } 1329*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "r2") { 1330*6777b538SAndroid Build Coastguard Worker cflags += [ 1331*6777b538SAndroid Build Coastguard Worker "-mips32r2", 1332*6777b538SAndroid Build Coastguard Worker "-Wa,-mips32r2", 1333*6777b538SAndroid Build Coastguard Worker ] 1334*6777b538SAndroid Build Coastguard Worker if (mips_float_abi == "hard" && mips_fpu_mode != "") { 1335*6777b538SAndroid Build Coastguard Worker cflags += [ "-m$mips_fpu_mode" ] 1336*6777b538SAndroid Build Coastguard Worker } 1337*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "r1") { 1338*6777b538SAndroid Build Coastguard Worker cflags += [ 1339*6777b538SAndroid Build Coastguard Worker "-mips32", 1340*6777b538SAndroid Build Coastguard Worker "-Wa,-mips32", 1341*6777b538SAndroid Build Coastguard Worker ] 1342*6777b538SAndroid Build Coastguard Worker } 1343*6777b538SAndroid Build Coastguard Worker 1344*6777b538SAndroid Build Coastguard Worker if (mips_dsp_rev == 1) { 1345*6777b538SAndroid Build Coastguard Worker cflags += [ "-mdsp" ] 1346*6777b538SAndroid Build Coastguard Worker } else if (mips_dsp_rev == 2) { 1347*6777b538SAndroid Build Coastguard Worker cflags += [ "-mdspr2" ] 1348*6777b538SAndroid Build Coastguard Worker } 1349*6777b538SAndroid Build Coastguard Worker 1350*6777b538SAndroid Build Coastguard Worker cflags += [ "-m${mips_float_abi}-float" ] 1351*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "mips64el") { 1352*6777b538SAndroid Build Coastguard Worker cflags += [ "-D__SANE_USERSPACE_TYPES__" ] 1353*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--hash-style=sysv" ] 1354*6777b538SAndroid Build Coastguard Worker if (custom_toolchain == "") { 1355*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1356*6777b538SAndroid Build Coastguard Worker if (is_android) { 1357*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=mips64el-linux-android" ] 1358*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=mips64el-linux-android" ] 1359*6777b538SAndroid Build Coastguard Worker } else { 1360*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=mips64el-linux-gnuabi64" ] 1361*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=mips64el-linux-gnuabi64" ] 1362*6777b538SAndroid Build Coastguard Worker } 1363*6777b538SAndroid Build Coastguard Worker } else { 1364*6777b538SAndroid Build Coastguard Worker cflags += [ 1365*6777b538SAndroid Build Coastguard Worker "-EL", 1366*6777b538SAndroid Build Coastguard Worker "-mabi=64", 1367*6777b538SAndroid Build Coastguard Worker ] 1368*6777b538SAndroid Build Coastguard Worker ldflags += [ 1369*6777b538SAndroid Build Coastguard Worker "-EL", 1370*6777b538SAndroid Build Coastguard Worker "-mabi=64", 1371*6777b538SAndroid Build Coastguard Worker ] 1372*6777b538SAndroid Build Coastguard Worker } 1373*6777b538SAndroid Build Coastguard Worker } 1374*6777b538SAndroid Build Coastguard Worker 1375*6777b538SAndroid Build Coastguard Worker if (mips_arch_variant == "r6") { 1376*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1377*6777b538SAndroid Build Coastguard Worker cflags += [ 1378*6777b538SAndroid Build Coastguard Worker "-march=mips64el", 1379*6777b538SAndroid Build Coastguard Worker "-mcpu=mips64r6", 1380*6777b538SAndroid Build Coastguard Worker ] 1381*6777b538SAndroid Build Coastguard Worker } else { 1382*6777b538SAndroid Build Coastguard Worker cflags += [ 1383*6777b538SAndroid Build Coastguard Worker "-mips64r6", 1384*6777b538SAndroid Build Coastguard Worker "-Wa,-mips64r6", 1385*6777b538SAndroid Build Coastguard Worker ] 1386*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips64r6" ] 1387*6777b538SAndroid Build Coastguard Worker } 1388*6777b538SAndroid Build Coastguard Worker if (mips_use_msa == true) { 1389*6777b538SAndroid Build Coastguard Worker cflags += [ 1390*6777b538SAndroid Build Coastguard Worker "-mmsa", 1391*6777b538SAndroid Build Coastguard Worker "-mfp64", 1392*6777b538SAndroid Build Coastguard Worker ] 1393*6777b538SAndroid Build Coastguard Worker } 1394*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "r2") { 1395*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips64r2" ] 1396*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1397*6777b538SAndroid Build Coastguard Worker cflags += [ 1398*6777b538SAndroid Build Coastguard Worker "-march=mips64el", 1399*6777b538SAndroid Build Coastguard Worker "-mcpu=mips64r2", 1400*6777b538SAndroid Build Coastguard Worker ] 1401*6777b538SAndroid Build Coastguard Worker } else { 1402*6777b538SAndroid Build Coastguard Worker cflags += [ 1403*6777b538SAndroid Build Coastguard Worker "-mips64r2", 1404*6777b538SAndroid Build Coastguard Worker "-Wa,-mips64r2", 1405*6777b538SAndroid Build Coastguard Worker ] 1406*6777b538SAndroid Build Coastguard Worker } 1407*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "loongson3") { 1408*6777b538SAndroid Build Coastguard Worker defines += [ "_MIPS_ARCH_LOONGSON" ] 1409*6777b538SAndroid Build Coastguard Worker cflags += [ 1410*6777b538SAndroid Build Coastguard Worker "-march=loongson3a", 1411*6777b538SAndroid Build Coastguard Worker "-mno-branch-likely", 1412*6777b538SAndroid Build Coastguard Worker "-Wa,-march=loongson3a", 1413*6777b538SAndroid Build Coastguard Worker ] 1414*6777b538SAndroid Build Coastguard Worker } 1415*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "mips64") { 1416*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--hash-style=sysv" ] 1417*6777b538SAndroid Build Coastguard Worker if (custom_toolchain == "") { 1418*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1419*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=mips64-linux-gnuabi64" ] 1420*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=mips64-linux-gnuabi64" ] 1421*6777b538SAndroid Build Coastguard Worker } else { 1422*6777b538SAndroid Build Coastguard Worker cflags += [ 1423*6777b538SAndroid Build Coastguard Worker "-EB", 1424*6777b538SAndroid Build Coastguard Worker "-mabi=64", 1425*6777b538SAndroid Build Coastguard Worker ] 1426*6777b538SAndroid Build Coastguard Worker ldflags += [ 1427*6777b538SAndroid Build Coastguard Worker "-EB", 1428*6777b538SAndroid Build Coastguard Worker "-mabi=64", 1429*6777b538SAndroid Build Coastguard Worker ] 1430*6777b538SAndroid Build Coastguard Worker } 1431*6777b538SAndroid Build Coastguard Worker } 1432*6777b538SAndroid Build Coastguard Worker 1433*6777b538SAndroid Build Coastguard Worker if (mips_arch_variant == "r6") { 1434*6777b538SAndroid Build Coastguard Worker cflags += [ 1435*6777b538SAndroid Build Coastguard Worker "-mips64r6", 1436*6777b538SAndroid Build Coastguard Worker "-Wa,-mips64r6", 1437*6777b538SAndroid Build Coastguard Worker ] 1438*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips64r6" ] 1439*6777b538SAndroid Build Coastguard Worker 1440*6777b538SAndroid Build Coastguard Worker if (mips_use_msa == true) { 1441*6777b538SAndroid Build Coastguard Worker cflags += [ 1442*6777b538SAndroid Build Coastguard Worker "-mmsa", 1443*6777b538SAndroid Build Coastguard Worker "-mfp64", 1444*6777b538SAndroid Build Coastguard Worker ] 1445*6777b538SAndroid Build Coastguard Worker } 1446*6777b538SAndroid Build Coastguard Worker } else if (mips_arch_variant == "r2") { 1447*6777b538SAndroid Build Coastguard Worker cflags += [ 1448*6777b538SAndroid Build Coastguard Worker "-mips64r2", 1449*6777b538SAndroid Build Coastguard Worker "-Wa,-mips64r2", 1450*6777b538SAndroid Build Coastguard Worker ] 1451*6777b538SAndroid Build Coastguard Worker ldflags += [ "-mips64r2" ] 1452*6777b538SAndroid Build Coastguard Worker } 1453*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "ppc64") { 1454*6777b538SAndroid Build Coastguard Worker if (current_os == "aix") { 1455*6777b538SAndroid Build Coastguard Worker cflags += [ "-maix64" ] 1456*6777b538SAndroid Build Coastguard Worker ldflags += [ "-maix64" ] 1457*6777b538SAndroid Build Coastguard Worker } else { 1458*6777b538SAndroid Build Coastguard Worker cflags += [ "-m64" ] 1459*6777b538SAndroid Build Coastguard Worker ldflags += [ "-m64" ] 1460*6777b538SAndroid Build Coastguard Worker } 1461*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "riscv64") { 1462*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_android) { 1463*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=riscv64-linux-gnu" ] 1464*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=riscv64-linux-gnu" ] 1465*6777b538SAndroid Build Coastguard Worker } 1466*6777b538SAndroid Build Coastguard Worker cflags += [ "-mabi=lp64d" ] 1467*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "loong64") { 1468*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1469*6777b538SAndroid Build Coastguard Worker cflags += [ "--target=loongarch64-linux-gnu" ] 1470*6777b538SAndroid Build Coastguard Worker ldflags += [ "--target=loongarch64-linux-gnu" ] 1471*6777b538SAndroid Build Coastguard Worker } 1472*6777b538SAndroid Build Coastguard Worker cflags += [ 1473*6777b538SAndroid Build Coastguard Worker "-mabi=lp64d", 1474*6777b538SAndroid Build Coastguard Worker "-mcmodel=medium", 1475*6777b538SAndroid Build Coastguard Worker ] 1476*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "s390x") { 1477*6777b538SAndroid Build Coastguard Worker cflags += [ "-m64" ] 1478*6777b538SAndroid Build Coastguard Worker ldflags += [ "-m64" ] 1479*6777b538SAndroid Build Coastguard Worker } 1480*6777b538SAndroid Build Coastguard Worker } 1481*6777b538SAndroid Build Coastguard Worker 1482*6777b538SAndroid Build Coastguard Worker asmflags = cflags 1483*6777b538SAndroid Build Coastguard Worker} 1484*6777b538SAndroid Build Coastguard Worker 1485*6777b538SAndroid Build Coastguard Worker# This provides options to tweak code generation that are necessary 1486*6777b538SAndroid Build Coastguard Worker# for particular Chromium code or for working around particular 1487*6777b538SAndroid Build Coastguard Worker# compiler bugs (or the combination of the two). 1488*6777b538SAndroid Build Coastguard Workerconfig("compiler_codegen") { 1489*6777b538SAndroid Build Coastguard Worker configs = [] 1490*6777b538SAndroid Build Coastguard Worker cflags = [] 1491*6777b538SAndroid Build Coastguard Worker ldflags = [] 1492*6777b538SAndroid Build Coastguard Worker 1493*6777b538SAndroid Build Coastguard Worker if (is_nacl) { 1494*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/nacl:compiler_codegen" ] 1495*6777b538SAndroid Build Coastguard Worker } 1496*6777b538SAndroid Build Coastguard Worker 1497*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm64" && !is_win && is_clang) { 1498*6777b538SAndroid Build Coastguard Worker # Disable outlining everywhere on arm64 except Win. For more information see 1499*6777b538SAndroid Build Coastguard Worker # crbug.com/931297 for Android and crbug.com/1410297 for iOS. 1500*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1411363): Enable this on Windows if possible. 1501*6777b538SAndroid Build Coastguard Worker cflags += [ "-mno-outline" ] 1502*6777b538SAndroid Build Coastguard Worker 1503*6777b538SAndroid Build Coastguard Worker # This can be removed once https://bugs.llvm.org/show_bug.cgi?id=40348 1504*6777b538SAndroid Build Coastguard Worker # has been resolved, and -mno-outline is obeyed by the linker during 1505*6777b538SAndroid Build Coastguard Worker # ThinLTO. 1506*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,-mllvm,-enable-machine-outliner=never" ] 1507*6777b538SAndroid Build Coastguard Worker } 1508*6777b538SAndroid Build Coastguard Worker 1509*6777b538SAndroid Build Coastguard Worker asmflags = cflags 1510*6777b538SAndroid Build Coastguard Worker} 1511*6777b538SAndroid Build Coastguard Worker 1512*6777b538SAndroid Build Coastguard Worker# This provides options that make the build deterministic, so that the same 1513*6777b538SAndroid Build Coastguard Worker# revision produces the same output, independent of the name of the build 1514*6777b538SAndroid Build Coastguard Worker# directory and of the computer the build is done on. 1515*6777b538SAndroid Build Coastguard Worker# The relative path from build dir to source dir makes it into the build 1516*6777b538SAndroid Build Coastguard Worker# outputs, so it's recommended that you use a build dir two levels deep 1517*6777b538SAndroid Build Coastguard Worker# (e.g. "out/Release") so that you get the same "../.." path as all the bots 1518*6777b538SAndroid Build Coastguard Worker# in your build outputs. 1519*6777b538SAndroid Build Coastguard Workerconfig("compiler_deterministic") { 1520*6777b538SAndroid Build Coastguard Worker cflags = [] 1521*6777b538SAndroid Build Coastguard Worker ldflags = [] 1522*6777b538SAndroid Build Coastguard Worker swiftflags = [] 1523*6777b538SAndroid Build Coastguard Worker 1524*6777b538SAndroid Build Coastguard Worker # Eliminate build metadata (__DATE__, __TIME__ and __TIMESTAMP__) for 1525*6777b538SAndroid Build Coastguard Worker # deterministic build. See https://crbug.com/314403 1526*6777b538SAndroid Build Coastguard Worker if (!is_official_build) { 1527*6777b538SAndroid Build Coastguard Worker if (is_win && !is_clang) { 1528*6777b538SAndroid Build Coastguard Worker cflags += [ 1529*6777b538SAndroid Build Coastguard Worker "/wd4117", # Trying to define or undefine a predefined macro. 1530*6777b538SAndroid Build Coastguard Worker "/D__DATE__=", 1531*6777b538SAndroid Build Coastguard Worker "/D__TIME__=", 1532*6777b538SAndroid Build Coastguard Worker "/D__TIMESTAMP__=", 1533*6777b538SAndroid Build Coastguard Worker ] 1534*6777b538SAndroid Build Coastguard Worker } else { 1535*6777b538SAndroid Build Coastguard Worker cflags += [ 1536*6777b538SAndroid Build Coastguard Worker "-Wno-builtin-macro-redefined", 1537*6777b538SAndroid Build Coastguard Worker "-D__DATE__=", 1538*6777b538SAndroid Build Coastguard Worker "-D__TIME__=", 1539*6777b538SAndroid Build Coastguard Worker "-D__TIMESTAMP__=", 1540*6777b538SAndroid Build Coastguard Worker ] 1541*6777b538SAndroid Build Coastguard Worker } 1542*6777b538SAndroid Build Coastguard Worker } 1543*6777b538SAndroid Build Coastguard Worker 1544*6777b538SAndroid Build Coastguard Worker # Makes builds independent of absolute file path. 1545*6777b538SAndroid Build Coastguard Worker if (is_clang && strip_absolute_paths_from_debug_symbols) { 1546*6777b538SAndroid Build Coastguard Worker # If debug option is given, clang includes $cwd in debug info by default. 1547*6777b538SAndroid Build Coastguard Worker # For such build, this flag generates reproducible obj files even we use 1548*6777b538SAndroid Build Coastguard Worker # different build directory like "out/feature_a" and "out/feature_b" if 1549*6777b538SAndroid Build Coastguard Worker # we build same files with same compile flag. 1550*6777b538SAndroid Build Coastguard Worker # Other paths are already given in relative, no need to normalize them. 1551*6777b538SAndroid Build Coastguard Worker if (is_nacl) { 1552*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1231236): Use -ffile-compilation-dir= here. 1553*6777b538SAndroid Build Coastguard Worker cflags += [ 1554*6777b538SAndroid Build Coastguard Worker "-Xclang", 1555*6777b538SAndroid Build Coastguard Worker "-fdebug-compilation-dir", 1556*6777b538SAndroid Build Coastguard Worker "-Xclang", 1557*6777b538SAndroid Build Coastguard Worker ".", 1558*6777b538SAndroid Build Coastguard Worker ] 1559*6777b538SAndroid Build Coastguard Worker } else { 1560*6777b538SAndroid Build Coastguard Worker # -ffile-compilation-dir is an alias for both -fdebug-compilation-dir= 1561*6777b538SAndroid Build Coastguard Worker # and -fcoverage-compilation-dir=. 1562*6777b538SAndroid Build Coastguard Worker cflags += [ "-ffile-compilation-dir=." ] 1563*6777b538SAndroid Build Coastguard Worker swiftflags += [ "-file-compilation-dir=." ] 1564*6777b538SAndroid Build Coastguard Worker } 1565*6777b538SAndroid Build Coastguard Worker if (!is_win) { 1566*6777b538SAndroid Build Coastguard Worker # We don't use clang -cc1as on Windows (yet? https://crbug.com/762167) 1567*6777b538SAndroid Build Coastguard Worker asmflags = [ "-Wa,-fdebug-compilation-dir,." ] 1568*6777b538SAndroid Build Coastguard Worker } 1569*6777b538SAndroid Build Coastguard Worker 1570*6777b538SAndroid Build Coastguard Worker if (is_win && use_lld) { 1571*6777b538SAndroid Build Coastguard Worker if (symbol_level == 2 || (is_clang && using_sanitizer)) { 1572*6777b538SAndroid Build Coastguard Worker # Absolutize source file paths for PDB. Pass the real build directory 1573*6777b538SAndroid Build Coastguard Worker # if the pdb contains source-level debug information and if linker 1574*6777b538SAndroid Build Coastguard Worker # reproducibility is not critical. 1575*6777b538SAndroid Build Coastguard Worker ldflags += [ "/PDBSourcePath:" + rebase_path(root_build_dir) ] 1576*6777b538SAndroid Build Coastguard Worker } else { 1577*6777b538SAndroid Build Coastguard Worker # Use a fake fixed base directory for paths in the pdb to make the pdb 1578*6777b538SAndroid Build Coastguard Worker # output fully deterministic and independent of the build directory. 1579*6777b538SAndroid Build Coastguard Worker ldflags += [ "/PDBSourcePath:o:\fake\prefix" ] 1580*6777b538SAndroid Build Coastguard Worker } 1581*6777b538SAndroid Build Coastguard Worker } 1582*6777b538SAndroid Build Coastguard Worker } 1583*6777b538SAndroid Build Coastguard Worker 1584*6777b538SAndroid Build Coastguard Worker # Tells the compiler not to use absolute paths when passing the default 1585*6777b538SAndroid Build Coastguard Worker # paths to the tools it invokes. We don't want this because we don't 1586*6777b538SAndroid Build Coastguard Worker # really need it and it can mess up the RBE cache entries. 1587*6777b538SAndroid Build Coastguard Worker if (is_clang && (!is_nacl || is_nacl_saigo)) { 1588*6777b538SAndroid Build Coastguard Worker cflags += [ "-no-canonical-prefixes" ] 1589*6777b538SAndroid Build Coastguard Worker 1590*6777b538SAndroid Build Coastguard Worker # Same for links: Let the compiler driver invoke the linker 1591*6777b538SAndroid Build Coastguard Worker # with a relative path and pass relative paths to built-in 1592*6777b538SAndroid Build Coastguard Worker # libraries. Not needed on Windows because we call the linker 1593*6777b538SAndroid Build Coastguard Worker # directly there, not through the compiler driver. 1594*6777b538SAndroid Build Coastguard Worker # We don't link on RBE, so this change is just for cleaner 1595*6777b538SAndroid Build Coastguard Worker # internal linker invocations, for people who work on the build. 1596*6777b538SAndroid Build Coastguard Worker if (!is_win) { 1597*6777b538SAndroid Build Coastguard Worker ldflags += [ "-no-canonical-prefixes" ] 1598*6777b538SAndroid Build Coastguard Worker } 1599*6777b538SAndroid Build Coastguard Worker } 1600*6777b538SAndroid Build Coastguard Worker} 1601*6777b538SAndroid Build Coastguard Worker 1602*6777b538SAndroid Build Coastguard Workerconfig("clang_revision") { 1603*6777b538SAndroid Build Coastguard Worker if (is_clang && clang_base_path == default_clang_base_path) { 1604*6777b538SAndroid Build Coastguard Worker update_args = [ 1605*6777b538SAndroid Build Coastguard Worker "--print-revision", 1606*6777b538SAndroid Build Coastguard Worker "--verify-version=$clang_version", 1607*6777b538SAndroid Build Coastguard Worker ] 1608*6777b538SAndroid Build Coastguard Worker if (llvm_force_head_revision) { 1609*6777b538SAndroid Build Coastguard Worker update_args += [ "--llvm-force-head-revision" ] 1610*6777b538SAndroid Build Coastguard Worker } 1611*6777b538SAndroid Build Coastguard Worker clang_revision = exec_script("//tools/clang/scripts/update.py", 1612*6777b538SAndroid Build Coastguard Worker update_args, 1613*6777b538SAndroid Build Coastguard Worker "trim string") 1614*6777b538SAndroid Build Coastguard Worker 1615*6777b538SAndroid Build Coastguard Worker # This is here so that all files get recompiled after a clang roll and 1616*6777b538SAndroid Build Coastguard Worker # when turning clang on or off. (defines are passed via the command line, 1617*6777b538SAndroid Build Coastguard Worker # and build system rebuild things when their commandline changes). Nothing 1618*6777b538SAndroid Build Coastguard Worker # should ever read this define. 1619*6777b538SAndroid Build Coastguard Worker defines = [ "CR_CLANG_REVISION=\"$clang_revision\"" ] 1620*6777b538SAndroid Build Coastguard Worker } 1621*6777b538SAndroid Build Coastguard Worker} 1622*6777b538SAndroid Build Coastguard Worker 1623*6777b538SAndroid Build Coastguard Workerconfig("rustc_revision") { 1624*6777b538SAndroid Build Coastguard Worker if (rustc_revision != "") { 1625*6777b538SAndroid Build Coastguard Worker # Similar to the above config, this is here so that all files get recompiled 1626*6777b538SAndroid Build Coastguard Worker # after a rustc roll. Nothing should ever read this cfg. This will not be 1627*6777b538SAndroid Build Coastguard Worker # set if a custom toolchain is used. 1628*6777b538SAndroid Build Coastguard Worker rustflags = [ 1629*6777b538SAndroid Build Coastguard Worker "--cfg", 1630*6777b538SAndroid Build Coastguard Worker "cr_rustc_revision=\"$rustc_revision\"", 1631*6777b538SAndroid Build Coastguard Worker ] 1632*6777b538SAndroid Build Coastguard Worker } 1633*6777b538SAndroid Build Coastguard Worker} 1634*6777b538SAndroid Build Coastguard Worker 1635*6777b538SAndroid Build Coastguard Workerconfig("compiler_arm_fpu") { 1636*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm" && !is_ios && !is_nacl) { 1637*6777b538SAndroid Build Coastguard Worker cflags = [ "-mfpu=$arm_fpu" ] 1638*6777b538SAndroid Build Coastguard Worker if (!arm_use_thumb) { 1639*6777b538SAndroid Build Coastguard Worker cflags += [ "-marm" ] 1640*6777b538SAndroid Build Coastguard Worker } 1641*6777b538SAndroid Build Coastguard Worker asmflags = cflags 1642*6777b538SAndroid Build Coastguard Worker } 1643*6777b538SAndroid Build Coastguard Worker} 1644*6777b538SAndroid Build Coastguard Worker 1645*6777b538SAndroid Build Coastguard Workerconfig("compiler_arm_thumb") { 1646*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm" && arm_use_thumb && is_posix && 1647*6777b538SAndroid Build Coastguard Worker !(is_apple || is_nacl)) { 1648*6777b538SAndroid Build Coastguard Worker cflags = [ "-mthumb" ] 1649*6777b538SAndroid Build Coastguard Worker } 1650*6777b538SAndroid Build Coastguard Worker} 1651*6777b538SAndroid Build Coastguard Worker 1652*6777b538SAndroid Build Coastguard Workerconfig("compiler_arm") { 1653*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm" && is_chromeos) { 1654*6777b538SAndroid Build Coastguard Worker # arm is normally the default mode for clang, but on chromeos a wrapper 1655*6777b538SAndroid Build Coastguard Worker # is used to pass -mthumb, and therefor change the default. 1656*6777b538SAndroid Build Coastguard Worker cflags = [ "-marm" ] 1657*6777b538SAndroid Build Coastguard Worker } 1658*6777b538SAndroid Build Coastguard Worker} 1659*6777b538SAndroid Build Coastguard Worker 1660*6777b538SAndroid Build Coastguard Worker# runtime_library ------------------------------------------------------------- 1661*6777b538SAndroid Build Coastguard Worker# 1662*6777b538SAndroid Build Coastguard Worker# Sets the runtime library and associated options. 1663*6777b538SAndroid Build Coastguard Worker# 1664*6777b538SAndroid Build Coastguard Worker# How do you determine what should go in here vs. "compiler" above? Consider if 1665*6777b538SAndroid Build Coastguard Worker# a target might choose to use a different runtime library (ignore for a moment 1666*6777b538SAndroid Build Coastguard Worker# if this is possible or reasonable on your system). If such a target would want 1667*6777b538SAndroid Build Coastguard Worker# to change or remove your option, put it in the runtime_library config. If a 1668*6777b538SAndroid Build Coastguard Worker# target wants the option regardless, put it in the compiler config. 1669*6777b538SAndroid Build Coastguard Worker 1670*6777b538SAndroid Build Coastguard Workerconfig("runtime_library") { 1671*6777b538SAndroid Build Coastguard Worker configs = [] 1672*6777b538SAndroid Build Coastguard Worker 1673*6777b538SAndroid Build Coastguard Worker # The order of this config is important: it must appear before 1674*6777b538SAndroid Build Coastguard Worker # android:runtime_library. This is to ensure libc++ appears before 1675*6777b538SAndroid Build Coastguard Worker # libandroid_support in the -isystem include order. Otherwise, there will be 1676*6777b538SAndroid Build Coastguard Worker # build errors related to symbols declared in math.h. 1677*6777b538SAndroid Build Coastguard Worker if (use_custom_libcxx) { 1678*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/c++:runtime_library" ] 1679*6777b538SAndroid Build Coastguard Worker } 1680*6777b538SAndroid Build Coastguard Worker 1681*6777b538SAndroid Build Coastguard Worker # Rust and C++ both provide intrinsics for LLVM to call for math operations. We 1682*6777b538SAndroid Build Coastguard Worker # want to use the C++ intrinsics, not the ones in the Rust compiler_builtins 1683*6777b538SAndroid Build Coastguard Worker # library. The Rust symbols are marked as weak, so that they can be replaced by 1684*6777b538SAndroid Build Coastguard Worker # the C++ symbols. This config ensures the C++ symbols exist and are strong in 1685*6777b538SAndroid Build Coastguard Worker # order to cause that replacement to occur by explicitly linking in clang's 1686*6777b538SAndroid Build Coastguard Worker # compiler-rt library. 1687*6777b538SAndroid Build Coastguard Worker if (is_clang && toolchain_has_rust) { 1688*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/clang:compiler_builtins" ] 1689*6777b538SAndroid Build Coastguard Worker } 1690*6777b538SAndroid Build Coastguard Worker 1691*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/830987): Come up with a better name for is POSIX + Fuchsia 1692*6777b538SAndroid Build Coastguard Worker # configuration. 1693*6777b538SAndroid Build Coastguard Worker if (is_posix || is_fuchsia) { 1694*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/posix:runtime_library" ] 1695*6777b538SAndroid Build Coastguard Worker 1696*6777b538SAndroid Build Coastguard Worker if (use_custom_libunwind) { 1697*6777b538SAndroid Build Coastguard Worker # Instead of using an unwind lib from the toolchain, 1698*6777b538SAndroid Build Coastguard Worker # buildtools/third_party/libunwind will be built and used directly. 1699*6777b538SAndroid Build Coastguard Worker ldflags = [ "--unwindlib=none" ] 1700*6777b538SAndroid Build Coastguard Worker } 1701*6777b538SAndroid Build Coastguard Worker } 1702*6777b538SAndroid Build Coastguard Worker 1703*6777b538SAndroid Build Coastguard Worker # System-specific flags. If your compiler flags apply to one of the 1704*6777b538SAndroid Build Coastguard Worker # categories here, add it to the associated file to keep this shared config 1705*6777b538SAndroid Build Coastguard Worker # smaller. 1706*6777b538SAndroid Build Coastguard Worker if (is_win) { 1707*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/win:runtime_library" ] 1708*6777b538SAndroid Build Coastguard Worker } else if (is_linux || is_chromeos) { 1709*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/linux:runtime_library" ] 1710*6777b538SAndroid Build Coastguard Worker if (is_chromeos) { 1711*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/chromeos:runtime_library" ] 1712*6777b538SAndroid Build Coastguard Worker } 1713*6777b538SAndroid Build Coastguard Worker } else if (is_ios) { 1714*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/ios:runtime_library" ] 1715*6777b538SAndroid Build Coastguard Worker } else if (is_mac) { 1716*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/mac:runtime_library" ] 1717*6777b538SAndroid Build Coastguard Worker } else if (is_android) { 1718*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config/android:runtime_library" ] 1719*6777b538SAndroid Build Coastguard Worker } 1720*6777b538SAndroid Build Coastguard Worker 1721*6777b538SAndroid Build Coastguard Worker if (is_component_build) { 1722*6777b538SAndroid Build Coastguard Worker defines = [ "COMPONENT_BUILD" ] 1723*6777b538SAndroid Build Coastguard Worker } 1724*6777b538SAndroid Build Coastguard Worker} 1725*6777b538SAndroid Build Coastguard Worker 1726*6777b538SAndroid Build Coastguard Worker# treat_warnings_as_errors ---------------------------------------------------- 1727*6777b538SAndroid Build Coastguard Worker# 1728*6777b538SAndroid Build Coastguard Worker# Adding this config causes the compiler to treat warnings as fatal errors. 1729*6777b538SAndroid Build Coastguard Worker# This is used as a subconfig of both chromium_code and no_chromium_code, and 1730*6777b538SAndroid Build Coastguard Worker# is broken out separately so nocompile tests can force-enable this setting 1731*6777b538SAndroid Build Coastguard Worker# independently of the default warning flags. 1732*6777b538SAndroid Build Coastguard Workerconfig("treat_warnings_as_errors") { 1733*6777b538SAndroid Build Coastguard Worker if (is_win) { 1734*6777b538SAndroid Build Coastguard Worker cflags = [ "/WX" ] 1735*6777b538SAndroid Build Coastguard Worker } else { 1736*6777b538SAndroid Build Coastguard Worker cflags = [ "-Werror" ] 1737*6777b538SAndroid Build Coastguard Worker 1738*6777b538SAndroid Build Coastguard Worker # The compiler driver can sometimes (rarely) emit warnings before calling 1739*6777b538SAndroid Build Coastguard Worker # the actual linker. Make sure these warnings are treated as errors as 1740*6777b538SAndroid Build Coastguard Worker # well. 1741*6777b538SAndroid Build Coastguard Worker ldflags = [ "-Werror" ] 1742*6777b538SAndroid Build Coastguard Worker } 1743*6777b538SAndroid Build Coastguard Worker 1744*6777b538SAndroid Build Coastguard Worker # Turn rustc warnings into the "deny" lint level, which produce compiler 1745*6777b538SAndroid Build Coastguard Worker # errors. The equivalent of -Werror for clang/gcc. 1746*6777b538SAndroid Build Coastguard Worker # 1747*6777b538SAndroid Build Coastguard Worker # Note we apply the actual lint flags in config("compiler"). All warnings 1748*6777b538SAndroid Build Coastguard Worker # are suppressed in third-party crates. 1749*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Dwarnings" ] 1750*6777b538SAndroid Build Coastguard Worker 1751*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/326247202): Fix unused imports and remove this flag. 1752*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Aunused-imports" ] 1753*6777b538SAndroid Build Coastguard Worker} 1754*6777b538SAndroid Build Coastguard Worker 1755*6777b538SAndroid Build Coastguard Worker# default_warnings ------------------------------------------------------------ 1756*6777b538SAndroid Build Coastguard Worker# 1757*6777b538SAndroid Build Coastguard Worker# Collects all warning flags that are used by default. This is used as a 1758*6777b538SAndroid Build Coastguard Worker# subconfig of both chromium_code and no_chromium_code. This way these 1759*6777b538SAndroid Build Coastguard Worker# flags are guaranteed to appear on the compile command line after -Wall. 1760*6777b538SAndroid Build Coastguard Workerconfig("default_warnings") { 1761*6777b538SAndroid Build Coastguard Worker cflags = [] 1762*6777b538SAndroid Build Coastguard Worker cflags_c = [] 1763*6777b538SAndroid Build Coastguard Worker cflags_cc = [] 1764*6777b538SAndroid Build Coastguard Worker ldflags = [] 1765*6777b538SAndroid Build Coastguard Worker configs = [] 1766*6777b538SAndroid Build Coastguard Worker 1767*6777b538SAndroid Build Coastguard Worker if (is_win) { 1768*6777b538SAndroid Build Coastguard Worker if (fatal_linker_warnings) { 1769*6777b538SAndroid Build Coastguard Worker arflags = [ "/WX" ] 1770*6777b538SAndroid Build Coastguard Worker ldflags = [ "/WX" ] 1771*6777b538SAndroid Build Coastguard Worker } 1772*6777b538SAndroid Build Coastguard Worker defines = [ 1773*6777b538SAndroid Build Coastguard Worker # Without this, Windows headers warn that functions like wcsnicmp 1774*6777b538SAndroid Build Coastguard Worker # should be spelled _wcsnicmp. But all other platforms keep spelling 1775*6777b538SAndroid Build Coastguard Worker # it wcsnicmp, making this warning unhelpful. We don't want it. 1776*6777b538SAndroid Build Coastguard Worker "_CRT_NONSTDC_NO_WARNINGS", 1777*6777b538SAndroid Build Coastguard Worker 1778*6777b538SAndroid Build Coastguard Worker # TODO(thakis): winsock wants us to use getaddrinfo instead of 1779*6777b538SAndroid Build Coastguard Worker # gethostbyname. Fires mostly in non-Chromium code. We probably 1780*6777b538SAndroid Build Coastguard Worker # want to remove this define eventually. 1781*6777b538SAndroid Build Coastguard Worker "_WINSOCK_DEPRECATED_NO_WARNINGS", 1782*6777b538SAndroid Build Coastguard Worker ] 1783*6777b538SAndroid Build Coastguard Worker if (!is_clang) { 1784*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Remove this once 1785*6777b538SAndroid Build Coastguard Worker # https://swiftshader-review.googlesource.com/c/SwiftShader/+/57968 has 1786*6777b538SAndroid Build Coastguard Worker # rolled into angle. 1787*6777b538SAndroid Build Coastguard Worker cflags += [ "/wd4244" ] 1788*6777b538SAndroid Build Coastguard Worker } 1789*6777b538SAndroid Build Coastguard Worker } else { 1790*6777b538SAndroid Build Coastguard Worker if ((is_apple || is_android) && !is_nacl) { 1791*6777b538SAndroid Build Coastguard Worker # Warns if a method is used whose availability is newer than the 1792*6777b538SAndroid Build Coastguard Worker # deployment target. 1793*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wunguarded-availability" ] 1794*6777b538SAndroid Build Coastguard Worker } 1795*6777b538SAndroid Build Coastguard Worker 1796*6777b538SAndroid Build Coastguard Worker if (is_ios) { 1797*6777b538SAndroid Build Coastguard Worker # When compiling Objective-C, warns if a selector named via @selector has 1798*6777b538SAndroid Build Coastguard Worker # not been defined in any visible interface. 1799*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wundeclared-selector" ] 1800*6777b538SAndroid Build Coastguard Worker 1801*6777b538SAndroid Build Coastguard Worker # Blink builds use a higher deployment target than non-Blink builds, so 1802*6777b538SAndroid Build Coastguard Worker # suppress deprecation warnings in these builds. 1803*6777b538SAndroid Build Coastguard Worker if (use_blink) { 1804*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-deprecated-declarations" ] 1805*6777b538SAndroid Build Coastguard Worker } 1806*6777b538SAndroid Build Coastguard Worker } 1807*6777b538SAndroid Build Coastguard Worker 1808*6777b538SAndroid Build Coastguard Worker # Suppress warnings about ABI changes on ARM (Clang doesn't give this 1809*6777b538SAndroid Build Coastguard Worker # warning). 1810*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm" && !is_clang) { 1811*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-psabi" ] 1812*6777b538SAndroid Build Coastguard Worker } 1813*6777b538SAndroid Build Coastguard Worker 1814*6777b538SAndroid Build Coastguard Worker if (!is_clang) { 1815*6777b538SAndroid Build Coastguard Worker cflags_cc += [ 1816*6777b538SAndroid Build Coastguard Worker # See comment for -Wno-c++11-narrowing. 1817*6777b538SAndroid Build Coastguard Worker "-Wno-narrowing", 1818*6777b538SAndroid Build Coastguard Worker ] 1819*6777b538SAndroid Build Coastguard Worker 1820*6777b538SAndroid Build Coastguard Worker # -Wno-class-memaccess warns about hash table and vector in blink. 1821*6777b538SAndroid Build Coastguard Worker # But the violation is intentional. 1822*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 1823*6777b538SAndroid Build Coastguard Worker cflags_cc += [ "-Wno-class-memaccess" ] 1824*6777b538SAndroid Build Coastguard Worker } 1825*6777b538SAndroid Build Coastguard Worker 1826*6777b538SAndroid Build Coastguard Worker # -Wunused-local-typedefs is broken in gcc, 1827*6777b538SAndroid Build Coastguard Worker # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63872 1828*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-unused-local-typedefs" ] 1829*6777b538SAndroid Build Coastguard Worker 1830*6777b538SAndroid Build Coastguard Worker # Don't warn about "maybe" uninitialized. Clang doesn't include this 1831*6777b538SAndroid Build Coastguard Worker # in -Wall but gcc does, and it gives false positives. 1832*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-maybe-uninitialized" ] 1833*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-deprecated-declarations" ] 1834*6777b538SAndroid Build Coastguard Worker 1835*6777b538SAndroid Build Coastguard Worker # -Wcomment gives too many false positives in the case a 1836*6777b538SAndroid Build Coastguard Worker # backslash ended comment line is followed by a new line of 1837*6777b538SAndroid Build Coastguard Worker # comments 1838*6777b538SAndroid Build Coastguard Worker # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61638 1839*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-comments" ] 1840*6777b538SAndroid Build Coastguard Worker 1841*6777b538SAndroid Build Coastguard Worker # -Wpacked-not-aligned complains all generated mojom-shared-internal.h 1842*6777b538SAndroid Build Coastguard Worker # files. 1843*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-packed-not-aligned" ] 1844*6777b538SAndroid Build Coastguard Worker } 1845*6777b538SAndroid Build Coastguard Worker } 1846*6777b538SAndroid Build Coastguard Worker 1847*6777b538SAndroid Build Coastguard Worker # Common Clang and GCC warning setup. 1848*6777b538SAndroid Build Coastguard Worker if (!is_win || is_clang) { 1849*6777b538SAndroid Build Coastguard Worker cflags += [ 1850*6777b538SAndroid Build Coastguard Worker # Disables. 1851*6777b538SAndroid Build Coastguard Worker "-Wno-missing-field-initializers", # "struct foo f = {0};" 1852*6777b538SAndroid Build Coastguard Worker "-Wno-unused-parameter", # Unused function parameters. 1853*6777b538SAndroid Build Coastguard Worker ] 1854*6777b538SAndroid Build Coastguard Worker 1855*6777b538SAndroid Build Coastguard Worker if (!is_nacl || is_nacl_saigo) { 1856*6777b538SAndroid Build Coastguard Worker cflags += [ 1857*6777b538SAndroid Build Coastguard Worker # An ABI compat warning we don't care about, https://crbug.com/1102157 1858*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Push this to the (few) targets that need it, 1859*6777b538SAndroid Build Coastguard Worker # instead of having a global flag. 1860*6777b538SAndroid Build Coastguard Worker "-Wno-psabi", 1861*6777b538SAndroid Build Coastguard Worker ] 1862*6777b538SAndroid Build Coastguard Worker } 1863*6777b538SAndroid Build Coastguard Worker } 1864*6777b538SAndroid Build Coastguard Worker 1865*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1866*6777b538SAndroid Build Coastguard Worker cflags += [ 1867*6777b538SAndroid Build Coastguard Worker "-Wloop-analysis", 1868*6777b538SAndroid Build Coastguard Worker 1869*6777b538SAndroid Build Coastguard Worker # TODO(thakis): This used to be implied by -Wno-unused-function, 1870*6777b538SAndroid Build Coastguard Worker # which we no longer use. Check if it makes sense to remove 1871*6777b538SAndroid Build Coastguard Worker # this as well. http://crbug.com/316352 1872*6777b538SAndroid Build Coastguard Worker "-Wno-unneeded-internal-declaration", 1873*6777b538SAndroid Build Coastguard Worker ] 1874*6777b538SAndroid Build Coastguard Worker 1875*6777b538SAndroid Build Coastguard Worker if (!is_nacl || is_nacl_saigo) { 1876*6777b538SAndroid Build Coastguard Worker if (is_win) { 1877*6777b538SAndroid Build Coastguard Worker # TODO(thakis): https://crbug.com/617318 1878*6777b538SAndroid Build Coastguard Worker # Currently RBE can not handle case sensitiveness for windows well. 1879*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-nonportable-include-path" ] 1880*6777b538SAndroid Build Coastguard Worker } 1881*6777b538SAndroid Build Coastguard Worker 1882*6777b538SAndroid Build Coastguard Worker if (is_fuchsia) { 1883*6777b538SAndroid Build Coastguard Worker cflags_cc += [ 1884*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1474434): fix and reenable 1885*6777b538SAndroid Build Coastguard Worker "-Wno-missing-field-initializers", 1886*6777b538SAndroid Build Coastguard Worker 1887*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/324953188): fix and reenable 1888*6777b538SAndroid Build Coastguard Worker "-Wno-extra-qualification", 1889*6777b538SAndroid Build Coastguard Worker 1890*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/332931387): fix and reenable 1891*6777b538SAndroid Build Coastguard Worker "-Wno-unused-but-set-variable", 1892*6777b538SAndroid Build Coastguard Worker ] 1893*6777b538SAndroid Build Coastguard Worker } 1894*6777b538SAndroid Build Coastguard Worker 1895*6777b538SAndroid Build Coastguard Worker cflags += [ 1896*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/330524456): -Wcast-function-type is under -Wextra now. 1897*6777b538SAndroid Build Coastguard Worker "-Wno-cast-function-type", 1898*6777b538SAndroid Build Coastguard Worker 1899*6777b538SAndroid Build Coastguard Worker # Ignore warnings about MSVC optimization pragmas. 1900*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Only for no_chromium_code? http://crbug.com/912662 1901*6777b538SAndroid Build Coastguard Worker "-Wno-ignored-pragma-optimize", 1902*6777b538SAndroid Build Coastguard Worker 1903*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1343975) Evaluate and possibly enable. 1904*6777b538SAndroid Build Coastguard Worker "-Wno-deprecated-builtins", 1905*6777b538SAndroid Build Coastguard Worker 1906*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1352183) Evaluate and possibly enable. 1907*6777b538SAndroid Build Coastguard Worker "-Wno-bitfield-constant-conversion", 1908*6777b538SAndroid Build Coastguard Worker 1909*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1412713) Evaluate and possibly enable. 1910*6777b538SAndroid Build Coastguard Worker "-Wno-deprecated-this-capture", 1911*6777b538SAndroid Build Coastguard Worker 1912*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1491833): Fix and re-enable. 1913*6777b538SAndroid Build Coastguard Worker "-Wno-invalid-offsetof", 1914*6777b538SAndroid Build Coastguard Worker 1915*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1494809): Evaluate and possibly enable. 1916*6777b538SAndroid Build Coastguard Worker "-Wno-vla-extension", 1917*6777b538SAndroid Build Coastguard Worker 1918*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1490607): Fix and re-enable. 1919*6777b538SAndroid Build Coastguard Worker "-Wno-thread-safety-reference-return", 1920*6777b538SAndroid Build Coastguard Worker ] 1921*6777b538SAndroid Build Coastguard Worker 1922*6777b538SAndroid Build Coastguard Worker cflags_cc += [ 1923*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/328490295): Fix and re-enable for C flags. 1924*6777b538SAndroid Build Coastguard Worker "-Wenum-compare-conditional", 1925*6777b538SAndroid Build Coastguard Worker ] 1926*6777b538SAndroid Build Coastguard Worker 1927*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 1928*6777b538SAndroid Build Coastguard Worker cflags_cc += [ 1929*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1513724): Fix and re-enable. 1930*6777b538SAndroid Build Coastguard Worker "-Wno-c++11-narrowing-const-reference", 1931*6777b538SAndroid Build Coastguard Worker ] 1932*6777b538SAndroid Build Coastguard Worker } 1933*6777b538SAndroid Build Coastguard Worker } 1934*6777b538SAndroid Build Coastguard Worker 1935*6777b538SAndroid Build Coastguard Worker # Some builders, such as Cronet, use a different version of Clang than 1936*6777b538SAndroid Build Coastguard Worker # Chromium. This can cause minor errors when compiling Chromium changes. We 1937*6777b538SAndroid Build Coastguard Worker # want to avoid these errors. 1938*6777b538SAndroid Build Coastguard Worker if (llvm_android_mainline) { 1939*6777b538SAndroid Build Coastguard Worker cflags += [ 1940*6777b538SAndroid Build Coastguard Worker "-Wno-error=unknown-warning-option", 1941*6777b538SAndroid Build Coastguard Worker "-Wno-error=unused-command-line-argument", 1942*6777b538SAndroid Build Coastguard Worker "-Wno-error=unknown-pragmas", 1943*6777b538SAndroid Build Coastguard Worker ] 1944*6777b538SAndroid Build Coastguard Worker } 1945*6777b538SAndroid Build Coastguard Worker } 1946*6777b538SAndroid Build Coastguard Worker 1947*6777b538SAndroid Build Coastguard Worker # Rust warnings 1948*6777b538SAndroid Build Coastguard Worker 1949*6777b538SAndroid Build Coastguard Worker # Require `unsafe` blocks even in `unsafe` fns. This is intended to become 1950*6777b538SAndroid Build Coastguard Worker # an error by default eventually; see 1951*6777b538SAndroid Build Coastguard Worker # https://github.com/rust-lang/rust/issues/71668 1952*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Dunsafe_op_in_unsafe_fn" ] 1953*6777b538SAndroid Build Coastguard Worker} 1954*6777b538SAndroid Build Coastguard Worker 1955*6777b538SAndroid Build Coastguard Worker# prevent_unsafe_narrowing ---------------------------------------------------- 1956*6777b538SAndroid Build Coastguard Worker# 1957*6777b538SAndroid Build Coastguard Worker# Warnings that prevent narrowing or comparisons of integer types that are 1958*6777b538SAndroid Build Coastguard Worker# likely to cause out-of-bound read/writes or Undefined Behaviour. In 1959*6777b538SAndroid Build Coastguard Worker# particular, size_t is used for memory sizes, allocation, indexing, and 1960*6777b538SAndroid Build Coastguard Worker# offsets. Using other integer types along with size_t produces risk of 1961*6777b538SAndroid Build Coastguard Worker# memory-safety bugs and thus security exploits. 1962*6777b538SAndroid Build Coastguard Worker# 1963*6777b538SAndroid Build Coastguard Worker# In order to prevent these bugs, allocation sizes were historically limited to 1964*6777b538SAndroid Build Coastguard Worker# sizes that can be represented within 31 bits of information, allowing `int` to 1965*6777b538SAndroid Build Coastguard Worker# be safely misused instead of `size_t` (https://crbug.com/169327). In order to 1966*6777b538SAndroid Build Coastguard Worker# support increasing the allocation limit we require strictly adherence to 1967*6777b538SAndroid Build Coastguard Worker# using the correct types, avoiding lossy conversions, and preventing overflow. 1968*6777b538SAndroid Build Coastguard Worker# To do so, enable this config and fix errors by converting types to be 1969*6777b538SAndroid Build Coastguard Worker# `size_t`, which is both large enough and unsigned, when dealing with memory 1970*6777b538SAndroid Build Coastguard Worker# sizes, allocations, indices, or offsets.In cases where type conversion is not 1971*6777b538SAndroid Build Coastguard Worker# possible or is superfluous, use base::strict_cast<> or base::checked_cast<> 1972*6777b538SAndroid Build Coastguard Worker# to convert to size_t as needed. 1973*6777b538SAndroid Build Coastguard Worker# See also: https://docs.google.com/document/d/1CTbQ-5cQjnjU8aCOtLiA7G6P0i5C6HpSDNlSNq6nl5E 1974*6777b538SAndroid Build Coastguard Worker# 1975*6777b538SAndroid Build Coastguard Worker# To enable in a GN target, use: 1976*6777b538SAndroid Build Coastguard Worker# configs += [ "//build/config/compiler:prevent_unsafe_narrowing" ] 1977*6777b538SAndroid Build Coastguard Worker 1978*6777b538SAndroid Build Coastguard Workerconfig("prevent_unsafe_narrowing") { 1979*6777b538SAndroid Build Coastguard Worker if (is_clang) { 1980*6777b538SAndroid Build Coastguard Worker cflags = [ 1981*6777b538SAndroid Build Coastguard Worker "-Wshorten-64-to-32", 1982*6777b538SAndroid Build Coastguard Worker "-Wimplicit-int-conversion", 1983*6777b538SAndroid Build Coastguard Worker "-Wsign-compare", 1984*6777b538SAndroid Build Coastguard Worker "-Wsign-conversion", 1985*6777b538SAndroid Build Coastguard Worker ] 1986*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 1987*6777b538SAndroid Build Coastguard Worker cflags += [ 1988*6777b538SAndroid Build Coastguard Worker # Avoid bugs of the form `if (size_t i = size; i >= 0; --i)` while 1989*6777b538SAndroid Build Coastguard Worker # fixing types to be sign-correct. 1990*6777b538SAndroid Build Coastguard Worker "-Wtautological-unsigned-zero-compare", 1991*6777b538SAndroid Build Coastguard Worker ] 1992*6777b538SAndroid Build Coastguard Worker } 1993*6777b538SAndroid Build Coastguard Worker } 1994*6777b538SAndroid Build Coastguard Worker} 1995*6777b538SAndroid Build Coastguard Worker 1996*6777b538SAndroid Build Coastguard Worker# chromium_code --------------------------------------------------------------- 1997*6777b538SAndroid Build Coastguard Worker# 1998*6777b538SAndroid Build Coastguard Worker# Toggles between higher and lower warnings for code that is (or isn't) 1999*6777b538SAndroid Build Coastguard Worker# part of Chromium. 2000*6777b538SAndroid Build Coastguard Worker 2001*6777b538SAndroid Build Coastguard Workerconfig("chromium_code") { 2002*6777b538SAndroid Build Coastguard Worker if (is_win) { 2003*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2004*6777b538SAndroid Build Coastguard Worker cflags = [ "/W4" ] # Warning level 4. 2005*6777b538SAndroid Build Coastguard Worker 2006*6777b538SAndroid Build Coastguard Worker # Opt in to additional [[nodiscard]] on standard library methods. 2007*6777b538SAndroid Build Coastguard Worker defines = [ "_HAS_NODISCARD" ] 2008*6777b538SAndroid Build Coastguard Worker } 2009*6777b538SAndroid Build Coastguard Worker } else { 2010*6777b538SAndroid Build Coastguard Worker cflags = [ "-Wall" ] 2011*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2012*6777b538SAndroid Build Coastguard Worker # Enable extra warnings for chromium_code when we control the compiler. 2013*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wextra" ] 2014*6777b538SAndroid Build Coastguard Worker } 2015*6777b538SAndroid Build Coastguard Worker 2016*6777b538SAndroid Build Coastguard Worker # In Chromium code, we define __STDC_foo_MACROS in order to get the 2017*6777b538SAndroid Build Coastguard Worker # C99 macros on Mac and Linux. 2018*6777b538SAndroid Build Coastguard Worker defines = [ 2019*6777b538SAndroid Build Coastguard Worker "__STDC_CONSTANT_MACROS", 2020*6777b538SAndroid Build Coastguard Worker "__STDC_FORMAT_MACROS", 2021*6777b538SAndroid Build Coastguard Worker ] 2022*6777b538SAndroid Build Coastguard Worker 2023*6777b538SAndroid Build Coastguard Worker if (!is_debug && !using_sanitizer && current_cpu != "s390x" && 2024*6777b538SAndroid Build Coastguard Worker current_cpu != "s390" && current_cpu != "ppc64" && 2025*6777b538SAndroid Build Coastguard Worker current_cpu != "mips" && current_cpu != "mips64" && 2026*6777b538SAndroid Build Coastguard Worker current_cpu != "riscv64" && current_cpu != "loong64") { 2027*6777b538SAndroid Build Coastguard Worker # Non-chromium code is not guaranteed to compile cleanly with 2028*6777b538SAndroid Build Coastguard Worker # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are 2029*6777b538SAndroid Build Coastguard Worker # disabled, so only do that for Release build. 2030*6777b538SAndroid Build Coastguard Worker fortify_level = "2" 2031*6777b538SAndroid Build Coastguard Worker 2032*6777b538SAndroid Build Coastguard Worker # ChromeOS's toolchain supports a high-quality _FORTIFY_SOURCE=3 2033*6777b538SAndroid Build Coastguard Worker # implementation with a few custom glibc patches. Use that if it's 2034*6777b538SAndroid Build Coastguard Worker # available. 2035*6777b538SAndroid Build Coastguard Worker if (is_chromeos_device && !lacros_use_chromium_toolchain) { 2036*6777b538SAndroid Build Coastguard Worker fortify_level = "3" 2037*6777b538SAndroid Build Coastguard Worker } 2038*6777b538SAndroid Build Coastguard Worker defines += [ "_FORTIFY_SOURCE=" + fortify_level ] 2039*6777b538SAndroid Build Coastguard Worker } 2040*6777b538SAndroid Build Coastguard Worker 2041*6777b538SAndroid Build Coastguard Worker if (is_apple) { 2042*6777b538SAndroid Build Coastguard Worker cflags_objc = [ "-Wimplicit-retain-self" ] 2043*6777b538SAndroid Build Coastguard Worker cflags_objcc = [ "-Wimplicit-retain-self" ] 2044*6777b538SAndroid Build Coastguard Worker } 2045*6777b538SAndroid Build Coastguard Worker 2046*6777b538SAndroid Build Coastguard Worker if (is_mac) { 2047*6777b538SAndroid Build Coastguard Worker cflags_objc += [ "-Wobjc-missing-property-synthesis" ] 2048*6777b538SAndroid Build Coastguard Worker cflags_objcc += [ "-Wobjc-missing-property-synthesis" ] 2049*6777b538SAndroid Build Coastguard Worker } 2050*6777b538SAndroid Build Coastguard Worker } 2051*6777b538SAndroid Build Coastguard Worker 2052*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2053*6777b538SAndroid Build Coastguard Worker cflags += [ 2054*6777b538SAndroid Build Coastguard Worker # Warn on missing break statements at the end of switch cases. 2055*6777b538SAndroid Build Coastguard Worker # For intentional fallthrough, use [[fallthrough]]. 2056*6777b538SAndroid Build Coastguard Worker "-Wimplicit-fallthrough", 2057*6777b538SAndroid Build Coastguard Worker 2058*6777b538SAndroid Build Coastguard Worker # Warn on unnecessary extra semicolons outside of function definitions. 2059*6777b538SAndroid Build Coastguard Worker "-Wextra-semi", 2060*6777b538SAndroid Build Coastguard Worker 2061*6777b538SAndroid Build Coastguard Worker # Warn on unreachable code, including unreachable breaks and returns. 2062*6777b538SAndroid Build Coastguard Worker # See https://crbug.com/346399#c148 for suppression strategies. 2063*6777b538SAndroid Build Coastguard Worker "-Wunreachable-code-aggressive", 2064*6777b538SAndroid Build Coastguard Worker ] 2065*6777b538SAndroid Build Coastguard Worker 2066*6777b538SAndroid Build Coastguard Worker # Thread safety analysis is broken under nacl: https://crbug.com/982423. 2067*6777b538SAndroid Build Coastguard Worker if (!is_nacl || is_nacl_saigo) { 2068*6777b538SAndroid Build Coastguard Worker cflags += [ 2069*6777b538SAndroid Build Coastguard Worker # Thread safety analysis. See base/thread_annotations.h and 2070*6777b538SAndroid Build Coastguard Worker # https://clang.llvm.org/docs/ThreadSafetyAnalysis.html 2071*6777b538SAndroid Build Coastguard Worker "-Wthread-safety", 2072*6777b538SAndroid Build Coastguard Worker ] 2073*6777b538SAndroid Build Coastguard Worker } 2074*6777b538SAndroid Build Coastguard Worker } 2075*6777b538SAndroid Build Coastguard Worker 2076*6777b538SAndroid Build Coastguard Worker configs = [ 2077*6777b538SAndroid Build Coastguard Worker ":default_warnings", 2078*6777b538SAndroid Build Coastguard Worker ":noshadowing", 2079*6777b538SAndroid Build Coastguard Worker ] 2080*6777b538SAndroid Build Coastguard Worker if (treat_warnings_as_errors) { 2081*6777b538SAndroid Build Coastguard Worker configs += [ ":treat_warnings_as_errors" ] 2082*6777b538SAndroid Build Coastguard Worker } 2083*6777b538SAndroid Build Coastguard Worker} 2084*6777b538SAndroid Build Coastguard Worker 2085*6777b538SAndroid Build Coastguard Workerconfig("no_chromium_code") { 2086*6777b538SAndroid Build Coastguard Worker cflags = [] 2087*6777b538SAndroid Build Coastguard Worker cflags_cc = [] 2088*6777b538SAndroid Build Coastguard Worker defines = [] 2089*6777b538SAndroid Build Coastguard Worker 2090*6777b538SAndroid Build Coastguard Worker if (is_win) { 2091*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2092*6777b538SAndroid Build Coastguard Worker cflags += [ "/W3" ] # Warning level 3. 2093*6777b538SAndroid Build Coastguard Worker } 2094*6777b538SAndroid Build Coastguard Worker cflags += [ 2095*6777b538SAndroid Build Coastguard Worker "/wd4800", # Disable warning when forcing value to bool. 2096*6777b538SAndroid Build Coastguard Worker "/wd4267", # TODO(jschuh): size_t to int. 2097*6777b538SAndroid Build Coastguard Worker ] 2098*6777b538SAndroid Build Coastguard Worker } else { 2099*6777b538SAndroid Build Coastguard Worker if (is_clang && !is_nacl) { 2100*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Remove !is_nacl once 2101*6777b538SAndroid Build Coastguard Worker # https://codereview.webrtc.org/1552863002/ made its way into chromium. 2102*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wall" ] 2103*6777b538SAndroid Build Coastguard Worker } 2104*6777b538SAndroid Build Coastguard Worker } 2105*6777b538SAndroid Build Coastguard Worker 2106*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2107*6777b538SAndroid Build Coastguard Worker cflags += [ 2108*6777b538SAndroid Build Coastguard Worker # Lots of third-party libraries have unused variables. Instead of 2109*6777b538SAndroid Build Coastguard Worker # suppressing them individually, we just blanket suppress them here. 2110*6777b538SAndroid Build Coastguard Worker "-Wno-unused-variable", 2111*6777b538SAndroid Build Coastguard Worker 2112*6777b538SAndroid Build Coastguard Worker # Similarly, we're not going to fix all the C++11 narrowing issues in 2113*6777b538SAndroid Build Coastguard Worker # third-party libraries. 2114*6777b538SAndroid Build Coastguard Worker "-Wno-c++11-narrowing", 2115*6777b538SAndroid Build Coastguard Worker ] 2116*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 2117*6777b538SAndroid Build Coastguard Worker cflags += [ 2118*6777b538SAndroid Build Coastguard Worker # Disabled for similar reasons as -Wunused-variable. 2119*6777b538SAndroid Build Coastguard Worker "-Wno-unused-but-set-variable", 2120*6777b538SAndroid Build Coastguard Worker 2121*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1202159): Clean up and enable. 2122*6777b538SAndroid Build Coastguard Worker "-Wno-misleading-indentation", 2123*6777b538SAndroid Build Coastguard Worker ] 2124*6777b538SAndroid Build Coastguard Worker } 2125*6777b538SAndroid Build Coastguard Worker } 2126*6777b538SAndroid Build Coastguard Worker 2127*6777b538SAndroid Build Coastguard Worker # Suppress all warnings in third party, as Cargo does: 2128*6777b538SAndroid Build Coastguard Worker # https://doc.rust-lang.org/rustc/lints/levels.html#capping-lints 2129*6777b538SAndroid Build Coastguard Worker rustflags = [ "--cap-lints=allow" ] 2130*6777b538SAndroid Build Coastguard Worker 2131*6777b538SAndroid Build Coastguard Worker configs = [ ":default_warnings" ] 2132*6777b538SAndroid Build Coastguard Worker 2133*6777b538SAndroid Build Coastguard Worker # GCC may emit unsuppressible warnings so only apply this config when 2134*6777b538SAndroid Build Coastguard Worker # building with clang. crbug.com/589724 2135*6777b538SAndroid Build Coastguard Worker if (treat_warnings_as_errors && is_clang) { 2136*6777b538SAndroid Build Coastguard Worker configs += [ ":treat_warnings_as_errors" ] 2137*6777b538SAndroid Build Coastguard Worker } 2138*6777b538SAndroid Build Coastguard Worker} 2139*6777b538SAndroid Build Coastguard Worker 2140*6777b538SAndroid Build Coastguard Worker# noshadowing ----------------------------------------------------------------- 2141*6777b538SAndroid Build Coastguard Worker# 2142*6777b538SAndroid Build Coastguard Worker# Allows turning -Wshadow on. 2143*6777b538SAndroid Build Coastguard Worker 2144*6777b538SAndroid Build Coastguard Workerconfig("noshadowing") { 2145*6777b538SAndroid Build Coastguard Worker # This flag has to be disabled for nacl because the nacl compiler is too 2146*6777b538SAndroid Build Coastguard Worker # strict about shadowing. 2147*6777b538SAndroid Build Coastguard Worker if (is_clang && (!is_nacl || is_nacl_saigo)) { 2148*6777b538SAndroid Build Coastguard Worker cflags = [ "-Wshadow" ] 2149*6777b538SAndroid Build Coastguard Worker } 2150*6777b538SAndroid Build Coastguard Worker} 2151*6777b538SAndroid Build Coastguard Worker 2152*6777b538SAndroid Build Coastguard Worker# rtti ------------------------------------------------------------------------ 2153*6777b538SAndroid Build Coastguard Worker# 2154*6777b538SAndroid Build Coastguard Worker# Allows turning Run-Time Type Identification on or off. 2155*6777b538SAndroid Build Coastguard Worker 2156*6777b538SAndroid Build Coastguard Workerconfig("rtti") { 2157*6777b538SAndroid Build Coastguard Worker if (is_win) { 2158*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "/GR" ] 2159*6777b538SAndroid Build Coastguard Worker } else { 2160*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "-frtti" ] 2161*6777b538SAndroid Build Coastguard Worker } 2162*6777b538SAndroid Build Coastguard Worker} 2163*6777b538SAndroid Build Coastguard Worker 2164*6777b538SAndroid Build Coastguard Workerconfig("no_rtti") { 2165*6777b538SAndroid Build Coastguard Worker # Some sanitizer configs may require RTTI to be left enabled globally 2166*6777b538SAndroid Build Coastguard Worker if (!use_rtti) { 2167*6777b538SAndroid Build Coastguard Worker if (is_win) { 2168*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "/GR-" ] 2169*6777b538SAndroid Build Coastguard Worker } else { 2170*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "-fno-rtti" ] 2171*6777b538SAndroid Build Coastguard Worker cflags_objcc = cflags_cc 2172*6777b538SAndroid Build Coastguard Worker } 2173*6777b538SAndroid Build Coastguard Worker } 2174*6777b538SAndroid Build Coastguard Worker} 2175*6777b538SAndroid Build Coastguard Worker 2176*6777b538SAndroid Build Coastguard Worker# export_dynamic --------------------------------------------------------------- 2177*6777b538SAndroid Build Coastguard Worker# 2178*6777b538SAndroid Build Coastguard Worker# Ensures all exported symbols are added to the dynamic symbol table. This is 2179*6777b538SAndroid Build Coastguard Worker# necessary to expose Chrome's custom operator new() and operator delete() (and 2180*6777b538SAndroid Build Coastguard Worker# other memory-related symbols) to libraries. Otherwise, they might 2181*6777b538SAndroid Build Coastguard Worker# (de)allocate memory on a different heap, which would spell trouble if pointers 2182*6777b538SAndroid Build Coastguard Worker# to heap-allocated memory are passed over shared library boundaries. 2183*6777b538SAndroid Build Coastguard Workerconfig("export_dynamic") { 2184*6777b538SAndroid Build Coastguard Worker # TODO(crbug.com/1052397): Revisit after target_os flip is completed. 2185*6777b538SAndroid Build Coastguard Worker if (is_linux || is_chromeos_lacros || export_libcxxabi_from_executables) { 2186*6777b538SAndroid Build Coastguard Worker ldflags = [ "-rdynamic" ] 2187*6777b538SAndroid Build Coastguard Worker } 2188*6777b538SAndroid Build Coastguard Worker} 2189*6777b538SAndroid Build Coastguard Worker 2190*6777b538SAndroid Build Coastguard Worker# thin_archive ----------------------------------------------------------------- 2191*6777b538SAndroid Build Coastguard Worker# 2192*6777b538SAndroid Build Coastguard Worker# Enables thin archives on posix, and on windows when the lld linker is used. 2193*6777b538SAndroid Build Coastguard Worker# Regular archives directly include the object files used to generate it. 2194*6777b538SAndroid Build Coastguard Worker# Thin archives merely reference the object files. 2195*6777b538SAndroid Build Coastguard Worker# This makes building them faster since it requires less disk IO, but is 2196*6777b538SAndroid Build Coastguard Worker# inappropriate if you wish to redistribute your static library. 2197*6777b538SAndroid Build Coastguard Worker# This config is added to the global config, so thin archives should already be 2198*6777b538SAndroid Build Coastguard Worker# enabled. If you want to make a distributable static library, you need to do 2 2199*6777b538SAndroid Build Coastguard Worker# things: 2200*6777b538SAndroid Build Coastguard Worker# 1. Set complete_static_lib so that all dependencies of the library make it 2201*6777b538SAndroid Build Coastguard Worker# into the library. See `gn help complete_static_lib` for details. 2202*6777b538SAndroid Build Coastguard Worker# 2. Remove the thin_archive config, so that the .a file actually contains all 2203*6777b538SAndroid Build Coastguard Worker# .o files, instead of just references to .o files in the build directoy 2204*6777b538SAndroid Build Coastguard Workerconfig("thin_archive") { 2205*6777b538SAndroid Build Coastguard Worker # The macOS and iOS default linker ld64 does not support reading thin 2206*6777b538SAndroid Build Coastguard Worker # archives. 2207*6777b538SAndroid Build Coastguard Worker if ((is_posix && !is_nacl && (!is_apple || use_lld)) || is_fuchsia) { 2208*6777b538SAndroid Build Coastguard Worker arflags = [ "-T" ] 2209*6777b538SAndroid Build Coastguard Worker } else if (is_win && use_lld) { 2210*6777b538SAndroid Build Coastguard Worker arflags = [ "/llvmlibthin" ] 2211*6777b538SAndroid Build Coastguard Worker } 2212*6777b538SAndroid Build Coastguard Worker} 2213*6777b538SAndroid Build Coastguard Worker 2214*6777b538SAndroid Build Coastguard Worker# exceptions ------------------------------------------------------------------- 2215*6777b538SAndroid Build Coastguard Worker# 2216*6777b538SAndroid Build Coastguard Worker# Allows turning Exceptions on or off. 2217*6777b538SAndroid Build Coastguard Worker# Note: exceptions are disallowed in Google code. 2218*6777b538SAndroid Build Coastguard Worker 2219*6777b538SAndroid Build Coastguard Workerconfig("exceptions") { 2220*6777b538SAndroid Build Coastguard Worker if (is_win) { 2221*6777b538SAndroid Build Coastguard Worker # Enables exceptions in the STL. 2222*6777b538SAndroid Build Coastguard Worker if (!use_custom_libcxx) { 2223*6777b538SAndroid Build Coastguard Worker defines = [ "_HAS_EXCEPTIONS=1" ] 2224*6777b538SAndroid Build Coastguard Worker } 2225*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "/EHsc" ] 2226*6777b538SAndroid Build Coastguard Worker } else { 2227*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "-fexceptions" ] 2228*6777b538SAndroid Build Coastguard Worker cflags_objcc = cflags_cc 2229*6777b538SAndroid Build Coastguard Worker } 2230*6777b538SAndroid Build Coastguard Worker} 2231*6777b538SAndroid Build Coastguard Worker 2232*6777b538SAndroid Build Coastguard Workerconfig("no_exceptions") { 2233*6777b538SAndroid Build Coastguard Worker if (is_win) { 2234*6777b538SAndroid Build Coastguard Worker # Disables exceptions in the STL. 2235*6777b538SAndroid Build Coastguard Worker # libc++ uses the __has_feature macro to control whether to use exceptions, 2236*6777b538SAndroid Build Coastguard Worker # so defining this macro is unnecessary. Defining _HAS_EXCEPTIONS to 0 also 2237*6777b538SAndroid Build Coastguard Worker # breaks libc++ because it depends on MSVC headers that only provide certain 2238*6777b538SAndroid Build Coastguard Worker # declarations if _HAS_EXCEPTIONS is 1. Those MSVC headers do not use 2239*6777b538SAndroid Build Coastguard Worker # exceptions, despite being conditional on _HAS_EXCEPTIONS. 2240*6777b538SAndroid Build Coastguard Worker if (!use_custom_libcxx) { 2241*6777b538SAndroid Build Coastguard Worker defines = [ "_HAS_EXCEPTIONS=0" ] 2242*6777b538SAndroid Build Coastguard Worker } 2243*6777b538SAndroid Build Coastguard Worker } else { 2244*6777b538SAndroid Build Coastguard Worker cflags_cc = [ "-fno-exceptions" ] 2245*6777b538SAndroid Build Coastguard Worker cflags_objcc = cflags_cc 2246*6777b538SAndroid Build Coastguard Worker } 2247*6777b538SAndroid Build Coastguard Worker} 2248*6777b538SAndroid Build Coastguard Worker 2249*6777b538SAndroid Build Coastguard Worker# Warnings --------------------------------------------------------------------- 2250*6777b538SAndroid Build Coastguard Worker 2251*6777b538SAndroid Build Coastguard Worker# Generate a warning for code that might emit a static initializer. 2252*6777b538SAndroid Build Coastguard Worker# See: //docs/static_initializers.md 2253*6777b538SAndroid Build Coastguard Worker# See: https://groups.google.com/a/chromium.org/d/topic/chromium-dev/B9Q5KTD7iCo/discussion 2254*6777b538SAndroid Build Coastguard Workerconfig("wglobal_constructors") { 2255*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2256*6777b538SAndroid Build Coastguard Worker cflags = [ "-Wglobal-constructors" ] 2257*6777b538SAndroid Build Coastguard Worker } 2258*6777b538SAndroid Build Coastguard Worker} 2259*6777b538SAndroid Build Coastguard Worker 2260*6777b538SAndroid Build Coastguard Worker# This will generate warnings when using Clang if code generates exit-time 2261*6777b538SAndroid Build Coastguard Worker# destructors, which will slow down closing the program. 2262*6777b538SAndroid Build Coastguard Worker# TODO(thakis): Make this a blocklist instead, http://crbug.com/101600 2263*6777b538SAndroid Build Coastguard Workerconfig("wexit_time_destructors") { 2264*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2265*6777b538SAndroid Build Coastguard Worker cflags = [ "-Wexit-time-destructors" ] 2266*6777b538SAndroid Build Coastguard Worker } 2267*6777b538SAndroid Build Coastguard Worker} 2268*6777b538SAndroid Build Coastguard Worker 2269*6777b538SAndroid Build Coastguard Worker# Some code presumes that pointers to structures/objects are compatible 2270*6777b538SAndroid Build Coastguard Worker# regardless of whether what they point to is already known to be valid. 2271*6777b538SAndroid Build Coastguard Worker# gcc 4.9 and earlier had no way of suppressing this warning without 2272*6777b538SAndroid Build Coastguard Worker# suppressing the rest of them. Here we centralize the identification of 2273*6777b538SAndroid Build Coastguard Worker# the gcc 4.9 toolchains. 2274*6777b538SAndroid Build Coastguard Workerconfig("no_incompatible_pointer_warnings") { 2275*6777b538SAndroid Build Coastguard Worker cflags = [] 2276*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2277*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-incompatible-pointer-types" ] 2278*6777b538SAndroid Build Coastguard Worker } else if (current_cpu == "mipsel" || current_cpu == "mips64el") { 2279*6777b538SAndroid Build Coastguard Worker cflags += [ "-w" ] 2280*6777b538SAndroid Build Coastguard Worker } else if (is_chromeos_ash && current_cpu == "arm") { 2281*6777b538SAndroid Build Coastguard Worker cflags += [ "-w" ] 2282*6777b538SAndroid Build Coastguard Worker } 2283*6777b538SAndroid Build Coastguard Worker} 2284*6777b538SAndroid Build Coastguard Worker 2285*6777b538SAndroid Build Coastguard Worker# Optimization ----------------------------------------------------------------- 2286*6777b538SAndroid Build Coastguard Worker# 2287*6777b538SAndroid Build Coastguard Worker# The BUILDCONFIG file sets the "default_optimization" config on targets by 2288*6777b538SAndroid Build Coastguard Worker# default. It will be equivalent to either "optimize" (release) or 2289*6777b538SAndroid Build Coastguard Worker# "no_optimize" (debug) optimization configs. 2290*6777b538SAndroid Build Coastguard Worker# 2291*6777b538SAndroid Build Coastguard Worker# You can override the optimization level on a per-target basis by removing the 2292*6777b538SAndroid Build Coastguard Worker# default config and then adding the named one you want: 2293*6777b538SAndroid Build Coastguard Worker# 2294*6777b538SAndroid Build Coastguard Worker# configs -= [ "//build/config/compiler:default_optimization" ] 2295*6777b538SAndroid Build Coastguard Worker# configs += [ "//build/config/compiler:optimize_max" ] 2296*6777b538SAndroid Build Coastguard Worker 2297*6777b538SAndroid Build Coastguard Worker# Shared settings for both "optimize" and "optimize_max" configs. 2298*6777b538SAndroid Build Coastguard Worker# IMPORTANT: On Windows "/O1" and "/O2" must go before the common flags. 2299*6777b538SAndroid Build Coastguard Workerif (is_win) { 2300*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags = [ 2301*6777b538SAndroid Build Coastguard Worker "/Oy-", # Disable omitting frame pointers, must be after /O2. 2302*6777b538SAndroid Build Coastguard Worker "/Zc:inline", # Remove unreferenced COMDAT (faster links). 2303*6777b538SAndroid Build Coastguard Worker ] 2304*6777b538SAndroid Build Coastguard Worker if (!is_asan) { 2305*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags += [ 2306*6777b538SAndroid Build Coastguard Worker # Put data in separate COMDATs. This allows the linker 2307*6777b538SAndroid Build Coastguard Worker # to put bit-identical constants at the same address even if 2308*6777b538SAndroid Build Coastguard Worker # they're unrelated constants, which saves binary size. 2309*6777b538SAndroid Build Coastguard Worker # This optimization can't be used when ASan is enabled because 2310*6777b538SAndroid Build Coastguard Worker # it is not compatible with the ASan ODR checker. 2311*6777b538SAndroid Build Coastguard Worker "/Gw", 2312*6777b538SAndroid Build Coastguard Worker ] 2313*6777b538SAndroid Build Coastguard Worker } 2314*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags = [] 2315*6777b538SAndroid Build Coastguard Worker 2316*6777b538SAndroid Build Coastguard Worker # /OPT:ICF is not desirable in Debug builds, since code-folding can result in 2317*6777b538SAndroid Build Coastguard Worker # misleading symbols in stack traces. 2318*6777b538SAndroid Build Coastguard Worker if (!is_debug && !is_component_build) { 2319*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags += [ "/OPT:ICF" ] # Redundant COMDAT folding. 2320*6777b538SAndroid Build Coastguard Worker } 2321*6777b538SAndroid Build Coastguard Worker 2322*6777b538SAndroid Build Coastguard Worker if (is_official_build) { 2323*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags += [ "/OPT:REF" ] # Remove unreferenced data. 2324*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Add LTO/PGO clang flags eventually, https://crbug.com/598772 2325*6777b538SAndroid Build Coastguard Worker } 2326*6777b538SAndroid Build Coastguard Worker 2327*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2328*6777b538SAndroid Build Coastguard Worker # See below. 2329*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags += [ "/clang:-fno-math-errno" ] 2330*6777b538SAndroid Build Coastguard Worker } 2331*6777b538SAndroid Build Coastguard Worker} else { 2332*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags = [] 2333*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags = [] 2334*6777b538SAndroid Build Coastguard Worker 2335*6777b538SAndroid Build Coastguard Worker if (is_android) { 2336*6777b538SAndroid Build Coastguard Worker # TODO(jdduke) Re-enable on mips after resolving linking 2337*6777b538SAndroid Build Coastguard Worker # issues with libc++ (crbug.com/456380). 2338*6777b538SAndroid Build Coastguard Worker if (current_cpu != "mipsel" && current_cpu != "mips64el") { 2339*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags += [ 2340*6777b538SAndroid Build Coastguard Worker # Warn in case of text relocations. 2341*6777b538SAndroid Build Coastguard Worker "-Wl,--warn-shared-textrel", 2342*6777b538SAndroid Build Coastguard Worker ] 2343*6777b538SAndroid Build Coastguard Worker } 2344*6777b538SAndroid Build Coastguard Worker } 2345*6777b538SAndroid Build Coastguard Worker 2346*6777b538SAndroid Build Coastguard Worker if (is_apple) { 2347*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags += [ "-Wl,-dead_strip" ] 2348*6777b538SAndroid Build Coastguard Worker 2349*6777b538SAndroid Build Coastguard Worker if (is_official_build) { 2350*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags += [ 2351*6777b538SAndroid Build Coastguard Worker "-Wl,-no_data_in_code_info", 2352*6777b538SAndroid Build Coastguard Worker "-Wl,-no_function_starts", 2353*6777b538SAndroid Build Coastguard Worker ] 2354*6777b538SAndroid Build Coastguard Worker } 2355*6777b538SAndroid Build Coastguard Worker } else if (current_os != "aix" && current_os != "zos") { 2356*6777b538SAndroid Build Coastguard Worker # Non-Mac Posix flags. 2357*6777b538SAndroid Build Coastguard Worker # Aix does not support these. 2358*6777b538SAndroid Build Coastguard Worker 2359*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags += [ 2360*6777b538SAndroid Build Coastguard Worker # Put data and code in their own sections, so that unused symbols 2361*6777b538SAndroid Build Coastguard Worker # can be removed at link time with --gc-sections. 2362*6777b538SAndroid Build Coastguard Worker "-fdata-sections", 2363*6777b538SAndroid Build Coastguard Worker "-ffunction-sections", 2364*6777b538SAndroid Build Coastguard Worker ] 2365*6777b538SAndroid Build Coastguard Worker if ((!is_nacl || is_nacl_saigo) && is_clang) { 2366*6777b538SAndroid Build Coastguard Worker # We don't care about unique section names, this makes object files a bit 2367*6777b538SAndroid Build Coastguard Worker # smaller. 2368*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags += [ "-fno-unique-section-names" ] 2369*6777b538SAndroid Build Coastguard Worker } 2370*6777b538SAndroid Build Coastguard Worker 2371*6777b538SAndroid Build Coastguard Worker common_optimize_on_ldflags += [ 2372*6777b538SAndroid Build Coastguard Worker # Specifically tell the linker to perform optimizations. 2373*6777b538SAndroid Build Coastguard Worker # See http://lwn.net/Articles/192624/ . 2374*6777b538SAndroid Build Coastguard Worker # -O2 enables string tail merge optimization in gold and lld. 2375*6777b538SAndroid Build Coastguard Worker "-Wl,-O2", 2376*6777b538SAndroid Build Coastguard Worker "-Wl,--gc-sections", 2377*6777b538SAndroid Build Coastguard Worker ] 2378*6777b538SAndroid Build Coastguard Worker } 2379*6777b538SAndroid Build Coastguard Worker 2380*6777b538SAndroid Build Coastguard Worker # We cannot rely on errno being set after math functions, 2381*6777b538SAndroid Build Coastguard Worker # especially since glibc does not set it. Thus, use -fno-math-errno 2382*6777b538SAndroid Build Coastguard Worker # so that the compiler knows it can inline math functions. 2383*6777b538SAndroid Build Coastguard Worker # Note that this is different from -ffast-math (even though -ffast-math 2384*6777b538SAndroid Build Coastguard Worker # implies -fno-math-errno), which also allows a number of unsafe 2385*6777b538SAndroid Build Coastguard Worker # optimizations. 2386*6777b538SAndroid Build Coastguard Worker common_optimize_on_cflags += [ "-fno-math-errno" ] 2387*6777b538SAndroid Build Coastguard Worker} 2388*6777b538SAndroid Build Coastguard Worker 2389*6777b538SAndroid Build Coastguard Workerconfig("default_stack_frames") { 2390*6777b538SAndroid Build Coastguard Worker if (!is_win) { 2391*6777b538SAndroid Build Coastguard Worker if (enable_frame_pointers) { 2392*6777b538SAndroid Build Coastguard Worker cflags = [ "-fno-omit-frame-pointer" ] 2393*6777b538SAndroid Build Coastguard Worker 2394*6777b538SAndroid Build Coastguard Worker # Omit frame pointers for leaf functions on x86, otherwise building libyuv 2395*6777b538SAndroid Build Coastguard Worker # gives clang's register allocator issues, see llvm.org/PR15798 / 2396*6777b538SAndroid Build Coastguard Worker # crbug.com/233709 2397*6777b538SAndroid Build Coastguard Worker if (is_clang && current_cpu == "x86" && !is_apple) { 2398*6777b538SAndroid Build Coastguard Worker cflags += [ "-momit-leaf-frame-pointer" ] 2399*6777b538SAndroid Build Coastguard Worker } 2400*6777b538SAndroid Build Coastguard Worker } else { 2401*6777b538SAndroid Build Coastguard Worker cflags = [ "-fomit-frame-pointer" ] 2402*6777b538SAndroid Build Coastguard Worker } 2403*6777b538SAndroid Build Coastguard Worker } 2404*6777b538SAndroid Build Coastguard Worker # On Windows, the flag to enable framepointers "/Oy-" must always come after 2405*6777b538SAndroid Build Coastguard Worker # the optimization flag [e.g. "/O2"]. The optimization flag is set by one of 2406*6777b538SAndroid Build Coastguard Worker # the "optimize" configs, see rest of this file. The ordering that cflags are 2407*6777b538SAndroid Build Coastguard Worker # applied is well-defined by the GN spec, and there is no way to ensure that 2408*6777b538SAndroid Build Coastguard Worker # cflags set by "default_stack_frames" is applied after those set by an 2409*6777b538SAndroid Build Coastguard Worker # "optimize" config. Similarly, there is no way to propagate state from this 2410*6777b538SAndroid Build Coastguard Worker # config into the "optimize" config. We always apply the "/Oy-" config in the 2411*6777b538SAndroid Build Coastguard Worker # definition for common_optimize_on_cflags definition, even though this may 2412*6777b538SAndroid Build Coastguard Worker # not be correct. 2413*6777b538SAndroid Build Coastguard Worker} 2414*6777b538SAndroid Build Coastguard Worker 2415*6777b538SAndroid Build Coastguard Worker# Default "optimization on" config. 2416*6777b538SAndroid Build Coastguard Worker# 2417*6777b538SAndroid Build Coastguard Worker# High-end Android: As of April 2024, `-O2` appears to be a good default, 2418*6777b538SAndroid Build Coastguard Worker# particularly since a selection of "hot" targets are already using `-O3`. 2419*6777b538SAndroid Build Coastguard Worker# Enabling `-O3` for all targets does not change performance much (according 2420*6777b538SAndroid Build Coastguard Worker# to Speedometer), but regresses binary size. Using `-O3` as the default: 2421*6777b538SAndroid Build Coastguard Worker# - Decreases Speedometer 2.1 score by 0.2% [0]. 2422*6777b538SAndroid Build Coastguard Worker# - Increases Speedometer 3.0 score by 0.1% [1]. 2423*6777b538SAndroid Build Coastguard Worker# - Increases binary size by 1.47MB [2] (or 0.8%: the arm64 native code size 2424*6777b538SAndroid Build Coastguard Worker# in M124 is 178MB). 2425*6777b538SAndroid Build Coastguard Worker# ... over `-O2`. 2426*6777b538SAndroid Build Coastguard Worker# 2427*6777b538SAndroid Build Coastguard Worker# [0]: https://pinpoint-dot-chromeperf.appspot.com/job/147634a8be0000 2428*6777b538SAndroid Build Coastguard Worker# [1]: https://pinpoint-dot-chromeperf.appspot.com/job/132bc772be0000 2429*6777b538SAndroid Build Coastguard Worker# [2]: https://crrev.com/c/5447532 2430*6777b538SAndroid Build Coastguard Workerconfig("optimize") { 2431*6777b538SAndroid Build Coastguard Worker if (is_win) { 2432*6777b538SAndroid Build Coastguard Worker cflags = [ "/O2" ] + common_optimize_on_cflags 2433*6777b538SAndroid Build Coastguard Worker 2434*6777b538SAndroid Build Coastguard Worker # https://doc.rust-lang.org/rustc/profile-guided-optimization.html#usage 2435*6777b538SAndroid Build Coastguard Worker # suggests not using an explicit `-Copt-level` at all, and the default is 2436*6777b538SAndroid Build Coastguard Worker # to optimize for performance like `/O2` for clang. 2437*6777b538SAndroid Build Coastguard Worker rustflags = [] 2438*6777b538SAndroid Build Coastguard Worker } else if (optimize_for_size || is_chromeos) { 2439*6777b538SAndroid Build Coastguard Worker # Favor size over speed. 2440*6777b538SAndroid Build Coastguard Worker # -Os in clang is more of a size-conscious -O2 than "size at any cost" 2441*6777b538SAndroid Build Coastguard Worker # (AKA -Oz). 2442*6777b538SAndroid Build Coastguard Worker 2443*6777b538SAndroid Build Coastguard Worker if (is_fuchsia) { 2444*6777b538SAndroid Build Coastguard Worker cflags = [ "-Oz" ] + common_optimize_on_cflags 2445*6777b538SAndroid Build Coastguard Worker } else { 2446*6777b538SAndroid Build Coastguard Worker cflags = [ "-Os" ] + common_optimize_on_cflags 2447*6777b538SAndroid Build Coastguard Worker } 2448*6777b538SAndroid Build Coastguard Worker 2449*6777b538SAndroid Build Coastguard Worker if (is_clang && use_ml_inliner && is_a_target_toolchain && !is_chromeos) { 2450*6777b538SAndroid Build Coastguard Worker cflags += [ 2451*6777b538SAndroid Build Coastguard Worker "-mllvm", 2452*6777b538SAndroid Build Coastguard Worker "-enable-ml-inliner=release", 2453*6777b538SAndroid Build Coastguard Worker ] 2454*6777b538SAndroid Build Coastguard Worker } 2455*6777b538SAndroid Build Coastguard Worker 2456*6777b538SAndroid Build Coastguard Worker # Similar to clang, we optimize with `-Copt-level=s` to keep loop 2457*6777b538SAndroid Build Coastguard Worker # vectorization while otherwise optimizing for size. 2458*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Copt-level=s" ] 2459*6777b538SAndroid Build Coastguard Worker } else { 2460*6777b538SAndroid Build Coastguard Worker cflags = [ "-O2" ] + common_optimize_on_cflags 2461*6777b538SAndroid Build Coastguard Worker 2462*6777b538SAndroid Build Coastguard Worker # The `-O3` for clang turns on extra optimizations compared to the standard 2463*6777b538SAndroid Build Coastguard Worker # `-O2`. But for rust, `-Copt-level=3` is the default and is thus reliable 2464*6777b538SAndroid Build Coastguard Worker # to use. 2465*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Copt-level=3" ] 2466*6777b538SAndroid Build Coastguard Worker } 2467*6777b538SAndroid Build Coastguard Worker ldflags = common_optimize_on_ldflags 2468*6777b538SAndroid Build Coastguard Worker} 2469*6777b538SAndroid Build Coastguard Worker 2470*6777b538SAndroid Build Coastguard Worker# Turn off optimizations. 2471*6777b538SAndroid Build Coastguard Workerconfig("no_optimize") { 2472*6777b538SAndroid Build Coastguard Worker if (is_win) { 2473*6777b538SAndroid Build Coastguard Worker cflags = [ 2474*6777b538SAndroid Build Coastguard Worker "/Od", # Disable optimization. 2475*6777b538SAndroid Build Coastguard Worker "/Ob0", # Disable all inlining (on by default). 2476*6777b538SAndroid Build Coastguard Worker "/GF", # Enable string pooling (off by default). 2477*6777b538SAndroid Build Coastguard Worker ] 2478*6777b538SAndroid Build Coastguard Worker 2479*6777b538SAndroid Build Coastguard Worker if (target_cpu == "arm64") { 2480*6777b538SAndroid Build Coastguard Worker # Disable omitting frame pointers for no_optimize build because stack 2481*6777b538SAndroid Build Coastguard Worker # traces on Windows ARM64 rely on it. 2482*6777b538SAndroid Build Coastguard Worker cflags += [ "/Oy-" ] 2483*6777b538SAndroid Build Coastguard Worker } 2484*6777b538SAndroid Build Coastguard Worker } else if (is_android && !android_full_debug) { 2485*6777b538SAndroid Build Coastguard Worker # On Android we kind of optimize some things that don't affect debugging 2486*6777b538SAndroid Build Coastguard Worker # much even when optimization is disabled to get the binary size down. 2487*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2488*6777b538SAndroid Build Coastguard Worker cflags = [ "-Oz" ] + common_optimize_on_cflags 2489*6777b538SAndroid Build Coastguard Worker } else { 2490*6777b538SAndroid Build Coastguard Worker cflags = [ "-Os" ] + common_optimize_on_cflags 2491*6777b538SAndroid Build Coastguard Worker } 2492*6777b538SAndroid Build Coastguard Worker 2493*6777b538SAndroid Build Coastguard Worker if (!is_component_build) { 2494*6777b538SAndroid Build Coastguard Worker # Required for library partitions. Without this all symbols just end up 2495*6777b538SAndroid Build Coastguard Worker # in the base partition. 2496*6777b538SAndroid Build Coastguard Worker ldflags = [ "-Wl,--gc-sections" ] 2497*6777b538SAndroid Build Coastguard Worker } 2498*6777b538SAndroid Build Coastguard Worker } else if (is_fuchsia) { 2499*6777b538SAndroid Build Coastguard Worker # On Fuchsia, we optimize for size here to reduce the size of debug build 2500*6777b538SAndroid Build Coastguard Worker # packages so they can be run in a KVM. See crbug.com/910243 for details. 2501*6777b538SAndroid Build Coastguard Worker cflags = [ "-Og" ] 2502*6777b538SAndroid Build Coastguard Worker } else { 2503*6777b538SAndroid Build Coastguard Worker cflags = [ "-O0" ] 2504*6777b538SAndroid Build Coastguard Worker ldflags = [] 2505*6777b538SAndroid Build Coastguard Worker } 2506*6777b538SAndroid Build Coastguard Worker} 2507*6777b538SAndroid Build Coastguard Worker 2508*6777b538SAndroid Build Coastguard Worker# Turns up the optimization level. Used to explicitly enable -O2 instead of 2509*6777b538SAndroid Build Coastguard Worker# -Os for select targets on platforms that use optimize_for_size. No-op 2510*6777b538SAndroid Build Coastguard Worker# elsewhere. 2511*6777b538SAndroid Build Coastguard Workerconfig("optimize_max") { 2512*6777b538SAndroid Build Coastguard Worker if (is_nacl && is_nacl_irt) { 2513*6777b538SAndroid Build Coastguard Worker # The NaCl IRT is a special case and always wants its own config. 2514*6777b538SAndroid Build Coastguard Worker # Various components do: 2515*6777b538SAndroid Build Coastguard Worker # if (!is_debug) { 2516*6777b538SAndroid Build Coastguard Worker # configs -= [ "//build/config/compiler:default_optimization" ] 2517*6777b538SAndroid Build Coastguard Worker # configs += [ "//build/config/compiler:optimize_max" ] 2518*6777b538SAndroid Build Coastguard Worker # } 2519*6777b538SAndroid Build Coastguard Worker # So this config has to have the selection logic just like 2520*6777b538SAndroid Build Coastguard Worker # "default_optimization", below. 2521*6777b538SAndroid Build Coastguard Worker configs = [ "//build/config/nacl:irt_optimize" ] 2522*6777b538SAndroid Build Coastguard Worker } else { 2523*6777b538SAndroid Build Coastguard Worker ldflags = common_optimize_on_ldflags 2524*6777b538SAndroid Build Coastguard Worker if (is_win) { 2525*6777b538SAndroid Build Coastguard Worker # Favor speed over size, /O2 must be before the common flags. 2526*6777b538SAndroid Build Coastguard Worker # /O2 implies /Ot, /Oi, and /GF. 2527*6777b538SAndroid Build Coastguard Worker cflags = [ "/O2" ] + common_optimize_on_cflags 2528*6777b538SAndroid Build Coastguard Worker } else if (optimize_for_fuzzing) { 2529*6777b538SAndroid Build Coastguard Worker cflags = [ "-O1" ] + common_optimize_on_cflags 2530*6777b538SAndroid Build Coastguard Worker } else { 2531*6777b538SAndroid Build Coastguard Worker cflags = [ "-O2" ] + common_optimize_on_cflags 2532*6777b538SAndroid Build Coastguard Worker } 2533*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Copt-level=3" ] 2534*6777b538SAndroid Build Coastguard Worker } 2535*6777b538SAndroid Build Coastguard Worker} 2536*6777b538SAndroid Build Coastguard Worker 2537*6777b538SAndroid Build Coastguard Worker# This config can be used to override the default settings for per-component 2538*6777b538SAndroid Build Coastguard Worker# and whole-program optimization, optimizing the particular target for speed 2539*6777b538SAndroid Build Coastguard Worker# instead of code size. This config is exactly the same as "optimize_max" 2540*6777b538SAndroid Build Coastguard Worker# except that we use -O3 instead of -O2 on non-IRT platforms. 2541*6777b538SAndroid Build Coastguard Worker# 2542*6777b538SAndroid Build Coastguard Worker# TODO(crbug.com/621335) - rework how all of these configs are related 2543*6777b538SAndroid Build Coastguard Worker# so that we don't need this disclaimer. 2544*6777b538SAndroid Build Coastguard Workerconfig("optimize_speed") { 2545*6777b538SAndroid Build Coastguard Worker if (is_nacl && is_nacl_irt) { 2546*6777b538SAndroid Build Coastguard Worker # The NaCl IRT is a special case and always wants its own config. 2547*6777b538SAndroid Build Coastguard Worker # Various components do: 2548*6777b538SAndroid Build Coastguard Worker # if (!is_debug) { 2549*6777b538SAndroid Build Coastguard Worker # configs -= [ "//build/config/compiler:default_optimization" ] 2550*6777b538SAndroid Build Coastguard Worker # configs += [ "//build/config/compiler:optimize_max" ] 2551*6777b538SAndroid Build Coastguard Worker # } 2552*6777b538SAndroid Build Coastguard Worker # So this config has to have the selection logic just like 2553*6777b538SAndroid Build Coastguard Worker # "default_optimization", below. 2554*6777b538SAndroid Build Coastguard Worker configs = [ "//build/config/nacl:irt_optimize" ] 2555*6777b538SAndroid Build Coastguard Worker } else { 2556*6777b538SAndroid Build Coastguard Worker ldflags = common_optimize_on_ldflags 2557*6777b538SAndroid Build Coastguard Worker if (is_win) { 2558*6777b538SAndroid Build Coastguard Worker # Favor speed over size, /O2 must be before the common flags. 2559*6777b538SAndroid Build Coastguard Worker # /O2 implies /Ot, /Oi, and /GF. 2560*6777b538SAndroid Build Coastguard Worker cflags = [ "/O2" ] + common_optimize_on_cflags 2561*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2562*6777b538SAndroid Build Coastguard Worker cflags += [ "/clang:-O3" ] 2563*6777b538SAndroid Build Coastguard Worker } 2564*6777b538SAndroid Build Coastguard Worker } else if (optimize_for_fuzzing) { 2565*6777b538SAndroid Build Coastguard Worker cflags = [ "-O1" ] + common_optimize_on_cflags 2566*6777b538SAndroid Build Coastguard Worker } else { 2567*6777b538SAndroid Build Coastguard Worker cflags = [ "-O3" ] + common_optimize_on_cflags 2568*6777b538SAndroid Build Coastguard Worker } 2569*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Copt-level=3" ] 2570*6777b538SAndroid Build Coastguard Worker } 2571*6777b538SAndroid Build Coastguard Worker} 2572*6777b538SAndroid Build Coastguard Worker 2573*6777b538SAndroid Build Coastguard Workerconfig("optimize_fuzzing") { 2574*6777b538SAndroid Build Coastguard Worker cflags = [ "-O1" ] + common_optimize_on_cflags 2575*6777b538SAndroid Build Coastguard Worker rustflags = [ "-Copt-level=1" ] 2576*6777b538SAndroid Build Coastguard Worker ldflags = common_optimize_on_ldflags 2577*6777b538SAndroid Build Coastguard Worker visibility = [ ":default_optimization" ] 2578*6777b538SAndroid Build Coastguard Worker} 2579*6777b538SAndroid Build Coastguard Worker 2580*6777b538SAndroid Build Coastguard Worker# The default optimization applied to all targets. This will be equivalent to 2581*6777b538SAndroid Build Coastguard Worker# either "optimize" or "no_optimize", depending on the build flags. 2582*6777b538SAndroid Build Coastguard Workerconfig("default_optimization") { 2583*6777b538SAndroid Build Coastguard Worker if (is_nacl && is_nacl_irt) { 2584*6777b538SAndroid Build Coastguard Worker # The NaCl IRT is a special case and always wants its own config. 2585*6777b538SAndroid Build Coastguard Worker # It gets optimized the same way regardless of the type of build. 2586*6777b538SAndroid Build Coastguard Worker configs = [ "//build/config/nacl:irt_optimize" ] 2587*6777b538SAndroid Build Coastguard Worker } else if (is_debug) { 2588*6777b538SAndroid Build Coastguard Worker configs = [ ":no_optimize" ] 2589*6777b538SAndroid Build Coastguard Worker } else if (optimize_for_fuzzing) { 2590*6777b538SAndroid Build Coastguard Worker assert(!is_win, "Fuzzing optimize level not supported on Windows") 2591*6777b538SAndroid Build Coastguard Worker 2592*6777b538SAndroid Build Coastguard Worker # Coverage build is quite slow. Using "optimize_for_fuzzing" makes it even 2593*6777b538SAndroid Build Coastguard Worker # slower as it uses "-O1" instead of "-O3". Prevent that from happening. 2594*6777b538SAndroid Build Coastguard Worker assert(!use_clang_coverage, 2595*6777b538SAndroid Build Coastguard Worker "optimize_for_fuzzing=true should not be used with " + 2596*6777b538SAndroid Build Coastguard Worker "use_clang_coverage=true.") 2597*6777b538SAndroid Build Coastguard Worker configs = [ ":optimize_fuzzing" ] 2598*6777b538SAndroid Build Coastguard Worker } else { 2599*6777b538SAndroid Build Coastguard Worker configs = [ ":optimize" ] 2600*6777b538SAndroid Build Coastguard Worker } 2601*6777b538SAndroid Build Coastguard Worker} 2602*6777b538SAndroid Build Coastguard Worker 2603*6777b538SAndroid Build Coastguard Worker_clang_sample_profile = "" 2604*6777b538SAndroid Build Coastguard Workerif (is_clang && is_a_target_toolchain) { 2605*6777b538SAndroid Build Coastguard Worker if (clang_sample_profile_path != "") { 2606*6777b538SAndroid Build Coastguard Worker _clang_sample_profile = clang_sample_profile_path 2607*6777b538SAndroid Build Coastguard Worker } else if (clang_use_default_sample_profile) { 2608*6777b538SAndroid Build Coastguard Worker assert(build_with_chromium, 2609*6777b538SAndroid Build Coastguard Worker "Our default profiles currently only apply to Chromium") 2610*6777b538SAndroid Build Coastguard Worker assert(is_android || is_chromeos || is_castos, 2611*6777b538SAndroid Build Coastguard Worker "The current platform has no default profile") 2612*6777b538SAndroid Build Coastguard Worker if (is_android || is_castos) { 2613*6777b538SAndroid Build Coastguard Worker _clang_sample_profile = "//chrome/android/profiles/afdo.prof" 2614*6777b538SAndroid Build Coastguard Worker } else { 2615*6777b538SAndroid Build Coastguard Worker assert( 2616*6777b538SAndroid Build Coastguard Worker chromeos_afdo_platform == "atom" || 2617*6777b538SAndroid Build Coastguard Worker chromeos_afdo_platform == "bigcore" || 2618*6777b538SAndroid Build Coastguard Worker chromeos_afdo_platform == "arm" || 2619*6777b538SAndroid Build Coastguard Worker chromeos_afdo_platform == "arm-exp", 2620*6777b538SAndroid Build Coastguard Worker "Only 'atom', 'bigcore', 'arm' and 'arm-exp' are valid ChromeOS profiles.") 2621*6777b538SAndroid Build Coastguard Worker _clang_sample_profile = 2622*6777b538SAndroid Build Coastguard Worker "//chromeos/profiles/${chromeos_afdo_platform}.afdo.prof" 2623*6777b538SAndroid Build Coastguard Worker } 2624*6777b538SAndroid Build Coastguard Worker } 2625*6777b538SAndroid Build Coastguard Worker} 2626*6777b538SAndroid Build Coastguard Worker 2627*6777b538SAndroid Build Coastguard Worker# Clang offers a way to assert that AFDO profiles are accurate, which causes it 2628*6777b538SAndroid Build Coastguard Worker# to optimize functions not represented in a profile more aggressively for size. 2629*6777b538SAndroid Build Coastguard Worker# This config can be toggled in cases where shaving off binary size hurts 2630*6777b538SAndroid Build Coastguard Worker# performance too much. 2631*6777b538SAndroid Build Coastguard Workerconfig("afdo_optimize_size") { 2632*6777b538SAndroid Build Coastguard Worker if (_clang_sample_profile != "" && sample_profile_is_accurate) { 2633*6777b538SAndroid Build Coastguard Worker cflags = [ "-fprofile-sample-accurate" ] 2634*6777b538SAndroid Build Coastguard Worker } 2635*6777b538SAndroid Build Coastguard Worker} 2636*6777b538SAndroid Build Coastguard Worker 2637*6777b538SAndroid Build Coastguard Worker# GCC and clang support a form of profile-guided optimization called AFDO. 2638*6777b538SAndroid Build Coastguard Worker# There are some targeted places that AFDO regresses, so we provide a separate 2639*6777b538SAndroid Build Coastguard Worker# config to allow AFDO to be disabled per-target. 2640*6777b538SAndroid Build Coastguard Workerconfig("afdo") { 2641*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2642*6777b538SAndroid Build Coastguard Worker cflags = [] 2643*6777b538SAndroid Build Coastguard Worker if (clang_emit_debug_info_for_profiling) { 2644*6777b538SAndroid Build Coastguard Worker # Add the following flags to generate debug info for profiling. 2645*6777b538SAndroid Build Coastguard Worker cflags += [ "-gline-tables-only" ] 2646*6777b538SAndroid Build Coastguard Worker if (!is_nacl) { 2647*6777b538SAndroid Build Coastguard Worker cflags += [ "-fdebug-info-for-profiling" ] 2648*6777b538SAndroid Build Coastguard Worker } 2649*6777b538SAndroid Build Coastguard Worker } 2650*6777b538SAndroid Build Coastguard Worker if (_clang_sample_profile != "") { 2651*6777b538SAndroid Build Coastguard Worker assert(chrome_pgo_phase == 0, "AFDO can't be used in PGO builds") 2652*6777b538SAndroid Build Coastguard Worker rebased_clang_sample_profile = 2653*6777b538SAndroid Build Coastguard Worker rebase_path(_clang_sample_profile, root_build_dir) 2654*6777b538SAndroid Build Coastguard Worker cflags += [ "-fprofile-sample-use=${rebased_clang_sample_profile}" ] 2655*6777b538SAndroid Build Coastguard Worker if (use_profi) { 2656*6777b538SAndroid Build Coastguard Worker cflags += [ "-fsample-profile-use-profi" ] 2657*6777b538SAndroid Build Coastguard Worker } 2658*6777b538SAndroid Build Coastguard Worker 2659*6777b538SAndroid Build Coastguard Worker # crbug.com/1459429: ARM builds see failures due to -Wbackend-plugin. 2660*6777b538SAndroid Build Coastguard Worker # These seem to be false positives - the complaints are about functions 2661*6777b538SAndroid Build Coastguard Worker # marked with `__nodebug__` not having associated debuginfo. In the case 2662*6777b538SAndroid Build Coastguard Worker # where this was observed, the `__nodebug__` function was also marked 2663*6777b538SAndroid Build Coastguard Worker # `__always_inline__` and had no branches, so AFDO info is likely useless 2664*6777b538SAndroid Build Coastguard Worker # there. 2665*6777b538SAndroid Build Coastguard Worker cflags += [ "-Wno-backend-plugin" ] 2666*6777b538SAndroid Build Coastguard Worker inputs = [ _clang_sample_profile ] 2667*6777b538SAndroid Build Coastguard Worker } 2668*6777b538SAndroid Build Coastguard Worker } else if (auto_profile_path != "" && is_a_target_toolchain) { 2669*6777b538SAndroid Build Coastguard Worker cflags = [ "-fauto-profile=${auto_profile_path}" ] 2670*6777b538SAndroid Build Coastguard Worker inputs = [ auto_profile_path ] 2671*6777b538SAndroid Build Coastguard Worker } 2672*6777b538SAndroid Build Coastguard Worker} 2673*6777b538SAndroid Build Coastguard Worker 2674*6777b538SAndroid Build Coastguard Worker# Symbols ---------------------------------------------------------------------- 2675*6777b538SAndroid Build Coastguard Worker 2676*6777b538SAndroid Build Coastguard Worker# The BUILDCONFIG file sets the "default_symbols" config on targets by 2677*6777b538SAndroid Build Coastguard Worker# default. It will be equivalent to one the three specific symbol levels. 2678*6777b538SAndroid Build Coastguard Worker# 2679*6777b538SAndroid Build Coastguard Worker# You can override the symbol level on a per-target basis by removing the 2680*6777b538SAndroid Build Coastguard Worker# default config and then adding the named one you want: 2681*6777b538SAndroid Build Coastguard Worker# 2682*6777b538SAndroid Build Coastguard Worker# configs -= [ "//build/config/compiler:default_symbols" ] 2683*6777b538SAndroid Build Coastguard Worker# configs += [ "//build/config/compiler:symbols" ] 2684*6777b538SAndroid Build Coastguard Worker 2685*6777b538SAndroid Build Coastguard Worker# A helper config that all configs passing /DEBUG to the linker should 2686*6777b538SAndroid Build Coastguard Worker# include as sub-config. 2687*6777b538SAndroid Build Coastguard Workerconfig("win_pdbaltpath") { 2688*6777b538SAndroid Build Coastguard Worker visibility = [ 2689*6777b538SAndroid Build Coastguard Worker ":minimal_symbols", 2690*6777b538SAndroid Build Coastguard Worker ":symbols", 2691*6777b538SAndroid Build Coastguard Worker ] 2692*6777b538SAndroid Build Coastguard Worker 2693*6777b538SAndroid Build Coastguard Worker # /DEBUG causes the linker to generate a pdb file, and to write the absolute 2694*6777b538SAndroid Build Coastguard Worker # path to it in the executable file it generates. This flag turns that 2695*6777b538SAndroid Build Coastguard Worker # absolute path into just the basename of the pdb file, which helps with 2696*6777b538SAndroid Build Coastguard Worker # build reproducibility. Debuggers look for pdb files next to executables, 2697*6777b538SAndroid Build Coastguard Worker # so there's minimal downside to always using this. However, post-mortem 2698*6777b538SAndroid Build Coastguard Worker # debugging of Chromium crash dumps and ETW tracing can be complicated by this 2699*6777b538SAndroid Build Coastguard Worker # switch so an option to omit it is important. 2700*6777b538SAndroid Build Coastguard Worker if (!use_full_pdb_paths) { 2701*6777b538SAndroid Build Coastguard Worker ldflags = [ "/pdbaltpath:%_PDB%" ] 2702*6777b538SAndroid Build Coastguard Worker } 2703*6777b538SAndroid Build Coastguard Worker} 2704*6777b538SAndroid Build Coastguard Worker 2705*6777b538SAndroid Build Coastguard Worker# Full symbols. 2706*6777b538SAndroid Build Coastguard Workerconfig("symbols") { 2707*6777b538SAndroid Build Coastguard Worker rustflags = [] 2708*6777b538SAndroid Build Coastguard Worker if (is_win) { 2709*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2710*6777b538SAndroid Build Coastguard Worker cflags = [ 2711*6777b538SAndroid Build Coastguard Worker # Debug information in the .obj files. 2712*6777b538SAndroid Build Coastguard Worker "/Z7", 2713*6777b538SAndroid Build Coastguard Worker 2714*6777b538SAndroid Build Coastguard Worker # Disable putting the compiler command line into the debug info to 2715*6777b538SAndroid Build Coastguard Worker # prevent some types of non-determinism. 2716*6777b538SAndroid Build Coastguard Worker "-gno-codeview-command-line", 2717*6777b538SAndroid Build Coastguard Worker ] 2718*6777b538SAndroid Build Coastguard Worker } else { 2719*6777b538SAndroid Build Coastguard Worker cflags = [ "/Zi" ] # Produce PDB file, no edit and continue. 2720*6777b538SAndroid Build Coastguard Worker } 2721*6777b538SAndroid Build Coastguard Worker 2722*6777b538SAndroid Build Coastguard Worker if (is_clang && use_lld && use_ghash) { 2723*6777b538SAndroid Build Coastguard Worker cflags += [ "-gcodeview-ghash" ] 2724*6777b538SAndroid Build Coastguard Worker ldflags = [ "/DEBUG:GHASH" ] 2725*6777b538SAndroid Build Coastguard Worker } else { 2726*6777b538SAndroid Build Coastguard Worker ldflags = [ "/DEBUG" ] 2727*6777b538SAndroid Build Coastguard Worker } 2728*6777b538SAndroid Build Coastguard Worker 2729*6777b538SAndroid Build Coastguard Worker # All configs using /DEBUG should include this: 2730*6777b538SAndroid Build Coastguard Worker configs = [ ":win_pdbaltpath" ] 2731*6777b538SAndroid Build Coastguard Worker } else { 2732*6777b538SAndroid Build Coastguard Worker cflags = [] 2733*6777b538SAndroid Build Coastguard Worker if (is_mac && enable_dsyms) { 2734*6777b538SAndroid Build Coastguard Worker # If generating dSYMs, specify -fno-standalone-debug. This was 2735*6777b538SAndroid Build Coastguard Worker # originally specified for https://crbug.com/479841 because dsymutil 2736*6777b538SAndroid Build Coastguard Worker # could not handle a 4GB dSYM file. But dsymutil from Xcodes prior to 2737*6777b538SAndroid Build Coastguard Worker # version 7 also produces debug data that is incompatible with Breakpad 2738*6777b538SAndroid Build Coastguard Worker # dump_syms, so this is still required (https://crbug.com/622406). 2739*6777b538SAndroid Build Coastguard Worker cflags += [ "-fno-standalone-debug" ] 2740*6777b538SAndroid Build Coastguard Worker } 2741*6777b538SAndroid Build Coastguard Worker 2742*6777b538SAndroid Build Coastguard Worker # On aix -gdwarf causes linker failures due to thread_local variables. 2743*6777b538SAndroid Build Coastguard Worker if (!is_nacl && current_os != "aix") { 2744*6777b538SAndroid Build Coastguard Worker if (use_dwarf5) { 2745*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-5" ] 2746*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Zdwarf-version=5" ] 2747*6777b538SAndroid Build Coastguard Worker } else { 2748*6777b538SAndroid Build Coastguard Worker # Recent clang versions default to DWARF5 on Linux, and Android is about 2749*6777b538SAndroid Build Coastguard Worker # to switch. TODO: Adopt that in controlled way. For now, keep DWARF4. 2750*6777b538SAndroid Build Coastguard Worker # Apple platforms still default to 4 in clang, so they don't need the 2751*6777b538SAndroid Build Coastguard Worker # cflags. 2752*6777b538SAndroid Build Coastguard Worker if (!is_apple) { 2753*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-4" ] 2754*6777b538SAndroid Build Coastguard Worker } 2755*6777b538SAndroid Build Coastguard Worker 2756*6777b538SAndroid Build Coastguard Worker # On Apple, rustc defaults to DWARF2 so it needs to be told how to 2757*6777b538SAndroid Build Coastguard Worker # match clang. 2758*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Zdwarf-version=4" ] 2759*6777b538SAndroid Build Coastguard Worker } 2760*6777b538SAndroid Build Coastguard Worker } 2761*6777b538SAndroid Build Coastguard Worker 2762*6777b538SAndroid Build Coastguard Worker # The gcc-based nacl compilers don't support -fdebug-compilation-dir (see 2763*6777b538SAndroid Build Coastguard Worker # elsewhere in this file), so they can't have build-dir-independent output. 2764*6777b538SAndroid Build Coastguard Worker # Moreover pnacl does not support newer flags such as -fdebug-prefix-map 2765*6777b538SAndroid Build Coastguard Worker # Disable symbols for nacl object files to get deterministic, 2766*6777b538SAndroid Build Coastguard Worker # build-directory-independent output. 2767*6777b538SAndroid Build Coastguard Worker # Keeping -g2 for saigo as it's the only toolchain whose artifacts that are 2768*6777b538SAndroid Build Coastguard Worker # part of chromium release (other nacl toolchains are used only for tests). 2769*6777b538SAndroid Build Coastguard Worker if ((!is_nacl || is_nacl_saigo) && current_os != "zos") { 2770*6777b538SAndroid Build Coastguard Worker cflags += [ "-g2" ] 2771*6777b538SAndroid Build Coastguard Worker } 2772*6777b538SAndroid Build Coastguard Worker 2773*6777b538SAndroid Build Coastguard Worker if (!is_nacl && is_clang && !is_tsan && !is_asan) { 2774*6777b538SAndroid Build Coastguard Worker # gcc generates dwarf-aranges by default on -g1 and -g2. On clang it has 2775*6777b538SAndroid Build Coastguard Worker # to be manually enabled. 2776*6777b538SAndroid Build Coastguard Worker # 2777*6777b538SAndroid Build Coastguard Worker # It is skipped in tsan and asan because enabling it causes some 2778*6777b538SAndroid Build Coastguard Worker # formatting changes in the output which would require fixing bunches 2779*6777b538SAndroid Build Coastguard Worker # of expectation regexps. 2780*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-aranges" ] 2781*6777b538SAndroid Build Coastguard Worker } 2782*6777b538SAndroid Build Coastguard Worker 2783*6777b538SAndroid Build Coastguard Worker if (is_apple) { 2784*6777b538SAndroid Build Coastguard Worker swiftflags = [ "-g" ] 2785*6777b538SAndroid Build Coastguard Worker } 2786*6777b538SAndroid Build Coastguard Worker 2787*6777b538SAndroid Build Coastguard Worker if (use_debug_fission) { 2788*6777b538SAndroid Build Coastguard Worker cflags += [ "-gsplit-dwarf" ] 2789*6777b538SAndroid Build Coastguard Worker } 2790*6777b538SAndroid Build Coastguard Worker asmflags = cflags 2791*6777b538SAndroid Build Coastguard Worker ldflags = [] 2792*6777b538SAndroid Build Coastguard Worker 2793*6777b538SAndroid Build Coastguard Worker # Split debug info with all thinlto builds except nacl and apple. 2794*6777b538SAndroid Build Coastguard Worker # thinlto requires -gsplit-dwarf in ldflags. 2795*6777b538SAndroid Build Coastguard Worker if (use_debug_fission && use_thin_lto && !is_nacl && !is_apple) { 2796*6777b538SAndroid Build Coastguard Worker ldflags += [ "-gsplit-dwarf" ] 2797*6777b538SAndroid Build Coastguard Worker } 2798*6777b538SAndroid Build Coastguard Worker 2799*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Figure out if there's a way to make this go for 32-bit, 2800*6777b538SAndroid Build Coastguard Worker # currently we get "warning: 2801*6777b538SAndroid Build Coastguard Worker # obj/native_client/src/trusted/service_runtime/sel_asm/nacl_switch_32.o: 2802*6777b538SAndroid Build Coastguard Worker # DWARF info may be corrupt; offsets in a range list entry are in different 2803*6777b538SAndroid Build Coastguard Worker # sections" there. Maybe just a bug in nacl_switch_32.S. 2804*6777b538SAndroid Build Coastguard Worker _enable_gdb_index = 2805*6777b538SAndroid Build Coastguard Worker symbol_level == 2 && !is_apple && !is_nacl && current_cpu != "x86" && 2806*6777b538SAndroid Build Coastguard Worker current_os != "zos" && (use_gold || use_lld) && 2807*6777b538SAndroid Build Coastguard Worker # Disable on non-fission 32-bit Android because it pushes 2808*6777b538SAndroid Build Coastguard Worker # libcomponents_unittests over the 4gb size limit. 2809*6777b538SAndroid Build Coastguard Worker !(is_android && !use_debug_fission && current_cpu != "x64" && 2810*6777b538SAndroid Build Coastguard Worker current_cpu != "arm64") 2811*6777b538SAndroid Build Coastguard Worker if (_enable_gdb_index) { 2812*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2813*6777b538SAndroid Build Coastguard Worker # This flag enables the GNU-format pubnames and pubtypes sections, 2814*6777b538SAndroid Build Coastguard Worker # which lld needs in order to generate a correct GDB index. 2815*6777b538SAndroid Build Coastguard Worker # TODO(pcc): Try to make lld understand non-GNU-format pubnames 2816*6777b538SAndroid Build Coastguard Worker # sections (llvm.org/PR34820). 2817*6777b538SAndroid Build Coastguard Worker cflags += [ "-ggnu-pubnames" ] 2818*6777b538SAndroid Build Coastguard Worker } 2819*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--gdb-index" ] 2820*6777b538SAndroid Build Coastguard Worker } 2821*6777b538SAndroid Build Coastguard Worker } 2822*6777b538SAndroid Build Coastguard Worker 2823*6777b538SAndroid Build Coastguard Worker configs = [] 2824*6777b538SAndroid Build Coastguard Worker 2825*6777b538SAndroid Build Coastguard Worker # Compress debug on 32-bit ARM to stay under 4GB for ChromeOS 2826*6777b538SAndroid Build Coastguard Worker # https://b/243982712. 2827*6777b538SAndroid Build Coastguard Worker if (symbol_level == 2 && is_chromeos_device && !use_debug_fission && 2828*6777b538SAndroid Build Coastguard Worker !is_nacl && current_cpu == "arm") { 2829*6777b538SAndroid Build Coastguard Worker configs += [ "//build/config:compress_debug_sections" ] 2830*6777b538SAndroid Build Coastguard Worker } 2831*6777b538SAndroid Build Coastguard Worker 2832*6777b538SAndroid Build Coastguard Worker if (is_clang && (!is_nacl || is_nacl_saigo) && current_os != "zos") { 2833*6777b538SAndroid Build Coastguard Worker if (is_apple) { 2834*6777b538SAndroid Build Coastguard Worker # TODO(https://crbug.com/1050118): Investigate missing debug info on mac. 2835*6777b538SAndroid Build Coastguard Worker # Make sure we don't use constructor homing on mac. 2836*6777b538SAndroid Build Coastguard Worker cflags += [ 2837*6777b538SAndroid Build Coastguard Worker "-Xclang", 2838*6777b538SAndroid Build Coastguard Worker "-debug-info-kind=limited", 2839*6777b538SAndroid Build Coastguard Worker ] 2840*6777b538SAndroid Build Coastguard Worker } else { 2841*6777b538SAndroid Build Coastguard Worker # Use constructor homing for debug info. This option reduces debug info 2842*6777b538SAndroid Build Coastguard Worker # by emitting class type info only when constructors are emitted. 2843*6777b538SAndroid Build Coastguard Worker cflags += [ 2844*6777b538SAndroid Build Coastguard Worker "-Xclang", 2845*6777b538SAndroid Build Coastguard Worker "-fuse-ctor-homing", 2846*6777b538SAndroid Build Coastguard Worker ] 2847*6777b538SAndroid Build Coastguard Worker } 2848*6777b538SAndroid Build Coastguard Worker } 2849*6777b538SAndroid Build Coastguard Worker rustflags += [ "-g" ] 2850*6777b538SAndroid Build Coastguard Worker} 2851*6777b538SAndroid Build Coastguard Worker 2852*6777b538SAndroid Build Coastguard Worker# Minimal symbols. 2853*6777b538SAndroid Build Coastguard Worker# This config guarantees to hold symbol for stack trace which are shown to user 2854*6777b538SAndroid Build Coastguard Worker# when crash happens in unittests running on buildbot. 2855*6777b538SAndroid Build Coastguard Workerconfig("minimal_symbols") { 2856*6777b538SAndroid Build Coastguard Worker rustflags = [] 2857*6777b538SAndroid Build Coastguard Worker if (is_win) { 2858*6777b538SAndroid Build Coastguard Worker # Functions, files, and line tables only. 2859*6777b538SAndroid Build Coastguard Worker cflags = [] 2860*6777b538SAndroid Build Coastguard Worker 2861*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2862*6777b538SAndroid Build Coastguard Worker cflags += [ 2863*6777b538SAndroid Build Coastguard Worker # Disable putting the compiler command line into the debug info to 2864*6777b538SAndroid Build Coastguard Worker # prevent some types of non-determinism. 2865*6777b538SAndroid Build Coastguard Worker "-gno-codeview-command-line", 2866*6777b538SAndroid Build Coastguard Worker ] 2867*6777b538SAndroid Build Coastguard Worker } 2868*6777b538SAndroid Build Coastguard Worker if (is_clang && use_lld && use_ghash) { 2869*6777b538SAndroid Build Coastguard Worker cflags += [ "-gcodeview-ghash" ] 2870*6777b538SAndroid Build Coastguard Worker ldflags = [ "/DEBUG:GHASH" ] 2871*6777b538SAndroid Build Coastguard Worker } else { 2872*6777b538SAndroid Build Coastguard Worker ldflags = [ "/DEBUG" ] 2873*6777b538SAndroid Build Coastguard Worker } 2874*6777b538SAndroid Build Coastguard Worker 2875*6777b538SAndroid Build Coastguard Worker # All configs using /DEBUG should include this: 2876*6777b538SAndroid Build Coastguard Worker configs = [ ":win_pdbaltpath" ] 2877*6777b538SAndroid Build Coastguard Worker 2878*6777b538SAndroid Build Coastguard Worker # Enable line tables for clang. MSVC doesn't have an equivalent option. 2879*6777b538SAndroid Build Coastguard Worker if (is_clang) { 2880*6777b538SAndroid Build Coastguard Worker # -gline-tables-only is the same as -g1, but clang-cl only exposes the 2881*6777b538SAndroid Build Coastguard Worker # former. 2882*6777b538SAndroid Build Coastguard Worker cflags += [ "-gline-tables-only" ] 2883*6777b538SAndroid Build Coastguard Worker } 2884*6777b538SAndroid Build Coastguard Worker } else { 2885*6777b538SAndroid Build Coastguard Worker cflags = [] 2886*6777b538SAndroid Build Coastguard Worker if (is_mac && !use_dwarf5) { 2887*6777b538SAndroid Build Coastguard Worker # clang defaults to DWARF2 on macOS unless mac_deployment_target is 2888*6777b538SAndroid Build Coastguard Worker # at least 10.11. 2889*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Remove this once mac_deployment_target is 10.11. 2890*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-4" ] 2891*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Zdwarf-version=4" ] 2892*6777b538SAndroid Build Coastguard Worker } else if (!use_dwarf5 && !is_nacl && current_os != "aix") { 2893*6777b538SAndroid Build Coastguard Worker # On aix -gdwarf causes linker failures due to thread_local variables. 2894*6777b538SAndroid Build Coastguard Worker # Recent clang versions default to DWARF5 on Linux, and Android is about 2895*6777b538SAndroid Build Coastguard Worker # to switch. TODO: Adopt that in controlled way. 2896*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-4" ] 2897*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Zdwarf-version=4" ] 2898*6777b538SAndroid Build Coastguard Worker } 2899*6777b538SAndroid Build Coastguard Worker 2900*6777b538SAndroid Build Coastguard Worker if (use_dwarf5 && !is_nacl) { 2901*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-5" ] 2902*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Zdwarf-version=5" ] 2903*6777b538SAndroid Build Coastguard Worker } 2904*6777b538SAndroid Build Coastguard Worker 2905*6777b538SAndroid Build Coastguard Worker # The gcc-based nacl compilers don't support -fdebug-compilation-dir (see 2906*6777b538SAndroid Build Coastguard Worker # elsewhere in this file), so they can't have build-dir-independent output. 2907*6777b538SAndroid Build Coastguard Worker # Moreover pnacl does not support newer flags such as -fdebug-prefix-map 2908*6777b538SAndroid Build Coastguard Worker # Disable symbols for nacl object files to get deterministic, 2909*6777b538SAndroid Build Coastguard Worker # build-directory-independent output. 2910*6777b538SAndroid Build Coastguard Worker # Keeping -g1 for saigo as it's the only toolchain whose artifacts that are 2911*6777b538SAndroid Build Coastguard Worker # part of chromium release (other nacl toolchains are used only for tests). 2912*6777b538SAndroid Build Coastguard Worker if (!is_nacl || is_nacl_saigo) { 2913*6777b538SAndroid Build Coastguard Worker cflags += [ "-g1" ] 2914*6777b538SAndroid Build Coastguard Worker } 2915*6777b538SAndroid Build Coastguard Worker 2916*6777b538SAndroid Build Coastguard Worker if (!is_nacl && is_clang && !is_tsan && !is_asan) { 2917*6777b538SAndroid Build Coastguard Worker # See comment for -gdwarf-aranges in config("symbols"). 2918*6777b538SAndroid Build Coastguard Worker cflags += [ "-gdwarf-aranges" ] 2919*6777b538SAndroid Build Coastguard Worker } 2920*6777b538SAndroid Build Coastguard Worker 2921*6777b538SAndroid Build Coastguard Worker ldflags = [] 2922*6777b538SAndroid Build Coastguard Worker if (is_android && is_clang) { 2923*6777b538SAndroid Build Coastguard Worker # Android defaults to symbol_level=1 builds, but clang, unlike gcc, 2924*6777b538SAndroid Build Coastguard Worker # doesn't emit DW_AT_linkage_name in -g1 builds. 2925*6777b538SAndroid Build Coastguard Worker # -fdebug-info-for-profiling enables that (and a bunch of other things we 2926*6777b538SAndroid Build Coastguard Worker # don't need), so that we get qualified names in stacks. 2927*6777b538SAndroid Build Coastguard Worker # TODO(thakis): Consider making clang emit DW_AT_linkage_name in -g1 mode; 2928*6777b538SAndroid Build Coastguard Worker # failing that consider doing this on non-Android too. 2929*6777b538SAndroid Build Coastguard Worker cflags += [ "-fdebug-info-for-profiling" ] 2930*6777b538SAndroid Build Coastguard Worker } 2931*6777b538SAndroid Build Coastguard Worker 2932*6777b538SAndroid Build Coastguard Worker asmflags = cflags 2933*6777b538SAndroid Build Coastguard Worker } 2934*6777b538SAndroid Build Coastguard Worker rustflags += [ "-Cdebuginfo=1" ] 2935*6777b538SAndroid Build Coastguard Worker} 2936*6777b538SAndroid Build Coastguard Worker 2937*6777b538SAndroid Build Coastguard Worker# This configuration contains function names only. That is, the compiler is 2938*6777b538SAndroid Build Coastguard Worker# told to not generate debug information and the linker then just puts function 2939*6777b538SAndroid Build Coastguard Worker# names in the final debug information. 2940*6777b538SAndroid Build Coastguard Workerconfig("no_symbols") { 2941*6777b538SAndroid Build Coastguard Worker if (is_win) { 2942*6777b538SAndroid Build Coastguard Worker ldflags = [ "/DEBUG" ] 2943*6777b538SAndroid Build Coastguard Worker 2944*6777b538SAndroid Build Coastguard Worker # All configs using /DEBUG should include this: 2945*6777b538SAndroid Build Coastguard Worker configs = [ ":win_pdbaltpath" ] 2946*6777b538SAndroid Build Coastguard Worker } else { 2947*6777b538SAndroid Build Coastguard Worker cflags = [ "-g0" ] 2948*6777b538SAndroid Build Coastguard Worker asmflags = cflags 2949*6777b538SAndroid Build Coastguard Worker } 2950*6777b538SAndroid Build Coastguard Worker} 2951*6777b538SAndroid Build Coastguard Worker 2952*6777b538SAndroid Build Coastguard Worker# Default symbols. 2953*6777b538SAndroid Build Coastguard Workerconfig("default_symbols") { 2954*6777b538SAndroid Build Coastguard Worker if (symbol_level == 0) { 2955*6777b538SAndroid Build Coastguard Worker configs = [ ":no_symbols" ] 2956*6777b538SAndroid Build Coastguard Worker } else if (symbol_level == 1) { 2957*6777b538SAndroid Build Coastguard Worker configs = [ ":minimal_symbols" ] 2958*6777b538SAndroid Build Coastguard Worker } else if (symbol_level == 2) { 2959*6777b538SAndroid Build Coastguard Worker configs = [ ":symbols" ] 2960*6777b538SAndroid Build Coastguard Worker } else { 2961*6777b538SAndroid Build Coastguard Worker assert(false) 2962*6777b538SAndroid Build Coastguard Worker } 2963*6777b538SAndroid Build Coastguard Worker 2964*6777b538SAndroid Build Coastguard Worker # This config is removed by base unittests apk. 2965*6777b538SAndroid Build Coastguard Worker if (is_android && is_clang && strip_debug_info) { 2966*6777b538SAndroid Build Coastguard Worker configs += [ ":strip_debug" ] 2967*6777b538SAndroid Build Coastguard Worker } 2968*6777b538SAndroid Build Coastguard Worker} 2969*6777b538SAndroid Build Coastguard Worker 2970*6777b538SAndroid Build Coastguard Workerconfig("strip_debug") { 2971*6777b538SAndroid Build Coastguard Worker if (!defined(ldflags)) { 2972*6777b538SAndroid Build Coastguard Worker ldflags = [] 2973*6777b538SAndroid Build Coastguard Worker } 2974*6777b538SAndroid Build Coastguard Worker ldflags += [ "-Wl,--strip-debug" ] 2975*6777b538SAndroid Build Coastguard Worker} 2976*6777b538SAndroid Build Coastguard Worker 2977*6777b538SAndroid Build Coastguard Workerif (is_apple) { 2978*6777b538SAndroid Build Coastguard Worker # On macOS and iOS, this enables support for ARC (automatic reference 2979*6777b538SAndroid Build Coastguard Worker # counting). See http://clang.llvm.org/docs/AutomaticReferenceCounting.html. 2980*6777b538SAndroid Build Coastguard Worker # 2981*6777b538SAndroid Build Coastguard Worker # -fobjc-arc enables ARC overall. 2982*6777b538SAndroid Build Coastguard Worker # 2983*6777b538SAndroid Build Coastguard Worker # ARC does not add exception handlers to pure Objective-C code, but does add 2984*6777b538SAndroid Build Coastguard Worker # them to Objective-C++ code with the rationale that C++ pervasively adds them 2985*6777b538SAndroid Build Coastguard Worker # in for exception safety. However, exceptions are banned in Chromium code for 2986*6777b538SAndroid Build Coastguard Worker # C++ and exceptions in Objective-C code are intended to be fatal, so 2987*6777b538SAndroid Build Coastguard Worker # -fno-objc-arc-exceptions is specified to disable these unwanted exception 2988*6777b538SAndroid Build Coastguard Worker # handlers. 2989*6777b538SAndroid Build Coastguard Worker config("enable_arc") { 2990*6777b538SAndroid Build Coastguard Worker common_flags = [ 2991*6777b538SAndroid Build Coastguard Worker "-fobjc-arc", 2992*6777b538SAndroid Build Coastguard Worker "-fno-objc-arc-exceptions", 2993*6777b538SAndroid Build Coastguard Worker ] 2994*6777b538SAndroid Build Coastguard Worker cflags_objc = common_flags 2995*6777b538SAndroid Build Coastguard Worker cflags_objcc = common_flags 2996*6777b538SAndroid Build Coastguard Worker } 2997*6777b538SAndroid Build Coastguard Worker} 2998*6777b538SAndroid Build Coastguard Worker 2999*6777b538SAndroid Build Coastguard Workerif (is_android) { 3000*6777b538SAndroid Build Coastguard Worker # Use orderfile for linking Chrome on Android. 3001*6777b538SAndroid Build Coastguard Worker # This config enables using an orderfile for linking in LLD. 3002*6777b538SAndroid Build Coastguard Worker config("chrome_orderfile_config") { 3003*6777b538SAndroid Build Coastguard Worker # Don't try to use an orderfile with call graph sorting, except on Android, 3004*6777b538SAndroid Build Coastguard Worker # where we care about memory used by code, so we still want to mandate 3005*6777b538SAndroid Build Coastguard Worker # ordering. 3006*6777b538SAndroid Build Coastguard Worker if (chrome_orderfile_path != "") { 3007*6777b538SAndroid Build Coastguard Worker assert(use_lld) 3008*6777b538SAndroid Build Coastguard Worker _rebased_orderfile = rebase_path(chrome_orderfile_path, root_build_dir) 3009*6777b538SAndroid Build Coastguard Worker ldflags = [ 3010*6777b538SAndroid Build Coastguard Worker "-Wl,--symbol-ordering-file", 3011*6777b538SAndroid Build Coastguard Worker "-Wl,$_rebased_orderfile", 3012*6777b538SAndroid Build Coastguard Worker "-Wl,--no-warn-symbol-ordering", 3013*6777b538SAndroid Build Coastguard Worker ] 3014*6777b538SAndroid Build Coastguard Worker inputs = [ chrome_orderfile_path ] 3015*6777b538SAndroid Build Coastguard Worker } 3016*6777b538SAndroid Build Coastguard Worker } 3017*6777b538SAndroid Build Coastguard Worker} 3018*6777b538SAndroid Build Coastguard Worker 3019*6777b538SAndroid Build Coastguard Worker# Initialize all variables on the stack if needed. 3020*6777b538SAndroid Build Coastguard Workerconfig("default_init_stack_vars") { 3021*6777b538SAndroid Build Coastguard Worker cflags = [] 3022*6777b538SAndroid Build Coastguard Worker if (init_stack_vars && is_clang && !is_nacl && !using_sanitizer) { 3023*6777b538SAndroid Build Coastguard Worker if (init_stack_vars_zero) { 3024*6777b538SAndroid Build Coastguard Worker cflags += [ "-ftrivial-auto-var-init=zero" ] 3025*6777b538SAndroid Build Coastguard Worker } else { 3026*6777b538SAndroid Build Coastguard Worker cflags += [ "-ftrivial-auto-var-init=pattern" ] 3027*6777b538SAndroid Build Coastguard Worker } 3028*6777b538SAndroid Build Coastguard Worker } 3029*6777b538SAndroid Build Coastguard Worker} 3030*6777b538SAndroid Build Coastguard Worker 3031*6777b538SAndroid Build Coastguard Workerbuildflag_header("compiler_buildflags") { 3032*6777b538SAndroid Build Coastguard Worker header = "compiler_buildflags.h" 3033*6777b538SAndroid Build Coastguard Worker 3034*6777b538SAndroid Build Coastguard Worker flags = [ 3035*6777b538SAndroid Build Coastguard Worker "CLANG_PGO=$chrome_pgo_phase", 3036*6777b538SAndroid Build Coastguard Worker "SYMBOL_LEVEL=$symbol_level", 3037*6777b538SAndroid Build Coastguard Worker ] 3038*6777b538SAndroid Build Coastguard Worker} 3039*6777b538SAndroid Build Coastguard Worker 3040*6777b538SAndroid Build Coastguard Workerconfig("cet_shadow_stack") { 3041*6777b538SAndroid Build Coastguard Worker if (enable_cet_shadow_stack && is_win) { 3042*6777b538SAndroid Build Coastguard Worker assert(target_cpu == "x64") 3043*6777b538SAndroid Build Coastguard Worker ldflags = [ "/CETCOMPAT" ] 3044*6777b538SAndroid Build Coastguard Worker } 3045*6777b538SAndroid Build Coastguard Worker} 3046