1 // Copyright (C) 2011 The Android Open Source Project 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions 6 // are met: 7 // 1. Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // 2. Redistributions in binary form must reproduce the above copyright 10 // notice, this list of conditions and the following disclaimer in the 11 // documentation and/or other materials provided with the distribution. 12 // 3. Neither the name of the project nor the names of its contributors 13 // may be used to endorse or promote products derived from this software 14 // without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 // ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 // SUCH DAMAGE. 27 // 28 29 #ifndef __GABIXX_CXXABI_H__ 30 #define __GABIXX_CXXABI_H__ 31 32 #include <typeinfo> 33 34 namespace __cxxabiv1 35 { 36 extern "C" void __cxa_pure_virtual(); 37 38 // Derived types of type_info below are based on 2.9.5 of C++ ABI. 39 40 // Typeinfo for fundamental types. 41 class __fundamental_type_info : public std::type_info 42 { 43 public: 44 ~__fundamental_type_info(); 45 }; 46 47 // Typeinfo for array types. 48 class __array_type_info : public std::type_info 49 { 50 public: 51 ~__array_type_info(); 52 }; 53 54 // Typeinfo for function types. 55 class __function_type_info : public std::type_info 56 { 57 public: 58 ~__function_type_info(); 59 }; 60 61 // Typeinfo for enum types. 62 class __enum_type_info : public std::type_info 63 { 64 public: 65 ~__enum_type_info(); 66 }; 67 68 // Typeinfo for classes with no bases. 69 class __class_type_info : public std::type_info 70 { 71 public: 72 ~__class_type_info(); 73 74 enum class_type_info_code 75 { 76 CLASS_TYPE_INFO_CODE, 77 SI_CLASS_TYPE_INFO_CODE, 78 VMI_CLASS_TYPE_INFO_CODE 79 }; 80 81 virtual class_type_info_code code()82 code() const { return CLASS_TYPE_INFO_CODE; } 83 }; 84 85 // Typeinfo for classes containing only a single, public, non-virtual base at 86 // offset zero. 87 class __si_class_type_info : public __class_type_info 88 { 89 public: 90 ~__si_class_type_info(); 91 const __class_type_info *__base_type; 92 93 virtual __class_type_info::class_type_info_code code()94 code() const { return SI_CLASS_TYPE_INFO_CODE; } 95 }; 96 97 struct __base_class_type_info 98 { 99 public: 100 const __class_type_info *__base_type; 101 102 // All but the lower __offset_shift bits of __offset_flags are a signed 103 // offset. For a non-virtual base, this is the offset in the object of the 104 // base subobject. For a virtual base, this is the offset in the virtual 105 // table of the virtual base offset for the virtual base referenced 106 // (negative). 107 long __offset_flags; 108 109 enum __offset_flags_masks 110 { 111 __virtual_mask = 0x1, 112 __public_mask = 0x2, 113 __offset_shift = 8 114 }; 115 116 bool inline is_virtual__base_class_type_info117 is_virtual() const { return (__offset_flags & __virtual_mask) != 0; } 118 119 bool inline is_public__base_class_type_info120 is_public() const { return (__offset_flags & __public_mask) != 0; } 121 122 // FIXME: Right-shift of signed integer is implementation dependent. 123 long inline offset__base_class_type_info124 offset() const { return __offset_flags >> __offset_shift; } 125 126 long inline flags__base_class_type_info127 flags() const { return __offset_flags & ((1L << __offset_shift) - 1); } 128 }; 129 130 // Typeinfo for classes with bases that do not satisfy the 131 // __si_class_type_info constraints. 132 class __vmi_class_type_info : public __class_type_info 133 { 134 public: 135 ~__vmi_class_type_info(); 136 unsigned int __flags; 137 unsigned int __base_count; 138 __base_class_type_info __base_info[1]; 139 140 enum __flags_masks 141 { 142 __non_diamond_repeat_mask = 0x1, 143 __diamond_shaped_mask = 0x2 144 }; 145 146 virtual __class_type_info::class_type_info_code code()147 code() const { return VMI_CLASS_TYPE_INFO_CODE; } 148 }; 149 150 class __pbase_type_info : public std::type_info 151 { 152 public: 153 ~__pbase_type_info(); 154 unsigned int __flags; 155 const std::type_info *__pointee; 156 157 enum __masks 158 { 159 __const_mask = 0x1, 160 __volatile_mask = 0x2, 161 __restrict_mask = 0x4, 162 __incomplete_mask = 0x8, 163 __incomplete_class_mask = 0x10 164 }; 165 }; 166 167 class __pointer_type_info : public __pbase_type_info 168 { 169 public: 170 ~__pointer_type_info(); 171 }; 172 173 class __pointer_to_member_type_info : public __pbase_type_info 174 { 175 public: 176 ~__pointer_to_member_type_info(); 177 }; 178 } 179 180 namespace abi = __cxxabiv1; 181 182 #endif /* defined(__GABIXX_CXXABI_H__) */ 183 184