• 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_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