1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifdef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SHIM_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
6 #error This header is meant to be included only once by allocator_shim.cc
7 #endif
8
9 #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_SHIM_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
10 #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_SHIM_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
11
12 // Preempt the default new/delete C++ symbols so they call the shim entry
13 // points. This file is strongly inspired by tcmalloc's
14 // libc_override_redefine.h.
15
16 #include <new>
17
18 #include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
19 #include "base/allocator/partition_allocator/shim/allocator_shim_internals.h"
20 #include "build/build_config.h"
21
22 #if !BUILDFLAG(IS_APPLE)
23 #define SHIM_CPP_SYMBOLS_EXPORT SHIM_ALWAYS_EXPORT
24 #else
25 // On Apple OSes, prefer not exporting these symbols (as this reverts to the
26 // default behavior, they are still exported in e.g. component builds). This is
27 // partly due to intentional limits on exported symbols in the main library, but
28 // it is also needless, since no library used on macOS imports these.
29 //
30 // TODO(lizeb): It may not be necessary anywhere to export these.
31 #define SHIM_CPP_SYMBOLS_EXPORT PA_NOINLINE
32 #endif
33
new(size_t size)34 SHIM_CPP_SYMBOLS_EXPORT void* operator new(size_t size) {
35 return ShimCppNew(size);
36 }
37
delete(void * p)38 SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p) __THROW {
39 ShimCppDelete(p);
40 }
41
42 SHIM_CPP_SYMBOLS_EXPORT void* operator new[](size_t size) {
43 return ShimCppNew(size);
44 }
45
46 SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p) __THROW {
47 ShimCppDelete(p);
48 }
49
new(size_t size,const std::nothrow_t &)50 SHIM_CPP_SYMBOLS_EXPORT void* operator new(size_t size,
51 const std::nothrow_t&) __THROW {
52 return ShimCppNewNoThrow(size);
53 }
54
55 SHIM_CPP_SYMBOLS_EXPORT void* operator new[](size_t size,
56 const std::nothrow_t&) __THROW {
57 return ShimCppNewNoThrow(size);
58 }
59
delete(void * p,const std::nothrow_t &)60 SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
61 const std::nothrow_t&) __THROW {
62 ShimCppDelete(p);
63 }
64
65 SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
66 const std::nothrow_t&) __THROW {
67 ShimCppDelete(p);
68 }
69
delete(void * p,size_t)70 SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p, size_t) __THROW {
71 ShimCppDelete(p);
72 }
73
74 SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p, size_t) __THROW {
75 ShimCppDelete(p);
76 }
77
new(std::size_t size,std::align_val_t alignment)78 SHIM_CPP_SYMBOLS_EXPORT void* operator new(std::size_t size,
79 std::align_val_t alignment) {
80 return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
81 }
82
new(std::size_t size,std::align_val_t alignment,const std::nothrow_t &)83 SHIM_CPP_SYMBOLS_EXPORT void* operator new(std::size_t size,
84 std::align_val_t alignment,
85 const std::nothrow_t&) __THROW {
86 return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
87 }
88
delete(void * p,std::align_val_t)89 SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
90 std::align_val_t) __THROW {
91 ShimCppDelete(p);
92 }
93
delete(void * p,std::size_t size,std::align_val_t)94 SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
95 std::size_t size,
96 std::align_val_t) __THROW {
97 ShimCppDelete(p);
98 }
99
delete(void * p,std::align_val_t,const std::nothrow_t &)100 SHIM_CPP_SYMBOLS_EXPORT void operator delete(void* p,
101 std::align_val_t,
102 const std::nothrow_t&) __THROW {
103 ShimCppDelete(p);
104 }
105
106 SHIM_CPP_SYMBOLS_EXPORT void* operator new[](std::size_t size,
107 std::align_val_t alignment) {
108 return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
109 }
110
111 SHIM_CPP_SYMBOLS_EXPORT void* operator new[](std::size_t size,
112 std::align_val_t alignment,
113 const std::nothrow_t&) __THROW {
114 return ShimCppAlignedNew(size, static_cast<size_t>(alignment));
115 }
116
117 SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
118 std::align_val_t) __THROW {
119 ShimCppDelete(p);
120 }
121
122 SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
123 std::size_t size,
124 std::align_val_t) __THROW {
125 ShimCppDelete(p);
126 }
127
128 SHIM_CPP_SYMBOLS_EXPORT void operator delete[](void* p,
129 std::align_val_t,
130 const std::nothrow_t&) __THROW {
131 ShimCppDelete(p);
132 }
133
134 #endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_SHIM_ALLOCATOR_SHIM_OVERRIDE_CPP_SYMBOLS_H_
135