• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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