diff options
| author | Francis Ricci <francisjricci@gmail.com> | 2017-08-16 18:09:29 +0000 | 
|---|---|---|
| committer | Francis Ricci <francisjricci@gmail.com> | 2017-08-16 18:09:29 +0000 | 
| commit | 69639c24f930a987c1656be56e3b205e182550e5 (patch) | |
| tree | 8d7134569b4d02967947e09e93bd2827d4037740 | |
| parent | 41d29b15e89e864719a78ff6cfb994c72d9e569d (diff) | |
| download | bcm5719-llvm-69639c24f930a987c1656be56e3b205e182550e5.tar.gz bcm5719-llvm-69639c24f930a987c1656be56e3b205e182550e5.zip  | |
Add C++17 aligned new/delete interceptors to standalone lsan
Summary: Based on r282019.
Reviewers: kcc, jakubjelinek, alekseyshl
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D36757
llvm-svn: 311030
| -rw-r--r-- | compiler-rt/lib/lsan/lsan_interceptors.cc | 49 | 
1 files changed, 46 insertions, 3 deletions
diff --git a/compiler-rt/lib/lsan/lsan_interceptors.cc b/compiler-rt/lib/lsan/lsan_interceptors.cc index 168868b012b..1aaaf16713d 100644 --- a/compiler-rt/lib/lsan/lsan_interceptors.cc +++ b/compiler-rt/lib/lsan/lsan_interceptors.cc @@ -44,6 +44,7 @@ int pthread_setspecific(unsigned key, const void *v);  namespace std {    struct nothrow_t; +  enum class align_val_t: size_t;  }  #if !SANITIZER_MAC @@ -203,13 +204,19 @@ INTERCEPTOR(int, mprobe, void *ptr) {  #define OPERATOR_NEW_BODY(nothrow)                         \    ENSURE_LSAN_INITED;                                      \    GET_STACK_TRACE_MALLOC;                                  \ -  void *res = Allocate(stack, size, 1, kAlwaysClearMemory);\ -  if (!nothrow && UNLIKELY(!res)) DieOnFailure::OnOOM();\ +  void *res = lsan_malloc(size, stack);                    \ +  if (!nothrow && UNLIKELY(!res)) DieOnFailure::OnOOM();   \ +  return res; +#define OPERATOR_NEW_BODY_ALIGN(nothrow)                   \ +  ENSURE_LSAN_INITED;                                      \ +  GET_STACK_TRACE_MALLOC;                                  \ +  void *res = lsan_memalign((uptr)align, size, stack);     \ +  if (!nothrow && UNLIKELY(!res)) DieOnFailure::OnOOM();   \    return res;  #define OPERATOR_DELETE_BODY \    ENSURE_LSAN_INITED;        \ -  Deallocate(ptr); +  lsan_free(ptr);  // On OS X it's not enough to just provide our own 'operator new' and  // 'operator delete' implementations, because they're going to be in the runtime @@ -229,6 +236,18 @@ void *operator new(size_t size, std::nothrow_t const&)  INTERCEPTOR_ATTRIBUTE  void *operator new[](size_t size, std::nothrow_t const&)  { OPERATOR_NEW_BODY(true /*nothrow*/); } +INTERCEPTOR_ATTRIBUTE +void *operator new(size_t size, std::align_val_t align) +{ OPERATOR_NEW_BODY_ALIGN(false /*nothrow*/); } +INTERCEPTOR_ATTRIBUTE +void *operator new[](size_t size, std::align_val_t align) +{ OPERATOR_NEW_BODY_ALIGN(false /*nothrow*/); } +INTERCEPTOR_ATTRIBUTE +void *operator new(size_t size, std::align_val_t align, std::nothrow_t const&) +{ OPERATOR_NEW_BODY_ALIGN(true /*nothrow*/); } +INTERCEPTOR_ATTRIBUTE +void *operator new[](size_t size, std::align_val_t align, std::nothrow_t const&) +{ OPERATOR_NEW_BODY_ALIGN(true /*nothrow*/); }  INTERCEPTOR_ATTRIBUTE  void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; } @@ -239,6 +258,30 @@ void operator delete(void *ptr, std::nothrow_t const&) { OPERATOR_DELETE_BODY; }  INTERCEPTOR_ATTRIBUTE  void operator delete[](void *ptr, std::nothrow_t const &)  { OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete(void *ptr, size_t size) NOEXCEPT +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete[](void *ptr, size_t size) NOEXCEPT +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete(void *ptr, std::align_val_t) NOEXCEPT +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete[](void *ptr, std::align_val_t) NOEXCEPT +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete(void *ptr, std::align_val_t, std::nothrow_t const&) +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete[](void *ptr, std::align_val_t, std::nothrow_t const&) +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete(void *ptr, size_t size, std::align_val_t) NOEXCEPT +{ OPERATOR_DELETE_BODY; } +INTERCEPTOR_ATTRIBUTE +void operator delete[](void *ptr, size_t size, std::align_val_t) NOEXCEPT +{ OPERATOR_DELETE_BODY; }  #else  // SANITIZER_MAC  | 

