Home | History | Annotate | Download | only in v1
      1 // -*- C++ -*-
      2 //===----------------------------- new ------------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_NEW
     12 #define _LIBCPP_NEW
     13 
     14 /*
     15     new synopsis
     16 
     17 namespace std
     18 {
     19 
     20 class bad_alloc
     21     : public exception
     22 {
     23 public:
     24     bad_alloc() noexcept;
     25     bad_alloc(const bad_alloc&) noexcept;
     26     bad_alloc& operator=(const bad_alloc&) noexcept;
     27     virtual const char* what() const noexcept;
     28 };
     29 
     30 class bad_array_length : public bad_alloc // FIXME: Not part of C++
     31 {
     32 public:
     33     bad_array_length() noexcept;
     34 };
     35 
     36 class bad_array_new_length : public bad_alloc // C++14
     37 {
     38 public:
     39     bad_array_new_length() noexcept;
     40 };
     41 
     42 enum class align_val_t : size_t {}; // C++17
     43 struct nothrow_t {};
     44 extern const nothrow_t nothrow;
     45 typedef void (*new_handler)();
     46 new_handler set_new_handler(new_handler new_p) noexcept;
     47 new_handler get_new_handler() noexcept;
     48 
     49 }  // std
     50 
     51 void* operator new(std::size_t size);                                   // replaceable
     52 void* operator new(std::size_t size, std::align_val_t alignment);       // replaceable, C++17
     53 void* operator new(std::size_t size, const std::nothrow_t&) noexcept;   // replaceable
     54 void* operator new(std::size_t size, std::align_val_t alignment,
     55                    const std::nothrow_t&) noexcept;                     // replaceable, C++17
     56 void  operator delete(void* ptr) noexcept;                              // replaceable
     57 void  operator delete(void* ptr, std::size_t size) noexcept;            // replaceable, C++14
     58 void  operator delete(void* ptr, std::align_val_t alignment) noexcept;  // replaceable, C++17
     59 void  operator delete(void* ptr, std::size_t size,
     60                       std::align_val_t alignment) noexcept;             // replaceable, C++17
     61 void  operator delete(void* ptr, const std::nothrow_t&) noexcept;       // replaceable
     62 void  operator delete(void* ptr, std:align_val_t alignment,
     63                       const std::nothrow_t&) noexcept;                  // replaceable, C++17
     64 
     65 void* operator new[](std::size_t size);                                 // replaceable
     66 void* operator new[](std::size_t size,
     67                      std::align_val_t alignment) noexcept;              // replaceable, C++17
     68 void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable
     69 void* operator new[](std::size_t size, std::align_val_t alignment,
     70                      const std::nothrow_t&) noexcept;                   // replaceable, C++17
     71 void  operator delete[](void* ptr) noexcept;                            // replaceable
     72 void  operator delete[](void* ptr, std::size_t size) noexcept;          // replaceable, C++14
     73 void  operator delete[](void* ptr,
     74                         std::align_val_t alignment) noexcept;           // replaceable, C++17
     75 void  operator delete[](void* ptr, std::size_t size,
     76                         std::align_val_t alignment) noexcept;           // replaceable, C++17
     77 void  operator delete[](void* ptr, const std::nothrow_t&) noexcept;     // replaceable
     78 void  operator delete[](void* ptr, std::align_val_t alignment,
     79                         const std::nothrow_t&) noexcept;                // replaceable, C++17
     80 
     81 void* operator new  (std::size_t size, void* ptr) noexcept;
     82 void* operator new[](std::size_t size, void* ptr) noexcept;
     83 void  operator delete  (void* ptr, void*) noexcept;
     84 void  operator delete[](void* ptr, void*) noexcept;
     85 
     86 */
     87 
     88 #include <__config>
     89 #include <exception>
     90 #include <cstddef>
     91 #ifdef _LIBCPP_NO_EXCEPTIONS
     92 #include <cstdlib>
     93 #endif
     94 
     95 #if defined(_LIBCPP_ABI_MICROSOFT)
     96 #include <new.h>
     97 #endif
     98 
     99 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    100 #pragma GCC system_header
    101 #endif
    102 
    103 #if !(defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER >= 14 || \
    104     (defined(__cpp_sized_deallocation) && __cpp_sized_deallocation >= 201309))
    105 # define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
    106 #endif
    107 
    108 #if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
    109     (!(defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER > 14 || \
    110     (defined(__cpp_aligned_new) && __cpp_aligned_new >= 201606)))
    111 # define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
    112 #endif
    113 
    114 namespace std  // purposefully not using versioning namespace
    115 {
    116 
    117 #if !defined(_LIBCPP_ABI_MICROSOFT)
    118 struct _LIBCPP_TYPE_VIS nothrow_t {};
    119 extern _LIBCPP_FUNC_VIS const nothrow_t nothrow;
    120 
    121 class _LIBCPP_EXCEPTION_ABI bad_alloc
    122     : public exception
    123 {
    124 public:
    125     bad_alloc() _NOEXCEPT;
    126     virtual ~bad_alloc() _NOEXCEPT;
    127     virtual const char* what() const _NOEXCEPT;
    128 };
    129 
    130 class _LIBCPP_EXCEPTION_ABI bad_array_new_length
    131     : public bad_alloc
    132 {
    133 public:
    134     bad_array_new_length() _NOEXCEPT;
    135     virtual ~bad_array_new_length() _NOEXCEPT;
    136     virtual const char* what() const _NOEXCEPT;
    137 };
    138 
    139 typedef void (*new_handler)();
    140 _LIBCPP_FUNC_VIS new_handler set_new_handler(new_handler) _NOEXCEPT;
    141 _LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT;
    142 
    143 #endif // !_LIBCPP_ABI_MICROSOFT
    144 
    145 _LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_bad_alloc();  // not in C++ spec
    146 
    147 #if defined(_LIBCPP_BUILDING_LIBRARY) || (_LIBCPP_STD_VER > 11)
    148 
    149 class _LIBCPP_EXCEPTION_ABI bad_array_length
    150     : public bad_alloc
    151 {
    152 public:
    153     bad_array_length() _NOEXCEPT;
    154     virtual ~bad_array_length() _NOEXCEPT;
    155     virtual const char* what() const _NOEXCEPT;
    156 };
    157 
    158 #define _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
    159 
    160 #endif  // defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11)
    161 
    162 #if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) || _LIBCPP_STD_VER > 14
    163 #ifndef _LIBCPP_CXX03_LANG
    164 enum class _LIBCPP_ENUM_VIS align_val_t : size_t { };
    165 #else
    166 enum align_val_t { __zero = 0, __max = (size_t)-1 };
    167 #endif
    168 #endif
    169 
    170 }  // std
    171 
    172 #if defined(_LIBCPP_CXX03_LANG)
    173 #define _THROW_BAD_ALLOC throw(std::bad_alloc)
    174 #else
    175 #define _THROW_BAD_ALLOC
    176 #endif
    177 
    178 #if !defined(_LIBCPP_ABI_MICROSOFT)
    179 
    180 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz) _THROW_BAD_ALLOC;
    181 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
    182 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete(void* __p) _NOEXCEPT;
    183 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
    184 #ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
    185 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
    186 #endif
    187 
    188 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz) _THROW_BAD_ALLOC;
    189 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
    190 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete[](void* __p) _NOEXCEPT;
    191 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
    192 #ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
    193 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete[](void* __p, std::size_t __sz) _NOEXCEPT;
    194 #endif
    195 
    196 #ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
    197 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
    198 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
    199 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete(void* __p, std::align_val_t) _NOEXCEPT;
    200 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete(void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
    201 #ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
    202 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete(void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
    203 #endif
    204 
    205 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
    206 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
    207 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete[](void* __p, std::align_val_t) _NOEXCEPT;
    208 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete[](void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
    209 #ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
    210 _LIBCPP_OVERRIDABLE_FUNC_VIS void  operator delete[](void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
    211 #endif
    212 #endif
    213 
    214 inline _LIBCPP_INLINE_VISIBILITY void* operator new  (std::size_t, void* __p) _NOEXCEPT {return __p;}
    215 inline _LIBCPP_INLINE_VISIBILITY void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;}
    216 inline _LIBCPP_INLINE_VISIBILITY void  operator delete  (void*, void*) _NOEXCEPT {}
    217 inline _LIBCPP_INLINE_VISIBILITY void  operator delete[](void*, void*) _NOEXCEPT {}
    218 
    219 #endif // !_LIBCPP_ABI_MICROSOFT
    220 
    221 _LIBCPP_BEGIN_NAMESPACE_STD
    222 
    223 inline _LIBCPP_INLINE_VISIBILITY void *__allocate(size_t __size) {
    224 #ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
    225   return ::operator new(__size);
    226 #else
    227   return __builtin_operator_new(__size);
    228 #endif
    229 }
    230 
    231 inline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate(void *__ptr) {
    232 #ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
    233   ::operator delete(__ptr);
    234 #else
    235   __builtin_operator_delete(__ptr);
    236 #endif
    237 }
    238 
    239 #ifdef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
    240 _LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
    241 void __throw_bad_array_length()
    242 {
    243 #ifndef _LIBCPP_NO_EXCEPTIONS
    244     throw bad_array_length();
    245 #else
    246 	_VSTD::abort();
    247 #endif
    248 }
    249 #endif
    250 
    251 _LIBCPP_END_NAMESPACE_STD
    252 
    253 #endif  // _LIBCPP_NEW
    254