BUILD.gn (5750B)
1 # Copyright 2016 The Chromium Authors 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 import("//chromium/build/config/clang/clang.gni") 6 import("//chromium/build/config/compiler/compiler.gni") 7 import("//chromium/build/config/compiler/pgo/pgo.gni") 8 import("//chromium/build/config/features.gni") 9 import("//chromium/build/toolchain/toolchain.gni") 10 11 # Configuration that enables PGO instrumentation. 12 config("pgo_instrumentation_flags") { 13 visibility = [ ":default_pgo_flags" ] 14 15 # Only add flags when chrome_pgo_phase == 1, so that variables we would use 16 # are not required to be defined when we're not actually using PGO. 17 if (chrome_pgo_phase == 1 && is_clang && !is_nacl && is_a_target_toolchain) { 18 cflags = [ "-fprofile-generate" ] 19 if (temporal_pgo_profile) { 20 cflags += [ 21 "-mllvm", 22 "-pgo-temporal-instrumentation", 23 ] 24 } 25 if (!is_win) { 26 # Windows directly calls link.exe instead of the compiler driver when 27 # linking, and embeds the path to the profile runtime library as 28 # dependent library into each object file. 29 ldflags = [ "-fprofile-generate" ] 30 } 31 } 32 } 33 34 # Configuration that enables optimization using profile data. 35 config("pgo_optimization_flags") { 36 visibility = [ ":default_pgo_flags" ] 37 38 # Only add flags when chrome_pgo_phase == 2, so that variables we would use 39 # are not required to be defined when we're not actually using PGO. 40 if (chrome_pgo_phase == 2 && is_clang && !is_nacl && is_a_target_toolchain) { 41 _pgo_target = "" 42 43 # There are txt files used by //tools/update_pgo_profiles.py to decide which 44 # profiles to use, adding them as inputs so that analyzer recognizes the 45 # dependencies. 46 inputs = [] 47 48 if (is_win) { 49 if (target_cpu == "arm64") { 50 _pgo_target = "win-arm64" 51 } else if (target_cpu == "x64") { 52 _pgo_target = "win64" 53 } else { 54 _pgo_target = "win32" 55 } 56 } else if (is_mac) { 57 if (target_cpu == "arm64") { 58 _pgo_target = "mac-arm" 59 } else { 60 _pgo_target = "mac" 61 } 62 } else if (is_linux) { 63 _pgo_target = "linux" 64 } else if (is_android) { 65 # Use |target_cpu| and not |target_cpu|; for Android we may built both. 66 if (target_cpu == "arm64") { 67 _pgo_target = "android-arm64" 68 } else { 69 _pgo_target = "android-arm32" 70 } 71 } else if (is_fuchsia) { 72 if (target_cpu == "arm64") { 73 _pgo_target = "mac-arm" 74 } else { 75 _pgo_target = "mac" 76 } 77 } else if (is_ios && use_blink) { 78 if (target_cpu == "arm64") { 79 _pgo_target = "mac-arm" 80 } else { 81 _pgo_target = "mac" 82 } 83 } 84 85 if (_pgo_target == "win-arm64") { 86 inputs = [ "//chrome/build/win-arm64.pgo.txt" ] 87 } else if (_pgo_target == "win64") { 88 inputs = [ "//chrome/build/win64.pgo.txt" ] 89 } else if (_pgo_target == "win32") { 90 inputs = [ "//chrome/build/win32.pgo.txt" ] 91 } else if (_pgo_target == "mac-arm") { 92 inputs = [ "//chrome/build/mac-arm.pgo.txt" ] 93 } else if (_pgo_target == "mac") { 94 inputs = [ "//chrome/build/mac.pgo.txt" ] 95 } else if (_pgo_target == "linux") { 96 inputs = [ "//chrome/build/linux.pgo.txt" ] 97 } else if (_pgo_target == "android-arm32") { 98 inputs = [ "//chrome/build/android-arm32.pgo.txt" ] 99 } else if (_pgo_target == "android-arm64") { 100 inputs = [ "//chrome/build/android-arm64.pgo.txt" ] 101 } 102 103 if (_pgo_target != "" && pgo_data_path == "") { 104 pgo_data_path = exec_script("//tools/update_pgo_profiles.py", 105 [ 106 "--target", 107 _pgo_target, 108 "get_profile_path", 109 ], 110 "value") 111 } 112 assert(pgo_data_path != "", 113 "Please set pgo_data_path to point at the profile data") 114 cflags = [ 115 "-fprofile-use=" + rebase_path(pgo_data_path, root_build_dir), 116 117 # It's possible to have some profile data legitimately missing, 118 # and at least some profile data always ends up being considered 119 # out of date, so make sure we don't error for those cases. 120 "-Wno-profile-instr-unprofiled", 121 "-Wno-profile-instr-out-of-date", 122 123 # Some hashing conflict results in a lot of warning like this when doing 124 # a PGO build: 125 # warning: foo.cc: Function control flow change detected (hash mismatch) 126 # [-Wbackend-plugin] 127 # See https://crbug.com/978401 128 "-Wno-backend-plugin", 129 ] 130 131 # TODO(crbug.com/383537825): Try enabling on all platforms. 132 if (is_android) { 133 cflags += [ 134 "-mllvm", 135 "-pgo-cold-func-opt=minsize", 136 ] 137 } 138 139 # Enable basic block layout based on the extended TSP problem. This aims to 140 # improve icache utilization and reduce the binary size. 141 if (use_thin_lto) { 142 if (is_win) { 143 ldflags = [ "-mllvm:-enable-ext-tsp-block-placement=1" ] 144 } else { 145 ldflags = [ "-Wl,-mllvm,-enable-ext-tsp-block-placement=1" ] 146 } 147 } else { 148 cflags += [ 149 "-mllvm", 150 "-enable-ext-tsp-block-placement=1", 151 ] 152 } 153 } 154 } 155 156 # Applies flags necessary when profile-guided optimization is used. 157 # Flags are only added if PGO is enabled, so that this config is safe to 158 # include by default. 159 config("default_pgo_flags") { 160 if (chrome_pgo_phase == 0) { 161 # Nothing. This config should be a no-op when chrome_pgo_phase == 0. 162 } else if (chrome_pgo_phase == 1) { 163 configs = [ ":pgo_instrumentation_flags" ] 164 } else if (chrome_pgo_phase == 2) { 165 configs = [ ":pgo_optimization_flags" ] 166 } 167 }