| //===-- wrappers_cpp.cpp ----------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "platform.h" |
| |
| // Skip this compilation unit if compiled as part of Bionic. |
| #if !SCUDO_ANDROID || !_BIONIC |
| |
| #include "allocator_config.h" |
| #include "internal_defs.h" |
| #include "platform.h" |
| #include "scudo/interface.h" |
| #include "wrappers_c.h" |
| |
| #include <stdint.h> |
| |
| namespace std { |
| struct nothrow_t {}; |
| enum class align_val_t : size_t {}; |
| } // namespace std |
| |
| static void reportAllocation(void *ptr, size_t size) { |
| if (SCUDO_ENABLE_HOOKS) |
| if (__scudo_allocate_hook && ptr) |
| __scudo_allocate_hook(ptr, size); |
| } |
| static void reportDeallocation(void *ptr) { |
| if (SCUDO_ENABLE_HOOKS) |
| if (__scudo_deallocate_hook) |
| __scudo_deallocate_hook(ptr); |
| } |
| |
| INTERFACE WEAK void *operator new(size_t size) { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new[](size_t size) { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new(size_t size, |
| std::nothrow_t const &) NOEXCEPT { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new[](size_t size, |
| std::nothrow_t const &) NOEXCEPT { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new(size_t size, std::align_val_t align) { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New, |
| static_cast<scudo::uptr>(align)); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align) { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray, |
| static_cast<scudo::uptr>(align)); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new(size_t size, std::align_val_t align, |
| std::nothrow_t const &) NOEXCEPT { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::New, |
| static_cast<scudo::uptr>(align)); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| INTERFACE WEAK void *operator new[](size_t size, std::align_val_t align, |
| std::nothrow_t const &) NOEXCEPT { |
| void *Ptr = Allocator.allocate(size, scudo::Chunk::Origin::NewArray, |
| static_cast<scudo::uptr>(align)); |
| reportAllocation(Ptr, size); |
| return Ptr; |
| } |
| |
| INTERFACE WEAK void operator delete(void *ptr) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::New); |
| } |
| INTERFACE WEAK void operator delete[](void *ptr) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray); |
| } |
| INTERFACE WEAK void operator delete(void *ptr, |
| std::nothrow_t const &) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::New); |
| } |
| INTERFACE WEAK void operator delete[](void *ptr, |
| std::nothrow_t const &) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray); |
| } |
| INTERFACE WEAK void operator delete(void *ptr, size_t size) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size); |
| } |
| INTERFACE WEAK void operator delete[](void *ptr, size_t size) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size); |
| } |
| INTERFACE WEAK void operator delete(void *ptr, |
| std::align_val_t align) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0, |
| static_cast<scudo::uptr>(align)); |
| } |
| INTERFACE WEAK void operator delete[](void *ptr, |
| std::align_val_t align) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0, |
| static_cast<scudo::uptr>(align)); |
| } |
| INTERFACE WEAK void operator delete(void *ptr, std::align_val_t align, |
| std::nothrow_t const &) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::New, 0, |
| static_cast<scudo::uptr>(align)); |
| } |
| INTERFACE WEAK void operator delete[](void *ptr, std::align_val_t align, |
| std::nothrow_t const &) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, 0, |
| static_cast<scudo::uptr>(align)); |
| } |
| INTERFACE WEAK void operator delete(void *ptr, size_t size, |
| std::align_val_t align) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::New, size, |
| static_cast<scudo::uptr>(align)); |
| } |
| INTERFACE WEAK void operator delete[](void *ptr, size_t size, |
| std::align_val_t align) NOEXCEPT { |
| reportDeallocation(ptr); |
| Allocator.deallocate(ptr, scudo::Chunk::Origin::NewArray, size, |
| static_cast<scudo::uptr>(align)); |
| } |
| |
| #endif // !SCUDO_ANDROID || !_BIONIC |