16d46ebefSNico Weber //===-- wrappers_cpp.cpp ----------------------------------------*- C++ -*-===//
26d46ebefSNico Weber //
36d46ebefSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46d46ebefSNico Weber // See https://llvm.org/LICENSE.txt for license information.
56d46ebefSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66d46ebefSNico Weber //
76d46ebefSNico Weber //===----------------------------------------------------------------------===//
86d46ebefSNico Weber 
96d46ebefSNico Weber #include "platform.h"
106d46ebefSNico Weber 
116d46ebefSNico Weber // Skip this compilation unit if compiled as part of Bionic.
126d46ebefSNico Weber #if !SCUDO_ANDROID || !_BIONIC
136d46ebefSNico Weber 
146d46ebefSNico Weber #include "allocator_config.h"
15*6ba8c8abSDominic Chen #include "wrappers_c.h"
166d46ebefSNico Weber 
176d46ebefSNico Weber #include <stdint.h>
186d46ebefSNico Weber 
196d46ebefSNico Weber namespace std {
206d46ebefSNico Weber struct nothrow_t {};
216d46ebefSNico Weber enum class align_val_t : size_t {};
226d46ebefSNico Weber } // namespace std
236d46ebefSNico Weber 
246d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size) {
25681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New);
266d46ebefSNico Weber }
276d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size) {
28681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray);
296d46ebefSNico Weber }
306d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size,
316d46ebefSNico Weber                                   std::nothrow_t const &) NOEXCEPT {
32681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New);
336d46ebefSNico Weber }
346d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size,
356d46ebefSNico Weber                                     std::nothrow_t const &) NOEXCEPT {
36681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray);
376d46ebefSNico Weber }
386d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size, std::align_val_t align) {
39681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New,
406d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
416d46ebefSNico Weber }
426d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align) {
43681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray,
446d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
456d46ebefSNico Weber }
466d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size, std::align_val_t align,
476d46ebefSNico Weber                                   std::nothrow_t const &) NOEXCEPT {
48681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New,
496d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
506d46ebefSNico Weber }
516d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align,
526d46ebefSNico Weber                                     std::nothrow_t const &) NOEXCEPT {
53681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray,
546d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
556d46ebefSNico Weber }
566d46ebefSNico Weber 
576d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr)NOEXCEPT {
58681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New);
596d46ebefSNico Weber }
606d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr) NOEXCEPT {
61681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray);
626d46ebefSNico Weber }
636d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::nothrow_t const &)NOEXCEPT {
64681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New);
656d46ebefSNico Weber }
666d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr,
676d46ebefSNico Weber                                       std::nothrow_t const &) NOEXCEPT {
68681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray);
696d46ebefSNico Weber }
706d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, size_t size)NOEXCEPT {
71681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size);
726d46ebefSNico Weber }
736d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, size_t size) NOEXCEPT {
74681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size);
756d46ebefSNico Weber }
766d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align)NOEXCEPT {
77681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0,
786d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
796d46ebefSNico Weber }
806d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr,
816d46ebefSNico Weber                                       std::align_val_t align) NOEXCEPT {
82681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
836d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
846d46ebefSNico Weber }
856d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align,
866d46ebefSNico Weber                                     std::nothrow_t const &)NOEXCEPT {
87681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0,
886d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
896d46ebefSNico Weber }
906d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, std::align_val_t align,
916d46ebefSNico Weber                                       std::nothrow_t const &) NOEXCEPT {
92681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
936d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
946d46ebefSNico Weber }
956d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, size_t size,
966d46ebefSNico Weber                                     std::align_val_t align)NOEXCEPT {
97681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size,
986d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
996d46ebefSNico Weber }
1006d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, size_t size,
1016d46ebefSNico Weber                                       std::align_val_t align) NOEXCEPT {
102681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size,
1036d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
1046d46ebefSNico Weber }
1056d46ebefSNico Weber 
1066d46ebefSNico Weber #endif // !SCUDO_ANDROID || !_BIONIC
107