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