1*6d46ebefSNico Weber //===-- wrappers_cpp.cpp ----------------------------------------*- C++ -*-===//
2*6d46ebefSNico Weber //
3*6d46ebefSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*6d46ebefSNico Weber // See https://llvm.org/LICENSE.txt for license information.
5*6d46ebefSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*6d46ebefSNico Weber //
7*6d46ebefSNico Weber //===----------------------------------------------------------------------===//
8*6d46ebefSNico Weber 
9*6d46ebefSNico Weber #include "platform.h"
10*6d46ebefSNico Weber 
11*6d46ebefSNico Weber // Skip this compilation unit if compiled as part of Bionic.
12*6d46ebefSNico Weber #if !SCUDO_ANDROID || !_BIONIC
13*6d46ebefSNico Weber 
14*6d46ebefSNico Weber #include "allocator_config.h"
15*6d46ebefSNico Weber 
16*6d46ebefSNico Weber #include <stdint.h>
17*6d46ebefSNico Weber 
18*6d46ebefSNico Weber extern scudo::Allocator<scudo::Config> *AllocatorPtr;
19*6d46ebefSNico Weber 
20*6d46ebefSNico Weber namespace std {
21*6d46ebefSNico Weber struct nothrow_t {};
22*6d46ebefSNico Weber enum class align_val_t : size_t {};
23*6d46ebefSNico Weber } // namespace std
24*6d46ebefSNico Weber 
25*6d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size) {
26*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::New);
27*6d46ebefSNico Weber }
28*6d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size) {
29*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::NewArray);
30*6d46ebefSNico Weber }
31*6d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size,
32*6d46ebefSNico Weber                                   std::nothrow_t const &) NOEXCEPT {
33*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::New);
34*6d46ebefSNico Weber }
35*6d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size,
36*6d46ebefSNico Weber                                     std::nothrow_t const &) NOEXCEPT {
37*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::NewArray);
38*6d46ebefSNico Weber }
39*6d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size, std::align_val_t align) {
40*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::New,
41*6d46ebefSNico Weber                                 static_cast<scudo::uptr>(align));
42*6d46ebefSNico Weber }
43*6d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align) {
44*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::NewArray,
45*6d46ebefSNico Weber                                 static_cast<scudo::uptr>(align));
46*6d46ebefSNico Weber }
47*6d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size, std::align_val_t align,
48*6d46ebefSNico Weber                                   std::nothrow_t const &) NOEXCEPT {
49*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::New,
50*6d46ebefSNico Weber                                 static_cast<scudo::uptr>(align));
51*6d46ebefSNico Weber }
52*6d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align,
53*6d46ebefSNico Weber                                     std::nothrow_t const &) NOEXCEPT {
54*6d46ebefSNico Weber   return AllocatorPtr->allocate(size, scudo::Chunk::Origin::NewArray,
55*6d46ebefSNico Weber                                 static_cast<scudo::uptr>(align));
56*6d46ebefSNico Weber }
57*6d46ebefSNico Weber 
58*6d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr)NOEXCEPT {
59*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::New);
60*6d46ebefSNico Weber }
61*6d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr) NOEXCEPT {
62*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::NewArray);
63*6d46ebefSNico Weber }
64*6d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::nothrow_t const &)NOEXCEPT {
65*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::New);
66*6d46ebefSNico Weber }
67*6d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr,
68*6d46ebefSNico Weber                                       std::nothrow_t const &) NOEXCEPT {
69*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::NewArray);
70*6d46ebefSNico Weber }
71*6d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, size_t size)NOEXCEPT {
72*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::New, size);
73*6d46ebefSNico Weber }
74*6d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, size_t size) NOEXCEPT {
75*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::NewArray, size);
76*6d46ebefSNico Weber }
77*6d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align)NOEXCEPT {
78*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::New, 0,
79*6d46ebefSNico Weber                            static_cast<scudo::uptr>(align));
80*6d46ebefSNico Weber }
81*6d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr,
82*6d46ebefSNico Weber                                       std::align_val_t align) NOEXCEPT {
83*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
84*6d46ebefSNico Weber                            static_cast<scudo::uptr>(align));
85*6d46ebefSNico Weber }
86*6d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align,
87*6d46ebefSNico Weber                                     std::nothrow_t const &)NOEXCEPT {
88*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::New, 0,
89*6d46ebefSNico Weber                            static_cast<scudo::uptr>(align));
90*6d46ebefSNico Weber }
91*6d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, std::align_val_t align,
92*6d46ebefSNico Weber                                       std::nothrow_t const &) NOEXCEPT {
93*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
94*6d46ebefSNico Weber                            static_cast<scudo::uptr>(align));
95*6d46ebefSNico Weber }
96*6d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, size_t size,
97*6d46ebefSNico Weber                                     std::align_val_t align)NOEXCEPT {
98*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::New, size,
99*6d46ebefSNico Weber                            static_cast<scudo::uptr>(align));
100*6d46ebefSNico Weber }
101*6d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, size_t size,
102*6d46ebefSNico Weber                                       std::align_val_t align) NOEXCEPT {
103*6d46ebefSNico Weber   AllocatorPtr->deallocate(ptr, scudo::Chunk::Origin::NewArray, size,
104*6d46ebefSNico Weber                            static_cast<scudo::uptr>(align));
105*6d46ebefSNico Weber }
106*6d46ebefSNico Weber 
107*6d46ebefSNico Weber #endif // !SCUDO_ANDROID || !_BIONIC
108