1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155

build_overrides / partition_alloc.gni [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