1*76559068SAndroid Build Coastguard Worker //===-- wrappers_cpp.cpp ----------------------------------------*- C++ -*-===//
2*76559068SAndroid Build Coastguard Worker //
3*76559068SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*76559068SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*76559068SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*76559068SAndroid Build Coastguard Worker //
7*76559068SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*76559068SAndroid Build Coastguard Worker
9*76559068SAndroid Build Coastguard Worker #include "platform.h"
10*76559068SAndroid Build Coastguard Worker
11*76559068SAndroid Build Coastguard Worker // Skip this compilation unit if compiled as part of Bionic.
12*76559068SAndroid Build Coastguard Worker #if !SCUDO_ANDROID || !_BIONIC
13*76559068SAndroid Build Coastguard Worker
14*76559068SAndroid Build Coastguard Worker #include "allocator_config.h"
15*76559068SAndroid Build Coastguard Worker #include "internal_defs.h"
16*76559068SAndroid Build Coastguard Worker #include "platform.h"
17*76559068SAndroid Build Coastguard Worker #include "scudo/interface.h"
18*76559068SAndroid Build Coastguard Worker #include "wrappers_c.h"
19*76559068SAndroid Build Coastguard Worker
20*76559068SAndroid Build Coastguard Worker #include <stdint.h>
21*76559068SAndroid Build Coastguard Worker
22*76559068SAndroid Build Coastguard Worker namespace std {
23*76559068SAndroid Build Coastguard Worker struct nothrow_t {};
24*76559068SAndroid Build Coastguard Worker enum class align_val_t : size_t {};
25*76559068SAndroid Build Coastguard Worker } // namespace std
26*76559068SAndroid Build Coastguard Worker
reportAllocation(void * ptr,size_t size)27*76559068SAndroid Build Coastguard Worker static void reportAllocation(void *ptr, size_t size) {
28*76559068SAndroid Build Coastguard Worker if (SCUDO_ENABLE_HOOKS)
29*76559068SAndroid Build Coastguard Worker if (__scudo_allocate_hook && ptr)
30*76559068SAndroid Build Coastguard Worker __scudo_allocate_hook(ptr, size);
31*76559068SAndroid Build Coastguard Worker }
reportDeallocation(void * ptr)32*76559068SAndroid Build Coastguard Worker static void reportDeallocation(void *ptr) {
33*76559068SAndroid Build Coastguard Worker if (SCUDO_ENABLE_HOOKS)
34*76559068SAndroid Build Coastguard Worker if (__scudo_deallocate_hook)
35*76559068SAndroid Build Coastguard Worker __scudo_deallocate_hook(ptr);
36*76559068SAndroid Build Coastguard Worker }
37*76559068SAndroid Build Coastguard Worker
operator new(size_t size)38*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new(size_t size) {
39*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New);
40*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
41*76559068SAndroid Build Coastguard Worker return Ptr;
42*76559068SAndroid Build Coastguard Worker }
operator new[](size_t size)43*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new[](size_t size) {
44*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray);
45*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
46*76559068SAndroid Build Coastguard Worker return Ptr;
47*76559068SAndroid Build Coastguard Worker }
operator new(size_t size,std::nothrow_t const &)48*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new(size_t size,
49*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
50*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New);
51*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
52*76559068SAndroid Build Coastguard Worker return Ptr;
53*76559068SAndroid Build Coastguard Worker }
operator new[](size_t size,std::nothrow_t const &)54*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new[](size_t size,
55*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
56*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray);
57*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
58*76559068SAndroid Build Coastguard Worker return Ptr;
59*76559068SAndroid Build Coastguard Worker }
operator new(size_t size,std::align_val_t align)60*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new(size_t size, std::align_val_t align) {
61*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New,
62*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
63*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
64*76559068SAndroid Build Coastguard Worker return Ptr;
65*76559068SAndroid Build Coastguard Worker }
operator new[](size_t size,std::align_val_t align)66*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align) {
67*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray,
68*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
69*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
70*76559068SAndroid Build Coastguard Worker return Ptr;
71*76559068SAndroid Build Coastguard Worker }
operator new(size_t size,std::align_val_t align,std::nothrow_t const &)72*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new(size_t size, std::align_val_t align,
73*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
74*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New,
75*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
76*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
77*76559068SAndroid Build Coastguard Worker return Ptr;
78*76559068SAndroid Build Coastguard Worker }
operator new[](size_t size,std::align_val_t align,std::nothrow_t const &)79*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align,
80*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
81*76559068SAndroid Build Coastguard Worker void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray,
82*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
83*76559068SAndroid Build Coastguard Worker reportAllocation(Ptr, size);
84*76559068SAndroid Build Coastguard Worker return Ptr;
85*76559068SAndroid Build Coastguard Worker }
86*76559068SAndroid Build Coastguard Worker
operator delete(void * ptr)87*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete(void *ptr) NOEXCEPT {
88*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
89*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::New);
90*76559068SAndroid Build Coastguard Worker }
operator delete[](void * ptr)91*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete[](void *ptr) NOEXCEPT {
92*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
93*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray);
94*76559068SAndroid Build Coastguard Worker }
operator delete(void * ptr,std::nothrow_t const &)95*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete(void *ptr,
96*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
97*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
98*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::New);
99*76559068SAndroid Build Coastguard Worker }
operator delete[](void * ptr,std::nothrow_t const &)100*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete[](void *ptr,
101*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
102*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
103*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray);
104*76559068SAndroid Build Coastguard Worker }
operator delete(void * ptr,size_t size)105*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete(void *ptr, size_t size) NOEXCEPT {
106*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
107*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size);
108*76559068SAndroid Build Coastguard Worker }
operator delete[](void * ptr,size_t size)109*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete[](void *ptr, size_t size) NOEXCEPT {
110*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
111*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size);
112*76559068SAndroid Build Coastguard Worker }
operator delete(void * ptr,std::align_val_t align)113*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete(void *ptr,
114*76559068SAndroid Build Coastguard Worker std::align_val_t align) NOEXCEPT {
115*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
116*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0,
117*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
118*76559068SAndroid Build Coastguard Worker }
operator delete[](void * ptr,std::align_val_t align)119*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete[](void *ptr,
120*76559068SAndroid Build Coastguard Worker std::align_val_t align) NOEXCEPT {
121*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
122*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
123*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
124*76559068SAndroid Build Coastguard Worker }
operator delete(void * ptr,std::align_val_t align,std::nothrow_t const &)125*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align,
126*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
127*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
128*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0,
129*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
130*76559068SAndroid Build Coastguard Worker }
operator delete[](void * ptr,std::align_val_t align,std::nothrow_t const &)131*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete[](void *ptr, std::align_val_t align,
132*76559068SAndroid Build Coastguard Worker std::nothrow_t const &) NOEXCEPT {
133*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
134*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
135*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
136*76559068SAndroid Build Coastguard Worker }
operator delete(void * ptr,size_t size,std::align_val_t align)137*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete(void *ptr, size_t size,
138*76559068SAndroid Build Coastguard Worker std::align_val_t align) NOEXCEPT {
139*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
140*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size,
141*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
142*76559068SAndroid Build Coastguard Worker }
operator delete[](void * ptr,size_t size,std::align_val_t align)143*76559068SAndroid Build Coastguard Worker INTERFACE WEAK void operator delete[](void *ptr, size_t size,
144*76559068SAndroid Build Coastguard Worker std::align_val_t align) NOEXCEPT {
145*76559068SAndroid Build Coastguard Worker reportDeallocation(ptr);
146*76559068SAndroid Build Coastguard Worker Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size,
147*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(align));
148*76559068SAndroid Build Coastguard Worker }
149*76559068SAndroid Build Coastguard Worker
150*76559068SAndroid Build Coastguard Worker #endif // !SCUDO_ANDROID || !_BIONIC
151