Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 1 | # 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 Hueber | 336a5ae | 2019-09-10 21:43:05 | [diff] [blame] | 5 | import("//build/config/chromecast_build.gni") |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 6 | import("//build/config/sanitizers/sanitizers.gni") |
| 7 | |
Benoit Lize | 88016fd | 2021-01-13 16:25:11 | [diff] [blame] | 8 | # Sanitizers replace the allocator, don't use our own. |
| 9 | _is_using_sanitizers = is_asan || is_hwasan || is_lsan || is_tsan || is_msan |
| 10 | |
Benoit Lize | 1ac7ce7 | 2021-07-01 10:59:55 | [diff] [blame] | 11 | # - Component build support is disabled on all platforms. It is known to cause |
| 12 | # issues on some (e.g. Windows with shims, Android with non-universal symbol |
| 13 | # wrapping), and has not been validated on others. |
| 14 | # - Windows: debug CRT is not compatible, see below. |
Benoit Lize | 53e1c74 | 2021-01-28 21:14:02 | [diff] [blame] | 15 | # - Chromecast on Android: causes issues with crash reporting, see b/178423326. |
| 16 | _disable_partition_alloc = |
Benoit Lize | 1ac7ce7 | 2021-07-01 10:59:55 | [diff] [blame] | 17 | is_component_build || (is_win && is_debug) || (is_android && is_chromecast) |
Thiabaud Engelbrecht | 64773c557 | 2021-07-21 21:20:56 | [diff] [blame] | 18 | _is_partition_alloc_platform = is_android || is_win || is_linux || is_chromeos |
Benoit Lize | b30fcd4 | 2021-01-15 13:44:12 | [diff] [blame] | 19 | |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 20 | # The debug CRT on Windows has some debug features that are incompatible with |
| 21 | # the shim. NaCl in particular does seem to link some binaries statically |
| 22 | # against the debug CRT with "is_nacl=false". |
Sean McAllister | deaa740 | 2020-07-31 04:42:54 | [diff] [blame] | 23 | if ((is_linux || is_chromeos || is_android || is_apple || |
Benoit Lize | 88016fd | 2021-01-13 16:25:11 | [diff] [blame] | 24 | (is_win && !is_component_build && !is_debug)) && !_is_using_sanitizers) { |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 25 | _default_use_allocator_shim = true |
| 26 | } else { |
| 27 | _default_use_allocator_shim = false |
| 28 | } |
| 29 | |
Benoit Lize | 060ef06 | 2021-02-01 11:41:46 | [diff] [blame] | 30 | if (_default_use_allocator_shim && _is_partition_alloc_platform && |
Benoit Lize | b30fcd4 | 2021-01-15 13:44:12 | [diff] [blame] | 31 | !_disable_partition_alloc) { |
Yuki Shiino | d476ae303 | 2020-11-18 05:56:23 | [diff] [blame] | 32 | _default_allocator = "partition" |
Nina Satragno | 3f9a04c8 | 2021-07-30 15:26:06 | [diff] [blame] | 33 | } else if (is_android || is_apple || _is_using_sanitizers || is_win || |
| 34 | is_fuchsia || ((is_linux || is_chromeos) && target_cpu == "arm64") || |
| 35 | (is_cast_audio_only && target_cpu == "arm")) { |
| 36 | # Temporarily disable tcmalloc on arm64 linux to get rid of compilation |
| 37 | # errors. |
Benoit Lize | b2b8274c | 2021-07-30 10:40:16 | [diff] [blame] | 38 | _default_allocator = "none" |
Nina Satragno | 3f9a04c8 | 2021-07-30 15:26:06 | [diff] [blame] | 39 | } else { |
| 40 | _default_allocator = "tcmalloc" |
Yuki Shiino | a17905e3 | 2020-10-09 18:04:59 | [diff] [blame] | 41 | } |
| 42 | |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 43 | declare_args() { |
| 44 | # Memory allocator to use. Set to "none" to use default allocator. |
| 45 | use_allocator = _default_allocator |
| 46 | |
| 47 | # Causes all the allocations to be routed via allocator_shim.cc. |
| 48 | use_allocator_shim = _default_use_allocator_shim |
Yuki Shiino | 24622fa | 2020-08-26 12:01:02 | [diff] [blame] | 49 | |
Yuki Shiino | 90d5fe68 | 2020-09-02 11:03:51 | [diff] [blame] | 50 | # Whether PartitionAlloc should be available for use or not. |
| 51 | # true makes PartitionAlloc linked to the executable or shared library and |
| 52 | # makes it available for use, but it doesn't mean that the default allocator |
| 53 | # is PartitionAlloc. PartitionAlloc may or may not be the default allocator. |
| 54 | # |
| 55 | # |use_allocator = "partition"| makes PartitionAlloc the default allocator |
| 56 | # but it's effective only when |use_partition_alloc = true|. |
| 57 | # |
| 58 | # TODO(lizeb, yukishiino): Determine if |use_partition_alloc| is necessary or |
| 59 | # not, and redesign or remove the flag accordingly. We may want to assert a |
| 60 | # possible conflict between |use_allocator = "partition"| and |
| 61 | # |use_partition_alloc = true| rather than prioritizing use_partition_alloc. |
| 62 | use_partition_alloc = !is_ios # Never use PartitionAlloc on iOS. |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 63 | |
Bartek Nowierski | b4c3970 | 2021-08-06 00:42:15 | [diff] [blame^] | 64 | # Set use_backup_ref_ptr true to use BackupRefPtr (BRP) as the implementation |
| 65 | # of raw_ptr<T>, and enable PartitionAlloc support for it. The _fake option |
| 66 | # doesn't enable BRP, but pretends it's enabled for the syntethic field trial |
| 67 | #(for testing purposes only). |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 68 | use_backup_ref_ptr = false |
| 69 | use_backup_ref_ptr_fake = false |
| 70 | |
Bartek Nowierski | b4c3970 | 2021-08-06 00:42:15 | [diff] [blame^] | 71 | # If BRP is enabled, additional options are available: |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 72 | # - enable_runtime_backup_ref_ptr_control: control BRP support at run-time |
| 73 | # (disable in some processes) |
| 74 | # - put_ref_count_in_previous_slot: place the ref-count at the end of the |
| 75 | # previous slot (or in metadata if a slot starts on the page boundary), as |
| 76 | # opposed to the beginning of the slot. |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 77 | # - never_remove_from_brp_pool_blocklist: never remove super-pages from the |
Bartek Nowierski | 5390439 | 2021-07-14 06:55:13 | [diff] [blame] | 78 | # BRP-pool block list |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 79 | # - enable_backup_ref_ptr_slow_checks: enable additional safety checks that |
| 80 | # are too expensive to have on by default. |
| 81 | enable_runtime_backup_ref_ptr_control = false |
Keishi Hattori | c46a503 | 2021-06-21 05:02:20 | [diff] [blame] | 82 | enable_backup_ref_ptr_in_renderer_process = false |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 83 | put_ref_count_in_previous_slot = false |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 84 | never_remove_from_brp_pool_blocklist = false |
| 85 | enable_backup_ref_ptr_slow_checks = false |
Yuki Shiino | 90d5fe68 | 2020-09-02 11:03:51 | [diff] [blame] | 86 | } |
| 87 | |
| 88 | if (!use_partition_alloc && use_allocator == "partition") { |
| 89 | # If there is a conflict, prioritize |use_partition_alloc| over |
| 90 | # |use_allocator|. |
| 91 | use_allocator = "none" |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 92 | } |
| 93 | |
Benoit Lize | a27feee | 2020-06-10 12:48:52 | [diff] [blame] | 94 | assert(use_allocator == "none" || use_allocator == "tcmalloc" || |
| 95 | use_allocator == "partition") |
| 96 | |
Nina Satragno | 3f9a04c8 | 2021-07-30 15:26:06 | [diff] [blame] | 97 | assert(!is_win || use_allocator != "tcmalloc", |
| 98 | "Tcmalloc doesn't work on Windows.") |
| 99 | assert(!is_mac || use_allocator != "tcmalloc", |
| 100 | "Tcmalloc doesn't work on macOS.") |
| 101 | assert(!is_ios || use_allocator != "tcmalloc", "Tcmalloc doesn't work on iOS.") |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 102 | |
Rohit Rao | 849b426 | 2020-05-01 19:10:34 | [diff] [blame] | 103 | assert( |
Yuki Shiino | 24622fa | 2020-08-26 12:01:02 | [diff] [blame] | 104 | !use_allocator_shim || is_linux || is_chromeos || is_android || is_win || |
| 105 | is_apple, |
Rohit Rao | 849b426 | 2020-05-01 19:10:34 | [diff] [blame] | 106 | "use_allocator_shim works only on Android, iOS, Linux, macOS, and Windows.") |
Nico Weber | b80b085 | 2019-08-01 22:03:01 | [diff] [blame] | 107 | |
| 108 | if (is_win && use_allocator_shim) { |
| 109 | assert(!is_component_build, |
| 110 | "The allocator shim doesn't work for the component build on Windows.") |
| 111 | } |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 112 | |
| 113 | # Prevent using BackupRefPtr when PartitionAlloc-Everywhere isn't used. |
| 114 | # In theory, such a configuration is possible, but its scope would be limited to |
| 115 | # only Blink partitions, which is currently not tested. Better to trigger an |
| 116 | # error, than have BackupRefPtr silently disabled while believing it is enabled. |
| 117 | if (!is_nacl) { |
| 118 | assert(!use_backup_ref_ptr || use_allocator == "partition", |
| 119 | "Can't use BackupRefPtr without PartitionAlloc-Everywhere") |
| 120 | } |
| 121 | |
| 122 | # enable_runtime_backup_ref_ptr_control can only be used if use_backup_ref_ptr |
| 123 | # is true. |
| 124 | assert(use_backup_ref_ptr || !enable_runtime_backup_ref_ptr_control, |
| 125 | "Can't control BackupRefPtr at run-time if it isn't enabled at all") |
| 126 | |
Keishi Hattori | c46a503 | 2021-06-21 05:02:20 | [diff] [blame] | 127 | # enable_backup_ref_ptr_in_renderer_process can only be used if |
| 128 | # enable_runtime_backup_ref_ptr_control is true. |
| 129 | assert( |
| 130 | enable_runtime_backup_ref_ptr_control || |
| 131 | !enable_backup_ref_ptr_in_renderer_process, |
| 132 | "Can't enable BackupRefPtr in renderer process if runtime control isn't enabled") |
| 133 | |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 134 | # put_ref_count_in_previous_slot can only be used if use_backup_ref_ptr |
| 135 | # is true. |
| 136 | assert( |
| 137 | use_backup_ref_ptr || !put_ref_count_in_previous_slot, |
| 138 | "Can't put ref count in the previous slot if BackupRefPtr isn't enabled at all") |
| 139 | |
Bartek Nowierski | 5390439 | 2021-07-14 06:55:13 | [diff] [blame] | 140 | # never_remove_from_brp_pool_blocklist can only be used if use_backup_ref_ptr |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 141 | # is true. |
| 142 | assert( |
Bartek Nowierski | 5390439 | 2021-07-14 06:55:13 | [diff] [blame] | 143 | use_backup_ref_ptr || !never_remove_from_brp_pool_blocklist, |
| 144 | "never_remove_from_brp_pool_blocklist requires BackupRefPtr to be enabled") |
Bartek Nowierski | ceb2fb3 | 2021-05-26 15:09:05 | [diff] [blame] | 145 | |
| 146 | # enable_backup_ref_ptr_slow_checks can only be used if use_backup_ref_ptr |
| 147 | # is true. |
| 148 | assert(use_backup_ref_ptr || !enable_backup_ref_ptr_slow_checks, |
| 149 | "Can't enable additional BackupRefPtr checks if it isn't enabled at all") |