1152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//===------------------------ private_typeinfo.h --------------------------===// 2152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// 3152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// The LLVM Compiler Infrastructure 4152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// 5152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 7152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant// 8152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant//===----------------------------------------------------------------------===// 9152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 10152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#ifndef __PRIVATE_TYPEINFO_H_ 11152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#define __PRIVATE_TYPEINFO_H_ 12152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 13b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool#include "__cxxabi_config.h" 14b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool 15152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#include <typeinfo> 16f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant#include <cstddef> 17152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 1877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasoolnamespace __cxxabiv1 { 19facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant 20b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __shim_type_info : public std::type_info { 21152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 22b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__shim_type_info(); 23facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant 24b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void noop1() const; 25b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void noop2() const; 26b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *thrown_type, 27b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&adjustedPtr) const = 0; 28facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant}; 29facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnant 30b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __fundamental_type_info : public __shim_type_info { 31facfc46ef3ecde55e675fa19d93d9a25b169c49fHoward Hinnantpublic: 32b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__fundamental_type_info(); 33b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 34b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 35152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 36152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 37b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __array_type_info : public __shim_type_info { 38152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 39b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__array_type_info(); 40b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 41b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 42152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 43152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 44b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __function_type_info : public __shim_type_info { 45152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 46b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__function_type_info(); 47b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 48b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 49152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 50152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 51b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __enum_type_info : public __shim_type_info { 52152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 53b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__enum_type_info(); 54b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 55b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 56152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 57152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 58f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnantenum 59f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant{ 60f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant unknown = 0, 61f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant public_path, 621309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant not_public_path, 631309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant yes, 641309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant no 65f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant}; 66f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant 67b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __class_type_info; 68f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant 6954227aec1d6116c936afa576e2ea36ca3e94b29cShoaib Meenaistruct _LIBCXXABI_HIDDEN __dynamic_cast_info 70f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant{ 71cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant// const data supplied to the search: 72f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant 73326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant const __class_type_info* dst_type; 74326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant const void* static_ptr; 75326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant const __class_type_info* static_type; 76326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant std::ptrdiff_t src2dst_offset; 77f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant 78cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant// Data that represents the answer: 79f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant 80f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // pointer to a dst_type which has (static_ptr, static_type) above it 81f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant const void* dst_ptr_leading_to_static_ptr; 82f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // pointer to a dst_type which does not have (static_ptr, static_type) above it 83f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant const void* dst_ptr_not_leading_to_static_ptr; 84cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant 85cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant // The following three paths are either unknown, public_path or not_public_path. 86f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // access of path from dst_ptr_leading_to_static_ptr to (static_ptr, static_type) 87f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant int path_dst_ptr_to_static_ptr; 88f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // access of path from (dynamic_ptr, dynamic_type) to (static_ptr, static_type) 89f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // when there is no dst_type along the path 90f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant int path_dynamic_ptr_to_static_ptr; 91f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // access of path from (dynamic_ptr, dynamic_type) to dst_type 92f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // (not used if there is a (static_ptr, static_type) above a dst_type). 93f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant int path_dynamic_ptr_to_dst_ptr; 94cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant 95f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // Number of dst_types below (static_ptr, static_type) 96f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant int number_to_static_ptr; 97f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // Number of dst_types not below (static_ptr, static_type) 98f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant int number_to_dst_ptr; 99cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant 100cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant// Data that helps stop the search before the entire tree is searched: 101cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant 102cc614df38c199d9781a6dea123e714970e82711fHoward Hinnant // is_dst_type_derived_from_static_type is either unknown, yes or no. 1031309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant int is_dst_type_derived_from_static_type; 1041309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant // Number of dst_type in tree. If 0, then that means unknown. 1051309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant int number_of_dst_type; 106f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // communicates to a dst_type node that (static_ptr, static_type) was found 107f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant // above it. 1081309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant bool found_our_static_ptr; 1091309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant // communicates to a dst_type node that a static_type was found 1101309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant // above it, but it wasn't (static_ptr, static_type) 1111309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant bool found_any_static_type; 1121309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant // Set whenever a search can be stopped 1131309366d3676ca5a34bea0388ad2d2dd5701dc9bHoward Hinnant bool search_done; 114f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant}; 115f877d21f16d5ecb32570a89148e614ff68d632beHoward Hinnant 11616650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant// Has no base class 117b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __class_type_info : public __shim_type_info { 118152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 119b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__class_type_info(); 120b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool 121b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN void process_static_type_above_dst(__dynamic_cast_info *, 122b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool const void *, 123b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool const void *, int) const; 124b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN void process_static_type_below_dst(__dynamic_cast_info *, 125b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool const void *, int) const; 126b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN void process_found_base_class(__dynamic_cast_info *, void *, 127b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool int) const; 128b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, 129b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool const void *, const void *, 130b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool int, bool) const; 131b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void 13277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; 133b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 134b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 135b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void 13677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; 137152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 138152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 13916650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant// Has one non-virtual public base class at offset zero 140b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __si_class_type_info : public __class_type_info { 141152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 14277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool const __class_type_info *__base_type; 143152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 144b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__si_class_type_info(); 14516650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant 146b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, 147b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool const void *, const void *, 148b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool int, bool) const; 149b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void 15077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; 151b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void 15277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; 153152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 154152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 15554227aec1d6116c936afa576e2ea36ca3e94b29cShoaib Meenaistruct _LIBCXXABI_HIDDEN __base_class_type_info 156152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant{ 157152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 158152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant const __class_type_info* __base_type; 159152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant long __offset_flags; 160152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 161152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant enum __offset_flags_masks 162152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant { 163152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant __virtual_mask = 0x1, 16416650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant __public_mask = 0x2, // base is public 165152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant __offset_shift = 8 166152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant }; 16716650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant 168326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant void search_above_dst(__dynamic_cast_info*, const void*, const void*, int, bool) const; 169326aca3713db53b9fb0dbfedc17d2e72aaca8a74Howard Hinnant void search_below_dst(__dynamic_cast_info*, const void*, int, bool) const; 170a1919d2ee24b06c833493cf06335afa307028bf7Howard Hinnant void has_unambiguous_public_base(__dynamic_cast_info*, void*, int) const; 171152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 172152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 17316650b58dfc7d1a2632b052843dc4e21ae949b07Howard Hinnant// Has one or more base classes 174b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __vmi_class_type_info : public __class_type_info { 175152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 17677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool unsigned int __flags; 17777a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool unsigned int __base_count; 17877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __base_class_type_info __base_info[1]; 17977a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool 18077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool enum __flags_masks { 18177a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __non_diamond_repeat_mask = 0x1, // has two or more distinct base class 18277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool // objects of the same type 18377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __diamond_shaped_mask = 0x2 // has base class object with two or 18477a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool // more derived objects 18577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool }; 18677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool 187b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__vmi_class_type_info(); 18877a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool 189b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void search_above_dst(__dynamic_cast_info *, 190b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool const void *, const void *, 191b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool int, bool) const; 192b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void 19377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool search_below_dst(__dynamic_cast_info *, const void *, int, bool) const; 194b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual void 19577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool has_unambiguous_public_base(__dynamic_cast_info *, void *, int) const; 196152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 197152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 198b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __pbase_type_info : public __shim_type_info { 199152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 20077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool unsigned int __flags; 20177a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool const __shim_type_info *__pointee; 20277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool 20377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool enum __masks { 20477a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __const_mask = 0x1, 20577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __volatile_mask = 0x2, 20677a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __restrict_mask = 0x4, 20777a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool __incomplete_mask = 0x8, 208f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith __incomplete_class_mask = 0x10, 209f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith __transaction_safe_mask = 0x20, 210f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // This implements the following proposal from cxx-abi-dev (not yet part of 211f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // the ABI document): 212f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // 213f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // http://sourcerytools.com/pipermail/cxx-abi-dev/2016-October/002986.html 214f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // 215f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // This is necessary for support of http://wg21.link/p0012, which permits 216f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // throwing noexcept function and member function pointers and catching 217f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // them as non-noexcept pointers. 218f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith __noexcept_mask = 0x40, 219f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith 220f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // Flags that cannot be removed by a standard conversion. 221f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith __no_remove_flags_mask = __const_mask | __volatile_mask | __restrict_mask, 222f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith // Flags that cannot be added by a standard conversion. 223f1636207ad8e142a11f80860ea27ea92fcc8c776Richard Smith __no_add_flags_mask = __transaction_safe_mask | __noexcept_mask 22477a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool }; 22577a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool 226b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__pbase_type_info(); 227b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 228b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 229152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 230152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 231b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __pointer_type_info : public __pbase_type_info { 232152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 233b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__pointer_type_info(); 234b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 235b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 236b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const; 237152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 238152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 239b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasoolclass _LIBCXXABI_TYPE_VIS __pointer_to_member_type_info 24077a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool : public __pbase_type_info { 241152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnantpublic: 24277a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool const __class_type_info *__context; 24377a304b28be4b50a508298d6a0e40ee9d4bb3ccdSaleem Abdulrasool 244b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual ~__pointer_to_member_type_info(); 245b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN virtual bool can_catch(const __shim_type_info *, 246b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool void *&) const; 247b4ec5796f2d2d0c7bf3faeb87ce87281c185b28eSaleem Abdulrasool _LIBCXXABI_HIDDEN bool can_catch_nested(const __shim_type_info *) const; 248152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant}; 249152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 250152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant} // __cxxabiv1 251152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant 252152beb7a421a05155ae339434c2b48e2151111cdHoward Hinnant#endif // __PRIVATE_TYPEINFO_H_ 253