169 struct __class_type_info : std::type_info
173 struct __si_class_type_info : __class_type_info
175 const __class_type_info* __base_type;
178 struct __base_class_type_info
180 const __class_type_info* __base_type;
184 struct __vmi_class_type_info : __class_type_info
186 unsigned int __flags;
187 unsigned int __base_count;
188 __base_class_type_info __base_info[1];
194 std::set<const std::type_info*> seen_;
197 Dumper(
const char* label ) : label_( label ) {}
198 void dump_type(
const std::type_info*
info,
int indent );
201 const int kIndent = 4;
203 void Dumper::dump_type(
const std::type_info*
info,
int indent )
205 ::rtti_dump::dump_type(
info, label_, indent * kIndent );
212 const std::type_info* info_type = runtime_typeid(
info );
213 __base_class_type_info lone_base = { 0 };
214 const __base_class_type_info* base_table = NULL;
215 unsigned int base_count = 0;
221 const int sub_indent_sp = ( indent + 1 ) * kIndent;
223 if( info_type == NULL )
226 RTTI_DUMP_LOG(
"%s: %*sERROR: runtime_typeid(info) was NULL!", label_,
229 else if( !strcmp( info_type->name(),
"N10__cxxabiv120__si_class_type_infoE" ) )
231 const __si_class_type_info& infox =
232 *
reinterpret_cast<const __si_class_type_info*
>(
info );
233 lone_base.__base_type = infox.__base_type;
235 base_table = &lone_base;
237 else if( !strcmp( info_type->name(),
"N10__cxxabiv121__vmi_class_type_infoE" ) )
239 const __vmi_class_type_info& infox =
240 *
reinterpret_cast<const __vmi_class_type_info*
>(
info );
241 base_count = infox.__base_count;
242 base_table = infox.__base_info;
247 if( seen_.find(
info ) != seen_.end() )
249 RTTI_DUMP_LOG(
"%s: %*sbase classes: ...elided...", label_, sub_indent_sp,
"" );
253 RTTI_DUMP_LOG(
"%s: %*sbase classes:", label_, sub_indent_sp,
"" );
254 seen_.insert(
info );
256 for(
unsigned int i = 0; i < base_count; ++i )
258 dump_type( base_table[i].__base_type, indent + 2 );