xref: /aosp_15_r20/external/cronet/build/config/compiler/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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