// 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__) */