From 71a237e764717a69495af531ea0d4f123bec7294 Mon Sep 17 00:00:00 2001 From: Alex Rønne Petersen Date: Fri, 11 Apr 2025 02:00:21 +0200 Subject: std.zig.system: Force soft_float feature on for MIPS soft float targets. Workaround for: https://github.com/llvm/llvm-project/issues/135283 --- lib/std/zig/system.zig | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index 81a3013b34..5ddc3432f9 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -411,6 +411,11 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { if (result.cpu.arch.isArm() and result.abi.float() == .soft) { result.cpu.features.removeFeature(@intFromEnum(Target.arm.Feature.vfp2)); } + + // https://github.com/llvm/llvm-project/issues/135283 + if (result.cpu.arch.isMIPS() and result.abi.float() == .soft) { + result.cpu.features.addFeature(@intFromEnum(Target.mips.Feature.soft_float)); + } } // It's possible that we detect the native ABI, but fail to detect the OS version or were told -- cgit v1.2.3 From ee0ff134e9f82bf87751a5174c27b191c04e16c0 Mon Sep 17 00:00:00 2001 From: Alex Rønne Petersen Date: Thu, 10 Apr 2025 19:19:09 +0200 Subject: tsan: Rename lib/tsan to lib/libtsan. For consistency with other vendored C/C++ libraries. --- lib/libtsan/builtins/assembly.h | 305 + lib/libtsan/interception/interception.h | 391 + lib/libtsan/interception/interception_linux.cpp | 83 + lib/libtsan/interception/interception_linux.h | 55 + lib/libtsan/interception/interception_mac.cpp | 18 + lib/libtsan/interception/interception_mac.h | 27 + .../interception/interception_type_test.cpp | 46 + lib/libtsan/interception/interception_win.cpp | 1443 +++ lib/libtsan/interception/interception_win.h | 91 + lib/libtsan/sanitizer_common/sancov_flags.h | 39 + lib/libtsan/sanitizer_common/sancov_flags.inc | 20 + .../sanitizer_common/sanitizer_addrhashmap.h | 393 + .../sanitizer_common/sanitizer_allocator.cpp | 214 + lib/libtsan/sanitizer_common/sanitizer_allocator.h | 85 + .../sanitizer_allocator_checks.cpp | 22 + .../sanitizer_common/sanitizer_allocator_checks.h | 76 + .../sanitizer_allocator_combined.h | 199 + .../sanitizer_common/sanitizer_allocator_dlsym.h | 88 + .../sanitizer_allocator_interface.h | 53 + .../sanitizer_allocator_internal.h | 56 + .../sanitizer_allocator_local_cache.h | 271 + .../sanitizer_allocator_primary32.h | 381 + .../sanitizer_allocator_primary64.h | 902 ++ .../sanitizer_allocator_report.cpp | 144 + .../sanitizer_common/sanitizer_allocator_report.h | 40 + .../sanitizer_allocator_secondary.h | 322 + .../sanitizer_allocator_size_class_map.h | 241 + .../sanitizer_common/sanitizer_allocator_stats.h | 103 + lib/libtsan/sanitizer_common/sanitizer_array_ref.h | 123 + lib/libtsan/sanitizer_common/sanitizer_asm.h | 156 + lib/libtsan/sanitizer_common/sanitizer_atomic.h | 98 + .../sanitizer_common/sanitizer_atomic_clang.h | 99 + .../sanitizer_common/sanitizer_atomic_msvc.h | 256 + lib/libtsan/sanitizer_common/sanitizer_bitvector.h | 350 + lib/libtsan/sanitizer_common/sanitizer_bvgraph.h | 164 + .../sanitizer_chained_origin_depot.cpp | 150 + .../sanitizer_chained_origin_depot.h | 46 + lib/libtsan/sanitizer_common/sanitizer_common.cpp | 435 + lib/libtsan/sanitizer_common/sanitizer_common.h | 1114 ++ .../sanitizer_common_interceptors.inc | 10590 +++++++++++++++++++ .../sanitizer_common_interceptors_format.inc | 577 + .../sanitizer_common_interceptors_ioctl.inc | 612 ++ ...sanitizer_common_interceptors_memintrinsics.inc | 244 + ...sanitizer_common_interceptors_netbsd_compat.inc | 128 + ...nitizer_common_interceptors_vfork_aarch64.inc.S | 48 + .../sanitizer_common_interceptors_vfork_arm.inc.S | 49 + .../sanitizer_common_interceptors_vfork_i386.inc.S | 64 + ...zer_common_interceptors_vfork_loongarch64.inc.S | 57 + ...nitizer_common_interceptors_vfork_riscv64.inc.S | 56 + ...anitizer_common_interceptors_vfork_x86_64.inc.S | 42 + .../sanitizer_common_interface.inc | 61 + .../sanitizer_common_interface_posix.inc | 16 + .../sanitizer_common/sanitizer_common_libcdep.cpp | 256 + .../sanitizer_common/sanitizer_common_nolibc.cpp | 37 + .../sanitizer_common/sanitizer_common_syscalls.inc | 3217 ++++++ .../sanitizer_coverage_interface.inc | 43 + lib/libtsan/sanitizer_common/sanitizer_dbghelp.h | 41 + .../sanitizer_common/sanitizer_deadlock_detector.h | 410 + .../sanitizer_deadlock_detector1.cpp | 194 + .../sanitizer_deadlock_detector2.cpp | 421 + .../sanitizer_deadlock_detector_interface.h | 98 + lib/libtsan/sanitizer_common/sanitizer_dense_map.h | 717 ++ .../sanitizer_common/sanitizer_dense_map_info.h | 282 + lib/libtsan/sanitizer_common/sanitizer_dl.cpp | 37 + lib/libtsan/sanitizer_common/sanitizer_dl.h | 26 + lib/libtsan/sanitizer_common/sanitizer_errno.cpp | 35 + lib/libtsan/sanitizer_common/sanitizer_errno.h | 38 + .../sanitizer_common/sanitizer_errno_codes.h | 36 + lib/libtsan/sanitizer_common/sanitizer_file.cpp | 253 + lib/libtsan/sanitizer_common/sanitizer_file.h | 110 + .../sanitizer_common/sanitizer_flag_parser.cpp | 190 + .../sanitizer_common/sanitizer_flag_parser.h | 202 + lib/libtsan/sanitizer_common/sanitizer_flags.cpp | 139 + lib/libtsan/sanitizer_common/sanitizer_flags.h | 71 + lib/libtsan/sanitizer_common/sanitizer_flags.inc | 284 + lib/libtsan/sanitizer_common/sanitizer_flat_map.h | 166 + lib/libtsan/sanitizer_common/sanitizer_fuchsia.cpp | 567 + lib/libtsan/sanitizer_common/sanitizer_fuchsia.h | 38 + lib/libtsan/sanitizer_common/sanitizer_getauxval.h | 59 + .../sanitizer_common/sanitizer_glibc_version.h | 26 + lib/libtsan/sanitizer_common/sanitizer_hash.h | 67 + .../sanitizer_interceptors_ioctl_netbsd.inc | 1533 +++ .../sanitizer_interface_internal.h | 163 + .../sanitizer_common/sanitizer_internal_defs.h | 500 + lib/libtsan/sanitizer_common/sanitizer_leb128.h | 87 + lib/libtsan/sanitizer_common/sanitizer_lfstack.h | 72 + lib/libtsan/sanitizer_common/sanitizer_libc.cpp | 317 + lib/libtsan/sanitizer_common/sanitizer_libc.h | 108 + .../sanitizer_common/sanitizer_libignore.cpp | 131 + lib/libtsan/sanitizer_common/sanitizer_libignore.h | 126 + lib/libtsan/sanitizer_common/sanitizer_linux.cpp | 2862 +++++ lib/libtsan/sanitizer_common/sanitizer_linux.h | 207 + .../sanitizer_common/sanitizer_linux_libcdep.cpp | 1142 ++ .../sanitizer_common/sanitizer_linux_s390.cpp | 222 + lib/libtsan/sanitizer_common/sanitizer_list.h | 166 + .../sanitizer_local_address_space_view.h | 76 + lib/libtsan/sanitizer_common/sanitizer_lzw.h | 159 + lib/libtsan/sanitizer_common/sanitizer_mac.cpp | 1465 +++ lib/libtsan/sanitizer_common/sanitizer_mac.h | 79 + .../sanitizer_common/sanitizer_mac_libcdep.cpp | 29 + lib/libtsan/sanitizer_common/sanitizer_mallinfo.h | 42 + .../sanitizer_common/sanitizer_malloc_mac.inc | 414 + lib/libtsan/sanitizer_common/sanitizer_mutex.cpp | 227 + lib/libtsan/sanitizer_common/sanitizer_mutex.h | 446 + lib/libtsan/sanitizer_common/sanitizer_netbsd.cpp | 351 + .../sanitizer_common/sanitizer_placement_new.h | 22 + lib/libtsan/sanitizer_common/sanitizer_platform.h | 468 + .../sanitizer_platform_interceptors.h | 664 ++ .../sanitizer_platform_limits_freebsd.cpp | 572 + .../sanitizer_platform_limits_freebsd.h | 772 ++ .../sanitizer_platform_limits_linux.cpp | 103 + .../sanitizer_platform_limits_netbsd.cpp | 2737 +++++ .../sanitizer_platform_limits_netbsd.h | 2418 +++++ .../sanitizer_platform_limits_posix.cpp | 1363 +++ .../sanitizer_platform_limits_posix.h | 1541 +++ .../sanitizer_platform_limits_solaris.cpp | 371 + .../sanitizer_platform_limits_solaris.h | 498 + lib/libtsan/sanitizer_common/sanitizer_posix.cpp | 420 + lib/libtsan/sanitizer_common/sanitizer_posix.h | 135 + .../sanitizer_common/sanitizer_posix_libcdep.cpp | 588 + lib/libtsan/sanitizer_common/sanitizer_printf.cpp | 368 + lib/libtsan/sanitizer_common/sanitizer_procmaps.h | 128 + .../sanitizer_common/sanitizer_procmaps_bsd.cpp | 131 + .../sanitizer_common/sanitizer_procmaps_common.cpp | 192 + .../sanitizer_procmaps_fuchsia.cpp | 80 + .../sanitizer_common/sanitizer_procmaps_linux.cpp | 81 + .../sanitizer_common/sanitizer_procmaps_mac.cpp | 455 + .../sanitizer_procmaps_solaris.cpp | 96 + lib/libtsan/sanitizer_common/sanitizer_ptrauth.h | 43 + .../sanitizer_common/sanitizer_quarantine.h | 313 + lib/libtsan/sanitizer_common/sanitizer_range.cpp | 62 + lib/libtsan/sanitizer_common/sanitizer_range.h | 40 + .../sanitizer_common/sanitizer_redefine_builtins.h | 58 + .../sanitizer_common/sanitizer_report_decorator.h | 48 + .../sanitizer_common/sanitizer_ring_buffer.h | 168 + .../sanitizer_signal_interceptors.inc | 100 + lib/libtsan/sanitizer_common/sanitizer_solaris.cpp | 230 + lib/libtsan/sanitizer_common/sanitizer_solaris.h | 56 + .../sanitizer_common/sanitizer_stack_store.cpp | 384 + .../sanitizer_common/sanitizer_stack_store.h | 121 + .../sanitizer_common/sanitizer_stackdepot.cpp | 247 + .../sanitizer_common/sanitizer_stackdepot.h | 51 + .../sanitizer_common/sanitizer_stackdepotbase.h | 209 + .../sanitizer_common/sanitizer_stacktrace.cpp | 169 + .../sanitizer_common/sanitizer_stacktrace.h | 220 + .../sanitizer_stacktrace_libcdep.cpp | 228 + .../sanitizer_stacktrace_printer.cpp | 365 + .../sanitizer_stacktrace_printer.h | 115 + .../sanitizer_stacktrace_sparc.cpp | 78 + .../sanitizer_common/sanitizer_stoptheworld.h | 65 + .../sanitizer_stoptheworld_fuchsia.cpp | 43 + .../sanitizer_stoptheworld_fuchsia.h | 20 + .../sanitizer_stoptheworld_linux_libcdep.cpp | 638 ++ .../sanitizer_stoptheworld_mac.cpp | 181 + .../sanitizer_stoptheworld_netbsd_libcdep.cpp | 362 + .../sanitizer_stoptheworld_win.cpp | 175 + .../sanitizer_common/sanitizer_suppressions.cpp | 185 + .../sanitizer_common/sanitizer_suppressions.h | 56 + .../sanitizer_common/sanitizer_symbolizer.cpp | 144 + .../sanitizer_common/sanitizer_symbolizer.h | 247 + .../sanitizer_symbolizer_internal.h | 174 + .../sanitizer_symbolizer_libbacktrace.cpp | 209 + .../sanitizer_symbolizer_libbacktrace.h | 49 + .../sanitizer_symbolizer_libcdep.cpp | 578 + .../sanitizer_common/sanitizer_symbolizer_mac.cpp | 208 + .../sanitizer_common/sanitizer_symbolizer_mac.h | 47 + .../sanitizer_symbolizer_markup.cpp | 162 + .../sanitizer_common/sanitizer_symbolizer_markup.h | 79 + .../sanitizer_symbolizer_markup_constants.h | 49 + .../sanitizer_symbolizer_markup_fuchsia.cpp | 85 + .../sanitizer_symbolizer_posix_libcdep.cpp | 515 + .../sanitizer_symbolizer_report.cpp | 344 + .../sanitizer_symbolizer_report_fuchsia.cpp | 33 + .../sanitizer_common/sanitizer_symbolizer_win.cpp | 323 + .../sanitizer_common/sanitizer_syscall_generic.inc | 39 + .../sanitizer_syscall_linux_aarch64.inc | 137 + .../sanitizer_syscall_linux_arm.inc | 137 + .../sanitizer_syscall_linux_hexagon.inc | 131 + .../sanitizer_syscall_linux_loongarch64.inc | 171 + .../sanitizer_syscall_linux_riscv64.inc | 174 + .../sanitizer_syscall_linux_x86_64.inc | 90 + .../sanitizer_common/sanitizer_syscalls_netbsd.inc | 3944 +++++++ .../sanitizer_common/sanitizer_termination.cpp | 99 + .../sanitizer_thread_arg_retval.cpp | 109 + .../sanitizer_common/sanitizer_thread_arg_retval.h | 117 + .../sanitizer_common/sanitizer_thread_history.cpp | 72 + .../sanitizer_common/sanitizer_thread_history.h | 24 + .../sanitizer_common/sanitizer_thread_registry.cpp | 399 + .../sanitizer_common/sanitizer_thread_registry.h | 173 + .../sanitizer_common/sanitizer_thread_safety.h | 49 + .../sanitizer_common/sanitizer_tls_get_addr.cpp | 196 + .../sanitizer_common/sanitizer_tls_get_addr.h | 83 + .../sanitizer_common/sanitizer_type_traits.cpp | 20 + .../sanitizer_common/sanitizer_type_traits.h | 141 + .../sanitizer_common/sanitizer_unwind_fuchsia.cpp | 66 + .../sanitizer_unwind_linux_libcdep.cpp | 174 + .../sanitizer_common/sanitizer_unwind_win.cpp | 100 + lib/libtsan/sanitizer_common/sanitizer_vector.h | 124 + lib/libtsan/sanitizer_common/sanitizer_win.cpp | 1269 +++ lib/libtsan/sanitizer_common/sanitizer_win.h | 25 + lib/libtsan/sanitizer_common/sanitizer_win_defs.h | 174 + .../sanitizer_common/sanitizer_win_immortalize.h | 71 + .../sanitizer_win_interception.cpp | 156 + .../sanitizer_common/sanitizer_win_interception.h | 32 + lib/libtsan/tsan_debugging.cpp | 264 + lib/libtsan/tsan_defs.h | 217 + lib/libtsan/tsan_dense_alloc.h | 196 + lib/libtsan/tsan_dispatch_defs.h | 66 + lib/libtsan/tsan_external.cpp | 133 + lib/libtsan/tsan_fd.cpp | 375 + lib/libtsan/tsan_fd.h | 65 + lib/libtsan/tsan_flags.cpp | 122 + lib/libtsan/tsan_flags.h | 34 + lib/libtsan/tsan_flags.inc | 82 + lib/libtsan/tsan_ignoreset.cpp | 38 + lib/libtsan/tsan_ignoreset.h | 36 + lib/libtsan/tsan_ilist.h | 189 + lib/libtsan/tsan_interceptors.h | 132 + lib/libtsan/tsan_interceptors_mac.cpp | 548 + lib/libtsan/tsan_interceptors_mach_vm.cpp | 53 + lib/libtsan/tsan_interceptors_memintrinsics.cpp | 43 + lib/libtsan/tsan_interceptors_posix.cpp | 3199 ++++++ lib/libtsan/tsan_interface.cpp | 92 + lib/libtsan/tsan_interface.h | 445 + lib/libtsan/tsan_interface.inc | 190 + lib/libtsan/tsan_interface_ann.cpp | 460 + lib/libtsan/tsan_interface_ann.h | 32 + lib/libtsan/tsan_interface_atomic.cpp | 995 ++ lib/libtsan/tsan_interface_java.cpp | 258 + lib/libtsan/tsan_interface_java.h | 99 + lib/libtsan/tsan_malloc_mac.cpp | 87 + lib/libtsan/tsan_md5.cpp | 250 + lib/libtsan/tsan_mman.cpp | 496 + lib/libtsan/tsan_mman.h | 80 + lib/libtsan/tsan_mutexset.cpp | 80 + lib/libtsan/tsan_mutexset.h | 91 + lib/libtsan/tsan_new_delete.cpp | 199 + lib/libtsan/tsan_platform.h | 1043 ++ lib/libtsan/tsan_platform_linux.cpp | 655 ++ lib/libtsan/tsan_platform_mac.cpp | 307 + lib/libtsan/tsan_platform_posix.cpp | 174 + lib/libtsan/tsan_platform_windows.cpp | 33 + lib/libtsan/tsan_ppc_regs.h | 96 + lib/libtsan/tsan_preinit.cpp | 24 + lib/libtsan/tsan_report.cpp | 458 + lib/libtsan/tsan_report.h | 129 + lib/libtsan/tsan_rtl.cpp | 1130 ++ lib/libtsan/tsan_rtl.h | 813 ++ lib/libtsan/tsan_rtl_aarch64.S | 227 + lib/libtsan/tsan_rtl_access.cpp | 750 ++ lib/libtsan/tsan_rtl_amd64.S | 210 + lib/libtsan/tsan_rtl_loongarch64.S | 196 + lib/libtsan/tsan_rtl_mips64.S | 214 + lib/libtsan/tsan_rtl_mutex.cpp | 578 + lib/libtsan/tsan_rtl_ppc64.S | 288 + lib/libtsan/tsan_rtl_proc.cpp | 59 + lib/libtsan/tsan_rtl_report.cpp | 862 ++ lib/libtsan/tsan_rtl_riscv64.S | 203 + lib/libtsan/tsan_rtl_s390x.S | 49 + lib/libtsan/tsan_rtl_thread.cpp | 370 + lib/libtsan/tsan_shadow.h | 193 + lib/libtsan/tsan_stack_trace.cpp | 57 + lib/libtsan/tsan_stack_trace.h | 42 + lib/libtsan/tsan_suppressions.cpp | 163 + lib/libtsan/tsan_suppressions.h | 37 + lib/libtsan/tsan_symbolize.cpp | 123 + lib/libtsan/tsan_symbolize.h | 30 + lib/libtsan/tsan_sync.cpp | 289 + lib/libtsan/tsan_sync.h | 148 + lib/libtsan/tsan_trace.h | 215 + lib/libtsan/tsan_vector_clock.cpp | 126 + lib/libtsan/tsan_vector_clock.h | 51 + lib/libtsan/ubsan/ubsan_flags.h | 46 + lib/libtsan/ubsan/ubsan_flags.inc | 28 + lib/libtsan/ubsan/ubsan_init.h | 33 + lib/libtsan/ubsan/ubsan_platform.h | 25 + lib/tsan/builtins/assembly.h | 305 - lib/tsan/interception/interception.h | 391 - lib/tsan/interception/interception_linux.cpp | 83 - lib/tsan/interception/interception_linux.h | 55 - lib/tsan/interception/interception_mac.cpp | 18 - lib/tsan/interception/interception_mac.h | 27 - lib/tsan/interception/interception_type_test.cpp | 46 - lib/tsan/interception/interception_win.cpp | 1443 --- lib/tsan/interception/interception_win.h | 91 - lib/tsan/sanitizer_common/sancov_flags.h | 39 - lib/tsan/sanitizer_common/sancov_flags.inc | 20 - lib/tsan/sanitizer_common/sanitizer_addrhashmap.h | 393 - lib/tsan/sanitizer_common/sanitizer_allocator.cpp | 214 - lib/tsan/sanitizer_common/sanitizer_allocator.h | 85 - .../sanitizer_allocator_checks.cpp | 22 - .../sanitizer_common/sanitizer_allocator_checks.h | 76 - .../sanitizer_allocator_combined.h | 199 - .../sanitizer_common/sanitizer_allocator_dlsym.h | 88 - .../sanitizer_allocator_interface.h | 53 - .../sanitizer_allocator_internal.h | 56 - .../sanitizer_allocator_local_cache.h | 271 - .../sanitizer_allocator_primary32.h | 381 - .../sanitizer_allocator_primary64.h | 902 -- .../sanitizer_allocator_report.cpp | 144 - .../sanitizer_common/sanitizer_allocator_report.h | 40 - .../sanitizer_allocator_secondary.h | 322 - .../sanitizer_allocator_size_class_map.h | 241 - .../sanitizer_common/sanitizer_allocator_stats.h | 103 - lib/tsan/sanitizer_common/sanitizer_array_ref.h | 123 - lib/tsan/sanitizer_common/sanitizer_asm.h | 156 - lib/tsan/sanitizer_common/sanitizer_atomic.h | 98 - lib/tsan/sanitizer_common/sanitizer_atomic_clang.h | 99 - lib/tsan/sanitizer_common/sanitizer_atomic_msvc.h | 256 - lib/tsan/sanitizer_common/sanitizer_bitvector.h | 350 - lib/tsan/sanitizer_common/sanitizer_bvgraph.h | 164 - .../sanitizer_chained_origin_depot.cpp | 150 - .../sanitizer_chained_origin_depot.h | 46 - lib/tsan/sanitizer_common/sanitizer_common.cpp | 435 - lib/tsan/sanitizer_common/sanitizer_common.h | 1114 -- .../sanitizer_common_interceptors.inc | 10590 ------------------- .../sanitizer_common_interceptors_format.inc | 577 - .../sanitizer_common_interceptors_ioctl.inc | 612 -- ...sanitizer_common_interceptors_memintrinsics.inc | 244 - ...sanitizer_common_interceptors_netbsd_compat.inc | 128 - ...nitizer_common_interceptors_vfork_aarch64.inc.S | 48 - .../sanitizer_common_interceptors_vfork_arm.inc.S | 49 - .../sanitizer_common_interceptors_vfork_i386.inc.S | 64 - ...zer_common_interceptors_vfork_loongarch64.inc.S | 57 - ...nitizer_common_interceptors_vfork_riscv64.inc.S | 56 - ...anitizer_common_interceptors_vfork_x86_64.inc.S | 42 - .../sanitizer_common_interface.inc | 61 - .../sanitizer_common_interface_posix.inc | 16 - .../sanitizer_common/sanitizer_common_libcdep.cpp | 256 - .../sanitizer_common/sanitizer_common_nolibc.cpp | 37 - .../sanitizer_common/sanitizer_common_syscalls.inc | 3217 ------ .../sanitizer_coverage_interface.inc | 43 - lib/tsan/sanitizer_common/sanitizer_dbghelp.h | 41 - .../sanitizer_common/sanitizer_deadlock_detector.h | 410 - .../sanitizer_deadlock_detector1.cpp | 194 - .../sanitizer_deadlock_detector2.cpp | 421 - .../sanitizer_deadlock_detector_interface.h | 98 - lib/tsan/sanitizer_common/sanitizer_dense_map.h | 717 -- .../sanitizer_common/sanitizer_dense_map_info.h | 282 - lib/tsan/sanitizer_common/sanitizer_dl.cpp | 37 - lib/tsan/sanitizer_common/sanitizer_dl.h | 26 - lib/tsan/sanitizer_common/sanitizer_errno.cpp | 35 - lib/tsan/sanitizer_common/sanitizer_errno.h | 38 - lib/tsan/sanitizer_common/sanitizer_errno_codes.h | 36 - lib/tsan/sanitizer_common/sanitizer_file.cpp | 253 - lib/tsan/sanitizer_common/sanitizer_file.h | 110 - .../sanitizer_common/sanitizer_flag_parser.cpp | 190 - lib/tsan/sanitizer_common/sanitizer_flag_parser.h | 202 - lib/tsan/sanitizer_common/sanitizer_flags.cpp | 139 - lib/tsan/sanitizer_common/sanitizer_flags.h | 71 - lib/tsan/sanitizer_common/sanitizer_flags.inc | 284 - lib/tsan/sanitizer_common/sanitizer_flat_map.h | 166 - lib/tsan/sanitizer_common/sanitizer_fuchsia.cpp | 567 - lib/tsan/sanitizer_common/sanitizer_fuchsia.h | 38 - lib/tsan/sanitizer_common/sanitizer_getauxval.h | 59 - .../sanitizer_common/sanitizer_glibc_version.h | 26 - lib/tsan/sanitizer_common/sanitizer_hash.h | 67 - .../sanitizer_interceptors_ioctl_netbsd.inc | 1533 --- .../sanitizer_interface_internal.h | 163 - .../sanitizer_common/sanitizer_internal_defs.h | 500 - lib/tsan/sanitizer_common/sanitizer_leb128.h | 87 - lib/tsan/sanitizer_common/sanitizer_lfstack.h | 72 - lib/tsan/sanitizer_common/sanitizer_libc.cpp | 317 - lib/tsan/sanitizer_common/sanitizer_libc.h | 108 - lib/tsan/sanitizer_common/sanitizer_libignore.cpp | 131 - lib/tsan/sanitizer_common/sanitizer_libignore.h | 126 - lib/tsan/sanitizer_common/sanitizer_linux.cpp | 2862 ----- lib/tsan/sanitizer_common/sanitizer_linux.h | 207 - .../sanitizer_common/sanitizer_linux_libcdep.cpp | 1142 -- lib/tsan/sanitizer_common/sanitizer_linux_s390.cpp | 222 - lib/tsan/sanitizer_common/sanitizer_list.h | 166 - .../sanitizer_local_address_space_view.h | 76 - lib/tsan/sanitizer_common/sanitizer_lzw.h | 159 - lib/tsan/sanitizer_common/sanitizer_mac.cpp | 1465 --- lib/tsan/sanitizer_common/sanitizer_mac.h | 79 - .../sanitizer_common/sanitizer_mac_libcdep.cpp | 29 - lib/tsan/sanitizer_common/sanitizer_mallinfo.h | 42 - lib/tsan/sanitizer_common/sanitizer_malloc_mac.inc | 414 - lib/tsan/sanitizer_common/sanitizer_mutex.cpp | 227 - lib/tsan/sanitizer_common/sanitizer_mutex.h | 446 - lib/tsan/sanitizer_common/sanitizer_netbsd.cpp | 351 - .../sanitizer_common/sanitizer_placement_new.h | 22 - lib/tsan/sanitizer_common/sanitizer_platform.h | 468 - .../sanitizer_platform_interceptors.h | 664 -- .../sanitizer_platform_limits_freebsd.cpp | 572 - .../sanitizer_platform_limits_freebsd.h | 772 -- .../sanitizer_platform_limits_linux.cpp | 103 - .../sanitizer_platform_limits_netbsd.cpp | 2737 ----- .../sanitizer_platform_limits_netbsd.h | 2418 ----- .../sanitizer_platform_limits_posix.cpp | 1363 --- .../sanitizer_platform_limits_posix.h | 1541 --- .../sanitizer_platform_limits_solaris.cpp | 371 - .../sanitizer_platform_limits_solaris.h | 498 - lib/tsan/sanitizer_common/sanitizer_posix.cpp | 420 - lib/tsan/sanitizer_common/sanitizer_posix.h | 135 - .../sanitizer_common/sanitizer_posix_libcdep.cpp | 588 - lib/tsan/sanitizer_common/sanitizer_printf.cpp | 368 - lib/tsan/sanitizer_common/sanitizer_procmaps.h | 128 - .../sanitizer_common/sanitizer_procmaps_bsd.cpp | 131 - .../sanitizer_common/sanitizer_procmaps_common.cpp | 192 - .../sanitizer_procmaps_fuchsia.cpp | 80 - .../sanitizer_common/sanitizer_procmaps_linux.cpp | 81 - .../sanitizer_common/sanitizer_procmaps_mac.cpp | 455 - .../sanitizer_procmaps_solaris.cpp | 96 - lib/tsan/sanitizer_common/sanitizer_ptrauth.h | 43 - lib/tsan/sanitizer_common/sanitizer_quarantine.h | 313 - lib/tsan/sanitizer_common/sanitizer_range.cpp | 62 - lib/tsan/sanitizer_common/sanitizer_range.h | 40 - .../sanitizer_common/sanitizer_redefine_builtins.h | 58 - .../sanitizer_common/sanitizer_report_decorator.h | 48 - lib/tsan/sanitizer_common/sanitizer_ring_buffer.h | 168 - .../sanitizer_signal_interceptors.inc | 100 - lib/tsan/sanitizer_common/sanitizer_solaris.cpp | 230 - lib/tsan/sanitizer_common/sanitizer_solaris.h | 56 - .../sanitizer_common/sanitizer_stack_store.cpp | 384 - lib/tsan/sanitizer_common/sanitizer_stack_store.h | 121 - lib/tsan/sanitizer_common/sanitizer_stackdepot.cpp | 247 - lib/tsan/sanitizer_common/sanitizer_stackdepot.h | 51 - .../sanitizer_common/sanitizer_stackdepotbase.h | 209 - lib/tsan/sanitizer_common/sanitizer_stacktrace.cpp | 169 - lib/tsan/sanitizer_common/sanitizer_stacktrace.h | 220 - .../sanitizer_stacktrace_libcdep.cpp | 228 - .../sanitizer_stacktrace_printer.cpp | 365 - .../sanitizer_stacktrace_printer.h | 115 - .../sanitizer_stacktrace_sparc.cpp | 78 - lib/tsan/sanitizer_common/sanitizer_stoptheworld.h | 65 - .../sanitizer_stoptheworld_fuchsia.cpp | 43 - .../sanitizer_stoptheworld_fuchsia.h | 20 - .../sanitizer_stoptheworld_linux_libcdep.cpp | 638 -- .../sanitizer_stoptheworld_mac.cpp | 181 - .../sanitizer_stoptheworld_netbsd_libcdep.cpp | 362 - .../sanitizer_stoptheworld_win.cpp | 175 - .../sanitizer_common/sanitizer_suppressions.cpp | 185 - lib/tsan/sanitizer_common/sanitizer_suppressions.h | 56 - lib/tsan/sanitizer_common/sanitizer_symbolizer.cpp | 144 - lib/tsan/sanitizer_common/sanitizer_symbolizer.h | 247 - .../sanitizer_symbolizer_internal.h | 174 - .../sanitizer_symbolizer_libbacktrace.cpp | 209 - .../sanitizer_symbolizer_libbacktrace.h | 49 - .../sanitizer_symbolizer_libcdep.cpp | 578 - .../sanitizer_common/sanitizer_symbolizer_mac.cpp | 208 - .../sanitizer_common/sanitizer_symbolizer_mac.h | 47 - .../sanitizer_symbolizer_markup.cpp | 162 - .../sanitizer_common/sanitizer_symbolizer_markup.h | 79 - .../sanitizer_symbolizer_markup_constants.h | 49 - .../sanitizer_symbolizer_markup_fuchsia.cpp | 85 - .../sanitizer_symbolizer_posix_libcdep.cpp | 515 - .../sanitizer_symbolizer_report.cpp | 344 - .../sanitizer_symbolizer_report_fuchsia.cpp | 33 - .../sanitizer_common/sanitizer_symbolizer_win.cpp | 323 - .../sanitizer_common/sanitizer_syscall_generic.inc | 39 - .../sanitizer_syscall_linux_aarch64.inc | 137 - .../sanitizer_syscall_linux_arm.inc | 137 - .../sanitizer_syscall_linux_hexagon.inc | 131 - .../sanitizer_syscall_linux_loongarch64.inc | 171 - .../sanitizer_syscall_linux_riscv64.inc | 174 - .../sanitizer_syscall_linux_x86_64.inc | 90 - .../sanitizer_common/sanitizer_syscalls_netbsd.inc | 3944 ------- .../sanitizer_common/sanitizer_termination.cpp | 99 - .../sanitizer_thread_arg_retval.cpp | 109 - .../sanitizer_common/sanitizer_thread_arg_retval.h | 117 - .../sanitizer_common/sanitizer_thread_history.cpp | 72 - .../sanitizer_common/sanitizer_thread_history.h | 24 - .../sanitizer_common/sanitizer_thread_registry.cpp | 399 - .../sanitizer_common/sanitizer_thread_registry.h | 173 - .../sanitizer_common/sanitizer_thread_safety.h | 49 - .../sanitizer_common/sanitizer_tls_get_addr.cpp | 196 - lib/tsan/sanitizer_common/sanitizer_tls_get_addr.h | 83 - .../sanitizer_common/sanitizer_type_traits.cpp | 20 - lib/tsan/sanitizer_common/sanitizer_type_traits.h | 141 - .../sanitizer_common/sanitizer_unwind_fuchsia.cpp | 66 - .../sanitizer_unwind_linux_libcdep.cpp | 174 - lib/tsan/sanitizer_common/sanitizer_unwind_win.cpp | 100 - lib/tsan/sanitizer_common/sanitizer_vector.h | 124 - lib/tsan/sanitizer_common/sanitizer_win.cpp | 1269 --- lib/tsan/sanitizer_common/sanitizer_win.h | 25 - lib/tsan/sanitizer_common/sanitizer_win_defs.h | 174 - .../sanitizer_common/sanitizer_win_immortalize.h | 71 - .../sanitizer_win_interception.cpp | 156 - .../sanitizer_common/sanitizer_win_interception.h | 32 - lib/tsan/tsan_debugging.cpp | 264 - lib/tsan/tsan_defs.h | 217 - lib/tsan/tsan_dense_alloc.h | 196 - lib/tsan/tsan_dispatch_defs.h | 66 - lib/tsan/tsan_external.cpp | 133 - lib/tsan/tsan_fd.cpp | 375 - lib/tsan/tsan_fd.h | 65 - lib/tsan/tsan_flags.cpp | 122 - lib/tsan/tsan_flags.h | 34 - lib/tsan/tsan_flags.inc | 82 - lib/tsan/tsan_ignoreset.cpp | 38 - lib/tsan/tsan_ignoreset.h | 36 - lib/tsan/tsan_ilist.h | 189 - lib/tsan/tsan_interceptors.h | 132 - lib/tsan/tsan_interceptors_mac.cpp | 548 - lib/tsan/tsan_interceptors_mach_vm.cpp | 53 - lib/tsan/tsan_interceptors_memintrinsics.cpp | 43 - lib/tsan/tsan_interceptors_posix.cpp | 3199 ------ lib/tsan/tsan_interface.cpp | 92 - lib/tsan/tsan_interface.h | 445 - lib/tsan/tsan_interface.inc | 190 - lib/tsan/tsan_interface_ann.cpp | 460 - lib/tsan/tsan_interface_ann.h | 32 - lib/tsan/tsan_interface_atomic.cpp | 995 -- lib/tsan/tsan_interface_java.cpp | 258 - lib/tsan/tsan_interface_java.h | 99 - lib/tsan/tsan_malloc_mac.cpp | 87 - lib/tsan/tsan_md5.cpp | 250 - lib/tsan/tsan_mman.cpp | 496 - lib/tsan/tsan_mman.h | 80 - lib/tsan/tsan_mutexset.cpp | 80 - lib/tsan/tsan_mutexset.h | 91 - lib/tsan/tsan_new_delete.cpp | 199 - lib/tsan/tsan_platform.h | 1043 -- lib/tsan/tsan_platform_linux.cpp | 655 -- lib/tsan/tsan_platform_mac.cpp | 307 - lib/tsan/tsan_platform_posix.cpp | 174 - lib/tsan/tsan_platform_windows.cpp | 33 - lib/tsan/tsan_ppc_regs.h | 96 - lib/tsan/tsan_preinit.cpp | 24 - lib/tsan/tsan_report.cpp | 458 - lib/tsan/tsan_report.h | 129 - lib/tsan/tsan_rtl.cpp | 1130 -- lib/tsan/tsan_rtl.h | 813 -- lib/tsan/tsan_rtl_aarch64.S | 227 - lib/tsan/tsan_rtl_access.cpp | 750 -- lib/tsan/tsan_rtl_amd64.S | 210 - lib/tsan/tsan_rtl_loongarch64.S | 196 - lib/tsan/tsan_rtl_mips64.S | 214 - lib/tsan/tsan_rtl_mutex.cpp | 578 - lib/tsan/tsan_rtl_ppc64.S | 288 - lib/tsan/tsan_rtl_proc.cpp | 59 - lib/tsan/tsan_rtl_report.cpp | 862 -- lib/tsan/tsan_rtl_riscv64.S | 203 - lib/tsan/tsan_rtl_s390x.S | 49 - lib/tsan/tsan_rtl_thread.cpp | 370 - lib/tsan/tsan_shadow.h | 193 - lib/tsan/tsan_stack_trace.cpp | 57 - lib/tsan/tsan_stack_trace.h | 42 - lib/tsan/tsan_suppressions.cpp | 163 - lib/tsan/tsan_suppressions.h | 37 - lib/tsan/tsan_symbolize.cpp | 123 - lib/tsan/tsan_symbolize.h | 30 - lib/tsan/tsan_sync.cpp | 289 - lib/tsan/tsan_sync.h | 148 - lib/tsan/tsan_trace.h | 215 - lib/tsan/tsan_vector_clock.cpp | 126 - lib/tsan/tsan_vector_clock.h | 51 - lib/tsan/ubsan/ubsan_flags.h | 46 - lib/tsan/ubsan/ubsan_flags.inc | 28 - lib/tsan/ubsan/ubsan_init.h | 33 - lib/tsan/ubsan/ubsan_platform.h | 25 - src/libtsan.zig | 18 +- 553 files changed, 91731 insertions(+), 91731 deletions(-) create mode 100644 lib/libtsan/builtins/assembly.h create mode 100644 lib/libtsan/interception/interception.h create mode 100644 lib/libtsan/interception/interception_linux.cpp create mode 100644 lib/libtsan/interception/interception_linux.h create mode 100644 lib/libtsan/interception/interception_mac.cpp create mode 100644 lib/libtsan/interception/interception_mac.h create mode 100644 lib/libtsan/interception/interception_type_test.cpp create mode 100644 lib/libtsan/interception/interception_win.cpp create mode 100644 lib/libtsan/interception/interception_win.h create mode 100644 lib/libtsan/sanitizer_common/sancov_flags.h create mode 100644 lib/libtsan/sanitizer_common/sancov_flags.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_addrhashmap.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_checks.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_checks.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_combined.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_dlsym.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_interface.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_internal.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_local_cache.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_primary32.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_primary64.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_report.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_report.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_secondary.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_size_class_map.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_allocator_stats.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_array_ref.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_asm.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_atomic.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_atomic_clang.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_atomic_msvc.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_bitvector.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_bvgraph.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_chained_origin_depot.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_chained_origin_depot.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_format.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_ioctl.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_netbsd_compat.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_aarch64.inc.S create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_arm.inc.S create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_loongarch64.inc.S create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_riscv64.inc.S create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_x86_64.inc.S create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interface.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_interface_posix.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_nolibc.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_common_syscalls.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_coverage_interface.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_dbghelp.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_deadlock_detector.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_deadlock_detector1.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_deadlock_detector2.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_deadlock_detector_interface.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_dense_map.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_dense_map_info.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_dl.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_dl.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_errno.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_errno.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_errno_codes.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_file.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_file.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_flag_parser.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_flag_parser.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_flags.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_flags.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_flags.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_flat_map.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_fuchsia.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_fuchsia.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_getauxval.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_glibc_version.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_hash.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_interface_internal.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_internal_defs.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_leb128.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_lfstack.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_libc.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_libc.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_libignore.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_libignore.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_linux.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_linux.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_linux_s390.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_list.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_local_address_space_view.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_lzw.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_mac.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_mac.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_mac_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_mallinfo.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_malloc_mac.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_mutex.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_mutex.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_netbsd.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_placement_new.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_interceptors.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_freebsd.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_freebsd.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_linux.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_netbsd.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_netbsd.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_posix.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_posix.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_solaris.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_platform_limits_solaris.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_posix.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_posix.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_posix_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_printf.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps_bsd.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps_common.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps_fuchsia.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps_linux.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps_mac.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_procmaps_solaris.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_ptrauth.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_quarantine.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_range.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_range.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_redefine_builtins.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_report_decorator.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_ring_buffer.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_signal_interceptors.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_solaris.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_solaris.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stack_store.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stack_store.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stackdepot.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stackdepot.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stackdepotbase.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stacktrace.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stacktrace.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stacktrace_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stacktrace_printer.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stacktrace_printer.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stacktrace_sparc.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld_fuchsia.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld_fuchsia.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld_mac.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_stoptheworld_win.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_suppressions.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_suppressions.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_internal.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_libbacktrace.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_libbacktrace.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_mac.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_mac.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_markup.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_markup.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_markup_constants.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_markup_fuchsia.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_report.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_report_fuchsia.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_symbolizer_win.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_generic.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_linux_aarch64.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_linux_arm.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_linux_hexagon.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_linux_loongarch64.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_linux_riscv64.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscall_linux_x86_64.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_syscalls_netbsd.inc create mode 100644 lib/libtsan/sanitizer_common/sanitizer_termination.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_arg_retval.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_arg_retval.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_history.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_history.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_registry.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_registry.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_thread_safety.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_tls_get_addr.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_tls_get_addr.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_type_traits.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_type_traits.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_unwind_fuchsia.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_unwind_win.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_vector.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_win.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_win.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_win_defs.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_win_immortalize.h create mode 100644 lib/libtsan/sanitizer_common/sanitizer_win_interception.cpp create mode 100644 lib/libtsan/sanitizer_common/sanitizer_win_interception.h create mode 100644 lib/libtsan/tsan_debugging.cpp create mode 100644 lib/libtsan/tsan_defs.h create mode 100644 lib/libtsan/tsan_dense_alloc.h create mode 100644 lib/libtsan/tsan_dispatch_defs.h create mode 100644 lib/libtsan/tsan_external.cpp create mode 100644 lib/libtsan/tsan_fd.cpp create mode 100644 lib/libtsan/tsan_fd.h create mode 100644 lib/libtsan/tsan_flags.cpp create mode 100644 lib/libtsan/tsan_flags.h create mode 100644 lib/libtsan/tsan_flags.inc create mode 100644 lib/libtsan/tsan_ignoreset.cpp create mode 100644 lib/libtsan/tsan_ignoreset.h create mode 100644 lib/libtsan/tsan_ilist.h create mode 100644 lib/libtsan/tsan_interceptors.h create mode 100644 lib/libtsan/tsan_interceptors_mac.cpp create mode 100644 lib/libtsan/tsan_interceptors_mach_vm.cpp create mode 100644 lib/libtsan/tsan_interceptors_memintrinsics.cpp create mode 100644 lib/libtsan/tsan_interceptors_posix.cpp create mode 100644 lib/libtsan/tsan_interface.cpp create mode 100644 lib/libtsan/tsan_interface.h create mode 100644 lib/libtsan/tsan_interface.inc create mode 100644 lib/libtsan/tsan_interface_ann.cpp create mode 100644 lib/libtsan/tsan_interface_ann.h create mode 100644 lib/libtsan/tsan_interface_atomic.cpp create mode 100644 lib/libtsan/tsan_interface_java.cpp create mode 100644 lib/libtsan/tsan_interface_java.h create mode 100644 lib/libtsan/tsan_malloc_mac.cpp create mode 100644 lib/libtsan/tsan_md5.cpp create mode 100644 lib/libtsan/tsan_mman.cpp create mode 100644 lib/libtsan/tsan_mman.h create mode 100644 lib/libtsan/tsan_mutexset.cpp create mode 100644 lib/libtsan/tsan_mutexset.h create mode 100644 lib/libtsan/tsan_new_delete.cpp create mode 100644 lib/libtsan/tsan_platform.h create mode 100644 lib/libtsan/tsan_platform_linux.cpp create mode 100644 lib/libtsan/tsan_platform_mac.cpp create mode 100644 lib/libtsan/tsan_platform_posix.cpp create mode 100644 lib/libtsan/tsan_platform_windows.cpp create mode 100644 lib/libtsan/tsan_ppc_regs.h create mode 100644 lib/libtsan/tsan_preinit.cpp create mode 100644 lib/libtsan/tsan_report.cpp create mode 100644 lib/libtsan/tsan_report.h create mode 100644 lib/libtsan/tsan_rtl.cpp create mode 100644 lib/libtsan/tsan_rtl.h create mode 100644 lib/libtsan/tsan_rtl_aarch64.S create mode 100644 lib/libtsan/tsan_rtl_access.cpp create mode 100644 lib/libtsan/tsan_rtl_amd64.S create mode 100644 lib/libtsan/tsan_rtl_loongarch64.S create mode 100644 lib/libtsan/tsan_rtl_mips64.S create mode 100644 lib/libtsan/tsan_rtl_mutex.cpp create mode 100644 lib/libtsan/tsan_rtl_ppc64.S create mode 100644 lib/libtsan/tsan_rtl_proc.cpp create mode 100644 lib/libtsan/tsan_rtl_report.cpp create mode 100644 lib/libtsan/tsan_rtl_riscv64.S create mode 100644 lib/libtsan/tsan_rtl_s390x.S create mode 100644 lib/libtsan/tsan_rtl_thread.cpp create mode 100644 lib/libtsan/tsan_shadow.h create mode 100644 lib/libtsan/tsan_stack_trace.cpp create mode 100644 lib/libtsan/tsan_stack_trace.h create mode 100644 lib/libtsan/tsan_suppressions.cpp create mode 100644 lib/libtsan/tsan_suppressions.h create mode 100644 lib/libtsan/tsan_symbolize.cpp create mode 100644 lib/libtsan/tsan_symbolize.h create mode 100644 lib/libtsan/tsan_sync.cpp create mode 100644 lib/libtsan/tsan_sync.h create mode 100644 lib/libtsan/tsan_trace.h create mode 100644 lib/libtsan/tsan_vector_clock.cpp create mode 100644 lib/libtsan/tsan_vector_clock.h create mode 100644 lib/libtsan/ubsan/ubsan_flags.h create mode 100644 lib/libtsan/ubsan/ubsan_flags.inc create mode 100644 lib/libtsan/ubsan/ubsan_init.h create mode 100644 lib/libtsan/ubsan/ubsan_platform.h delete mode 100644 lib/tsan/builtins/assembly.h delete mode 100644 lib/tsan/interception/interception.h delete mode 100644 lib/tsan/interception/interception_linux.cpp delete mode 100644 lib/tsan/interception/interception_linux.h delete mode 100644 lib/tsan/interception/interception_mac.cpp delete mode 100644 lib/tsan/interception/interception_mac.h delete mode 100644 lib/tsan/interception/interception_type_test.cpp delete mode 100644 lib/tsan/interception/interception_win.cpp delete mode 100644 lib/tsan/interception/interception_win.h delete mode 100644 lib/tsan/sanitizer_common/sancov_flags.h delete mode 100644 lib/tsan/sanitizer_common/sancov_flags.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_addrhashmap.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_checks.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_checks.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_combined.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_dlsym.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_interface.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_internal.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_local_cache.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_primary32.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_primary64.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_report.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_report.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_secondary.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_size_class_map.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_allocator_stats.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_array_ref.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_asm.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_atomic.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_atomic_clang.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_atomic_msvc.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_bitvector.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_bvgraph.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_chained_origin_depot.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_chained_origin_depot.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_format.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_ioctl.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_netbsd_compat.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_vfork_aarch64.inc.S delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_vfork_arm.inc.S delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_vfork_loongarch64.inc.S delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_vfork_riscv64.inc.S delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interceptors_vfork_x86_64.inc.S delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interface.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_interface_posix.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_nolibc.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_common_syscalls.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_coverage_interface.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_dbghelp.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_deadlock_detector.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_deadlock_detector1.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_deadlock_detector2.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_deadlock_detector_interface.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_dense_map.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_dense_map_info.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_dl.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_dl.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_errno.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_errno.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_errno_codes.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_file.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_file.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_flag_parser.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_flag_parser.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_flags.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_flags.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_flags.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_flat_map.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_fuchsia.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_fuchsia.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_getauxval.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_glibc_version.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_hash.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_interceptors_ioctl_netbsd.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_interface_internal.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_internal_defs.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_leb128.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_lfstack.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_libc.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_libc.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_libignore.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_libignore.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_linux.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_linux.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_linux_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_linux_s390.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_list.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_local_address_space_view.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_lzw.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_mac.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_mac.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_mac_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_mallinfo.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_malloc_mac.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_mutex.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_mutex.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_netbsd.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_placement_new.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_interceptors.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_freebsd.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_freebsd.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_linux.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_netbsd.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_netbsd.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_posix.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_posix.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_solaris.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_platform_limits_solaris.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_posix.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_posix.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_posix_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_printf.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps_bsd.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps_common.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps_fuchsia.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps_linux.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps_mac.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_procmaps_solaris.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_ptrauth.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_quarantine.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_range.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_range.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_redefine_builtins.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_report_decorator.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_ring_buffer.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_signal_interceptors.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_solaris.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_solaris.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stack_store.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stack_store.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stackdepot.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stackdepot.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stackdepotbase.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stacktrace.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stacktrace.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stacktrace_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stacktrace_printer.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stacktrace_printer.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stacktrace_sparc.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld_fuchsia.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld_fuchsia.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld_mac.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_stoptheworld_win.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_suppressions.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_suppressions.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_internal.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_libbacktrace.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_libbacktrace.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_mac.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_mac.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_markup.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_markup.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_markup_constants.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_markup_fuchsia.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_report.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_report_fuchsia.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_symbolizer_win.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_generic.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_linux_aarch64.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_linux_arm.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_linux_hexagon.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_linux_loongarch64.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_linux_riscv64.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscall_linux_x86_64.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_syscalls_netbsd.inc delete mode 100644 lib/tsan/sanitizer_common/sanitizer_termination.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_arg_retval.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_arg_retval.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_history.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_history.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_registry.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_registry.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_thread_safety.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_tls_get_addr.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_tls_get_addr.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_type_traits.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_type_traits.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_unwind_fuchsia.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_unwind_linux_libcdep.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_unwind_win.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_vector.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_win.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_win.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_win_defs.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_win_immortalize.h delete mode 100644 lib/tsan/sanitizer_common/sanitizer_win_interception.cpp delete mode 100644 lib/tsan/sanitizer_common/sanitizer_win_interception.h delete mode 100644 lib/tsan/tsan_debugging.cpp delete mode 100644 lib/tsan/tsan_defs.h delete mode 100644 lib/tsan/tsan_dense_alloc.h delete mode 100644 lib/tsan/tsan_dispatch_defs.h delete mode 100644 lib/tsan/tsan_external.cpp delete mode 100644 lib/tsan/tsan_fd.cpp delete mode 100644 lib/tsan/tsan_fd.h delete mode 100644 lib/tsan/tsan_flags.cpp delete mode 100644 lib/tsan/tsan_flags.h delete mode 100644 lib/tsan/tsan_flags.inc delete mode 100644 lib/tsan/tsan_ignoreset.cpp delete mode 100644 lib/tsan/tsan_ignoreset.h delete mode 100644 lib/tsan/tsan_ilist.h delete mode 100644 lib/tsan/tsan_interceptors.h delete mode 100644 lib/tsan/tsan_interceptors_mac.cpp delete mode 100644 lib/tsan/tsan_interceptors_mach_vm.cpp delete mode 100644 lib/tsan/tsan_interceptors_memintrinsics.cpp delete mode 100644 lib/tsan/tsan_interceptors_posix.cpp delete mode 100644 lib/tsan/tsan_interface.cpp delete mode 100644 lib/tsan/tsan_interface.h delete mode 100644 lib/tsan/tsan_interface.inc delete mode 100644 lib/tsan/tsan_interface_ann.cpp delete mode 100644 lib/tsan/tsan_interface_ann.h delete mode 100644 lib/tsan/tsan_interface_atomic.cpp delete mode 100644 lib/tsan/tsan_interface_java.cpp delete mode 100644 lib/tsan/tsan_interface_java.h delete mode 100644 lib/tsan/tsan_malloc_mac.cpp delete mode 100644 lib/tsan/tsan_md5.cpp delete mode 100644 lib/tsan/tsan_mman.cpp delete mode 100644 lib/tsan/tsan_mman.h delete mode 100644 lib/tsan/tsan_mutexset.cpp delete mode 100644 lib/tsan/tsan_mutexset.h delete mode 100644 lib/tsan/tsan_new_delete.cpp delete mode 100644 lib/tsan/tsan_platform.h delete mode 100644 lib/tsan/tsan_platform_linux.cpp delete mode 100644 lib/tsan/tsan_platform_mac.cpp delete mode 100644 lib/tsan/tsan_platform_posix.cpp delete mode 100644 lib/tsan/tsan_platform_windows.cpp delete mode 100644 lib/tsan/tsan_ppc_regs.h delete mode 100644 lib/tsan/tsan_preinit.cpp delete mode 100644 lib/tsan/tsan_report.cpp delete mode 100644 lib/tsan/tsan_report.h delete mode 100644 lib/tsan/tsan_rtl.cpp delete mode 100644 lib/tsan/tsan_rtl.h delete mode 100644 lib/tsan/tsan_rtl_aarch64.S delete mode 100644 lib/tsan/tsan_rtl_access.cpp delete mode 100644 lib/tsan/tsan_rtl_amd64.S delete mode 100644 lib/tsan/tsan_rtl_loongarch64.S delete mode 100644 lib/tsan/tsan_rtl_mips64.S delete mode 100644 lib/tsan/tsan_rtl_mutex.cpp delete mode 100644 lib/tsan/tsan_rtl_ppc64.S delete mode 100644 lib/tsan/tsan_rtl_proc.cpp delete mode 100644 lib/tsan/tsan_rtl_report.cpp delete mode 100644 lib/tsan/tsan_rtl_riscv64.S delete mode 100644 lib/tsan/tsan_rtl_s390x.S delete mode 100644 lib/tsan/tsan_rtl_thread.cpp delete mode 100644 lib/tsan/tsan_shadow.h delete mode 100644 lib/tsan/tsan_stack_trace.cpp delete mode 100644 lib/tsan/tsan_stack_trace.h delete mode 100644 lib/tsan/tsan_suppressions.cpp delete mode 100644 lib/tsan/tsan_suppressions.h delete mode 100644 lib/tsan/tsan_symbolize.cpp delete mode 100644 lib/tsan/tsan_symbolize.h delete mode 100644 lib/tsan/tsan_sync.cpp delete mode 100644 lib/tsan/tsan_sync.h delete mode 100644 lib/tsan/tsan_trace.h delete mode 100644 lib/tsan/tsan_vector_clock.cpp delete mode 100644 lib/tsan/tsan_vector_clock.h delete mode 100644 lib/tsan/ubsan/ubsan_flags.h delete mode 100644 lib/tsan/ubsan/ubsan_flags.inc delete mode 100644 lib/tsan/ubsan/ubsan_init.h delete mode 100644 lib/tsan/ubsan/ubsan_platform.h (limited to 'lib') diff --git a/lib/libtsan/builtins/assembly.h b/lib/libtsan/builtins/assembly.h new file mode 100644 index 0000000000..34c7124152 --- /dev/null +++ b/lib/libtsan/builtins/assembly.h @@ -0,0 +1,305 @@ +//===-- assembly.h - compiler-rt assembler support macros -----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file defines macros for use in compiler-rt assembler source. +// This file is not part of the interface of this library. +// +//===----------------------------------------------------------------------===// + +#ifndef COMPILERRT_ASSEMBLY_H +#define COMPILERRT_ASSEMBLY_H + +#if defined(__linux__) && defined(__CET__) +#if __has_include() +#include +#endif +#endif + +#if defined(__APPLE__) && defined(__aarch64__) +#define SEPARATOR %% +#else +#define SEPARATOR ; +#endif + +#if defined(__APPLE__) +#define HIDDEN(name) .private_extern name +#define LOCAL_LABEL(name) L_##name +// tell linker it can break up file at label boundaries +#define FILE_LEVEL_DIRECTIVE .subsections_via_symbols +#define SYMBOL_IS_FUNC(name) +#define CONST_SECTION .const + +#define NO_EXEC_STACK_DIRECTIVE + +#elif defined(__ELF__) + +#define HIDDEN(name) .hidden name +#define LOCAL_LABEL(name) .L_##name +#define FILE_LEVEL_DIRECTIVE +#if defined(__arm__) || defined(__aarch64__) +#define SYMBOL_IS_FUNC(name) .type name,%function +#else +#define SYMBOL_IS_FUNC(name) .type name,@function +#endif +#define CONST_SECTION .section .rodata + +#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ + defined(__linux__) +#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits +#else +#define NO_EXEC_STACK_DIRECTIVE +#endif + +#else // !__APPLE__ && !__ELF__ + +#define HIDDEN(name) +#define LOCAL_LABEL(name) .L ## name +#define FILE_LEVEL_DIRECTIVE +#define SYMBOL_IS_FUNC(name) \ + .def name SEPARATOR \ + .scl 2 SEPARATOR \ + .type 32 SEPARATOR \ + .endef +#define CONST_SECTION .section .rdata,"rd" + +#define NO_EXEC_STACK_DIRECTIVE + +#endif + +#if defined(__arm__) || defined(__aarch64__) +#define FUNC_ALIGN \ + .text SEPARATOR \ + .balign 16 SEPARATOR +#else +#define FUNC_ALIGN +#endif + +// BTI and PAC gnu property note +#define NT_GNU_PROPERTY_TYPE_0 5 +#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000 +#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 1 +#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 2 + +#if defined(__ARM_FEATURE_BTI_DEFAULT) +#define BTI_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_BTI +#else +#define BTI_FLAG 0 +#endif + +#if __ARM_FEATURE_PAC_DEFAULT & 3 +#define PAC_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_PAC +#else +#define PAC_FLAG 0 +#endif + +#define GNU_PROPERTY(type, value) \ + .pushsection .note.gnu.property, "a" SEPARATOR \ + .p2align 3 SEPARATOR \ + .word 4 SEPARATOR \ + .word 16 SEPARATOR \ + .word NT_GNU_PROPERTY_TYPE_0 SEPARATOR \ + .asciz "GNU" SEPARATOR \ + .word type SEPARATOR \ + .word 4 SEPARATOR \ + .word value SEPARATOR \ + .word 0 SEPARATOR \ + .popsection + +#if BTI_FLAG != 0 +#define BTI_C hint #34 +#define BTI_J hint #36 +#else +#define BTI_C +#define BTI_J +#endif + +#if (BTI_FLAG | PAC_FLAG) != 0 +#define GNU_PROPERTY_BTI_PAC \ + GNU_PROPERTY(GNU_PROPERTY_AARCH64_FEATURE_1_AND, BTI_FLAG | PAC_FLAG) +#else +#define GNU_PROPERTY_BTI_PAC +#endif + +#if defined(__clang__) || defined(__GCC_HAVE_DWARF2_CFI_ASM) +#define CFI_START .cfi_startproc +#define CFI_END .cfi_endproc +#else +#define CFI_START +#define CFI_END +#endif + +#if defined(__arm__) + +// Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros: +// - for '-mthumb -march=armv6' compiler defines '__thumb__' +// - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__' +#if defined(__thumb2__) || defined(__thumb__) +#define DEFINE_CODE_STATE .thumb SEPARATOR +#define DECLARE_FUNC_ENCODING .thumb_func SEPARATOR +#if defined(__thumb2__) +#define USE_THUMB_2 +#define IT(cond) it cond +#define ITT(cond) itt cond +#define ITE(cond) ite cond +#else +#define USE_THUMB_1 +#define IT(cond) +#define ITT(cond) +#define ITE(cond) +#endif // defined(__thumb__2) +#else // !defined(__thumb2__) && !defined(__thumb__) +#define DEFINE_CODE_STATE .arm SEPARATOR +#define DECLARE_FUNC_ENCODING +#define IT(cond) +#define ITT(cond) +#define ITE(cond) +#endif + +#if defined(USE_THUMB_1) && defined(USE_THUMB_2) +#error "USE_THUMB_1 and USE_THUMB_2 can't be defined together." +#endif + +#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 +#define ARM_HAS_BX +#endif +#if !defined(__ARM_FEATURE_CLZ) && !defined(USE_THUMB_1) && \ + (__ARM_ARCH >= 6 || (__ARM_ARCH == 5 && !defined(__ARM_ARCH_5__))) +#define __ARM_FEATURE_CLZ +#endif + +#ifdef ARM_HAS_BX +#define JMP(r) bx r +#define JMPc(r, c) bx##c r +#else +#define JMP(r) mov pc, r +#define JMPc(r, c) mov##c pc, r +#endif + +// pop {pc} can't switch Thumb mode on ARMv4T +#if __ARM_ARCH >= 5 +#define POP_PC() pop {pc} +#else +#define POP_PC() \ + pop {ip}; \ + JMP(ip) +#endif + +#if defined(USE_THUMB_2) +#define WIDE(op) op.w +#else +#define WIDE(op) op +#endif +#else // !defined(__arm) +#define DECLARE_FUNC_ENCODING +#define DEFINE_CODE_STATE +#endif + +#define GLUE2_(a, b) a##b +#define GLUE(a, b) GLUE2_(a, b) +#define GLUE2(a, b) GLUE2_(a, b) +#define GLUE3_(a, b, c) a##b##c +#define GLUE3(a, b, c) GLUE3_(a, b, c) +#define GLUE4_(a, b, c, d) a##b##c##d +#define GLUE4(a, b, c, d) GLUE4_(a, b, c, d) + +#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) + +#ifdef VISIBILITY_HIDDEN +#define DECLARE_SYMBOL_VISIBILITY(name) \ + HIDDEN(SYMBOL_NAME(name)) SEPARATOR +#define DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) \ + HIDDEN(name) SEPARATOR +#else +#define DECLARE_SYMBOL_VISIBILITY(name) +#define DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) +#endif + +#define DEFINE_COMPILERRT_FUNCTION(name) \ + DEFINE_CODE_STATE \ + FILE_LEVEL_DIRECTIVE SEPARATOR \ + .globl SYMBOL_NAME(name) SEPARATOR \ + SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ + DECLARE_SYMBOL_VISIBILITY(name) \ + DECLARE_FUNC_ENCODING \ + SYMBOL_NAME(name): + +#define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \ + DEFINE_CODE_STATE \ + FILE_LEVEL_DIRECTIVE SEPARATOR \ + .globl SYMBOL_NAME(name) SEPARATOR \ + SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ + DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \ + .thumb_func SEPARATOR \ + SYMBOL_NAME(name): + +#define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \ + DEFINE_CODE_STATE \ + FILE_LEVEL_DIRECTIVE SEPARATOR \ + .globl SYMBOL_NAME(name) SEPARATOR \ + SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ + HIDDEN(SYMBOL_NAME(name)) SEPARATOR \ + DECLARE_FUNC_ENCODING \ + SYMBOL_NAME(name): + +#define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \ + DEFINE_CODE_STATE \ + .globl name SEPARATOR \ + SYMBOL_IS_FUNC(name) SEPARATOR \ + HIDDEN(name) SEPARATOR \ + DECLARE_FUNC_ENCODING \ + name: + +#define DEFINE_COMPILERRT_OUTLINE_FUNCTION_UNMANGLED(name) \ + DEFINE_CODE_STATE \ + FUNC_ALIGN \ + .globl name SEPARATOR \ + SYMBOL_IS_FUNC(name) SEPARATOR \ + DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) SEPARATOR \ + DECLARE_FUNC_ENCODING \ + name: \ + SEPARATOR CFI_START \ + SEPARATOR BTI_C + +#define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \ + .globl SYMBOL_NAME(name) SEPARATOR \ + SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ + DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \ + .set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR + +#if defined(__ARM_EABI__) +#define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \ + DEFINE_COMPILERRT_FUNCTION_ALIAS(aeabi_name, name) +#else +#define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) +#endif + +#ifdef __ELF__ +#define END_COMPILERRT_FUNCTION(name) \ + .size SYMBOL_NAME(name), . - SYMBOL_NAME(name) +#define END_COMPILERRT_OUTLINE_FUNCTION(name) \ + CFI_END SEPARATOR \ + .size SYMBOL_NAME(name), . - SYMBOL_NAME(name) +#else +#define END_COMPILERRT_FUNCTION(name) +#define END_COMPILERRT_OUTLINE_FUNCTION(name) \ + CFI_END +#endif + +#ifdef __arm__ +#include "int_endianness.h" + +#if _YUGA_BIG_ENDIAN +#define VMOV_TO_DOUBLE(dst, src0, src1) vmov dst, src1, src0 SEPARATOR +#define VMOV_FROM_DOUBLE(dst0, dst1, src) vmov dst1, dst0, src SEPARATOR +#else +#define VMOV_TO_DOUBLE(dst, src0, src1) vmov dst, src0, src1 SEPARATOR +#define VMOV_FROM_DOUBLE(dst0, dst1, src) vmov dst0, dst1, src SEPARATOR +#endif +#endif + +#endif // COMPILERRT_ASSEMBLY_H diff --git a/lib/libtsan/interception/interception.h b/lib/libtsan/interception/interception.h new file mode 100644 index 0000000000..3cb6b44663 --- /dev/null +++ b/lib/libtsan/interception/interception.h @@ -0,0 +1,391 @@ +//===-- interception.h ------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Machinery for providing replacements/wrappers for system functions. +//===----------------------------------------------------------------------===// + +#ifndef INTERCEPTION_H +#define INTERCEPTION_H + +#include "sanitizer_common/sanitizer_asm.h" +#include "sanitizer_common/sanitizer_internal_defs.h" + +#if !SANITIZER_LINUX && !SANITIZER_FREEBSD && !SANITIZER_APPLE && \ + !SANITIZER_NETBSD && !SANITIZER_WINDOWS && !SANITIZER_FUCHSIA && \ + !SANITIZER_SOLARIS +# error "Interception doesn't work on this operating system." +#endif + +// These typedefs should be used only in the interceptor definitions to replace +// the standard system types (e.g. SSIZE_T instead of ssize_t) +// On Windows the system headers (basetsd.h) provide a conflicting definition +// of SIZE_T/SSIZE_T that do not match the real size_t/ssize_t for 32-bit +// systems (using long instead of the expected int). Work around the typedef +// redefinition by #defining SIZE_T instead of using a typedef. +// TODO: We should be using __sanitizer::usize (and a new ssize) instead of +// these new macros as long as we ensure they match the real system definitions. +#if SANITIZER_WINDOWS +// Ensure that (S)SIZE_T were already defined as we are about to override them. +# include +#endif + +#define SIZE_T __sanitizer::usize +#define SSIZE_T __sanitizer::ssize +typedef __sanitizer::sptr PTRDIFF_T; +typedef __sanitizer::s64 INTMAX_T; +typedef __sanitizer::u64 UINTMAX_T; +typedef __sanitizer::OFF_T OFF_T; +typedef __sanitizer::OFF64_T OFF64_T; + +// How to add an interceptor: +// Suppose you need to wrap/replace system function (generally, from libc): +// int foo(const char *bar, double baz); +// You'll need to: +// 1) define INTERCEPTOR(int, foo, const char *bar, double baz) { ... } in +// your source file. See the notes below for cases when +// INTERCEPTOR_WITH_SUFFIX(...) should be used instead. +// 2) Call "INTERCEPT_FUNCTION(foo)" prior to the first call of "foo". +// INTERCEPT_FUNCTION(foo) evaluates to "true" iff the function was +// intercepted successfully. +// You can access original function by calling REAL(foo)(bar, baz). +// By default, REAL(foo) will be visible only inside your interceptor, and if +// you want to use it in other parts of RTL, you'll need to: +// 3a) add DECLARE_REAL(int, foo, const char*, double) to a +// header file. +// However, if the call "INTERCEPT_FUNCTION(foo)" and definition for +// INTERCEPTOR(..., foo, ...) are in different files, you'll instead need to: +// 3b) add DECLARE_REAL_AND_INTERCEPTOR(int, foo, const char*, double) +// to a header file. + +// Notes: 1. Things may not work properly if macro INTERCEPTOR(...) {...} or +// DECLARE_REAL(...) are located inside namespaces. +// 2. On Mac you can also use: "OVERRIDE_FUNCTION(foo, zoo)" to +// effectively redirect calls from "foo" to "zoo". In this case +// you aren't required to implement +// INTERCEPTOR(int, foo, const char *bar, double baz) {...} +// but instead you'll have to add +// DECLARE_REAL(int, foo, const char *bar, double baz) in your +// source file (to define a pointer to overriden function). +// 3. Some Mac functions have symbol variants discriminated by +// additional suffixes, e.g. _$UNIX2003 (see +// https://developer.apple.com/library/mac/#releasenotes/Darwin/SymbolVariantsRelNotes/index.html +// for more details). To intercept such functions you need to use the +// INTERCEPTOR_WITH_SUFFIX(...) macro. + +// How it works on Linux +// --------------------- +// +// To replace system functions on Linux we just need to declare functions with +// the same names in our library and then obtain the real function pointers +// using dlsym(). +// +// There is one complication: a user may also intercept some of the functions we +// intercept. To allow for up to 3 interceptors (including ours) of a given +// function "func", the interceptor implementation is in ___interceptor_func, +// which is aliased by a weak function __interceptor_func, which in turn is +// aliased (via a trampoline) by weak wrapper function "func". +// +// Most user interceptors should define a foreign interceptor as follows: +// +// - provide a non-weak function "func" that performs interception; +// - if __interceptor_func exists, call it to perform the real functionality; +// - if it does not exist, figure out the real function and call it instead. +// +// In rare cases, a foreign interceptor (of another dynamic analysis runtime) +// may be defined as follows (on supported architectures): +// +// - provide a non-weak function __interceptor_func that performs interception; +// - if ___interceptor_func exists, call it to perform the real functionality; +// - if it does not exist, figure out the real function and call it instead; +// - provide a weak function "func" that is an alias to __interceptor_func. +// +// With this protocol, sanitizer interceptors, foreign user interceptors, and +// foreign interceptors of other dynamic analysis runtimes, or any combination +// thereof, may co-exist simultaneously. +// +// How it works on Mac OS +// ---------------------- +// +// This is not so on Mac OS, where the two-level namespace makes our replacement +// functions invisible to other libraries. This may be overcomed using the +// DYLD_FORCE_FLAT_NAMESPACE, but some errors loading the shared libraries in +// Chromium were noticed when doing so. +// +// Instead we create a dylib containing a __DATA,__interpose section that +// associates library functions with their wrappers. When this dylib is +// preloaded before an executable using DYLD_INSERT_LIBRARIES, it routes all the +// calls to interposed functions done through stubs to the wrapper functions. +// +// As it's decided at compile time which functions are to be intercepted on Mac, +// INTERCEPT_FUNCTION() is effectively a no-op on this system. + +#if SANITIZER_APPLE +#include // For __DARWIN_ALIAS_C(). + +// Just a pair of pointers. +struct interpose_substitution { + const __sanitizer::uptr replacement; + const __sanitizer::uptr original; +}; + +// For a function foo() create a global pair of pointers { wrap_foo, foo } in +// the __DATA,__interpose section. +// As a result all the calls to foo() will be routed to wrap_foo() at runtime. +#define INTERPOSER(func_name) __attribute__((used)) \ +const interpose_substitution substitution_##func_name[] \ + __attribute__((section("__DATA, __interpose"))) = { \ + { reinterpret_cast(WRAP(func_name)), \ + reinterpret_cast(func_name) } \ +} + +// For a function foo() and a wrapper function bar() create a global pair +// of pointers { bar, foo } in the __DATA,__interpose section. +// As a result all the calls to foo() will be routed to bar() at runtime. +#define INTERPOSER_2(func_name, wrapper_name) __attribute__((used)) \ +const interpose_substitution substitution_##func_name[] \ + __attribute__((section("__DATA, __interpose"))) = { \ + { reinterpret_cast(wrapper_name), \ + reinterpret_cast(func_name) } \ +} + +# define WRAP(x) wrap_##x +# define TRAMPOLINE(x) WRAP(x) +# define INTERCEPTOR_ATTRIBUTE +# define DECLARE_WRAPPER(ret_type, func, ...) + +#elif SANITIZER_WINDOWS +# define WRAP(x) __asan_wrap_##x +# define TRAMPOLINE(x) WRAP(x) +# define INTERCEPTOR_ATTRIBUTE __declspec(dllexport) +# define DECLARE_WRAPPER(ret_type, func, ...) \ + extern "C" ret_type func(__VA_ARGS__); +# define DECLARE_WRAPPER_WINAPI(ret_type, func, ...) \ + extern "C" __declspec(dllimport) ret_type __stdcall func(__VA_ARGS__); +#elif !SANITIZER_FUCHSIA // LINUX, FREEBSD, NETBSD, SOLARIS +# define INTERCEPTOR_ATTRIBUTE __attribute__((visibility("default"))) +# if ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT +// Weak aliases of weak aliases do not work, therefore we need to set up a +// trampoline function. The function "func" is a weak alias to the trampoline +// (so that we may check if "func" was overridden), which calls the weak +// function __interceptor_func, which in turn aliases the actual interceptor +// implementation ___interceptor_func: +// +// [wrapper "func": weak] --(alias)--> [TRAMPOLINE(func)] +// | +// +--------(tail call)-------+ +// | +// v +// [__interceptor_func: weak] --(alias)--> [WRAP(func)] +// +// We use inline assembly to define most of this, because not all compilers +// support functions with the "naked" attribute with every architecture. +# define WRAP(x) ___interceptor_ ## x +# define TRAMPOLINE(x) __interceptor_trampoline_ ## x +# if SANITIZER_FREEBSD || SANITIZER_NETBSD +// FreeBSD's dynamic linker (incompliantly) gives non-weak symbols higher +// priority than weak ones so weak aliases won't work for indirect calls +// in position-independent (-fPIC / -fPIE) mode. +# define __ASM_WEAK_WRAPPER(func) ".globl " #func "\n" +# else +# define __ASM_WEAK_WRAPPER(func) ".weak " #func "\n" +# endif // SANITIZER_FREEBSD || SANITIZER_NETBSD +# if defined(__arm__) || defined(__aarch64__) +# define ASM_TYPE_FUNCTION_STR "%function" +# else +# define ASM_TYPE_FUNCTION_STR "@function" +# endif +// Keep trampoline implementation in sync with sanitizer_common/sanitizer_asm.h +# define DECLARE_WRAPPER(ret_type, func, ...) \ + extern "C" ret_type func(__VA_ARGS__); \ + extern "C" ret_type TRAMPOLINE(func)(__VA_ARGS__); \ + extern "C" ret_type __interceptor_##func(__VA_ARGS__) \ + INTERCEPTOR_ATTRIBUTE __attribute__((weak)) ALIAS(WRAP(func)); \ + asm( \ + ".text\n" \ + __ASM_WEAK_WRAPPER(func) \ + ".set " #func ", " SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \ + ".globl " SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \ + ".type " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \ + ASM_TYPE_FUNCTION_STR "\n" \ + SANITIZER_STRINGIFY(TRAMPOLINE(func)) ":\n" \ + C_ASM_STARTPROC "\n" \ + C_ASM_TAIL_CALL(SANITIZER_STRINGIFY(TRAMPOLINE(func)), \ + "__interceptor_" \ + SANITIZER_STRINGIFY(ASM_PREEMPTIBLE_SYM(func))) "\n" \ + C_ASM_ENDPROC "\n" \ + ".size " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \ + ".-" SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \ + ); +# else // ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT +// Some architectures cannot implement efficient interceptor trampolines with +// just a plain jump due to complexities of resolving a preemptible symbol. In +// those cases, revert to just this scheme: +// +// [wrapper "func": weak] --(alias)--> [WRAP(func)] +// +# define WRAP(x) __interceptor_ ## x +# define TRAMPOLINE(x) WRAP(x) +# if SANITIZER_FREEBSD || SANITIZER_NETBSD +# define __ATTRIBUTE_WEAK_WRAPPER +# else +# define __ATTRIBUTE_WEAK_WRAPPER __attribute__((weak)) +# endif // SANITIZER_FREEBSD || SANITIZER_NETBSD +# define DECLARE_WRAPPER(ret_type, func, ...) \ + extern "C" ret_type func(__VA_ARGS__) \ + INTERCEPTOR_ATTRIBUTE __ATTRIBUTE_WEAK_WRAPPER ALIAS(WRAP(func)); +# endif // ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT +#endif + +#if SANITIZER_FUCHSIA +// There is no general interception at all on Fuchsia. +// Sanitizer runtimes just define functions directly to preempt them, +// and have bespoke ways to access the underlying libc functions. +# include +# define INTERCEPTOR_ATTRIBUTE __attribute__((visibility("default"))) +# define REAL(x) __unsanitized_##x +# define DECLARE_REAL(ret_type, func, ...) +#elif !SANITIZER_APPLE +# define PTR_TO_REAL(x) real_##x +# define REAL(x) __interception::PTR_TO_REAL(x) +# define FUNC_TYPE(x) x##_type + +# define DECLARE_REAL(ret_type, func, ...) \ + typedef ret_type (*FUNC_TYPE(func))(__VA_ARGS__); \ + namespace __interception { \ + extern FUNC_TYPE(func) PTR_TO_REAL(func); \ + } +# define ASSIGN_REAL(dst, src) REAL(dst) = REAL(src) +#else // SANITIZER_APPLE +# define REAL(x) x +# define DECLARE_REAL(ret_type, func, ...) \ + extern "C" ret_type func(__VA_ARGS__); +# define ASSIGN_REAL(x, y) +#endif // SANITIZER_APPLE + +#if !SANITIZER_FUCHSIA +# define DECLARE_REAL_AND_INTERCEPTOR(ret_type, func, ...) \ + DECLARE_REAL(ret_type, func, __VA_ARGS__) \ + extern "C" ret_type TRAMPOLINE(func)(__VA_ARGS__); \ + extern "C" ret_type WRAP(func)(__VA_ARGS__); +// Declare an interceptor and its wrapper defined in a different translation +// unit (ex. asm). +# define DECLARE_EXTERN_INTERCEPTOR_AND_WRAPPER(ret_type, func, ...) \ + extern "C" ret_type TRAMPOLINE(func)(__VA_ARGS__); \ + extern "C" ret_type WRAP(func)(__VA_ARGS__); \ + extern "C" ret_type func(__VA_ARGS__); +#else +# define DECLARE_REAL_AND_INTERCEPTOR(ret_type, func, ...) +# define DECLARE_EXTERN_INTERCEPTOR_AND_WRAPPER(ret_type, func, ...) +#endif + +// Generally, you don't need to use DEFINE_REAL by itself, as INTERCEPTOR +// macros does its job. In exceptional cases you may need to call REAL(foo) +// without defining INTERCEPTOR(..., foo, ...). For example, if you override +// foo with an interceptor for other function. +#if !SANITIZER_APPLE && !SANITIZER_FUCHSIA +# define DEFINE_REAL(ret_type, func, ...) \ + typedef ret_type (*FUNC_TYPE(func))(__VA_ARGS__); \ + namespace __interception { \ + FUNC_TYPE(func) PTR_TO_REAL(func); \ + } +#else +# define DEFINE_REAL(ret_type, func, ...) +#endif + +#if SANITIZER_FUCHSIA + +// We need to define the __interceptor_func name just to get +// sanitizer_common/scripts/gen_dynamic_list.py to export func. +// But we don't need to export __interceptor_func to get that. +#define INTERCEPTOR(ret_type, func, ...) \ + extern "C"[[ gnu::alias(#func), gnu::visibility("hidden") ]] ret_type \ + __interceptor_##func(__VA_ARGS__); \ + extern "C" INTERCEPTOR_ATTRIBUTE ret_type func(__VA_ARGS__) + +#elif !SANITIZER_APPLE + +#define INTERCEPTOR(ret_type, func, ...) \ + DEFINE_REAL(ret_type, func, __VA_ARGS__) \ + DECLARE_WRAPPER(ret_type, func, __VA_ARGS__) \ + extern "C" INTERCEPTOR_ATTRIBUTE ret_type WRAP(func)(__VA_ARGS__) + +// We don't need INTERCEPTOR_WITH_SUFFIX on non-Darwin for now. +#define INTERCEPTOR_WITH_SUFFIX(ret_type, func, ...) \ + INTERCEPTOR(ret_type, func, __VA_ARGS__) + +#else // SANITIZER_APPLE + +#define INTERCEPTOR_ZZZ(suffix, ret_type, func, ...) \ + extern "C" ret_type func(__VA_ARGS__) suffix; \ + extern "C" ret_type WRAP(func)(__VA_ARGS__); \ + INTERPOSER(func); \ + extern "C" INTERCEPTOR_ATTRIBUTE ret_type WRAP(func)(__VA_ARGS__) + +#define INTERCEPTOR(ret_type, func, ...) \ + INTERCEPTOR_ZZZ(/*no symbol variants*/, ret_type, func, __VA_ARGS__) + +#define INTERCEPTOR_WITH_SUFFIX(ret_type, func, ...) \ + INTERCEPTOR_ZZZ(__DARWIN_ALIAS_C(func), ret_type, func, __VA_ARGS__) + +// Override |overridee| with |overrider|. +#define OVERRIDE_FUNCTION(overridee, overrider) \ + INTERPOSER_2(overridee, WRAP(overrider)) +#endif + +#if SANITIZER_WINDOWS +# define INTERCEPTOR_WINAPI(ret_type, func, ...) \ + typedef ret_type (__stdcall *FUNC_TYPE(func))(__VA_ARGS__); \ + namespace __interception { \ + FUNC_TYPE(func) PTR_TO_REAL(func); \ + } \ + extern "C" INTERCEPTOR_ATTRIBUTE ret_type __stdcall WRAP(func)(__VA_ARGS__) +#endif + +// ISO C++ forbids casting between pointer-to-function and pointer-to-object, +// so we use casts via uintptr_t (the local __sanitizer::uptr equivalent). +namespace __interception { + +#if defined(__ELF__) && !SANITIZER_FUCHSIA +// The use of interceptors makes many sanitizers unusable for static linking. +// Define a function, if called, will cause a linker error (undefined _DYNAMIC). +// However, -static-pie (which is not common) cannot be detected at link time. +extern uptr kDynamic[] asm("_DYNAMIC"); +inline void DoesNotSupportStaticLinking() { + [[maybe_unused]] volatile auto x = &kDynamic; +} +#else +inline void DoesNotSupportStaticLinking() {} +#endif +} // namespace __interception + +#define INCLUDED_FROM_INTERCEPTION_LIB + +#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ + SANITIZER_SOLARIS + +# include "interception_linux.h" +# define INTERCEPT_FUNCTION(func) INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) +# define INTERCEPT_FUNCTION_VER(func, symver) \ + INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) +#elif SANITIZER_APPLE +# include "interception_mac.h" +# define INTERCEPT_FUNCTION(func) INTERCEPT_FUNCTION_MAC(func) +# define INTERCEPT_FUNCTION_VER(func, symver) \ + INTERCEPT_FUNCTION_VER_MAC(func, symver) +#elif SANITIZER_WINDOWS +# include "interception_win.h" +# define INTERCEPT_FUNCTION(func) INTERCEPT_FUNCTION_WIN(func) +# define INTERCEPT_FUNCTION_VER(func, symver) \ + INTERCEPT_FUNCTION_VER_WIN(func, symver) +#endif + +#undef INCLUDED_FROM_INTERCEPTION_LIB + +#endif // INTERCEPTION_H diff --git a/lib/libtsan/interception/interception_linux.cpp b/lib/libtsan/interception/interception_linux.cpp new file mode 100644 index 0000000000..ef8136eb4f --- /dev/null +++ b/lib/libtsan/interception/interception_linux.cpp @@ -0,0 +1,83 @@ +//===-- interception_linux.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Linux-specific interception methods. +//===----------------------------------------------------------------------===// + +#include "interception.h" + +#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ + SANITIZER_SOLARIS + +#include // for dlsym() and dlvsym() + +namespace __interception { + +#if SANITIZER_NETBSD +static int StrCmp(const char *s1, const char *s2) { + while (true) { + if (*s1 != *s2) + return false; + if (*s1 == 0) + return true; + s1++; + s2++; + } +} +#endif + +static void *GetFuncAddr(const char *name, uptr trampoline) { +#if SANITIZER_NETBSD + // FIXME: Find a better way to handle renames + if (StrCmp(name, "sigaction")) + name = "__sigaction14"; +#endif + void *addr = dlsym(RTLD_NEXT, name); + if (!addr) { + // If the lookup using RTLD_NEXT failed, the sanitizer runtime library is + // later in the library search order than the DSO that we are trying to + // intercept, which means that we cannot intercept this function. We still + // want the address of the real definition, though, so look it up using + // RTLD_DEFAULT. + addr = dlsym(RTLD_DEFAULT, name); + + // In case `name' is not loaded, dlsym ends up finding the actual wrapper. + // We don't want to intercept the wrapper and have it point to itself. + if ((uptr)addr == trampoline) + addr = nullptr; + } + return addr; +} + +bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func, + uptr trampoline) { + void *addr = GetFuncAddr(name, trampoline); + *ptr_to_real = (uptr)addr; + return addr && (func == trampoline); +} + +// dlvsym is a GNU extension supported by some other platforms. +#if SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD +static void *GetFuncAddr(const char *name, const char *ver) { + return dlvsym(RTLD_NEXT, name, ver); +} + +bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real, + uptr func, uptr trampoline) { + void *addr = GetFuncAddr(name, ver); + *ptr_to_real = (uptr)addr; + return addr && (func == trampoline); +} +# endif // SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD + +} // namespace __interception + +#endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || + // SANITIZER_SOLARIS diff --git a/lib/libtsan/interception/interception_linux.h b/lib/libtsan/interception/interception_linux.h new file mode 100644 index 0000000000..2e01ff4457 --- /dev/null +++ b/lib/libtsan/interception/interception_linux.h @@ -0,0 +1,55 @@ +//===-- interception_linux.h ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Linux-specific interception methods. +//===----------------------------------------------------------------------===// + +#if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ + SANITIZER_SOLARIS + +#if !defined(INCLUDED_FROM_INTERCEPTION_LIB) +# error interception_linux.h should be included from interception library only +#endif + +#ifndef INTERCEPTION_LINUX_H +#define INTERCEPTION_LINUX_H + +namespace __interception { +bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func, + uptr trampoline); +bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real, + uptr func, uptr trampoline); +} // namespace __interception + +// Cast func to type of REAL(func) before casting to uptr in case it is an +// overloaded function, which is the case for some glibc functions when +// _FORTIFY_SOURCE is used. This disambiguates which overload to use. +#define INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) \ + ::__interception::InterceptFunction( \ + #func, (::__interception::uptr *)&REAL(func), \ + (::__interception::uptr)(decltype(REAL(func)))&(func), \ + (::__interception::uptr) &TRAMPOLINE(func)) + +// dlvsym is a GNU extension supported by some other platforms. +#if SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD +#define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ + ::__interception::InterceptFunction( \ + #func, symver, \ + (::__interception::uptr *)&REAL(func), \ + (::__interception::uptr)(decltype(REAL(func)))&(func), \ + (::__interception::uptr)&TRAMPOLINE(func)) +#else +#define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ + INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) +#endif // SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD + +#endif // INTERCEPTION_LINUX_H +#endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || + // SANITIZER_SOLARIS diff --git a/lib/libtsan/interception/interception_mac.cpp b/lib/libtsan/interception/interception_mac.cpp new file mode 100644 index 0000000000..03eae0fdca --- /dev/null +++ b/lib/libtsan/interception/interception_mac.cpp @@ -0,0 +1,18 @@ +//===-- interception_mac.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Mac-specific interception methods. +//===----------------------------------------------------------------------===// + +#include "interception.h" + +#if SANITIZER_APPLE + +#endif // SANITIZER_APPLE diff --git a/lib/libtsan/interception/interception_mac.h b/lib/libtsan/interception/interception_mac.h new file mode 100644 index 0000000000..26079518c6 --- /dev/null +++ b/lib/libtsan/interception/interception_mac.h @@ -0,0 +1,27 @@ +//===-- interception_mac.h --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Mac-specific interception methods. +//===----------------------------------------------------------------------===// + +#if SANITIZER_APPLE + +#if !defined(INCLUDED_FROM_INTERCEPTION_LIB) +# error "interception_mac.h should be included from interception.h only" +#endif + +#ifndef INTERCEPTION_MAC_H +#define INTERCEPTION_MAC_H + +#define INTERCEPT_FUNCTION_MAC(func) +#define INTERCEPT_FUNCTION_VER_MAC(func, symver) + +#endif // INTERCEPTION_MAC_H +#endif // SANITIZER_APPLE diff --git a/lib/libtsan/interception/interception_type_test.cpp b/lib/libtsan/interception/interception_type_test.cpp new file mode 100644 index 0000000000..41041ce6f9 --- /dev/null +++ b/lib/libtsan/interception/interception_type_test.cpp @@ -0,0 +1,46 @@ +//===-- interception_type_test.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Compile-time tests of the internal type definitions. +//===----------------------------------------------------------------------===// + +#include "interception.h" +#include "sanitizer_common/sanitizer_type_traits.h" + +#if __has_include() +# include +#endif +#include +#include + +COMPILER_CHECK((__sanitizer::is_same<__sanitizer::uptr, ::uintptr_t>::value)); +COMPILER_CHECK((__sanitizer::is_same<__sanitizer::sptr, ::intptr_t>::value)); +COMPILER_CHECK((__sanitizer::is_same<__sanitizer::usize, ::size_t>::value)); +COMPILER_CHECK((__sanitizer::is_same<::PTRDIFF_T, ::ptrdiff_t>::value)); +COMPILER_CHECK((__sanitizer::is_same<::SIZE_T, ::size_t>::value)); +#if !SANITIZER_WINDOWS +// No ssize_t on Windows. +COMPILER_CHECK((__sanitizer::is_same<::SSIZE_T, ::ssize_t>::value)); +#endif +// TODO: These are not actually the same type on Linux (long vs long long) +COMPILER_CHECK(sizeof(::INTMAX_T) == sizeof(intmax_t)); +COMPILER_CHECK(sizeof(::UINTMAX_T) == sizeof(uintmax_t)); + +#if SANITIZER_GLIBC || SANITIZER_ANDROID +COMPILER_CHECK(sizeof(::OFF64_T) == sizeof(off64_t)); +#endif + +// The following are the cases when pread (and friends) is used instead of +// pread64. In those cases we need OFF_T to match off_t. We don't care about the +// rest (they depend on _FILE_OFFSET_BITS setting when building an application). +#if !SANITIZER_WINDOWS && (SANITIZER_ANDROID || !defined _FILE_OFFSET_BITS || \ + _FILE_OFFSET_BITS != 64) +COMPILER_CHECK(sizeof(::OFF_T) == sizeof(off_t)); +#endif diff --git a/lib/libtsan/interception/interception_win.cpp b/lib/libtsan/interception/interception_win.cpp new file mode 100644 index 0000000000..002b37468a --- /dev/null +++ b/lib/libtsan/interception/interception_win.cpp @@ -0,0 +1,1443 @@ +//===-- interception_win.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Windows-specific interception methods. +// +// This file is implementing several hooking techniques to intercept calls +// to functions. The hooks are dynamically installed by modifying the assembly +// code. +// +// The hooking techniques are making assumptions on the way the code is +// generated and are safe under these assumptions. +// +// On 64-bit architecture, there is no direct 64-bit jump instruction. To allow +// arbitrary branching on the whole memory space, the notion of trampoline +// region is used. A trampoline region is a memory space withing 2G boundary +// where it is safe to add custom assembly code to build 64-bit jumps. +// +// Hooking techniques +// ================== +// +// 1) Detour +// +// The Detour hooking technique is assuming the presence of a header with +// padding and an overridable 2-bytes nop instruction (mov edi, edi). The +// nop instruction can safely be replaced by a 2-bytes jump without any need +// to save the instruction. A jump to the target is encoded in the function +// header and the nop instruction is replaced by a short jump to the header. +// +// head: 5 x nop head: jmp +// func: mov edi, edi --> func: jmp short +// [...] real: [...] +// +// This technique is only implemented on 32-bit architecture. +// Most of the time, Windows API are hookable with the detour technique. +// +// 2) Redirect Jump +// +// The redirect jump is applicable when the first instruction is a direct +// jump. The instruction is replaced by jump to the hook. +// +// func: jmp