# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This defines PartitionAlloc's default build configuration for chromium.
# If building PartitionAlloc as a part of chromium,
# //build_overrides/partition_alloc.gni points out this file.
# //base/allocator/partition_allocator/partition_alloc.gni will import
# this file and will use the defined values as default build configuration.
#
# partition_alloc.gni declares the following variables:
# - use_allocator_shim
# - use_partition_alloc_as_malloc
# - enable_backup_ref_ptr_support
# - enable_backup_ref_ptr_slow_checks
# - enable_dangling_raw_ptr_checks
# - backup_ref_ptr_poison_oob_ptr
#
# Temporarily defines use_allocator_shim here. After deciding what
# allocator_shim should be (e.g. a part of PartitionAlloc, a new component:
# allocator_shim, and so on), move use_allocator_shim_default to the place.
# - use_allocator_shim
#
# {variable}_default works as the default value of {variable}.
# TODO(crbug.com/41481467) Document what are the required and optional GN
# variable embedders can provide to partition_alloc. For the least common,
# consider wrapping them into some partition_alloc specific names.
import("//build/config/android/config.gni")
import("//build/config/cast.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/cronet/config.gni")
import("//build/config/dcheck_always_on.gni")
import("//build/config/logging.gni")
import("//build/config/sanitizers/sanitizers.gni")
if (is_ios) {
import("//ios/features.gni")
}
partition_alloc_enable_arc_config = "//build/config/compiler:enable_arc"
declare_args() {
# Turns on compiler optimizations in PartitionAlloc in Debug build. If
# enabling PartitionAlloc-Everywhere in Debug build for tests in Debug build,
# since all memory allocations and deallocations are executed by non-optimized
# PartitionAlloc, chrome (including tests) will be much slower. This will
# cause debug trybots' timeouts. If we want to debug PartitionAlloc itself,
# use partition_alloc_optimized_debug=false. Otherwise, use
# partition_alloc_optimized_debug=true to enable optimized PartitionAlloc.
partition_alloc_optimized_debug = true
}
if (!is_debug || partition_alloc_optimized_debug) {
# In chrome, partition_alloc is relatively hot (>1% of cycles for users of
# CrOS). Use speed-focused optimizations for it.
partition_alloc_remove_configs =
[ "//build/config/compiler:default_optimization" ]
partition_alloc_add_configs = [ "//build/config/compiler:optimize_speed" ]
} else {
partition_alloc_remove_configs =
[ "//build/config/compiler:default_optimization" ]
partition_alloc_add_configs = [ "//build/config/compiler:no_optimize" ]
}
# llvm_profile_set_target() generated by -fgenerate-profile invokes malloc()
# internally. Since allocator_shim and PartitionAlloc are not reenterant,
# the code will cause crashes. See crbug.com/338094768.
partition_alloc_remove_configs +=
[ "//build/config/compiler/pgo:default_pgo_flags" ]
# Sanitizers replace the allocator, don't use our own.
_is_using_sanitizers = is_asan || is_hwasan || is_lsan || is_tsan || is_msan
# - Component build support is disabled on all platforms except Linux. It is
# known to cause issues on some (e.g. Windows with shims, Android with
# non-universal symbol wrapping), and has not been validated on others.
# - Windows: debug CRT is not compatible, see below.
_disable_partition_alloc_everywhere =
(!is_linux && is_component_build) || (is_win && is_debug)
# - NaCl: No plans to support it.
# - iOS: Depends on ios_partition_alloc_enabled.
if (is_ios) {
_is_partition_alloc_everywhere_platform = ios_partition_alloc_enabled
} else {
_is_partition_alloc_everywhere_platform = !is_nacl
}
# Under Windows debug build, the allocator shim is not compatible with CRT.
# NaCl in particular does seem to link some binaries statically
# against the debug CRT with "is_nacl=false".
# Under Fuchsia, the allocator shim is only required for PA-E.
# For all other platforms & configurations, the shim is required, to replace
# the default system allocators, e.g. with PartitionAlloc.
if ((is_linux || is_chromeos || is_android || is_apple ||
(is_fuchsia && !_disable_partition_alloc_everywhere) ||
(is_win && !is_debug &&
(!is_component_build || (use_custom_libcxx && !libcxx_is_shared)))) &&
!_is_using_sanitizers) {
_default_use_allocator_shim = true
} else {
_default_use_allocator_shim = false
}
if (_default_use_allocator_shim && _is_partition_alloc_everywhere_platform &&
!_disable_partition_alloc_everywhere) {
_default_allocator = "partition"
} else {
_default_allocator = "none"
}
use_partition_alloc_as_malloc_default = _default_allocator == "partition"
use_allocator_shim_default = _default_use_allocator_shim
_is_brp_supported =
(is_win || is_android || is_linux || is_mac || is_ios || is_chromeos ||
is_fuchsia) && use_partition_alloc_as_malloc_default
enable_backup_ref_ptr_support_default = _is_brp_supported
enable_backup_ref_ptr_slow_checks_default = false
enable_dangling_raw_ptr_checks_default =
enable_backup_ref_ptr_support_default &&
(is_linux || is_win || is_chromeos || is_mac) && !is_official_build &&
(is_debug || dcheck_always_on)
raw_ptr_zero_on_construct_default = true
raw_ptr_zero_on_move_default = true
raw_ptr_zero_on_destruct_default = false
# Allow embedders to opt-out of C++20 build which is set as default.
# Kindly notify PartitionAlloc owners of change to false.
assert_cpp20_default = true