xref: /aosp_15_r20/external/angle/build/config/siso/clang_code_coverage_wrapper.star (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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
8load("@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
235def _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
267def __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
371clang_code_coverage_wrapper = module(
372    "clang_code_coverage_wrapper",
373    run = __run,
374)
375
376# LINT.ThenChange(/build/toolchain/clang_code_coverage_wrapper.py)
377