Enable BackupRefPtr for compatible non-Official builds (see #3239)

Compatible configurations include:
- Non-component builds.
- Debug builds on Mac/Linux.
- Release builds on Windows (b/c Debug builds require component builds).
- ASAN builds (which are also Release builds).

See related logic in //build_overrides/partition_alloc.gni
This commit is contained in:
Marshall Greenblatt 2024-05-11 13:33:27 -04:00
parent 0170f431a0
commit 32fc106ab0

View File

@ -158,7 +158,7 @@ def GetValueString(val):
return val return val
def GetChromiumDefaultArgs(): def GetChromiumDefaultArgs(is_debug):
""" """
Return default GN args. These must match the Chromium defaults. Return default GN args. These must match the Chromium defaults.
Only args that may be retrieved via GetArgValue() need to be specified here. Only args that may be retrieved via GetArgValue() need to be specified here.
@ -169,6 +169,7 @@ def GetChromiumDefaultArgs():
defaults = { defaults = {
'dcheck_always_on': False, 'dcheck_always_on': False,
'is_asan': False, 'is_asan': False,
'is_component_build': is_debug,
'is_debug': True, 'is_debug': True,
'is_official_build': False, 'is_official_build': False,
'target_cpu': 'x64', 'target_cpu': 'x64',
@ -188,12 +189,15 @@ def GetChromiumDefaultArgs():
return defaults return defaults
def GetArgValue(args, key): def GetArgValue(args, key, is_debug=None):
""" """
Return an existing GN arg value or the Chromium default. Return an existing GN arg value or the Chromium default.
The |is_debug| argument is required in cases where |key| references it in
GetChromiumDefaultArgs.
""" """
defaults = GetChromiumDefaultArgs() defaults = GetChromiumDefaultArgs(is_debug)
assert key in defaults, "No default Chromium value specified for %s" % key assert not defaults.get(key, None) is None, \
"No default Chromium value specified for %s" % key
return args.get(key, defaults[key]) return args.get(key, defaults[key])
@ -258,18 +262,6 @@ def GetRecommendedDefaultArgs():
# https://groups.google.com/a/chromium.org/g/chromium-packagers/c/-2VGexQAK6w/m/5K5ppK9WBAAJ # https://groups.google.com/a/chromium.org/g/chromium-packagers/c/-2VGexQAK6w/m/5K5ppK9WBAAJ
result['use_qt'] = False result['use_qt'] = False
# Use the system allocator instead of PartitionAlloc. Default is True with
# the allocator shim enabled. See issues #3061 and #3095.
result['use_partition_alloc_as_malloc'] = False
if platform == 'linux' or platform == 'mac':
# Disable dangling pointer detector until raw_ptr<> is enabled (see #3239).
# https://chromium.googlesource.com/chromium/src/+/main/docs/dangling_ptr.md
# These also require use_partition_alloc_as_malloc=true.
result['enable_backup_ref_ptr_support'] = False
result['enable_dangling_raw_ptr_checks'] = False
result['enable_dangling_raw_ptr_feature_flag'] = False
return result return result
@ -331,7 +323,7 @@ def GetMergedArgs(build_args):
return MergeDicts(dict, required) return MergeDicts(dict, required)
def ValidateArgs(args): def ValidateArgs(args, is_debug):
""" """
Validate GN arg combinations that we know about. Also provide suggestions Validate GN arg combinations that we know about. Also provide suggestions
where appropriate. where appropriate.
@ -483,6 +475,39 @@ def GetConfigArgs(args, is_debug, cpu):
is_debug = False is_debug = False
add_args['dcheck_always_on'] = True add_args['dcheck_always_on'] = True
if platform == 'linux':
# Use PartitionAlloc-Everywhere (PA-E) instead of the default system
# allocator. Default is True with the allocator shim enabled. This is
# disabled for improved client app compatibility (see issues #3061 and
# #3095).
#
# Note that PartitionAlloc is still available in the binary and may be
# used explicitly in some cases. It would be better to instead build with
# |use_allocator_shim=false use_partition_alloc=false| to completely
# disable the allocator shim and PartitionAlloc, however that currently
# causes build errors in Chromium (see issue #3095).
add_args['use_partition_alloc_as_malloc'] = False
# BackupRefPtr support requires PA-E, so disable it.
add_args['enable_backup_ref_ptr_support'] = False
else:
is_asan = GetArgValue(args, 'is_asan')
# Enable additional BackupRefPtr debug features in non-Official build
# configurations that support them. See //main/base/memory/raw_ptr.md
if (is_debug or platform == 'windows' or is_asan) and \
not GetArgValue(args, 'is_component_build', is_debug):
if is_asan:
# Enable additional security checks for ASAN. Note that ASAN does not
# support PartitionAlloc-Everywhere (PA-E) and consequently provides
# slightly different functionality. This arg is equivalent to passing
# `--enable-features=PartitionAllocBackupRefPtr` on the command-line.
add_args['enable_backup_ref_ptr_feature_flag'] = True
else:
# Use a global table to track all live raw_ptr/raw_ref instances to help
# debug dangling pointers. This requires PA-E.
add_args['enable_backup_ref_ptr_instance_tracer'] = True
result = MergeDicts(args, add_args, { result = MergeDicts(args, add_args, {
'is_debug': is_debug, 'is_debug': is_debug,
'target_cpu': cpu, 'target_cpu': cpu,
@ -494,7 +519,7 @@ def GetConfigArgs(args, is_debug, cpu):
if key.startswith('arm_'): if key.startswith('arm_'):
del result[key] del result[key]
ValidateArgs(result) ValidateArgs(result, is_debug)
return result return result
@ -550,7 +575,7 @@ def GetConfigArgsSandbox(platform, args, is_debug, cpu):
'target_cpu': cpu, 'target_cpu': cpu,
}) })
ValidateArgs(result) ValidateArgs(result, is_debug)
return result return result