]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/scudo/scudo_new_delete.cpp
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / scudo / scudo_new_delete.cpp
1 //===-- scudo_new_delete.cpp ------------------------------------*- C++ -*-===//
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 /// Interceptors for operators new and delete.
11 ///
12 //===----------------------------------------------------------------------===//
13
14 #include "scudo_allocator.h"
15 #include "scudo_errors.h"
16
17 #include "interception/interception.h"
18
19 #include <stddef.h>
20
21 using namespace __scudo;
22
23 #define CXX_OPERATOR_ATTRIBUTE INTERCEPTOR_ATTRIBUTE
24
25 // Fake std::nothrow_t to avoid including <new>.
26 namespace std {
27 struct nothrow_t {};
28 enum class align_val_t: size_t {};
29 }  // namespace std
30
31 // TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
32 #define OPERATOR_NEW_BODY_ALIGN(Type, Align, NoThrow)              \
33   void *Ptr = scudoAllocate(size, static_cast<uptr>(Align), Type); \
34   if (!NoThrow && UNLIKELY(!Ptr)) reportOutOfMemory(size);         \
35   return Ptr;
36 #define OPERATOR_NEW_BODY(Type, NoThrow) \
37   OPERATOR_NEW_BODY_ALIGN(Type, 0, NoThrow)
38
39 CXX_OPERATOR_ATTRIBUTE
40 void *operator new(size_t size)
41 { OPERATOR_NEW_BODY(FromNew, /*NoThrow=*/false); }
42 CXX_OPERATOR_ATTRIBUTE
43 void *operator new[](size_t size)
44 { OPERATOR_NEW_BODY(FromNewArray, /*NoThrow=*/false); }
45 CXX_OPERATOR_ATTRIBUTE
46 void *operator new(size_t size, std::nothrow_t const&)
47 { OPERATOR_NEW_BODY(FromNew, /*NoThrow=*/true); }
48 CXX_OPERATOR_ATTRIBUTE
49 void *operator new[](size_t size, std::nothrow_t const&)
50 { OPERATOR_NEW_BODY(FromNewArray, /*NoThrow=*/true); }
51 CXX_OPERATOR_ATTRIBUTE
52 void *operator new(size_t size, std::align_val_t align)
53 { OPERATOR_NEW_BODY_ALIGN(FromNew, align, /*NoThrow=*/false); }
54 CXX_OPERATOR_ATTRIBUTE
55 void *operator new[](size_t size, std::align_val_t align)
56 { OPERATOR_NEW_BODY_ALIGN(FromNewArray, align, /*NoThrow=*/false); }
57 CXX_OPERATOR_ATTRIBUTE
58 void *operator new(size_t size, std::align_val_t align, std::nothrow_t const&)
59 { OPERATOR_NEW_BODY_ALIGN(FromNew, align, /*NoThrow=*/true); }
60 CXX_OPERATOR_ATTRIBUTE
61 void *operator new[](size_t size, std::align_val_t align, std::nothrow_t const&)
62 { OPERATOR_NEW_BODY_ALIGN(FromNewArray, align, /*NoThrow=*/true); }
63
64 #define OPERATOR_DELETE_BODY(Type) \
65   scudoDeallocate(ptr, 0, 0, Type);
66 #define OPERATOR_DELETE_BODY_SIZE(Type) \
67   scudoDeallocate(ptr, size, 0, Type);
68 #define OPERATOR_DELETE_BODY_ALIGN(Type) \
69   scudoDeallocate(ptr, 0, static_cast<uptr>(align), Type);
70 #define OPERATOR_DELETE_BODY_SIZE_ALIGN(Type) \
71   scudoDeallocate(ptr, size, static_cast<uptr>(align), Type);
72
73 CXX_OPERATOR_ATTRIBUTE
74 void operator delete(void *ptr) NOEXCEPT
75 { OPERATOR_DELETE_BODY(FromNew); }
76 CXX_OPERATOR_ATTRIBUTE
77 void operator delete[](void *ptr) NOEXCEPT
78 { OPERATOR_DELETE_BODY(FromNewArray); }
79 CXX_OPERATOR_ATTRIBUTE
80 void operator delete(void *ptr, std::nothrow_t const&)
81 { OPERATOR_DELETE_BODY(FromNew); }
82 CXX_OPERATOR_ATTRIBUTE
83 void operator delete[](void *ptr, std::nothrow_t const&)
84 { OPERATOR_DELETE_BODY(FromNewArray); }
85 CXX_OPERATOR_ATTRIBUTE
86 void operator delete(void *ptr, size_t size) NOEXCEPT
87 { OPERATOR_DELETE_BODY_SIZE(FromNew); }
88 CXX_OPERATOR_ATTRIBUTE
89 void operator delete[](void *ptr, size_t size) NOEXCEPT
90 { OPERATOR_DELETE_BODY_SIZE(FromNewArray); }
91 CXX_OPERATOR_ATTRIBUTE
92 void operator delete(void *ptr, std::align_val_t align) NOEXCEPT
93 { OPERATOR_DELETE_BODY_ALIGN(FromNew); }
94 CXX_OPERATOR_ATTRIBUTE
95 void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT
96 { OPERATOR_DELETE_BODY_ALIGN(FromNewArray); }
97 CXX_OPERATOR_ATTRIBUTE
98 void operator delete(void *ptr, std::align_val_t align, std::nothrow_t const&)
99 { OPERATOR_DELETE_BODY_ALIGN(FromNew); }
100 CXX_OPERATOR_ATTRIBUTE
101 void operator delete[](void *ptr, std::align_val_t align, std::nothrow_t const&)
102 { OPERATOR_DELETE_BODY_ALIGN(FromNewArray); }
103 CXX_OPERATOR_ATTRIBUTE
104 void operator delete(void *ptr, size_t size, std::align_val_t align) NOEXCEPT
105 { OPERATOR_DELETE_BODY_SIZE_ALIGN(FromNew); }
106 CXX_OPERATOR_ATTRIBUTE
107 void operator delete[](void *ptr, size_t size, std::align_val_t align) NOEXCEPT
108 { OPERATOR_DELETE_BODY_SIZE_ALIGN(FromNewArray); }