Home | History | Annotate | Download | only in rtl
      1 //===-- tsan_interceptors_linux.cc ----------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file is a part of ThreadSanitizer (TSan), a race detector.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "interception/interception.h"
     15 #include "sanitizer_common/sanitizer_atomic.h"
     16 #include "sanitizer_common/sanitizer_libc.h"
     17 #include "sanitizer_common/sanitizer_placement_new.h"
     18 #include "tsan_rtl.h"
     19 #include "tsan_interface.h"
     20 #include "tsan_platform.h"
     21 #include "tsan_mman.h"
     22 
     23 using namespace __tsan;  // NOLINT
     24 
     25 const int kSigCount = 128;
     26 
     27 struct my_siginfo_t {
     28   int opaque[128];
     29 };
     30 
     31 struct sigset_t {
     32   u64 val[1024 / 8 / sizeof(u64)];
     33 };
     34 
     35 struct ucontext_t {
     36   uptr opaque[117];
     37 };
     38 
     39 extern "C" int pthread_attr_init(void *attr);
     40 extern "C" int pthread_attr_destroy(void *attr);
     41 extern "C" int pthread_attr_getdetachstate(void *attr, int *v);
     42 extern "C" int pthread_attr_setstacksize(void *attr, uptr stacksize);
     43 extern "C" int pthread_attr_getstacksize(void *attr, uptr *stacksize);
     44 extern "C" int pthread_key_create(unsigned *key, void (*destructor)(void* v));
     45 extern "C" int pthread_setspecific(unsigned key, const void *v);
     46 extern "C" int pthread_mutexattr_gettype(void *a, int *type);
     47 extern "C" int pthread_yield();
     48 extern "C" int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
     49 extern "C" int sigfillset(sigset_t *set);
     50 extern "C" void *pthread_self();
     51 extern "C" void _exit(int status);
     52 extern "C" int __cxa_atexit(void (*func)(void *arg), void *arg, void *dso);
     53 extern "C" int *__errno_location();
     54 const int PTHREAD_MUTEX_RECURSIVE = 1;
     55 const int PTHREAD_MUTEX_RECURSIVE_NP = 1;
     56 const int kPthreadAttrSize = 56;
     57 const int EINVAL = 22;
     58 const int EBUSY = 16;
     59 const int EPOLL_CTL_ADD = 1;
     60 const int SIGILL = 4;
     61 const int SIGABRT = 6;
     62 const int SIGFPE = 8;
     63 const int SIGSEGV = 11;
     64 const int SIGPIPE = 13;
     65 const int SIGBUS = 7;
     66 void *const MAP_FAILED = (void*)-1;
     67 const int PTHREAD_BARRIER_SERIAL_THREAD = -1;
     68 const int MAP_FIXED = 0x10;
     69 typedef long long_t;  // NOLINT
     70 
     71 typedef void (*sighandler_t)(int sig);
     72 
     73 #define errno (*__errno_location())
     74 
     75 union pthread_attr_t {
     76   char size[kPthreadAttrSize];
     77   void *align;
     78 };
     79 
     80 struct sigaction_t {
     81   union {
     82     sighandler_t sa_handler;
     83     void (*sa_sigaction)(int sig, my_siginfo_t *siginfo, void *uctx);
     84   };
     85   sigset_t sa_mask;
     86   int sa_flags;
     87   void (*sa_restorer)();
     88 };
     89 
     90 const sighandler_t SIG_DFL = (sighandler_t)0;
     91 const sighandler_t SIG_IGN = (sighandler_t)1;
     92 const sighandler_t SIG_ERR = (sighandler_t)-1;
     93 const int SA_SIGINFO = 4;
     94 const int SIG_SETMASK = 2;
     95 
     96 static sigaction_t sigactions[kSigCount];
     97 
     98 namespace __tsan {
     99 struct SignalDesc {
    100   bool armed;
    101   bool sigaction;
    102   my_siginfo_t siginfo;
    103   ucontext_t ctx;
    104 };
    105 
    106 struct SignalContext {
    107   int int_signal_send;
    108   int pending_signal_count;
    109   SignalDesc pending_signals[kSigCount];
    110 };
    111 }
    112 
    113 static SignalContext *SigCtx(ThreadState *thr) {
    114   SignalContext *ctx = (SignalContext*)thr->signal_ctx;
    115   if (ctx == 0 && thr->is_alive) {
    116     ScopedInRtl in_rtl;
    117     ctx = (SignalContext*)internal_alloc(
    118         MBlockSignal, sizeof(*ctx));
    119     MemoryResetRange(thr, 0, (uptr)ctx, sizeof(*ctx));
    120     internal_memset(ctx, 0, sizeof(*ctx));
    121     thr->signal_ctx = ctx;
    122   }
    123   return ctx;
    124 }
    125 
    126 static unsigned g_thread_finalize_key;
    127 
    128 static void process_pending_signals(ThreadState *thr);
    129 
    130 class ScopedInterceptor {
    131  public:
    132   ScopedInterceptor(ThreadState *thr, const char *fname, uptr pc)
    133       : thr_(thr)
    134       , in_rtl_(thr->in_rtl) {
    135     if (thr_->in_rtl == 0) {
    136       Initialize(thr);
    137       FuncEntry(thr, pc);
    138       thr_->in_rtl++;
    139       DPrintf("#%d: intercept %s()\n", thr_->tid, fname);
    140     } else {
    141       thr_->in_rtl++;
    142     }
    143   }
    144 
    145   ~ScopedInterceptor() {
    146     thr_->in_rtl--;
    147     if (thr_->in_rtl == 0) {
    148       FuncExit(thr_);
    149       process_pending_signals(thr_);
    150     }
    151     CHECK_EQ(in_rtl_, thr_->in_rtl);
    152   }
    153 
    154  private:
    155   ThreadState *const thr_;
    156   const int in_rtl_;
    157 };
    158 
    159 #define SCOPED_INTERCEPTOR_RAW(func, ...) \
    160     ThreadState *thr = cur_thread(); \
    161     StatInc(thr, StatInterceptor); \
    162     StatInc(thr, StatInt_##func); \
    163     ScopedInterceptor si(thr, #func, \
    164         (__sanitizer::uptr)__builtin_return_address(0)); \
    165     const uptr pc = (uptr)&func; \
    166     (void)pc; \
    167 /**/
    168 
    169 #define SCOPED_TSAN_INTERCEPTOR(func, ...) \
    170     SCOPED_INTERCEPTOR_RAW(func, __VA_ARGS__); \
    171     if (thr->in_rtl > 1) \
    172       return REAL(func)(__VA_ARGS__); \
    173 /**/
    174 
    175 #define SCOPED_INTERCEPTOR_LIBC(func, ...) \
    176     ThreadState *thr = cur_thread(); \
    177     StatInc(thr, StatInterceptor); \
    178     StatInc(thr, StatInt_##func); \
    179     ScopedInterceptor si(thr, #func, callpc); \
    180     const uptr pc = (uptr)&func; \
    181     (void)pc; \
    182     if (thr->in_rtl > 1) \
    183       return REAL(func)(__VA_ARGS__); \
    184 /**/
    185 
    186 #define TSAN_INTERCEPTOR(ret, func, ...) INTERCEPTOR(ret, func, __VA_ARGS__)
    187 #define TSAN_INTERCEPT(func) INTERCEPT_FUNCTION(func)
    188 
    189 // May be overriden by front-end.
    190 extern "C" void WEAK __tsan_malloc_hook(void *ptr, uptr size) {
    191   (void)ptr;
    192   (void)size;
    193 }
    194 
    195 extern "C" void WEAK __tsan_free_hook(void *ptr) {
    196   (void)ptr;
    197 }
    198 
    199 static void invoke_malloc_hook(void *ptr, uptr size) {
    200   Context *ctx = CTX();
    201   ThreadState *thr = cur_thread();
    202   if (ctx == 0 || !ctx->initialized || thr->in_rtl)
    203     return;
    204   __tsan_malloc_hook(ptr, size);
    205 }
    206 
    207 static void invoke_free_hook(void *ptr) {
    208   Context *ctx = CTX();
    209   ThreadState *thr = cur_thread();
    210   if (ctx == 0 || !ctx->initialized || thr->in_rtl)
    211     return;
    212   __tsan_free_hook(ptr);
    213 }
    214 
    215 TSAN_INTERCEPTOR(unsigned, sleep, unsigned sec) {
    216   SCOPED_TSAN_INTERCEPTOR(sleep, sec);
    217   unsigned res = sleep(sec);
    218   AfterSleep(thr, pc);
    219   return res;
    220 }
    221 
    222 TSAN_INTERCEPTOR(int, usleep, long_t usec) {
    223   SCOPED_TSAN_INTERCEPTOR(usleep, usec);
    224   int res = usleep(usec);
    225   AfterSleep(thr, pc);
    226   return res;
    227 }
    228 
    229 TSAN_INTERCEPTOR(int, nanosleep, void *req, void *rem) {
    230   SCOPED_TSAN_INTERCEPTOR(nanosleep, req, rem);
    231   int res = nanosleep(req, rem);
    232   AfterSleep(thr, pc);
    233   return res;
    234 }
    235 
    236 class AtExitContext {
    237  public:
    238   AtExitContext()
    239     : mtx_(MutexTypeAtExit, StatMtxAtExit)
    240     , pos_() {
    241   }
    242 
    243   typedef void(*atexit_t)();
    244 
    245   int atexit(ThreadState *thr, uptr pc, atexit_t f) {
    246     Lock l(&mtx_);
    247     if (pos_ == kMaxAtExit)
    248       return 1;
    249     Release(thr, pc, (uptr)this);
    250     stack_[pos_] = f;
    251     pos_++;
    252     return 0;
    253   }
    254 
    255   void exit(ThreadState *thr, uptr pc) {
    256     CHECK_EQ(thr->in_rtl, 0);
    257     for (;;) {
    258       atexit_t f = 0;
    259       {
    260         Lock l(&mtx_);
    261         if (pos_) {
    262           pos_--;
    263           f = stack_[pos_];
    264           ScopedInRtl in_rtl;
    265           Acquire(thr, pc, (uptr)this);
    266         }
    267       }
    268       if (f == 0)
    269         break;
    270       DPrintf("#%d: executing atexit func %p\n", thr->tid, f);
    271       CHECK_EQ(thr->in_rtl, 0);
    272       f();
    273     }
    274   }
    275 
    276  private:
    277   static const int kMaxAtExit = 128;
    278   Mutex mtx_;
    279   atexit_t stack_[kMaxAtExit];
    280   int pos_;
    281 };
    282 
    283 static AtExitContext *atexit_ctx;
    284 
    285 static void finalize(void *arg) {
    286   ThreadState * thr = cur_thread();
    287   uptr pc = 0;
    288   atexit_ctx->exit(thr, pc);
    289   {
    290     ScopedInRtl in_rtl;
    291     DestroyAndFree(atexit_ctx);
    292     REAL(usleep)(flags()->atexit_sleep_ms * 1000);
    293   }
    294   int status = Finalize(cur_thread());
    295   if (status)
    296     _exit(status);
    297 }
    298 
    299 TSAN_INTERCEPTOR(int, atexit, void (*f)()) {
    300   SCOPED_TSAN_INTERCEPTOR(atexit, f);
    301   return atexit_ctx->atexit(thr, pc, f);
    302   return 0;
    303 }
    304 
    305 TSAN_INTERCEPTOR(void, longjmp, void *env, int val) {
    306   SCOPED_TSAN_INTERCEPTOR(longjmp, env, val);
    307   TsanPrintf("ThreadSanitizer: longjmp() is not supported\n");
    308   Die();
    309 }
    310 
    311 TSAN_INTERCEPTOR(void, siglongjmp, void *env, int val) {
    312   SCOPED_TSAN_INTERCEPTOR(siglongjmp, env, val);
    313   TsanPrintf("ThreadSanitizer: siglongjmp() is not supported\n");
    314   Die();
    315 }
    316 
    317 static uptr fd2addr(int fd) {
    318   (void)fd;
    319   static u64 addr;
    320   return (uptr)&addr;
    321 }
    322 
    323 static uptr epollfd2addr(int fd) {
    324   (void)fd;
    325   static u64 addr;
    326   return (uptr)&addr;
    327 }
    328 
    329 static uptr file2addr(char *path) {
    330   (void)path;
    331   static u64 addr;
    332   return (uptr)&addr;
    333 }
    334 
    335 static uptr dir2addr(char *path) {
    336   (void)path;
    337   static u64 addr;
    338   return (uptr)&addr;
    339 }
    340 
    341 TSAN_INTERCEPTOR(void*, malloc, uptr size) {
    342   void *p = 0;
    343   {
    344     SCOPED_INTERCEPTOR_RAW(malloc, size);
    345     p = user_alloc(thr, pc, size);
    346   }
    347   invoke_malloc_hook(p, size);
    348   return p;
    349 }
    350 
    351 TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {
    352   void *p = 0;
    353   {
    354     SCOPED_INTERCEPTOR_RAW(calloc, size, n);
    355     p = user_alloc(thr, pc, n * size);
    356     internal_memset(p, 0, n * size);
    357   }
    358   invoke_malloc_hook(p, n * size);
    359   return p;
    360 }
    361 
    362 TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {
    363   if (p)
    364     invoke_free_hook(p);
    365   {
    366     SCOPED_INTERCEPTOR_RAW(realloc, p, size);
    367     p = user_realloc(thr, pc, p, size);
    368   }
    369   invoke_malloc_hook(p, size);
    370   return p;
    371 }
    372 
    373 TSAN_INTERCEPTOR(void, free, void *p) {
    374   if (p == 0)
    375     return;
    376   invoke_free_hook(p);
    377   SCOPED_INTERCEPTOR_RAW(free, p);
    378   user_free(thr, pc, p);
    379 }
    380 
    381 TSAN_INTERCEPTOR(void, cfree, void *p) {
    382   if (p == 0)
    383     return;
    384   invoke_free_hook(p);
    385   SCOPED_INTERCEPTOR_RAW(cfree, p);
    386   user_free(thr, pc, p);
    387 }
    388 
    389 TSAN_INTERCEPTOR(uptr, strlen, const char *s) {
    390   SCOPED_TSAN_INTERCEPTOR(strlen, s);
    391   uptr len = internal_strlen(s);
    392   MemoryAccessRange(thr, pc, (uptr)s, len + 1, false);
    393   return len;
    394 }
    395 
    396 TSAN_INTERCEPTOR(void*, memset, void *dst, int v, uptr size) {
    397   SCOPED_TSAN_INTERCEPTOR(memset, dst, v, size);
    398   MemoryAccessRange(thr, pc, (uptr)dst, size, true);
    399   return internal_memset(dst, v, size);
    400 }
    401 
    402 TSAN_INTERCEPTOR(void*, memcpy, void *dst, const void *src, uptr size) {
    403   SCOPED_TSAN_INTERCEPTOR(memcpy, dst, src, size);
    404   MemoryAccessRange(thr, pc, (uptr)dst, size, true);
    405   MemoryAccessRange(thr, pc, (uptr)src, size, false);
    406   return internal_memcpy(dst, src, size);
    407 }
    408 
    409 TSAN_INTERCEPTOR(int, memcmp, const void *s1, const void *s2, uptr n) {
    410   SCOPED_TSAN_INTERCEPTOR(memcmp, s1, s2, n);
    411   int res = 0;
    412   uptr len = 0;
    413   for (; len < n; len++) {
    414     if ((res = ((unsigned char*)s1)[len] - ((unsigned char*)s2)[len]))
    415       break;
    416   }
    417   MemoryAccessRange(thr, pc, (uptr)s1, len < n ? len + 1 : n, false);
    418   MemoryAccessRange(thr, pc, (uptr)s2, len < n ? len + 1 : n, false);
    419   return res;
    420 }
    421 
    422 TSAN_INTERCEPTOR(int, strcmp, const char *s1, const char *s2) {
    423   SCOPED_TSAN_INTERCEPTOR(strcmp, s1, s2);
    424   uptr len = 0;
    425   for (; s1[len] && s2[len]; len++) {
    426     if (s1[len] != s2[len])
    427       break;
    428   }
    429   MemoryAccessRange(thr, pc, (uptr)s1, len + 1, false);
    430   MemoryAccessRange(thr, pc, (uptr)s2, len + 1, false);
    431   return s1[len] - s2[len];
    432 }
    433 
    434 TSAN_INTERCEPTOR(int, strncmp, const char *s1, const char *s2, uptr n) {
    435   SCOPED_TSAN_INTERCEPTOR(strncmp, s1, s2, n);
    436   uptr len = 0;
    437   for (; len < n && s1[len] && s2[len]; len++) {
    438     if (s1[len] != s2[len])
    439       break;
    440   }
    441   MemoryAccessRange(thr, pc, (uptr)s1, len < n ? len + 1 : n, false);
    442   MemoryAccessRange(thr, pc, (uptr)s2, len < n ? len + 1 : n, false);
    443   return len == n ? 0 : s1[len] - s2[len];
    444 }
    445 
    446 TSAN_INTERCEPTOR(void*, memchr, void *s, int c, uptr n) {
    447   SCOPED_TSAN_INTERCEPTOR(memchr, s, c, n);
    448   void *res = REAL(memchr)(s, c, n);
    449   uptr len = res ? (char*)res - (char*)s + 1 : n;
    450   MemoryAccessRange(thr, pc, (uptr)s, len, false);
    451   return res;
    452 }
    453 
    454 TSAN_INTERCEPTOR(void*, memrchr, char *s, int c, uptr n) {
    455   SCOPED_TSAN_INTERCEPTOR(memrchr, s, c, n);
    456   MemoryAccessRange(thr, pc, (uptr)s, n, false);
    457   return REAL(memrchr)(s, c, n);
    458 }
    459 
    460 TSAN_INTERCEPTOR(void*, memmove, void *dst, void *src, uptr n) {
    461   SCOPED_TSAN_INTERCEPTOR(memmove, dst, src, n);
    462   MemoryAccessRange(thr, pc, (uptr)dst, n, true);
    463   MemoryAccessRange(thr, pc, (uptr)src, n, false);
    464   return REAL(memmove)(dst, src, n);
    465 }
    466 
    467 TSAN_INTERCEPTOR(char*, strchr, char *s, int c) {
    468   SCOPED_TSAN_INTERCEPTOR(strchr, s, c);
    469   char *res = REAL(strchr)(s, c);
    470   uptr len = res ? (char*)res - (char*)s + 1 : internal_strlen(s) + 1;
    471   MemoryAccessRange(thr, pc, (uptr)s, len, false);
    472   return res;
    473 }
    474 
    475 TSAN_INTERCEPTOR(char*, strchrnul, char *s, int c) {
    476   SCOPED_TSAN_INTERCEPTOR(strchrnul, s, c);
    477   char *res = REAL(strchrnul)(s, c);
    478   uptr len = (char*)res - (char*)s + 1;
    479   MemoryAccessRange(thr, pc, (uptr)s, len, false);
    480   return res;
    481 }
    482 
    483 TSAN_INTERCEPTOR(char*, strrchr, char *s, int c) {
    484   SCOPED_TSAN_INTERCEPTOR(strrchr, s, c);
    485   MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s) + 1, false);
    486   return REAL(strrchr)(s, c);
    487 }
    488 
    489 TSAN_INTERCEPTOR(char*, strcpy, char *dst, const char *src) {  // NOLINT
    490   SCOPED_TSAN_INTERCEPTOR(strcpy, dst, src);  // NOLINT
    491   uptr srclen = internal_strlen(src);
    492   MemoryAccessRange(thr, pc, (uptr)dst, srclen + 1, true);
    493   MemoryAccessRange(thr, pc, (uptr)src, srclen + 1, false);
    494   return REAL(strcpy)(dst, src);  // NOLINT
    495 }
    496 
    497 TSAN_INTERCEPTOR(char*, strncpy, char *dst, char *src, uptr n) {
    498   SCOPED_TSAN_INTERCEPTOR(strncpy, dst, src, n);
    499   uptr srclen = internal_strnlen(src, n);
    500   MemoryAccessRange(thr, pc, (uptr)dst, n, true);
    501   MemoryAccessRange(thr, pc, (uptr)src, min(srclen + 1, n), false);
    502   return REAL(strncpy)(dst, src, n);
    503 }
    504 
    505 TSAN_INTERCEPTOR(const char*, strstr, const char *s1, const char *s2) {
    506   SCOPED_TSAN_INTERCEPTOR(strstr, s1, s2);
    507   const char *res = REAL(strstr)(s1, s2);
    508   uptr len1 = internal_strlen(s1);
    509   uptr len2 = internal_strlen(s2);
    510   MemoryAccessRange(thr, pc, (uptr)s1, len1 + 1, false);
    511   MemoryAccessRange(thr, pc, (uptr)s2, len2 + 1, false);
    512   return res;
    513 }
    514 
    515 static bool fix_mmap_addr(void **addr, long_t sz, int flags) {
    516   if (*addr) {
    517     if (!IsAppMem((uptr)*addr) || !IsAppMem((uptr)*addr + sz - 1)) {
    518       if (flags & MAP_FIXED) {
    519         errno = EINVAL;
    520         return false;
    521       } else {
    522         *addr = 0;
    523       }
    524     }
    525   }
    526   return true;
    527 }
    528 
    529 TSAN_INTERCEPTOR(void*, mmap, void *addr, long_t sz, int prot,
    530                          int flags, int fd, unsigned off) {
    531   SCOPED_TSAN_INTERCEPTOR(mmap, addr, sz, prot, flags, fd, off);
    532   if (!fix_mmap_addr(&addr, sz, flags))
    533     return MAP_FAILED;
    534   void *res = REAL(mmap)(addr, sz, prot, flags, fd, off);
    535   if (res != MAP_FAILED) {
    536     MemoryResetRange(thr, pc, (uptr)res, sz);
    537   }
    538   return res;
    539 }
    540 
    541 TSAN_INTERCEPTOR(void*, mmap64, void *addr, long_t sz, int prot,
    542                            int flags, int fd, u64 off) {
    543   SCOPED_TSAN_INTERCEPTOR(mmap64, addr, sz, prot, flags, fd, off);
    544   if (!fix_mmap_addr(&addr, sz, flags))
    545     return MAP_FAILED;
    546   void *res = REAL(mmap64)(addr, sz, prot, flags, fd, off);
    547   if (res != MAP_FAILED) {
    548     MemoryResetRange(thr, pc, (uptr)res, sz);
    549   }
    550   return res;
    551 }
    552 
    553 TSAN_INTERCEPTOR(int, munmap, void *addr, long_t sz) {
    554   SCOPED_TSAN_INTERCEPTOR(munmap, addr, sz);
    555   int res = REAL(munmap)(addr, sz);
    556   return res;
    557 }
    558 
    559 #ifdef __LP64__
    560 
    561 // void *operator new(size_t)
    562 TSAN_INTERCEPTOR(void*, _Znwm, uptr sz) {
    563   void *p = 0;
    564   {
    565     SCOPED_TSAN_INTERCEPTOR(_Znwm, sz);
    566     p = user_alloc(thr, pc, sz);
    567   }
    568   invoke_malloc_hook(p, sz);
    569   return p;
    570 }
    571 
    572 // void *operator new(size_t, nothrow_t)
    573 TSAN_INTERCEPTOR(void*, _ZnwmRKSt9nothrow_t, uptr sz) {
    574   void *p = 0;
    575   {
    576     SCOPED_TSAN_INTERCEPTOR(_ZnwmRKSt9nothrow_t, sz);
    577     p = user_alloc(thr, pc, sz);
    578   }
    579   invoke_malloc_hook(p, sz);
    580   return p;
    581 }
    582 
    583 // void *operator new[](size_t)
    584 TSAN_INTERCEPTOR(void*, _Znam, uptr sz) {
    585   void *p = 0;
    586   {
    587     SCOPED_TSAN_INTERCEPTOR(_Znam, sz);
    588     p = user_alloc(thr, pc, sz);
    589   }
    590   invoke_malloc_hook(p, sz);
    591   return p;
    592 }
    593 
    594 // void *operator new[](size_t, nothrow_t)
    595 TSAN_INTERCEPTOR(void*, _ZnamRKSt9nothrow_t, uptr sz) {
    596   void *p = 0;
    597   {
    598     SCOPED_TSAN_INTERCEPTOR(_ZnamRKSt9nothrow_t, sz);
    599     p = user_alloc(thr, pc, sz);
    600   }
    601   invoke_malloc_hook(p, sz);
    602   return p;
    603 }
    604 
    605 #else
    606 #error "Not implemented"
    607 #endif
    608 
    609 // void operator delete(void*)
    610 TSAN_INTERCEPTOR(void, _ZdlPv, void *p) {
    611   if (p == 0)
    612     return;
    613   invoke_free_hook(p);
    614   SCOPED_TSAN_INTERCEPTOR(_ZdlPv, p);
    615   user_free(thr, pc, p);
    616 }
    617 
    618 // void operator delete(void*, nothrow_t)
    619 TSAN_INTERCEPTOR(void, _ZdlPvRKSt9nothrow_t, void *p) {
    620   if (p == 0)
    621     return;
    622   invoke_free_hook(p);
    623   SCOPED_TSAN_INTERCEPTOR(_ZdlPvRKSt9nothrow_t, p);
    624   user_free(thr, pc, p);
    625 }
    626 
    627 // void operator delete[](void*)
    628 TSAN_INTERCEPTOR(void, _ZdaPv, void *p) {
    629   if (p == 0)
    630     return;
    631   invoke_free_hook(p);
    632   SCOPED_TSAN_INTERCEPTOR(_ZdaPv, p);
    633   user_free(thr, pc, p);
    634 }
    635 
    636 // void operator delete[](void*, nothrow_t)
    637 TSAN_INTERCEPTOR(void, _ZdaPvRKSt9nothrow_t, void *p) {
    638   if (p == 0)
    639     return;
    640   invoke_free_hook(p);
    641   SCOPED_TSAN_INTERCEPTOR(_ZdaPvRKSt9nothrow_t, p);
    642   user_free(thr, pc, p);
    643 }
    644 
    645 TSAN_INTERCEPTOR(void*, memalign, uptr align, uptr sz) {
    646   SCOPED_TSAN_INTERCEPTOR(memalign, align, sz);
    647   return user_alloc(thr, pc, sz, align);
    648 }
    649 
    650 TSAN_INTERCEPTOR(void*, valloc, uptr sz) {
    651   SCOPED_TSAN_INTERCEPTOR(valloc, sz);
    652   return user_alloc(thr, pc, sz, kPageSize);
    653 }
    654 
    655 TSAN_INTERCEPTOR(void*, pvalloc, uptr sz) {
    656   SCOPED_TSAN_INTERCEPTOR(pvalloc, sz);
    657   sz = RoundUp(sz, kPageSize);
    658   return user_alloc(thr, pc, sz, kPageSize);
    659 }
    660 
    661 TSAN_INTERCEPTOR(int, posix_memalign, void **memptr, uptr align, uptr sz) {
    662   SCOPED_TSAN_INTERCEPTOR(posix_memalign, memptr, align, sz);
    663   *memptr = user_alloc(thr, pc, sz, align);
    664   return 0;
    665 }
    666 
    667 // Used in thread-safe function static initialization.
    668 TSAN_INTERCEPTOR(int, __cxa_guard_acquire, char *m) {
    669   SCOPED_TSAN_INTERCEPTOR(__cxa_guard_acquire, m);
    670   int res = REAL(__cxa_guard_acquire)(m);
    671   if (res) {
    672     // This thread does the init.
    673   } else {
    674     Acquire(thr, pc, (uptr)m);
    675   }
    676   return res;
    677 }
    678 
    679 TSAN_INTERCEPTOR(void, __cxa_guard_release, char *m) {
    680   SCOPED_TSAN_INTERCEPTOR(__cxa_guard_release, m);
    681   Release(thr, pc, (uptr)m);
    682   REAL(__cxa_guard_release)(m);
    683 }
    684 
    685 static void thread_finalize(void *v) {
    686   uptr iter = (uptr)v;
    687   if (iter > 1) {
    688     if (pthread_setspecific(g_thread_finalize_key, (void*)(iter - 1))) {
    689       TsanPrintf("ThreadSanitizer: failed to set thread key\n");
    690       Die();
    691     }
    692     return;
    693   }
    694   {
    695     ScopedInRtl in_rtl;
    696     ThreadState *thr = cur_thread();
    697     ThreadFinish(thr);
    698     SignalContext *sctx = thr->signal_ctx;
    699     if (sctx) {
    700       thr->signal_ctx = 0;
    701       internal_free(sctx);
    702     }
    703   }
    704 }
    705 
    706 
    707 struct ThreadParam {
    708   void* (*callback)(void *arg);
    709   void *param;
    710   atomic_uintptr_t tid;
    711 };
    712 
    713 extern "C" void *__tsan_thread_start_func(void *arg) {
    714   ThreadParam *p = (ThreadParam*)arg;
    715   void* (*callback)(void *arg) = p->callback;
    716   void *param = p->param;
    717   int tid = 0;
    718   {
    719     ThreadState *thr = cur_thread();
    720     ScopedInRtl in_rtl;
    721     if (pthread_setspecific(g_thread_finalize_key, (void*)4)) {
    722       TsanPrintf("ThreadSanitizer: failed to set thread key\n");
    723       Die();
    724     }
    725     while ((tid = atomic_load(&p->tid, memory_order_acquire)) == 0)
    726       pthread_yield();
    727     atomic_store(&p->tid, 0, memory_order_release);
    728     ThreadStart(thr, tid);
    729     CHECK_EQ(thr->in_rtl, 1);
    730   }
    731   void *res = callback(param);
    732   // Prevent the callback from being tail called,
    733   // it mixes up stack traces.
    734   volatile int foo = 42;
    735   foo++;
    736   return res;
    737 }
    738 
    739 TSAN_INTERCEPTOR(int, pthread_create,
    740     void *th, void *attr, void *(*callback)(void*), void * param) {
    741   SCOPED_TSAN_INTERCEPTOR(pthread_create, th, attr, callback, param);
    742   pthread_attr_t myattr;
    743   if (attr == 0) {
    744     pthread_attr_init(&myattr);
    745     attr = &myattr;
    746   }
    747   int detached = 0;
    748   pthread_attr_getdetachstate(attr, &detached);
    749   uptr stacksize = 0;
    750   pthread_attr_getstacksize(attr, &stacksize);
    751   // We place the huge ThreadState object into TLS, account for that.
    752   const uptr minstacksize = GetTlsSize() + 128*1024;
    753   if (stacksize < minstacksize) {
    754     DPrintf("ThreadSanitizer: stacksize %zu->%zu\n", stacksize, minstacksize);
    755     pthread_attr_setstacksize(attr, minstacksize);
    756   }
    757   ThreadParam p;
    758   p.callback = callback;
    759   p.param = param;
    760   atomic_store(&p.tid, 0, memory_order_relaxed);
    761   int res = REAL(pthread_create)(th, attr, __tsan_thread_start_func, &p);
    762   if (res == 0) {
    763     int tid = ThreadCreate(thr, pc, *(uptr*)th, detached);
    764     CHECK_NE(tid, 0);
    765     atomic_store(&p.tid, tid, memory_order_release);
    766     while (atomic_load(&p.tid, memory_order_acquire) != 0)
    767       pthread_yield();
    768   }
    769   if (attr == &myattr)
    770     pthread_attr_destroy(&myattr);
    771   return res;
    772 }
    773 
    774 TSAN_INTERCEPTOR(int, pthread_join, void *th, void **ret) {
    775   SCOPED_TSAN_INTERCEPTOR(pthread_join, th, ret);
    776   int tid = ThreadTid(thr, pc, (uptr)th);
    777   int res = REAL(pthread_join)(th, ret);
    778   if (res == 0) {
    779     ThreadJoin(thr, pc, tid);
    780   }
    781   return res;
    782 }
    783 
    784 TSAN_INTERCEPTOR(int, pthread_detach, void *th) {
    785   SCOPED_TSAN_INTERCEPTOR(pthread_detach, th);
    786   int tid = ThreadTid(thr, pc, (uptr)th);
    787   int res = REAL(pthread_detach)(th);
    788   if (res == 0) {
    789     ThreadDetach(thr, pc, tid);
    790   }
    791   return res;
    792 }
    793 
    794 TSAN_INTERCEPTOR(int, pthread_mutex_init, void *m, void *a) {
    795   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_init, m, a);
    796   int res = REAL(pthread_mutex_init)(m, a);
    797   if (res == 0) {
    798     bool recursive = false;
    799     if (a) {
    800       int type = 0;
    801       if (pthread_mutexattr_gettype(a, &type) == 0)
    802         recursive = (type == PTHREAD_MUTEX_RECURSIVE
    803             || type == PTHREAD_MUTEX_RECURSIVE_NP);
    804     }
    805     MutexCreate(thr, pc, (uptr)m, false, recursive, false);
    806   }
    807   return res;
    808 }
    809 
    810 TSAN_INTERCEPTOR(int, pthread_mutex_destroy, void *m) {
    811   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_destroy, m);
    812   int res = REAL(pthread_mutex_destroy)(m);
    813   if (res == 0 || res == EBUSY) {
    814     MutexDestroy(thr, pc, (uptr)m);
    815   }
    816   return res;
    817 }
    818 
    819 TSAN_INTERCEPTOR(int, pthread_mutex_lock, void *m) {
    820   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_lock, m);
    821   int res = REAL(pthread_mutex_lock)(m);
    822   if (res == 0) {
    823     MutexLock(thr, pc, (uptr)m);
    824   }
    825   return res;
    826 }
    827 
    828 TSAN_INTERCEPTOR(int, pthread_mutex_trylock, void *m) {
    829   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_trylock, m);
    830   int res = REAL(pthread_mutex_trylock)(m);
    831   if (res == 0) {
    832     MutexLock(thr, pc, (uptr)m);
    833   }
    834   return res;
    835 }
    836 
    837 TSAN_INTERCEPTOR(int, pthread_mutex_timedlock, void *m, void *abstime) {
    838   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_timedlock, m, abstime);
    839   int res = REAL(pthread_mutex_timedlock)(m, abstime);
    840   if (res == 0) {
    841     MutexLock(thr, pc, (uptr)m);
    842   }
    843   return res;
    844 }
    845 
    846 TSAN_INTERCEPTOR(int, pthread_mutex_unlock, void *m) {
    847   SCOPED_TSAN_INTERCEPTOR(pthread_mutex_unlock, m);
    848   MutexUnlock(thr, pc, (uptr)m);
    849   int res = REAL(pthread_mutex_unlock)(m);
    850   return res;
    851 }
    852 
    853 TSAN_INTERCEPTOR(int, pthread_spin_init, void *m, int pshared) {
    854   SCOPED_TSAN_INTERCEPTOR(pthread_spin_init, m, pshared);
    855   int res = REAL(pthread_spin_init)(m, pshared);
    856   if (res == 0) {
    857     MutexCreate(thr, pc, (uptr)m, false, false, false);
    858   }
    859   return res;
    860 }
    861 
    862 TSAN_INTERCEPTOR(int, pthread_spin_destroy, void *m) {
    863   SCOPED_TSAN_INTERCEPTOR(pthread_spin_destroy, m);
    864   int res = REAL(pthread_spin_destroy)(m);
    865   if (res == 0) {
    866     MutexDestroy(thr, pc, (uptr)m);
    867   }
    868   return res;
    869 }
    870 
    871 TSAN_INTERCEPTOR(int, pthread_spin_lock, void *m) {
    872   SCOPED_TSAN_INTERCEPTOR(pthread_spin_lock, m);
    873   int res = REAL(pthread_spin_lock)(m);
    874   if (res == 0) {
    875     MutexLock(thr, pc, (uptr)m);
    876   }
    877   return res;
    878 }
    879 
    880 TSAN_INTERCEPTOR(int, pthread_spin_trylock, void *m) {
    881   SCOPED_TSAN_INTERCEPTOR(pthread_spin_trylock, m);
    882   int res = REAL(pthread_spin_trylock)(m);
    883   if (res == 0) {
    884     MutexLock(thr, pc, (uptr)m);
    885   }
    886   return res;
    887 }
    888 
    889 TSAN_INTERCEPTOR(int, pthread_spin_unlock, void *m) {
    890   SCOPED_TSAN_INTERCEPTOR(pthread_spin_unlock, m);
    891   MutexUnlock(thr, pc, (uptr)m);
    892   int res = REAL(pthread_spin_unlock)(m);
    893   return res;
    894 }
    895 
    896 TSAN_INTERCEPTOR(int, pthread_rwlock_init, void *m, void *a) {
    897   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_init, m, a);
    898   int res = REAL(pthread_rwlock_init)(m, a);
    899   if (res == 0) {
    900     MutexCreate(thr, pc, (uptr)m, true, false, false);
    901   }
    902   return res;
    903 }
    904 
    905 TSAN_INTERCEPTOR(int, pthread_rwlock_destroy, void *m) {
    906   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_destroy, m);
    907   int res = REAL(pthread_rwlock_destroy)(m);
    908   if (res == 0) {
    909     MutexDestroy(thr, pc, (uptr)m);
    910   }
    911   return res;
    912 }
    913 
    914 TSAN_INTERCEPTOR(int, pthread_rwlock_rdlock, void *m) {
    915   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_rdlock, m);
    916   int res = REAL(pthread_rwlock_rdlock)(m);
    917   if (res == 0) {
    918     MutexReadLock(thr, pc, (uptr)m);
    919   }
    920   return res;
    921 }
    922 
    923 TSAN_INTERCEPTOR(int, pthread_rwlock_tryrdlock, void *m) {
    924   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_tryrdlock, m);
    925   int res = REAL(pthread_rwlock_tryrdlock)(m);
    926   if (res == 0) {
    927     MutexReadLock(thr, pc, (uptr)m);
    928   }
    929   return res;
    930 }
    931 
    932 TSAN_INTERCEPTOR(int, pthread_rwlock_timedrdlock, void *m, void *abstime) {
    933   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_timedrdlock, m, abstime);
    934   int res = REAL(pthread_rwlock_timedrdlock)(m, abstime);
    935   if (res == 0) {
    936     MutexReadLock(thr, pc, (uptr)m);
    937   }
    938   return res;
    939 }
    940 
    941 TSAN_INTERCEPTOR(int, pthread_rwlock_wrlock, void *m) {
    942   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_wrlock, m);
    943   int res = REAL(pthread_rwlock_wrlock)(m);
    944   if (res == 0) {
    945     MutexLock(thr, pc, (uptr)m);
    946   }
    947   return res;
    948 }
    949 
    950 TSAN_INTERCEPTOR(int, pthread_rwlock_trywrlock, void *m) {
    951   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_trywrlock, m);
    952   int res = REAL(pthread_rwlock_trywrlock)(m);
    953   if (res == 0) {
    954     MutexLock(thr, pc, (uptr)m);
    955   }
    956   return res;
    957 }
    958 
    959 TSAN_INTERCEPTOR(int, pthread_rwlock_timedwrlock, void *m, void *abstime) {
    960   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_timedwrlock, m, abstime);
    961   int res = REAL(pthread_rwlock_timedwrlock)(m, abstime);
    962   if (res == 0) {
    963     MutexLock(thr, pc, (uptr)m);
    964   }
    965   return res;
    966 }
    967 
    968 TSAN_INTERCEPTOR(int, pthread_rwlock_unlock, void *m) {
    969   SCOPED_TSAN_INTERCEPTOR(pthread_rwlock_unlock, m);
    970   MutexReadOrWriteUnlock(thr, pc, (uptr)m);
    971   int res = REAL(pthread_rwlock_unlock)(m);
    972   return res;
    973 }
    974 
    975 TSAN_INTERCEPTOR(int, pthread_cond_init, void *c, void *a) {
    976   SCOPED_TSAN_INTERCEPTOR(pthread_cond_init, c, a);
    977   int res = REAL(pthread_cond_init)(c, a);
    978   return res;
    979 }
    980 
    981 TSAN_INTERCEPTOR(int, pthread_cond_destroy, void *c) {
    982   SCOPED_TSAN_INTERCEPTOR(pthread_cond_destroy, c);
    983   int res = REAL(pthread_cond_destroy)(c);
    984   return res;
    985 }
    986 
    987 TSAN_INTERCEPTOR(int, pthread_cond_signal, void *c) {
    988   SCOPED_TSAN_INTERCEPTOR(pthread_cond_signal, c);
    989   int res = REAL(pthread_cond_signal)(c);
    990   return res;
    991 }
    992 
    993 TSAN_INTERCEPTOR(int, pthread_cond_broadcast, void *c) {
    994   SCOPED_TSAN_INTERCEPTOR(pthread_cond_broadcast, c);
    995   int res = REAL(pthread_cond_broadcast)(c);
    996   return res;
    997 }
    998 
    999 TSAN_INTERCEPTOR(int, pthread_cond_wait, void *c, void *m) {
   1000   SCOPED_TSAN_INTERCEPTOR(pthread_cond_wait, c, m);
   1001   MutexUnlock(thr, pc, (uptr)m);
   1002   int res = REAL(pthread_cond_wait)(c, m);
   1003   MutexLock(thr, pc, (uptr)m);
   1004   return res;
   1005 }
   1006 
   1007 TSAN_INTERCEPTOR(int, pthread_cond_timedwait, void *c, void *m, void *abstime) {
   1008   SCOPED_TSAN_INTERCEPTOR(pthread_cond_timedwait, c, m, abstime);
   1009   MutexUnlock(thr, pc, (uptr)m);
   1010   int res = REAL(pthread_cond_timedwait)(c, m, abstime);
   1011   MutexLock(thr, pc, (uptr)m);
   1012   return res;
   1013 }
   1014 
   1015 TSAN_INTERCEPTOR(int, pthread_barrier_init, void *b, void *a, unsigned count) {
   1016   SCOPED_TSAN_INTERCEPTOR(pthread_barrier_init, b, a, count);
   1017   MemoryWrite1Byte(thr, pc, (uptr)b);
   1018   int res = REAL(pthread_barrier_init)(b, a, count);
   1019   return res;
   1020 }
   1021 
   1022 TSAN_INTERCEPTOR(int, pthread_barrier_destroy, void *b) {
   1023   SCOPED_TSAN_INTERCEPTOR(pthread_barrier_destroy, b);
   1024   MemoryWrite1Byte(thr, pc, (uptr)b);
   1025   int res = REAL(pthread_barrier_destroy)(b);
   1026   return res;
   1027 }
   1028 
   1029 TSAN_INTERCEPTOR(int, pthread_barrier_wait, void *b) {
   1030   SCOPED_TSAN_INTERCEPTOR(pthread_barrier_wait, b);
   1031   Release(thr, pc, (uptr)b);
   1032   MemoryRead1Byte(thr, pc, (uptr)b);
   1033   int res = REAL(pthread_barrier_wait)(b);
   1034   MemoryRead1Byte(thr, pc, (uptr)b);
   1035   if (res == 0 || res == PTHREAD_BARRIER_SERIAL_THREAD) {
   1036     Acquire(thr, pc, (uptr)b);
   1037   }
   1038   return res;
   1039 }
   1040 
   1041 TSAN_INTERCEPTOR(int, pthread_once, void *o, void (*f)()) {
   1042   SCOPED_TSAN_INTERCEPTOR(pthread_once, o, f);
   1043   if (o == 0 || f == 0)
   1044     return EINVAL;
   1045   atomic_uint32_t *a = static_cast<atomic_uint32_t*>(o);
   1046   u32 v = atomic_load(a, memory_order_acquire);
   1047   if (v == 0 && atomic_compare_exchange_strong(a, &v, 1,
   1048                                                memory_order_relaxed)) {
   1049     const int old_in_rtl = thr->in_rtl;
   1050     thr->in_rtl = 0;
   1051     (*f)();
   1052     CHECK_EQ(thr->in_rtl, 0);
   1053     thr->in_rtl = old_in_rtl;
   1054     Release(thr, pc, (uptr)o);
   1055     atomic_store(a, 2, memory_order_release);
   1056   } else {
   1057     while (v != 2) {
   1058       pthread_yield();
   1059       v = atomic_load(a, memory_order_acquire);
   1060     }
   1061     Acquire(thr, pc, (uptr)o);
   1062   }
   1063   return 0;
   1064 }
   1065 
   1066 TSAN_INTERCEPTOR(int, sem_init, void *s, int pshared, unsigned value) {
   1067   SCOPED_TSAN_INTERCEPTOR(sem_init, s, pshared, value);
   1068   int res = REAL(sem_init)(s, pshared, value);
   1069   return res;
   1070 }
   1071 
   1072 TSAN_INTERCEPTOR(int, sem_destroy, void *s) {
   1073   SCOPED_TSAN_INTERCEPTOR(sem_destroy, s);
   1074   int res = REAL(sem_destroy)(s);
   1075   return res;
   1076 }
   1077 
   1078 TSAN_INTERCEPTOR(int, sem_wait, void *s) {
   1079   SCOPED_TSAN_INTERCEPTOR(sem_wait, s);
   1080   int res = REAL(sem_wait)(s);
   1081   if (res == 0) {
   1082     Acquire(thr, pc, (uptr)s);
   1083   }
   1084   return res;
   1085 }
   1086 
   1087 TSAN_INTERCEPTOR(int, sem_trywait, void *s) {
   1088   SCOPED_TSAN_INTERCEPTOR(sem_trywait, s);
   1089   int res = REAL(sem_trywait)(s);
   1090   if (res == 0) {
   1091     Acquire(thr, pc, (uptr)s);
   1092   }
   1093   return res;
   1094 }
   1095 
   1096 TSAN_INTERCEPTOR(int, sem_timedwait, void *s, void *abstime) {
   1097   SCOPED_TSAN_INTERCEPTOR(sem_timedwait, s, abstime);
   1098   int res = REAL(sem_timedwait)(s, abstime);
   1099   if (res == 0) {
   1100     Acquire(thr, pc, (uptr)s);
   1101   }
   1102   return res;
   1103 }
   1104 
   1105 TSAN_INTERCEPTOR(int, sem_post, void *s) {
   1106   SCOPED_TSAN_INTERCEPTOR(sem_post, s);
   1107   Release(thr, pc, (uptr)s);
   1108   int res = REAL(sem_post)(s);
   1109   return res;
   1110 }
   1111 
   1112 TSAN_INTERCEPTOR(int, sem_getvalue, void *s, int *sval) {
   1113   SCOPED_TSAN_INTERCEPTOR(sem_getvalue, s, sval);
   1114   int res = REAL(sem_getvalue)(s, sval);
   1115   if (res == 0) {
   1116     Acquire(thr, pc, (uptr)s);
   1117   }
   1118   return res;
   1119 }
   1120 
   1121 TSAN_INTERCEPTOR(long_t, read, int fd, void *buf, long_t sz) {
   1122   SCOPED_TSAN_INTERCEPTOR(read, fd, buf, sz);
   1123   int res = REAL(read)(fd, buf, sz);
   1124   if (res >= 0) {
   1125     Acquire(thr, pc, fd2addr(fd));
   1126   }
   1127   return res;
   1128 }
   1129 
   1130 TSAN_INTERCEPTOR(long_t, pread, int fd, void *buf, long_t sz, unsigned off) {
   1131   SCOPED_TSAN_INTERCEPTOR(pread, fd, buf, sz, off);
   1132   int res = REAL(pread)(fd, buf, sz, off);
   1133   if (res >= 0) {
   1134     Acquire(thr, pc, fd2addr(fd));
   1135   }
   1136   return res;
   1137 }
   1138 
   1139 TSAN_INTERCEPTOR(long_t, pread64, int fd, void *buf, long_t sz, u64 off) {
   1140   SCOPED_TSAN_INTERCEPTOR(pread64, fd, buf, sz, off);
   1141   int res = REAL(pread64)(fd, buf, sz, off);
   1142   if (res >= 0) {
   1143     Acquire(thr, pc, fd2addr(fd));
   1144   }
   1145   return res;
   1146 }
   1147 
   1148 TSAN_INTERCEPTOR(long_t, readv, int fd, void *vec, int cnt) {
   1149   SCOPED_TSAN_INTERCEPTOR(readv, fd, vec, cnt);
   1150   int res = REAL(readv)(fd, vec, cnt);
   1151   if (res >= 0) {
   1152     Acquire(thr, pc, fd2addr(fd));
   1153   }
   1154   return res;
   1155 }
   1156 
   1157 TSAN_INTERCEPTOR(long_t, preadv64, int fd, void *vec, int cnt, u64 off) {
   1158   SCOPED_TSAN_INTERCEPTOR(preadv64, fd, vec, cnt, off);
   1159   int res = REAL(preadv64)(fd, vec, cnt, off);
   1160   if (res >= 0) {
   1161     Acquire(thr, pc, fd2addr(fd));
   1162   }
   1163   return res;
   1164 }
   1165 
   1166 TSAN_INTERCEPTOR(long_t, write, int fd, void *buf, long_t sz) {
   1167   SCOPED_TSAN_INTERCEPTOR(write, fd, buf, sz);
   1168   Release(thr, pc, fd2addr(fd));
   1169   int res = REAL(write)(fd, buf, sz);
   1170   return res;
   1171 }
   1172 
   1173 TSAN_INTERCEPTOR(long_t, pwrite, int fd, void *buf, long_t sz, unsigned off) {
   1174   SCOPED_TSAN_INTERCEPTOR(pwrite, fd, buf, sz, off);
   1175   Release(thr, pc, fd2addr(fd));
   1176   int res = REAL(pwrite)(fd, buf, sz, off);
   1177   return res;
   1178 }
   1179 
   1180 TSAN_INTERCEPTOR(long_t, pwrite64, int fd, void *buf, long_t sz, u64 off) {
   1181   SCOPED_TSAN_INTERCEPTOR(pwrite64, fd, buf, sz, off);
   1182   Release(thr, pc, fd2addr(fd));
   1183   int res = REAL(pwrite64)(fd, buf, sz, off);
   1184   return res;
   1185 }
   1186 
   1187 TSAN_INTERCEPTOR(long_t, writev, int fd, void *vec, int cnt) {
   1188   SCOPED_TSAN_INTERCEPTOR(writev, fd, vec, cnt);
   1189   Release(thr, pc, fd2addr(fd));
   1190   int res = REAL(writev)(fd, vec, cnt);
   1191   return res;
   1192 }
   1193 
   1194 TSAN_INTERCEPTOR(long_t, pwritev64, int fd, void *vec, int cnt, u64 off) {
   1195   SCOPED_TSAN_INTERCEPTOR(pwritev64, fd, vec, cnt, off);
   1196   Release(thr, pc, fd2addr(fd));
   1197   int res = REAL(pwritev64)(fd, vec, cnt, off);
   1198   return res;
   1199 }
   1200 
   1201 TSAN_INTERCEPTOR(long_t, send, int fd, void *buf, long_t len, int flags) {
   1202   SCOPED_TSAN_INTERCEPTOR(send, fd, buf, len, flags);
   1203   Release(thr, pc, fd2addr(fd));
   1204   int res = REAL(send)(fd, buf, len, flags);
   1205   return res;
   1206 }
   1207 
   1208 TSAN_INTERCEPTOR(long_t, sendmsg, int fd, void *msg, int flags) {
   1209   SCOPED_TSAN_INTERCEPTOR(sendmsg, fd, msg, flags);
   1210   Release(thr, pc, fd2addr(fd));
   1211   int res = REAL(sendmsg)(fd, msg, flags);
   1212   return res;
   1213 }
   1214 
   1215 TSAN_INTERCEPTOR(long_t, recv, int fd, void *buf, long_t len, int flags) {
   1216   SCOPED_TSAN_INTERCEPTOR(recv, fd, buf, len, flags);
   1217   int res = REAL(recv)(fd, buf, len, flags);
   1218   if (res >= 0) {
   1219     Acquire(thr, pc, fd2addr(fd));
   1220   }
   1221   return res;
   1222 }
   1223 
   1224 TSAN_INTERCEPTOR(long_t, recvmsg, int fd, void *msg, int flags) {
   1225   SCOPED_TSAN_INTERCEPTOR(recvmsg, fd, msg, flags);
   1226   int res = REAL(recvmsg)(fd, msg, flags);
   1227   if (res >= 0) {
   1228     Acquire(thr, pc, fd2addr(fd));
   1229   }
   1230   return res;
   1231 }
   1232 
   1233 TSAN_INTERCEPTOR(int, unlink, char *path) {
   1234   SCOPED_TSAN_INTERCEPTOR(unlink, path);
   1235   Release(thr, pc, file2addr(path));
   1236   int res = REAL(unlink)(path);
   1237   return res;
   1238 }
   1239 
   1240 TSAN_INTERCEPTOR(void*, fopen, char *path, char *mode) {
   1241   SCOPED_TSAN_INTERCEPTOR(fopen, path, mode);
   1242   void *res = REAL(fopen)(path, mode);
   1243   Acquire(thr, pc, file2addr(path));
   1244   return res;
   1245 }
   1246 
   1247 TSAN_INTERCEPTOR(uptr, fread, void *ptr, uptr size, uptr nmemb, void *f) {
   1248   SCOPED_TSAN_INTERCEPTOR(fread, ptr, size, nmemb, f);
   1249   MemoryAccessRange(thr, pc, (uptr)ptr, size * nmemb, true);
   1250   return REAL(fread)(ptr, size, nmemb, f);
   1251 }
   1252 
   1253 TSAN_INTERCEPTOR(uptr, fwrite, const void *p, uptr size, uptr nmemb, void *f) {
   1254   SCOPED_TSAN_INTERCEPTOR(fwrite, p, size, nmemb, f);
   1255   MemoryAccessRange(thr, pc, (uptr)p, size * nmemb, false);
   1256   return REAL(fwrite)(p, size, nmemb, f);
   1257 }
   1258 
   1259 TSAN_INTERCEPTOR(int, puts, const char *s) {
   1260   SCOPED_TSAN_INTERCEPTOR(puts, s);
   1261   MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s), false);
   1262   return REAL(puts)(s);
   1263 }
   1264 
   1265 TSAN_INTERCEPTOR(int, rmdir, char *path) {
   1266   SCOPED_TSAN_INTERCEPTOR(rmdir, path);
   1267   Release(thr, pc, dir2addr(path));
   1268   int res = REAL(rmdir)(path);
   1269   return res;
   1270 }
   1271 
   1272 TSAN_INTERCEPTOR(void*, opendir, char *path) {
   1273   SCOPED_TSAN_INTERCEPTOR(opendir, path);
   1274   void *res = REAL(opendir)(path);
   1275   Acquire(thr, pc, dir2addr(path));
   1276   return res;
   1277 }
   1278 
   1279 TSAN_INTERCEPTOR(int, epoll_ctl, int epfd, int op, int fd, void *ev) {
   1280   SCOPED_TSAN_INTERCEPTOR(epoll_ctl, epfd, op, fd, ev);
   1281   if (op == EPOLL_CTL_ADD) {
   1282     Release(thr, pc, epollfd2addr(epfd));
   1283   }
   1284   int res = REAL(epoll_ctl)(epfd, op, fd, ev);
   1285   return res;
   1286 }
   1287 
   1288 TSAN_INTERCEPTOR(int, epoll_wait, int epfd, void *ev, int cnt, int timeout) {
   1289   SCOPED_TSAN_INTERCEPTOR(epoll_wait, epfd, ev, cnt, timeout);
   1290   int res = REAL(epoll_wait)(epfd, ev, cnt, timeout);
   1291   if (res > 0) {
   1292     Acquire(thr, pc, epollfd2addr(epfd));
   1293   }
   1294   return res;
   1295 }
   1296 
   1297 static void ALWAYS_INLINE rtl_generic_sighandler(bool sigact, int sig,
   1298     my_siginfo_t *info, void *ctx) {
   1299   ThreadState *thr = cur_thread();
   1300   SignalContext *sctx = SigCtx(thr);
   1301   // Don't mess with synchronous signals.
   1302   if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
   1303       sig == SIGABRT || sig == SIGFPE || sig == SIGPIPE ||
   1304       (sctx && sig == sctx->int_signal_send)) {
   1305     CHECK(thr->in_rtl == 0 || thr->in_rtl == 1);
   1306     int in_rtl = thr->in_rtl;
   1307     thr->in_rtl = 0;
   1308     CHECK_EQ(thr->in_signal_handler, false);
   1309     thr->in_signal_handler = true;
   1310     if (sigact)
   1311       sigactions[sig].sa_sigaction(sig, info, ctx);
   1312     else
   1313       sigactions[sig].sa_handler(sig);
   1314     CHECK_EQ(thr->in_signal_handler, true);
   1315     thr->in_signal_handler = false;
   1316     thr->in_rtl = in_rtl;
   1317     return;
   1318   }
   1319 
   1320   if (sctx == 0)
   1321     return;
   1322   SignalDesc *signal = &sctx->pending_signals[sig];
   1323   if (signal->armed == false) {
   1324     signal->armed = true;
   1325     signal->sigaction = sigact;
   1326     if (info)
   1327       internal_memcpy(&signal->siginfo, info, sizeof(*info));
   1328     if (ctx)
   1329       internal_memcpy(&signal->ctx, ctx, sizeof(signal->ctx));
   1330     sctx->pending_signal_count++;
   1331   }
   1332 }
   1333 
   1334 static void rtl_sighandler(int sig) {
   1335   rtl_generic_sighandler(false, sig, 0, 0);
   1336 }
   1337 
   1338 static void rtl_sigaction(int sig, my_siginfo_t *info, void *ctx) {
   1339   rtl_generic_sighandler(true, sig, info, ctx);
   1340 }
   1341 
   1342 TSAN_INTERCEPTOR(int, sigaction, int sig, sigaction_t *act, sigaction_t *old) {
   1343   SCOPED_TSAN_INTERCEPTOR(sigaction, sig, act, old);
   1344   if (old)
   1345     internal_memcpy(old, &sigactions[sig], sizeof(*old));
   1346   if (act == 0)
   1347     return 0;
   1348   internal_memcpy(&sigactions[sig], act, sizeof(*act));
   1349   sigaction_t newact;
   1350   internal_memcpy(&newact, act, sizeof(newact));
   1351   sigfillset(&newact.sa_mask);
   1352   if (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL) {
   1353     if (newact.sa_flags & SA_SIGINFO)
   1354       newact.sa_sigaction = rtl_sigaction;
   1355     else
   1356       newact.sa_handler = rtl_sighandler;
   1357   }
   1358   int res = REAL(sigaction)(sig, &newact, 0);
   1359   return res;
   1360 }
   1361 
   1362 TSAN_INTERCEPTOR(sighandler_t, signal, int sig, sighandler_t h) {
   1363   sigaction_t act = {};
   1364   act.sa_handler = h;
   1365   REAL(memset)(&act.sa_mask, -1, sizeof(act.sa_mask));
   1366   act.sa_flags = 0;
   1367   sigaction_t old = {};
   1368   int res = sigaction(sig, &act, &old);
   1369   if (res)
   1370     return SIG_ERR;
   1371   return old.sa_handler;
   1372 }
   1373 
   1374 TSAN_INTERCEPTOR(int, raise, int sig) {
   1375   SCOPED_TSAN_INTERCEPTOR(raise, sig);
   1376   SignalContext *sctx = SigCtx(thr);
   1377   CHECK_NE(sctx, 0);
   1378   int prev = sctx->int_signal_send;
   1379   sctx->int_signal_send = sig;
   1380   int res = REAL(raise)(sig);
   1381   CHECK_EQ(sctx->int_signal_send, sig);
   1382   sctx->int_signal_send = prev;
   1383   return res;
   1384 }
   1385 
   1386 TSAN_INTERCEPTOR(int, kill, int pid, int sig) {
   1387   SCOPED_TSAN_INTERCEPTOR(kill, pid, sig);
   1388   SignalContext *sctx = SigCtx(thr);
   1389   CHECK_NE(sctx, 0);
   1390   int prev = sctx->int_signal_send;
   1391   if (pid == GetPid()) {
   1392     sctx->int_signal_send = sig;
   1393   }
   1394   int res = REAL(kill)(pid, sig);
   1395   if (pid == GetPid()) {
   1396     CHECK_EQ(sctx->int_signal_send, sig);
   1397     sctx->int_signal_send = prev;
   1398   }
   1399   return res;
   1400 }
   1401 
   1402 TSAN_INTERCEPTOR(int, pthread_kill, void *tid, int sig) {
   1403   SCOPED_TSAN_INTERCEPTOR(pthread_kill, tid, sig);
   1404   SignalContext *sctx = SigCtx(thr);
   1405   CHECK_NE(sctx, 0);
   1406   int prev = sctx->int_signal_send;
   1407   if (tid == pthread_self()) {
   1408     sctx->int_signal_send = sig;
   1409   }
   1410   int res = REAL(pthread_kill)(tid, sig);
   1411   if (tid == pthread_self()) {
   1412     CHECK_EQ(sctx->int_signal_send, sig);
   1413     sctx->int_signal_send = prev;
   1414   }
   1415   return res;
   1416 }
   1417 
   1418 static void process_pending_signals(ThreadState *thr) {
   1419   CHECK_EQ(thr->in_rtl, 0);
   1420   SignalContext *sctx = SigCtx(thr);
   1421   if (sctx == 0 || sctx->pending_signal_count == 0 || thr->in_signal_handler)
   1422     return;
   1423   thr->in_signal_handler = true;
   1424   sctx->pending_signal_count = 0;
   1425   // These are too big for stack.
   1426   static THREADLOCAL sigset_t emptyset, oldset;
   1427   sigfillset(&emptyset);
   1428   pthread_sigmask(SIG_SETMASK, &emptyset, &oldset);
   1429   for (int sig = 0; sig < kSigCount; sig++) {
   1430     SignalDesc *signal = &sctx->pending_signals[sig];
   1431     if (signal->armed) {
   1432       signal->armed = false;
   1433       if (sigactions[sig].sa_handler != SIG_DFL
   1434           && sigactions[sig].sa_handler != SIG_IGN) {
   1435         // Insure that the handler does not spoil errno.
   1436         const int saved_errno = errno;
   1437         errno = 0;
   1438         if (signal->sigaction)
   1439           sigactions[sig].sa_sigaction(sig, &signal->siginfo, &signal->ctx);
   1440         else
   1441           sigactions[sig].sa_handler(sig);
   1442         if (errno != 0) {
   1443           ScopedInRtl in_rtl;
   1444           StackTrace stack;
   1445           uptr pc = signal->sigaction ?
   1446               (uptr)sigactions[sig].sa_sigaction :
   1447               (uptr)sigactions[sig].sa_handler;
   1448           stack.Init(&pc, 1);
   1449           ScopedReport rep(ReportTypeErrnoInSignal);
   1450           rep.AddStack(&stack);
   1451           OutputReport(rep, rep.GetReport()->stacks[0]);
   1452         }
   1453         errno = saved_errno;
   1454       }
   1455     }
   1456   }
   1457   pthread_sigmask(SIG_SETMASK, &oldset, 0);
   1458   CHECK_EQ(thr->in_signal_handler, true);
   1459   thr->in_signal_handler = false;
   1460 }
   1461 
   1462 namespace __tsan {
   1463 
   1464 void InitializeInterceptors() {
   1465   CHECK_GT(cur_thread()->in_rtl, 0);
   1466 
   1467   // We need to setup it early, because functions like dlsym() can call it.
   1468   REAL(memset) = internal_memset;
   1469   REAL(memcpy) = internal_memcpy;
   1470   REAL(memcmp) = internal_memcmp;
   1471 
   1472   TSAN_INTERCEPT(longjmp);
   1473   TSAN_INTERCEPT(siglongjmp);
   1474 
   1475   TSAN_INTERCEPT(malloc);
   1476   TSAN_INTERCEPT(calloc);
   1477   TSAN_INTERCEPT(realloc);
   1478   TSAN_INTERCEPT(free);
   1479   TSAN_INTERCEPT(cfree);
   1480   TSAN_INTERCEPT(mmap);
   1481   TSAN_INTERCEPT(mmap64);
   1482   TSAN_INTERCEPT(munmap);
   1483   TSAN_INTERCEPT(memalign);
   1484   TSAN_INTERCEPT(valloc);
   1485   TSAN_INTERCEPT(pvalloc);
   1486   TSAN_INTERCEPT(posix_memalign);
   1487 
   1488   TSAN_INTERCEPT(_Znwm);
   1489   TSAN_INTERCEPT(_ZnwmRKSt9nothrow_t);
   1490   TSAN_INTERCEPT(_Znam);
   1491   TSAN_INTERCEPT(_ZnamRKSt9nothrow_t);
   1492   TSAN_INTERCEPT(_ZdlPv);
   1493   TSAN_INTERCEPT(_ZdlPvRKSt9nothrow_t);
   1494   TSAN_INTERCEPT(_ZdaPv);
   1495   TSAN_INTERCEPT(_ZdaPvRKSt9nothrow_t);
   1496 
   1497   TSAN_INTERCEPT(strlen);
   1498   TSAN_INTERCEPT(memset);
   1499   TSAN_INTERCEPT(memcpy);
   1500   TSAN_INTERCEPT(strcmp);
   1501   TSAN_INTERCEPT(memchr);
   1502   TSAN_INTERCEPT(memrchr);
   1503   TSAN_INTERCEPT(memmove);
   1504   TSAN_INTERCEPT(memcmp);
   1505   TSAN_INTERCEPT(strchr);
   1506   TSAN_INTERCEPT(strchrnul);
   1507   TSAN_INTERCEPT(strrchr);
   1508   TSAN_INTERCEPT(strncmp);
   1509   TSAN_INTERCEPT(strcpy);  // NOLINT
   1510   TSAN_INTERCEPT(strncpy);
   1511   TSAN_INTERCEPT(strstr);
   1512 
   1513   TSAN_INTERCEPT(__cxa_guard_acquire);
   1514   TSAN_INTERCEPT(__cxa_guard_release);
   1515 
   1516   TSAN_INTERCEPT(pthread_create);
   1517   TSAN_INTERCEPT(pthread_join);
   1518   TSAN_INTERCEPT(pthread_detach);
   1519 
   1520   TSAN_INTERCEPT(pthread_mutex_init);
   1521   TSAN_INTERCEPT(pthread_mutex_destroy);
   1522   TSAN_INTERCEPT(pthread_mutex_lock);
   1523   TSAN_INTERCEPT(pthread_mutex_trylock);
   1524   TSAN_INTERCEPT(pthread_mutex_timedlock);
   1525   TSAN_INTERCEPT(pthread_mutex_unlock);
   1526 
   1527   TSAN_INTERCEPT(pthread_spin_init);
   1528   TSAN_INTERCEPT(pthread_spin_destroy);
   1529   TSAN_INTERCEPT(pthread_spin_lock);
   1530   TSAN_INTERCEPT(pthread_spin_trylock);
   1531   TSAN_INTERCEPT(pthread_spin_unlock);
   1532 
   1533   TSAN_INTERCEPT(pthread_rwlock_init);
   1534   TSAN_INTERCEPT(pthread_rwlock_destroy);
   1535   TSAN_INTERCEPT(pthread_rwlock_rdlock);
   1536   TSAN_INTERCEPT(pthread_rwlock_tryrdlock);
   1537   TSAN_INTERCEPT(pthread_rwlock_timedrdlock);
   1538   TSAN_INTERCEPT(pthread_rwlock_wrlock);
   1539   TSAN_INTERCEPT(pthread_rwlock_trywrlock);
   1540   TSAN_INTERCEPT(pthread_rwlock_timedwrlock);
   1541   TSAN_INTERCEPT(pthread_rwlock_unlock);
   1542 
   1543   TSAN_INTERCEPT(pthread_cond_init);
   1544   TSAN_INTERCEPT(pthread_cond_destroy);
   1545   TSAN_INTERCEPT(pthread_cond_signal);
   1546   TSAN_INTERCEPT(pthread_cond_broadcast);
   1547   TSAN_INTERCEPT(pthread_cond_wait);
   1548   TSAN_INTERCEPT(pthread_cond_timedwait);
   1549 
   1550   TSAN_INTERCEPT(pthread_barrier_init);
   1551   TSAN_INTERCEPT(pthread_barrier_destroy);
   1552   TSAN_INTERCEPT(pthread_barrier_wait);
   1553 
   1554   TSAN_INTERCEPT(pthread_once);
   1555 
   1556   TSAN_INTERCEPT(sem_init);
   1557   TSAN_INTERCEPT(sem_destroy);
   1558   TSAN_INTERCEPT(sem_wait);
   1559   TSAN_INTERCEPT(sem_trywait);
   1560   TSAN_INTERCEPT(sem_timedwait);
   1561   TSAN_INTERCEPT(sem_post);
   1562   TSAN_INTERCEPT(sem_getvalue);
   1563 
   1564   TSAN_INTERCEPT(read);
   1565   TSAN_INTERCEPT(pread);
   1566   TSAN_INTERCEPT(pread64);
   1567   TSAN_INTERCEPT(readv);
   1568   TSAN_INTERCEPT(preadv64);
   1569   TSAN_INTERCEPT(write);
   1570   TSAN_INTERCEPT(pwrite);
   1571   TSAN_INTERCEPT(pwrite64);
   1572   TSAN_INTERCEPT(writev);
   1573   TSAN_INTERCEPT(pwritev64);
   1574   TSAN_INTERCEPT(send);
   1575   TSAN_INTERCEPT(sendmsg);
   1576   TSAN_INTERCEPT(recv);
   1577   TSAN_INTERCEPT(recvmsg);
   1578 
   1579   TSAN_INTERCEPT(unlink);
   1580   TSAN_INTERCEPT(fopen);
   1581   TSAN_INTERCEPT(fread);
   1582   TSAN_INTERCEPT(fwrite);
   1583   TSAN_INTERCEPT(puts);
   1584   TSAN_INTERCEPT(rmdir);
   1585   TSAN_INTERCEPT(opendir);
   1586 
   1587   TSAN_INTERCEPT(epoll_ctl);
   1588   TSAN_INTERCEPT(epoll_wait);
   1589 
   1590   TSAN_INTERCEPT(sigaction);
   1591   TSAN_INTERCEPT(signal);
   1592   TSAN_INTERCEPT(raise);
   1593   TSAN_INTERCEPT(kill);
   1594   TSAN_INTERCEPT(pthread_kill);
   1595   TSAN_INTERCEPT(sleep);
   1596   TSAN_INTERCEPT(usleep);
   1597   TSAN_INTERCEPT(nanosleep);
   1598 
   1599   atexit_ctx = new(internal_alloc(MBlockAtExit, sizeof(AtExitContext)))
   1600       AtExitContext();
   1601 
   1602   if (__cxa_atexit(&finalize, 0, 0)) {
   1603     TsanPrintf("ThreadSanitizer: failed to setup atexit callback\n");
   1604     Die();
   1605   }
   1606 
   1607   if (pthread_key_create(&g_thread_finalize_key, &thread_finalize)) {
   1608     TsanPrintf("ThreadSanitizer: failed to create thread key\n");
   1609     Die();
   1610   }
   1611 }
   1612 
   1613 void internal_start_thread(void(*func)(void *arg), void *arg) {
   1614   void *th;
   1615   REAL(pthread_create)(&th, 0, (void*(*)(void *arg))func, arg);
   1616   REAL(pthread_detach)(th);
   1617 }
   1618 
   1619 }  // namespace __tsan
   1620