diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mach_vm.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mach_vm.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_mach_vm.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_mach_vm.cpp @@ -50,4 +50,33 @@ return kr; } +TSAN_INTERCEPTOR(kern_return_t, mach_vm_map, vm_map_t target_task, + mach_vm_address_t *address, mach_vm_size_t size, + mach_vm_offset_t mask, int flags, mem_entry_name_port_t object, + memory_object_offset_t offset, boolean_t copy, + vm_prot_t cur_protection, vm_prot_t max_protection, + vm_inherit_t inheritance) { + // mach_vm_map is called very early in in the libSystem_initializer + if (!cur_thread()->is_inited) + return REAL(mach_vm_map)(target_task, address, size, mask, flags, object, + offset, copy, cur_protection, max_protection, + inheritance); + SCOPED_TSAN_INTERCEPTOR(mach_vm_map, target_task, address, size, mask, flags, + object, offset, copy, cur_protection, max_protection, + inheritance); + if (target_task != mach_task_self()) + return REAL(mach_vm_map)(target_task, address, size, mask, flags, object, + offset, copy, cur_protection, max_protection, + inheritance); + // FIXME: respect mask and offset + if (address && intersects_with_shadow(*address, size, flags)) + return KERN_NO_SPACE; + kern_return_t kr = + REAL(mach_vm_map)(target_task, address, size, mask, flags, object, offset, + copy, cur_protection, max_protection, inheritance); + if (kr == KERN_SUCCESS) + MemoryRangeImitateWriteOrResetRange(thr, pc, *address, size); + return kr; +} + } // namespace __tsan