blob: 605a2d455a8affffb3e864d872ffa767fdbc988f [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 Lize36552d82022-01-28 10:53:3220
21# - NaCl: No plans to support it.
22# - iOS: not done yet.
23_is_partition_alloc_platform = !is_nacl && !is_ios
Benoit Lizeb30fcd42021-01-15 13:44:1224
Kevin Marshall7a835b42022-01-08 23:17:1125# Under Windows Debug the allocator shim is not compatible with CRT.
26# NaCl in particular does seem to link some binaries statically
27# against the debug CRT with "is_nacl=false".
28# Under Fuchsia the allocator shim is only required for PA-E.
29# For all other platforms & configurations, the shim is required, to replace
Thiabaud Engelbrecht6d443612022-02-11 00:22:1830# the default system allocators, e.g. with Partition Alloc.
Kunihiko Sakamoto466878a42021-11-24 07:49:0131if ((is_linux || is_chromeos || is_android || is_apple ||
Benoit Lize36552d82022-01-28 10:53:3232 (is_fuchsia && !_disable_partition_alloc) ||
Benoit Lize88016fd2021-01-13 16:25:1133 (is_win && !is_component_build && !is_debug)) && !_is_using_sanitizers) {
Nico Weberb80b0852019-08-01 22:03:0134 _default_use_allocator_shim = true
35} else {
36 _default_use_allocator_shim = false
37}
38
Benoit Lize060ef062021-02-01 11:41:4639if (_default_use_allocator_shim && _is_partition_alloc_platform &&
Benoit Lizeb30fcd42021-01-15 13:44:1240 !_disable_partition_alloc) {
Yuki Shiinod476ae3032020-11-18 05:56:2341 _default_allocator = "partition"
Lan Weidb909c372021-09-10 17:34:0942} else {
Benoit Ld4000aec2021-09-15 13:23:2643 _default_allocator = "none"
Yuki Shiinoa17905e32020-10-09 18:04:5944}
45
Nico Weberb80b0852019-08-01 22:03:0146declare_args() {
47 # Memory allocator to use. Set to "none" to use default allocator.
48 use_allocator = _default_allocator
49
50 # Causes all the allocations to be routed via allocator_shim.cc.
51 use_allocator_shim = _default_use_allocator_shim
Yuki Shiino24622fa2020-08-26 12:01:0252
Yuki Shiino90d5fe682020-09-02 11:03:5153 # Whether PartitionAlloc should be available for use or not.
54 # true makes PartitionAlloc linked to the executable or shared library and
Bartek Nowierski974b49b2022-02-03 04:29:0955 # makes it available for use. It doesn't mean that the default allocator
56 # is PartitionAlloc, which is governed by |use_allocator|.
Yuki Shiino90d5fe682020-09-02 11:03:5157 #
Bartek Nowierski974b49b2022-02-03 04:29:0958 # This flag is currently set to false only on Cronet bots, because Cronet
59 # doesn't use PartitionAlloc at all, and doesn't wish to incur the library
60 # size increase (crbug.com/674570).
61 use_partition_alloc = true
Yuki Shiino90d5fe682020-09-02 11:03:5162}
63
64if (!use_partition_alloc && use_allocator == "partition") {
65 # If there is a conflict, prioritize |use_partition_alloc| over
66 # |use_allocator|.
67 use_allocator = "none"
Nico Weberb80b0852019-08-01 22:03:0168}
69
Benoit Lizef4e14722022-01-12 10:56:5270assert(use_allocator == "none" || use_allocator == "partition")
Nico Weberb80b0852019-08-01 22:03:0171
Rohit Rao849b4262020-05-01 19:10:3472assert(
Yuki Shiino24622fa2020-08-26 12:01:0273 !use_allocator_shim || is_linux || is_chromeos || is_android || is_win ||
Kevin Marshall64a82a92021-09-08 20:49:4574 is_fuchsia || is_apple,
75 "use_allocator_shim works only on Android, iOS, Linux, macOS, Fuchsia, " +
76 "and Windows.")
Nico Weberb80b0852019-08-01 22:03:0177
Moe Ahmadia36d801a2021-08-30 22:30:5378if (is_win && use_allocator_shim) {
Kevin Marshall64a82a92021-09-08 20:49:4579 # TODO(crbug.com/1245317): Add a comment indicating why the shim doesn't work.
Nico Weberb80b0852019-08-01 22:03:0180 assert(!is_component_build,
Moe Ahmadia36d801a2021-08-30 22:30:5381 "The allocator shim doesn't work for the component build on Windows.")
Nico Weberb80b0852019-08-01 22:03:0182}
Bartek Nowierskiceb2fb32021-05-26 15:09:0583
Keishi Hattorif8cb0ae2022-07-20 07:39:3884_is_brp_supported = (is_win || is_android || is_linux || is_mac ||
85 is_chromeos) && use_allocator == "partition"
Keishi Hattori01d5ac8fe2021-11-26 23:59:1486
Kalvin Leeecf3a882022-07-22 15:10:4787_is_mcp_supported = is_win && use_allocator == "partition"
88
89declare_args() {
90 # We jam MTECheckedPtr off by default, but can set it to
91 # `_is_mcp_supported` to activate it.
92 use_mte_checked_ptr = false
93}
94
Keishi Hattori01d5ac8fe2021-11-26 23:59:1495declare_args() {
96 # Set use_backup_ref_ptr true to use BackupRefPtr (BRP) as the implementation
97 # of raw_ptr<T>, and enable PartitionAlloc support for it.
Kalvin Leeecf3a882022-07-22 15:10:4798 # We also disable BRP in the presence of MTECheckedPtr, which is almost
99 # never enabled.
100 use_backup_ref_ptr = _is_brp_supported && !use_mte_checked_ptr
Kalvin Lee6f79e392022-02-18 18:55:50101}
Keishi Hattori01d5ac8fe2021-11-26 23:59:14102
Kalvin Lee240f4d12022-03-21 22:35:19103assert(!(use_backup_ref_ptr && use_mte_checked_ptr),
104 "MTECheckedPtr conflicts with BRP.")
105
Kalvin Lee6f79e392022-02-18 18:55:50106declare_args() {
Keishi Hattori01d5ac8fe2021-11-26 23:59:14107 # If BRP is enabled, additional options are available:
108 # - put_ref_count_in_previous_slot: place the ref-count at the end of the
109 # previous slot (or in metadata if a slot starts on the page boundary), as
110 # opposed to the beginning of the slot.
Keishi Hattori01d5ac8fe2021-11-26 23:59:14111 # - enable_backup_ref_ptr_slow_checks: enable additional safety checks that
112 # are too expensive to have on by default.
Arthur Sonzogni0db17dd2022-02-14 13:50:27113 # - enable_dangling_raw_ptr_checks: enable checking raw_ptr do not become
114 # dangling during their lifetime.
Keishi Hattoric4aeea42022-03-23 11:02:37115 put_ref_count_in_previous_slot = use_backup_ref_ptr
Keishi Hattori14dcefd2021-11-28 10:46:22116 enable_backup_ref_ptr_slow_checks = false
Arthur Sonzogni0db17dd2022-02-14 13:50:27117 enable_dangling_raw_ptr_checks = false
Keishi Hattori01d5ac8fe2021-11-26 23:59:14118
119 # Registers the binary for a fake binary A/B experiment. The binaries built
120 # with this flag have no behavior difference, except for setting a synthetic
121 # Finch.
122 use_fake_binary_experiment = false
Sergei Glazunov017ec4e82022-01-26 11:50:49123
Sergei Glazunov38f07f62022-06-15 09:45:58124 # The supported platforms are supposed to match `_is_brp_supported`, but we
125 # enable the feature on Linux early because it's most widely used for security
126 # research
127 use_asan_backup_ref_ptr = is_asan && (is_win || is_android || is_linux)
Keishi Hattori01d5ac8fe2021-11-26 23:59:14128}
129
Bartek Nowierskiceb2fb32021-05-26 15:09:05130# Prevent using BackupRefPtr when PartitionAlloc-Everywhere isn't used.
131# In theory, such a configuration is possible, but its scope would be limited to
132# only Blink partitions, which is currently not tested. Better to trigger an
133# error, than have BackupRefPtr silently disabled while believing it is enabled.
134if (!is_nacl) {
135 assert(!use_backup_ref_ptr || use_allocator == "partition",
136 "Can't use BackupRefPtr without PartitionAlloc-Everywhere")
137}
138
Bartek Nowierskiceb2fb32021-05-26 15:09:05139# put_ref_count_in_previous_slot can only be used if use_backup_ref_ptr
140# is true.
141assert(
142 use_backup_ref_ptr || !put_ref_count_in_previous_slot,
143 "Can't put ref count in the previous slot if BackupRefPtr isn't enabled at all")
144
Bartek Nowierskiceb2fb32021-05-26 15:09:05145# enable_backup_ref_ptr_slow_checks can only be used if use_backup_ref_ptr
146# is true.
147assert(use_backup_ref_ptr || !enable_backup_ref_ptr_slow_checks,
148 "Can't enable additional BackupRefPtr checks if it isn't enabled at all")
Sergei Glazunov017ec4e82022-01-26 11:50:49149
Arthur Sonzogni0db17dd2022-02-14 13:50:27150# enable_dangling_raw_ptr_checks can only be used if use_backup_ref_ptr
151# is true.
152assert(
153 use_backup_ref_ptr || !enable_dangling_raw_ptr_checks,
154 "Can't enable dangling raw_ptr checks if BackupRefPtr isn't enabled at all")
155
Sergei Glazunov017ec4e82022-01-26 11:50:49156# BackupRefPtr and AsanBackupRefPtr are mutually exclusive variants of raw_ptr.
157assert(
158 !use_backup_ref_ptr || !use_asan_backup_ref_ptr,
159 "Both BackupRefPtr and AsanBackupRefPtr can't be enabled at the same time")
160
161assert(!use_asan_backup_ref_ptr || is_asan,
162 "AsanBackupRefPtr requires AddressSanitizer")