chromium/build_overrides/partition_alloc.gni

# 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