blob: 4d135093e1bea1e9707d723a3540251732dc8e5b [file] [log] [blame]
# 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" ]
# - 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.
_is_partition_alloc_everywhere_platform =
!is_nacl && (!is_ios || ios_partition_alloc_enabled)
use_allocator_shim_default = true # Updated below:
# Sanitizers replace the allocator, don't use our own.
if (is_asan || is_hwasan || is_lsan || is_tsan || is_msan) {
use_allocator_shim_default = false
}
# NaCl will never support the allocator shim.
if (is_nacl) {
use_allocator_shim_default = false
}
# Under Fuchsia, the allocator shim is only required for PA-E.
if (is_fuchsia && _disable_partition_alloc_everywhere) {
use_allocator_shim_default = false
}
# 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".
if (is_win && is_debug) {
use_allocator_shim_default = false
}
if (is_win && is_component_build && (!use_custom_libcxx || libcxx_is_shared)) {
use_allocator_shim_default = false
}
use_partition_alloc_as_malloc_default =
use_allocator_shim_default && _is_partition_alloc_everywhere_platform &&
!_disable_partition_alloc_everywhere
enable_backup_ref_ptr_support_default = use_partition_alloc_as_malloc_default
enable_backup_ref_ptr_slow_checks_default = false
enable_dangling_raw_ptr_checks_default =
# The DanglingPointerDetector relies on BackupRefPtr:
enable_backup_ref_ptr_support_default &&
# DanglingPointerDetector is not yet enabled for official builds.
# Enabling it would require:
# - Metric-monitored dry-runs to assess real-world impact.
# - Performance re-evaluation, although past impact was neutral.
# - Additional considerations (etc.).
#
# It's also unclear if potential security issues warrant crash reports,
# as this could burden developers. Non-crashing metrics might help assess
# the value.
!is_official_build &&
# In unofficial builds, enable only for developers interested in
# DCHECKd/Debug builds. In the future, given its neutral performance impact,
# we could consider removing this restriction.
(is_debug || dcheck_always_on) &&
# Fuchsia and iOS have never been tested against DanglingPointerDetector at
# the moment.
!is_ios && !is_fuchsia &&
# Only the `android-rel` CQ bot has enforced DanglingPointerDetector checks
# at the moment. The other Android bots are not ready for it yet.
!is_android
enable_ios_corruption_hardening_default =
is_ios && ios_partition_alloc_corruption_hardening_enabled
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