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