blob: bf5e8f7c4375187fe4bcf610ff1faddb8e6a6066 [file] [log] [blame]
Nico Weberb80b0852019-08-01 22:03:011# Copyright 2019 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
Rob Hueber336a5ae2019-09-10 21:43:055import("//build/config/chromecast_build.gni")
Nico Weberb80b0852019-08-01 22:03:016import("//build/config/sanitizers/sanitizers.gni")
7
Ali Juma50a19382021-09-20 21:25:238if (is_ios) {
9 import("//build/config/ios/ios_sdk.gni")
10}
11
Benoit Lize88016fd2021-01-13 16:25:1112# Sanitizers replace the allocator, don't use our own.
13_is_using_sanitizers = is_asan || is_hwasan || is_lsan || is_tsan || is_msan
14
Benoit Lize1ac7ce72021-07-01 10:59:5515# - Component build support is disabled on all platforms. It is known to cause
16# issues on some (e.g. Windows with shims, Android with non-universal symbol
17# wrapping), and has not been validated on others.
18# - Windows: debug CRT is not compatible, see below.
Benoit Lizec74f98f2021-10-25 13:15:2919_disable_partition_alloc = is_component_build || (is_win && is_debug)
Benoit Lizeec6b52f2021-11-18 19:54:1720_is_partition_alloc_platform =
Kevin Marshall1e078242022-01-20 12:10:1221 is_android || is_win || is_mac || is_linux || is_chromeos || is_fuchsia
Benoit Lizeb30fcd42021-01-15 13:44:1222
Kevin Marshall7a835b42022-01-08 23:17:1123# Under Windows Debug the allocator shim is not compatible with CRT.
24# NaCl in particular does seem to link some binaries statically
25# against the debug CRT with "is_nacl=false".
26# Under Fuchsia the allocator shim is only required for PA-E.
27# For all other platforms & configurations, the shim is required, to replace
28# the default system allocators, e.g. with tcmalloc.
Kunihiko Sakamoto466878a42021-11-24 07:49:0129if ((is_linux || is_chromeos || is_android || is_apple ||
Kevin Marshall248fefc32022-01-10 20:45:3030 (is_fuchsia && _is_partition_alloc_platform && !is_component_build) ||
Benoit Lize88016fd2021-01-13 16:25:1131 (is_win && !is_component_build && !is_debug)) && !_is_using_sanitizers) {
Nico Weberb80b0852019-08-01 22:03:0132 _default_use_allocator_shim = true
33} else {
34 _default_use_allocator_shim = false
35}
36
Benoit Lize060ef062021-02-01 11:41:4637if (_default_use_allocator_shim && _is_partition_alloc_platform &&
Benoit Lizeb30fcd42021-01-15 13:44:1238 !_disable_partition_alloc) {
Yuki Shiinod476ae3032020-11-18 05:56:2339 _default_allocator = "partition"
Lan Weidb909c372021-09-10 17:34:0940} else {
Benoit Ld4000aec2021-09-15 13:23:2641 _default_allocator = "none"
Yuki Shiinoa17905e32020-10-09 18:04:5942}
43
Nico Weberb80b0852019-08-01 22:03:0144declare_args() {
45 # Memory allocator to use. Set to "none" to use default allocator.
46 use_allocator = _default_allocator
47
48 # Causes all the allocations to be routed via allocator_shim.cc.
49 use_allocator_shim = _default_use_allocator_shim
Yuki Shiino24622fa2020-08-26 12:01:0250
Yuki Shiino90d5fe682020-09-02 11:03:5151 # Whether PartitionAlloc should be available for use or not.
52 # true makes PartitionAlloc linked to the executable or shared library and
53 # makes it available for use, but it doesn't mean that the default allocator
54 # is PartitionAlloc. PartitionAlloc may or may not be the default allocator.
55 #
56 # |use_allocator = "partition"| makes PartitionAlloc the default allocator
57 # but it's effective only when |use_partition_alloc = true|.
58 #
59 # TODO(lizeb, yukishiino): Determine if |use_partition_alloc| is necessary or
60 # not, and redesign or remove the flag accordingly. We may want to assert a
61 # possible conflict between |use_allocator = "partition"| and
62 # |use_partition_alloc = true| rather than prioritizing use_partition_alloc.
Ali Juma50a19382021-09-20 21:25:2363 # TODO(crbug.com/1250788): Enable use_partition_alloc on iOS device builds.
64 use_partition_alloc = !is_ios || target_environment == "simulator"
Yuki Shiino90d5fe682020-09-02 11:03:5165}
66
67if (!use_partition_alloc && use_allocator == "partition") {
68 # If there is a conflict, prioritize |use_partition_alloc| over
69 # |use_allocator|.
70 use_allocator = "none"
Nico Weberb80b0852019-08-01 22:03:0171}
72
Benoit Lizef4e14722022-01-12 10:56:5273# TODO(crbug.com/1257213): Completely remove tcmalloc and related files.
74assert(use_allocator == "none" || use_allocator == "partition")
Nico Weberb80b0852019-08-01 22:03:0175
Rohit Rao849b4262020-05-01 19:10:3476assert(
Yuki Shiino24622fa2020-08-26 12:01:0277 !use_allocator_shim || is_linux || is_chromeos || is_android || is_win ||
Kevin Marshall64a82a92021-09-08 20:49:4578 is_fuchsia || is_apple,
79 "use_allocator_shim works only on Android, iOS, Linux, macOS, Fuchsia, " +
80 "and Windows.")
Nico Weberb80b0852019-08-01 22:03:0181
Moe Ahmadia36d801a2021-08-30 22:30:5382if (is_win && use_allocator_shim) {
Kevin Marshall64a82a92021-09-08 20:49:4583 # TODO(crbug.com/1245317): Add a comment indicating why the shim doesn't work.
Nico Weberb80b0852019-08-01 22:03:0184 assert(!is_component_build,
Moe Ahmadia36d801a2021-08-30 22:30:5385 "The allocator shim doesn't work for the component build on Windows.")
Nico Weberb80b0852019-08-01 22:03:0186}
Bartek Nowierskiceb2fb32021-05-26 15:09:0587
Keishi Hattori122e7a02021-11-28 11:51:0188_is_brp_supported = (is_win || is_android) && use_allocator == "partition"
Keishi Hattori01d5ac8fe2021-11-26 23:59:1489
90declare_args() {
91 # Set use_backup_ref_ptr true to use BackupRefPtr (BRP) as the implementation
92 # of raw_ptr<T>, and enable PartitionAlloc support for it.
93 use_backup_ref_ptr = _is_brp_supported
94
95 # If BRP is enabled, additional options are available:
96 # - put_ref_count_in_previous_slot: place the ref-count at the end of the
97 # previous slot (or in metadata if a slot starts on the page boundary), as
98 # opposed to the beginning of the slot.
99 # - never_remove_from_brp_pool_blocklist: never remove super-pages from the
100 # BRP-pool block list
101 # - enable_backup_ref_ptr_slow_checks: enable additional safety checks that
102 # are too expensive to have on by default.
Bartek Nowierski0bd8f5d2021-12-15 02:19:37103 put_ref_count_in_previous_slot = _is_brp_supported
Keishi Hattori01d5ac8fe2021-11-26 23:59:14104 never_remove_from_brp_pool_blocklist = _is_brp_supported
Keishi Hattori14dcefd2021-11-28 10:46:22105 enable_backup_ref_ptr_slow_checks = false
Keishi Hattori01d5ac8fe2021-11-26 23:59:14106
107 # Registers the binary for a fake binary A/B experiment. The binaries built
108 # with this flag have no behavior difference, except for setting a synthetic
109 # Finch.
110 use_fake_binary_experiment = false
Sergei Glazunov017ec4e82022-01-26 11:50:49111
112 use_asan_backup_ref_ptr = false
Keishi Hattori01d5ac8fe2021-11-26 23:59:14113}
114
Bartek Nowierskiceb2fb32021-05-26 15:09:05115# Prevent using BackupRefPtr when PartitionAlloc-Everywhere isn't used.
116# In theory, such a configuration is possible, but its scope would be limited to
117# only Blink partitions, which is currently not tested. Better to trigger an
118# error, than have BackupRefPtr silently disabled while believing it is enabled.
119if (!is_nacl) {
120 assert(!use_backup_ref_ptr || use_allocator == "partition",
121 "Can't use BackupRefPtr without PartitionAlloc-Everywhere")
122}
123
Bartek Nowierskiceb2fb32021-05-26 15:09:05124# put_ref_count_in_previous_slot can only be used if use_backup_ref_ptr
125# is true.
126assert(
127 use_backup_ref_ptr || !put_ref_count_in_previous_slot,
128 "Can't put ref count in the previous slot if BackupRefPtr isn't enabled at all")
129
Bartek Nowierski53904392021-07-14 06:55:13130# never_remove_from_brp_pool_blocklist can only be used if use_backup_ref_ptr
Bartek Nowierskiceb2fb32021-05-26 15:09:05131# is true.
132assert(
Bartek Nowierski53904392021-07-14 06:55:13133 use_backup_ref_ptr || !never_remove_from_brp_pool_blocklist,
134 "never_remove_from_brp_pool_blocklist requires BackupRefPtr to be enabled")
Bartek Nowierskiceb2fb32021-05-26 15:09:05135
136# enable_backup_ref_ptr_slow_checks can only be used if use_backup_ref_ptr
137# is true.
138assert(use_backup_ref_ptr || !enable_backup_ref_ptr_slow_checks,
139 "Can't enable additional BackupRefPtr checks if it isn't enabled at all")
Sergei Glazunov017ec4e82022-01-26 11:50:49140
141# BackupRefPtr and AsanBackupRefPtr are mutually exclusive variants of raw_ptr.
142assert(
143 !use_backup_ref_ptr || !use_asan_backup_ref_ptr,
144 "Both BackupRefPtr and AsanBackupRefPtr can't be enabled at the same time")
145
146assert(!use_asan_backup_ref_ptr || is_asan,
147 "AsanBackupRefPtr requires AddressSanitizer")