xref: /aosp_15_r20/external/cronet/build/toolchain/concurrent_links.gni (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 Worker# This file should only be imported from files that define toolchains.
6*6777b538SAndroid Build Coastguard Worker# There's no way to enforce this exactly, but all toolchains are processed
7*6777b538SAndroid Build Coastguard Worker# in the context of the default_toolchain, so we can at least check for that.
8*6777b538SAndroid Build Coastguard Workerassert(current_toolchain == default_toolchain)
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Workerimport("//build/config/android/config.gni")
11*6777b538SAndroid Build Coastguard Workerimport("//build/config/apple/symbols.gni")
12*6777b538SAndroid Build Coastguard Workerimport("//build/config/chromeos/ui_mode.gni")
13*6777b538SAndroid Build Coastguard Workerimport("//build/config/compiler/compiler.gni")
14*6777b538SAndroid Build Coastguard Workerimport("//build/config/coverage/coverage.gni")
15*6777b538SAndroid Build Coastguard Workerimport("//build/config/sanitizers/sanitizers.gni")
16*6777b538SAndroid Build Coastguard Workerimport("//build/toolchain/toolchain.gni")
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Workerdeclare_args() {
19*6777b538SAndroid Build Coastguard Worker  # Limit the number of concurrent links; we often want to run fewer
20*6777b538SAndroid Build Coastguard Worker  # links at once than we do compiles, because linking is memory-intensive.
21*6777b538SAndroid Build Coastguard Worker  # The default to use varies by platform and by the amount of memory
22*6777b538SAndroid Build Coastguard Worker  # available, so we call out to a script to get the right value.
23*6777b538SAndroid Build Coastguard Worker  concurrent_links = -1
24*6777b538SAndroid Build Coastguard Worker}
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Workerif (concurrent_links == -1) {
27*6777b538SAndroid Build Coastguard Worker  if (use_thin_lto) {
28*6777b538SAndroid Build Coastguard Worker    _args = [
29*6777b538SAndroid Build Coastguard Worker      "--reserve_mem_gb=10",
30*6777b538SAndroid Build Coastguard Worker      "--thin-lto=local",
31*6777b538SAndroid Build Coastguard Worker    ]
32*6777b538SAndroid Build Coastguard Worker    if (is_win) {
33*6777b538SAndroid Build Coastguard Worker      # Based on measurements of linking chrome.dll and chrome_child.dll, plus
34*6777b538SAndroid Build Coastguard Worker      # a little padding to account for future growth.
35*6777b538SAndroid Build Coastguard Worker      _args += [ "--mem_per_link_gb=45" ]
36*6777b538SAndroid Build Coastguard Worker    } else if (is_android) {
37*6777b538SAndroid Build Coastguard Worker      # Large solink of Android official builds take 30-60GB.
38*6777b538SAndroid Build Coastguard Worker      _args += [ "--mem_per_link_gb=30" ]
39*6777b538SAndroid Build Coastguard Worker    } else {
40*6777b538SAndroid Build Coastguard Worker      _args += [ "--mem_per_link_gb=20" ]
41*6777b538SAndroid Build Coastguard Worker    }
42*6777b538SAndroid Build Coastguard Worker  } else if ((use_clang_coverage &&
43*6777b538SAndroid Build Coastguard Worker              # When coverage_instrumentation_input_file is not empty it means
44*6777b538SAndroid Build Coastguard Worker              # we're only instrumenting changed files and not using a lot of
45*6777b538SAndroid Build Coastguard Worker              # memory. Likewise, when it's empty we're building everything with
46*6777b538SAndroid Build Coastguard Worker              # coverage, which requires more memory.
47*6777b538SAndroid Build Coastguard Worker              coverage_instrumentation_input_file == "") ||
48*6777b538SAndroid Build Coastguard Worker             use_sanitizer_coverage || use_fuzzing_engine) {
49*6777b538SAndroid Build Coastguard Worker    # Full sanitizer coverage instrumentation increases linker memory consumption
50*6777b538SAndroid Build Coastguard Worker    # significantly.
51*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=16" ]
52*6777b538SAndroid Build Coastguard Worker  } else if (is_win && symbol_level == 1 && !is_debug && is_component_build) {
53*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=3" ]
54*6777b538SAndroid Build Coastguard Worker  } else if (is_win) {
55*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=6" ]
56*6777b538SAndroid Build Coastguard Worker  } else if (is_mac) {
57*6777b538SAndroid Build Coastguard Worker    if (enable_dsyms) {
58*6777b538SAndroid Build Coastguard Worker      _args = [ "--mem_per_link_gb=12" ]
59*6777b538SAndroid Build Coastguard Worker    } else {
60*6777b538SAndroid Build Coastguard Worker      _args = [ "--mem_per_link_gb=4" ]
61*6777b538SAndroid Build Coastguard Worker    }
62*6777b538SAndroid Build Coastguard Worker  } else if (is_android && !is_component_build && symbol_level == 2) {
63*6777b538SAndroid Build Coastguard Worker    # Full debug symbols require large memory for link.
64*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=25" ]
65*6777b538SAndroid Build Coastguard Worker  } else if (is_android && !is_debug && !using_sanitizer && symbol_level < 2) {
66*6777b538SAndroid Build Coastguard Worker    if (symbol_level == 1) {
67*6777b538SAndroid Build Coastguard Worker      _args = [ "--mem_per_link_gb=6" ]
68*6777b538SAndroid Build Coastguard Worker    } else {
69*6777b538SAndroid Build Coastguard Worker      _args = [ "--mem_per_link_gb=4" ]
70*6777b538SAndroid Build Coastguard Worker    }
71*6777b538SAndroid Build Coastguard Worker  } else if ((is_linux || is_chromeos_lacros) && symbol_level == 0) {
72*6777b538SAndroid Build Coastguard Worker    # Memory consumption on link without debug symbols is low on linux.
73*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=3" ]
74*6777b538SAndroid Build Coastguard Worker  } else if (current_os == "zos") {
75*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=1" ]
76*6777b538SAndroid Build Coastguard Worker  } else if (is_fuchsia) {
77*6777b538SAndroid Build Coastguard Worker    # TODO(crbug.com/1347159): This was defaulting to 8GB. The number of
78*6777b538SAndroid Build Coastguard Worker    #    linker instances to run in parallel is calculated by diviging
79*6777b538SAndroid Build Coastguard Worker    #    the available memory by this value. On a 32GB machine with
80*6777b538SAndroid Build Coastguard Worker    #    roughly 29GB of available memory, this would cause three instances
81*6777b538SAndroid Build Coastguard Worker    #    to run. This started running out of memory and thrashing. This change
82*6777b538SAndroid Build Coastguard Worker    #    addresses that issue to get the SDk rollers running again but
83*6777b538SAndroid Build Coastguard Worker    #    could be optimized (maybe to 12GB or for different configs like
84*6777b538SAndroid Build Coastguard Worker    #    component build).
85*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=16" ]
86*6777b538SAndroid Build Coastguard Worker  } else if (is_chromeos && is_msan) {
87*6777b538SAndroid Build Coastguard Worker    # crbug.com/1505350 - CrOS MSan builder consumes more memory and crushes.
88*6777b538SAndroid Build Coastguard Worker    # Max 25.2GB, Avg: 9.4GB, Median: 7.9GB
89*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=12" ]
90*6777b538SAndroid Build Coastguard Worker  } else if (is_chromeos && is_debug) {
91*6777b538SAndroid Build Coastguard Worker    # b/315102033, b/312072730: Large links use 9GB-13.5GB.
92*6777b538SAndroid Build Coastguard Worker    _args = [ "--mem_per_link_gb=10" ]
93*6777b538SAndroid Build Coastguard Worker  } else {
94*6777b538SAndroid Build Coastguard Worker    _args = []
95*6777b538SAndroid Build Coastguard Worker  }
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker  # For Android builds, we also need to be wary of:
98*6777b538SAndroid Build Coastguard Worker  # * ProGuard / R8
99*6777b538SAndroid Build Coastguard Worker  # * Android Lint
100*6777b538SAndroid Build Coastguard Worker  # These both have a peak usage of < 2GB, but that is still large enough for
101*6777b538SAndroid Build Coastguard Worker  # them to need to use a pool since they both typically happen at the
102*6777b538SAndroid Build Coastguard Worker  # same time as linking.
103*6777b538SAndroid Build Coastguard Worker  if (is_android) {
104*6777b538SAndroid Build Coastguard Worker    _args += [ "--secondary_mem_per_link=2" ]
105*6777b538SAndroid Build Coastguard Worker  }
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker  # TODO(crbug.com/617429) Pass more build configuration info to the script
108*6777b538SAndroid Build Coastguard Worker  # so that we can compute better values.
109*6777b538SAndroid Build Coastguard Worker  _command_dict = exec_script("get_concurrent_links.py", _args, "scope")
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker  concurrent_links = _command_dict.primary_pool_size
112*6777b538SAndroid Build Coastguard Worker  concurrent_links_logs = _command_dict.explanation
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker  if (_command_dict.secondary_pool_size >= concurrent_links) {
115*6777b538SAndroid Build Coastguard Worker    # Have R8 / Lint share the link pool unless we would safely get more
116*6777b538SAndroid Build Coastguard Worker    # concurrency out of using a separate one.
117*6777b538SAndroid Build Coastguard Worker    # On low-RAM machines, this allows an apk's native library to link at the
118*6777b538SAndroid Build Coastguard Worker    # same time as its java is optimized with R8.
119*6777b538SAndroid Build Coastguard Worker    java_cmd_pool_size = _command_dict.secondary_pool_size
120*6777b538SAndroid Build Coastguard Worker  }
121*6777b538SAndroid Build Coastguard Worker} else {
122*6777b538SAndroid Build Coastguard Worker  assert(!use_thin_lto, "can't explicitly set concurrent_links with thinlto")
123*6777b538SAndroid Build Coastguard Worker  concurrent_links_logs =
124*6777b538SAndroid Build Coastguard Worker      [ "concurrent_links set by GN arg (value=$concurrent_links)" ]
125*6777b538SAndroid Build Coastguard Worker}
126