# Copyright 2016 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/config/chromeos/ui_mode.gni") import("//build/config/clang/clang.gni") import("//build/config/compiler/compiler.gni") import("//build/config/compiler/pgo/pgo.gni") import("//build/toolchain/toolchain.gni") # Configuration that enables PGO instrumentation. config("pgo_instrumentation_flags") { visibility = [ ":default_pgo_flags" ] # Only add flags when chrome_pgo_phase == 1, so that variables we would use # are not required to be defined when we're not actually using PGO. if (chrome_pgo_phase == 1 && is_clang && !is_nacl && is_a_target_toolchain) { cflags = [ "-fprofile-generate" ] if (!is_win) { # Windows directly calls link.exe instead of the compiler driver when # linking, and embeds the path to the profile runtime library as # dependent library into each object file. ldflags = [ "-fprofile-generate" ] } } } # Configuration that enables optimization using profile data. config("pgo_optimization_flags") { visibility = [ ":default_pgo_flags" ] # Only add flags when chrome_pgo_phase == 2, so that variables we would use # are not required to be defined when we're not actually using PGO. if (chrome_pgo_phase == 2 && is_clang && !is_nacl && is_a_target_toolchain) { _pgo_target = "" # There are txt files used by //tools/update_pgo_profiles.py to decide which # profiles to use, adding them as inputs so that analyzer recognizes the # dependencies. inputs = [] if (is_win) { if (target_cpu == "x64") { _pgo_target = "win64" inputs = [ "//chrome/build/win64.pgo.txt" ] } else { _pgo_target = "win32" inputs = [ "//chrome/build/win32.pgo.txt" ] } } else if (is_mac) { _pgo_target = "mac" inputs = [ "//chrome/build/mac.pgo.txt" ] } else if (is_linux || is_chromeos_lacros) { _pgo_target = "linux" inputs = [ "//chrome/build/linux.pgo.txt" ] } if (pgo_data_path == "" && _pgo_target != "") { pgo_data_path = rebase_path(exec_script("//tools/update_pgo_profiles.py", [ "--target", _pgo_target, "get_profile_path", ], "value"), root_build_dir) } assert(pgo_data_path != "", "Please set pgo_data_path to point at the profile data") cflags = [ "-fprofile-instr-use=$pgo_data_path", # It's possible to have some profile data legitimately missing, # and at least some profile data always ends up being considered # out of date, so make sure we don't error for those cases. "-Wno-profile-instr-unprofiled", "-Wno-profile-instr-out-of-date", # Some hashing conflict results in a lot of warning like this when doing # a PGO build: # warning: foo.cc: Function control flow change detected (hash mismatch) # [-Wbackend-plugin] # See https://crbug.com/978401 "-Wno-backend-plugin", ] } } # Applies flags necessary when profile-guided optimization is used. # Flags are only added if PGO is enabled, so that this config is safe to # include by default. config("default_pgo_flags") { if (chrome_pgo_phase == 0) { # Nothing. This config should be a no-op when chrome_pgo_phase == 0. } else if (chrome_pgo_phase == 1) { configs = [ ":pgo_instrumentation_flags" ] } else if (chrome_pgo_phase == 2) { configs = [ ":pgo_optimization_flags" ] } }