annotate libstdc++-v3/libsupc++/cxxabi.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // ABI Support -*- C++ -*-
kono
parents:
diff changeset
2
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 // Copyright (C) 2000-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
4 //
kono
parents:
diff changeset
5 // This file is part of GCC.
kono
parents:
diff changeset
6 //
kono
parents:
diff changeset
7 // GCC is free software; you can redistribute it and/or modify
kono
parents:
diff changeset
8 // it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 // the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 // any later version.
kono
parents:
diff changeset
11 //
kono
parents:
diff changeset
12 // GCC is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 // GNU General Public License for more details.
kono
parents:
diff changeset
16 //
kono
parents:
diff changeset
17 // Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
18 // permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
19 // 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 // You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
22 // a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
24 // <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 // Written by Nathan Sidwell, Codesourcery LLC, <nathan@codesourcery.com>
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 /* This file declares the new abi entry points into the runtime. It is not
kono
parents:
diff changeset
29 normally necessary for user programs to include this header, or use the
kono
parents:
diff changeset
30 entry points directly. However, this header is available should that be
kono
parents:
diff changeset
31 needed.
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 Some of the entry points are intended for both C and C++, thus this header
kono
parents:
diff changeset
34 is includable from both C and C++. Though the C++ specific parts are not
kono
parents:
diff changeset
35 available in C, naturally enough. */
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 /** @file cxxabi.h
kono
parents:
diff changeset
38 * The header provides an interface to the C++ ABI.
kono
parents:
diff changeset
39 */
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 #ifndef _CXXABI_H
kono
parents:
diff changeset
42 #define _CXXABI_H 1
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 #pragma GCC system_header
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 #pragma GCC visibility push(default)
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 #include <stddef.h>
kono
parents:
diff changeset
49 #include <bits/c++config.h>
kono
parents:
diff changeset
50 #include <bits/cxxabi_tweaks.h>
kono
parents:
diff changeset
51 #include <bits/cxxabi_forced.h>
kono
parents:
diff changeset
52 #include <bits/cxxabi_init_exception.h>
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 #ifdef __cplusplus
kono
parents:
diff changeset
55 namespace __cxxabiv1
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 extern "C"
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 #endif
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 typedef __cxa_cdtor_return_type (*__cxa_cdtor_type)(void *);
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 // Allocate array.
kono
parents:
diff changeset
64 void*
kono
parents:
diff changeset
65 __cxa_vec_new(size_t __element_count, size_t __element_size,
kono
parents:
diff changeset
66 size_t __padding_size, __cxa_cdtor_type __constructor,
kono
parents:
diff changeset
67 __cxa_cdtor_type __destructor);
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 void*
kono
parents:
diff changeset
70 __cxa_vec_new2(size_t __element_count, size_t __element_size,
kono
parents:
diff changeset
71 size_t __padding_size, __cxa_cdtor_type __constructor,
kono
parents:
diff changeset
72 __cxa_cdtor_type __destructor, void *(*__alloc) (size_t),
kono
parents:
diff changeset
73 void (*__dealloc) (void*));
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 void*
kono
parents:
diff changeset
76 __cxa_vec_new3(size_t __element_count, size_t __element_size,
kono
parents:
diff changeset
77 size_t __padding_size, __cxa_cdtor_type __constructor,
kono
parents:
diff changeset
78 __cxa_cdtor_type __destructor, void *(*__alloc) (size_t),
kono
parents:
diff changeset
79 void (*__dealloc) (void*, size_t));
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 // Construct array.
kono
parents:
diff changeset
82 __cxa_vec_ctor_return_type
kono
parents:
diff changeset
83 __cxa_vec_ctor(void* __array_address, size_t __element_count,
kono
parents:
diff changeset
84 size_t __element_size, __cxa_cdtor_type __constructor,
kono
parents:
diff changeset
85 __cxa_cdtor_type __destructor);
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 __cxa_vec_ctor_return_type
kono
parents:
diff changeset
88 __cxa_vec_cctor(void* __dest_array, void* __src_array,
kono
parents:
diff changeset
89 size_t __element_count, size_t __element_size,
kono
parents:
diff changeset
90 __cxa_cdtor_return_type (*__constructor) (void*, void*),
kono
parents:
diff changeset
91 __cxa_cdtor_type __destructor);
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 // Destruct array.
kono
parents:
diff changeset
94 void
kono
parents:
diff changeset
95 __cxa_vec_dtor(void* __array_address, size_t __element_count,
kono
parents:
diff changeset
96 size_t __element_size, __cxa_cdtor_type __destructor);
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 void
kono
parents:
diff changeset
99 __cxa_vec_cleanup(void* __array_address, size_t __element_count, size_t __s,
kono
parents:
diff changeset
100 __cxa_cdtor_type __destructor) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 // Destruct and release array.
kono
parents:
diff changeset
103 void
kono
parents:
diff changeset
104 __cxa_vec_delete(void* __array_address, size_t __element_size,
kono
parents:
diff changeset
105 size_t __padding_size, __cxa_cdtor_type __destructor);
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 void
kono
parents:
diff changeset
108 __cxa_vec_delete2(void* __array_address, size_t __element_size,
kono
parents:
diff changeset
109 size_t __padding_size, __cxa_cdtor_type __destructor,
kono
parents:
diff changeset
110 void (*__dealloc) (void*));
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 void
kono
parents:
diff changeset
113 __cxa_vec_delete3(void* __array_address, size_t __element_size,
kono
parents:
diff changeset
114 size_t __padding_size, __cxa_cdtor_type __destructor,
kono
parents:
diff changeset
115 void (*__dealloc) (void*, size_t));
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 int
kono
parents:
diff changeset
118 __cxa_guard_acquire(__guard*);
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 void
kono
parents:
diff changeset
121 __cxa_guard_release(__guard*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 void
kono
parents:
diff changeset
124 __cxa_guard_abort(__guard*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 // DSO destruction.
kono
parents:
diff changeset
127 int
kono
parents:
diff changeset
128 __cxa_atexit(void (*)(void*), void*, void*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 int
kono
parents:
diff changeset
131 __cxa_finalize(void*);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 // TLS destruction.
kono
parents:
diff changeset
134 int
kono
parents:
diff changeset
135 __cxa_thread_atexit(void (*)(void*), void*, void *) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 // Pure virtual functions.
kono
parents:
diff changeset
138 void
kono
parents:
diff changeset
139 __cxa_pure_virtual(void) __attribute__ ((__noreturn__));
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 void
kono
parents:
diff changeset
142 __cxa_deleted_virtual(void) __attribute__ ((__noreturn__));
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 // Exception handling auxiliary.
kono
parents:
diff changeset
145 void
kono
parents:
diff changeset
146 __cxa_bad_cast() __attribute__((__noreturn__));
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 void
kono
parents:
diff changeset
149 __cxa_bad_typeid() __attribute__((__noreturn__));
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 void
kono
parents:
diff changeset
152 __cxa_throw_bad_array_new_length() __attribute__((__noreturn__));
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 /**
kono
parents:
diff changeset
155 * @brief Demangling routine.
kono
parents:
diff changeset
156 * ABI-mandated entry point in the C++ runtime library for demangling.
kono
parents:
diff changeset
157 *
kono
parents:
diff changeset
158 * @param __mangled_name A NUL-terminated character string
kono
parents:
diff changeset
159 * containing the name to be demangled.
kono
parents:
diff changeset
160 *
kono
parents:
diff changeset
161 * @param __output_buffer A region of memory, allocated with
kono
parents:
diff changeset
162 * malloc, of @a *__length bytes, into which the demangled name is
kono
parents:
diff changeset
163 * stored. If @a __output_buffer is not long enough, it is
kono
parents:
diff changeset
164 * expanded using realloc. @a __output_buffer may instead be NULL;
kono
parents:
diff changeset
165 * in that case, the demangled name is placed in a region of memory
kono
parents:
diff changeset
166 * allocated with malloc.
kono
parents:
diff changeset
167 *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168 * @param __length If @a __length is non-null, the length of the
111
kono
parents:
diff changeset
169 * buffer containing the demangled name is placed in @a *__length.
kono
parents:
diff changeset
170 *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 * @param __status If @a __status is non-null, @a *__status is set to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 * one of the following values:
111
kono
parents:
diff changeset
173 * 0: The demangling operation succeeded.
kono
parents:
diff changeset
174 * -1: A memory allocation failure occurred.
kono
parents:
diff changeset
175 * -2: @a mangled_name is not a valid name under the C++ ABI mangling rules.
kono
parents:
diff changeset
176 * -3: One of the arguments is invalid.
kono
parents:
diff changeset
177 *
kono
parents:
diff changeset
178 * @return A pointer to the start of the NUL-terminated demangled
kono
parents:
diff changeset
179 * name, or NULL if the demangling fails. The caller is
kono
parents:
diff changeset
180 * responsible for deallocating this memory using @c free.
kono
parents:
diff changeset
181 *
kono
parents:
diff changeset
182 * The demangling is performed using the C++ ABI mangling rules,
kono
parents:
diff changeset
183 * with GNU extensions. For example, this function is used in
kono
parents:
diff changeset
184 * __gnu_cxx::__verbose_terminate_handler.
kono
parents:
diff changeset
185 *
kono
parents:
diff changeset
186 * See https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
kono
parents:
diff changeset
187 * for other examples of use.
kono
parents:
diff changeset
188 *
kono
parents:
diff changeset
189 * @note The same demangling functionality is available via
kono
parents:
diff changeset
190 * libiberty (@c <libiberty/demangle.h> and @c libiberty.a) in GCC
kono
parents:
diff changeset
191 * 3.1 and later, but that requires explicit installation (@c
kono
parents:
diff changeset
192 * --enable-install-libiberty) and uses a different API, although
kono
parents:
diff changeset
193 * the ABI is unchanged.
kono
parents:
diff changeset
194 */
kono
parents:
diff changeset
195 char*
kono
parents:
diff changeset
196 __cxa_demangle(const char* __mangled_name, char* __output_buffer,
kono
parents:
diff changeset
197 size_t* __length, int* __status);
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 #ifdef __cplusplus
kono
parents:
diff changeset
200 }
kono
parents:
diff changeset
201 } // namespace __cxxabiv1
kono
parents:
diff changeset
202 #endif
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 #ifdef __cplusplus
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 #include <typeinfo>
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 namespace __cxxabiv1
kono
parents:
diff changeset
209 {
kono
parents:
diff changeset
210 // Type information for int, float etc.
kono
parents:
diff changeset
211 class __fundamental_type_info : public std::type_info
kono
parents:
diff changeset
212 {
kono
parents:
diff changeset
213 public:
kono
parents:
diff changeset
214 explicit
kono
parents:
diff changeset
215 __fundamental_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 virtual
kono
parents:
diff changeset
218 ~__fundamental_type_info();
kono
parents:
diff changeset
219 };
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 // Type information for array objects.
kono
parents:
diff changeset
222 class __array_type_info : public std::type_info
kono
parents:
diff changeset
223 {
kono
parents:
diff changeset
224 public:
kono
parents:
diff changeset
225 explicit
kono
parents:
diff changeset
226 __array_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 virtual
kono
parents:
diff changeset
229 ~__array_type_info();
kono
parents:
diff changeset
230 };
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 // Type information for functions (both member and non-member).
kono
parents:
diff changeset
233 class __function_type_info : public std::type_info
kono
parents:
diff changeset
234 {
kono
parents:
diff changeset
235 public:
kono
parents:
diff changeset
236 explicit
kono
parents:
diff changeset
237 __function_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 virtual
kono
parents:
diff changeset
240 ~__function_type_info();
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 protected:
kono
parents:
diff changeset
243 // Implementation defined member function.
kono
parents:
diff changeset
244 virtual bool
kono
parents:
diff changeset
245 __is_function_p() const;
kono
parents:
diff changeset
246 };
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 // Type information for enumerations.
kono
parents:
diff changeset
249 class __enum_type_info : public std::type_info
kono
parents:
diff changeset
250 {
kono
parents:
diff changeset
251 public:
kono
parents:
diff changeset
252 explicit
kono
parents:
diff changeset
253 __enum_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 virtual
kono
parents:
diff changeset
256 ~__enum_type_info();
kono
parents:
diff changeset
257 };
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 // Common type information for simple pointers and pointers to member.
kono
parents:
diff changeset
260 class __pbase_type_info : public std::type_info
kono
parents:
diff changeset
261 {
kono
parents:
diff changeset
262 public:
kono
parents:
diff changeset
263 unsigned int __flags; // Qualification of the target object.
kono
parents:
diff changeset
264 const std::type_info* __pointee; // Type of pointed to object.
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 explicit
kono
parents:
diff changeset
267 __pbase_type_info(const char* __n, int __quals,
kono
parents:
diff changeset
268 const std::type_info* __type)
kono
parents:
diff changeset
269 : std::type_info(__n), __flags(__quals), __pointee(__type)
kono
parents:
diff changeset
270 { }
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 virtual
kono
parents:
diff changeset
273 ~__pbase_type_info();
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 // Implementation defined type.
kono
parents:
diff changeset
276 enum __masks
kono
parents:
diff changeset
277 {
kono
parents:
diff changeset
278 __const_mask = 0x1,
kono
parents:
diff changeset
279 __volatile_mask = 0x2,
kono
parents:
diff changeset
280 __restrict_mask = 0x4,
kono
parents:
diff changeset
281 __incomplete_mask = 0x8,
kono
parents:
diff changeset
282 __incomplete_class_mask = 0x10,
kono
parents:
diff changeset
283 __transaction_safe_mask = 0x20,
kono
parents:
diff changeset
284 __noexcept_mask = 0x40
kono
parents:
diff changeset
285 };
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 protected:
kono
parents:
diff changeset
288 __pbase_type_info(const __pbase_type_info&);
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 __pbase_type_info&
kono
parents:
diff changeset
291 operator=(const __pbase_type_info&);
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 // Implementation defined member functions.
kono
parents:
diff changeset
294 virtual bool
kono
parents:
diff changeset
295 __do_catch(const std::type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
296 unsigned int __outer) const;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 inline virtual bool
kono
parents:
diff changeset
299 __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
300 unsigned __outer) const;
kono
parents:
diff changeset
301 };
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 inline bool __pbase_type_info::
kono
parents:
diff changeset
304 __pointer_catch (const __pbase_type_info *thrown_type,
kono
parents:
diff changeset
305 void **thr_obj,
kono
parents:
diff changeset
306 unsigned outer) const
kono
parents:
diff changeset
307 {
kono
parents:
diff changeset
308 return __pointee->__do_catch (thrown_type->__pointee, thr_obj, outer + 2);
kono
parents:
diff changeset
309 }
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 // Type information for simple pointers.
kono
parents:
diff changeset
312 class __pointer_type_info : public __pbase_type_info
kono
parents:
diff changeset
313 {
kono
parents:
diff changeset
314 public:
kono
parents:
diff changeset
315 explicit
kono
parents:
diff changeset
316 __pointer_type_info(const char* __n, int __quals,
kono
parents:
diff changeset
317 const std::type_info* __type)
kono
parents:
diff changeset
318 : __pbase_type_info (__n, __quals, __type) { }
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 virtual
kono
parents:
diff changeset
322 ~__pointer_type_info();
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 protected:
kono
parents:
diff changeset
325 // Implementation defined member functions.
kono
parents:
diff changeset
326 virtual bool
kono
parents:
diff changeset
327 __is_pointer_p() const;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 virtual bool
kono
parents:
diff changeset
330 __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
331 unsigned __outer) const;
kono
parents:
diff changeset
332 };
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 class __class_type_info;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 // Type information for a pointer to member variable.
kono
parents:
diff changeset
337 class __pointer_to_member_type_info : public __pbase_type_info
kono
parents:
diff changeset
338 {
kono
parents:
diff changeset
339 public:
kono
parents:
diff changeset
340 __class_type_info* __context; // Class of the member.
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 explicit
kono
parents:
diff changeset
343 __pointer_to_member_type_info(const char* __n, int __quals,
kono
parents:
diff changeset
344 const std::type_info* __type,
kono
parents:
diff changeset
345 __class_type_info* __klass)
kono
parents:
diff changeset
346 : __pbase_type_info(__n, __quals, __type), __context(__klass) { }
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 virtual
kono
parents:
diff changeset
349 ~__pointer_to_member_type_info();
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 protected:
kono
parents:
diff changeset
352 __pointer_to_member_type_info(const __pointer_to_member_type_info&);
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 __pointer_to_member_type_info&
kono
parents:
diff changeset
355 operator=(const __pointer_to_member_type_info&);
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 // Implementation defined member function.
kono
parents:
diff changeset
358 virtual bool
kono
parents:
diff changeset
359 __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
360 unsigned __outer) const;
kono
parents:
diff changeset
361 };
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 // Helper class for __vmi_class_type.
kono
parents:
diff changeset
364 class __base_class_type_info
kono
parents:
diff changeset
365 {
kono
parents:
diff changeset
366 public:
kono
parents:
diff changeset
367 const __class_type_info* __base_type; // Base class type.
kono
parents:
diff changeset
368 #ifdef _GLIBCXX_LLP64
kono
parents:
diff changeset
369 long long __offset_flags; // Offset and info.
kono
parents:
diff changeset
370 #else
kono
parents:
diff changeset
371 long __offset_flags; // Offset and info.
kono
parents:
diff changeset
372 #endif
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 enum __offset_flags_masks
kono
parents:
diff changeset
375 {
kono
parents:
diff changeset
376 __virtual_mask = 0x1,
kono
parents:
diff changeset
377 __public_mask = 0x2,
kono
parents:
diff changeset
378 __hwm_bit = 2,
kono
parents:
diff changeset
379 __offset_shift = 8 // Bits to shift offset.
kono
parents:
diff changeset
380 };
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 // Implementation defined member functions.
kono
parents:
diff changeset
383 bool
kono
parents:
diff changeset
384 __is_virtual_p() const
kono
parents:
diff changeset
385 { return __offset_flags & __virtual_mask; }
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 bool
kono
parents:
diff changeset
388 __is_public_p() const
kono
parents:
diff changeset
389 { return __offset_flags & __public_mask; }
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 ptrdiff_t
kono
parents:
diff changeset
392 __offset() const
kono
parents:
diff changeset
393 {
kono
parents:
diff changeset
394 // This shift, being of a signed type, is implementation
kono
parents:
diff changeset
395 // defined. GCC implements such shifts as arithmetic, which is
kono
parents:
diff changeset
396 // what we want.
kono
parents:
diff changeset
397 return static_cast<ptrdiff_t>(__offset_flags) >> __offset_shift;
kono
parents:
diff changeset
398 }
kono
parents:
diff changeset
399 };
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 // Type information for a class.
kono
parents:
diff changeset
402 class __class_type_info : public std::type_info
kono
parents:
diff changeset
403 {
kono
parents:
diff changeset
404 public:
kono
parents:
diff changeset
405 explicit
kono
parents:
diff changeset
406 __class_type_info (const char *__n) : type_info(__n) { }
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 virtual
kono
parents:
diff changeset
409 ~__class_type_info ();
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 // Implementation defined types.
kono
parents:
diff changeset
412 // The type sub_kind tells us about how a base object is contained
kono
parents:
diff changeset
413 // within a derived object. We often do this lazily, hence the
kono
parents:
diff changeset
414 // UNKNOWN value. At other times we may use NOT_CONTAINED to mean
kono
parents:
diff changeset
415 // not publicly contained.
kono
parents:
diff changeset
416 enum __sub_kind
kono
parents:
diff changeset
417 {
kono
parents:
diff changeset
418 // We have no idea.
kono
parents:
diff changeset
419 __unknown = 0,
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 // Not contained within us (in some circumstances this might
kono
parents:
diff changeset
422 // mean not contained publicly)
kono
parents:
diff changeset
423 __not_contained,
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 // Contained ambiguously.
kono
parents:
diff changeset
426 __contained_ambig,
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 // Via a virtual path.
kono
parents:
diff changeset
429 __contained_virtual_mask = __base_class_type_info::__virtual_mask,
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 // Via a public path.
kono
parents:
diff changeset
432 __contained_public_mask = __base_class_type_info::__public_mask,
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 // Contained within us.
kono
parents:
diff changeset
435 __contained_mask = 1 << __base_class_type_info::__hwm_bit,
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 __contained_private = __contained_mask,
kono
parents:
diff changeset
438 __contained_public = __contained_mask | __contained_public_mask
kono
parents:
diff changeset
439 };
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 struct __upcast_result;
kono
parents:
diff changeset
442 struct __dyncast_result;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 protected:
kono
parents:
diff changeset
445 // Implementation defined member functions.
kono
parents:
diff changeset
446 virtual bool
kono
parents:
diff changeset
447 __do_upcast(const __class_type_info* __dst_type, void**__obj_ptr) const;
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 virtual bool
kono
parents:
diff changeset
450 __do_catch(const type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
451 unsigned __outer) const;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 public:
kono
parents:
diff changeset
454 // Helper for upcast. See if DST is us, or one of our bases.
kono
parents:
diff changeset
455 // Return false if not found, true if found.
kono
parents:
diff changeset
456 virtual bool
kono
parents:
diff changeset
457 __do_upcast(const __class_type_info* __dst, const void* __obj,
kono
parents:
diff changeset
458 __upcast_result& __restrict __result) const;
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 // Indicate whether SRC_PTR of type SRC_TYPE is contained publicly
kono
parents:
diff changeset
461 // within OBJ_PTR. OBJ_PTR points to a base object of our type,
kono
parents:
diff changeset
462 // which is the destination type. SRC2DST indicates how SRC
kono
parents:
diff changeset
463 // objects might be contained within this type. If SRC_PTR is one
kono
parents:
diff changeset
464 // of our SRC_TYPE bases, indicate the virtuality. Returns
kono
parents:
diff changeset
465 // not_contained for non containment or private containment.
kono
parents:
diff changeset
466 inline __sub_kind
kono
parents:
diff changeset
467 __find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
468 const __class_type_info* __src_type,
kono
parents:
diff changeset
469 const void* __src_ptr) const;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 // Helper for dynamic cast. ACCESS_PATH gives the access from the
kono
parents:
diff changeset
472 // most derived object to this base. DST_TYPE indicates the
kono
parents:
diff changeset
473 // desired type we want. OBJ_PTR points to a base of our type
kono
parents:
diff changeset
474 // within the complete object. SRC_TYPE indicates the static type
kono
parents:
diff changeset
475 // started from and SRC_PTR points to that base within the most
kono
parents:
diff changeset
476 // derived object. Fill in RESULT with what we find. Return true
kono
parents:
diff changeset
477 // if we have located an ambiguous match.
kono
parents:
diff changeset
478 virtual bool
kono
parents:
diff changeset
479 __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
kono
parents:
diff changeset
480 const __class_type_info* __dst_type, const void* __obj_ptr,
kono
parents:
diff changeset
481 const __class_type_info* __src_type, const void* __src_ptr,
kono
parents:
diff changeset
482 __dyncast_result& __result) const;
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 // Helper for find_public_subobj. SRC2DST indicates how SRC_TYPE
kono
parents:
diff changeset
485 // bases are inherited by the type started from -- which is not
kono
parents:
diff changeset
486 // necessarily the current type. The current type will be a base
kono
parents:
diff changeset
487 // of the destination type. OBJ_PTR points to the current base.
kono
parents:
diff changeset
488 virtual __sub_kind
kono
parents:
diff changeset
489 __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
490 const __class_type_info* __src_type,
kono
parents:
diff changeset
491 const void* __src_ptr) const;
kono
parents:
diff changeset
492 };
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 // Type information for a class with a single non-virtual base.
kono
parents:
diff changeset
495 class __si_class_type_info : public __class_type_info
kono
parents:
diff changeset
496 {
kono
parents:
diff changeset
497 public:
kono
parents:
diff changeset
498 const __class_type_info* __base_type;
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 explicit
kono
parents:
diff changeset
501 __si_class_type_info(const char *__n, const __class_type_info *__base)
kono
parents:
diff changeset
502 : __class_type_info(__n), __base_type(__base) { }
kono
parents:
diff changeset
503
kono
parents:
diff changeset
504 virtual
kono
parents:
diff changeset
505 ~__si_class_type_info();
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 protected:
kono
parents:
diff changeset
508 __si_class_type_info(const __si_class_type_info&);
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 __si_class_type_info&
kono
parents:
diff changeset
511 operator=(const __si_class_type_info&);
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 // Implementation defined member functions.
kono
parents:
diff changeset
514 virtual bool
kono
parents:
diff changeset
515 __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
kono
parents:
diff changeset
516 const __class_type_info* __dst_type, const void* __obj_ptr,
kono
parents:
diff changeset
517 const __class_type_info* __src_type, const void* __src_ptr,
kono
parents:
diff changeset
518 __dyncast_result& __result) const;
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 virtual __sub_kind
kono
parents:
diff changeset
521 __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
522 const __class_type_info* __src_type,
kono
parents:
diff changeset
523 const void* __sub_ptr) const;
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 virtual bool
kono
parents:
diff changeset
526 __do_upcast(const __class_type_info*__dst, const void*__obj,
kono
parents:
diff changeset
527 __upcast_result& __restrict __result) const;
kono
parents:
diff changeset
528 };
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 // Type information for a class with multiple and/or virtual bases.
kono
parents:
diff changeset
531 class __vmi_class_type_info : public __class_type_info
kono
parents:
diff changeset
532 {
kono
parents:
diff changeset
533 public:
kono
parents:
diff changeset
534 unsigned int __flags; // Details about the class hierarchy.
kono
parents:
diff changeset
535 unsigned int __base_count; // Number of direct bases.
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 // The array of bases uses the trailing array struct hack so this
kono
parents:
diff changeset
538 // class is not constructable with a normal constructor. It is
kono
parents:
diff changeset
539 // internally generated by the compiler.
kono
parents:
diff changeset
540 __base_class_type_info __base_info[1]; // Array of bases.
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 explicit
kono
parents:
diff changeset
543 __vmi_class_type_info(const char* __n, int ___flags)
kono
parents:
diff changeset
544 : __class_type_info(__n), __flags(___flags), __base_count(0) { }
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 virtual
kono
parents:
diff changeset
547 ~__vmi_class_type_info();
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 // Implementation defined types.
kono
parents:
diff changeset
550 enum __flags_masks
kono
parents:
diff changeset
551 {
kono
parents:
diff changeset
552 __non_diamond_repeat_mask = 0x1, // Distinct instance of repeated base.
kono
parents:
diff changeset
553 __diamond_shaped_mask = 0x2, // Diamond shaped multiple inheritance.
kono
parents:
diff changeset
554 __flags_unknown_mask = 0x10
kono
parents:
diff changeset
555 };
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 protected:
kono
parents:
diff changeset
558 // Implementation defined member functions.
kono
parents:
diff changeset
559 virtual bool
kono
parents:
diff changeset
560 __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
kono
parents:
diff changeset
561 const __class_type_info* __dst_type, const void* __obj_ptr,
kono
parents:
diff changeset
562 const __class_type_info* __src_type, const void* __src_ptr,
kono
parents:
diff changeset
563 __dyncast_result& __result) const;
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 virtual __sub_kind
kono
parents:
diff changeset
566 __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
567 const __class_type_info* __src_type,
kono
parents:
diff changeset
568 const void* __src_ptr) const;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 virtual bool
kono
parents:
diff changeset
571 __do_upcast(const __class_type_info* __dst, const void* __obj,
kono
parents:
diff changeset
572 __upcast_result& __restrict __result) const;
kono
parents:
diff changeset
573 };
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 // Exception handling forward declarations.
kono
parents:
diff changeset
576 struct __cxa_exception;
kono
parents:
diff changeset
577 struct __cxa_refcounted_exception;
kono
parents:
diff changeset
578 struct __cxa_dependent_exception;
kono
parents:
diff changeset
579 struct __cxa_eh_globals;
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 extern "C"
kono
parents:
diff changeset
582 {
kono
parents:
diff changeset
583 // Dynamic cast runtime.
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 // src2dst has the following possible values
kono
parents:
diff changeset
586 // >-1: src_type is a unique public non-virtual base of dst_type
kono
parents:
diff changeset
587 // dst_ptr + src2dst == src_ptr
kono
parents:
diff changeset
588 // -1: unspecified relationship
kono
parents:
diff changeset
589 // -2: src_type is not a public base of dst_type
kono
parents:
diff changeset
590 // -3: src_type is a multiple public non-virtual base of dst_type
kono
parents:
diff changeset
591 void*
kono
parents:
diff changeset
592 __dynamic_cast(const void* __src_ptr, // Starting object.
kono
parents:
diff changeset
593 const __class_type_info* __src_type, // Static type of object.
kono
parents:
diff changeset
594 const __class_type_info* __dst_type, // Desired target type.
kono
parents:
diff changeset
595 ptrdiff_t __src2dst); // How src and dst are related.
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 // Exception handling runtime.
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 // The __cxa_eh_globals for the current thread can be obtained by using
kono
parents:
diff changeset
601 // either of the following functions. The "fast" version assumes at least
kono
parents:
diff changeset
602 // one prior call of __cxa_get_globals has been made from the current
kono
parents:
diff changeset
603 // thread, so no initialization is necessary.
kono
parents:
diff changeset
604 __cxa_eh_globals*
kono
parents:
diff changeset
605 __cxa_get_globals() _GLIBCXX_NOTHROW __attribute__ ((__const__));
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 __cxa_eh_globals*
kono
parents:
diff changeset
608 __cxa_get_globals_fast() _GLIBCXX_NOTHROW __attribute__ ((__const__));
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 // Free the space allocated for the primary exception.
kono
parents:
diff changeset
611 void
kono
parents:
diff changeset
612 __cxa_free_exception(void*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 // Throw the exception.
kono
parents:
diff changeset
615 void
kono
parents:
diff changeset
616 __cxa_throw(void*, std::type_info*, void (_GLIBCXX_CDTOR_CALLABI *) (void *))
kono
parents:
diff changeset
617 __attribute__((__noreturn__));
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 // Used to implement exception handlers.
kono
parents:
diff changeset
620 void*
kono
parents:
diff changeset
621 __cxa_get_exception_ptr(void*) _GLIBCXX_NOTHROW __attribute__ ((__pure__));
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 void*
kono
parents:
diff changeset
624 __cxa_begin_catch(void*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 void
kono
parents:
diff changeset
627 __cxa_end_catch();
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 void
kono
parents:
diff changeset
630 __cxa_rethrow() __attribute__((__noreturn__));
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 // Returns the type_info for the currently handled exception [15.3/8], or
kono
parents:
diff changeset
633 // null if there is none.
kono
parents:
diff changeset
634 std::type_info*
kono
parents:
diff changeset
635 __cxa_current_exception_type() _GLIBCXX_NOTHROW __attribute__ ((__pure__));
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 // GNU Extensions.
kono
parents:
diff changeset
638
kono
parents:
diff changeset
639 // Allocate memory for a dependent exception.
kono
parents:
diff changeset
640 __cxa_dependent_exception*
kono
parents:
diff changeset
641 __cxa_allocate_dependent_exception() _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 // Free the space allocated for the dependent exception.
kono
parents:
diff changeset
644 void
kono
parents:
diff changeset
645 __cxa_free_dependent_exception(__cxa_dependent_exception*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 } // extern "C"
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 // A magic placeholder class that can be caught by reference
kono
parents:
diff changeset
650 // to recognize foreign exceptions.
kono
parents:
diff changeset
651 class __foreign_exception
kono
parents:
diff changeset
652 {
kono
parents:
diff changeset
653 virtual ~__foreign_exception() throw();
kono
parents:
diff changeset
654 virtual void __pure_dummy() = 0; // prevent catch by value
kono
parents:
diff changeset
655 };
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 } // namespace __cxxabiv1
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 /** @namespace abi
kono
parents:
diff changeset
660 * @brief The cross-vendor C++ Application Binary Interface. A
kono
parents:
diff changeset
661 * namespace alias to __cxxabiv1, but user programs should use the
kono
parents:
diff changeset
662 * alias 'abi'.
kono
parents:
diff changeset
663 *
kono
parents:
diff changeset
664 * A brief overview of an ABI is given in the libstdc++ FAQ, question
kono
parents:
diff changeset
665 * 5.8 (you may have a copy of the FAQ locally, or you can view the online
kono
parents:
diff changeset
666 * version at http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#5_8 ).
kono
parents:
diff changeset
667 *
kono
parents:
diff changeset
668 * GCC subscribes to a cross-vendor ABI for C++, sometimes
kono
parents:
diff changeset
669 * called the IA64 ABI because it happens to be the native ABI for that
kono
parents:
diff changeset
670 * platform. It is summarized at http://www.codesourcery.com/cxx-abi/
kono
parents:
diff changeset
671 * along with the current specification.
kono
parents:
diff changeset
672 *
kono
parents:
diff changeset
673 * For users of GCC greater than or equal to 3.x, entry points are
kono
parents:
diff changeset
674 * available in <cxxabi.h>, which notes, <em>'It is not normally
kono
parents:
diff changeset
675 * necessary for user programs to include this header, or use the
kono
parents:
diff changeset
676 * entry points directly. However, this header is available should
kono
parents:
diff changeset
677 * that be needed.'</em>
kono
parents:
diff changeset
678 */
kono
parents:
diff changeset
679 namespace abi = __cxxabiv1;
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 namespace __gnu_cxx
kono
parents:
diff changeset
682 {
kono
parents:
diff changeset
683 /**
kono
parents:
diff changeset
684 * @brief Exception thrown by __cxa_guard_acquire.
kono
parents:
diff changeset
685 * @ingroup exceptions
kono
parents:
diff changeset
686 *
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 * C++ 2011 6.7 [stmt.dcl]/4: If control re-enters the declaration
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 * recursively while the variable is being initialized, the behavior
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689 * is undefined.
111
kono
parents:
diff changeset
690 *
kono
parents:
diff changeset
691 * Since we already have a library function to handle locking, we might
kono
parents:
diff changeset
692 * as well check for this situation and throw an exception.
kono
parents:
diff changeset
693 * We use the second byte of the guard variable to remember that we're
kono
parents:
diff changeset
694 * in the middle of an initialization.
kono
parents:
diff changeset
695 */
kono
parents:
diff changeset
696 class recursive_init_error: public std::exception
kono
parents:
diff changeset
697 {
kono
parents:
diff changeset
698 public:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 recursive_init_error() _GLIBCXX_NOTHROW;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
700 virtual ~recursive_init_error() _GLIBCXX_NOTHROW;
111
kono
parents:
diff changeset
701 };
kono
parents:
diff changeset
702 }
kono
parents:
diff changeset
703 #endif // __cplusplus
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 #pragma GCC visibility pop
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 #endif // __CXXABI_H