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