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