import argparse
import os
import subprocess
import sys
_COVERAGE_FLAGS = [
'-fprofile-instr-generate',
'-fcoverage-mapping',
'-mllvm',
'-runtime-counter-relocation=true',
'-mllvm',
'-limited-coverage-experimental=true',
]
_DEFAULT_COVERAGE_EXCLUSION_LIST = [
'../../base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.cc', '../../base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.cc', '../../base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc', '../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc', '../../base/allocator/partition_allocator/src/partition_alloc/allocator_config.cc', '../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc', '../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc', '../../base/allocator/partition_allocator/src/partition_alloc/extended_api.cc', '../../base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc', '../../base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/in_slot_metadata.cc', '../../base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc', '../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc', '../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc', '../../base/allocator/partition_allocator/src/partition_alloc/oom.cc', '../../base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc', '../../base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/page_allocator_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_map_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers/flat_tree_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/proc_maps_linux.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_android.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_linux.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_mac.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_fuchsia.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/algorithm_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/functional_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/ranges/ranges_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/template_util_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_fuchsia_for_testing.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_linux_for_testing.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix_for_testing.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win_for_testing.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_fuchsia.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_now_posix.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_cookie.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_lock_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_oom.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_page.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_root.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc', '../../base/allocator/partition_allocator/src/partition_alloc/partition_tls_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/empty.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_counting_impl_for_test.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/random.cc', '../../base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc', '../../base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine.cc', '../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_support.cc', '../../base/allocator/partition_allocator/src/partition_alloc/scheduler_loop_quarantine_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_android.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_winheap.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_functions_win_component.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_win_component.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_win_static.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/empty.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.cc', '../../base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/slot_start.cc', '../../base/allocator/partition_allocator/src/partition_alloc/slot_start_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm64/push_registers_asm.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm/push_registers_asm.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/loong64/push_registers_asm.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/riscv64/push_registers_asm.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x64/push_registers_asm.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x86/push_registers_asm.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/stack.cc', '../../base/allocator/partition_allocator/src/partition_alloc/stack/stack_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/tagging.cc', '../../base/allocator/partition_allocator/src/partition_alloc/tagging_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc', '../../base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.cc', '../../base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc', '../../base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc', ]
_COVERAGE_EXCLUSION_LIST_MAP = {
'android': [
'../../device/gamepad/dualshock4_controller.cc',
] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
'fuchsia': [
'../../third_party/skia/src/core/SkOpts.cpp',
'../../third_party/skia/src/opts/SkOpts_hsw.cpp',
'../../third_party/skia/third_party/skcms/skcms.cc',
] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
'linux': [
'../../chrome/browser/media/router/providers/cast/cast_internal_message_util.cc', '../../components/media_router/common/providers/cast/channel/cast_channel_enum.cc', '../../components/media_router/common/providers/cast/channel/cast_message_util.cc', '../../components/media_router/common/providers/cast/cast_media_source.cc', '../../ui/events/keycodes/dom/keycode_converter.cc',
] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
'chromeos': [
'../../third_party/webrtc/p2p/base/p2p_transport_channel.cc',
'../../third_party/icu/source/common/uts46.cpp',
'../../third_party/icu/source/common/ucnvmbcs.cpp',
'../../base/android/android_image_reader_compat.cc',
] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
}
_COVERAGE_FORCE_LIST_MAP = {
'win': [r'..\..\base\test\clang_profiling.cc'],
'mac': ['../../base/test/clang_profiling.cc'],
}
def _remove_flags_from_command(command):
start_flag = _COVERAGE_FLAGS[0]
num_flags = len(_COVERAGE_FLAGS)
start_idx = 0
try:
while True:
idx = command.index(start_flag, start_idx)
if command[idx:idx + num_flags] == _COVERAGE_FLAGS:
del command[idx:idx + num_flags]
start_idx = idx
else:
start_idx = idx + 1
except ValueError:
pass
def main():
arg_parser = argparse.ArgumentParser()
arg_parser.usage = __doc__
arg_parser.add_argument(
'--files-to-instrument',
type=str,
help='Path to a file that contains a list of file names to instrument.')
arg_parser.add_argument(
'--target-os', required=False, help='The OS to compile for.')
arg_parser.add_argument('args', nargs=argparse.REMAINDER)
parsed_args = arg_parser.parse_args()
if (parsed_args.files_to_instrument and
not os.path.isfile(parsed_args.files_to_instrument)):
raise Exception('Path to the coverage instrumentation file: "%s" doesn\'t '
'exist.' % parsed_args.files_to_instrument)
compile_command = parsed_args.args
if not any('clang' in s for s in compile_command):
return subprocess.call(compile_command)
target_os = parsed_args.target_os
try:
source_flag = '/c' if target_os == 'win' else '-c'
source_flag_index = compile_command.index(source_flag)
except ValueError:
print('%s argument is not found in the compile command.' % source_flag)
raise
if source_flag_index + 1 >= len(compile_command):
raise Exception('Source file to be compiled is missing from the command.')
compile_source_file = os.path.normpath(compile_command[source_flag_index + 1])
extension = os.path.splitext(compile_source_file)[1]
if not extension in ['.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.S']:
raise Exception('Invalid source file %s found' % compile_source_file)
exclusion_list = _COVERAGE_EXCLUSION_LIST_MAP.get(
target_os, _DEFAULT_COVERAGE_EXCLUSION_LIST)
force_list = _COVERAGE_FORCE_LIST_MAP.get(target_os, [])
should_remove_flags = False
if compile_source_file not in force_list:
if compile_source_file in exclusion_list:
should_remove_flags = True
elif parsed_args.files_to_instrument:
with open(parsed_args.files_to_instrument) as f:
if compile_source_file not in f.read():
should_remove_flags = True
if should_remove_flags:
_remove_flags_from_command(compile_command)
return subprocess.call(compile_command)
if __name__ == '__main__':
sys.exit(main())