annotate libstdc++-v3/libsupc++/cxxabi.h @ 127:4c56639505ff

fix function.c and add CbC-example Makefile
author mir3636
date Wed, 11 Apr 2018 18:46:58 +0900
parents 04ced10e8804
children 84e7813d76e9
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
kono
parents:
diff changeset
3 // Copyright (C) 2000-2017 Free Software Foundation, Inc.
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 *
kono
parents:
diff changeset
168 * @param __length If @a __length is non-NULL, the length of the
kono
parents:
diff changeset
169 * buffer containing the demangled name is placed in @a *__length.
kono
parents:
diff changeset
170 *
kono
parents:
diff changeset
171 * @param __status @a *__status is set to one of the following values:
kono
parents:
diff changeset
172 * 0: The demangling operation succeeded.
kono
parents:
diff changeset
173 * -1: A memory allocation failure occurred.
kono
parents:
diff changeset
174 * -2: @a mangled_name is not a valid name under the C++ ABI mangling rules.
kono
parents:
diff changeset
175 * -3: One of the arguments is invalid.
kono
parents:
diff changeset
176 *
kono
parents:
diff changeset
177 * @return A pointer to the start of the NUL-terminated demangled
kono
parents:
diff changeset
178 * name, or NULL if the demangling fails. The caller is
kono
parents:
diff changeset
179 * responsible for deallocating this memory using @c free.
kono
parents:
diff changeset
180 *
kono
parents:
diff changeset
181 * The demangling is performed using the C++ ABI mangling rules,
kono
parents:
diff changeset
182 * with GNU extensions. For example, this function is used in
kono
parents:
diff changeset
183 * __gnu_cxx::__verbose_terminate_handler.
kono
parents:
diff changeset
184 *
kono
parents:
diff changeset
185 * See https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
kono
parents:
diff changeset
186 * for other examples of use.
kono
parents:
diff changeset
187 *
kono
parents:
diff changeset
188 * @note The same demangling functionality is available via
kono
parents:
diff changeset
189 * libiberty (@c <libiberty/demangle.h> and @c libiberty.a) in GCC
kono
parents:
diff changeset
190 * 3.1 and later, but that requires explicit installation (@c
kono
parents:
diff changeset
191 * --enable-install-libiberty) and uses a different API, although
kono
parents:
diff changeset
192 * the ABI is unchanged.
kono
parents:
diff changeset
193 */
kono
parents:
diff changeset
194 char*
kono
parents:
diff changeset
195 __cxa_demangle(const char* __mangled_name, char* __output_buffer,
kono
parents:
diff changeset
196 size_t* __length, int* __status);
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 #ifdef __cplusplus
kono
parents:
diff changeset
199 }
kono
parents:
diff changeset
200 } // namespace __cxxabiv1
kono
parents:
diff changeset
201 #endif
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 #ifdef __cplusplus
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 #include <typeinfo>
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 namespace __cxxabiv1
kono
parents:
diff changeset
208 {
kono
parents:
diff changeset
209 // Type information for int, float etc.
kono
parents:
diff changeset
210 class __fundamental_type_info : public std::type_info
kono
parents:
diff changeset
211 {
kono
parents:
diff changeset
212 public:
kono
parents:
diff changeset
213 explicit
kono
parents:
diff changeset
214 __fundamental_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 virtual
kono
parents:
diff changeset
217 ~__fundamental_type_info();
kono
parents:
diff changeset
218 };
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 // Type information for array objects.
kono
parents:
diff changeset
221 class __array_type_info : public std::type_info
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 public:
kono
parents:
diff changeset
224 explicit
kono
parents:
diff changeset
225 __array_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 virtual
kono
parents:
diff changeset
228 ~__array_type_info();
kono
parents:
diff changeset
229 };
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 // Type information for functions (both member and non-member).
kono
parents:
diff changeset
232 class __function_type_info : public std::type_info
kono
parents:
diff changeset
233 {
kono
parents:
diff changeset
234 public:
kono
parents:
diff changeset
235 explicit
kono
parents:
diff changeset
236 __function_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 virtual
kono
parents:
diff changeset
239 ~__function_type_info();
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 protected:
kono
parents:
diff changeset
242 // Implementation defined member function.
kono
parents:
diff changeset
243 virtual bool
kono
parents:
diff changeset
244 __is_function_p() const;
kono
parents:
diff changeset
245 };
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 // Type information for enumerations.
kono
parents:
diff changeset
248 class __enum_type_info : public std::type_info
kono
parents:
diff changeset
249 {
kono
parents:
diff changeset
250 public:
kono
parents:
diff changeset
251 explicit
kono
parents:
diff changeset
252 __enum_type_info(const char* __n) : std::type_info(__n) { }
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 virtual
kono
parents:
diff changeset
255 ~__enum_type_info();
kono
parents:
diff changeset
256 };
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 // Common type information for simple pointers and pointers to member.
kono
parents:
diff changeset
259 class __pbase_type_info : public std::type_info
kono
parents:
diff changeset
260 {
kono
parents:
diff changeset
261 public:
kono
parents:
diff changeset
262 unsigned int __flags; // Qualification of the target object.
kono
parents:
diff changeset
263 const std::type_info* __pointee; // Type of pointed to object.
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 explicit
kono
parents:
diff changeset
266 __pbase_type_info(const char* __n, int __quals,
kono
parents:
diff changeset
267 const std::type_info* __type)
kono
parents:
diff changeset
268 : std::type_info(__n), __flags(__quals), __pointee(__type)
kono
parents:
diff changeset
269 { }
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 virtual
kono
parents:
diff changeset
272 ~__pbase_type_info();
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 // Implementation defined type.
kono
parents:
diff changeset
275 enum __masks
kono
parents:
diff changeset
276 {
kono
parents:
diff changeset
277 __const_mask = 0x1,
kono
parents:
diff changeset
278 __volatile_mask = 0x2,
kono
parents:
diff changeset
279 __restrict_mask = 0x4,
kono
parents:
diff changeset
280 __incomplete_mask = 0x8,
kono
parents:
diff changeset
281 __incomplete_class_mask = 0x10,
kono
parents:
diff changeset
282 __transaction_safe_mask = 0x20,
kono
parents:
diff changeset
283 __noexcept_mask = 0x40
kono
parents:
diff changeset
284 };
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 protected:
kono
parents:
diff changeset
287 __pbase_type_info(const __pbase_type_info&);
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 __pbase_type_info&
kono
parents:
diff changeset
290 operator=(const __pbase_type_info&);
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 // Implementation defined member functions.
kono
parents:
diff changeset
293 virtual bool
kono
parents:
diff changeset
294 __do_catch(const std::type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
295 unsigned int __outer) const;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 inline virtual bool
kono
parents:
diff changeset
298 __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
299 unsigned __outer) const;
kono
parents:
diff changeset
300 };
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 inline bool __pbase_type_info::
kono
parents:
diff changeset
303 __pointer_catch (const __pbase_type_info *thrown_type,
kono
parents:
diff changeset
304 void **thr_obj,
kono
parents:
diff changeset
305 unsigned outer) const
kono
parents:
diff changeset
306 {
kono
parents:
diff changeset
307 return __pointee->__do_catch (thrown_type->__pointee, thr_obj, outer + 2);
kono
parents:
diff changeset
308 }
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 // Type information for simple pointers.
kono
parents:
diff changeset
311 class __pointer_type_info : public __pbase_type_info
kono
parents:
diff changeset
312 {
kono
parents:
diff changeset
313 public:
kono
parents:
diff changeset
314 explicit
kono
parents:
diff changeset
315 __pointer_type_info(const char* __n, int __quals,
kono
parents:
diff changeset
316 const std::type_info* __type)
kono
parents:
diff changeset
317 : __pbase_type_info (__n, __quals, __type) { }
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 virtual
kono
parents:
diff changeset
321 ~__pointer_type_info();
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 protected:
kono
parents:
diff changeset
324 // Implementation defined member functions.
kono
parents:
diff changeset
325 virtual bool
kono
parents:
diff changeset
326 __is_pointer_p() const;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 virtual bool
kono
parents:
diff changeset
329 __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
330 unsigned __outer) const;
kono
parents:
diff changeset
331 };
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 class __class_type_info;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 // Type information for a pointer to member variable.
kono
parents:
diff changeset
336 class __pointer_to_member_type_info : public __pbase_type_info
kono
parents:
diff changeset
337 {
kono
parents:
diff changeset
338 public:
kono
parents:
diff changeset
339 __class_type_info* __context; // Class of the member.
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 explicit
kono
parents:
diff changeset
342 __pointer_to_member_type_info(const char* __n, int __quals,
kono
parents:
diff changeset
343 const std::type_info* __type,
kono
parents:
diff changeset
344 __class_type_info* __klass)
kono
parents:
diff changeset
345 : __pbase_type_info(__n, __quals, __type), __context(__klass) { }
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 virtual
kono
parents:
diff changeset
348 ~__pointer_to_member_type_info();
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 protected:
kono
parents:
diff changeset
351 __pointer_to_member_type_info(const __pointer_to_member_type_info&);
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 __pointer_to_member_type_info&
kono
parents:
diff changeset
354 operator=(const __pointer_to_member_type_info&);
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 // Implementation defined member function.
kono
parents:
diff changeset
357 virtual bool
kono
parents:
diff changeset
358 __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
359 unsigned __outer) const;
kono
parents:
diff changeset
360 };
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 // Helper class for __vmi_class_type.
kono
parents:
diff changeset
363 class __base_class_type_info
kono
parents:
diff changeset
364 {
kono
parents:
diff changeset
365 public:
kono
parents:
diff changeset
366 const __class_type_info* __base_type; // Base class type.
kono
parents:
diff changeset
367 #ifdef _GLIBCXX_LLP64
kono
parents:
diff changeset
368 long long __offset_flags; // Offset and info.
kono
parents:
diff changeset
369 #else
kono
parents:
diff changeset
370 long __offset_flags; // Offset and info.
kono
parents:
diff changeset
371 #endif
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 enum __offset_flags_masks
kono
parents:
diff changeset
374 {
kono
parents:
diff changeset
375 __virtual_mask = 0x1,
kono
parents:
diff changeset
376 __public_mask = 0x2,
kono
parents:
diff changeset
377 __hwm_bit = 2,
kono
parents:
diff changeset
378 __offset_shift = 8 // Bits to shift offset.
kono
parents:
diff changeset
379 };
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 // Implementation defined member functions.
kono
parents:
diff changeset
382 bool
kono
parents:
diff changeset
383 __is_virtual_p() const
kono
parents:
diff changeset
384 { return __offset_flags & __virtual_mask; }
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 bool
kono
parents:
diff changeset
387 __is_public_p() const
kono
parents:
diff changeset
388 { return __offset_flags & __public_mask; }
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 ptrdiff_t
kono
parents:
diff changeset
391 __offset() const
kono
parents:
diff changeset
392 {
kono
parents:
diff changeset
393 // This shift, being of a signed type, is implementation
kono
parents:
diff changeset
394 // defined. GCC implements such shifts as arithmetic, which is
kono
parents:
diff changeset
395 // what we want.
kono
parents:
diff changeset
396 return static_cast<ptrdiff_t>(__offset_flags) >> __offset_shift;
kono
parents:
diff changeset
397 }
kono
parents:
diff changeset
398 };
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 // Type information for a class.
kono
parents:
diff changeset
401 class __class_type_info : public std::type_info
kono
parents:
diff changeset
402 {
kono
parents:
diff changeset
403 public:
kono
parents:
diff changeset
404 explicit
kono
parents:
diff changeset
405 __class_type_info (const char *__n) : type_info(__n) { }
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 virtual
kono
parents:
diff changeset
408 ~__class_type_info ();
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 // Implementation defined types.
kono
parents:
diff changeset
411 // The type sub_kind tells us about how a base object is contained
kono
parents:
diff changeset
412 // within a derived object. We often do this lazily, hence the
kono
parents:
diff changeset
413 // UNKNOWN value. At other times we may use NOT_CONTAINED to mean
kono
parents:
diff changeset
414 // not publicly contained.
kono
parents:
diff changeset
415 enum __sub_kind
kono
parents:
diff changeset
416 {
kono
parents:
diff changeset
417 // We have no idea.
kono
parents:
diff changeset
418 __unknown = 0,
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 // Not contained within us (in some circumstances this might
kono
parents:
diff changeset
421 // mean not contained publicly)
kono
parents:
diff changeset
422 __not_contained,
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 // Contained ambiguously.
kono
parents:
diff changeset
425 __contained_ambig,
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 // Via a virtual path.
kono
parents:
diff changeset
428 __contained_virtual_mask = __base_class_type_info::__virtual_mask,
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 // Via a public path.
kono
parents:
diff changeset
431 __contained_public_mask = __base_class_type_info::__public_mask,
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 // Contained within us.
kono
parents:
diff changeset
434 __contained_mask = 1 << __base_class_type_info::__hwm_bit,
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 __contained_private = __contained_mask,
kono
parents:
diff changeset
437 __contained_public = __contained_mask | __contained_public_mask
kono
parents:
diff changeset
438 };
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 struct __upcast_result;
kono
parents:
diff changeset
441 struct __dyncast_result;
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 protected:
kono
parents:
diff changeset
444 // Implementation defined member functions.
kono
parents:
diff changeset
445 virtual bool
kono
parents:
diff changeset
446 __do_upcast(const __class_type_info* __dst_type, void**__obj_ptr) const;
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 virtual bool
kono
parents:
diff changeset
449 __do_catch(const type_info* __thr_type, void** __thr_obj,
kono
parents:
diff changeset
450 unsigned __outer) const;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 public:
kono
parents:
diff changeset
453 // Helper for upcast. See if DST is us, or one of our bases.
kono
parents:
diff changeset
454 // Return false if not found, true if found.
kono
parents:
diff changeset
455 virtual bool
kono
parents:
diff changeset
456 __do_upcast(const __class_type_info* __dst, const void* __obj,
kono
parents:
diff changeset
457 __upcast_result& __restrict __result) const;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 // Indicate whether SRC_PTR of type SRC_TYPE is contained publicly
kono
parents:
diff changeset
460 // within OBJ_PTR. OBJ_PTR points to a base object of our type,
kono
parents:
diff changeset
461 // which is the destination type. SRC2DST indicates how SRC
kono
parents:
diff changeset
462 // objects might be contained within this type. If SRC_PTR is one
kono
parents:
diff changeset
463 // of our SRC_TYPE bases, indicate the virtuality. Returns
kono
parents:
diff changeset
464 // not_contained for non containment or private containment.
kono
parents:
diff changeset
465 inline __sub_kind
kono
parents:
diff changeset
466 __find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
467 const __class_type_info* __src_type,
kono
parents:
diff changeset
468 const void* __src_ptr) const;
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 // Helper for dynamic cast. ACCESS_PATH gives the access from the
kono
parents:
diff changeset
471 // most derived object to this base. DST_TYPE indicates the
kono
parents:
diff changeset
472 // desired type we want. OBJ_PTR points to a base of our type
kono
parents:
diff changeset
473 // within the complete object. SRC_TYPE indicates the static type
kono
parents:
diff changeset
474 // started from and SRC_PTR points to that base within the most
kono
parents:
diff changeset
475 // derived object. Fill in RESULT with what we find. Return true
kono
parents:
diff changeset
476 // if we have located an ambiguous match.
kono
parents:
diff changeset
477 virtual bool
kono
parents:
diff changeset
478 __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
kono
parents:
diff changeset
479 const __class_type_info* __dst_type, const void* __obj_ptr,
kono
parents:
diff changeset
480 const __class_type_info* __src_type, const void* __src_ptr,
kono
parents:
diff changeset
481 __dyncast_result& __result) const;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 // Helper for find_public_subobj. SRC2DST indicates how SRC_TYPE
kono
parents:
diff changeset
484 // bases are inherited by the type started from -- which is not
kono
parents:
diff changeset
485 // necessarily the current type. The current type will be a base
kono
parents:
diff changeset
486 // of the destination type. OBJ_PTR points to the current base.
kono
parents:
diff changeset
487 virtual __sub_kind
kono
parents:
diff changeset
488 __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
489 const __class_type_info* __src_type,
kono
parents:
diff changeset
490 const void* __src_ptr) const;
kono
parents:
diff changeset
491 };
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 // Type information for a class with a single non-virtual base.
kono
parents:
diff changeset
494 class __si_class_type_info : public __class_type_info
kono
parents:
diff changeset
495 {
kono
parents:
diff changeset
496 public:
kono
parents:
diff changeset
497 const __class_type_info* __base_type;
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 explicit
kono
parents:
diff changeset
500 __si_class_type_info(const char *__n, const __class_type_info *__base)
kono
parents:
diff changeset
501 : __class_type_info(__n), __base_type(__base) { }
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 virtual
kono
parents:
diff changeset
504 ~__si_class_type_info();
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 protected:
kono
parents:
diff changeset
507 __si_class_type_info(const __si_class_type_info&);
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 __si_class_type_info&
kono
parents:
diff changeset
510 operator=(const __si_class_type_info&);
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 // Implementation defined member functions.
kono
parents:
diff changeset
513 virtual bool
kono
parents:
diff changeset
514 __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
kono
parents:
diff changeset
515 const __class_type_info* __dst_type, const void* __obj_ptr,
kono
parents:
diff changeset
516 const __class_type_info* __src_type, const void* __src_ptr,
kono
parents:
diff changeset
517 __dyncast_result& __result) const;
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 virtual __sub_kind
kono
parents:
diff changeset
520 __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
521 const __class_type_info* __src_type,
kono
parents:
diff changeset
522 const void* __sub_ptr) const;
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 virtual bool
kono
parents:
diff changeset
525 __do_upcast(const __class_type_info*__dst, const void*__obj,
kono
parents:
diff changeset
526 __upcast_result& __restrict __result) const;
kono
parents:
diff changeset
527 };
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 // Type information for a class with multiple and/or virtual bases.
kono
parents:
diff changeset
530 class __vmi_class_type_info : public __class_type_info
kono
parents:
diff changeset
531 {
kono
parents:
diff changeset
532 public:
kono
parents:
diff changeset
533 unsigned int __flags; // Details about the class hierarchy.
kono
parents:
diff changeset
534 unsigned int __base_count; // Number of direct bases.
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 // The array of bases uses the trailing array struct hack so this
kono
parents:
diff changeset
537 // class is not constructable with a normal constructor. It is
kono
parents:
diff changeset
538 // internally generated by the compiler.
kono
parents:
diff changeset
539 __base_class_type_info __base_info[1]; // Array of bases.
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 explicit
kono
parents:
diff changeset
542 __vmi_class_type_info(const char* __n, int ___flags)
kono
parents:
diff changeset
543 : __class_type_info(__n), __flags(___flags), __base_count(0) { }
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 virtual
kono
parents:
diff changeset
546 ~__vmi_class_type_info();
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 // Implementation defined types.
kono
parents:
diff changeset
549 enum __flags_masks
kono
parents:
diff changeset
550 {
kono
parents:
diff changeset
551 __non_diamond_repeat_mask = 0x1, // Distinct instance of repeated base.
kono
parents:
diff changeset
552 __diamond_shaped_mask = 0x2, // Diamond shaped multiple inheritance.
kono
parents:
diff changeset
553 __flags_unknown_mask = 0x10
kono
parents:
diff changeset
554 };
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 protected:
kono
parents:
diff changeset
557 // Implementation defined member functions.
kono
parents:
diff changeset
558 virtual bool
kono
parents:
diff changeset
559 __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
kono
parents:
diff changeset
560 const __class_type_info* __dst_type, const void* __obj_ptr,
kono
parents:
diff changeset
561 const __class_type_info* __src_type, const void* __src_ptr,
kono
parents:
diff changeset
562 __dyncast_result& __result) const;
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 virtual __sub_kind
kono
parents:
diff changeset
565 __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
kono
parents:
diff changeset
566 const __class_type_info* __src_type,
kono
parents:
diff changeset
567 const void* __src_ptr) const;
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 virtual bool
kono
parents:
diff changeset
570 __do_upcast(const __class_type_info* __dst, const void* __obj,
kono
parents:
diff changeset
571 __upcast_result& __restrict __result) const;
kono
parents:
diff changeset
572 };
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 // Exception handling forward declarations.
kono
parents:
diff changeset
575 struct __cxa_exception;
kono
parents:
diff changeset
576 struct __cxa_refcounted_exception;
kono
parents:
diff changeset
577 struct __cxa_dependent_exception;
kono
parents:
diff changeset
578 struct __cxa_eh_globals;
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 extern "C"
kono
parents:
diff changeset
581 {
kono
parents:
diff changeset
582 // Dynamic cast runtime.
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 // src2dst has the following possible values
kono
parents:
diff changeset
585 // >-1: src_type is a unique public non-virtual base of dst_type
kono
parents:
diff changeset
586 // dst_ptr + src2dst == src_ptr
kono
parents:
diff changeset
587 // -1: unspecified relationship
kono
parents:
diff changeset
588 // -2: src_type is not a public base of dst_type
kono
parents:
diff changeset
589 // -3: src_type is a multiple public non-virtual base of dst_type
kono
parents:
diff changeset
590 void*
kono
parents:
diff changeset
591 __dynamic_cast(const void* __src_ptr, // Starting object.
kono
parents:
diff changeset
592 const __class_type_info* __src_type, // Static type of object.
kono
parents:
diff changeset
593 const __class_type_info* __dst_type, // Desired target type.
kono
parents:
diff changeset
594 ptrdiff_t __src2dst); // How src and dst are related.
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 // Exception handling runtime.
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 // The __cxa_eh_globals for the current thread can be obtained by using
kono
parents:
diff changeset
600 // either of the following functions. The "fast" version assumes at least
kono
parents:
diff changeset
601 // one prior call of __cxa_get_globals has been made from the current
kono
parents:
diff changeset
602 // thread, so no initialization is necessary.
kono
parents:
diff changeset
603 __cxa_eh_globals*
kono
parents:
diff changeset
604 __cxa_get_globals() _GLIBCXX_NOTHROW __attribute__ ((__const__));
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 __cxa_eh_globals*
kono
parents:
diff changeset
607 __cxa_get_globals_fast() _GLIBCXX_NOTHROW __attribute__ ((__const__));
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 // Free the space allocated for the primary exception.
kono
parents:
diff changeset
610 void
kono
parents:
diff changeset
611 __cxa_free_exception(void*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 // Throw the exception.
kono
parents:
diff changeset
614 void
kono
parents:
diff changeset
615 __cxa_throw(void*, std::type_info*, void (_GLIBCXX_CDTOR_CALLABI *) (void *))
kono
parents:
diff changeset
616 __attribute__((__noreturn__));
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 // Used to implement exception handlers.
kono
parents:
diff changeset
619 void*
kono
parents:
diff changeset
620 __cxa_get_exception_ptr(void*) _GLIBCXX_NOTHROW __attribute__ ((__pure__));
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 void*
kono
parents:
diff changeset
623 __cxa_begin_catch(void*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 void
kono
parents:
diff changeset
626 __cxa_end_catch();
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 void
kono
parents:
diff changeset
629 __cxa_rethrow() __attribute__((__noreturn__));
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 // Returns the type_info for the currently handled exception [15.3/8], or
kono
parents:
diff changeset
632 // null if there is none.
kono
parents:
diff changeset
633 std::type_info*
kono
parents:
diff changeset
634 __cxa_current_exception_type() _GLIBCXX_NOTHROW __attribute__ ((__pure__));
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 // GNU Extensions.
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 // Allocate memory for a dependent exception.
kono
parents:
diff changeset
639 __cxa_dependent_exception*
kono
parents:
diff changeset
640 __cxa_allocate_dependent_exception() _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
641
kono
parents:
diff changeset
642 // Free the space allocated for the dependent exception.
kono
parents:
diff changeset
643 void
kono
parents:
diff changeset
644 __cxa_free_dependent_exception(__cxa_dependent_exception*) _GLIBCXX_NOTHROW;
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 } // extern "C"
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 // A magic placeholder class that can be caught by reference
kono
parents:
diff changeset
649 // to recognize foreign exceptions.
kono
parents:
diff changeset
650 class __foreign_exception
kono
parents:
diff changeset
651 {
kono
parents:
diff changeset
652 virtual ~__foreign_exception() throw();
kono
parents:
diff changeset
653 virtual void __pure_dummy() = 0; // prevent catch by value
kono
parents:
diff changeset
654 };
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 } // namespace __cxxabiv1
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 /** @namespace abi
kono
parents:
diff changeset
659 * @brief The cross-vendor C++ Application Binary Interface. A
kono
parents:
diff changeset
660 * namespace alias to __cxxabiv1, but user programs should use the
kono
parents:
diff changeset
661 * alias 'abi'.
kono
parents:
diff changeset
662 *
kono
parents:
diff changeset
663 * A brief overview of an ABI is given in the libstdc++ FAQ, question
kono
parents:
diff changeset
664 * 5.8 (you may have a copy of the FAQ locally, or you can view the online
kono
parents:
diff changeset
665 * version at http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#5_8 ).
kono
parents:
diff changeset
666 *
kono
parents:
diff changeset
667 * GCC subscribes to a cross-vendor ABI for C++, sometimes
kono
parents:
diff changeset
668 * called the IA64 ABI because it happens to be the native ABI for that
kono
parents:
diff changeset
669 * platform. It is summarized at http://www.codesourcery.com/cxx-abi/
kono
parents:
diff changeset
670 * along with the current specification.
kono
parents:
diff changeset
671 *
kono
parents:
diff changeset
672 * For users of GCC greater than or equal to 3.x, entry points are
kono
parents:
diff changeset
673 * available in <cxxabi.h>, which notes, <em>'It is not normally
kono
parents:
diff changeset
674 * necessary for user programs to include this header, or use the
kono
parents:
diff changeset
675 * entry points directly. However, this header is available should
kono
parents:
diff changeset
676 * that be needed.'</em>
kono
parents:
diff changeset
677 */
kono
parents:
diff changeset
678 namespace abi = __cxxabiv1;
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 namespace __gnu_cxx
kono
parents:
diff changeset
681 {
kono
parents:
diff changeset
682 /**
kono
parents:
diff changeset
683 * @brief Exception thrown by __cxa_guard_acquire.
kono
parents:
diff changeset
684 * @ingroup exceptions
kono
parents:
diff changeset
685 *
kono
parents:
diff changeset
686 * 6.7[stmt.dcl]/4: If control re-enters the declaration (recursively)
kono
parents:
diff changeset
687 * while the object is being initialized, the behavior is undefined.
kono
parents:
diff changeset
688 *
kono
parents:
diff changeset
689 * Since we already have a library function to handle locking, we might
kono
parents:
diff changeset
690 * as well check for this situation and throw an exception.
kono
parents:
diff changeset
691 * We use the second byte of the guard variable to remember that we're
kono
parents:
diff changeset
692 * in the middle of an initialization.
kono
parents:
diff changeset
693 */
kono
parents:
diff changeset
694 class recursive_init_error: public std::exception
kono
parents:
diff changeset
695 {
kono
parents:
diff changeset
696 public:
kono
parents:
diff changeset
697 recursive_init_error() throw() { }
kono
parents:
diff changeset
698 virtual ~recursive_init_error() throw ();
kono
parents:
diff changeset
699 };
kono
parents:
diff changeset
700 }
kono
parents:
diff changeset
701 #endif // __cplusplus
kono
parents:
diff changeset
702
kono
parents:
diff changeset
703 #pragma GCC visibility pop
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 #endif // __CXXABI_H