tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

clang_code_coverage_wrapper.star (25653B)


      1 # -*- bazel-starlark -*-
      2 # Copyright 2023 The Chromium Authors
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 """Siso config version of clang_code_coverage_wrapper.py"""
      6 # LINT.IfChange
      7 
      8 load("@builtin//struct.star", "module")
      9 
     10 # Logics are copied from build/toolchain/clang_code_coverage_wrapper.py
     11 # in ordre to strip coverage flags without process invocation.
     12 # This is neceesary for Siso to send clang command to RBE without the wrapper and instrument file.
     13 
     14 # Flags used to enable coverage instrumentation.
     15 # Flags should be listed in the same order that they are added in
     16 # build/config/coverage/BUILD.gn
     17 _COVERAGE_FLAGS = [
     18     "-fprofile-instr-generate",
     19     "-fcoverage-mapping",
     20     "-mllvm",
     21     "-runtime-counter-relocation=true",
     22     # Following experimental flags remove unused header functions from the
     23     # coverage mapping data embedded in the test binaries, and the reduction
     24     # of binary size enables building Chrome's large unit test targets on
     25     # MacOS. Please refer to crbug.com/796290 for more details.
     26     "-mllvm",
     27     "-limited-coverage-experimental=true",
     28 ]
     29 
     30 # Files that should not be built with coverage flags by default.
     31 _DEFAULT_COVERAGE_EXCLUSION_LIST = [
     32     # These files caused perf regressions, resulting in time-outs on some bots.
     33     # TODO(https://crbug.com/356570413): Remove when the bug is fixed.
     34     "../../base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.cc",
     35     "../../base/allocator/partition_allocator/src/partition_alloc/address_pool_manager.cc",
     36     "../../base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_unittest.cc",
     37     "../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.cc",
     38     "../../base/allocator/partition_allocator/src/partition_alloc/address_space_randomization_unittest.cc",
     39     "../../base/allocator/partition_allocator/src/partition_alloc/allocation_guard.cc",
     40     "../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer.cc",
     41     "../../base/allocator/partition_allocator/src/partition_alloc/compressed_pointer_unittest.cc",
     42     "../../base/allocator/partition_allocator/src/partition_alloc/dangling_raw_ptr_checks.cc",
     43     "../../base/allocator/partition_allocator/src/partition_alloc/extended_api.cc",
     44     "../../base/allocator/partition_allocator/src/partition_alloc/freeslot_bitmap_unittest.cc",
     45     "../../base/allocator/partition_allocator/src/partition_alloc/gwp_asan_support.cc",
     46     "../../base/allocator/partition_allocator/src/partition_alloc/hardening_unittest.cc",
     47     "../../base/allocator/partition_allocator/src/partition_alloc/internal_allocator.cc",
     48     "../../base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine.cc",
     49     "../../base/allocator/partition_allocator/src/partition_alloc/lightweight_quarantine_unittest.cc",
     50     "../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer.cc",
     51     "../../base/allocator/partition_allocator/src/partition_alloc/memory_reclaimer_unittest.cc",
     52     "../../base/allocator/partition_allocator/src/partition_alloc/oom_callback.cc",
     53     "../../base/allocator/partition_allocator/src/partition_alloc/oom.cc",
     54     "../../base/allocator/partition_allocator/src/partition_alloc/page_allocator.cc",
     55     "../../base/allocator/partition_allocator/src/partition_alloc/page_allocator_internals_posix.cc",
     56     "../../base/allocator/partition_allocator/src/partition_alloc/page_allocator_unittest.cc",
     57     "../../base/allocator/partition_allocator/src/partition_alloc/partition_address_space.cc",
     58     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/apple/mach_logging.cc",
     59     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/bits_pa_unittest.cc",
     60     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/check.cc",
     61     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/component_export_pa_unittest.cc",
     62     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu.cc",
     63     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/cpu_pa_unittest.cc",
     64     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/alias.cc",
     65     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/proc_maps_linux.cc",
     66     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_android.cc",
     67     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace.cc",
     68     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_linux.cc",
     69     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_mac.cc",
     70     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_posix.cc",
     71     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/debug/stack_trace_win.cc",
     72     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.cc",
     73     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path_pa_unittest.cc",
     74     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_util_posix.cc",
     75     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging.cc",
     76     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc",
     77     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging.cc",
     78     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/logging_pa_unittest.cc",
     79     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/log_message.cc",
     80     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_posix.cc",
     81     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/page_size_win.cc",
     82     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/memory/ref_counted.cc",
     83     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library.cc",
     84     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_pa_unittest.cc",
     85     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/native_library_posix.cc",
     86     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/no_destructor_pa_unittest.cc",
     87     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/posix/safe_strerror.cc",
     88     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_posix.cc",
     89     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/process/process_handle_win.cc",
     90     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util.cc",
     91     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_fuchsia.cc",
     92     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_pa_unittest.cc",
     93     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_posix.cc",
     94     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/rand_util_win.cc",
     95     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc",
     96     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/scoped_clear_last_error_win.cc",
     97     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder.cc",
     98     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/cstring_builder_pa_unittest.cc",
     99     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf.cc",
    100     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/safe_sprintf_pa_unittest.cc",
    101     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf.cc",
    102     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/stringprintf_pa_unittest.cc",
    103     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util.cc",
    104     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/strings/string_util_pa_unittest.cc",
    105     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/thread_annotations_pa_unittest.cc",
    106     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_android_for_testing.cc",
    107     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread.cc",
    108     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_fuchsia_for_testing.cc",
    109     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_linux_for_testing.cc",
    110     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix.cc",
    111     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_posix_for_testing.cc",
    112     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win.cc",
    113     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/threading/platform_thread_win_for_testing.cc",
    114     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time.cc",
    115     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_conversion_posix.cc",
    116     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_fuchsia.cc",
    117     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_now_posix.cc",
    118     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_override.cc",
    119     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/time/time_win.cc",
    120     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc.cc",
    121     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_hooks.cc",
    122     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_perftest.cc",
    123     "../../base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc",
    124     "../../base/allocator/partition_allocator/src/partition_alloc/partition_bucket.cc",
    125     "../../base/allocator/partition_allocator/src/partition_alloc/partition_dcheck_helper.cc",
    126     "../../base/allocator/partition_allocator/src/partition_alloc/partition_freelist_entry.cc",
    127     "../../base/allocator/partition_allocator/src/partition_alloc/partition_lock_perftest.cc",
    128     "../../base/allocator/partition_allocator/src/partition_alloc/partition_lock_unittest.cc",
    129     "../../base/allocator/partition_allocator/src/partition_alloc/partition_oom.cc",
    130     "../../base/allocator/partition_allocator/src/partition_alloc/partition_page.cc",
    131     "../../base/allocator/partition_allocator/src/partition_alloc/partition_root.cc",
    132     "../../base/allocator/partition_allocator/src/partition_alloc/partition_stats.cc",
    133     "../../base/allocator/partition_allocator/src/partition_alloc/partition_tls_win.cc",
    134     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/empty.cc",
    135     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/instance_tracer.cc",
    136     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_asan_unowned_impl.cc",
    137     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_backup_ref_impl.cc",
    138     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_hookable_impl.cc",
    139     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc",
    140     "../../base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ref_unittest.cc",
    141     "../../base/allocator/partition_allocator/src/partition_alloc/random.cc",
    142     "../../base/allocator/partition_allocator/src/partition_alloc/reservation_offset_table.cc",
    143     "../../base/allocator/partition_allocator/src/partition_alloc/reverse_bytes_unittest.cc",
    144     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_android.cc",
    145     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_apple.cc",
    146     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim.cc",
    147     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_apple_zoned_malloc.cc",
    148     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_glibc.cc",
    149     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
    150     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc",
    151     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc",
    152     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc_with_advanced_checks.cc",
    153     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_winheap.cc",
    154     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_dispatch_to_noop_on_free.cc",
    155     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_functions_win_component.cc",
    156     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_unittest.cc",
    157     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_win_component.cc",
    158     "../../base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_win_static.cc",
    159     "../../base/allocator/partition_allocator/src/partition_alloc/shim/empty.cc",
    160     "../../base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple.cc",
    161     "../../base/allocator/partition_allocator/src/partition_alloc/shim/malloc_zone_functions_apple_unittest.cc",
    162     "../../base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win.cc",
    163     "../../base/allocator/partition_allocator/src/partition_alloc/shim/winheap_stubs_win_unittest.cc",
    164     "../../base/allocator/partition_allocator/src/partition_alloc/slot_start_unittest.cc",
    165     "../../base/allocator/partition_allocator/src/partition_alloc/spinning_mutex.cc",
    166     "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm64/push_registers_asm.cc",
    167     "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/arm/push_registers_asm.cc",
    168     "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/riscv64/push_registers_asm.cc",
    169     "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x64/push_registers_asm.cc",
    170     "../../base/allocator/partition_allocator/src/partition_alloc/stack/asm/x86/push_registers_asm.cc",
    171     "../../base/allocator/partition_allocator/src/partition_alloc/stack/stack.cc",
    172     "../../base/allocator/partition_allocator/src/partition_alloc/stack/stack_unittest.cc",
    173     "../../base/allocator/partition_allocator/src/partition_alloc/tagging.cc",
    174     "../../base/allocator/partition_allocator/src/partition_alloc/tagging_unittest.cc",
    175     "../../base/allocator/partition_allocator/src/partition_alloc/thread_cache.cc",
    176     "../../base/allocator/partition_allocator/src/partition_alloc/thread_cache_unittest.cc",
    177     "../../base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey.cc",
    178     "../../base/allocator/partition_allocator/src/partition_alloc/thread_isolation/pkey_unittest.cc",
    179     "../../base/allocator/partition_allocator/src/partition_alloc/thread_isolation/thread_isolation.cc",
    180 ]
    181 
    182 # Map of exclusion lists indexed by target OS.
    183 # If no target OS is defined, or one is defined that doesn't have a specific
    184 # entry, use _DEFAULT_COVERAGE_EXCLUSION_LIST.
    185 _COVERAGE_EXCLUSION_LIST_MAP = {
    186     "android": [
    187         # This file caused webview native library failed on arm64.
    188         "../../device/gamepad/dualshock4_controller.cc",
    189     ] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
    190     "fuchsia": [
    191         # TODO(crbug.com/40167659): These files caused clang to crash while
    192         # compiling them.
    193         "../../third_party/skia/src/core/SkOpts.cpp",
    194         "../../third_party/skia/src/opts/SkOpts_hsw.cpp",
    195         "../../third_party/skia/third_party/skcms/skcms.cc",
    196     ] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
    197     "linux": [
    198         # These files caused a static initializer to be generated, which
    199         # shouldn't.
    200         # TODO(crbug.com/41474559): Remove when the bug is fixed.
    201         "../../chrome/browser/media/router/providers/cast/cast_internal_message_util.cc",  #pylint: disable=line-too-long
    202         "../../components/media_router/common/providers/cast/channel/cast_channel_enum.cc",  #pylint: disable=line-too-long
    203         "../../components/media_router/common/providers/cast/channel/cast_message_util.cc",  #pylint: disable=line-too-long
    204         "../../components/media_router/common/providers/cast/cast_media_source.cc",  #pylint: disable=line-too-long
    205         "../../ui/events/keycodes/dom/keycode_converter.cc",
    206     ] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
    207     "chromeos": [
    208         # These files caused clang to crash while compiling them. They are
    209         # excluded pending an investigation into the underlying compiler bug.
    210         "../../third_party/webrtc/p2p/base/p2p_transport_channel.cc",
    211         "../../third_party/icu/source/common/uts46.cpp",
    212         "../../third_party/icu/source/common/ucnvmbcs.cpp",
    213         "../../base/android/android_image_reader_compat.cc",
    214     ] + _DEFAULT_COVERAGE_EXCLUSION_LIST,
    215 }
    216 
    217 # Map of force lists indexed by target OS.
    218 _COVERAGE_FORCE_LIST_MAP = {
    219     # clang_profiling.cc refers to the symbol `__llvm_profile_dump` from the
    220     # profiling runtime. In a partial coverage build, it is possible for a
    221     # binary to include clang_profiling.cc but have no instrumented files, thus
    222     # causing an unresolved symbol error because the profiling runtime will not
    223     # be linked in. Therefore we force coverage for this file to ensure that
    224     # any target that includes it will also get the profiling runtime.
    225     "win": [r"..\..\base\test\clang_profiling.cc"],
    226     # TODO(crbug.com/40154378) We're seeing runtime LLVM errors in mac-rel when
    227     # no files are changed, so we suspect that this is similar to the other
    228     # problem with clang_profiling.cc on Windows. The TODO here is to force
    229     # coverage for this specific file on ALL platforms, if it turns out to fix
    230     # this issue on Mac as well. It's the only file that directly calls
    231     # `__llvm_profile_dump` so it warrants some special treatment.
    232     "mac": ["../../base/test/clang_profiling.cc"],
    233 }
    234 
    235 def _remove_flags_from_command(command):
    236     # We need to remove the coverage flags for this file, but we only want to
    237     # remove them if we see the exact sequence defined in _COVERAGE_FLAGS.
    238     # That ensures that we only remove the flags added by GN when
    239     # "use_clang_coverage" is true. Otherwise, we would remove flags set by
    240     # other parts of the build system.
    241     start_flag = _COVERAGE_FLAGS[0]
    242     num_flags = len(_COVERAGE_FLAGS)
    243     start_idx = 0
    244 
    245     def _start_flag_idx(cmd, start_idx):
    246         for i in range(start_idx, len(cmd)):
    247             if cmd[i] == start_flag:
    248                 return i
    249 
    250     # Workaround to emulate while loop in Starlark.
    251     for _ in range(0, len(command)):
    252         idx = _start_flag_idx(command, start_idx)
    253         if not idx:
    254             # Coverage flags are not included anymore.
    255             return command
    256         if command[idx:idx + num_flags] == _COVERAGE_FLAGS:
    257             # Starlark doesn't have `del`.
    258             command = command[:idx] + command[idx + num_flags:]
    259 
    260             # There can be multiple sets of _COVERAGE_FLAGS. All of these need to be
    261             # removed.
    262             start_idx = idx
    263         else:
    264             start_idx = idx + 1
    265     return command
    266 
    267 def __run(ctx, args):
    268     """Runs the main logic of clang_code_coverage_wrapper.
    269 
    270       This is slightly different from the main function of clang_code_coverage_wrapper.py
    271       because starlark can't use Python's standard libraries.
    272     """
    273     # We need to remove the coverage flags for this file, but we only want to
    274     # remove them if we see the exact sequence defined in _COVERAGE_FLAGS.
    275     # That ensures that we only remove the flags added by GN when
    276     # "use_clang_coverage" is true. Otherwise, we would remove flags set by
    277     # other parts of the build system.
    278 
    279     if len(args) == 0:
    280         return args
    281     if not args[0].endswith("python3") and not args[0].endswith("python3.exe"):
    282         return args
    283 
    284     has_coveage_wrapper = False
    285     instrument_file = None
    286     compile_command_pos = None
    287     target_os = None
    288     source_flag = "-c"
    289     source_flag_index = None
    290     for i, arg in enumerate(args):
    291         if i == 0:
    292             continue
    293         if arg == "../../build/toolchain/clang_code_coverage_wrapper.py":
    294             has_coveage_wrapper = True
    295             continue
    296         if arg.startswith("--files-to-instrument="):
    297             instrument_file = arg.removeprefix("--files-to-instrument=")
    298             continue
    299         if arg.startswith("--target-os="):
    300             target_os = arg.removeprefix("--target-os=")
    301             if target_os == "win":
    302                 source_flag = "/c"
    303             continue
    304         if not compile_command_pos and not args[i].startswith("-") and "clang" in args[i]:
    305             compile_command_pos = i
    306             continue
    307         if args[i] == source_flag:
    308             # The command is assumed to use Clang as the compiler, and the path to the
    309             # source file is behind the -c argument, and the path to the source path is
    310             # relative to the root build directory. For example:
    311             # clang++ -fvisibility=hidden -c ../../base/files/file_path.cc -o \
    312             #   obj/base/base/file_path.o
    313             # On Windows, clang-cl.exe uses /c instead of -c.
    314             source_flag_index = i
    315             continue
    316 
    317     if not has_coveage_wrapper or not compile_command_pos:
    318         print("this is not clang coverage command. %s" % str(args))
    319         return args
    320 
    321     compile_command = args[compile_command_pos:]
    322 
    323     if not source_flag_index:
    324         fail("%s argument is not found in the compile command. %s" % (source_flag, str(args)))
    325 
    326     if source_flag_index + 1 >= len(args):
    327         fail("Source file to be compiled is missing from the command.")
    328 
    329     # On Windows, filesystem paths should use '\', but GN creates build commands
    330     # that use '/'.
    331     # The original logic in clang_code_coverage_wrapper.py uses
    332     # os.path.normpath() to ensure to ensure that the path uses the correct
    333     # separator for the current platform. i.e. '\' on Windows and '/' otherwise
    334     # Siso's ctx.fs.canonpath() ensures '/' on all platforms, instead.
    335     # TODO: Consdier coverting the paths in instrument file and hardcoded lists
    336     # only once at initialization if it improves performance.
    337 
    338     compile_source_file = ctx.fs.canonpath(args[source_flag_index + 1])
    339 
    340     extension = compile_source_file.rsplit(".", 1)[1]
    341     if not extension in ["c", "cc", "cpp", "cxx", "m", "mm", "S"]:
    342         fail("Invalid source file %s found. extension=%s" % (compile_source_file, extension))
    343 
    344     exclusion_list = _COVERAGE_EXCLUSION_LIST_MAP.get(
    345         target_os,
    346         _DEFAULT_COVERAGE_EXCLUSION_LIST,
    347     )
    348     exclusion_list = [ctx.fs.canonpath(f) for f in exclusion_list]
    349     force_list = _COVERAGE_FORCE_LIST_MAP.get(target_os, [])
    350     force_list = [ctx.fs.canonpath(f) for f in force_list]
    351 
    352     files_to_instrument = []
    353     if instrument_file:
    354         files_to_instrument = str(ctx.fs.read(ctx.fs.canonpath(instrument_file))).splitlines()
    355 
    356         # strip() is for removing '\r' on Windows.
    357         files_to_instrument = [ctx.fs.canonpath(f).strip() for f in files_to_instrument]
    358 
    359     should_remove_flags = False
    360     if compile_source_file not in force_list:
    361         if compile_source_file in exclusion_list:
    362             should_remove_flags = True
    363         elif instrument_file and compile_source_file not in files_to_instrument:
    364             should_remove_flags = True
    365 
    366     if should_remove_flags:
    367         return _remove_flags_from_command(compile_command)
    368     print("Keeping code coverage flags for %s" % compile_source_file)
    369     return compile_command
    370 
    371 clang_code_coverage_wrapper = module(
    372     "clang_code_coverage_wrapper",
    373     run = __run,
    374 )
    375 
    376 # LINT.ThenChange(/build/toolchain/clang_code_coverage_wrapper.py)