]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - libstdc++-v3/libsupc++/cxxabi.h
Imported gcc-4.4.3
[msp430-gcc.git] / libstdc++-v3 / libsupc++ / cxxabi.h
index 371b77ef2b8736cd870e1e7925e249ab260f4687..bfdd8e5896d576e874d0a516e4c5f2714ab6303b 100644 (file)
@@ -1,32 +1,28 @@
 // new abi support -*- C++ -*-
   
-// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2002, 2003, 2004, 2006, 2007, 2009
+// Free Software Foundation, Inc.
 //
-// This file is part of GNU CC.
+// This file is part of GCC.
 //
-// GNU CC is free software; you can redistribute it and/or modify
+// GCC is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2, or (at your option)
+// the Free Software Foundation; either version 3, or (at your option)
 // any later version.
 // 
-// GNU CC is distributed in the hope that it will be useful,
+// GCC is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU General Public License for more details.
 // 
-// You should have received a copy of the GNU General Public License
-// along with GNU CC; see the file COPYING.  If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
 
 // Written by Nathan Sidwell, Codesourcery LLC, <nathan@codesourcery.com>
  
    is includable from both C and C++. Though the C++ specific parts are not
    available in C, naturally enough.  */
 
-#ifndef __CXXABI_H
-#define __CXXABI_H 1
+/** @file cxxabi.h
+ *  The header provides an interface to the C++ ABI.
+ */
+
+#ifndef _CXXABI_H
+#define _CXXABI_H 1
+
+#pragma GCC visibility push(default)
 
+#include <stddef.h>
+#include <bits/cxxabi_tweaks.h>
+#include <cxxabi-forced.h>
 #ifdef __cplusplus
+#define _GLIBCXX_NOTHROW throw() 
+#else
+#define _GLIBCXX_NOTHROW __attribute__((nothrow))
+#endif
 
-// We use the compiler builtins __SIZE_TYPE__ and __PTRDIFF_TYPE__ instead of
-// std::size_t and std::ptrdiff_t respectively. This makes us independent of
-// the conformance level of <cstddef> and whether -fhonor-std was supplied.
-// <cstddef> is not currently available during compiler building anyway.
-// Including <stddef.h> would be wrong, as that would rudely place size_t in
-// the global namespace.
+#ifdef __cplusplus
+namespace __cxxabiv1
+{  
+  extern "C" 
+  {
+#endif
+
+  typedef __cxa_cdtor_return_type (*__cxa_cdtor_type)(void *);
+
+  // Allocate array.
+  void* 
+  __cxa_vec_new(size_t __element_count, size_t __element_size, 
+               size_t __padding_size, __cxa_cdtor_type constructor,
+               __cxa_cdtor_type destructor);
+
+  void*
+  __cxa_vec_new2(size_t __element_count, size_t __element_size,
+                size_t __padding_size, __cxa_cdtor_type constructor,
+                __cxa_cdtor_type destructor, void *(*__alloc) (size_t), 
+                void (*__dealloc) (void*));
+
+  void*
+  __cxa_vec_new3(size_t __element_count, size_t __element_size,
+                size_t __padding_size, __cxa_cdtor_type constructor,
+                __cxa_cdtor_type destructor, void *(*__alloc) (size_t), 
+                void (*__dealloc) (void*, size_t));
+
+  // Construct array.
+  __cxa_vec_ctor_return_type
+  __cxa_vec_ctor(void* __array_address, size_t __element_count,
+                size_t __element_size, __cxa_cdtor_type constructor,
+                __cxa_cdtor_type destructor);
+
+  __cxa_vec_ctor_return_type
+  __cxa_vec_cctor(void* dest_array, void* src_array, size_t element_count, 
+                 size_t element_size, 
+                 __cxa_cdtor_return_type (*constructor) (void*, void*), 
+                 __cxa_cdtor_type destructor);
+  // Destruct array.
+  void 
+  __cxa_vec_dtor(void* __array_address, size_t __element_count,
+                size_t __element_size, __cxa_cdtor_type destructor);
+  
+  void 
+  __cxa_vec_cleanup(void* __array_address, size_t __element_count,
+                   size_t __element_size, __cxa_cdtor_type destructor);
+  
+  // Destruct and release array.
+  void 
+  __cxa_vec_delete(void* __array_address, size_t __element_size,
+                  size_t __padding_size, __cxa_cdtor_type destructor);
+
+  void 
+  __cxa_vec_delete2(void* __array_address, size_t __element_size,
+                   size_t __padding_size, __cxa_cdtor_type destructor,
+                   void (*__dealloc) (void*));
+                  
+  void 
+  __cxa_vec_delete3(void* __array_address, size_t __element_size,
+                   size_t __padding_size, __cxa_cdtor_type destructor,
+                   void (*__dealloc) (void*, size_t));
+
+  int 
+  __cxa_guard_acquire(__guard*);
+
+  void 
+  __cxa_guard_release(__guard*);
+
+  void 
+  __cxa_guard_abort(__guard*);
+
+  // Pure virtual functions.
+  void
+  __cxa_pure_virtual(void);
+
+  // Exception handling.
+  void
+  __cxa_bad_cast();
+
+  void
+  __cxa_bad_typeid();
+
+  // DSO destruction.
+  int
+  __cxa_atexit(void (*)(void*), void*, void*) _GLIBCXX_NOTHROW;
+
+  int
+  __cxa_finalize(void*);
+
+
+  /**
+   *  @brief Demangling routine. 
+   *  ABI-mandated entry point in the C++ runtime library for demangling.
+   *
+   *  @param __mangled_name A NUL-terminated character string
+   *  containing the name to be demangled.
+   *
+   *  @param __output_buffer A region of memory, allocated with
+   *  malloc, of @a *__length bytes, into which the demangled name is
+   *  stored.  If @a __output_buffer is not long enough, it is
+   *  expanded using realloc.  @a __output_buffer may instead be NULL;
+   *  in that case, the demangled name is placed in a region of memory
+   *  allocated with malloc.
+   *
+   *  @param __length If @a __length is non-NULL, the length of the
+   *  buffer containing the demangled name is placed in @a *__length.
+   *
+   *  @param __status @a *__status is set to one of the following values:
+   *   0: The demangling operation succeeded.
+   *  -1: A memory allocation failiure occurred.
+   *  -2: @a mangled_name is not a valid name under the C++ ABI mangling rules.
+   *  -3: One of the arguments is invalid.
+   *
+   *  @return A pointer to the start of the NUL-terminated demangled
+   *  name, or NULL if the demangling fails.  The caller is
+   *  responsible for deallocating this memory using @c free.
+   *
+   *  The demangling is performed using the C++ ABI mangling rules,
+   *  with GNU extensions. For example, this function is used in
+   *  __gnu_cxx::__verbose_terminate_handler.
+   * 
+   *  See http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch39.html
+   *  for other examples of use.
+   *
+   *  @note The same demangling functionality is available via
+   *  libiberty (@c <libiberty/demangle.h> and @c libiberty.a) in GCC
+   *  3.1 and later, but that requires explicit installation (@c
+   *  --enable-install-libiberty) and uses a different API, although
+   *  the ABI is unchanged.
+   */
+  char*
+  __cxa_demangle(const char* __mangled_name, char* __output_buffer,
+                size_t* __length, int* __status);
+#ifdef __cplusplus
+  }
+} // namespace __cxxabiv1
+#endif
+
+#ifdef __cplusplus
 
 #include <typeinfo>
 
 namespace __cxxabiv1
 {
+  // Type information for int, float etc.
+  class __fundamental_type_info : public std::type_info
+  {
+  public:
+    explicit 
+    __fundamental_type_info(const char* __n) : std::type_info(__n) { }
 
-/* type information for int, float etc */
-class __fundamental_type_info
-  : public std::type_info
-{
-public:
-  virtual ~__fundamental_type_info ();
-public:
-  explicit __fundamental_type_info (const char *__n)
-    : std::type_info (__n)
-    { }
-};
+    virtual 
+    ~__fundamental_type_info();
+  };
 
-/* type information for array objects */
-class __array_type_info
-  : public std::type_info
-{
-/* abi defined member functions */
-protected:
-  virtual ~__array_type_info ();
-public:
-  explicit __array_type_info (const char *__n)
-    : std::type_info (__n)
-    { }
-};
+  // Type information for array objects.
+  class __array_type_info : public std::type_info
+  {
+  public:
+    explicit 
+    __array_type_info(const char* __n) : std::type_info(__n) { }
 
-/* type information for functions (both member and non-member) */
-class __function_type_info
-  : public std::type_info
-{
-/* abi defined member functions */
-public:
-  virtual ~__function_type_info ();
-public:
-  explicit __function_type_info (const char *__n)
-    : std::type_info (__n)
-    { }
-  
-/* implementation defined member functions */
-protected:
-  virtual bool __is_function_p () const;
-};
-
-/* type information for enumerations */
-class __enum_type_info
-  : public std::type_info
-{
-/* abi defined member functions */
-public:
-  virtual ~__enum_type_info ();
-public:
-  explicit __enum_type_info (const char *__n)
-    : std::type_info (__n)
-    { }
-};
+    virtual 
+    ~__array_type_info();
+  };
 
-/* common type information for simple pointers and pointers to member */
-class __pbase_type_info
-  : public std::type_info
-{
-/* abi defined member variables */
-public:
-  unsigned int __flags; /* qualification of the target object */
-  const std::type_info *__pointee;   /* type of pointed to object */
-
-/* abi defined member functions */
-public:
-  virtual ~__pbase_type_info ();
-public:
-  explicit __pbase_type_info (const char *__n,
-                                int __quals,
-                                const std::type_info *__type)
-    : std::type_info (__n), __flags (__quals), __pointee (__type)
-    { }
+  // Type information for functions (both member and non-member).
+  class __function_type_info : public std::type_info
+  {
+  public:
+    explicit 
+    __function_type_info(const char* __n) : std::type_info(__n) { }
 
-/* implementation defined types */
-public:
-  enum __masks {
-    __const_mask = 0x1,
-    __volatile_mask = 0x2,
-    __restrict_mask = 0x4,
-    __incomplete_mask = 0x8,
-    __incomplete_class_mask = 0x10
+    virtual 
+    ~__function_type_info();
+
+  protected:
+    // Implementation defined member function.
+    virtual bool 
+    __is_function_p() const;
   };
 
-/* implementation defined member functions */
-protected:
-  virtual bool __do_catch (const std::type_info *__thr_type,
-                           void **__thr_obj,
-                           unsigned __outer) const;
-protected:
-  inline virtual bool __pointer_catch (const __pbase_type_info *__thr_type,
-                                       void **__thr_obj,
-                                       unsigned __outer) const;
-};
-
-/* type information for simple pointers */
-class __pointer_type_info
-  : public __pbase_type_info
-{
-/* abi defined member functions */
-public:
-  virtual ~__pointer_type_info ();
-public:
-  explicit __pointer_type_info (const char *__n,
-                                int __quals,
-                                const std::type_info *__type)
-    : __pbase_type_info (__n, __quals, __type)
+  // Type information for enumerations.
+  class __enum_type_info : public std::type_info
+  {
+  public:
+    explicit 
+    __enum_type_info(const char* __n) : std::type_info(__n) { }
+
+    virtual 
+    ~__enum_type_info();
+  };
+
+  // Common type information for simple pointers and pointers to member.
+  class __pbase_type_info : public std::type_info
+  {
+  public:
+    unsigned int               __flags; // Qualification of the target object.
+    const std::type_info*      __pointee; // Type of pointed to object.
+
+    explicit 
+    __pbase_type_info(const char* __n, int __quals, 
+                     const std::type_info* __type)
+    : std::type_info(__n), __flags(__quals), __pointee(__type)
     { }
+    
+    virtual 
+    ~__pbase_type_info();
+
+    // Implementation defined type.
+    enum __masks 
+      {
+       __const_mask = 0x1,
+       __volatile_mask = 0x2,
+       __restrict_mask = 0x4,
+       __incomplete_mask = 0x8,
+       __incomplete_class_mask = 0x10
+      };
+
+  protected:
+    __pbase_type_info(const __pbase_type_info&);
+
+    __pbase_type_info&
+    operator=(const __pbase_type_info&);
+
+    // Implementation defined member functions.
+    virtual bool 
+    __do_catch(const std::type_info* __thr_type, void** __thr_obj, 
+              unsigned int __outer) const;
+
+    inline virtual bool 
+    __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
+                   unsigned __outer) const;
+  };
+
+  // Type information for simple pointers.
+  class __pointer_type_info : public __pbase_type_info
+  {
+  public:
+    explicit 
+    __pointer_type_info(const char* __n, int __quals, 
+                       const std::type_info* __type)
+    : __pbase_type_info (__n, __quals, __type) { }
 
-/* implementation defined member functions */
-protected:
-  virtual bool __is_pointer_p () const;
 
-protected:
-  virtual bool __pointer_catch (const __pbase_type_info *__thr_type,
-                                void **__thr_obj,
-                                unsigned __outer) const;
-};
+    virtual 
+    ~__pointer_type_info();
 
-/* type information for a pointer to member variable */
-class __pointer_to_member_type_info
-  : public __pbase_type_info
-{
-/* abi defined member variables */
-public:
-  __class_type_info *__context;   /* class of the member */
-
-/* abi defined member functions */
-public:
-  virtual ~__pointer_to_member_type_info ();
-public:
-  explicit __pointer_to_member_type_info (const char *__n,
-                                          int __quals,
-                                          const std::type_info *__type,
-                                          __class_type_info *__klass)
-    : __pbase_type_info (__n, __quals, __type), __context (__klass)
-    { }
+  protected:
+    // Implementation defined member functions.
+    virtual bool 
+    __is_pointer_p() const;
 
-/* implementation defined member functions */
-protected:
-  virtual bool __pointer_catch (const __pbase_type_info *__thr_type,
-                                void **__thr_obj,
-                                unsigned __outer) const;
-};
+    virtual bool 
+    __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj, 
+                   unsigned __outer) const;
+  };
 
-class __class_type_info;
+  class __class_type_info;
 
-/* helper class for __vmi_class_type */
-class __base_class_type_info
-{
-/* abi defined member variables */
-public:
-  const __class_type_info* __base_type;    /* base class type */
-  long __offset_flags;            /* offset and info */
-
-/* implementation defined types */
-public:
-  enum __offset_flags_masks {
-    __virtual_mask = 0x1,
-    __public_mask = 0x2,
-    __hwm_bit = 2,
-    __offset_shift = 8          /* bits to shift offset by */
+  // Type information for a pointer to member variable.
+  class __pointer_to_member_type_info : public __pbase_type_info
+  {
+  public:
+    __class_type_info* __context;   // Class of the member.
+
+    explicit 
+    __pointer_to_member_type_info(const char* __n, int __quals,
+                                 const std::type_info* __type, 
+                                 __class_type_info* __klass)
+    : __pbase_type_info(__n, __quals, __type), __context(__klass) { }
+
+    virtual 
+    ~__pointer_to_member_type_info();
+
+  protected:
+    __pointer_to_member_type_info(const __pointer_to_member_type_info&);
+
+    __pointer_to_member_type_info&
+    operator=(const __pointer_to_member_type_info&);
+
+    // Implementation defined member function.
+    virtual bool 
+    __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
+                   unsigned __outer) const;
   };
+
+  // Helper class for __vmi_class_type.
+  class __base_class_type_info
+  {
+  public:
+    const __class_type_info*   __base_type;  // Base class type.
+    long                       __offset_flags;  // Offset and info.
+
+    enum __offset_flags_masks 
+      {
+       __virtual_mask = 0x1,
+       __public_mask = 0x2,
+       __hwm_bit = 2,
+       __offset_shift = 8          // Bits to shift offset.
+      };
   
-/* implementation defined member functions */
-public:
-  bool __is_virtual_p () const
+    // Implementation defined member functions.
+    bool 
+    __is_virtual_p() const
     { return __offset_flags & __virtual_mask; }
-  bool __is_public_p () const
+
+    bool 
+    __is_public_p() const
     { return __offset_flags & __public_mask; }
-  __PTRDIFF_TYPE__ __offset () const
+
+    ptrdiff_t 
+    __offset() const
     { 
-      // This shift, being of a signed type, is implementation defined. GCC
-      // implements such shifts as arithmetic, which is what we want.
-      return static_cast<__PTRDIFF_TYPE__> (__offset_flags) >> __offset_shift;
+      // This shift, being of a signed type, is implementation
+      // defined. GCC implements such shifts as arithmetic, which is
+      // what we want.
+      return static_cast<ptrdiff_t>(__offset_flags) >> __offset_shift;
     }
-};
-
-/* type information for a class */
-class __class_type_info
-  : public std::type_info
-{
-/* abi defined member functions */
-public:
-  virtual ~__class_type_info ();
-public:
-  explicit __class_type_info (const char *__n)
-    : type_info (__n)
-    { }
+  };
 
-/* implementation defined types */
-public:
-  /* sub_kind tells us about how a base object is contained within a derived
-     object. We often do this lazily, hence the UNKNOWN value. At other times
-     we may use NOT_CONTAINED to mean not publicly contained. */
-  enum __sub_kind
+  // Type information for a class.
+  class __class_type_info : public std::type_info
   {
-    __unknown = 0,              /* we have no idea */
-    __not_contained,            /* not contained within us (in some */
-                                /* circumstances this might mean not contained */
-                                /* publicly) */
-    __contained_ambig,          /* contained ambiguously */
+  public:
+    explicit 
+    __class_type_info (const char *__n) : type_info(__n) { }
+
+    virtual 
+    ~__class_type_info ();
+
+    // Implementation defined types.
+    // The type sub_kind tells us about how a base object is contained
+    // within a derived object. We often do this lazily, hence the
+    // UNKNOWN value. At other times we may use NOT_CONTAINED to mean
+    // not publicly contained.
+    enum __sub_kind
+      {
+       // We have no idea.
+       __unknown = 0, 
+
+       // Not contained within us (in some circumstances this might
+       // mean not contained publicly)
+       __not_contained, 
+
+       // Contained ambiguously.
+       __contained_ambig, 
     
-    __contained_virtual_mask = __base_class_type_info::__virtual_mask, /* via a virtual path */
-    __contained_public_mask = __base_class_type_info::__public_mask,   /* via a public path */
-    __contained_mask = 1 << __base_class_type_info::__hwm_bit,         /* contained within us */
+       // Via a virtual path.
+       __contained_virtual_mask = __base_class_type_info::__virtual_mask, 
+
+       // Via a public path.
+       __contained_public_mask = __base_class_type_info::__public_mask,   
+
+       // Contained within us.
+       __contained_mask = 1 << __base_class_type_info::__hwm_bit,
     
-    __contained_private = __contained_mask,
-    __contained_public = __contained_mask | __contained_public_mask
+       __contained_private = __contained_mask,
+       __contained_public = __contained_mask | __contained_public_mask
+      };
+
+    struct __upcast_result;
+    struct __dyncast_result;
+
+  protected:
+    // Implementation defined member functions.
+    virtual bool 
+    __do_upcast(const __class_type_info* __dst_type, void**__obj_ptr) const;
+
+    virtual bool 
+    __do_catch(const type_info* __thr_type, void** __thr_obj, 
+              unsigned __outer) const;
+
+  public:
+    // Helper for upcast. See if DST is us, or one of our bases. 
+    // Return false if not found, true if found. 
+    virtual bool 
+    __do_upcast(const __class_type_info* __dst, const void* __obj,
+               __upcast_result& __restrict __result) const;
+
+    // Indicate whether SRC_PTR of type SRC_TYPE is contained publicly
+    // within OBJ_PTR. OBJ_PTR points to a base object of our type,
+    // which is the destination type. SRC2DST indicates how SRC
+    // objects might be contained within this type.  If SRC_PTR is one
+    // of our SRC_TYPE bases, indicate the virtuality. Returns
+    // not_contained for non containment or private containment.
+    inline __sub_kind 
+    __find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
+                     const __class_type_info* __src_type, 
+                     const void* __src_ptr) const;
+
+    // Helper for dynamic cast. ACCESS_PATH gives the access from the
+    // most derived object to this base. DST_TYPE indicates the
+    // desired type we want. OBJ_PTR points to a base of our type
+    // within the complete object. SRC_TYPE indicates the static type
+    // started from and SRC_PTR points to that base within the most
+    // derived object. Fill in RESULT with what we find. Return true
+    // if we have located an ambiguous match.
+    virtual bool 
+    __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
+                const __class_type_info* __dst_type, const void* __obj_ptr, 
+                const __class_type_info* __src_type, const void* __src_ptr, 
+                __dyncast_result& __result) const;
+    
+    // Helper for find_public_subobj. SRC2DST indicates how SRC_TYPE
+    // bases are inherited by the type started from -- which is not
+    // necessarily the current type. The current type will be a base
+    // of the destination type.  OBJ_PTR points to the current base.
+    virtual __sub_kind 
+    __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
+                        const __class_type_info* __src_type,
+                        const void* __src_ptr) const;
   };
 
-public:  
-  struct __upcast_result;
-  struct __dyncast_result;
-
-/* implementation defined member functions */
-protected:
-  virtual bool __do_upcast (const __class_type_info *__dst_type, void **__obj_ptr) const;
-
-protected:
-  virtual bool __do_catch (const type_info *__thr_type, void **__thr_obj,
-                           unsigned __outer) const;
-
-
-public:
-  /* Helper for upcast. See if DST is us, or one of our bases. */
-  /* Return false if not found, true if found. */
-  virtual bool __do_upcast (const __class_type_info *__dst,
-                            const void *__obj,
-                            __upcast_result &__restrict __result) const;
-
-public:
-  /* Indicate whether SRC_PTR of type SRC_TYPE is contained publicly within
-     OBJ_PTR. OBJ_PTR points to a base object of our type, which is the
-     destination type. SRC2DST indicates how SRC objects might be contained
-     within this type.  If SRC_PTR is one of our SRC_TYPE bases, indicate the
-     virtuality. Returns not_contained for non containment or private
-     containment. */
-  inline __sub_kind __find_public_src (__PTRDIFF_TYPE__ __src2dst,
-                                       const void *__obj_ptr,
-                                       const __class_type_info *__src_type,
-                                       const void *__src_ptr) const;
-
-public:
-  /* dynamic cast helper. ACCESS_PATH gives the access from the most derived
-     object to this base. DST_TYPE indicates the desired type we want. OBJ_PTR
-     points to a base of our type within the complete object. SRC_TYPE
-     indicates the static type started from and SRC_PTR points to that base
-     within the most derived object. Fill in RESULT with what we find. Return
-     true if we have located an ambiguous match. */
-  virtual bool __do_dyncast (__PTRDIFF_TYPE__ __src2dst,
-                             __sub_kind __access_path,
-                             const __class_type_info *__dst_type,
-                             const void *__obj_ptr,
-                             const __class_type_info *__src_type,
-                             const void *__src_ptr,
-                             __dyncast_result &__result) const;
-public:
-  /* Helper for find_public_subobj. SRC2DST indicates how SRC_TYPE bases are
-     inherited by the type started from -- which is not necessarily the
-     current type. The current type will be a base of the destination type.
-     OBJ_PTR points to the current base. */
-  virtual __sub_kind __do_find_public_src (__PTRDIFF_TYPE__ __src2dst,
-                                           const void *__obj_ptr,
-                                           const __class_type_info *__src_type,
-                                           const void *__src_ptr) const;
-};
-
-/* type information for a class with a single non-virtual base */
-class __si_class_type_info
-  : public __class_type_info
-{
-/* abi defined member variables */
-public:
-  const __class_type_info *__base_type;
-
-/* abi defined member functions */
-public:
-  virtual ~__si_class_type_info ();
-public:
-  explicit __si_class_type_info (const char *__n,
-                                 const __class_type_info *__base)
-    : __class_type_info (__n), __base_type (__base)
-    { }
+  // Type information for a class with a single non-virtual base.
+  class __si_class_type_info : public __class_type_info
+  {
+  public:
+    const __class_type_info* __base_type;
 
-/* implementation defined member functions */
-protected:
-  virtual bool __do_dyncast (__PTRDIFF_TYPE__ __src2dst,
-                             __sub_kind __access_path,
-                             const __class_type_info *__dst_type,
-                             const void *__obj_ptr,
-                             const __class_type_info *__src_type,
-                             const void *__src_ptr,
-                             __dyncast_result &__result) const;
-  virtual __sub_kind __do_find_public_src (__PTRDIFF_TYPE__ __src2dst,
-                                           const void *__obj_ptr,
-                                           const __class_type_info *__src_type,
-                                           const void *__sub_ptr) const;
-  virtual bool __do_upcast (const __class_type_info *__dst,
-                            const void *__obj,
-                            __upcast_result &__restrict __result) const;
-};
-
-/* type information for a class with multiple and/or virtual bases */
-class __vmi_class_type_info : public __class_type_info {
-/* abi defined member variables */
-public:
-  unsigned int __flags;         /* details about the class hierarchy */
-  unsigned int __base_count;    /* number of direct bases */
-  __base_class_type_info __base_info[1]; /* array of bases */
-  /* The array of bases uses the trailing array struct hack
-     so this class is not constructable with a normal constructor. It is
-     internally generated by the compiler. */
-
-/* abi defined member functions */
-public:
-  virtual ~__vmi_class_type_info ();
-public:
-  explicit __vmi_class_type_info (const char *__n,
-                                  int ___flags)
-    : __class_type_info (__n), __flags (___flags), __base_count (0)
-    { }
+    explicit 
+    __si_class_type_info(const char *__n, const __class_type_info *__base)
+    : __class_type_info(__n), __base_type(__base) { }
 
-/* implementation defined types */
-public:
-  enum __flags_masks {
-    __non_diamond_repeat_mask = 0x1,   /* distinct instance of repeated base */
-    __diamond_shaped_mask = 0x2,       /* diamond shaped multiple inheritance */
-    non_public_base_mask = 0x4,      /* has non-public direct or indirect base */
-    public_base_mask = 0x8,          /* has public base (direct) */
-    
-    __flags_unknown_mask = 0x10
-  };
+    virtual 
+    ~__si_class_type_info();
 
-/* implementation defined member functions */
-protected:
-  virtual bool __do_dyncast (__PTRDIFF_TYPE__ __src2dst,
-                             __sub_kind __access_path,
-                             const __class_type_info *__dst_type,
-                             const void *__obj_ptr,
-                             const __class_type_info *__src_type,
-                             const void *__src_ptr,
-                             __dyncast_result &__result) const;
-  virtual __sub_kind __do_find_public_src (__PTRDIFF_TYPE__ __src2dst,
-                                           const void *__obj_ptr,
-                                           const __class_type_info *__src_type,
-                                           const void *__src_ptr) const;
-  virtual bool __do_upcast (const __class_type_info *__dst,
-                            const void *__obj,
-                            __upcast_result &__restrict __result) const;
-};
-
-/* dynamic cast runtime */
-extern "C"
-void *__dynamic_cast (const void *__src_ptr,    /* object started from */
-                      const __class_type_info *__src_type, /* static type of object */
-                      const __class_type_info *__dst_type, /* desired target type */
-                      __PTRDIFF_TYPE__ __src2dst); /* how src and dst are related */
-
-    /* src2dst has the following possible values
-       >= 0: src_type is a unique public non-virtual base of dst_type
-             dst_ptr + src2dst == src_ptr
-       -1: unspecified relationship
-       -2: src_type is not a public base of dst_type
-       -3: src_type is a multiple public non-virtual base of dst_type */
-
-/* array ctor/dtor routines */
-
-/* allocate and construct array */
-extern "C"
-void *__cxa_vec_new (__SIZE_TYPE__ __element_count,
-                     __SIZE_TYPE__ __element_size,
-                     __SIZE_TYPE__ __padding_size,
-                     void (*__constructor) (void *),
-                     void (*__destructor) (void *));
-
-extern "C"
-void *__cxa_vec_new2 (__SIZE_TYPE__ __element_count,
-                      __SIZE_TYPE__ __element_size,
-                      __SIZE_TYPE__ __padding_size,
-                      void (*__constructor) (void *),
-                      void (*__destructor) (void *),
-                      void *(*__alloc) (__SIZE_TYPE__),
-                      void (*__dealloc) (void *));
-
-extern "C"
-void *__cxa_vec_new3 (__SIZE_TYPE__ __element_count,
-                      __SIZE_TYPE__ __element_size,
-                      __SIZE_TYPE__ __padding_size,
-                      void (*__constructor) (void *),
-                      void (*__destructor) (void *),
-                      void *(*__alloc) (__SIZE_TYPE__),
-                      void (*__dealloc) (void *, __SIZE_TYPE__));
-
-/* construct array */
-extern "C"
-void __cxa_vec_ctor (void *__array_address,
-                     __SIZE_TYPE__ __element_count,
-                     __SIZE_TYPE__ __element_size,
-                     void (*__constructor) (void *),
-                     void (*__destructor) (void *));
-
-extern "C"
-void __cxa_vec_cctor (void *dest_array,
-                     void *src_array,
-                     __SIZE_TYPE__ element_count,
-                     __SIZE_TYPE__ element_size,
-                     void (*constructor) (void *, void *),
-                     void (*destructor) (void *));
-/* destruct array */
-extern "C"
-void __cxa_vec_dtor (void *__array_address,
-                     __SIZE_TYPE__ __element_count,
-                     __SIZE_TYPE__ __element_size,
-                     void (*__destructor) (void *));
-
-/* destruct array */
-extern "C"
-void __cxa_vec_cleanup (void *__array_address,
-                       __SIZE_TYPE__ __element_count,
-                       __SIZE_TYPE__ __element_size,
-                       void (*__destructor) (void *));
-
-/* destruct and release array */
-extern "C"
-void __cxa_vec_delete (void *__array_address,
-                       __SIZE_TYPE__ __element_size,
-                       __SIZE_TYPE__ __padding_size,
-                       void (*__destructor) (void *));
-
-extern "C"
-void __cxa_vec_delete2 (void *__array_address,
-                        __SIZE_TYPE__ __element_size,
-                        __SIZE_TYPE__ __padding_size,
-                        void (*__destructor) (void *),
-                        void (*__dealloc) (void *));
-                  
-extern "C"
-void __cxa_vec_delete3 (void *__array_address,
-                        __SIZE_TYPE__ __element_size,
-                        __SIZE_TYPE__ __padding_size,
-                        void (*__destructor) (void *),
-                        void (*__dealloc) (void *, __SIZE_TYPE__));
-                  
-/* demangling routines */
+  protected:
+    __si_class_type_info(const __si_class_type_info&);
 
-extern "C" 
-char *__cxa_demangle (const char *__mangled_name,
-                     char *__output_buffer,
-                     __SIZE_TYPE__ *__length,
-                     int *__status);
+    __si_class_type_info&
+    operator=(const __si_class_type_info&);
 
-// Returns the type_info for the currently handled exception [15.3/8], or
-// null if there is none.
-extern "C"
-std::type_info *__cxa_current_exception_type ();
+    // Implementation defined member functions.
+    virtual bool 
+    __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
+                const __class_type_info* __dst_type, const void* __obj_ptr,
+                const __class_type_info* __src_type, const void* __src_ptr,
+                __dyncast_result& __result) const;
 
-} /* namespace __cxxabiv1 */
+    virtual __sub_kind 
+    __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
+                        const __class_type_info* __src_type,
+                        const void* __sub_ptr) const;
 
-/* User programs should use the alias `abi'. */
+    virtual bool 
+    __do_upcast(const __class_type_info*__dst, const void*__obj,
+               __upcast_result& __restrict __result) const;
+  };
+
+  // Type information for a class with multiple and/or virtual bases.
+  class __vmi_class_type_info : public __class_type_info 
+  {
+  public:
+    unsigned int               __flags;  // Details about the class hierarchy.
+    unsigned int               __base_count;  // Number of direct bases.
+
+    // The array of bases uses the trailing array struct hack so this
+    // class is not constructable with a normal constructor. It is
+    // internally generated by the compiler.
+    __base_class_type_info     __base_info[1];  // Array of bases.
+
+    explicit 
+    __vmi_class_type_info(const char* __n, int ___flags)
+    : __class_type_info(__n), __flags(___flags), __base_count(0) { }
+
+    virtual 
+    ~__vmi_class_type_info();
+
+    // Implementation defined types.
+    enum __flags_masks 
+      {
+       __non_diamond_repeat_mask = 0x1, // Distinct instance of repeated base.
+       __diamond_shaped_mask = 0x2, // Diamond shaped multiple inheritance.
+       __flags_unknown_mask = 0x10
+      };
+
+  protected:
+    // Implementation defined member functions.
+    virtual bool 
+    __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
+                const __class_type_info* __dst_type, const void* __obj_ptr,
+                const __class_type_info* __src_type, const void* __src_ptr,
+                __dyncast_result& __result) const;
+
+    virtual __sub_kind 
+    __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr, 
+                        const __class_type_info* __src_type,
+                        const void* __src_ptr) const;
+    
+    virtual bool 
+    __do_upcast(const __class_type_info* __dst, const void* __obj,
+               __upcast_result& __restrict __result) const;
+  };
+
+  // Dynamic cast runtime.
+  // src2dst has the following possible values
+  //  >-1: src_type is a unique public non-virtual base of dst_type
+  //       dst_ptr + src2dst == src_ptr
+  //   -1: unspecified relationship
+  //   -2: src_type is not a public base of dst_type
+  //   -3: src_type is a multiple public non-virtual base of dst_type
+  extern "C" void*
+  __dynamic_cast(const void* __src_ptr, // Starting object.
+                const __class_type_info* __src_type, // Static type of object.
+                const __class_type_info* __dst_type, // Desired target type.
+                ptrdiff_t __src2dst); // How src and dst are related.
+
+
+  // Returns the type_info for the currently handled exception [15.3/8], or
+  // null if there is none.
+  extern "C" std::type_info*
+  __cxa_current_exception_type();
+
+  // A magic placeholder class that can be caught by reference
+  // to recognize foreign exceptions.
+  class __foreign_exception
+  {
+    virtual ~__foreign_exception() throw();
+    virtual void __pure_dummy() = 0; // prevent catch by value
+  };
+
+} // namespace __cxxabiv1
+
+/** @namespace abi
+ *  @brief The cross-vendor C++ Application Binary Interface. A
+ *  namespace alias to __cxxabiv1, but user programs should use the
+ *  alias `abi'.
+ *
+ *  A brief overview of an ABI is given in the libstdc++ FAQ, question
+ *  5.8 (you may have a copy of the FAQ locally, or you can view the online
+ *  version at http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_8).
+ *
+ *  GCC subscribes to a cross-vendor ABI for C++, sometimes
+ *  called the IA64 ABI because it happens to be the native ABI for that
+ *  platform.  It is summarized at http://www.codesourcery.com/cxx-abi/
+ *  along with the current specification.
+ *
+ *  For users of GCC greater than or equal to 3.x, entry points are
+ *  available in <cxxabi.h>, which notes, <em>"It is not normally
+ *  necessary for user programs to include this header, or use the
+ *  entry points directly.  However, this header is available should
+ *  that be needed."</em>
+*/
 namespace abi = __cxxabiv1;
 
-#else
-#endif /* __cplusplus */
+#endif // __cplusplus
 
+#pragma GCC visibility pop
 
-#endif /* __CXXABI_H */
+#endif // __CXXABI_H