# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/buildflag_header.gni")
import("//build/config/android/config.gni")
import("//build/config/c++/c++.gni")
import("//build/config/chrome_build.gni")
import("//build/config/chromecast_build.gni")
import("//build/config/chromeos/args.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/clang/clang.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/coverage/coverage.gni")
import("//build/config/dcheck_always_on.gni")
if (!is_starboard) {
  import("//build/config/gclient_args.gni")
}
import("//build/config/host_byteorder.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
import("//build/toolchain/cc_wrapper.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/rbe.gni")
import("//build/toolchain/toolchain.gni")
import("//build_overrides/build.gni")

if (current_cpu == "arm" || current_cpu == "arm64") {
  import("//build/config/arm.gni")
}
if (current_cpu == "mipsel" || current_cpu == "mips64el" ||
    current_cpu == "mips" || current_cpu == "mips64") {
  import("//build/config/mips.gni")
}
if (current_cpu == "x64") {
  import("//build/config/x64.gni")
}
if (is_mac) {
  import("//build/config/apple/symbols.gni")
}
if (is_ios) {
  import("//build/config/ios/ios_sdk.gni")
}
if (is_nacl) {
  # To keep NaCl variables out of builds that don't include NaCl, all
  # variables defined in nacl/config.gni referenced here should be protected by
  # is_nacl conditions.
  import("//build/config/nacl/config.gni")
}

declare_args() {
  # Normally, Android builds are lightly optimized, even for debug builds, to
  # keep binary size down. Setting this flag to true disables such optimization
  android_full_debug = false

  # Compile in such a way as to make it possible for the profiler to unwind full
  # stack frames. Setting this flag has a large effect on the performance of the
  # generated code than just setting profiling, but gives the profiler more
  # information to analyze.
  # Requires profiling to be set to true.
  enable_full_stack_frames_for_profiling = false

  # When we are going to use gold we need to find it.
  # This is initialized below, after use_gold might have been overridden.
  gold_path = ""

  # Enable fatal linker warnings. Building Chromium with certain versions
  # of binutils can cause linker warning.
  # TODO(thakis): Set this to true unconditionally once lld/MachO bring-up
  # is along far enough that it no longer emits linker warnings.
  fatal_linker_warnings = !(is_apple && use_lld)

  # Build with C++ RTTI enabled. Chromium builds without RTTI by default,
  # but some sanitizers are known to require it, like CFI diagnostics
  # and UBsan variants.
  use_rtti = use_cfi_diag || is_ubsan_vptr || is_ubsan_security

  # AFDO (Automatic Feedback Directed Optimizer) is a form of profile-guided
  # optimization that GCC supports. It used by ChromeOS in their official
  # builds. To use it, set auto_profile_path to the path to a file containing
  # the needed gcov profiling data.
  auto_profile_path = ""

  # Allow projects that wish to stay on C++11 to override Chromium's default.
  use_cxx11 = false

  # Path to an AFDO profile to use while building with clang, if any. Empty
  # implies none.
  clang_sample_profile_path = ""

  # Some configurations have default sample profiles. If this is true and
  # clang_sample_profile_path is empty, we'll fall back to the default.
  #
  # We currently only have default profiles for Chromium in-tree, so we disable
  # this by default for all downstream projects, since these profiles are likely
  # nonsensical for said projects.
  clang_use_default_sample_profile =
      chrome_pgo_phase == 0 && build_with_chromium && is_official_build &&
      (is_android || chromeos_is_browser_only || is_chromecast)

  # This configuration is used to select a default profile in Chrome OS based on
  # the microarchitectures we are using. This is only used if
  # clang_use_default_sample_profile is true and clang_sample_profile_path is
  # empty.
  chromeos_afdo_platform = "atom"

  # Emit debug information for profiling wile building with clang.
  clang_emit_debug_info_for_profiling = false

  # Turn this on to have the compiler output extra timing information.
  compiler_timing = false

  # Turn this on to use ghash feature of lld for faster debug link on Windows.
  # http://blog.llvm.org/2018/01/improving-link-time-on-windows-with.html
  use_ghash = true

  # Whether to enable ThinLTO optimizations. Turning ThinLTO optimizations on
  # can substantially increase link time and binary size, but they generally
  # also make binaries a fair bit faster.
  #
  # TODO(gbiv): We disable optimizations by default on most platforms because
  # the space overhead is too great. We should use some mixture of profiles and
  # optimization settings to better tune the size increase.
  thin_lto_enable_optimizations =
      (is_chromeos_ash || is_android || is_win || is_linux) && is_official_build

  # Initialize all local variables with a pattern. This flag will fill
  # uninitialized floating-point types (and 32-bit pointers) with 0xFF and the
  # rest with 0xAA. This makes behavior of uninitialized memory bugs consistent,
  # recognizable in the debugger, and crashes on memory accesses through
  # uninitialized pointers.
  #
  # TODO(crbug.com/1131993): Enabling this when 'is_android' is true breaks
  # content_shell_test_apk on both ARM and x86.
  #
  # TODO(crbug.com/977230): Enabling this when 'use_xcode_clang' is true may
  # call an old clang that doesn't support auto-init.
  init_stack_vars = !is_android && !use_xcode_clang

  # This argument is to control whether enabling text section splitting in the
  # final binary. When enabled, the separated text sections with prefix
  # '.text.hot', '.text.unlikely', '.text.startup' and '.text.exit' will not be
  # merged to '.text' section. This allows us to identify the hot code section
  # ('.text.hot') in the binary which may be mlocked or mapped to huge page to
  # reduce TLB misses which gives performance improvement on cpu usage.
  # The gold linker by default has text section splitting enabled.
  use_text_section_splitting = false

  # Token limits may not be accurate for build configs not covered by the CQ,
  # so only enable them by default for mainstream build configs.
  enable_wmax_tokens =
      !is_official_build &&
      ((is_mac && target_cpu == "x64" && !use_system_xcode) ||
       (is_linux && !is_chromeos && target_cpu == "x64") ||
       (is_win && target_cpu == "x86") || (is_win && target_cpu == "x64") ||
       (is_android && target_cpu == "arm") ||
       (is_android && target_cpu == "arm64"))

  # Turn off the --call-graph-profile-sort flag for lld by default. Enable
  # selectively for targets where it's beneficial.
  enable_call_graph_profile_sort = chrome_pgo_phase == 2

  # Enable DWARF v5.
  use_dwarf5 = false

  # Override this to put full paths to PDBs in Windows PE files. This helps
  # windbg and Windows Performance Analyzer with finding the PDBs in some local-
  # build scenarios. This is never needed for bots or official builds. Because
  # this puts the output directory in the DLLs/EXEs it breaks build determinism.
  # Bugs have been reported to the windbg/WPA teams and this workaround will be
  # removed when they are fixed.
  use_full_pdb_paths = false

  # Enable -H, which prints the include tree during compilation.
  # For use by tools/clang/scripts/analyze_includes.py
  show_includes = false
}

declare_args() {
  # C++11 may not be an option if Android test infrastructure is used.
  use_cxx11_on_android = use_cxx11
}

declare_args() {
  # Set to true to use icf, Identical Code Folding.
  #
  # icf=all is broken in older golds, see
  # https://sourceware.org/bugzilla/show_bug.cgi?id=17704
  # chromeos binutils has been patched with the fix, so always use icf there.
  # The bug only affects x86 and x64, so we can still use ICF when targeting
  # other architectures.
  #
  # lld doesn't have the bug.
  use_icf =
      (is_posix || is_fuchsia) && !is_debug && !using_sanitizer &&
      !use_clang_coverage && !(is_android && use_order_profiling) &&
      (use_lld || (use_gold && (is_chromeos_ash || !(current_cpu == "x86" ||
                                                     current_cpu == "x64"))))
}

if (is_android || (is_chromeos_ash && is_chromeos_device)) {
  # Set the path to use orderfile for linking Chrome
  # Note that this is for using only one orderfile for linking
  # the Chrome binary/library.
  declare_args() {
    chrome_orderfile_path = ""

    if (defined(default_chrome_orderfile)) {
      # Allow downstream tools to set orderfile path with
      # another variable.
      chrome_orderfile_path = default_chrome_orderfile
    } else if (is_chromeos_ash && is_chromeos_device) {
      chrome_orderfile_path = "//chromeos/profiles/chromeos.orderfile.txt"
    }
  }
}

assert(!(llvm_force_head_revision && use_goma),
       "can't use goma with trunk clang")
assert(!(llvm_force_head_revision && use_rbe), "can't use rbe with trunk clang")

# default_include_dirs ---------------------------------------------------------
#
# This is a separate config so that third_party code (which would not use the
# source root and might have conflicting versions of some headers) can remove
# this and specify their own include paths.
config("default_include_dirs") {
  include_dirs = [
    "//",
    root_gen_dir,
  ]
}

# compiler ---------------------------------------------------------------------
#
# Base compiler configuration.
#
# See also "runtime_library" below for related stuff and a discussion about
# where stuff should go. Put warning related stuff in the "warnings" config.

config("compiler") {
  asmflags = []
  cflags = []
  cflags_c = []
  cflags_cc = []
  cflags_objc = []
  cflags_objcc = []
  ldflags = []
  defines = []
  configs = []

  # System-specific flags. If your compiler flags apply to one of the
  # categories here, add it to the associated file to keep this shared config
  # smaller.
  if (is_win) {
    configs += [ "//build/config/win:compiler" ]
  } else if (is_android) {
    configs += [ "//build/config/android:compiler" ]
  } else if (is_linux || is_chromeos) {
    configs += [ "//build/config/linux:compiler" ]
    if (is_chromeos_ash) {
      configs += [ "//build/config/chromeos:compiler" ]
    }
  } else if (is_nacl) {
    configs += [ "//build/config/nacl:compiler" ]
  } else if (is_mac) {
    configs += [ "//build/config/mac:compiler" ]
  } else if (is_ios) {
    configs += [ "//build/config/ios:compiler" ]
  } else if (is_fuchsia) {
    configs += [ "//build/config/fuchsia:compiler" ]
  } else if (current_os == "aix") {
    configs += [ "//build/config/aix:compiler" ]
  }

  configs += [
    # See the definitions below.
    ":clang_revision",
    ":compiler_cpu_abi",
    ":compiler_codegen",
    ":compiler_deterministic",
  ]

  # Here we enable -fno-delete-null-pointer-checks, which makes various nullptr
  # operations (e.g. dereferencing) into defined behavior. This avoids deletion
  # of some security-critical code: see https://crbug.com/1139129.
  # Nacl does not support the flag. And, we still want UBSAN to catch undefined
  # behavior related to nullptrs, so do not add this flag if UBSAN is enabled.
  # GCC seems to have some bugs compiling constexpr code when this is defined,
  # so only enable it if using_clang. See: https://gcc.gnu.org/PR97913
  # TODO(mpdenton): remove is_clang once GCC bug is fixed.
  if (!is_nacl && !is_ubsan && is_clang) {
    cflags += [ "-fno-delete-null-pointer-checks" ]
  }

  # Don't emit the GCC version ident directives, they just end up in the
  # .comment section or debug info taking up binary size, and makes comparing
  # .o files built with different compiler versions harder.
  if (!is_win || is_clang) {
    cflags += [ "-fno-ident" ]
  }

  # In general, Windows is totally different, but all the other builds share
  # some common compiler and linker configuration.
  if (!is_win) {
    # Common POSIX compiler flags setup.
    # --------------------------------
    cflags += [ "-fno-strict-aliasing" ]  # See http://crbug.com/32204

    # Stack protection.
    if (is_mac) {
      # The strong variant of the stack protector significantly increases
      # binary size, so only enable it in debug mode.
      if (is_debug) {
        cflags += [ "-fstack-protector-strong" ]
      } else {
        cflags += [ "-fstack-protector" ]
      }
    } else if ((is_posix && !is_chromeos_ash && !is_nacl) || is_fuchsia) {
      # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it.
      # See also https://crbug.com/533294
      cflags += [ "--param=ssp-buffer-size=4" ]

      # The x86 toolchain currently has problems with stack-protector.
      if (is_android && current_cpu == "x86") {
        cflags += [ "-fno-stack-protector" ]
      } else if (current_os != "aix") {
        # Not available on aix.
        cflags += [ "-fstack-protector" ]
      }
    }

    if (use_lld) {
      ldflags += [ "-fuse-ld=lld" ]
    }

    # Linker warnings.
    if (fatal_linker_warnings && !is_apple && current_os != "aix") {
      ldflags += [ "-Wl,--fatal-warnings" ]
    }
    if (fatal_linker_warnings && is_apple) {
      ldflags += [ "-Wl,-fatal_warnings" ]
    }
  }

  if (is_clang && is_debug) {
    # Allow comparing the address of references and 'this' against 0
    # in debug builds. Technically, these can never be null in
    # well-defined C/C++ and Clang can optimize such checks away in
    # release builds, but they may be used in asserts in debug builds.
    cflags_cc += [
      "-Wno-undefined-bool-conversion",
      "-Wno-tautological-undefined-compare",
    ]
  }

  # Non-Mac Posix and Fuchsia compiler flags setup.
  # -----------------------------------
  if ((is_posix && !is_apple) || is_fuchsia) {
    if (enable_profiling) {
      if (!is_debug) {
        cflags += [ "-g" ]

        if (enable_full_stack_frames_for_profiling) {
          cflags += [
            "-fno-inline",
            "-fno-optimize-sibling-calls",
          ]
        }
      }
    }

    # Explicitly pass --build-id to ld. Compilers used to always pass this
    # implicitly but don't any more (in particular clang when built without
    # ENABLE_LINKER_BUILD_ID=ON).
    if (is_official_build) {
      # The sha1 build id has lower risk of collision but is more expensive to
      # compute, so only use it in the official build to avoid slowing down
      # links.
      ldflags += [ "-Wl,--build-id=sha1" ]
    } else if (current_os != "aix") {
      ldflags += [ "-Wl,--build-id" ]
    }

    if (!is_android) {
      defines += [
        # _FILE_OFFSET_BITS=64 should not be set on Android in order to maintain
        # the behavior of the Android NDK from earlier versions.
        # See https://android-developers.googleblog.com/2017/09/introducing-android-native-development.html
        "_FILE_OFFSET_BITS=64",
        "_LARGEFILE_SOURCE",
        "_LARGEFILE64_SOURCE",
      ]
    }

    if (!is_nacl) {
      if (exclude_unwind_tables) {
        cflags += [
          "-fno-unwind-tables",
          "-fno-asynchronous-unwind-tables",
        ]
        defines += [ "NO_UNWIND_TABLES" ]
      } else {
        cflags += [ "-funwind-tables" ]
      }
    }
  }

  # Linux/Android/Fuchsia common flags setup.
  # ---------------------------------
  if (is_linux || is_chromeos || is_android || is_fuchsia) {
    asmflags += [ "-fPIC" ]
    cflags += [ "-fPIC" ]
    ldflags += [ "-fPIC" ]

    if (!is_clang) {
      # Use pipes for communicating between sub-processes. Faster.
      # (This flag doesn't do anything with Clang.)
      cflags += [ "-pipe" ]
    }

    ldflags += [
      "-Wl,-z,noexecstack",
      "-Wl,-z,relro",
    ]

    if (!is_component_build) {
      ldflags += [ "-Wl,-z,now" ]
    }

    # Compiler instrumentation can introduce dependencies in DSOs to symbols in
    # the executable they are loaded into, so they are unresolved at link-time.
    if (!using_sanitizer) {
      ldflags += [
        "-Wl,-z,defs",
        "-Wl,--as-needed",
      ]
    }
  }

  # Linux-specific compiler flags setup.
  # ------------------------------------
  if ((is_posix || is_fuchsia) && use_lld) {
    if (current_cpu == "arm64") {
      # Reduce the page size from 65536 in order to reduce binary size slightly
      # by shrinking the alignment gap between segments. This also causes all
      # segments to be mapped adjacently, which breakpad relies on.
      ldflags += [ "-Wl,-z,max-page-size=4096" ]
    }
  } else if (use_gold) {
    ldflags += [ "-fuse-ld=gold" ]
    if (!is_android) {
      # On Android, this isn't needed.  gcc in the NDK knows to look next to
      # it with -fuse-ld=gold, and clang gets a --gcc-toolchain flag passed
      # above.
      if (gold_path != "") {
        ldflags += [ "-B$gold_path" ]
      }

      ldflags += [
        # Experimentation found that using four linking threads
        # saved ~20% of link time.
        # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36
        # Only apply this to the target linker, since the host
        # linker might not be gold, but isn't used much anyway.
        "-Wl,--threads",
        "-Wl,--thread-count=4",
      ]
    }

    # TODO(thestig): Make this flag work with GN.
    #if (!is_official_build && !is_chromeos && !(is_asan || is_lsan || is_tsan || is_msan)) {
    #  ldflags += [
    #    "-Wl,--detect-odr-violations",
    #  ]
    #}
  }

  if (use_icf && !is_apple) {
    ldflags += [ "-Wl,--icf=all" ]
  }

  if (is_linux || is_chromeos) {
    cflags += [ "-pthread" ]
    # Do not use the -pthread ldflag here since it becomes a no-op
    # when using -nodefaultlibs, which would cause an unused argument
    # error.  "-lpthread" is added in //build/config:default_libs.
  }

  # Clang-specific compiler flags setup.
  # ------------------------------------
  if (is_clang) {
    cflags += [ "-fcolor-diagnostics" ]

    # Enable -fmerge-all-constants. This used to be the default in clang
    # for over a decade. It makes clang non-conforming, but is fairly safe
    # in practice and saves some binary size. We might want to consider
    # disabling this (https://bugs.llvm.org/show_bug.cgi?id=18538#c13),
    # but for now it looks like our build might rely on it
    # (https://crbug.com/829795).
    cflags += [ "-fmerge-all-constants" ]
  }

  if (use_lld) {
    # TODO(thakis): Make the driver pass --color-diagnostics to the linker
    # if -fcolor-diagnostics is passed to it, and pass -fcolor-diagnostics
    # in ldflags instead.
    if (is_win) {
      # On Windows, we call the linker directly, instead of calling it through
      # the driver.
      ldflags += [ "--color-diagnostics" ]
    } else {
      ldflags += [ "-Wl,--color-diagnostics" ]
    }
  }

  # Enable text section splitting only on linux when using lld for now. Other
  # platforms can be added later if needed.
  if ((is_linux || is_chromeos) && use_lld && use_text_section_splitting) {
    ldflags += [ "-Wl,-z,keep-text-section-prefix" ]
  }

  if (is_clang && !is_nacl && !use_xcode_clang) {
    cflags += [ "-fcrash-diagnostics-dir=" + clang_diagnostic_dir ]

    # TODO(hans): Remove this once Clang generates better optimized debug info
    # by default. https://crbug.com/765793
    cflags += [
      "-mllvm",
      "-instcombine-lower-dbg-declare=0",
    ]
    if (!is_debug && use_thin_lto && is_a_target_toolchain) {
      if (is_win) {
        ldflags += [ "-mllvm:-instcombine-lower-dbg-declare=0" ]
      } else {
        ldflags += [ "-Wl,-mllvm,-instcombine-lower-dbg-declare=0" ]
      }
    }
  }

  # C11/C++11 compiler flags setup.
  # ---------------------------
  if (is_linux || is_chromeos || is_android || (is_nacl && is_clang) ||
      current_os == "aix") {
    if (target_os == "android") {
      cxx11_override = use_cxx11_on_android
    } else {
      cxx11_override = use_cxx11
    }

    if (is_clang) {
      standard_prefix = "c"

      # Since we build with -std=c* and not -std=gnu*, _GNU_SOURCE will not be
      # defined by the compiler.  However, lots of code relies on the
      # non-standard features that _GNU_SOURCE enables, so define it manually.
      defines += [ "_GNU_SOURCE" ]

      if (is_nacl) {
        # Undefine __STRICT_ANSI__ to get non-standard features which would
        # otherwise not be enabled by NaCl's sysroots.
        cflags += [ "-U__STRICT_ANSI__" ]
      }
    } else {
      # Gcc does not support ##__VA_ARGS__ when in standards-conforming mode,
      # but we use this feature in several places in Chromium.
      # TODO(thomasanderson): Replace usages of ##__VA_ARGS__ with the
      # standard-compliant __VA_OPT__ added by C++20, and switch the gcc build
      # to -std=c*.
      standard_prefix = "gnu"
    }

    cflags_c += [ "-std=${standard_prefix}11" ]
    if (cxx11_override) {
      # Override Chromium's default for projects that wish to stay on C++11.
      cflags_cc += [ "-std=${standard_prefix}++11" ]
    } else {
      cflags_cc += [ "-std=${standard_prefix}++14" ]
    }
  } else if (!is_win && !is_nacl) {
    if (target_os == "android") {
      cxx11_override = use_cxx11_on_android
    } else {
      cxx11_override = use_cxx11
    }

    # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either gnu11/gnu++11
    # or c11/c++11; we technically don't need this toolchain any more, but there
    # are still a few buildbots using it, so until those are turned off
    # we need the !is_nacl clause and the (is_nacl && is_clang) clause, above.
    cflags_c += [ "-std=c11" ]
    if (cxx11_override) {
      cflags_cc += [ "-std=c++11" ]
    } else {
      cflags_cc += [ "-std=c++14" ]
    }
  }

  # C++17 removes trigraph support, so preemptively disable trigraphs. This is
  # especially useful given the collision with ecmascript's logical assignment
  # operators: https://github.com/tc39/proposal-logical-assignment
  if (is_clang) {
    # clang-cl disables trigraphs by default
    if (!is_win) {
      # The gnu variants of C++11 and C++14 already disable trigraph support,
      # but when building with clang, we use -std=c++11 / -std=c++14, which
      # enables trigraph support: override that here.
      cflags_cc += [ "-fno-trigraphs" ]
    }

    # Don't warn that trigraphs are ignored, since trigraphs are disabled
    # anyway.
    cflags_cc += [ "-Wno-trigraphs" ]
  }

  if (is_mac) {
    # The system libc++ on Mac doesn't have aligned allocation in C++17.
    defines += [ "_LIBCPP_HAS_NO_ALIGNED_ALLOCATION" ]
    cflags_cc += [ "-stdlib=libc++" ]
    ldflags += [ "-stdlib=libc++" ]
  }

  # Add flags for link-time optimization. These flags enable
  # optimizations/transformations that require whole-program visibility at link
  # time, so they need to be applied to all translation units, and we may end up
  # with miscompiles if only part of the program is compiled with LTO flags. For
  # that reason, we cannot allow targets to enable or disable these flags, for
  # example by disabling the optimize configuration.
  # TODO(pcc): Make this conditional on is_official_build rather than on gn
  # flags for specific features.
  if (!is_debug && use_thin_lto && is_a_target_toolchain) {
    assert(use_lld, "LTO is only supported with lld")

    cflags += [
      "-flto=thin",
      "-fsplit-lto-unit",
    ]

    # Limit the size of the ThinLTO cache to the lesser of 10% of
    # available disk space, 40GB and 100000 files.
    cache_policy = "cache_size=10%:cache_size_bytes=40g:cache_size_files=100000"

    # TODO(gbiv): We ideally shouldn't need to specify this; ThinLTO
    # should be able to better manage binary size increases on its own.
    import_instr_limit = 5

    if (is_win) {
      ldflags += [
        "/opt:lldltojobs=all",
        "-mllvm:-import-instr-limit=$import_instr_limit",
        "/lldltocache:" +
            rebase_path("$root_out_dir/thinlto-cache", root_build_dir),
        "/lldltocachepolicy:$cache_policy",
      ]
    } else {
      ldflags += [ "-flto=thin" ]

      # Enabling ThinLTO on Chrome OS too, in an effort to reduce the memory
      # usage in crbug.com/1038040. Note this will increase build time in
      # Chrome OS.

      # In ThinLTO builds, we run at most one link process at a time,
      # and let it use all cores.
      # TODO(thakis): Check if '=0' (that is, number of cores, instead
      # of "all" which means number of hardware threads) is faster.
      ldflags += [ "-Wl,--thinlto-jobs=all" ]

      ldflags += [
        "-Wl,--thinlto-cache-dir=" +
            rebase_path("$root_out_dir/thinlto-cache", root_build_dir),
        "-Wl,--thinlto-cache-policy,$cache_policy",
      ]

      if (is_chromeos_ash) {
        # Not much performance difference was noted between the default (100)
        # and these. ARM was originally set lower than x86 to keep the size
        # bloat of ThinLTO to <10%, but that's potentially no longer true.
        # FIXME(inglorion): maybe tune these?
        if (target_cpu == "arm" || target_cpu == "arm64") {
          import_instr_limit = 20
        } else {
          import_instr_limit = 30
        }
      }

      ldflags += [ "-Wl,-mllvm,-import-instr-limit=$import_instr_limit" ]
    }

    # Whole-program devirtualization increases android libchrome.so size
    # by ~100kb on arm32 and reduces it by ~108kb on arm64 instead.
    # Tracked by llvm bug: https://bugs.llvm.org/show_bug.cgi?id=48245
    if (!is_android || current_cpu == "arm64") {
      cflags += [ "-fwhole-program-vtables" ]
      if (!is_win) {
        ldflags += [ "-fwhole-program-vtables" ]
      }
    }

    # This flag causes LTO to create an .ARM.attributes section with the correct
    # architecture. This is necessary because LLD will refuse to link a program
    # unless the architecture revision in .ARM.attributes is sufficiently new.
    # TODO(pcc): The contents of .ARM.attributes should be based on the
    # -march flag passed at compile time (see llvm.org/pr36291).
    if (current_cpu == "arm") {
      ldflags += [ "-march=$arm_arch" ]
    }
  }

  if (compiler_timing) {
    if (is_clang && !is_nacl) {
      cflags += [ "-ftime-trace" ]
    } else if (is_win) {
      cflags += [
        # "Documented" here:
        # http://aras-p.info/blog/2017/10/23/Best-unknown-MSVC-flag-d2cgsummary/
        "/d2cgsummary",
      ]
    }
  }

  # Pass flag to LLD so Android builds can allow debuggerd to properly symbolize
  # stack crashes (http://crbug.com/919499).
  if (use_lld && is_android) {
    ldflags += [ "-Wl,--no-rosegment" ]
  }

  # LLD does call-graph-sorted binary layout by default when profile data is
  # present. On Android this increases binary size due to more thinks for long
  # jumps. Turn it off by default and enable selectively for targets where it's
  # beneficial.
  if (use_lld && !enable_call_graph_profile_sort) {
    if (is_win) {
      ldflags += [ "/call-graph-profile-sort:no" ]
    } else if (!is_apple) {
      # TODO(thakis): Once LLD's Mach-O port basically works, implement call
      # graph profile sorting for it, add an opt-out flag, and pass it here.
      ldflags += [ "-Wl,--no-call-graph-profile-sort" ]
    }
  }

  if (is_clang && !is_nacl && show_includes) {
    assert(!is_win, "show_includes is not supported on Windows")
    cflags += [
      "-H",
      "-Xclang",
      "-show-skipped-includes",
    ]
  }

  # This flag enforces that member pointer base types are complete. It helps
  # prevent us from running into problems in the Microsoft C++ ABI (see
  # https://crbug.com/847724).
  # TODO(crbug/1052397): Remove is_chromeos_lacros once lacros-chrome switches
  # to target_os="chromeos".
  if (is_clang && !is_nacl && target_os != "chromeos" && !use_xcode_clang &&
      !is_chromeos_lacros && (is_win || use_custom_libcxx)) {
    cflags += [ "-fcomplete-member-pointers" ]
  }

  # Pass the same C/C++ flags to the objective C/C++ compiler.
  cflags_objc += cflags_c
  cflags_objcc += cflags_cc

  # Assign any flags set for the C compiler to asmflags so that they are sent
  # to the assembler. The Windows assembler takes different types of flags
  # so only do so for posix platforms.
  if (is_posix || is_fuchsia) {
    asmflags += cflags
    asmflags += cflags_c
  }
}

# The BUILDCONFIG file sets this config on targets by default, which means when
# building with ThinLTO, no optimization is performed in the link step.
config("thinlto_optimize_default") {
  if (!is_debug && use_thin_lto && is_a_target_toolchain) {
    lto_opt_level = 0

    if (is_win) {
      ldflags = [ "/opt:lldlto=" + lto_opt_level ]
    } else {
      ldflags = [ "-Wl,--lto-O" + lto_opt_level ]
    }
  }
}

# Use this to enable optimization in the ThinLTO link step for select targets
# when thin_lto_enable_optimizations is set by doing:
#
#   configs -= [ "//build/config/compiler:thinlto_optimize_default" ]
#   configs += [ "//build/config/compiler:thinlto_optimize_max" ]
#
# Since it makes linking significantly slower and more resource intensive, only
# use it on important targets such as the main browser executable or dll.
config("thinlto_optimize_max") {
  if (!is_debug && use_thin_lto && is_a_target_toolchain) {
    if (thin_lto_enable_optimizations) {
      lto_opt_level = 2
    } else {
      lto_opt_level = 0
    }

    if (is_win) {
      ldflags = [ "/opt:lldlto=" + lto_opt_level ]
    } else {
      ldflags = [ "-Wl,--lto-O" + lto_opt_level ]
    }
  }
}

# This provides the basic options to select the target CPU and ABI.
# It is factored out of "compiler" so that special cases can use this
# without using everything that "compiler" brings in.  Options that
# tweak code generation for a particular CPU do not belong here!
# See "compiler_codegen", below.
config("compiler_cpu_abi") {
  cflags = []
  ldflags = []
  defines = []

  if ((is_posix && !is_apple) || is_fuchsia) {
    # CPU architecture. We may or may not be doing a cross compile now, so for
    # simplicity we always explicitly set the architecture.
    if (current_cpu == "x64") {
      cflags += [
        "-m64",
        "-march=$x64_arch",
        "-msse3",
      ]
      ldflags += [ "-m64" ]
    } else if (current_cpu == "x86") {
      cflags += [ "-m32" ]
      ldflags += [ "-m32" ]
      if (!is_nacl) {
        cflags += [
          "-mfpmath=sse",
          "-msse3",
        ]
      }
    } else if (current_cpu == "arm") {
      if (is_clang && !is_android && !is_nacl) {
        cflags += [ "--target=arm-linux-gnueabihf" ]
        ldflags += [ "--target=arm-linux-gnueabihf" ]
      }
      if (!is_nacl) {
        cflags += [
          "-march=$arm_arch",
          "-mfloat-abi=$arm_float_abi",
        ]
      }
      if (arm_tune != "") {
        cflags += [ "-mtune=$arm_tune" ]
      }
    } else if (current_cpu == "arm64") {
      if (is_clang && !is_android && !is_nacl && !is_fuchsia) {
        cflags += [ "--target=aarch64-linux-gnu" ]
        ldflags += [ "--target=aarch64-linux-gnu" ]
      }
    } else if (current_cpu == "mipsel" && !is_nacl) {
      ldflags += [ "-Wl,--hash-style=sysv" ]
      if (custom_toolchain == "") {
        if (is_clang) {
          if (is_android) {
            cflags += [ "--target=mipsel-linux-android" ]
            ldflags += [ "--target=mipsel-linux-android" ]
          } else {
            cflags += [ "--target=mipsel-linux-gnu" ]
            ldflags += [ "--target=mipsel-linux-gnu" ]
          }
        } else {
          cflags += [ "-EL" ]
          ldflags += [ "-EL" ]
        }
      }

      if (mips_arch_variant == "r6") {
        cflags += [ "-mno-odd-spreg" ]
        ldflags += [ "-mips32r6" ]
        if (is_clang) {
          cflags += [
            "-march=mipsel",
            "-mcpu=mips32r6",
          ]
        } else {
          cflags += [
            "-mips32r6",
            "-Wa,-mips32r6",
          ]
          if (is_android) {
            ldflags += [ "-Wl,-melf32ltsmip" ]
          }
        }
        if (mips_use_msa == true) {
          cflags += [
            "-mmsa",
            "-mfp64",
          ]
        }
      } else if (mips_arch_variant == "r2") {
        ldflags += [ "-mips32r2" ]
        if (is_clang) {
          cflags += [
            "-march=mipsel",
            "-mcpu=mips32r2",
          ]
        } else {
          cflags += [
            "-mips32r2",
            "-Wa,-mips32r2",
          ]
          if (mips_float_abi == "hard" && mips_fpu_mode != "") {
            cflags += [ "-m$mips_fpu_mode" ]
          }
        }
      } else if (mips_arch_variant == "r1") {
        ldflags += [ "-mips32" ]
        if (is_clang) {
          cflags += [
            "-march=mipsel",
            "-mcpu=mips32",
          ]
        } else {
          cflags += [
            "-mips32",
            "-Wa,-mips32",
          ]
        }
      } else if (mips_arch_variant == "loongson3") {
        defines += [ "_MIPS_ARCH_LOONGSON" ]
        cflags += [
          "-march=loongson3a",
          "-mno-branch-likely",
          "-Wa,-march=loongson3a",
        ]
      }

      if (mips_dsp_rev == 1) {
        cflags += [ "-mdsp" ]
      } else if (mips_dsp_rev == 2) {
        cflags += [ "-mdspr2" ]
      }

      cflags += [ "-m${mips_float_abi}-float" ]
    } else if (current_cpu == "mips" && !is_nacl) {
      ldflags += [ "-Wl,--hash-style=sysv" ]
      if (custom_toolchain == "") {
        if (is_clang) {
          cflags += [ "--target=mips-linux-gnu" ]
          ldflags += [ "--target=mips-linux-gnu" ]
        } else {
          cflags += [ "-EB" ]
          ldflags += [ "-EB" ]
        }
      }

      if (mips_arch_variant == "r6") {
        cflags += [
          "-mips32r6",
          "-Wa,-mips32r6",
        ]
        if (mips_use_msa == true) {
          cflags += [
            "-mmsa",
            "-mfp64",
          ]
        }
      } else if (mips_arch_variant == "r2") {
        cflags += [
          "-mips32r2",
          "-Wa,-mips32r2",
        ]
        if (mips_float_abi == "hard" && mips_fpu_mode != "") {
          cflags += [ "-m$mips_fpu_mode" ]
        }
      } else if (mips_arch_variant == "r1") {
        cflags += [
          "-mips32",
          "-Wa,-mips32",
        ]
      }

      if (mips_dsp_rev == 1) {
        cflags += [ "-mdsp" ]
      } else if (mips_dsp_rev == 2) {
        cflags += [ "-mdspr2" ]
      }

      cflags += [ "-m${mips_float_abi}-float" ]
    } else if (current_cpu == "mips64el") {
      cflags += [ "-D__SANE_USERSPACE_TYPES__" ]
      ldflags += [ "-Wl,--hash-style=sysv" ]
      if (custom_toolchain == "") {
        if (is_clang) {
          if (is_android) {
            cflags += [ "--target=mips64el-linux-android" ]
            ldflags += [ "--target=mips64el-linux-android" ]
          } else {
            cflags += [ "--target=mips64el-linux-gnuabi64" ]
            ldflags += [ "--target=mips64el-linux-gnuabi64" ]
          }
        } else {
          cflags += [
            "-EL",
            "-mabi=64",
          ]
          ldflags += [
            "-EL",
            "-mabi=64",
          ]
        }
      }

      if (mips_arch_variant == "r6") {
        if (is_clang) {
          cflags += [
            "-march=mips64el",
            "-mcpu=mips64r6",
          ]
        } else {
          cflags += [
            "-mips64r6",
            "-Wa,-mips64r6",
          ]
          ldflags += [ "-mips64r6" ]
        }
        if (mips_use_msa == true) {
          cflags += [
            "-mmsa",
            "-mfp64",
          ]
        }
      } else if (mips_arch_variant == "r2") {
        ldflags += [ "-mips64r2" ]
        if (is_clang) {
          cflags += [
            "-march=mips64el",
            "-mcpu=mips64r2",
          ]
        } else {
          cflags += [
            "-mips64r2",
            "-Wa,-mips64r2",
          ]
        }
      } else if (mips_arch_variant == "loongson3") {
        defines += [ "_MIPS_ARCH_LOONGSON" ]
        cflags += [
          "-march=loongson3a",
          "-mno-branch-likely",
          "-Wa,-march=loongson3a",
        ]
      }
    } else if (current_cpu == "mips64") {
      ldflags += [ "-Wl,--hash-style=sysv" ]
      if (custom_toolchain == "") {
        if (is_clang) {
          cflags += [ "--target=mips64-linux-gnuabi64" ]
          ldflags += [ "--target=mips64-linux-gnuabi64" ]
        } else {
          cflags += [
            "-EB",
            "-mabi=64",
          ]
          ldflags += [
            "-EB",
            "-mabi=64",
          ]
        }
      }

      if (mips_arch_variant == "r6") {
        cflags += [
          "-mips64r6",
          "-Wa,-mips64r6",
        ]
        ldflags += [ "-mips64r6" ]

        if (mips_use_msa == true) {
          cflags += [
            "-mmsa",
            "-mfp64",
          ]
        }
      } else if (mips_arch_variant == "r2") {
        cflags += [
          "-mips64r2",
          "-Wa,-mips64r2",
        ]
        ldflags += [ "-mips64r2" ]
      }
    } else if (current_cpu == "pnacl" && is_nacl_nonsfi) {
      if (target_cpu == "x86" || target_cpu == "x64") {
        cflags += [
          "-arch",
          "x86-32-nonsfi",
          "--pnacl-bias=x86-32-nonsfi",
          "--target=i686-unknown-nacl",
        ]
        ldflags += [
          "-arch",
          "x86-32-nonsfi",
          "--target=i686-unknown-nacl",
        ]
      } else if (target_cpu == "arm") {
        cflags += [
          "-arch",
          "arm-nonsfi",
          "-mfloat-abi=hard",
          "--pnacl-bias=arm-nonsfi",
          "--target=armv7-unknown-nacl-gnueabihf",
        ]
        ldflags += [
          "-arch",
          "arm-nonsfi",
          "--target=armv7-unknown-nacl-gnueabihf",
        ]
      }
    } else if (current_cpu == "ppc64") {
      if (current_os == "aix") {
        cflags += [ "-maix64" ]
        ldflags += [ "-maix64" ]
      } else {
        cflags += [ "-m64" ]
        ldflags += [ "-m64" ]
      }
    } else if (current_cpu == "s390x") {
      cflags += [ "-m64" ]
      ldflags += [ "-m64" ]
    }
  }

  asmflags = cflags
}

# This provides options to tweak code generation that are necessary
# for particular Chromium code or for working around particular
# compiler bugs (or the combination of the two).
config("compiler_codegen") {
  configs = []
  cflags = []
  ldflags = []

  if (is_nacl) {
    configs += [ "//build/config/nacl:compiler_codegen" ]
  }

  if (current_cpu == "arm64" && is_android) {
    # On arm64 disable outlining for Android. See crbug.com/931297 for more
    # information.
    cflags += [ "-mno-outline" ]

    # This can be removed once https://bugs.llvm.org/show_bug.cgi?id=40348
    # has been resolved, and -mno-outline is obeyed by the linker during
    # ThinLTO.
    ldflags += [ "-Wl,-mllvm,-enable-machine-outliner=never" ]
  }

  asmflags = cflags
}

# This provides options that make the build deterministic, so that the same
# revision produces the same output, independent of the name of the build
# directory and of the computer the build is done on.
# The relative path from build dir to source dir makes it into the build
# outputs, so it's recommended that you use a build dir two levels deep
# (e.g. "out/Release") so that you get the same "../.." path as all the bots
# in your build outputs.
config("compiler_deterministic") {
  cflags = []
  ldflags = []

  # Eliminate build metadata (__DATE__, __TIME__ and __TIMESTAMP__) for
  # deterministic build.  See https://crbug.com/314403
  if (!is_official_build) {
    if (is_win && !is_clang) {
      cflags += [
        "/wd4117",  # Trying to define or undefine a predefined macro.
        "/D__DATE__=",
        "/D__TIME__=",
        "/D__TIMESTAMP__=",
      ]
    } else {
      cflags += [
        "-Wno-builtin-macro-redefined",
        "-D__DATE__=",
        "-D__TIME__=",
        "-D__TIMESTAMP__=",
      ]
    }
  }

  # Makes builds independent of absolute file path.
  if (is_clang && strip_absolute_paths_from_debug_symbols) {
    # If debug option is given, clang includes $cwd in debug info by default.
    # For such build, this flag generates reproducible obj files even we use
    # different build directory like "out/feature_a" and "out/feature_b" if
    # we build same files with same compile flag.
    # Other paths are already given in relative, no need to normalize them.
    cflags += [
      "-Xclang",
      "-fdebug-compilation-dir",
      "-Xclang",
      ".",
    ]
    if (!is_win) {
      # We don't use clang -cc1as on Windows (yet? https://crbug.com/762167)
      asmflags = [ "-Wa,-fdebug-compilation-dir,." ]
    }

    if (is_win && use_lld) {
      if (symbol_level == 2 || (is_clang && using_sanitizer)) {
        # Absolutize source file paths for PDB. Pass the real build directory
        # if the pdb contains source-level debug information and if linker
        # reproducibility is not critical.
        ldflags += [ "/PDBSourcePath:" + rebase_path(root_build_dir) ]
      } else {
        # Use a fake fixed base directory for paths in the pdb to make the pdb
        # output fully deterministic and independent of the build directory.
        ldflags += [ "/PDBSourcePath:o:\fake\prefix" ]
      }
    }
  }

  # Tells the compiler not to use absolute paths when passing the default
  # paths to the tools it invokes. We don't want this because we don't
  # really need it and it can mess up the goma cache entries.
  if (is_clang && !is_nacl) {
    cflags += [ "-no-canonical-prefixes" ]
  }
}

config("clang_revision") {
  if (!is_starboard && is_clang && clang_base_path == default_clang_base_path) {
    update_args = [
      "--print-revision",
      "--verify-version=$clang_version",
    ]
    if (llvm_force_head_revision) {
      update_args += [ "--llvm-force-head-revision" ]
    }
    clang_revision = exec_script("//tools/clang/scripts/update.py",
                                 update_args,
                                 "trim string")

    # This is here so that all files get recompiled after a clang roll and
    # when turning clang on or off. (defines are passed via the command line,
    # and build system rebuild things when their commandline changes). Nothing
    # should ever read this define.
    defines = [ "CR_CLANG_REVISION=\"$clang_revision\"" ]
  }
}

config("compiler_arm_fpu") {
  if (current_cpu == "arm" && !is_ios && !is_nacl) {
    cflags = [ "-mfpu=$arm_fpu" ]
    if (!arm_use_thumb) {
      cflags += [ "-marm" ]
    }
    asmflags = cflags
  }
}

config("compiler_arm_thumb") {
  if (current_cpu == "arm" && arm_use_thumb && is_posix &&
      !(is_apple || is_nacl)) {
    cflags = [ "-mthumb" ]
  }
}

config("compiler_arm") {
  if (current_cpu == "arm" && (is_chromeos_ash || is_chromeos_lacros)) {
    # arm is normally the default mode for clang, but on chromeos a wrapper
    # is used to pass -mthumb, and therefor change the default.
    cflags = [ "-marm" ]
  }
}

# runtime_library -------------------------------------------------------------
#
# Sets the runtime library and associated options.
#
# How do you determine what should go in here vs. "compiler" above? Consider if
# a target might choose to use a different runtime library (ignore for a moment
# if this is possible or reasonable on your system). If such a target would want
# to change or remove your option, put it in the runtime_library config. If a
# target wants the option regardless, put it in the compiler config.

config("runtime_library") {
  configs = []

  # The order of this config is important: it must appear before
  # android:runtime_library.  This is to ensure libc++ appears before
  # libandroid_support in the -isystem include order.  Otherwise, there will be
  # build errors related to symbols declared in math.h.
  if (use_custom_libcxx) {
    configs += [ "//build/config/c++:runtime_library" ]
  }

  # TODO(crbug.com/830987): Come up with a better name for is POSIX + Fuchsia
  # configuration.
  if (is_posix || is_fuchsia) {
    configs += [ "//build/config/posix:runtime_library" ]
  }

  # System-specific flags. If your compiler flags apply to one of the
  # categories here, add it to the associated file to keep this shared config
  # smaller.
  if (is_win) {
    configs += [ "//build/config/win:runtime_library" ]
  } else if (is_linux || is_chromeos) {
    configs += [ "//build/config/linux:runtime_library" ]
  } else if (is_ios) {
    configs += [ "//build/config/ios:runtime_library" ]
  } else if (is_mac) {
    configs += [ "//build/config/mac:runtime_library" ]
  } else if (is_android) {
    configs += [ "//build/config/android:runtime_library" ]
  }

  if (is_component_build) {
    defines = [ "COMPONENT_BUILD" ]
  }
}

# default_warnings ------------------------------------------------------------
#
# Collects all warning flags that are used by default.  This is used as a
# subconfig of both chromium_code and no_chromium_code.  This way these
# flags are guaranteed to appear on the compile command line after -Wall.
config("default_warnings") {
  cflags = []
  cflags_c = []
  cflags_cc = []
  ldflags = []

  if (is_win) {
    if (treat_warnings_as_errors) {
      cflags += [ "/WX" ]
    }
    if (fatal_linker_warnings) {
      ldflags = [ "/WX" ]
    }

    cflags += [
      # Warnings permanently disabled:

      # C4091: 'typedef ': ignored on left of 'X' when no variable is
      #                    declared.
      # This happens in a number of Windows headers. Dumb.
      "/wd4091",

      # C4127: conditional expression is constant
      # This warning can in theory catch dead code and other problems, but
      # triggers in far too many desirable cases where the conditional
      # expression is either set by macros or corresponds some legitimate
      # compile-time constant expression (due to constant template args,
      # conditionals comparing the sizes of different types, etc.).  Some of
      # these can be worked around, but it's not worth it.
      "/wd4127",

      # C4251: 'identifier' : class 'type' needs to have dll-interface to be
      #        used by clients of class 'type2'
      # This is necessary for the shared library build.
      "/wd4251",

      # C4275:  non dll-interface class used as base for dll-interface class
      # This points out a potential (but rare) problem with referencing static
      # fields of a non-exported base, through the base's non-exported inline
      # functions, or directly. The warning is subtle enough that people just
      # suppressed it when they saw it, so it's not worth it.
      "/wd4275",

      # C4312 is a VS 2015 64-bit warning for integer to larger pointer.
      # TODO(brucedawson): fix warnings, crbug.com/554200
      "/wd4312",

      # C4324 warns when padding is added to fulfill alignas requirements,
      # but can trigger in benign cases that are difficult to individually
      # suppress.
      "/wd4324",

      # C4351: new behavior: elements of array 'array' will be default
      #        initialized
      # This is a silly "warning" that basically just alerts you that the
      # compiler is going to actually follow the language spec like it's
      # supposed to, instead of not following it like old buggy versions did.
      # There's absolutely no reason to turn this on.
      "/wd4351",

      # C4355: 'this': used in base member initializer list
      # It's commonly useful to pass |this| to objects in a class' initializer
      # list.  While this warning can catch real bugs, most of the time the
      # constructors in question don't attempt to call methods on the passed-in
      # pointer (until later), and annotating every legit usage of this is
      # simply more hassle than the warning is worth.
      "/wd4355",

      # C4503: 'identifier': decorated name length exceeded, name was
      #        truncated
      # This only means that some long error messages might have truncated
      # identifiers in the presence of lots of templates.  It has no effect on
      # program correctness and there's no real reason to waste time trying to
      # prevent it.
      "/wd4503",

      # Warning C4589 says: "Constructor of abstract class ignores
      # initializer for virtual base class." Disable this warning because it
      # is flaky in VS 2015 RTM. It triggers on compiler generated
      # copy-constructors in some cases.
      "/wd4589",

      # C4611: interaction between 'function' and C++ object destruction is
      #        non-portable
      # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN
      # suggests using exceptions instead of setjmp/longjmp for C++, but
      # Chromium code compiles without exception support.  We therefore have to
      # use setjmp/longjmp for e.g. JPEG decode error handling, which means we
      # have to turn off this warning (and be careful about how object
      # destruction happens in such cases).
      "/wd4611",

      # Warnings to evaluate and possibly fix/reenable later:

      "/wd4100",  # Unreferenced formal function parameter.
      "/wd4121",  # Alignment of a member was sensitive to packing.
      "/wd4244",  # Conversion: possible loss of data.
      "/wd4505",  # Unreferenced local function has been removed.
      "/wd4510",  # Default constructor could not be generated.
      "/wd4512",  # Assignment operator could not be generated.
      "/wd4610",  # Class can never be instantiated, constructor required.
      "/wd4838",  # Narrowing conversion. Doesn't seem to be very useful.
      "/wd4995",  # 'X': name was marked as #pragma deprecated
      "/wd4996",  # Deprecated function warning.

      # These are variable shadowing warnings that are new in VS2015. We
      # should work through these at some point -- they may be removed from
      # the RTM release in the /W4 set.
      "/wd4456",
      "/wd4457",
      "/wd4458",
      "/wd4459",

      # All of our compilers support the extensions below.
      "/wd4200",  # nonstandard extension used: zero-sized array in struct/union
      "/wd4201",  # nonstandard extension used: nameless struct/union
      "/wd4204",  # nonstandard extension used : non-constant aggregate
                  # initializer

      "/wd4221",  # nonstandard extension used : 'identifier' : cannot be
                  # initialized using address of automatic variable

      # http://crbug.com/588506 - Conversion suppressions waiting on Clang
      # -Wconversion.
      "/wd4245",  # 'conversion' : conversion from 'type1' to 'type2',
                  # signed/unsigned mismatch

      "/wd4267",  # 'var' : conversion from 'size_t' to 'type', possible loss of
                  # data

      "/wd4305",  # 'identifier' : truncation from 'type1' to 'type2'
      "/wd4389",  # 'operator' : signed/unsigned mismatch

      "/wd4702",  # unreachable code

      # http://crbug.com/848979 - MSVC is more conservative than Clang with
      # regards to variables initialized and consumed in different branches.
      "/wd4701",  # Potentially uninitialized local variable 'name' used
      "/wd4703",  # Potentially uninitialized local pointer variable 'name' used

      # http://crbug.com/848979 - Remaining Clang permitted warnings.
      "/wd4661",  # 'identifier' : no suitable definition provided for explicit
                  # template instantiation request

      "/wd4706",  # assignment within conditional expression
                  # MSVC is stricter and requires a boolean expression.

      "/wd4715",  # 'function' : not all control paths return a value'
                  # MSVC does not analyze switch (enum) for completeness.
    ]

    cflags_cc += [
      # Allow "noexcept" annotations even though we compile with exceptions
      # disabled.
      "/wd4577",
    ]

    if (current_cpu == "x86") {
      cflags += [
        # VC++ 2015 changes 32-bit size_t truncation warnings from 4244 to
        # 4267. Example: short TruncTest(size_t x) { return x; }
        # Since we disable 4244 we need to disable 4267 during migration.
        # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
        "/wd4267",
      ]
    }
  } else {
    if (is_apple && !is_nacl) {
      # When compiling Objective-C, warns if a method is used whose
      # availability is newer than the deployment target.
      cflags += [ "-Wunguarded-availability" ]
    }

    if (is_ios) {
      # When compiling Objective-C, warns if a selector named via @selector has
      # not been defined in any visible interface.
      cflags += [ "-Wundeclared-selector" ]
    }

    # Suppress warnings about ABI changes on ARM (Clang doesn't give this
    # warning).
    if (current_cpu == "arm" && !is_clang) {
      cflags += [ "-Wno-psabi" ]
    }

    if (!is_clang) {
      cflags_cc += [
        # See comment for -Wno-c++11-narrowing.
        "-Wno-narrowing",
      ]

      # -Wno-class-memaccess warns about hash table and vector in blink.
      # But the violation is intentional.
      if (!is_nacl) {
        cflags_cc += [ "-Wno-class-memaccess" ]
      }

      # -Wunused-local-typedefs is broken in gcc,
      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63872
      cflags += [ "-Wno-unused-local-typedefs" ]

      # Don't warn about "maybe" uninitialized. Clang doesn't include this
      # in -Wall but gcc does, and it gives false positives.
      cflags += [ "-Wno-maybe-uninitialized" ]
      cflags += [ "-Wno-deprecated-declarations" ]

      # -Wcomment gives too many false positives in the case a
      # backslash ended comment line is followed by a new line of
      # comments
      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61638
      cflags += [ "-Wno-comments" ]

      # -Wpacked-not-aligned complains all generated mojom-shared-internal.h
      # files.
      cflags += [ "-Wno-packed-not-aligned" ]
    }
  }

  # Common Clang and GCC warning setup.
  if (!is_win || is_clang) {
    cflags += [
      # Disables.
      "-Wno-missing-field-initializers",  # "struct foo f = {0};"
      "-Wno-unused-parameter",  # Unused function parameters.
    ]
  }

  if (is_clang) {
    cflags += [
      # TODO(thakis): Consider -Wloop-analysis (turns on
      # -Wrange-loop-analysis too).

      # This warns on using ints as initializers for floats in
      # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|),
      # which happens in several places in chrome code. Not sure if
      # this is worth fixing.
      "-Wno-c++11-narrowing",

      # TODO(thakis): This used to be implied by -Wno-unused-function,
      # which we no longer use. Check if it makes sense to remove
      # this as well. http://crbug.com/316352
      "-Wno-unneeded-internal-declaration",
    ]

    # use_xcode_clang only refers to the iOS toolchain, host binaries use
    # chromium's clang always.
    if (!is_nacl) {
      cflags += [
        # TODO(thakis): https://crbug.com/604888
        "-Wno-undefined-var-template",
      ]

      if (is_win) {
        # TODO(thakis): https://crbug.com/617318
        # Currently goma can not handle case sensitiveness for windows well.
        cflags += [ "-Wno-nonportable-include-path" ]
      }

      if (current_toolchain == host_toolchain || !use_xcode_clang) {
        # Flags NaCl (Clang 3.7) and Xcode 9.2 (Clang clang-900.0.39.2) do not
        # recognize.
        cflags += [
          # Ignore warnings about MSVC optimization pragmas.
          # TODO(thakis): Only for no_chromium_code? http://crbug.com/912662
          "-Wno-ignored-pragma-optimize",
        ]
        if (!is_starboard) {
          cflags += [
            # An ABI compat warning we don't care about, https://crbug.com/1102157
            # TODO(thakis): Push this to the (few) targets that need it,
            # instead of having a global flag.
            "-Wno-psabi",

            # TODO(https://crbug.com/989932): Evaluate and possibly enable.
            "-Wno-implicit-int-float-conversion",

            # TODO(https://crbug.com/999886): Clean up, enable.
            "-Wno-final-dtor-non-final-class",

            # TODO(https://crbug.com/1016945) Clean up, enable.
            "-Wno-builtin-assume-aligned-alignment",

            # TODO(https://crbug.com/1028110): Evaluate and possible enable.
            "-Wno-deprecated-copy",

            # TODO(https://crbug.com/1050281): Clean up, enable.
            "-Wno-non-c-typedef-for-linkage",
          ]
        }

        cflags_c += [
          # TODO(https://crbug.com/995993): Clean up and enable.
          "-Wno-implicit-fallthrough",
        ]

        if (!is_starboard) {
          if (enable_wmax_tokens) {
            cflags += [ "-Wmax-tokens" ]
          } else {
            # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
            cflags += [ "-Wno-max-tokens" ]
          }
        }
      }
    }
  }
}

# chromium_code ---------------------------------------------------------------
#
# Toggles between higher and lower warnings for code that is (or isn't)
# part of Chromium.

config("chromium_code") {
  if (is_win) {
    cflags = [ "/W4" ]  # Warning level 4.

    if (is_clang) {
      # Opt in to additional [[nodiscard]] on standard library methods.
      defines = [ "_HAS_NODISCARD" ]
    }
  } else if (is_starboard) {
    # TODO(b/205790602): Revisit this code to be more compatible with platforms.
    defines = [
      "__STDC_CONSTANT_MACROS",
      "__STDC_FORMAT_MACROS",
    ]
    cflags = [ "-Werror" ]
  } else {
    cflags = [ "-Wall" ]
    if (treat_warnings_as_errors) {
      cflags += [ "-Werror" ]

      # The compiler driver can sometimes (rarely) emit warnings before calling
      # the actual linker.  Make sure these warnings are treated as errors as
      # well.
      ldflags = [ "-Werror" ]
    }
    if (is_clang) {
      # Enable extra warnings for chromium_code when we control the compiler.
      cflags += [ "-Wextra" ]
    }

    # In Chromium code, we define __STDC_foo_MACROS in order to get the
    # C99 macros on Mac and Linux.
    defines = [
      "__STDC_CONSTANT_MACROS",
      "__STDC_FORMAT_MACROS",
    ]

    if (!is_debug && !using_sanitizer && current_cpu != "s390x" &&
        current_cpu != "s390" && current_cpu != "ppc64" &&
        current_cpu != "mips" && current_cpu != "mips64") {
      # Non-chromium code is not guaranteed to compile cleanly with
      # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are
      # disabled, so only do that for Release build.
      defines += [ "_FORTIFY_SOURCE=2" ]
    }

    if (is_mac) {
      cflags_objc = [ "-Wobjc-missing-property-synthesis" ]
      cflags_objcc = [ "-Wobjc-missing-property-synthesis" ]
    }

    if (is_ios) {
      cflags_objc = [ "-Wimplicit-retain-self" ]
      cflags_objcc = cflags_objc
    }
  }

  if (is_clang) {
    cflags += [
      # Warn on missing break statements at the end of switch cases.
      # For intentional fallthrough, use FALLTHROUGH; from
      # base/compiler_specific.h
      "-Wimplicit-fallthrough",
    ]

    # TODO(thakis): Enable this more often, https://crbug.com/346399
    # use_libfuzzer: https://crbug.com/1063180
    if (!is_starboard && !is_nacl && !use_libfuzzer) {
      cflags += [ "-Wunreachable-code" ]
    }

    # Thread safety analysis is broken under nacl: https://crbug.com/982423.
    if (!is_nacl) {
      cflags += [
        # Thread safety analysis. See base/thread_annotations.h and
        # https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
        "-Wthread-safety",
      ]
    }

    # TODO(thakis): Enable this for more platforms, https://crbug.com/926235
    # ChromeOS: http://crbug.com/940863
    # Chromecast: http://crbug.com/942554
    has_dchecks = is_debug || dcheck_always_on
    if (!has_dchecks && is_chromeos_ash && is_chrome_branded) {
      # Temporarily disable -Wextra-semi for Chrome on Chrome OS.
    } else if (is_chromecast && chromecast_branding != "public") {
      # Temporarily disable -Wextra-semi for Chromecast.
    } else if (!is_starboard) {
      cflags += [ "-Wextra-semi" ]
    }
  }

  configs = [ ":default_warnings" ]
}

config("no_chromium_code") {
  cflags = []
  cflags_cc = []
  defines = []

  if (is_win) {
    cflags += [
      "/W3",  # Warning level 3.
      "/wd4800",  # Disable warning when forcing value to bool.
      "/wd4267",  # TODO(jschuh): size_t to int.
      "/wd4996",  # Deprecated function warning.
    ]
    defines += [
      "_CRT_NONSTDC_NO_WARNINGS",
      "_CRT_NONSTDC_NO_DEPRECATE",
    ]
  } else {
    # GCC may emit unsuppressible warnings so don't add -Werror for no chromium
    # code. crbug.com/589724
    if (treat_warnings_as_errors && is_clang) {
      cflags += [ "-Werror" ]
      ldflags = [ "-Werror" ]
    }
    if (is_clang && !is_nacl) {
      # TODO(thakis): Remove !is_nacl once
      # https://codereview.webrtc.org/1552863002/ made its way into chromium.
      cflags += [ "-Wall" ]
    }
  }

  if (is_clang) {
    cflags += [
      # Lots of third-party libraries have unused variables. Instead of
      # suppressing them individually, we just blanket suppress them here.
      "-Wno-unused-variable",
    ]
    if (!is_starboard && !is_nacl &&
        (current_toolchain == host_toolchain || !use_xcode_clang)) {
      cflags += [
        # TODO(https://crbug.com/1202159): Clean up and enable.
        "-Wno-misleading-indentation",
      ]
    }
  }

  configs = [ ":default_warnings" ]
}

# noshadowing -----------------------------------------------------------------
#
# Allows turning -Wshadow on.

config("noshadowing") {
  # This flag has to be disabled for nacl because the nacl compiler is too
  # strict about shadowing.
  if (is_clang && !is_nacl) {
    cflags = [ "-Wshadow" ]
  }
}

# rtti ------------------------------------------------------------------------
#
# Allows turning Run-Time Type Identification on or off.

config("rtti") {
  if (is_win) {
    cflags_cc = [ "/GR" ]
  } else {
    cflags_cc = [ "-frtti" ]
  }
}

config("no_rtti") {
  # Some sanitizer configs may require RTTI to be left enabled globally
  if (!use_rtti) {
    if (is_win) {
      cflags_cc = [ "/GR-" ]
    } else {
      cflags_cc = [ "-fno-rtti" ]
      cflags_objcc = cflags_cc
    }
  }
}

# export_dynamic ---------------------------------------------------------------
#
# Ensures all exported symbols are added to the dynamic symbol table.  This is
# necessary to expose Chrome's custom operator new() and operator delete() (and
# other memory-related symbols) to libraries.  Otherwise, they might
# (de)allocate memory on a different heap, which would spell trouble if pointers
# to heap-allocated memory are passed over shared library boundaries.
config("export_dynamic") {
  # TODO(crbug.com/1052397): Revisit after target_os flip is completed.
  if (is_linux || is_chromeos_lacros || export_libcxxabi_from_executables) {
    ldflags = [ "-rdynamic" ]
  }
}

# thin_archive -----------------------------------------------------------------
#
# Enables thin archives on posix, and on windows when the lld linker is used.
# Regular archives directly include the object files used to generate it.
# Thin archives merely reference the object files.
# This makes building them faster since it requires less disk IO, but is
# inappropriate if you wish to redistribute your static library.
# This config is added to the global config, so thin archives should already be
# enabled.  If you want to make a distributable static library, you need to do 2
# things:
# 1. Set complete_static_lib so that all dependencies of the library make it
#    into the library. See `gn help complete_static_lib` for details.
# 2. Remove the thin_archive config, so that the .a file actually contains all
#    .o files, instead of just references to .o files in the build directoy
config("thin_archive") {
  # The macOS and iOS default linker ld64 does not support reading thin
  # archives.
  if ((is_posix && !is_nacl && (!is_apple || use_lld)) || is_fuchsia) {
    arflags = [ "-T" ]
  } else if (is_win && use_lld) {
    arflags = [ "/llvmlibthin" ]
  }
}

# exceptions -------------------------------------------------------------------
#
# Allows turning Exceptions on or off.
# Note: exceptions are disallowed in Google code.

config("exceptions") {
  if (is_win) {
    # Enables exceptions in the STL.
    if (!use_custom_libcxx) {
      defines = [ "_HAS_EXCEPTIONS=1" ]
    }
    cflags_cc = [ "/EHsc" ]
  } else {
    cflags_cc = [ "-fexceptions" ]
    cflags_objcc = cflags_cc
  }
}

config("no_exceptions") {
  if (is_win) {
    # Disables exceptions in the STL.
    # libc++ uses the __has_feature macro to control whether to use exceptions,
    # so defining this macro is unnecessary. Defining _HAS_EXCEPTIONS to 0 also
    # breaks libc++ because it depends on MSVC headers that only provide certain
    # declarations if _HAS_EXCEPTIONS is 1. Those MSVC headers do not use
    # exceptions, despite being conditional on _HAS_EXCEPTIONS.
    if (!use_custom_libcxx) {
      defines = [ "_HAS_EXCEPTIONS=0" ]
    }
  } else {
    cflags_cc = [ "-fno-exceptions" ]
    cflags_objcc = cflags_cc
  }
}

# Warnings ---------------------------------------------------------------------

# Generate a warning for code that might emit a static initializer.
# See: //docs/static_initializers.md
# See: https://groups.google.com/a/chromium.org/d/topic/chromium-dev/B9Q5KTD7iCo/discussion
config("wglobal_constructors") {
  if (is_clang) {
    cflags = [ "-Wglobal-constructors" ]
  }
}

# This will generate warnings when using Clang if code generates exit-time
# destructors, which will slow down closing the program.
# TODO(thakis): Make this a blocklist instead, http://crbug.com/101600
config("wexit_time_destructors") {
  if (is_clang) {
    cflags = [ "-Wexit-time-destructors" ]
  }
}

# On Windows compiling on x64, VC will issue a warning when converting
# size_t to int because it will truncate the value. Our code should not have
# these warnings and one should use a static_cast or a checked_cast for the
# conversion depending on the case. However, a lot of code still needs to be
# fixed. Apply this config to such targets to disable the warning.
#
# Note that this can be applied regardless of platform and architecture to
# clean up the call sites. This will only apply the flag when necessary.
#
# This config is just an alias to no_shorten_64_warnings and will
# suppress a superset of warning 4267 and any 64-bit -> 32-bit implicit
# conversions. Having both for a time means not having to go through and
# update all references to no_size_t_to_int_warning throughout the codebase
# atomically.
#
# Any new warning suppressions should use the no_shorten_64_warnings
# config below and not this.
#
# TODO(jschuh): crbug.com/167187 fix this and delete this config.
config("no_size_t_to_int_warning") {
  configs = [ ":no_shorten_64_warnings" ]
}

# As part of re-enabling -Wconversion (see issue 588506) some code
# will continue to generate warnings.
# The first warning to be enabled will be -Wshorten-64-to-32.
#
# Code that currently generates warnings for this can include this
# config to disable them.
config("no_shorten_64_warnings") {
  if (current_cpu == "x64" || current_cpu == "arm64") {
    if (is_clang) {
      cflags = [ "-Wno-shorten-64-to-32" ]
    } else {
      if (is_win) {
        # MSVC does not have an explicit warning equivalent to
        # -Wshorten-64-to-32 but 4267 warns for size_t -> int
        # on 64-bit builds, so is the closest.
        cflags = [ "/wd4267" ]
      }
    }
  }
}

# Some code presumes that pointers to structures/objects are compatible
# regardless of whether what they point to is already known to be valid.
# gcc 4.9 and earlier had no way of suppressing this warning without
# suppressing the rest of them.  Here we centralize the identification of
# the gcc 4.9 toolchains.
config("no_incompatible_pointer_warnings") {
  cflags = []
  if (is_clang) {
    cflags += [ "-Wno-incompatible-pointer-types" ]
  } else if (current_cpu == "mipsel" || current_cpu == "mips64el") {
    cflags += [ "-w" ]
  } else if (is_chromeos_ash && current_cpu == "arm") {
    cflags += [ "-w" ]
  }
}

# Optimization -----------------------------------------------------------------
#
# The BUILDCONFIG file sets the "default_optimization" config on targets by
# default. It will be equivalent to either "optimize" (release) or
# "no_optimize" (debug) optimization configs.
#
# You can override the optimization level on a per-target basis by removing the
# default config and then adding the named one you want:
#
#   configs -= [ "//build/config/compiler:default_optimization" ]
#   configs += [ "//build/config/compiler:optimize_max" ]

# Shared settings for both "optimize" and "optimize_max" configs.
# IMPORTANT: On Windows "/O1" and "/O2" must go before the common flags.
if (is_win) {
  if (is_starboard) {
    common_optimize_on_cflags = []
  } else {
    common_optimize_on_cflags = [
      "/Ob2",  # Both explicit and auto inlining.
      "/Oy-",  # Disable omitting frame pointers, must be after /O2.
      "/Zc:inline",  # Remove unreferenced COMDAT (faster links).
    ]
  }
  if (!is_asan) {
    common_optimize_on_cflags += [
      # Put data in separate COMDATs. This allows the linker
      # to put bit-identical constants at the same address even if
      # they're unrelated constants, which saves binary size.
      # This optimization can't be used when ASan is enabled because
      # it is not compatible with the ASan ODR checker.
      "/Gw",
    ]
  }
  common_optimize_on_ldflags = []

  # /OPT:ICF is not desirable in Debug builds, since code-folding can result in
  # misleading symbols in stack traces.
  if (!is_debug && !is_component_build) {
    common_optimize_on_ldflags += [ "/OPT:ICF" ]  # Redundant COMDAT folding.
  }

  if (is_official_build) {
    common_optimize_on_ldflags += [ "/OPT:REF" ]  # Remove unreferenced data.
    # TODO(thakis): Add LTO/PGO clang flags eventually, https://crbug.com/598772
  }
} else {
  common_optimize_on_cflags = []
  common_optimize_on_ldflags = []

  if (is_android) {
    # TODO(jdduke) Re-enable on mips after resolving linking
    # issues with libc++ (crbug.com/456380).
    if (current_cpu != "mipsel" && current_cpu != "mips64el") {
      common_optimize_on_ldflags += [
        # Warn in case of text relocations.
        "-Wl,--warn-shared-textrel",
      ]
    }
  }

  if (is_apple) {
    common_optimize_on_ldflags += [ "-Wl,-dead_strip" ]

    if (is_official_build) {
      common_optimize_on_ldflags += [
        "-Wl,-no_data_in_code_info",
        "-Wl,-no_function_starts",
      ]
    }
  } else if (current_os != "aix") {
    # Non-Mac Posix flags.
    # Aix does not support these.

    common_optimize_on_cflags += [
      # Put data and code in their own sections, so that unused symbols
      # can be removed at link time with --gc-sections.
      "-fdata-sections",
      "-ffunction-sections",
    ]

    common_optimize_on_ldflags += [
      # Specifically tell the linker to perform optimizations.
      # See http://lwn.net/Articles/192624/ .
      # -O2 enables string tail merge optimization in gold and lld.
      "-Wl,-O2",
      "-Wl,--gc-sections",
    ]
  }
}

config("default_stack_frames") {
  if (is_posix || is_fuchsia) {
    if (enable_frame_pointers) {
      cflags = [ "-fno-omit-frame-pointer" ]

      # Omit frame pointers for leaf functions on x86, otherwise building libyuv
      # gives clang's register allocator issues, see llvm.org/PR15798 /
      # crbug.com/233709
      if (is_clang && current_cpu == "x86" && !is_apple) {
        cflags += [ "-momit-leaf-frame-pointer" ]
      }
    } else {
      cflags = [ "-fomit-frame-pointer" ]
    }
  }
  # On Windows, the flag to enable framepointers "/Oy-" must always come after
  # the optimization flag [e.g. "/O2"]. The optimization flag is set by one of
  # the "optimize" configs, see rest of this file. The ordering that cflags are
  # applied is well-defined by the GN spec, and there is no way to ensure that
  # cflags set by "default_stack_frames" is applied after those set by an
  # "optimize" config. Similarly, there is no way to propagate state from this
  # config into the "optimize" config. We always apply the "/Oy-" config in the
  # definition for common_optimize_on_cflags definition, even though this may
  # not be correct.
}

# Default "optimization on" config.
config("optimize") {
  if (is_win) {
    if (chrome_pgo_phase != 2) {
      # Favor size over speed, /O1 must be before the common flags.
      # /O1 implies /Os and /GF.
      cflags = [ "/O1" ] + common_optimize_on_cflags + [ "/Oi" ]
    } else {
      # PGO requires all translation units to be compiled with /O2. The actual
      # optimization level will be decided based on the profiling data.
      cflags = [ "/O2" ] + common_optimize_on_cflags + [ "/Oi" ]
    }
  } else if (optimize_for_size && !is_nacl) {
    # Favor size over speed.
    # TODO(crbug.com/718650): Fix -Os in PNaCl compiler and remove the is_nacl
    # guard above.
    if (is_clang) {
      cflags = [ "-Oz" ] + common_optimize_on_cflags
    } else {
      cflags = [ "-Os" ] + common_optimize_on_cflags
    }
  } else if (is_chromeos_ash) {
    # TODO(gbiv): This is partially favoring size over speed. CrOS exclusively
    # uses clang, and -Os in clang is more of a size-conscious -O2 than "size at
    # any cost" (AKA -Oz). It'd be nice to:
    # - Make `optimize_for_size` apply to all platforms where we're optimizing
    #   for size by default (so, also Windows)
    # - Investigate -Oz here, maybe just for ARM?
    cflags = [ "-Os" ] + common_optimize_on_cflags
  } else {
    cflags = [ "-O2" ] + common_optimize_on_cflags
  }
  ldflags = common_optimize_on_ldflags
}

# Turn off optimizations.
config("no_optimize") {
  if (is_win) {
    cflags = [
      "/Od",  # Disable optimization.
      "/Ob0",  # Disable all inlining (on by default).
      "/GF",  # Enable string pooling (off by default).
    ]

    if (target_cpu == "arm64") {
      # Disable omitting frame pointers for no_optimize build because stack
      # traces on Windows ARM64 rely on it.
      cflags += [ "/Oy-" ]
    }
  } else if (is_android && !android_full_debug) {
    # On Android we kind of optimize some things that don't affect debugging
    # much even when optimization is disabled to get the binary size down.
    if (is_clang) {
      cflags = [ "-Oz" ] + common_optimize_on_cflags
    } else {
      cflags = [ "-Os" ] + common_optimize_on_cflags
    }

    if (!is_component_build) {
      # Required for library partitions. Without this all symbols just end up
      # in the base partition.
      ldflags = [ "-Wl,--gc-sections" ]
    }
  } else if (is_fuchsia) {
    # On Fuchsia, we optimize for size here to reduce the size of debug build
    # packages so they can be run in a KVM. See crbug.com/910243 for details.
    cflags = [ "-Og" ]
  } else {
    cflags = [ "-O0" ]
    ldflags = []
  }
}

# Turns up the optimization level. On Windows, this implies whole program
# optimization and link-time code generation which is very expensive and should
# be used sparingly.
config("optimize_max") {
  if (is_nacl && is_nacl_irt) {
    # The NaCl IRT is a special case and always wants its own config.
    # Various components do:
    #   if (!is_debug) {
    #     configs -= [ "//build/config/compiler:default_optimization" ]
    #     configs += [ "//build/config/compiler:optimize_max" ]
    #   }
    # So this config has to have the selection logic just like
    # "default_optimization", below.
    configs = [ "//build/config/nacl:irt_optimize" ]
  } else {
    ldflags = common_optimize_on_ldflags
    if (is_win) {
      # Favor speed over size, /O2 must be before the common flags.
      # /O2 implies /Ot, /Oi, and /GF.
      cflags = [ "/O2" ] + common_optimize_on_cflags
    } else if (optimize_for_fuzzing) {
      cflags = [ "-O1" ] + common_optimize_on_cflags
    } else {
      cflags = [ "-O2" ] + common_optimize_on_cflags
    }
  }
}

# This config can be used to override the default settings for per-component
# and whole-program optimization, optimizing the particular target for speed
# instead of code size. This config is exactly the same as "optimize_max"
# except that we use -O3 instead of -O2 on non-win, non-IRT platforms.
#
# TODO(crbug.com/621335) - rework how all of these configs are related
# so that we don't need this disclaimer.
config("optimize_speed") {
  if (is_nacl && is_nacl_irt) {
    # The NaCl IRT is a special case and always wants its own config.
    # Various components do:
    #   if (!is_debug) {
    #     configs -= [ "//build/config/compiler:default_optimization" ]
    #     configs += [ "//build/config/compiler:optimize_max" ]
    #   }
    # So this config has to have the selection logic just like
    # "default_optimization", below.
    configs = [ "//build/config/nacl:irt_optimize" ]
  } else {
    ldflags = common_optimize_on_ldflags
    if (is_win) {
      # Favor speed over size, /O2 must be before the common flags.
      # /O2 implies /Ot, /Oi, and /GF.
      cflags = [ "/O2" ] + common_optimize_on_cflags
    } else if (optimize_for_fuzzing) {
      cflags = [ "-O1" ] + common_optimize_on_cflags
    } else {
      cflags = [ "-O3" ] + common_optimize_on_cflags
    }
  }
}

config("optimize_fuzzing") {
  cflags = [ "-O1" ] + common_optimize_on_cflags
  ldflags = common_optimize_on_ldflags
  visibility = [ ":default_optimization" ]
}

# The default optimization applied to all targets. This will be equivalent to
# either "optimize" or "no_optimize", depending on the build flags.
config("default_optimization") {
  if (is_nacl && is_nacl_irt) {
    # The NaCl IRT is a special case and always wants its own config.
    # It gets optimized the same way regardless of the type of build.
    configs = [ "//build/config/nacl:irt_optimize" ]
  } else if (is_debug) {
    configs = [ ":no_optimize" ]
  } else if (optimize_for_fuzzing) {
    assert(!is_win, "Fuzzing optimize level not supported on Windows")

    # Coverage build is quite slow. Using "optimize_for_fuzzing" makes it even
    # slower as it uses "-O1" instead of "-O3". Prevent that from happening.
    assert(!use_clang_coverage,
           "optimize_for_fuzzing=true should not be used with " +
               "use_clang_coverage=true.")
    configs = [ ":optimize_fuzzing" ]
  } else {
    configs = [ ":optimize" ]
  }
}

_clang_sample_profile = ""
if (is_clang && is_a_target_toolchain) {
  if (clang_sample_profile_path != "") {
    _clang_sample_profile = clang_sample_profile_path
  } else if (clang_use_default_sample_profile) {
    assert(build_with_chromium,
           "Our default profiles currently only apply to Chromium")
    assert(is_android || is_chromeos_lacros || is_chromeos_ash || is_chromecast,
           "The current platform has no default profile")
    if (is_android || is_chromecast) {
      _clang_sample_profile = "//chrome/android/profiles/afdo.prof"
    } else {
      assert(chromeos_afdo_platform == "atom" ||
                 chromeos_afdo_platform == "bigcore",
             "Only atom and bigcore are valid Chrome OS profiles.")
      _clang_sample_profile =
          "//chromeos/profiles/${chromeos_afdo_platform}.afdo.prof"
    }
  }
}

# Clang offers a way to assert that AFDO profiles are accurate, which causes it
# to optimize functions not represented in a profile more aggressively for size.
# This config can be toggled in cases where shaving off binary size hurts
# performance too much.
config("afdo_optimize_size") {
  if (_clang_sample_profile != "" && sample_profile_is_accurate) {
    cflags = [ "-fprofile-sample-accurate" ]
  }
}

# GCC and clang support a form of profile-guided optimization called AFDO.
# There are some targeted places that AFDO regresses (and an icky interaction
# between //base/allocator:tcmalloc and AFDO on GCC), so we provide a separate
# config to allow AFDO to be disabled per-target.
config("afdo") {
  if (is_clang) {
    cflags = []
    if (clang_emit_debug_info_for_profiling) {
      # Add the following flags to generate debug info for profiling.
      cflags += [ "-gline-tables-only" ]
      if (!is_nacl) {
        cflags += [ "-fdebug-info-for-profiling" ]
      }
    }
    if (_clang_sample_profile != "") {
      assert(chrome_pgo_phase == 0, "AFDO can't be used in PGO builds")
      rebased_clang_sample_profile =
          rebase_path(_clang_sample_profile, root_build_dir)
      cflags += [ "-fprofile-sample-use=${rebased_clang_sample_profile}" ]
      inputs = [ _clang_sample_profile ]
    }
  } else if (auto_profile_path != "" && is_a_target_toolchain) {
    cflags = [ "-fauto-profile=${auto_profile_path}" ]
    inputs = [ auto_profile_path ]
  }
}

# Symbols ----------------------------------------------------------------------

# The BUILDCONFIG file sets the "default_symbols" config on targets by
# default. It will be equivalent to one the three specific symbol levels.
#
# You can override the symbol level on a per-target basis by removing the
# default config and then adding the named one you want:
#
#   configs -= [ "//build/config/compiler:default_symbols" ]
#   configs += [ "//build/config/compiler:symbols" ]

# A helper config that all configs passing /DEBUG to the linker should
# include as sub-config.
config("win_pdbaltpath") {
  visibility = [
    ":minimal_symbols",
    ":symbols",
  ]

  # /DEBUG causes the linker to generate a pdb file, and to write the absolute
  # path to it in the executable file it generates.  This flag turns that
  # absolute path into just the basename of the pdb file, which helps with
  # build reproducibility. Debuggers look for pdb files next to executables,
  # so there's minimal downside to always using this. However, post-mortem
  # debugging of Chromium crash dumps and ETW tracing can be complicated by this
  # switch so an option to omit it is important.
  if (!use_full_pdb_paths) {
    ldflags = [ "/pdbaltpath:%_PDB%" ]
  }
}

# Full symbols.
config("symbols") {
  if (is_win) {
    if (is_clang) {
      cflags = [ "/Z7" ]  # Debug information in the .obj files.
    } else {
      cflags = [ "/Zi" ]  # Produce PDB file, no edit and continue.
    }

    if (is_clang && use_lld && use_ghash) {
      cflags += [ "-gcodeview-ghash" ]
      ldflags = [ "/DEBUG:GHASH" ]
    } else {
      ldflags = [ "/DEBUG" ]
    }

    # All configs using /DEBUG should include this:
    configs = [ ":win_pdbaltpath" ]

    # TODO(crbug.com/1138553): Re-enable constructor homing on windows after
    # libc++ fix is in.
  } else {
    cflags = []
    if (is_mac && enable_dsyms) {
      # If generating dSYMs, specify -fno-standalone-debug. This was
      # originally specified for https://crbug.com/479841 because dsymutil
      # could not handle a 4GB dSYM file. But dsymutil from Xcodes prior to
      # version 7 also produces debug data that is incompatible with Breakpad
      # dump_syms, so this is still required (https://crbug.com/622406).
      cflags += [ "-fno-standalone-debug" ]
    } else if (is_mac && !use_dwarf5) {
      # clang defaults to DWARF2 on macOS unless mac_deployment_target is
      # at least 10.11.
      # TODO(thakis): Remove this once mac_deployment_target is 10.11.
      cflags += [ "-gdwarf-4" ]
    }

    if (use_dwarf5 && !is_nacl) {
      cflags += [ "-gdwarf-5" ]
    }

    # The gcc-based nacl compilers don't support -fdebug-compilation-dir (see
    # elsewhere in this file), so they can't have build-dir-independent output.
    # Disable symbols for nacl object files to get deterministic,
    # build-directory-independent output. pnacl and nacl-clang do support that
    # flag, so we can use use -g1 for pnacl and nacl-clang compiles.
    # gcc nacl is is_nacl && !is_clang, pnacl and nacl-clang are && is_clang.
    if (!is_nacl || is_clang) {
      cflags += [ "-g2" ]
    }

    # TODO(https://crbug.com/1050118): Investigate missing debug info on mac.
    if (is_clang && !is_nacl && !use_xcode_clang && !is_apple) {
      cflags += [
        "-Xclang",
        "-debug-info-kind=constructor",
      ]
    }

    if (is_apple) {
      swiftflags = [ "-g" ]
    }

    if (use_debug_fission) {
      cflags += [ "-gsplit-dwarf" ]
    }
    asmflags = cflags
    ldflags = []

    # Split debug info with all thinlto builds except nacl and apple.
    # thinlto requires -gsplit-dwarf in ldflags.
    if (use_debug_fission && use_thin_lto && !is_nacl && !is_apple) {
      ldflags += [ "-gsplit-dwarf" ]
    }

    # TODO(thakis): Figure out if there's a way to make this go for 32-bit,
    # currently we get "warning:
    # obj/native_client/src/trusted/service_runtime/sel_asm/nacl_switch_32.o:
    # DWARF info may be corrupt; offsets in a range list entry are in different
    # sections" there.  Maybe just a bug in nacl_switch_32.S.
    if (!is_apple && !is_nacl && current_cpu != "x86" &&
        (use_gold || use_lld)) {
      if (is_clang) {
        # This flag enables the GNU-format pubnames and pubtypes sections,
        # which lld needs in order to generate a correct GDB index.
        # TODO(pcc): Try to make lld understand non-GNU-format pubnames
        # sections (llvm.org/PR34820).
        cflags += [ "-ggnu-pubnames" ]
      }
      ldflags += [ "-Wl,--gdb-index" ]
    }
  }
}

# Minimal symbols.
# This config guarantees to hold symbol for stack trace which are shown to user
# when crash happens in unittests running on buildbot.
config("minimal_symbols") {
  if (is_win) {
    # Functions, files, and line tables only.
    cflags = []
    ldflags = [ "/DEBUG" ]

    # All configs using /DEBUG should include this:
    configs = [ ":win_pdbaltpath" ]

    # Enable line tables for clang. MSVC doesn't have an equivalent option.
    if (is_clang) {
      # -gline-tables-only is the same as -g1, but clang-cl only exposes the
      # former.
      cflags += [ "-gline-tables-only" ]
    }
  } else {
    cflags = []
    if (is_mac && !use_dwarf5) {
      # clang defaults to DWARF2 on macOS unless mac_deployment_target is
      # at least 10.11.
      # TODO(thakis): Remove this once mac_deployment_target is 10.11.
      cflags += [ "-gdwarf-4" ]
    }

    if (use_dwarf5 && !is_nacl) {
      cflags += [ "-gdwarf-5" ]
    }

    # The gcc-based nacl compilers don't support -fdebug-compilation-dir (see
    # elsewhere in this file), so they can't have build-dir-independent output.
    # Disable symbols for nacl object files to get deterministic,
    # build-directory-independent output. pnacl and nacl-clang do support that
    # flag, so we can use use -g1 for pnacl and nacl-clang compiles.
    # gcc nacl is is_nacl && !is_clang, pnacl and nacl-clang are && is_clang.
    if (!is_nacl || is_clang) {
      cflags += [ "-g1" ]
    }
    ldflags = []
    if (is_android && is_clang) {
      # Android defaults to symbol_level=1 builds in production builds
      # (https://crbug.com/648948), but clang, unlike gcc, doesn't emit
      # DW_AT_linkage_name in -g1 builds. -fdebug-info-for-profiling enables
      # that (and a bunch of other things we don't need), so that we get
      # qualified names in stacks.
      # TODO(thakis): Consider making clang emit DW_AT_linkage_name in -g1 mode;
      #               failing that consider doing this on non-Android too.
      cflags += [ "-fdebug-info-for-profiling" ]
    }

    # Note: debug_fission is no-op with symbol_level=1 since all -g1 debug_info
    # will stay in the executable.

    asmflags = cflags
  }
}

# This configuration contains function names only. That is, the compiler is
# told to not generate debug information and the linker then just puts function
# names in the final debug information.
config("no_symbols") {
  if (is_win) {
    ldflags = [ "/DEBUG" ]

    # All configs using /DEBUG should include this:
    configs = [ ":win_pdbaltpath" ]
  } else {
    cflags = [ "-g0" ]
    asmflags = cflags
  }
}

# Default symbols.
config("default_symbols") {
  if (symbol_level == 0) {
    configs = [ ":no_symbols" ]
  } else if (symbol_level == 1) {
    configs = [ ":minimal_symbols" ]
  } else if (symbol_level == 2) {
    configs = [ ":symbols" ]
  } else {
    assert(false)
  }

  # This config is removed by base unittests apk.
  if (is_android && is_clang && strip_debug_info) {
    configs += [ ":strip_debug" ]
  }
}

config("strip_debug") {
  if (!defined(ldflags)) {
    ldflags = []
  }
  ldflags += [ "-Wl,--strip-debug" ]
}

if (is_apple) {
  # On Mac and iOS, this enables support for ARC (automatic ref-counting).
  # See http://clang.llvm.org/docs/AutomaticReferenceCounting.html.
  config("enable_arc") {
    common_flags = [ "-fobjc-arc" ]
    cflags_objc = common_flags
    cflags_objcc = common_flags
  }
}

if (is_chromeos_ash && is_chromeos_device) {
  # This config is intended to be a temporary to facilitate
  # the transition to use orderfile in Chrome OS. Once orderfile
  # use becomes a default in Chrome OS, this config should not
  # be needed.
  config("use_orderfile_for_hugepage") {
    if (chrome_orderfile_path != "") {
      defines = [ "CHROMEOS_ORDERFILE_USE" ]
    }
  }
}

if (is_android || (is_chromeos_ash && is_chromeos_device)) {
  # Use orderfile for linking Chrome on Android and Chrome OS.
  # This config enables using an orderfile for linking in LLD.
  # TODO: Consider using call graph sort instead, at least on Android.
  config("chrome_orderfile_config") {
    if (chrome_orderfile_path != "" && !enable_call_graph_profile_sort) {
      assert(use_lld)
      _rebased_orderfile = rebase_path(chrome_orderfile_path, root_build_dir)
      ldflags = [
        "-Wl,--symbol-ordering-file",
        "-Wl,$_rebased_orderfile",
        "-Wl,--no-warn-symbol-ordering",
      ]
      inputs = [ chrome_orderfile_path ]
    }
  }
}

# Initialize all variables on the stack if needed.
config("default_init_stack_vars") {
  cflags = []
  if (init_stack_vars && is_clang && !is_nacl && !using_sanitizer) {
    cflags += [ "-ftrivial-auto-var-init=pattern" ]
  }
}

buildflag_header("compiler_buildflags") {
  header = "compiler_buildflags.h"

  flags = [ "CLANG_PGO=$chrome_pgo_phase" ]
}

config("cet_shadow_stack") {
  if (enable_cet_shadow_stack && is_win) {
    assert(target_cpu == "x64")
    ldflags = [ "/CETCOMPAT" ]
  }
}
