1 //===--------------------------- new.cpp ----------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include <stdlib.h> 10 11 #include "new" 12 #include "include/atomic_support.h" 13 14 #if defined(_LIBCPP_ABI_MICROSOFT) 15 # if !defined(_LIBCPP_ABI_VCRUNTIME) 16 # include "support/runtime/new_handler_fallback.ipp" 17 # endif 18 #elif defined(LIBCXX_BUILDING_LIBCXXABI) 19 # include <cxxabi.h> 20 #elif defined(LIBCXXRT) 21 # include <cxxabi.h> 22 # include "support/runtime/new_handler_fallback.ipp" 23 #elif defined(__GLIBCXX__) 24 // nothing to do 25 #else 26 # include "support/runtime/new_handler_fallback.ipp" 27 #endif 28 29 namespace std 30 { 31 32 #ifndef __GLIBCXX__ 33 const nothrow_t nothrow{}; 34 #endif 35 36 #ifndef LIBSTDCXX 37 38 void 39 __throw_bad_alloc() 40 { 41 #ifndef _LIBCPP_NO_EXCEPTIONS 42 throw bad_alloc(); 43 #else 44 _VSTD::abort(); 45 #endif 46 } 47 48 #endif // !LIBSTDCXX 49 50 } // std 51 52 #if !defined(__GLIBCXX__) && \ 53 !defined(_LIBCPP_ABI_VCRUNTIME) && \ 54 !defined(_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS) 55 56 // Implement all new and delete operators as weak definitions 57 // in this shared library, so that they can be overridden by programs 58 // that define non-weak copies of the functions. 59 60 _LIBCPP_WEAK 61 void * 62 operator new(std::size_t size) _THROW_BAD_ALLOC 63 { 64 if (size == 0) 65 size = 1; 66 void* p; 67 while ((p = ::malloc(size)) == 0) 68 { 69 // If malloc fails and there is a new_handler, 70 // call it to try free up memory. 71 std::new_handler nh = std::get_new_handler(); 72 if (nh) 73 nh(); 74 else 75 #ifndef _LIBCPP_NO_EXCEPTIONS 76 throw std::bad_alloc(); 77 #else 78 break; 79 #endif 80 } 81 return p; 82 } 83 84 _LIBCPP_WEAK 85 void* 86 operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 87 { 88 void* p = 0; 89 #ifndef _LIBCPP_NO_EXCEPTIONS 90 try 91 { 92 #endif // _LIBCPP_NO_EXCEPTIONS 93 p = ::operator new(size); 94 #ifndef _LIBCPP_NO_EXCEPTIONS 95 } 96 catch (...) 97 { 98 } 99 #endif // _LIBCPP_NO_EXCEPTIONS 100 return p; 101 } 102 103 _LIBCPP_WEAK 104 void* 105 operator new[](size_t size) _THROW_BAD_ALLOC 106 { 107 return ::operator new(size); 108 } 109 110 _LIBCPP_WEAK 111 void* 112 operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 113 { 114 void* p = 0; 115 #ifndef _LIBCPP_NO_EXCEPTIONS 116 try 117 { 118 #endif // _LIBCPP_NO_EXCEPTIONS 119 p = ::operator new[](size); 120 #ifndef _LIBCPP_NO_EXCEPTIONS 121 } 122 catch (...) 123 { 124 } 125 #endif // _LIBCPP_NO_EXCEPTIONS 126 return p; 127 } 128 129 _LIBCPP_WEAK 130 void 131 operator delete(void* ptr) _NOEXCEPT 132 { 133 if (ptr) 134 ::free(ptr); 135 } 136 137 _LIBCPP_WEAK 138 void 139 operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 140 { 141 ::operator delete(ptr); 142 } 143 144 _LIBCPP_WEAK 145 void 146 operator delete(void* ptr, size_t) _NOEXCEPT 147 { 148 ::operator delete(ptr); 149 } 150 151 _LIBCPP_WEAK 152 void 153 operator delete[] (void* ptr) _NOEXCEPT 154 { 155 ::operator delete(ptr); 156 } 157 158 _LIBCPP_WEAK 159 void 160 operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 161 { 162 ::operator delete[](ptr); 163 } 164 165 _LIBCPP_WEAK 166 void 167 operator delete[] (void* ptr, size_t) _NOEXCEPT 168 { 169 ::operator delete[](ptr); 170 } 171 172 #if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) 173 174 _LIBCPP_WEAK 175 void * 176 operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC 177 { 178 if (size == 0) 179 size = 1; 180 if (static_cast<size_t>(alignment) < sizeof(void*)) 181 alignment = std::align_val_t(sizeof(void*)); 182 void* p; 183 #if defined(_LIBCPP_MSVCRT_LIKE) 184 while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr) 185 #else 186 while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0) 187 #endif 188 { 189 // If posix_memalign fails and there is a new_handler, 190 // call it to try free up memory. 191 std::new_handler nh = std::get_new_handler(); 192 if (nh) 193 nh(); 194 else { 195 #ifndef _LIBCPP_NO_EXCEPTIONS 196 throw std::bad_alloc(); 197 #else 198 p = nullptr; // posix_memalign doesn't initialize 'p' on failure 199 break; 200 #endif 201 } 202 } 203 return p; 204 } 205 206 _LIBCPP_WEAK 207 void* 208 operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 209 { 210 void* p = 0; 211 #ifndef _LIBCPP_NO_EXCEPTIONS 212 try 213 { 214 #endif // _LIBCPP_NO_EXCEPTIONS 215 p = ::operator new(size, alignment); 216 #ifndef _LIBCPP_NO_EXCEPTIONS 217 } 218 catch (...) 219 { 220 } 221 #endif // _LIBCPP_NO_EXCEPTIONS 222 return p; 223 } 224 225 _LIBCPP_WEAK 226 void* 227 operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC 228 { 229 return ::operator new(size, alignment); 230 } 231 232 _LIBCPP_WEAK 233 void* 234 operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 235 { 236 void* p = 0; 237 #ifndef _LIBCPP_NO_EXCEPTIONS 238 try 239 { 240 #endif // _LIBCPP_NO_EXCEPTIONS 241 p = ::operator new[](size, alignment); 242 #ifndef _LIBCPP_NO_EXCEPTIONS 243 } 244 catch (...) 245 { 246 } 247 #endif // _LIBCPP_NO_EXCEPTIONS 248 return p; 249 } 250 251 _LIBCPP_WEAK 252 void 253 operator delete(void* ptr, std::align_val_t) _NOEXCEPT 254 { 255 if (ptr) 256 #if defined(_LIBCPP_MSVCRT_LIKE) 257 ::_aligned_free(ptr); 258 #else 259 ::free(ptr); 260 #endif 261 } 262 263 _LIBCPP_WEAK 264 void 265 operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 266 { 267 ::operator delete(ptr, alignment); 268 } 269 270 _LIBCPP_WEAK 271 void 272 operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT 273 { 274 ::operator delete(ptr, alignment); 275 } 276 277 _LIBCPP_WEAK 278 void 279 operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT 280 { 281 ::operator delete(ptr, alignment); 282 } 283 284 _LIBCPP_WEAK 285 void 286 operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 287 { 288 ::operator delete[](ptr, alignment); 289 } 290 291 _LIBCPP_WEAK 292 void 293 operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT 294 { 295 ::operator delete[](ptr, alignment); 296 } 297 298 #endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION 299 #endif // !__GLIBCXX__ && !_LIBCPP_ABI_VCRUNTIME && !_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS 300