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 10111e0cbeSNick Kledzik #include <stdlib.h> 11111e0cbeSNick Kledzik 123e519524SHoward Hinnant #include "new" 13fbfaec70SWeiming Zhao #include "include/atomic_support.h" 143e519524SHoward Hinnant 15d22c9dc4SEric Fiselier #if defined(_LIBCPP_ABI_MICROSOFT) 16492d7134SShoaib Meenai #if defined(_LIBCPP_NO_VCRUNTIME) 17492d7134SShoaib Meenai #include "support/runtime/new_handler_fallback.ipp" 18492d7134SShoaib Meenai #endif 19d22c9dc4SEric Fiselier #elif defined(LIBCXX_BUILDING_LIBCXXABI) 20128ba719SHoward Hinnant #include <cxxabi.h> 21d22c9dc4SEric Fiselier #elif defined(LIBCXXRT) 22d22c9dc4SEric Fiselier #include <cxxabi.h> 23d22c9dc4SEric Fiselier #include "support/runtime/new_handler_fallback.ipp" 24d22c9dc4SEric Fiselier #elif defined(__GLIBCXX__) 25d22c9dc4SEric Fiselier // nothing todo 26d22c9dc4SEric Fiselier #else 27637160c5SEric Fiselier # if defined(__APPLE__) && !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) 28637160c5SEric Fiselier # include <cxxabi.h> // FIXME: remove this once buildit is gone. 29637160c5SEric Fiselier # else 30d22c9dc4SEric Fiselier # include "support/runtime/new_handler_fallback.ipp" 31d22c9dc4SEric Fiselier # endif 32637160c5SEric Fiselier #endif 332c9c6a57SHoward Hinnant 34d22c9dc4SEric Fiselier namespace std 35d22c9dc4SEric Fiselier { 36111e0cbeSNick Kledzik 37926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 38d22c9dc4SEric Fiselier const nothrow_t nothrow = {}; 39d22c9dc4SEric Fiselier #endif 40d22c9dc4SEric Fiselier 41d22c9dc4SEric Fiselier #ifndef LIBSTDCXX 42d22c9dc4SEric Fiselier 43d22c9dc4SEric Fiselier void 44d22c9dc4SEric Fiselier __throw_bad_alloc() 45d22c9dc4SEric Fiselier { 46d22c9dc4SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 47d22c9dc4SEric Fiselier throw bad_alloc(); 48d22c9dc4SEric Fiselier #else 49d22c9dc4SEric Fiselier _VSTD::abort(); 50d22c9dc4SEric Fiselier #endif 51d22c9dc4SEric Fiselier } 52d22c9dc4SEric Fiselier 53d22c9dc4SEric Fiselier #endif // !LIBSTDCXX 54d22c9dc4SEric Fiselier 55d22c9dc4SEric Fiselier } // std 56d22c9dc4SEric Fiselier 57492d7134SShoaib Meenai #if !defined(__GLIBCXX__) && \ 58*42f9868cSEric Fiselier !defined(_LIBCPP_DEFER_NEW_TO_VCRUNTIME) && \ 593499263cSEric Fiselier !defined(_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS) 60926aa5f4SPeter Collingbourne 61111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 6210fe4209SEric Fiselier // in this shared library, so that they can be overridden by programs 63111e0cbeSNick Kledzik // that define non-weak copies of the functions. 64111e0cbeSNick Kledzik 65dce4218dSShoaib Meenai _LIBCPP_WEAK 66111e0cbeSNick Kledzik void * 670ae4f23fSEric Fiselier operator new(std::size_t size) _THROW_BAD_ALLOC 68111e0cbeSNick Kledzik { 69111e0cbeSNick Kledzik if (size == 0) 70111e0cbeSNick Kledzik size = 1; 71111e0cbeSNick Kledzik void* p; 72111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 73111e0cbeSNick Kledzik { 74111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 75111e0cbeSNick Kledzik // call it to try free up memory. 7675357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 77816cb897SHoward Hinnant if (nh) 78816cb897SHoward Hinnant nh(); 79111e0cbeSNick Kledzik else 8054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 81111e0cbeSNick Kledzik throw std::bad_alloc(); 8254b409fdSHoward Hinnant #else 8354b409fdSHoward Hinnant break; 8454b409fdSHoward Hinnant #endif 85111e0cbeSNick Kledzik } 86111e0cbeSNick Kledzik return p; 87111e0cbeSNick Kledzik } 88111e0cbeSNick Kledzik 89dce4218dSShoaib Meenai _LIBCPP_WEAK 90111e0cbeSNick Kledzik void* 9124a2ebe6SEric Fiselier operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 9224a2ebe6SEric Fiselier { 9324a2ebe6SEric Fiselier void* p = 0; 9424a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 9524a2ebe6SEric Fiselier try 9624a2ebe6SEric Fiselier { 9724a2ebe6SEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 9824a2ebe6SEric Fiselier p = ::operator new(size); 9924a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 10024a2ebe6SEric Fiselier } 10124a2ebe6SEric Fiselier catch (...) 10224a2ebe6SEric Fiselier { 10324a2ebe6SEric Fiselier } 10424a2ebe6SEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 10524a2ebe6SEric Fiselier return p; 10624a2ebe6SEric Fiselier } 10724a2ebe6SEric Fiselier 10824a2ebe6SEric Fiselier _LIBCPP_WEAK 10924a2ebe6SEric Fiselier void* 11024a2ebe6SEric Fiselier operator new[](size_t size) _THROW_BAD_ALLOC 11124a2ebe6SEric Fiselier { 11224a2ebe6SEric Fiselier return ::operator new(size); 11324a2ebe6SEric Fiselier } 11424a2ebe6SEric Fiselier 11524a2ebe6SEric Fiselier _LIBCPP_WEAK 11624a2ebe6SEric Fiselier void* 11724a2ebe6SEric Fiselier operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 11824a2ebe6SEric Fiselier { 11924a2ebe6SEric Fiselier void* p = 0; 12024a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 12124a2ebe6SEric Fiselier try 12224a2ebe6SEric Fiselier { 12324a2ebe6SEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 12424a2ebe6SEric Fiselier p = ::operator new[](size); 12524a2ebe6SEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 12624a2ebe6SEric Fiselier } 12724a2ebe6SEric Fiselier catch (...) 12824a2ebe6SEric Fiselier { 12924a2ebe6SEric Fiselier } 13024a2ebe6SEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 13124a2ebe6SEric Fiselier return p; 13224a2ebe6SEric Fiselier } 13324a2ebe6SEric Fiselier 13424a2ebe6SEric Fiselier _LIBCPP_WEAK 13524a2ebe6SEric Fiselier void 13624a2ebe6SEric Fiselier operator delete(void* ptr) _NOEXCEPT 13724a2ebe6SEric Fiselier { 13824a2ebe6SEric Fiselier ::free(ptr); 13924a2ebe6SEric Fiselier } 14024a2ebe6SEric Fiselier 14124a2ebe6SEric Fiselier _LIBCPP_WEAK 14224a2ebe6SEric Fiselier void 14324a2ebe6SEric Fiselier operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 14424a2ebe6SEric Fiselier { 14524a2ebe6SEric Fiselier ::operator delete(ptr); 14624a2ebe6SEric Fiselier } 14724a2ebe6SEric Fiselier 14824a2ebe6SEric Fiselier _LIBCPP_WEAK 14924a2ebe6SEric Fiselier void 15024a2ebe6SEric Fiselier operator delete(void* ptr, size_t) _NOEXCEPT 15124a2ebe6SEric Fiselier { 15224a2ebe6SEric Fiselier ::operator delete(ptr); 15324a2ebe6SEric Fiselier } 15424a2ebe6SEric Fiselier 15524a2ebe6SEric Fiselier _LIBCPP_WEAK 15624a2ebe6SEric Fiselier void 15724a2ebe6SEric Fiselier operator delete[] (void* ptr) _NOEXCEPT 15824a2ebe6SEric Fiselier { 15924a2ebe6SEric Fiselier ::operator delete(ptr); 16024a2ebe6SEric Fiselier } 16124a2ebe6SEric Fiselier 16224a2ebe6SEric Fiselier _LIBCPP_WEAK 16324a2ebe6SEric Fiselier void 16424a2ebe6SEric Fiselier operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 16524a2ebe6SEric Fiselier { 16624a2ebe6SEric Fiselier ::operator delete[](ptr); 16724a2ebe6SEric Fiselier } 16824a2ebe6SEric Fiselier 16924a2ebe6SEric Fiselier _LIBCPP_WEAK 17024a2ebe6SEric Fiselier void 17124a2ebe6SEric Fiselier operator delete[] (void* ptr, size_t) _NOEXCEPT 17224a2ebe6SEric Fiselier { 17324a2ebe6SEric Fiselier ::operator delete[](ptr); 17424a2ebe6SEric Fiselier } 17524a2ebe6SEric Fiselier 176*42f9868cSEric Fiselier #if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) 177efea0451SEric Fiselier 17824a2ebe6SEric Fiselier _LIBCPP_WEAK 17924a2ebe6SEric Fiselier void * 1800ae4f23fSEric Fiselier operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC 1810ae4f23fSEric Fiselier { 1820ae4f23fSEric Fiselier if (size == 0) 1830ae4f23fSEric Fiselier size = 1; 1840ae4f23fSEric Fiselier if (static_cast<size_t>(alignment) < sizeof(void*)) 1850ae4f23fSEric Fiselier alignment = std::align_val_t(sizeof(void*)); 1860ae4f23fSEric Fiselier void* p; 1871ec02625SEric Fiselier #if defined(_LIBCPP_MSVCRT_LIKE) 1883e835372SEric Fiselier while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr) 1893e835372SEric Fiselier #else 1900ae4f23fSEric Fiselier while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0) 1913e835372SEric Fiselier #endif 1920ae4f23fSEric Fiselier { 1930ae4f23fSEric Fiselier // If posix_memalign fails and there is a new_handler, 1940ae4f23fSEric Fiselier // call it to try free up memory. 1950ae4f23fSEric Fiselier std::new_handler nh = std::get_new_handler(); 1960ae4f23fSEric Fiselier if (nh) 1970ae4f23fSEric Fiselier nh(); 1980ae4f23fSEric Fiselier else { 1990ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 2000ae4f23fSEric Fiselier throw std::bad_alloc(); 2010ae4f23fSEric Fiselier #else 2020ae4f23fSEric Fiselier p = nullptr; // posix_memalign doesn't initialize 'p' on failure 2030ae4f23fSEric Fiselier break; 2040ae4f23fSEric Fiselier #endif 2050ae4f23fSEric Fiselier } 2060ae4f23fSEric Fiselier } 2070ae4f23fSEric Fiselier return p; 2080ae4f23fSEric Fiselier } 2090ae4f23fSEric Fiselier 210dce4218dSShoaib Meenai _LIBCPP_WEAK 2110ae4f23fSEric Fiselier void* 2120ae4f23fSEric Fiselier operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 2130ae4f23fSEric Fiselier { 2140ae4f23fSEric Fiselier void* p = 0; 2150ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 2160ae4f23fSEric Fiselier try 2170ae4f23fSEric Fiselier { 2180ae4f23fSEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 2190ae4f23fSEric Fiselier p = ::operator new(size, alignment); 2200ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 2210ae4f23fSEric Fiselier } 2220ae4f23fSEric Fiselier catch (...) 2230ae4f23fSEric Fiselier { 2240ae4f23fSEric Fiselier } 2250ae4f23fSEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 2260ae4f23fSEric Fiselier return p; 2270ae4f23fSEric Fiselier } 2280ae4f23fSEric Fiselier 229dce4218dSShoaib Meenai _LIBCPP_WEAK 2300ae4f23fSEric Fiselier void* 2310ae4f23fSEric Fiselier operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC 2320ae4f23fSEric Fiselier { 2330ae4f23fSEric Fiselier return ::operator new(size, alignment); 2340ae4f23fSEric Fiselier } 2350ae4f23fSEric Fiselier 236dce4218dSShoaib Meenai _LIBCPP_WEAK 2370ae4f23fSEric Fiselier void* 2380ae4f23fSEric Fiselier operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 2390ae4f23fSEric Fiselier { 2400ae4f23fSEric Fiselier void* p = 0; 2410ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 2420ae4f23fSEric Fiselier try 2430ae4f23fSEric Fiselier { 2440ae4f23fSEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 2450ae4f23fSEric Fiselier p = ::operator new[](size, alignment); 2460ae4f23fSEric Fiselier #ifndef _LIBCPP_NO_EXCEPTIONS 2470ae4f23fSEric Fiselier } 2480ae4f23fSEric Fiselier catch (...) 2490ae4f23fSEric Fiselier { 2500ae4f23fSEric Fiselier } 2510ae4f23fSEric Fiselier #endif // _LIBCPP_NO_EXCEPTIONS 2520ae4f23fSEric Fiselier return p; 2530ae4f23fSEric Fiselier } 2540ae4f23fSEric Fiselier 255dce4218dSShoaib Meenai _LIBCPP_WEAK 256111e0cbeSNick Kledzik void 2570ae4f23fSEric Fiselier operator delete(void* ptr, std::align_val_t) _NOEXCEPT 2580ae4f23fSEric Fiselier { 2591ec02625SEric Fiselier #if defined(_LIBCPP_MSVCRT_LIKE) 2607ce92f73SShoaib Meenai ::_aligned_free(ptr); 2617ce92f73SShoaib Meenai #else 2620ae4f23fSEric Fiselier ::free(ptr); 2637ce92f73SShoaib Meenai #endif 2640ae4f23fSEric Fiselier } 2650ae4f23fSEric Fiselier 266dce4218dSShoaib Meenai _LIBCPP_WEAK 2670ae4f23fSEric Fiselier void 2680ae4f23fSEric Fiselier operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 2690ae4f23fSEric Fiselier { 2700ae4f23fSEric Fiselier ::operator delete(ptr, alignment); 2710ae4f23fSEric Fiselier } 2720ae4f23fSEric Fiselier 273dce4218dSShoaib Meenai _LIBCPP_WEAK 2740ae4f23fSEric Fiselier void 2750ae4f23fSEric Fiselier operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT 2760ae4f23fSEric Fiselier { 2770ae4f23fSEric Fiselier ::operator delete(ptr, alignment); 2780ae4f23fSEric Fiselier } 2790ae4f23fSEric Fiselier 280dce4218dSShoaib Meenai _LIBCPP_WEAK 2810ae4f23fSEric Fiselier void 2820ae4f23fSEric Fiselier operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT 2830ae4f23fSEric Fiselier { 2840ae4f23fSEric Fiselier ::operator delete(ptr, alignment); 2850ae4f23fSEric Fiselier } 2860ae4f23fSEric Fiselier 287dce4218dSShoaib Meenai _LIBCPP_WEAK 2880ae4f23fSEric Fiselier void 2890ae4f23fSEric Fiselier operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT 2900ae4f23fSEric Fiselier { 2910ae4f23fSEric Fiselier ::operator delete[](ptr, alignment); 2920ae4f23fSEric Fiselier } 2930ae4f23fSEric Fiselier 294dce4218dSShoaib Meenai _LIBCPP_WEAK 2950ae4f23fSEric Fiselier void 2960ae4f23fSEric Fiselier operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT 2970ae4f23fSEric Fiselier { 2980ae4f23fSEric Fiselier ::operator delete[](ptr, alignment); 2990ae4f23fSEric Fiselier } 3000ae4f23fSEric Fiselier 301*42f9868cSEric Fiselier #endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION 302492d7134SShoaib Meenai #endif // !__GLIBCXX__ && (!_LIBCPP_ABI_MICROSOFT || _LIBCPP_NO_VCRUNTIME) && !_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS 303