13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===// 23e519524SHoward Hinnant // 35b08a8a4SHoward Hinnant // The LLVM Compiler Infrastructure 43e519524SHoward Hinnant // 53e519524SHoward Hinnant // This file is distributed under the University of Illinois Open Source 63e519524SHoward Hinnant // License. See LICENSE.TXT for details. 73e519524SHoward Hinnant // 83e519524SHoward Hinnant //===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 10*111e0cbeSNick Kledzik #include <stdlib.h> 11*111e0cbeSNick Kledzik #include <cxxabi.h> 12*111e0cbeSNick Kledzik 133e519524SHoward Hinnant #include "new" 143e519524SHoward Hinnant 15*111e0cbeSNick Kledzik 16*111e0cbeSNick Kledzik #if __APPLE__ 17*111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 18*111e0cbeSNick Kledzik // shared libray. The global holding the current new handler is 19*111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 20*111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 21*111e0cbeSNick Kledzik #else 22*111e0cbeSNick Kledzik static std::new_handler __new_handler; 23*111e0cbeSNick Kledzik #endif 24*111e0cbeSNick Kledzik 25*111e0cbeSNick Kledzik 26*111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 27*111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 28*111e0cbeSNick Kledzik // that define non-weak copies of the functions. 29*111e0cbeSNick Kledzik 30*111e0cbeSNick Kledzik 31*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 32*111e0cbeSNick Kledzik void * 33*111e0cbeSNick Kledzik operator new(std::size_t size) throw (std::bad_alloc) 34*111e0cbeSNick Kledzik { 35*111e0cbeSNick Kledzik if (size == 0) 36*111e0cbeSNick Kledzik size = 1; 37*111e0cbeSNick Kledzik void* p; 38*111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 39*111e0cbeSNick Kledzik { 40*111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 41*111e0cbeSNick Kledzik // call it to try free up memory. 42*111e0cbeSNick Kledzik if (__new_handler) 43*111e0cbeSNick Kledzik __new_handler(); 44*111e0cbeSNick Kledzik else 45*111e0cbeSNick Kledzik throw std::bad_alloc(); 46*111e0cbeSNick Kledzik } 47*111e0cbeSNick Kledzik return p; 48*111e0cbeSNick Kledzik } 49*111e0cbeSNick Kledzik 50*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 51*111e0cbeSNick Kledzik void* 52*111e0cbeSNick Kledzik operator new(size_t size, const std::nothrow_t&) throw() 53*111e0cbeSNick Kledzik { 54*111e0cbeSNick Kledzik void* p = 0; 55*111e0cbeSNick Kledzik try 56*111e0cbeSNick Kledzik { 57*111e0cbeSNick Kledzik p = ::operator new(size); 58*111e0cbeSNick Kledzik } 59*111e0cbeSNick Kledzik catch (...) 60*111e0cbeSNick Kledzik { 61*111e0cbeSNick Kledzik } 62*111e0cbeSNick Kledzik return p; 63*111e0cbeSNick Kledzik } 64*111e0cbeSNick Kledzik 65*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 66*111e0cbeSNick Kledzik void* 67*111e0cbeSNick Kledzik operator new[](size_t size) throw (std::bad_alloc) 68*111e0cbeSNick Kledzik { 69*111e0cbeSNick Kledzik return ::operator new(size); 70*111e0cbeSNick Kledzik } 71*111e0cbeSNick Kledzik 72*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 73*111e0cbeSNick Kledzik void* 74*111e0cbeSNick Kledzik operator new[](size_t size, const std::nothrow_t& nothrow) throw() 75*111e0cbeSNick Kledzik { 76*111e0cbeSNick Kledzik void* p = 0; 77*111e0cbeSNick Kledzik try 78*111e0cbeSNick Kledzik { 79*111e0cbeSNick Kledzik p = ::operator new[](size); 80*111e0cbeSNick Kledzik } 81*111e0cbeSNick Kledzik catch (...) 82*111e0cbeSNick Kledzik { 83*111e0cbeSNick Kledzik } 84*111e0cbeSNick Kledzik return p; 85*111e0cbeSNick Kledzik } 86*111e0cbeSNick Kledzik 87*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 88*111e0cbeSNick Kledzik void 89*111e0cbeSNick Kledzik operator delete(void* ptr) throw () 90*111e0cbeSNick Kledzik { 91*111e0cbeSNick Kledzik if (ptr) 92*111e0cbeSNick Kledzik ::free(ptr); 93*111e0cbeSNick Kledzik } 94*111e0cbeSNick Kledzik 95*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 96*111e0cbeSNick Kledzik void 97*111e0cbeSNick Kledzik operator delete(void* ptr, const std::nothrow_t&) throw () 98*111e0cbeSNick Kledzik { 99*111e0cbeSNick Kledzik ::operator delete(ptr); 100*111e0cbeSNick Kledzik } 101*111e0cbeSNick Kledzik 102*111e0cbeSNick Kledzik 103*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 104*111e0cbeSNick Kledzik void 105*111e0cbeSNick Kledzik operator delete[] (void* ptr) throw () 106*111e0cbeSNick Kledzik { 107*111e0cbeSNick Kledzik ::operator delete (ptr); 108*111e0cbeSNick Kledzik } 109*111e0cbeSNick Kledzik 110*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 111*111e0cbeSNick Kledzik void 112*111e0cbeSNick Kledzik operator delete[] (void* ptr, const std::nothrow_t&) throw () 113*111e0cbeSNick Kledzik { 114*111e0cbeSNick Kledzik ::operator delete[](ptr); 115*111e0cbeSNick Kledzik } 116*111e0cbeSNick Kledzik 117*111e0cbeSNick Kledzik 1183e519524SHoward Hinnant namespace std 1193e519524SHoward Hinnant { 1203e519524SHoward Hinnant 121*111e0cbeSNick Kledzik bad_alloc::bad_alloc() throw() 122*111e0cbeSNick Kledzik { 123*111e0cbeSNick Kledzik } 124*111e0cbeSNick Kledzik 125*111e0cbeSNick Kledzik bad_alloc::~bad_alloc() throw() 126*111e0cbeSNick Kledzik { 127*111e0cbeSNick Kledzik } 128*111e0cbeSNick Kledzik 129*111e0cbeSNick Kledzik const char* 130*111e0cbeSNick Kledzik bad_alloc::what() const throw() 131*111e0cbeSNick Kledzik { 132*111e0cbeSNick Kledzik return "std::bad_alloc"; 133*111e0cbeSNick Kledzik } 134*111e0cbeSNick Kledzik 135*111e0cbeSNick Kledzik 136*111e0cbeSNick Kledzik bad_array_new_length::bad_array_new_length() throw() 137*111e0cbeSNick Kledzik { 138*111e0cbeSNick Kledzik } 139*111e0cbeSNick Kledzik 1403e519524SHoward Hinnant bad_array_new_length::~bad_array_new_length() throw() 1413e519524SHoward Hinnant { 1423e519524SHoward Hinnant } 1433e519524SHoward Hinnant 1443e519524SHoward Hinnant const char* 1453e519524SHoward Hinnant bad_array_new_length::what() const throw() 1463e519524SHoward Hinnant { 1473e519524SHoward Hinnant return "bad_array_new_length"; 1483e519524SHoward Hinnant } 1493e519524SHoward Hinnant 150*111e0cbeSNick Kledzik 151*111e0cbeSNick Kledzik 1523e519524SHoward Hinnant void 1533e519524SHoward Hinnant __throw_bad_alloc() 1543e519524SHoward Hinnant { 1553e519524SHoward Hinnant throw bad_alloc(); 1563e519524SHoward Hinnant } 1573e519524SHoward Hinnant 1583e519524SHoward Hinnant } // std 159