@@ -60,18 +60,42 @@ enum class align_val_t: size_t {};
6060//  TODO(alekseyshl): throw std::bad_alloc instead of dying on OOM.
6161//  For local pool allocation, align to SHADOW_GRANULARITY to match asan
6262//  allocator behavior.
63- #define  OPERATOR_NEW_BODY (type, nothrow )            \
64-   GET_STACK_TRACE_MALLOC;                           \
65-   void  *res = asan_memalign(0 , size, &stack, type); \
66-   if  (!nothrow && UNLIKELY(!res))                   \
67-     ReportOutOfMemory (size, &stack);                \
68-   return  res;
69- #define  OPERATOR_NEW_BODY_ALIGN (type, nothrow )                \
70-   GET_STACK_TRACE_MALLOC;                                     \
71-   void  *res = asan_memalign((uptr)align, size, &stack, type); \
72-   if  (!nothrow && UNLIKELY(!res))                             \
73-     ReportOutOfMemory (size, &stack);                          \
74-   return  res;
63+ #define  OPERATOR_NEW_BODY                                \
64+   GET_STACK_TRACE_MALLOC;                               \
65+   void  *res = asan_memalign(0 , size, &stack, FROM_NEW); \
66+   if  (UNLIKELY(!res))                                   \
67+     ReportOutOfMemory (size, &stack);                    \
68+   return  res
69+ #define  OPERATOR_NEW_BODY_NOTHROW  \
70+   GET_STACK_TRACE_MALLOC;         \
71+   return  asan_memalign(0 , size, &stack, FROM_NEW)
72+ #define  OPERATOR_NEW_BODY_ARRAY                             \
73+   GET_STACK_TRACE_MALLOC;                                  \
74+   void  *res = asan_memalign(0 , size, &stack, FROM_NEW_BR); \
75+   if  (UNLIKELY(!res))                                      \
76+     ReportOutOfMemory (size, &stack);                       \
77+   return  res
78+ #define  OPERATOR_NEW_BODY_ARRAY_NOTHROW  \
79+   GET_STACK_TRACE_MALLOC;               \
80+   return  asan_memalign(0 , size, &stack, FROM_NEW_BR)
81+ #define  OPERATOR_NEW_BODY_ALIGN                                    \
82+   GET_STACK_TRACE_MALLOC;                                         \
83+   void  *res = asan_memalign((uptr)align, size, &stack, FROM_NEW); \
84+   if  (UNLIKELY(!res))                                             \
85+     ReportOutOfMemory (size, &stack);                              \
86+   return  res
87+ #define  OPERATOR_NEW_BODY_ALIGN_NOTHROW  \
88+   GET_STACK_TRACE_MALLOC;               \
89+   return  asan_memalign((uptr)align, size, &stack, FROM_NEW)
90+ #define  OPERATOR_NEW_BODY_ALIGN_ARRAY                                 \
91+   GET_STACK_TRACE_MALLOC;                                            \
92+   void  *res = asan_memalign((uptr)align, size, &stack, FROM_NEW_BR); \
93+   if  (UNLIKELY(!res))                                                \
94+     ReportOutOfMemory (size, &stack);                                 \
95+   return  res
96+ #define  OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW  \
97+   GET_STACK_TRACE_MALLOC;                     \
98+   return  asan_memalign((uptr)align, size, &stack, FROM_NEW_BR)
7599
76100//  On OS X it's not enough to just provide our own 'operator new' and
77101//  'operator delete' implementations, because they're going to be in the
@@ -82,129 +106,128 @@ enum class align_val_t: size_t {};
82106//  OS X we need to intercept them using their mangled names.
83107#if  !SANITIZER_APPLE
84108CXX_OPERATOR_ATTRIBUTE
85- void  *operator  new (size_t  size) {
86-   OPERATOR_NEW_BODY (FROM_NEW, false  /* nothrow*/  );
87- }
109+ void  *operator  new (size_t  size) { OPERATOR_NEW_BODY; }
88110CXX_OPERATOR_ATTRIBUTE
89- void  *operator  new [](size_t  size) {
90-   OPERATOR_NEW_BODY (FROM_NEW_BR, false  /* nothrow*/  );
91- }
111+ void  *operator  new [](size_t  size) { OPERATOR_NEW_BODY_ARRAY; }
92112CXX_OPERATOR_ATTRIBUTE
93113void  *operator  new (size_t  size, std::nothrow_t  const  &) {
94-   OPERATOR_NEW_BODY (FROM_NEW,  true   /* nothrow */ ) ;
114+   OPERATOR_NEW_BODY_NOTHROW ;
95115}
96116CXX_OPERATOR_ATTRIBUTE
97117void  *operator  new [](size_t  size, std::nothrow_t  const  &) {
98-   OPERATOR_NEW_BODY (FROM_NEW_BR,  true   /* nothrow */ ) ;
118+   OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
99119}
100120CXX_OPERATOR_ATTRIBUTE
101121void  *operator  new (size_t  size, std::align_val_t  align) {
102-   OPERATOR_NEW_BODY_ALIGN (FROM_NEW,  false   /* nothrow */ ) ;
122+   OPERATOR_NEW_BODY_ALIGN;
103123}
104124CXX_OPERATOR_ATTRIBUTE
105125void  *operator  new [](size_t  size, std::align_val_t  align) {
106-   OPERATOR_NEW_BODY_ALIGN (FROM_NEW_BR,  false   /* nothrow */ ) ;
126+   OPERATOR_NEW_BODY_ALIGN_ARRAY ;
107127}
108128CXX_OPERATOR_ATTRIBUTE
109129void  *operator  new (size_t  size, std::align_val_t  align,
110130                   std::nothrow_t  const  &) {
111-   OPERATOR_NEW_BODY_ALIGN (FROM_NEW,  true   /* nothrow */ ) ;
131+   OPERATOR_NEW_BODY_ALIGN_NOTHROW ;
112132}
113133CXX_OPERATOR_ATTRIBUTE
114134void  *operator  new [](size_t  size, std::align_val_t  align,
115135                     std::nothrow_t  const  &) {
116-   OPERATOR_NEW_BODY_ALIGN (FROM_NEW_BR,  true   /* nothrow */ ) ;
136+   OPERATOR_NEW_BODY_ALIGN_ARRAY_NOTHROW ;
117137}
118138
119139#else   //  SANITIZER_APPLE
120- INTERCEPTOR (void  *, _Znwm, size_t  size) {
121-   OPERATOR_NEW_BODY (FROM_NEW, false  /* nothrow*/  );
122- }
123- INTERCEPTOR (void  *, _Znam, size_t  size) {
124-   OPERATOR_NEW_BODY (FROM_NEW_BR, false  /* nothrow*/  );
125- }
140+ INTERCEPTOR (void  *, _Znwm, size_t  size) { OPERATOR_NEW_BODY; }
141+ INTERCEPTOR (void  *, _Znam, size_t  size) { OPERATOR_NEW_BODY_ARRAY; }
126142INTERCEPTOR (void  *, _ZnwmRKSt9nothrow_t, size_t  size, std::nothrow_t  const &) {
127-   OPERATOR_NEW_BODY (FROM_NEW,  true   /* nothrow */ ) ;
143+   OPERATOR_NEW_BODY_NOTHROW ;
128144}
129145INTERCEPTOR (void  *, _ZnamRKSt9nothrow_t, size_t  size, std::nothrow_t  const &) {
130-   OPERATOR_NEW_BODY (FROM_NEW_BR,  true   /* nothrow */ ) ;
146+   OPERATOR_NEW_BODY_ARRAY_NOTHROW ;
131147}
132148#endif   //  !SANITIZER_APPLE
133149
134- #define  OPERATOR_DELETE_BODY (type ) \
150+ #define  OPERATOR_DELETE_BODY  \
151+   GET_STACK_TRACE_FREE;      \
152+   asan_delete (ptr, 0 , 0 , &stack, FROM_NEW)
153+ #define  OPERATOR_DELETE_BODY_ARRAY  \
135154  GET_STACK_TRACE_FREE;            \
136-   asan_delete (ptr, 0 , 0 , &stack, type);
137- 
138- #define  OPERATOR_DELETE_BODY_SIZE (type ) \
139-   GET_STACK_TRACE_FREE;                 \
140-   asan_delete (ptr, size, 0 , &stack, type);
141- 
142- #define  OPERATOR_DELETE_BODY_ALIGN (type ) \
155+   asan_delete (ptr, 0 , 0 , &stack, FROM_NEW_BR)
156+ #define  OPERATOR_DELETE_BODY_ALIGN  \
157+   GET_STACK_TRACE_FREE;            \
158+   asan_delete (ptr, 0 , static_cast <uptr>(align), &stack, FROM_NEW)
159+ #define  OPERATOR_DELETE_BODY_ALIGN_ARRAY  \
143160  GET_STACK_TRACE_FREE;                  \
144-   asan_delete (ptr, 0 , static_cast <uptr>(align), &stack, type);
145- 
146- #define  OPERATOR_DELETE_BODY_SIZE_ALIGN (type ) \
161+   asan_delete (ptr, 0 , static_cast <uptr>(align), &stack, FROM_NEW_BR)
162+ #define  OPERATOR_DELETE_BODY_SIZE  \
163+   GET_STACK_TRACE_FREE;           \
164+   asan_delete (ptr, size, 0 , &stack, FROM_NEW)
165+ #define  OPERATOR_DELETE_BODY_SIZE_ARRAY  \
166+   GET_STACK_TRACE_FREE;                 \
167+   asan_delete (ptr, size, 0 , &stack, FROM_NEW_BR)
168+ #define  OPERATOR_DELETE_BODY_SIZE_ALIGN  \
169+   GET_STACK_TRACE_FREE;                 \
170+   asan_delete (ptr, size, static_cast <uptr>(align), &stack, FROM_NEW)
171+ #define  OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY  \
147172  GET_STACK_TRACE_FREE;                       \
148-   asan_delete (ptr, size, static_cast <uptr>(align), &stack, type); 
173+   asan_delete (ptr, size, static_cast <uptr>(align), &stack, FROM_NEW_BR) 
149174
150175#if  !SANITIZER_APPLE
151176CXX_OPERATOR_ATTRIBUTE
152- void  operator  delete (void  *ptr) NOEXCEPT { OPERATOR_DELETE_BODY (FROM_NEW) ; }
177+ void  operator  delete (void  *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
153178CXX_OPERATOR_ATTRIBUTE
154- void  operator  delete[] (void  *ptr) NOEXCEPT {
155-   OPERATOR_DELETE_BODY (FROM_NEW_BR);
156- }
179+ void  operator  delete[] (void  *ptr) NOEXCEPT { OPERATOR_DELETE_BODY_ARRAY; }
157180CXX_OPERATOR_ATTRIBUTE
158181void  operator  delete (void  *ptr, std::nothrow_t  const  &) {
159-   OPERATOR_DELETE_BODY (FROM_NEW) ;
182+   OPERATOR_DELETE_BODY;
160183}
161184CXX_OPERATOR_ATTRIBUTE
162185void  operator  delete[] (void  *ptr, std::nothrow_t  const  &) {
163-   OPERATOR_DELETE_BODY (FROM_NEW_BR) ;
186+   OPERATOR_DELETE_BODY_ARRAY ;
164187}
165188CXX_OPERATOR_ATTRIBUTE
166189void  operator  delete (void  *ptr, size_t  size) NOEXCEPT {
167-   OPERATOR_DELETE_BODY_SIZE (FROM_NEW) ;
190+   OPERATOR_DELETE_BODY_SIZE;
168191}
169192CXX_OPERATOR_ATTRIBUTE
170193void  operator  delete[] (void  *ptr, size_t  size) NOEXCEPT {
171-   OPERATOR_DELETE_BODY_SIZE (FROM_NEW_BR) ;
194+   OPERATOR_DELETE_BODY_SIZE_ARRAY ;
172195}
173196CXX_OPERATOR_ATTRIBUTE
174197void  operator  delete (void  *ptr, std::align_val_t  align) NOEXCEPT {
175-   OPERATOR_DELETE_BODY_ALIGN (FROM_NEW) ;
198+   OPERATOR_DELETE_BODY_ALIGN;
176199}
177200CXX_OPERATOR_ATTRIBUTE
178201void  operator  delete[] (void  *ptr, std::align_val_t  align) NOEXCEPT {
179-   OPERATOR_DELETE_BODY_ALIGN (FROM_NEW_BR) ;
202+   OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
180203}
181204CXX_OPERATOR_ATTRIBUTE
182205void  operator  delete (void  *ptr, std::align_val_t  align,
183206                     std::nothrow_t  const  &) {
184-   OPERATOR_DELETE_BODY_ALIGN (FROM_NEW) ;
207+   OPERATOR_DELETE_BODY_ALIGN;
185208}
186209CXX_OPERATOR_ATTRIBUTE
187210void  operator  delete[] (void  *ptr, std::align_val_t  align,
188211                       std::nothrow_t  const  &) {
189-   OPERATOR_DELETE_BODY_ALIGN (FROM_NEW_BR) ;
212+   OPERATOR_DELETE_BODY_ALIGN_ARRAY ;
190213}
191214CXX_OPERATOR_ATTRIBUTE
192215void  operator  delete (void  *ptr, size_t  size, std::align_val_t  align) NOEXCEPT {
193-   OPERATOR_DELETE_BODY_SIZE_ALIGN (FROM_NEW) ;
216+   OPERATOR_DELETE_BODY_SIZE_ALIGN;
194217}
195218CXX_OPERATOR_ATTRIBUTE
196219void  operator  delete[] (void  *ptr, size_t  size,
197220                       std::align_val_t  align) NOEXCEPT {
198-   OPERATOR_DELETE_BODY_SIZE_ALIGN (FROM_NEW_BR) ;
221+   OPERATOR_DELETE_BODY_SIZE_ALIGN_ARRAY ;
199222}
200223
201224#else   //  SANITIZER_APPLE
202- INTERCEPTOR (void , _ZdlPv, void  *ptr) { OPERATOR_DELETE_BODY (FROM_NEW) ; }
203- INTERCEPTOR (void , _ZdaPv, void  *ptr) { OPERATOR_DELETE_BODY (FROM_NEW_BR) ; }
225+ INTERCEPTOR (void , _ZdlPv, void  *ptr) { OPERATOR_DELETE_BODY; }
226+ INTERCEPTOR (void , _ZdaPv, void  *ptr) { OPERATOR_DELETE_BODY_ARRAY ; }
204227INTERCEPTOR (void , _ZdlPvRKSt9nothrow_t, void  *ptr, std::nothrow_t  const  &) {
205-   OPERATOR_DELETE_BODY (FROM_NEW) ;
228+   OPERATOR_DELETE_BODY;
206229}
207230INTERCEPTOR (void , _ZdaPvRKSt9nothrow_t, void  *ptr, std::nothrow_t  const  &) {
208-   OPERATOR_DELETE_BODY (FROM_NEW_BR) ;
231+   OPERATOR_DELETE_BODY_ARRAY ;
209232}
210233#endif   //  !SANITIZER_APPLE
0 commit comments