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"
156d46ebefSNico Weber 
166d46ebefSNico Weber #include <stdint.h>
176d46ebefSNico Weber 
189ef6faf4SKostya Kortchinsky extern "C" void malloc_postinit();
19*681773f2SPeter Collingbourne extern HIDDEN scudo::Allocator<scudo::Config, malloc_postinit> Allocator;
206d46ebefSNico Weber 
216d46ebefSNico Weber namespace std {
226d46ebefSNico Weber struct nothrow_t {};
236d46ebefSNico Weber enum class align_val_t : size_t {};
246d46ebefSNico Weber } // namespace std
256d46ebefSNico Weber 
266d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size) {
27*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New);
286d46ebefSNico Weber }
296d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size) {
30*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray);
316d46ebefSNico Weber }
326d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size,
336d46ebefSNico Weber                                   std::nothrow_t const &) NOEXCEPT {
34*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New);
356d46ebefSNico Weber }
366d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size,
376d46ebefSNico Weber                                     std::nothrow_t const &) NOEXCEPT {
38*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray);
396d46ebefSNico Weber }
406d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size, std::align_val_t align) {
41*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New,
426d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
436d46ebefSNico Weber }
446d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align) {
45*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray,
466d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
476d46ebefSNico Weber }
486d46ebefSNico Weber INTERFACE WEAK void *operator new(size_t size, std::align_val_t align,
496d46ebefSNico Weber                                   std::nothrow_t const &) NOEXCEPT {
50*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::New,
516d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
526d46ebefSNico Weber }
536d46ebefSNico Weber INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align,
546d46ebefSNico Weber                                     std::nothrow_t const &) NOEXCEPT {
55*681773f2SPeter Collingbourne   return Allocator.allocate(size, scudo::Chunk::Origin::NewArray,
566d46ebefSNico Weber                             static_cast<scudo::uptr>(align));
576d46ebefSNico Weber }
586d46ebefSNico Weber 
596d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr)NOEXCEPT {
60*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New);
616d46ebefSNico Weber }
626d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr) NOEXCEPT {
63*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray);
646d46ebefSNico Weber }
656d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::nothrow_t const &)NOEXCEPT {
66*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New);
676d46ebefSNico Weber }
686d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr,
696d46ebefSNico Weber                                       std::nothrow_t const &) NOEXCEPT {
70*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray);
716d46ebefSNico Weber }
726d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, size_t size)NOEXCEPT {
73*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size);
746d46ebefSNico Weber }
756d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, size_t size) NOEXCEPT {
76*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size);
776d46ebefSNico Weber }
786d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align)NOEXCEPT {
79*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0,
806d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
816d46ebefSNico Weber }
826d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr,
836d46ebefSNico Weber                                       std::align_val_t align) NOEXCEPT {
84*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
856d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
866d46ebefSNico Weber }
876d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align,
886d46ebefSNico Weber                                     std::nothrow_t const &)NOEXCEPT {
89*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0,
906d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
916d46ebefSNico Weber }
926d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, std::align_val_t align,
936d46ebefSNico Weber                                       std::nothrow_t const &) NOEXCEPT {
94*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0,
956d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
966d46ebefSNico Weber }
976d46ebefSNico Weber INTERFACE WEAK void operator delete(void *ptr, size_t size,
986d46ebefSNico Weber                                     std::align_val_t align)NOEXCEPT {
99*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size,
1006d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
1016d46ebefSNico Weber }
1026d46ebefSNico Weber INTERFACE WEAK void operator delete[](void *ptr, size_t size,
1036d46ebefSNico Weber                                       std::align_val_t align) NOEXCEPT {
104*681773f2SPeter Collingbourne   Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size,
1056d46ebefSNico Weber                        static_cast<scudo::uptr>(align));
1066d46ebefSNico Weber }
1076d46ebefSNico Weber 
1086d46ebefSNico Weber #endif // !SCUDO_ANDROID || !_BIONIC
109