| # 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" ] |
| } |
| } |