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