Path: blob/main/contrib/llvm-project/compiler-rt/lib/memprof/memprof_new_delete.cpp
35236 views
//===-- memprof_interceptors.cpp -----------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is a part of MemProfiler, a memory profiler.9//10// Interceptors for operators new and delete.11//===----------------------------------------------------------------------===//1213#include "memprof_allocator.h"14#include "memprof_internal.h"15#include "memprof_stack.h"16#include "sanitizer_common/sanitizer_allocator_report.h"1718#include "interception/interception.h"1920#include <stddef.h>2122#define CXX_OPERATOR_ATTRIBUTE INTERCEPTOR_ATTRIBUTE2324using namespace __memprof;2526// Fake std::nothrow_t and std::align_val_t to avoid including <new>.27namespace std {28struct nothrow_t {};29enum class align_val_t : size_t {};30} // namespace std3132#define OPERATOR_NEW_BODY(type, nothrow) \33GET_STACK_TRACE_MALLOC; \34void *res = memprof_memalign(0, size, &stack, type); \35if (!nothrow && UNLIKELY(!res)) \36ReportOutOfMemory(size, &stack); \37return res;38#define OPERATOR_NEW_BODY_ALIGN(type, nothrow) \39GET_STACK_TRACE_MALLOC; \40void *res = memprof_memalign((uptr)align, size, &stack, type); \41if (!nothrow && UNLIKELY(!res)) \42ReportOutOfMemory(size, &stack); \43return res;4445CXX_OPERATOR_ATTRIBUTE46void *operator new(size_t size) {47OPERATOR_NEW_BODY(FROM_NEW, false /*nothrow*/);48}49CXX_OPERATOR_ATTRIBUTE50void *operator new[](size_t size) {51OPERATOR_NEW_BODY(FROM_NEW_BR, false /*nothrow*/);52}53CXX_OPERATOR_ATTRIBUTE54void *operator new(size_t size, std::nothrow_t const &) {55OPERATOR_NEW_BODY(FROM_NEW, true /*nothrow*/);56}57CXX_OPERATOR_ATTRIBUTE58void *operator new[](size_t size, std::nothrow_t const &) {59OPERATOR_NEW_BODY(FROM_NEW_BR, true /*nothrow*/);60}61CXX_OPERATOR_ATTRIBUTE62void *operator new(size_t size, std::align_val_t align) {63OPERATOR_NEW_BODY_ALIGN(FROM_NEW, false /*nothrow*/);64}65CXX_OPERATOR_ATTRIBUTE66void *operator new[](size_t size, std::align_val_t align) {67OPERATOR_NEW_BODY_ALIGN(FROM_NEW_BR, false /*nothrow*/);68}69CXX_OPERATOR_ATTRIBUTE70void *operator new(size_t size, std::align_val_t align,71std::nothrow_t const &) {72OPERATOR_NEW_BODY_ALIGN(FROM_NEW, true /*nothrow*/);73}74CXX_OPERATOR_ATTRIBUTE75void *operator new[](size_t size, std::align_val_t align,76std::nothrow_t const &) {77OPERATOR_NEW_BODY_ALIGN(FROM_NEW_BR, true /*nothrow*/);78}7980#define OPERATOR_DELETE_BODY(type) \81GET_STACK_TRACE_FREE; \82memprof_delete(ptr, 0, 0, &stack, type);8384#define OPERATOR_DELETE_BODY_SIZE(type) \85GET_STACK_TRACE_FREE; \86memprof_delete(ptr, size, 0, &stack, type);8788#define OPERATOR_DELETE_BODY_ALIGN(type) \89GET_STACK_TRACE_FREE; \90memprof_delete(ptr, 0, static_cast<uptr>(align), &stack, type);9192#define OPERATOR_DELETE_BODY_SIZE_ALIGN(type) \93GET_STACK_TRACE_FREE; \94memprof_delete(ptr, size, static_cast<uptr>(align), &stack, type);9596CXX_OPERATOR_ATTRIBUTE97void operator delete(void *ptr)NOEXCEPT { OPERATOR_DELETE_BODY(FROM_NEW); }98CXX_OPERATOR_ATTRIBUTE99void operator delete[](void *ptr) NOEXCEPT {100OPERATOR_DELETE_BODY(FROM_NEW_BR);101}102CXX_OPERATOR_ATTRIBUTE103void operator delete(void *ptr, std::nothrow_t const &) {104OPERATOR_DELETE_BODY(FROM_NEW);105}106CXX_OPERATOR_ATTRIBUTE107void operator delete[](void *ptr, std::nothrow_t const &) {108OPERATOR_DELETE_BODY(FROM_NEW_BR);109}110CXX_OPERATOR_ATTRIBUTE111void operator delete(void *ptr, size_t size)NOEXCEPT {112OPERATOR_DELETE_BODY_SIZE(FROM_NEW);113}114CXX_OPERATOR_ATTRIBUTE115void operator delete[](void *ptr, size_t size) NOEXCEPT {116OPERATOR_DELETE_BODY_SIZE(FROM_NEW_BR);117}118CXX_OPERATOR_ATTRIBUTE119void operator delete(void *ptr, std::align_val_t align)NOEXCEPT {120OPERATOR_DELETE_BODY_ALIGN(FROM_NEW);121}122CXX_OPERATOR_ATTRIBUTE123void operator delete[](void *ptr, std::align_val_t align) NOEXCEPT {124OPERATOR_DELETE_BODY_ALIGN(FROM_NEW_BR);125}126CXX_OPERATOR_ATTRIBUTE127void operator delete(void *ptr, std::align_val_t align,128std::nothrow_t const &) {129OPERATOR_DELETE_BODY_ALIGN(FROM_NEW);130}131CXX_OPERATOR_ATTRIBUTE132void operator delete[](void *ptr, std::align_val_t align,133std::nothrow_t const &) {134OPERATOR_DELETE_BODY_ALIGN(FROM_NEW_BR);135}136CXX_OPERATOR_ATTRIBUTE137void operator delete(void *ptr, size_t size, std::align_val_t align)NOEXCEPT {138OPERATOR_DELETE_BODY_SIZE_ALIGN(FROM_NEW);139}140CXX_OPERATOR_ATTRIBUTE141void operator delete[](void *ptr, size_t size,142std::align_val_t align) NOEXCEPT {143OPERATOR_DELETE_BODY_SIZE_ALIGN(FROM_NEW_BR);144}145146147