Line data Source code
1 : // The -*- C++ -*- dynamic memory management header. 2 : 3 : // Copyright (C) 1994-2018 Free Software Foundation, Inc. 4 : 5 : // This file is part of GCC. 6 : // 7 : // GCC is free software; you can redistribute it and/or modify 8 : // it under the terms of the GNU General Public License as published by 9 : // the Free Software Foundation; either version 3, or (at your option) 10 : // any later version. 11 : // 12 : // GCC is distributed in the hope that it will be useful, 13 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : // GNU General Public License for more details. 16 : // 17 : // Under Section 7 of GPL version 3, you are granted additional 18 : // permissions described in the GCC Runtime Library Exception, version 19 : // 3.1, as published by the Free Software Foundation. 20 : 21 : // You should have received a copy of the GNU General Public License and 22 : // a copy of the GCC Runtime Library Exception along with this program; 23 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 : // <http://www.gnu.org/licenses/>. 25 : 26 : /** @file new 27 : * This is a Standard C++ Library header. 28 : * 29 : * The header @c new defines several functions to manage dynamic memory and 30 : * handling memory allocation errors; see 31 : * http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#4 for more. 32 : */ 33 : 34 : #ifndef _NEW 35 : #define _NEW 36 : 37 : #pragma GCC system_header 38 : 39 : #include <bits/c++config.h> 40 : #include <exception> 41 : 42 : #pragma GCC visibility push(default) 43 : 44 : extern "C++" { 45 : 46 : namespace std 47 : { 48 : /** 49 : * @brief Exception possibly thrown by @c new. 50 : * @ingroup exceptions 51 : * 52 : * @c bad_alloc (or classes derived from it) is used to report allocation 53 : * errors from the throwing forms of @c new. */ 54 : class bad_alloc : public exception 55 : { 56 : public: 57 : bad_alloc() throw() { } 58 : 59 : // This declaration is not useless: 60 : // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 61 : virtual ~bad_alloc() throw(); 62 : 63 : // See comment in eh_exception.cc. 64 : virtual const char* what() const throw(); 65 : }; 66 : 67 : #if __cplusplus >= 201103L 68 : class bad_array_new_length : public bad_alloc 69 : { 70 : public: 71 : bad_array_new_length() throw() { } 72 : 73 : // This declaration is not useless: 74 : // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 75 : virtual ~bad_array_new_length() throw(); 76 : 77 : // See comment in eh_exception.cc. 78 : virtual const char* what() const throw(); 79 : }; 80 : #endif 81 : 82 : #if __cpp_aligned_new 83 : enum class align_val_t: size_t {}; 84 : #endif 85 : 86 : struct nothrow_t 87 : { 88 : #if __cplusplus >= 201103L 89 : explicit nothrow_t() = default; 90 : #endif 91 : }; 92 : 93 : extern const nothrow_t nothrow; 94 : 95 : /** If you write your own error handler to be called by @c new, it must 96 : * be of this type. */ 97 : typedef void (*new_handler)(); 98 : 99 : /// Takes a replacement handler as the argument, returns the 100 : /// previous handler. 101 : new_handler set_new_handler(new_handler) throw(); 102 : 103 : #if __cplusplus >= 201103L 104 : /// Return the current new handler. 105 : new_handler get_new_handler() noexcept; 106 : #endif 107 : } // namespace std 108 : 109 : //@{ 110 : /** These are replaceable signatures: 111 : * - normal single new and delete (no arguments, throw @c bad_alloc on error) 112 : * - normal array new and delete (same) 113 : * - @c nothrow single new and delete (take a @c nothrow argument, return 114 : * @c NULL on error) 115 : * - @c nothrow array new and delete (same) 116 : * 117 : * Placement new and delete signatures (take a memory address argument, 118 : * does nothing) may not be replaced by a user's program. 119 : */ 120 : void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) 121 : __attribute__((__externally_visible__)); 122 : void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) 123 : __attribute__((__externally_visible__)); 124 : void operator delete(void*) _GLIBCXX_USE_NOEXCEPT 125 : __attribute__((__externally_visible__)); 126 : void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT 127 : __attribute__((__externally_visible__)); 128 : #if __cpp_sized_deallocation 129 : void operator delete(void*, std::size_t) _GLIBCXX_USE_NOEXCEPT 130 : __attribute__((__externally_visible__)); 131 : void operator delete[](void*, std::size_t) _GLIBCXX_USE_NOEXCEPT 132 : __attribute__((__externally_visible__)); 133 : #endif 134 : void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 135 : __attribute__((__externally_visible__)); 136 : void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 137 : __attribute__((__externally_visible__)); 138 : void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 139 : __attribute__((__externally_visible__)); 140 : void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 141 : __attribute__((__externally_visible__)); 142 : #if __cpp_aligned_new 143 : void* operator new(std::size_t, std::align_val_t) 144 : __attribute__((__externally_visible__)); 145 : void* operator new(std::size_t, std::align_val_t, const std::nothrow_t&) 146 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 147 : void operator delete(void*, std::align_val_t) 148 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 149 : void operator delete(void*, std::align_val_t, const std::nothrow_t&) 150 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 151 : void* operator new[](std::size_t, std::align_val_t) 152 : __attribute__((__externally_visible__)); 153 : void* operator new[](std::size_t, std::align_val_t, const std::nothrow_t&) 154 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 155 : void operator delete[](void*, std::align_val_t) 156 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 157 : void operator delete[](void*, std::align_val_t, const std::nothrow_t&) 158 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 159 : #if __cpp_sized_deallocation 160 : void operator delete(void*, std::size_t, std::align_val_t) 161 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 162 : void operator delete[](void*, std::size_t, std::align_val_t) 163 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 164 : #endif // __cpp_sized_deallocation 165 : #endif // __cpp_aligned_new 166 : 167 : // Default placement versions of operator new. 168 33753 : inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT 169 33753 : { return __p; } 170 : inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT 171 : { return __p; } 172 : 173 : // Default placement versions of operator delete. 174 0 : inline void operator delete (void*, void*) _GLIBCXX_USE_NOEXCEPT { } 175 : inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { } 176 : //@} 177 : } // extern "C++" 178 : 179 : #if __cplusplus >= 201703L 180 : #if __GNUC__ >= 7 181 : # define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1 182 : #elif defined __has_builtin 183 : // For non-GNU compilers: 184 : # if __has_builtin(__builtin_launder) 185 : # define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1 186 : # endif 187 : #endif 188 : 189 : #ifdef _GLIBCXX_HAVE_BUILTIN_LAUNDER 190 : namespace std 191 : { 192 : #define __cpp_lib_launder 201606 193 : /// Pointer optimization barrier [ptr.launder] 194 : template<typename _Tp> 195 : [[nodiscard]] constexpr _Tp* 196 : launder(_Tp* __p) noexcept 197 : { return __builtin_launder(__p); } 198 : 199 : // The program is ill-formed if T is a function type or 200 : // (possibly cv-qualified) void. 201 : 202 : template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM> 203 : void launder(_Ret (*)(_Args...) _GLIBCXX_NOEXCEPT_QUAL) = delete; 204 : template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM> 205 : void launder(_Ret (*)(_Args......) _GLIBCXX_NOEXCEPT_QUAL) = delete; 206 : 207 : void launder(void*) = delete; 208 : void launder(const void*) = delete; 209 : void launder(volatile void*) = delete; 210 : void launder(const volatile void*) = delete; 211 : } 212 : #endif // _GLIBCXX_HAVE_BUILTIN_LAUNDER 213 : #undef _GLIBCXX_HAVE_BUILTIN_LAUNDER 214 : #endif // C++17 215 : 216 : #pragma GCC visibility pop 217 : 218 : #endif