<div dir="ltr">Hi Kuba,<br><br>Seems like this change broke one of sanitizer builders:<br><br>r251915:<br><a href="http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/6393">http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/6393</a><br><br>r251916:<br><a href="http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/6395">http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/6395</a><br><br>Please have a look at this?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 3, 2015 at 6:22 AM, Kuba Brecka via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kuba.brecka<br>
Date: Tue Nov  3 08:22:51 2015<br>
New Revision: 251916<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=251916&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=251916&view=rev</a><br>
Log:<br>
[tsan] Port TSan interceptors on OS X<br>
<br>
This patch modifies `tsan_interceptors.cc` to be buildable on OS X. Several of the intercepted methods are not available on OS X, so we need to `#if !SANITIZER_MAC` them. Plus a few other fixes, e.g. `pthread_yield` doesn't exist, let's use `internal_sched_yield` instead.<br>
<br>
This is part of an effort to port TSan to OS X, and it's one the very first steps. Don't expect TSan on OS X to actually work or pass tests at this point.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D14237" rel="noreferrer" target="_blank">http://reviews.llvm.org/D14237</a><br>
<br>
<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=251916&r1=251915&r2=251916&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=251916&r1=251915&r2=251916&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Tue Nov  3 08:22:51 2015<br>
@@ -28,16 +28,28 @@<br>
 #include "tsan_mman.h"<br>
 #include "tsan_fd.h"<br>
<br>
+#if SANITIZER_POSIX<br>
+#include "sanitizer_common/sanitizer_posix.h"<br>
+#endif<br>
+<br>
 using namespace __tsan;  // NOLINT<br>
<br>
-#if SANITIZER_FREEBSD<br>
+#if SANITIZER_FREEBSD || SANITIZER_MAC<br>
 #define __errno_location __error<br>
-#define __libc_realloc __realloc<br>
-#define __libc_calloc __calloc<br>
 #define stdout __stdoutp<br>
 #define stderr __stderrp<br>
 #endif<br>
<br>
+#if SANITIZER_FREEBSD<br>
+#define __libc_realloc __realloc<br>
+#define __libc_calloc __calloc<br>
+#elif SANITIZER_MAC<br>
+#define __libc_malloc REAL(malloc)<br>
+#define __libc_realloc REAL(realloc)<br>
+#define __libc_calloc REAL(calloc)<br>
+#define __libc_free REAL(free)<br>
+#endif<br>
+<br>
 #if SANITIZER_LINUX || SANITIZER_FREEBSD<br>
 #define PTHREAD_CREATE_DETACHED 1<br>
 #elif SANITIZER_MAC<br>
@@ -80,7 +92,6 @@ extern "C" int pthread_attr_setstacksize<br>
 extern "C" int pthread_key_create(unsigned *key, void (*destructor)(void* v));<br>
 extern "C" int pthread_setspecific(unsigned key, const void *v);<br>
 DECLARE_REAL(int, pthread_mutexattr_gettype, void *, void *)<br>
-extern "C" int pthread_yield();<br>
 extern "C" int pthread_sigmask(int how, const __sanitizer_sigset_t *set,<br>
                                __sanitizer_sigset_t *oldset);<br>
 // REAL(sigfillset) defined in common interceptors.<br>
@@ -323,6 +334,79 @@ TSAN_INTERCEPTOR(int, nanosleep, void *r<br>
   return res;<br>
 }<br>
<br>
+TSAN_INTERCEPTOR(void*, malloc, uptr size) {<br>
+  if (cur_thread()->in_symbolizer)<br>
+    return __libc_malloc(size);<br>
+  void *p = 0;<br>
+  {<br>
+    SCOPED_INTERCEPTOR_RAW(malloc, size);<br>
+    p = user_alloc(thr, pc, size);<br>
+  }<br>
+  invoke_malloc_hook(p, size);<br>
+  return p;<br>
+}<br>
+<br>
+#if !SANITIZER_MAC<br>
+TSAN_INTERCEPTOR(void*, __libc_memalign, uptr align, uptr sz) {<br>
+  SCOPED_TSAN_INTERCEPTOR(__libc_memalign, align, sz);<br>
+  return user_alloc(thr, pc, sz, align);<br>
+}<br>
+#endif<br>
+<br>
+TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {<br>
+  if (cur_thread()->in_symbolizer)<br>
+    return __libc_calloc(size, n);<br>
+  void *p = 0;<br>
+  {<br>
+    SCOPED_INTERCEPTOR_RAW(calloc, size, n);<br>
+    p = user_calloc(thr, pc, size, n);<br>
+  }<br>
+  invoke_malloc_hook(p, n * size);<br>
+  return p;<br>
+}<br>
+<br>
+TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {<br>
+  if (cur_thread()->in_symbolizer)<br>
+    return __libc_realloc(p, size);<br>
+  if (p)<br>
+    invoke_free_hook(p);<br>
+  {<br>
+    SCOPED_INTERCEPTOR_RAW(realloc, p, size);<br>
+    p = user_realloc(thr, pc, p, size);<br>
+  }<br>
+  invoke_malloc_hook(p, size);<br>
+  return p;<br>
+}<br>
+<br>
+TSAN_INTERCEPTOR(void, free, void *p) {<br>
+  if (p == 0)<br>
+    return;<br>
+  if (cur_thread()->in_symbolizer)<br>
+    return __libc_free(p);<br>
+  invoke_free_hook(p);<br>
+  SCOPED_INTERCEPTOR_RAW(free, p);<br>
+  user_free(thr, pc, p);<br>
+}<br>
+<br>
+#if !SANITIZER_MAC<br>
+TSAN_INTERCEPTOR(void, cfree, void *p) {<br>
+  if (p == 0)<br>
+    return;<br>
+  if (cur_thread()->in_symbolizer)<br>
+    return __libc_free(p);<br>
+  invoke_free_hook(p);<br>
+  SCOPED_INTERCEPTOR_RAW(cfree, p);<br>
+  user_free(thr, pc, p);<br>
+}<br>
+#endif<br>
+<br>
+#if !SANITIZER_MAC<br>
+TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) {<br>
+  SCOPED_INTERCEPTOR_RAW(malloc_usable_size, p);<br>
+  return user_alloc_usable_size(p);<br>
+}<br>
+#endif<br>
+<br>
 // The sole reason tsan wraps atexit callbacks is to establish synchronization<br>
 // between callback setup and callback execution.<br>
 struct AtExitCtx {<br>
@@ -381,6 +465,7 @@ static void on_exit_wrapper(int status,<br>
   __libc_free(ctx);<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, on_exit, void(*f)(int, void*), void *arg) {<br>
   if (cur_thread()->in_symbolizer)<br>
     return 0;<br>
@@ -396,6 +481,7 @@ TSAN_INTERCEPTOR(int, on_exit, void(*f)(<br>
   ThreadIgnoreEnd(thr, pc);<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 // Cleanup old bufs.<br>
 static void JmpBufGarbageCollect(ThreadState *thr, uptr sp) {<br>
@@ -519,73 +605,6 @@ TSAN_INTERCEPTOR(void, siglongjmp, uptr<br>
   REAL(siglongjmp)(env, val);<br>
 }<br>
<br>
-TSAN_INTERCEPTOR(void*, malloc, uptr size) {<br>
-  if (cur_thread()->in_symbolizer)<br>
-    return __libc_malloc(size);<br>
-  void *p = 0;<br>
-  {<br>
-    SCOPED_INTERCEPTOR_RAW(malloc, size);<br>
-    p = user_alloc(thr, pc, size);<br>
-  }<br>
-  invoke_malloc_hook(p, size);<br>
-  return p;<br>
-}<br>
-<br>
-TSAN_INTERCEPTOR(void*, __libc_memalign, uptr align, uptr sz) {<br>
-  SCOPED_TSAN_INTERCEPTOR(__libc_memalign, align, sz);<br>
-  return user_alloc(thr, pc, sz, align);<br>
-}<br>
-<br>
-TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {<br>
-  if (cur_thread()->in_symbolizer)<br>
-    return __libc_calloc(size, n);<br>
-  void *p = 0;<br>
-  {<br>
-    SCOPED_INTERCEPTOR_RAW(calloc, size, n);<br>
-    p = user_calloc(thr, pc, size, n);<br>
-  }<br>
-  invoke_malloc_hook(p, n * size);<br>
-  return p;<br>
-}<br>
-<br>
-TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {<br>
-  if (cur_thread()->in_symbolizer)<br>
-    return __libc_realloc(p, size);<br>
-  if (p)<br>
-    invoke_free_hook(p);<br>
-  {<br>
-    SCOPED_INTERCEPTOR_RAW(realloc, p, size);<br>
-    p = user_realloc(thr, pc, p, size);<br>
-  }<br>
-  invoke_malloc_hook(p, size);<br>
-  return p;<br>
-}<br>
-<br>
-TSAN_INTERCEPTOR(void, free, void *p) {<br>
-  if (p == 0)<br>
-    return;<br>
-  if (cur_thread()->in_symbolizer)<br>
-    return __libc_free(p);<br>
-  invoke_free_hook(p);<br>
-  SCOPED_INTERCEPTOR_RAW(free, p);<br>
-  user_free(thr, pc, p);<br>
-}<br>
-<br>
-TSAN_INTERCEPTOR(void, cfree, void *p) {<br>
-  if (p == 0)<br>
-    return;<br>
-  if (cur_thread()->in_symbolizer)<br>
-    return __libc_free(p);<br>
-  invoke_free_hook(p);<br>
-  SCOPED_INTERCEPTOR_RAW(cfree, p);<br>
-  user_free(thr, pc, p);<br>
-}<br>
-<br>
-TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) {<br>
-  SCOPED_INTERCEPTOR_RAW(malloc_usable_size, p);<br>
-  return user_alloc_usable_size(p);<br>
-}<br>
-<br>
 TSAN_INTERCEPTOR(uptr, strlen, const char *s) {<br>
   SCOPED_TSAN_INTERCEPTOR(strlen, s);<br>
   uptr len = internal_strlen(s);<br>
@@ -628,6 +647,7 @@ TSAN_INTERCEPTOR(char*, strchr, char *s,<br>
   return res;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(char*, strchrnul, char *s, int c) {<br>
   SCOPED_TSAN_INTERCEPTOR(strchrnul, s, c);<br>
   char *res = REAL(strchrnul)(s, c);<br>
@@ -635,6 +655,7 @@ TSAN_INTERCEPTOR(char*, strchrnul, char<br>
   READ_STRING(thr, pc, s, len);<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(char*, strrchr, char *s, int c) {<br>
   SCOPED_TSAN_INTERCEPTOR(strrchr, s, c);<br>
@@ -692,7 +713,7 @@ TSAN_INTERCEPTOR(void*, mmap, void *addr<br>
   return res;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(void*, mmap64, void *addr, long_t sz, int prot,<br>
                            int flags, int fd, u64 off) {<br>
   SCOPED_TSAN_INTERCEPTOR(mmap64, addr, sz, prot, flags, fd, off);<br>
@@ -722,7 +743,7 @@ TSAN_INTERCEPTOR(int, munmap, void *addr<br>
   return res;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(void*, memalign, uptr align, uptr sz) {<br>
   SCOPED_INTERCEPTOR_RAW(memalign, align, sz);<br>
   return user_alloc(thr, pc, sz, align);<br>
@@ -732,17 +753,19 @@ TSAN_INTERCEPTOR(void*, memalign, uptr a<br>
 #define TSAN_MAYBE_INTERCEPT_MEMALIGN<br>
 #endif<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(void*, aligned_alloc, uptr align, uptr sz) {<br>
   SCOPED_INTERCEPTOR_RAW(memalign, align, sz);<br>
   return user_alloc(thr, pc, sz, align);<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(void*, valloc, uptr sz) {<br>
   SCOPED_INTERCEPTOR_RAW(valloc, sz);<br>
   return user_alloc(thr, pc, sz, GetPageSizeCached());<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) {<br>
   SCOPED_INTERCEPTOR_RAW(pvalloc, sz);<br>
   sz = RoundUp(sz, GetPageSizeCached());<br>
@@ -831,7 +854,7 @@ extern "C" void *__tsan_thread_start_fun<br>
     }<br>
     ThreadIgnoreEnd(thr, 0);<br>
     while ((tid = atomic_load(&p->tid, memory_order_acquire)) == 0)<br>
-      pthread_yield();<br>
+      internal_sched_yield();<br>
     ThreadStart(thr, tid, GetTid());<br>
     atomic_store(&p->tid, 0, memory_order_release);<br>
   }<br>
@@ -891,7 +914,7 @@ TSAN_INTERCEPTOR(int, pthread_create,<br>
     //    before the new thread got a chance to acquire from it in ThreadStart.<br>
     atomic_store(&p.tid, tid, memory_order_release);<br>
     while (atomic_load(&p.tid, memory_order_acquire) != 0)<br>
-      pthread_yield();<br>
+      internal_sched_yield();<br>
   }<br>
   if (attr == &myattr)<br>
     pthread_attr_destroy(&myattr);<br>
@@ -1094,6 +1117,7 @@ TSAN_INTERCEPTOR(int, pthread_mutex_tryl<br>
   return res;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, pthread_mutex_timedlock, void *m, void *abstime) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_timedlock, m, abstime);<br>
   int res = REAL(pthread_mutex_timedlock)(m, abstime);<br>
@@ -1102,7 +1126,9 @@ TSAN_INTERCEPTOR(int, pthread_mutex_time<br>
   }<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, pthread_spin_init, void *m, int pshared) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_spin_init, m, pshared);<br>
   int res = REAL(pthread_spin_init)(m, pshared);<br>
@@ -1145,6 +1171,7 @@ TSAN_INTERCEPTOR(int, pthread_spin_unloc<br>
   int res = REAL(pthread_spin_unlock)(m);<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(int, pthread_rwlock_init, void *m, void *a) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_init, m, a);<br>
@@ -1182,6 +1209,7 @@ TSAN_INTERCEPTOR(int, pthread_rwlock_try<br>
   return res;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, pthread_rwlock_timedrdlock, void *m, void *abstime) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_timedrdlock, m, abstime);<br>
   int res = REAL(pthread_rwlock_timedrdlock)(m, abstime);<br>
@@ -1190,6 +1218,7 @@ TSAN_INTERCEPTOR(int, pthread_rwlock_tim<br>
   }<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(int, pthread_rwlock_wrlock, void *m) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_wrlock, m);<br>
@@ -1209,6 +1238,7 @@ TSAN_INTERCEPTOR(int, pthread_rwlock_try<br>
   return res;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, pthread_rwlock_timedwrlock, void *m, void *abstime) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_timedwrlock, m, abstime);<br>
   int res = REAL(pthread_rwlock_timedwrlock)(m, abstime);<br>
@@ -1217,6 +1247,7 @@ TSAN_INTERCEPTOR(int, pthread_rwlock_tim<br>
   }<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(int, pthread_rwlock_unlock, void *m) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_unlock, m);<br>
@@ -1225,6 +1256,7 @@ TSAN_INTERCEPTOR(int, pthread_rwlock_unl<br>
   return res;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, pthread_barrier_init, void *b, void *a, unsigned count) {<br>
   SCOPED_TSAN_INTERCEPTOR(pthread_barrier_init, b, a, count);<br>
   MemoryWrite(thr, pc, (uptr)b, kSizeLog1);<br>
@@ -1250,6 +1282,7 @@ TSAN_INTERCEPTOR(int, pthread_barrier_wa<br>
   }<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(int, pthread_once, void *o, void (*f)()) {<br>
   SCOPED_INTERCEPTOR_RAW(pthread_once, o, f);<br>
@@ -1265,7 +1298,7 @@ TSAN_INTERCEPTOR(int, pthread_once, void<br>
     atomic_store(a, 2, memory_order_release);<br>
   } else {<br>
     while (v != 2) {<br>
-      pthread_yield();<br>
+      internal_sched_yield();<br>
       v = atomic_load(a, memory_order_acquire);<br>
     }<br>
     if (!thr->in_ignored_lib)<br>
@@ -1274,7 +1307,7 @@ TSAN_INTERCEPTOR(int, pthread_once, void<br>
   return 0;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __xstat, int version, const char *path, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__xstat, version, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
@@ -1286,7 +1319,7 @@ TSAN_INTERCEPTOR(int, __xstat, int versi<br>
 #endif<br>
<br>
 TSAN_INTERCEPTOR(int, stat, const char *path, void *buf) {<br>
-#if SANITIZER_FREEBSD<br>
+#if SANITIZER_FREEBSD || SANITIZER_MAC<br>
   SCOPED_TSAN_INTERCEPTOR(stat, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
   return REAL(stat)(path, buf);<br>
@@ -1297,7 +1330,7 @@ TSAN_INTERCEPTOR(int, stat, const char *<br>
 #endif<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __xstat64, int version, const char *path, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__xstat64, version, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
@@ -1308,7 +1341,7 @@ TSAN_INTERCEPTOR(int, __xstat64, int ver<br>
 #define TSAN_MAYBE_INTERCEPT___XSTAT64<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, stat64, const char *path, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__xstat64, 0, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
@@ -1319,7 +1352,7 @@ TSAN_INTERCEPTOR(int, stat64, const char<br>
 #define TSAN_MAYBE_INTERCEPT_STAT64<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __lxstat, int version, const char *path, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__lxstat, version, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
@@ -1331,7 +1364,7 @@ TSAN_INTERCEPTOR(int, __lxstat, int vers<br>
 #endif<br>
<br>
 TSAN_INTERCEPTOR(int, lstat, const char *path, void *buf) {<br>
-#if SANITIZER_FREEBSD<br>
+#if SANITIZER_FREEBSD || SANITIZER_MAC<br>
   SCOPED_TSAN_INTERCEPTOR(lstat, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
   return REAL(lstat)(path, buf);<br>
@@ -1342,7 +1375,7 @@ TSAN_INTERCEPTOR(int, lstat, const char<br>
 #endif<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __lxstat64, int version, const char *path, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__lxstat64, version, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
@@ -1353,7 +1386,7 @@ TSAN_INTERCEPTOR(int, __lxstat64, int ve<br>
 #define TSAN_MAYBE_INTERCEPT___LXSTAT64<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, lstat64, const char *path, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__lxstat64, 0, path, buf);<br>
   READ_STRING(thr, pc, path, 0);<br>
@@ -1364,7 +1397,7 @@ TSAN_INTERCEPTOR(int, lstat64, const cha<br>
 #define TSAN_MAYBE_INTERCEPT_LSTAT64<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __fxstat, int version, int fd, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__fxstat, version, fd, buf);<br>
   if (fd > 0)<br>
@@ -1377,7 +1410,7 @@ TSAN_INTERCEPTOR(int, __fxstat, int vers<br>
 #endif<br>
<br>
 TSAN_INTERCEPTOR(int, fstat, int fd, void *buf) {<br>
-#if SANITIZER_FREEBSD<br>
+#if SANITIZER_FREEBSD || SANITIZER_MAC<br>
   SCOPED_TSAN_INTERCEPTOR(fstat, fd, buf);<br>
   if (fd > 0)<br>
     FdAccess(thr, pc, fd);<br>
@@ -1390,7 +1423,7 @@ TSAN_INTERCEPTOR(int, fstat, int fd, voi<br>
 #endif<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __fxstat64, int version, int fd, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__fxstat64, version, fd, buf);<br>
   if (fd > 0)<br>
@@ -1402,7 +1435,7 @@ TSAN_INTERCEPTOR(int, __fxstat64, int ve<br>
 #define TSAN_MAYBE_INTERCEPT___FXSTAT64<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, fstat64, int fd, void *buf) {<br>
   SCOPED_TSAN_INTERCEPTOR(__fxstat64, 0, fd, buf);<br>
   if (fd > 0)<br>
@@ -1423,7 +1456,7 @@ TSAN_INTERCEPTOR(int, open, const char *<br>
   return fd;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, open64, const char *name, int flags, int mode) {<br>
   SCOPED_TSAN_INTERCEPTOR(open64, name, flags, mode);<br>
   READ_STRING(thr, pc, name, 0);<br>
@@ -1446,7 +1479,7 @@ TSAN_INTERCEPTOR(int, creat, const char<br>
   return fd;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, creat64, const char *name, int mode) {<br>
   SCOPED_TSAN_INTERCEPTOR(creat64, name, mode);<br>
   READ_STRING(thr, pc, name, 0);<br>
@@ -1476,6 +1509,7 @@ TSAN_INTERCEPTOR(int, dup2, int oldfd, i<br>
   return newfd2;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, dup3, int oldfd, int newfd, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(dup3, oldfd, newfd, flags);<br>
   int newfd2 = REAL(dup3)(oldfd, newfd, flags);<br>
@@ -1483,8 +1517,9 @@ TSAN_INTERCEPTOR(int, dup3, int oldfd, i<br>
     FdDup(thr, pc, oldfd, newfd2, false);<br>
   return newfd2;<br>
 }<br>
+#endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, eventfd, unsigned initval, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(eventfd, initval, flags);<br>
   int fd = REAL(eventfd)(initval, flags);<br>
@@ -1497,7 +1532,7 @@ TSAN_INTERCEPTOR(int, eventfd, unsigned<br>
 #define TSAN_MAYBE_INTERCEPT_EVENTFD<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, signalfd, int fd, void *mask, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(signalfd, fd, mask, flags);<br>
   if (fd >= 0)<br>
@@ -1512,7 +1547,7 @@ TSAN_INTERCEPTOR(int, signalfd, int fd,<br>
 #define TSAN_MAYBE_INTERCEPT_SIGNALFD<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, inotify_init, int fake) {<br>
   SCOPED_TSAN_INTERCEPTOR(inotify_init, fake);<br>
   int fd = REAL(inotify_init)(fake);<br>
@@ -1525,7 +1560,7 @@ TSAN_INTERCEPTOR(int, inotify_init, int<br>
 #define TSAN_MAYBE_INTERCEPT_INOTIFY_INIT<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, inotify_init1, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(inotify_init1, flags);<br>
   int fd = REAL(inotify_init1)(flags);<br>
@@ -1579,7 +1614,7 @@ TSAN_INTERCEPTOR(int, listen, int fd, in<br>
   return res;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, epoll_create, int size) {<br>
   SCOPED_TSAN_INTERCEPTOR(epoll_create, size);<br>
   int fd = REAL(epoll_create)(size);<br>
@@ -1592,7 +1627,7 @@ TSAN_INTERCEPTOR(int, epoll_create, int<br>
 #define TSAN_MAYBE_INTERCEPT_EPOLL_CREATE<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, epoll_create1, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(epoll_create1, flags);<br>
   int fd = REAL(epoll_create1)(flags);<br>
@@ -1612,7 +1647,7 @@ TSAN_INTERCEPTOR(int, close, int fd) {<br>
   return REAL(close)(fd);<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, __close, int fd) {<br>
   SCOPED_TSAN_INTERCEPTOR(__close, fd);<br>
   if (fd >= 0)<br>
@@ -1625,7 +1660,7 @@ TSAN_INTERCEPTOR(int, __close, int fd) {<br>
 #endif<br>
<br>
 // glibc guts<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(void, __res_iclose, void *state, bool free_addr) {<br>
   SCOPED_TSAN_INTERCEPTOR(__res_iclose, state, free_addr);<br>
   int fds[64];<br>
@@ -1649,6 +1684,7 @@ TSAN_INTERCEPTOR(int, pipe, int *pipefd)<br>
   return res;<br>
 }<br>
<br>
+#if !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, pipe2, int *pipefd, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(pipe2, pipefd, flags);<br>
   int res = REAL(pipe2)(pipefd, flags);<br>
@@ -1656,6 +1692,7 @@ TSAN_INTERCEPTOR(int, pipe2, int *pipefd<br>
     FdPipeCreate(thr, pc, pipefd[0], pipefd[1]);<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 TSAN_INTERCEPTOR(long_t, send, int fd, void *buf, long_t len, int flags) {<br>
   SCOPED_TSAN_INTERCEPTOR(send, fd, buf, len, flags);<br>
@@ -1706,7 +1743,7 @@ TSAN_INTERCEPTOR(void*, tmpfile, int fak<br>
   return res;<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(void*, tmpfile64, int fake) {<br>
   SCOPED_TSAN_INTERCEPTOR(tmpfile64, fake);<br>
   void *res = REAL(tmpfile64)(fake);<br>
@@ -1773,7 +1810,7 @@ TSAN_INTERCEPTOR(int, closedir, void *di<br>
   return REAL(closedir)(dirp);<br>
 }<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, epoll_ctl, int epfd, int op, int fd, void *ev) {<br>
   SCOPED_TSAN_INTERCEPTOR(epoll_ctl, epfd, op, fd, ev);<br>
   if (epfd >= 0)<br>
@@ -1790,7 +1827,7 @@ TSAN_INTERCEPTOR(int, epoll_ctl, int epf<br>
 #define TSAN_MAYBE_INTERCEPT_EPOLL_CTL<br>
 #endif<br>
<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
 TSAN_INTERCEPTOR(int, epoll_wait, int epfd, void *ev, int cnt, int timeout) {<br>
   SCOPED_TSAN_INTERCEPTOR(epoll_wait, epfd, ev, cnt, timeout);<br>
   if (epfd >= 0)<br>
@@ -2089,6 +2126,7 @@ TSAN_INTERCEPTOR(int, vfork, int fake) {<br>
   return WRAP(fork)(fake);<br>
 }<br>
<br>
+#if SANITIZER_LINUX<br>
 typedef int (*dl_iterate_phdr_cb_t)(__sanitizer_dl_phdr_info *info, SIZE_T size,<br>
                                     void *data);<br>
 struct dl_iterate_phdr_data {<br>
@@ -2132,6 +2170,7 @@ TSAN_INTERCEPTOR(int, dl_iterate_phdr, d<br>
   int res = REAL(dl_iterate_phdr)(dl_iterate_phdr_cb, &cbdata);<br>
   return res;<br>
 }<br>
+#endif<br>
<br>
 static int OnExit(ThreadState *thr) {<br>
   int status = Finalize(thr);<br>
@@ -2266,9 +2305,11 @@ static void HandleRecvmsg(ThreadState *t<br>
   MutexRepair(((TsanInterceptorContext *)ctx)->thr, \<br>
             ((TsanInterceptorContext *)ctx)->pc, (uptr)m)<br>
<br>
+#if !SANITIZER_MAC<br>
 #define COMMON_INTERCEPTOR_HANDLE_RECVMSG(ctx, msg) \<br>
   HandleRecvmsg(((TsanInterceptorContext *)ctx)->thr, \<br>
       ((TsanInterceptorContext *)ctx)->pc, msg)<br>
+#endif<br>
<br>
 #define COMMON_INTERCEPTOR_GET_TLS_RANGE(begin, end)                           \<br>
   if (TsanThread *t = GetCurrentThread()) {                                    \<br>
@@ -2409,18 +2450,21 @@ static void unreachable() {<br>
 }<br>
<br>
 void InitializeInterceptors() {<br>
+#if !SANITIZER_MAC<br>
   // We need to setup it early, because functions like dlsym() can call it.<br>
   REAL(memset) = internal_memset;<br>
   REAL(memcpy) = internal_memcpy;<br>
+#endif<br>
<br>
   // Instruct libc malloc to consume less memory.<br>
-#if !SANITIZER_FREEBSD<br>
+#if !SANITIZER_FREEBSD && !SANITIZER_MAC<br>
   mallopt(1, 0);  // M_MXFAST<br>
   mallopt(-3, 32*1024);  // M_MMAP_THRESHOLD<br>
 #endif<br>
<br>
   InitializeCommonInterceptors();<br>
<br>
+#if !SANITIZER_MAC<br>
   // We can not use TSAN_INTERCEPT to get setjmp addr,<br>
   // because it does &setjmp and setjmp is not present in some versions of libc.<br>
   using __interception::GetRealFunctionAddress;<br>
@@ -2428,6 +2472,7 @@ void InitializeInterceptors() {<br>
   GetRealFunctionAddress("_setjmp", (uptr*)&REAL(_setjmp), 0, 0);<br>
   GetRealFunctionAddress("sigsetjmp", (uptr*)&REAL(sigsetjmp), 0, 0);<br>
   GetRealFunctionAddress("__sigsetjmp", (uptr*)&REAL(__sigsetjmp), 0, 0);<br>
+#endif<br>
<br>
   TSAN_INTERCEPT(longjmp);<br>
   TSAN_INTERCEPT(siglongjmp);<br>
@@ -2567,9 +2612,12 @@ void InitializeInterceptors() {<br>
   TSAN_INTERCEPT(__cxa_atexit);<br>
   TSAN_INTERCEPT(_exit);<br>
<br>
+#if !SANITIZER_MAC<br>
   // Need to setup it, because interceptors check that the function is resolved.<br>
   // But atexit is emitted directly into the module, so can't be resolved.<br>
   REAL(atexit) = (int(*)(void(*)()))unreachable;<br>
+#endif<br>
+<br>
   if (REAL(__cxa_atexit)(&finalize, 0, 0)) {<br>
     Printf("ThreadSanitizer: failed to setup atexit callback\n");<br>
     Die();<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>