Home | History | Annotate | Download | only in rtl
      1 //===-- tsan_new_delete.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 // Interceptors for operators new and delete.
     13 //===----------------------------------------------------------------------===//
     14 #include "interception/interception.h"
     15 #include "sanitizer_common/sanitizer_internal_defs.h"
     16 #include "tsan_interceptors.h"
     17 
     18 using namespace __tsan;  // NOLINT
     19 
     20 namespace std {
     21 struct nothrow_t {};
     22 }  // namespace std
     23 
     24 DECLARE_REAL(void *, malloc, uptr size)
     25 DECLARE_REAL(void, free, void *ptr)
     26 
     27 #define OPERATOR_NEW_BODY(mangled_name) \
     28   if (cur_thread()->in_symbolizer) \
     29     return InternalAlloc(size); \
     30   void *p = 0; \
     31   {  \
     32     SCOPED_INTERCEPTOR_RAW(mangled_name, size); \
     33     p = user_alloc(thr, pc, size); \
     34   }  \
     35   invoke_malloc_hook(p, size);  \
     36   return p;
     37 
     38 SANITIZER_INTERFACE_ATTRIBUTE
     39 void *operator new(__sanitizer::uptr size);
     40 void *operator new(__sanitizer::uptr size) {
     41   OPERATOR_NEW_BODY(_Znwm);
     42 }
     43 
     44 SANITIZER_INTERFACE_ATTRIBUTE
     45 void *operator new[](__sanitizer::uptr size);
     46 void *operator new[](__sanitizer::uptr size) {
     47   OPERATOR_NEW_BODY(_Znam);
     48 }
     49 
     50 SANITIZER_INTERFACE_ATTRIBUTE
     51 void *operator new(__sanitizer::uptr size, std::nothrow_t const&);
     52 void *operator new(__sanitizer::uptr size, std::nothrow_t const&) {
     53   OPERATOR_NEW_BODY(_ZnwmRKSt9nothrow_t);
     54 }
     55 
     56 SANITIZER_INTERFACE_ATTRIBUTE
     57 void *operator new[](__sanitizer::uptr size, std::nothrow_t const&);
     58 void *operator new[](__sanitizer::uptr size, std::nothrow_t const&) {
     59   OPERATOR_NEW_BODY(_ZnamRKSt9nothrow_t);
     60 }
     61 
     62 #define OPERATOR_DELETE_BODY(mangled_name) \
     63   if (ptr == 0) return;  \
     64   if (cur_thread()->in_symbolizer) \
     65     return InternalFree(ptr); \
     66   invoke_free_hook(ptr);  \
     67   SCOPED_INTERCEPTOR_RAW(mangled_name, ptr);  \
     68   user_free(thr, pc, ptr);
     69 
     70 SANITIZER_INTERFACE_ATTRIBUTE
     71 void operator delete(void *ptr) NOEXCEPT;
     72 void operator delete(void *ptr) NOEXCEPT {
     73   OPERATOR_DELETE_BODY(_ZdlPv);
     74 }
     75 
     76 SANITIZER_INTERFACE_ATTRIBUTE
     77 void operator delete[](void *ptr) NOEXCEPT;
     78 void operator delete[](void *ptr) NOEXCEPT {
     79   OPERATOR_DELETE_BODY(_ZdaPv);
     80 }
     81 
     82 SANITIZER_INTERFACE_ATTRIBUTE
     83 void operator delete(void *ptr, std::nothrow_t const&);
     84 void operator delete(void *ptr, std::nothrow_t const&) {
     85   OPERATOR_DELETE_BODY(_ZdlPvRKSt9nothrow_t);
     86 }
     87 
     88 SANITIZER_INTERFACE_ATTRIBUTE
     89 void operator delete[](void *ptr, std::nothrow_t const&);
     90 void operator delete[](void *ptr, std::nothrow_t const&) {
     91   OPERATOR_DELETE_BODY(_ZdaPvRKSt9nothrow_t);
     92 }
     93