| //===-- tsan_platform_mac.cc ----------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of ThreadSanitizer (TSan), a race detector. |
| // |
| // Mac-specific code. |
| //===----------------------------------------------------------------------===// |
| |
| #ifdef __APPLE__ |
| |
| #include "sanitizer_common/sanitizer_common.h" |
| #include "sanitizer_common/sanitizer_libc.h" |
| #include "sanitizer_common/sanitizer_procmaps.h" |
| #include "tsan_platform.h" |
| #include "tsan_rtl.h" |
| #include "tsan_flags.h" |
| |
| #include <pthread.h> |
| #include <signal.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <stdarg.h> |
| #include <sys/mman.h> |
| #include <sys/syscall.h> |
| #include <sys/time.h> |
| #include <sys/types.h> |
| #include <sys/resource.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <errno.h> |
| #include <sched.h> |
| |
| namespace __tsan { |
| |
| ScopedInRtl::ScopedInRtl() { |
| } |
| |
| ScopedInRtl::~ScopedInRtl() { |
| } |
| |
| uptr GetShadowMemoryConsumption() { |
| return 0; |
| } |
| |
| void FlushShadowMemory() { |
| } |
| |
| #ifndef TSAN_GO |
| void InitializeShadowMemory() { |
| uptr shadow = (uptr)MmapFixedNoReserve(kLinuxShadowBeg, |
| kLinuxShadowEnd - kLinuxShadowBeg); |
| if (shadow != kLinuxShadowBeg) { |
| Printf("FATAL: ThreadSanitizer can not mmap the shadow memory\n"); |
| Printf("FATAL: Make sure to compile with -fPIE and " |
| "to link with -pie.\n"); |
| Die(); |
| } |
| DPrintf("kLinuxShadow %zx-%zx (%zuGB)\n", |
| kLinuxShadowBeg, kLinuxShadowEnd, |
| (kLinuxShadowEnd - kLinuxShadowBeg) >> 30); |
| DPrintf("kLinuxAppMem %zx-%zx (%zuGB)\n", |
| kLinuxAppMemBeg, kLinuxAppMemEnd, |
| (kLinuxAppMemEnd - kLinuxAppMemBeg) >> 30); |
| } |
| #endif |
| |
| const char *InitializePlatform() { |
| void *p = 0; |
| if (sizeof(p) == 8) { |
| // Disable core dumps, dumping of 16TB usually takes a bit long. |
| // The following magic is to prevent clang from replacing it with memset. |
| volatile rlimit lim; |
| lim.rlim_cur = 0; |
| lim.rlim_max = 0; |
| setrlimit(RLIMIT_CORE, (rlimit*)&lim); |
| } |
| |
| return GetEnv(kTsanOptionsEnv); |
| } |
| |
| void FinalizePlatform() { |
| fflush(0); |
| } |
| |
| void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, |
| uptr *tls_addr, uptr *tls_size) { |
| *stk_addr = 0; |
| *stk_size = 0; |
| *tls_addr = 0; |
| *tls_size = 0; |
| } |
| |
| } // namespace __tsan |
| |
| #endif // #ifdef __APPLE__ |