xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 492d7134)
13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===//
23e519524SHoward Hinnant //
35b08a8a4SHoward Hinnant //                     The LLVM Compiler Infrastructure
43e519524SHoward Hinnant //
5412dbebeSHoward Hinnant // This file is dual licensed under the MIT and the University of Illinois Open
6412dbebeSHoward Hinnant // Source Licenses. See LICENSE.TXT for details.
73e519524SHoward Hinnant //
83e519524SHoward Hinnant //===----------------------------------------------------------------------===//
93e519524SHoward Hinnant 
106e8ebb2cSMarshall Clow #define _LIBCPP_BUILDING_NEW
116e8ebb2cSMarshall Clow 
12111e0cbeSNick Kledzik #include <stdlib.h>
13111e0cbeSNick Kledzik 
143e519524SHoward Hinnant #include "new"
15fbfaec70SWeiming Zhao #include "include/atomic_support.h"
163e519524SHoward Hinnant 
17d22c9dc4SEric Fiselier #if defined(_LIBCPP_ABI_MICROSOFT)
18*492d7134SShoaib Meenai #if defined(_LIBCPP_NO_VCRUNTIME)
19*492d7134SShoaib Meenai #include "support/runtime/new_handler_fallback.ipp"
20*492d7134SShoaib Meenai #endif
21d22c9dc4SEric Fiselier #elif defined(LIBCXX_BUILDING_LIBCXXABI)
22128ba719SHoward Hinnant #include <cxxabi.h>
23d22c9dc4SEric Fiselier #elif defined(LIBCXXRT)
24d22c9dc4SEric Fiselier #include <cxxabi.h>
25d22c9dc4SEric Fiselier #include "support/runtime/new_handler_fallback.ipp"
26d22c9dc4SEric Fiselier #elif defined(__GLIBCXX__)
27d22c9dc4SEric Fiselier // nothing todo
28d22c9dc4SEric Fiselier #else
29637160c5SEric Fiselier # if defined(__APPLE__) && !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
30637160c5SEric Fiselier #   include <cxxabi.h> // FIXME: remove this once buildit is gone.
31637160c5SEric Fiselier # else
32d22c9dc4SEric Fiselier #   include "support/runtime/new_handler_fallback.ipp"
33d22c9dc4SEric Fiselier # endif
34637160c5SEric Fiselier #endif
352c9c6a57SHoward Hinnant 
36d22c9dc4SEric Fiselier namespace std
37d22c9dc4SEric Fiselier {
38111e0cbeSNick Kledzik 
39926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
40d22c9dc4SEric Fiselier const nothrow_t nothrow = {};
41d22c9dc4SEric Fiselier #endif
42d22c9dc4SEric Fiselier 
43d22c9dc4SEric Fiselier #ifndef LIBSTDCXX
44d22c9dc4SEric Fiselier 
45d22c9dc4SEric Fiselier void
46d22c9dc4SEric Fiselier __throw_bad_alloc()
47d22c9dc4SEric Fiselier {
48d22c9dc4SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
49d22c9dc4SEric Fiselier     throw bad_alloc();
50d22c9dc4SEric Fiselier #else
51d22c9dc4SEric Fiselier     _VSTD::abort();
52d22c9dc4SEric Fiselier #endif
53d22c9dc4SEric Fiselier }
54d22c9dc4SEric Fiselier 
55d22c9dc4SEric Fiselier #endif // !LIBSTDCXX
56d22c9dc4SEric Fiselier 
57d22c9dc4SEric Fiselier }  // std
58d22c9dc4SEric Fiselier 
59*492d7134SShoaib Meenai #if !defined(__GLIBCXX__) &&                                                   \
60*492d7134SShoaib Meenai     (!defined(_LIBCPP_ABI_MICROSOFT) || defined(_LIBCPP_NO_VCRUNTIME)) &&      \
613499263cSEric Fiselier     !defined(_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS)
62926aa5f4SPeter Collingbourne 
63111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
6410fe4209SEric Fiselier // in this shared library, so that they can be overridden by programs
65111e0cbeSNick Kledzik // that define non-weak copies of the functions.
66111e0cbeSNick Kledzik 
67dce4218dSShoaib Meenai _LIBCPP_WEAK
68111e0cbeSNick Kledzik void *
690ae4f23fSEric Fiselier operator new(std::size_t size) _THROW_BAD_ALLOC
70111e0cbeSNick Kledzik {
71111e0cbeSNick Kledzik     if (size == 0)
72111e0cbeSNick Kledzik         size = 1;
73111e0cbeSNick Kledzik     void* p;
74111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
75111e0cbeSNick Kledzik     {
76111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
77111e0cbeSNick Kledzik         // call it to try free up memory.
7875357bcdSHoward Hinnant         std::new_handler nh = std::get_new_handler();
79816cb897SHoward Hinnant         if (nh)
80816cb897SHoward Hinnant             nh();
81111e0cbeSNick Kledzik         else
8254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
83111e0cbeSNick Kledzik             throw std::bad_alloc();
8454b409fdSHoward Hinnant #else
8554b409fdSHoward Hinnant             break;
8654b409fdSHoward Hinnant #endif
87111e0cbeSNick Kledzik     }
88111e0cbeSNick Kledzik     return p;
89111e0cbeSNick Kledzik }
90111e0cbeSNick Kledzik 
91dce4218dSShoaib Meenai _LIBCPP_WEAK
92111e0cbeSNick Kledzik void*
9324a2ebe6SEric Fiselier operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
9424a2ebe6SEric Fiselier {
9524a2ebe6SEric Fiselier     void* p = 0;
9624a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
9724a2ebe6SEric Fiselier     try
9824a2ebe6SEric Fiselier     {
9924a2ebe6SEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
10024a2ebe6SEric Fiselier         p = ::operator new(size);
10124a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
10224a2ebe6SEric Fiselier     }
10324a2ebe6SEric Fiselier     catch (...)
10424a2ebe6SEric Fiselier     {
10524a2ebe6SEric Fiselier     }
10624a2ebe6SEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
10724a2ebe6SEric Fiselier     return p;
10824a2ebe6SEric Fiselier }
10924a2ebe6SEric Fiselier 
11024a2ebe6SEric Fiselier _LIBCPP_WEAK
11124a2ebe6SEric Fiselier void*
11224a2ebe6SEric Fiselier operator new[](size_t size) _THROW_BAD_ALLOC
11324a2ebe6SEric Fiselier {
11424a2ebe6SEric Fiselier     return ::operator new(size);
11524a2ebe6SEric Fiselier }
11624a2ebe6SEric Fiselier 
11724a2ebe6SEric Fiselier _LIBCPP_WEAK
11824a2ebe6SEric Fiselier void*
11924a2ebe6SEric Fiselier operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
12024a2ebe6SEric Fiselier {
12124a2ebe6SEric Fiselier     void* p = 0;
12224a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
12324a2ebe6SEric Fiselier     try
12424a2ebe6SEric Fiselier     {
12524a2ebe6SEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
12624a2ebe6SEric Fiselier         p = ::operator new[](size);
12724a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
12824a2ebe6SEric Fiselier     }
12924a2ebe6SEric Fiselier     catch (...)
13024a2ebe6SEric Fiselier     {
13124a2ebe6SEric Fiselier     }
13224a2ebe6SEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
13324a2ebe6SEric Fiselier     return p;
13424a2ebe6SEric Fiselier }
13524a2ebe6SEric Fiselier 
13624a2ebe6SEric Fiselier _LIBCPP_WEAK
13724a2ebe6SEric Fiselier void
13824a2ebe6SEric Fiselier operator delete(void* ptr) _NOEXCEPT
13924a2ebe6SEric Fiselier {
14024a2ebe6SEric Fiselier     if (ptr)
14124a2ebe6SEric Fiselier         ::free(ptr);
14224a2ebe6SEric Fiselier }
14324a2ebe6SEric Fiselier 
14424a2ebe6SEric Fiselier _LIBCPP_WEAK
14524a2ebe6SEric Fiselier void
14624a2ebe6SEric Fiselier operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
14724a2ebe6SEric Fiselier {
14824a2ebe6SEric Fiselier     ::operator delete(ptr);
14924a2ebe6SEric Fiselier }
15024a2ebe6SEric Fiselier 
15124a2ebe6SEric Fiselier _LIBCPP_WEAK
15224a2ebe6SEric Fiselier void
15324a2ebe6SEric Fiselier operator delete(void* ptr, size_t) _NOEXCEPT
15424a2ebe6SEric Fiselier {
15524a2ebe6SEric Fiselier     ::operator delete(ptr);
15624a2ebe6SEric Fiselier }
15724a2ebe6SEric Fiselier 
15824a2ebe6SEric Fiselier _LIBCPP_WEAK
15924a2ebe6SEric Fiselier void
16024a2ebe6SEric Fiselier operator delete[] (void* ptr) _NOEXCEPT
16124a2ebe6SEric Fiselier {
16224a2ebe6SEric Fiselier     ::operator delete(ptr);
16324a2ebe6SEric Fiselier }
16424a2ebe6SEric Fiselier 
16524a2ebe6SEric Fiselier _LIBCPP_WEAK
16624a2ebe6SEric Fiselier void
16724a2ebe6SEric Fiselier operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
16824a2ebe6SEric Fiselier {
16924a2ebe6SEric Fiselier     ::operator delete[](ptr);
17024a2ebe6SEric Fiselier }
17124a2ebe6SEric Fiselier 
17224a2ebe6SEric Fiselier _LIBCPP_WEAK
17324a2ebe6SEric Fiselier void
17424a2ebe6SEric Fiselier operator delete[] (void* ptr, size_t) _NOEXCEPT
17524a2ebe6SEric Fiselier {
17624a2ebe6SEric Fiselier     ::operator delete[](ptr);
17724a2ebe6SEric Fiselier }
17824a2ebe6SEric Fiselier 
179efea0451SEric Fiselier #if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
180efea0451SEric Fiselier 
18124a2ebe6SEric Fiselier _LIBCPP_WEAK
18224a2ebe6SEric Fiselier void *
1830ae4f23fSEric Fiselier operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
1840ae4f23fSEric Fiselier {
1850ae4f23fSEric Fiselier     if (size == 0)
1860ae4f23fSEric Fiselier         size = 1;
1870ae4f23fSEric Fiselier     if (static_cast<size_t>(alignment) < sizeof(void*))
1880ae4f23fSEric Fiselier       alignment = std::align_val_t(sizeof(void*));
1890ae4f23fSEric Fiselier     void* p;
1901ec02625SEric Fiselier #if defined(_LIBCPP_MSVCRT_LIKE)
1913e835372SEric Fiselier     while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
1923e835372SEric Fiselier #else
1930ae4f23fSEric Fiselier     while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
1943e835372SEric Fiselier #endif
1950ae4f23fSEric Fiselier     {
1960ae4f23fSEric Fiselier         // If posix_memalign fails and there is a new_handler,
1970ae4f23fSEric Fiselier         // call it to try free up memory.
1980ae4f23fSEric Fiselier         std::new_handler nh = std::get_new_handler();
1990ae4f23fSEric Fiselier         if (nh)
2000ae4f23fSEric Fiselier             nh();
2010ae4f23fSEric Fiselier         else {
2020ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
2030ae4f23fSEric Fiselier             throw std::bad_alloc();
2040ae4f23fSEric Fiselier #else
2050ae4f23fSEric Fiselier             p = nullptr; // posix_memalign doesn't initialize 'p' on failure
2060ae4f23fSEric Fiselier             break;
2070ae4f23fSEric Fiselier #endif
2080ae4f23fSEric Fiselier         }
2090ae4f23fSEric Fiselier     }
2100ae4f23fSEric Fiselier     return p;
2110ae4f23fSEric Fiselier }
2120ae4f23fSEric Fiselier 
213dce4218dSShoaib Meenai _LIBCPP_WEAK
2140ae4f23fSEric Fiselier void*
2150ae4f23fSEric Fiselier operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
2160ae4f23fSEric Fiselier {
2170ae4f23fSEric Fiselier     void* p = 0;
2180ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
2190ae4f23fSEric Fiselier     try
2200ae4f23fSEric Fiselier     {
2210ae4f23fSEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
2220ae4f23fSEric Fiselier         p = ::operator new(size, alignment);
2230ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
2240ae4f23fSEric Fiselier     }
2250ae4f23fSEric Fiselier     catch (...)
2260ae4f23fSEric Fiselier     {
2270ae4f23fSEric Fiselier     }
2280ae4f23fSEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
2290ae4f23fSEric Fiselier     return p;
2300ae4f23fSEric Fiselier }
2310ae4f23fSEric Fiselier 
232dce4218dSShoaib Meenai _LIBCPP_WEAK
2330ae4f23fSEric Fiselier void*
2340ae4f23fSEric Fiselier operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
2350ae4f23fSEric Fiselier {
2360ae4f23fSEric Fiselier     return ::operator new(size, alignment);
2370ae4f23fSEric Fiselier }
2380ae4f23fSEric Fiselier 
239dce4218dSShoaib Meenai _LIBCPP_WEAK
2400ae4f23fSEric Fiselier void*
2410ae4f23fSEric Fiselier operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
2420ae4f23fSEric Fiselier {
2430ae4f23fSEric Fiselier     void* p = 0;
2440ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
2450ae4f23fSEric Fiselier     try
2460ae4f23fSEric Fiselier     {
2470ae4f23fSEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
2480ae4f23fSEric Fiselier         p = ::operator new[](size, alignment);
2490ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS
2500ae4f23fSEric Fiselier     }
2510ae4f23fSEric Fiselier     catch (...)
2520ae4f23fSEric Fiselier     {
2530ae4f23fSEric Fiselier     }
2540ae4f23fSEric Fiselier #endif  // _LIBCPP_NO_EXCEPTIONS
2550ae4f23fSEric Fiselier     return p;
2560ae4f23fSEric Fiselier }
2570ae4f23fSEric Fiselier 
258dce4218dSShoaib Meenai _LIBCPP_WEAK
259111e0cbeSNick Kledzik void
2600ae4f23fSEric Fiselier operator delete(void* ptr, std::align_val_t) _NOEXCEPT
2610ae4f23fSEric Fiselier {
2620ae4f23fSEric Fiselier     if (ptr)
2631ec02625SEric Fiselier #if defined(_LIBCPP_MSVCRT_LIKE)
2647ce92f73SShoaib Meenai         ::_aligned_free(ptr);
2657ce92f73SShoaib Meenai #else
2660ae4f23fSEric Fiselier         ::free(ptr);
2677ce92f73SShoaib Meenai #endif
2680ae4f23fSEric Fiselier }
2690ae4f23fSEric Fiselier 
270dce4218dSShoaib Meenai _LIBCPP_WEAK
2710ae4f23fSEric Fiselier void
2720ae4f23fSEric Fiselier operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
2730ae4f23fSEric Fiselier {
2740ae4f23fSEric Fiselier     ::operator delete(ptr, alignment);
2750ae4f23fSEric Fiselier }
2760ae4f23fSEric Fiselier 
277dce4218dSShoaib Meenai _LIBCPP_WEAK
2780ae4f23fSEric Fiselier void
2790ae4f23fSEric Fiselier operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
2800ae4f23fSEric Fiselier {
2810ae4f23fSEric Fiselier     ::operator delete(ptr, alignment);
2820ae4f23fSEric Fiselier }
2830ae4f23fSEric Fiselier 
284dce4218dSShoaib Meenai _LIBCPP_WEAK
2850ae4f23fSEric Fiselier void
2860ae4f23fSEric Fiselier operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
2870ae4f23fSEric Fiselier {
2880ae4f23fSEric Fiselier     ::operator delete(ptr, alignment);
2890ae4f23fSEric Fiselier }
2900ae4f23fSEric Fiselier 
291dce4218dSShoaib Meenai _LIBCPP_WEAK
2920ae4f23fSEric Fiselier void
2930ae4f23fSEric Fiselier operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
2940ae4f23fSEric Fiselier {
2950ae4f23fSEric Fiselier     ::operator delete[](ptr, alignment);
2960ae4f23fSEric Fiselier }
2970ae4f23fSEric Fiselier 
298dce4218dSShoaib Meenai _LIBCPP_WEAK
2990ae4f23fSEric Fiselier void
3000ae4f23fSEric Fiselier operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
3010ae4f23fSEric Fiselier {
3020ae4f23fSEric Fiselier     ::operator delete[](ptr, alignment);
3030ae4f23fSEric Fiselier }
3040ae4f23fSEric Fiselier 
305d22c9dc4SEric Fiselier #endif // !_LIBCPP_HAS_NO_ALIGNED_ALLOCATION
306*492d7134SShoaib Meenai #endif // !__GLIBCXX__ && (!_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME) && !_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS
307