summaryrefslogtreecommitdiff
path: root/include/cxxabi.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cxxabi.h')
-rw-r--r--include/cxxabi.h183
1 files changed, 183 insertions, 0 deletions
diff --git a/include/cxxabi.h b/include/cxxabi.h
new file mode 100644
index 0000000..3bd8a58
--- /dev/null
+++ b/include/cxxabi.h
@@ -0,0 +1,183 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+// may be used to endorse or promote products derived from this software
+// without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+
+#ifndef __GABIXX_CXXABI_H__
+#define __GABIXX_CXXABI_H__
+
+#include <typeinfo>
+
+namespace abi = __cxxabiv1;
+
+namespace __cxxabiv1
+{
+ extern "C" void __cxa_pure_virtual();
+
+ // Derived types of type_info below are based on 2.9.5 of C++ ABI.
+
+ // Typeinfo for fundamental types.
+ class __fundamental_type_info : public std::type_info
+ {
+ public:
+ ~__fundamental_type_info();
+ };
+
+ // Typeinfo for array types.
+ class __array_type_info : public std::type_info
+ {
+ public:
+ ~__array_type_info();
+ };
+
+ // Typeinfo for function types.
+ class __function_type_info : public std::type_info
+ {
+ public:
+ ~__function_type_info();
+ };
+
+ // Typeinfo for enum types.
+ class __enum_type_info : public std::type_info
+ {
+ public:
+ ~__enum_type_info();
+ };
+
+ // Typeinfo for classes with no bases.
+ class __class_type_info : public std::type_info
+ {
+ public:
+ ~__class_type_info();
+
+ enum class_type_info_code
+ {
+ CLASS_TYPE_INFO_CODE,
+ SI_CLASS_TYPE_INFO_CODE,
+ VMI_CLASS_TYPE_INFO_CODE
+ };
+
+ virtual class_type_info_code
+ code() const { return CLASS_TYPE_INFO_CODE; }
+ };
+
+ // Typeinfo for classes containing only a single, public, non-virtual base at
+ // offset zero.
+ class __si_class_type_info : public __class_type_info
+ {
+ public:
+ ~__si_class_type_info();
+ const __class_type_info *__base_type;
+
+ virtual __class_type_info::class_type_info_code
+ code() const { return SI_CLASS_TYPE_INFO_CODE; }
+ };
+
+ struct __base_class_type_info
+ {
+ public:
+ const __class_type_info *__base_type;
+
+ // All but the lower __offset_shift bits of __offset_flags are a signed
+ // offset. For a non-virtual base, this is the offset in the object of the
+ // base subobject. For a virtual base, this is the offset in the virtual
+ // table of the virtual base offset for the virtual base referenced
+ // (negative).
+ long __offset_flags;
+
+ enum __offset_flags_masks
+ {
+ __virtual_mask = 0x1,
+ __public_mask = 0x2,
+ __offset_shift = 8
+ };
+
+ bool inline
+ is_virtual() const { return (__offset_flags & __virtual_mask) != 0; }
+
+ bool inline
+ is_public() const { return (__offset_flags & __public_mask) != 0; }
+
+ // FIXME: Right-shift of signed integer is implementation dependent.
+ long inline
+ offset() const { return __offset_flags >> __offset_shift; }
+
+ long inline
+ flags() const { return __offset_flags & ((1L << __offset_shift) - 1); }
+ };
+
+ // Typeinfo for classes with bases that do not satisfy the
+ // __si_class_type_info constraints.
+ class __vmi_class_type_info : public __class_type_info
+ {
+ public:
+ ~__vmi_class_type_info();
+ unsigned int __flags;
+ unsigned int __base_count;
+ __base_class_type_info __base_info[1];
+
+ enum __flags_masks
+ {
+ __non_diamond_repeat_mask = 0x1,
+ __diamond_shaped_mask = 0x2
+ };
+
+ virtual __class_type_info::class_type_info_code
+ code() const { return VMI_CLASS_TYPE_INFO_CODE; }
+ };
+
+ class __pbase_type_info : public std::type_info
+ {
+ public:
+ ~__pbase_type_info();
+ unsigned int __flags;
+ const std::type_info *__pointee;
+
+ enum __masks
+ {
+ __const_mask = 0x1,
+ __volatile_mask = 0x2,
+ __restrict_mask = 0x4,
+ __incomplete_mask = 0x8,
+ __incomplete_class_mask = 0x10
+ };
+ };
+
+ class __pointer_type_info : public __pbase_type_info
+ {
+ public:
+ ~__pointer_type_info();
+ };
+
+ class __pointer_to_member_type_info : public __pbase_type_info
+ {
+ public:
+ ~__pointer_to_member_type_info();
+ };
+}
+
+#endif /* defined(__GABIXX_CXXABI_H__) */
+