xref: /aosp_15_r20/external/cronet/build/config/compiler/pgo/BUILD.gn (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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