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