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