From 32fc106ab0264ee1685d39f6f775062c98271c8e Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Sat, 11 May 2024 13:33:27 -0400 Subject: [PATCH] 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 --- tools/gn_args.py | 63 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/tools/gn_args.py b/tools/gn_args.py index 830792eab..ead4d2503 100644 --- a/tools/gn_args.py +++ b/tools/gn_args.py @@ -158,7 +158,7 @@ def GetValueString(val): return val -def GetChromiumDefaultArgs(): +def GetChromiumDefaultArgs(is_debug): """ Return default GN args. These must match the Chromium defaults. Only args that may be retrieved via GetArgValue() need to be specified here. @@ -169,6 +169,7 @@ def GetChromiumDefaultArgs(): defaults = { 'dcheck_always_on': False, 'is_asan': False, + 'is_component_build': is_debug, 'is_debug': True, 'is_official_build': False, 'target_cpu': 'x64', @@ -188,12 +189,15 @@ def GetChromiumDefaultArgs(): return defaults -def GetArgValue(args, key): +def GetArgValue(args, key, is_debug=None): """ 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() - assert key in defaults, "No default Chromium value specified for %s" % key + defaults = GetChromiumDefaultArgs(is_debug) + assert not defaults.get(key, None) is None, \ + "No default Chromium value specified for %s" % 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 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 @@ -331,7 +323,7 @@ def GetMergedArgs(build_args): return MergeDicts(dict, required) -def ValidateArgs(args): +def ValidateArgs(args, is_debug): """ Validate GN arg combinations that we know about. Also provide suggestions where appropriate. @@ -483,6 +475,39 @@ def GetConfigArgs(args, is_debug, cpu): is_debug = False 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, { 'is_debug': is_debug, 'target_cpu': cpu, @@ -494,7 +519,7 @@ def GetConfigArgs(args, is_debug, cpu): if key.startswith('arm_'): del result[key] - ValidateArgs(result) + ValidateArgs(result, is_debug) return result @@ -550,7 +575,7 @@ def GetConfigArgsSandbox(platform, args, is_debug, cpu): 'target_cpu': cpu, }) - ValidateArgs(result) + ValidateArgs(result, is_debug) return result