lldb::TypeSP DWARFASTParserJava::ParseClassTypeFromDIE(const DWARFDIE &die, bool &is_new_type) { SymbolFileDWARF *dwarf = die.GetDWARF(); dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED; Declaration decl; ConstString name; ConstString linkage_name; bool is_forward_declaration = false; uint32_t byte_size = 0; DWARFAttributes attributes; const size_t num_attributes = die.GetAttributes(attributes); for (uint32_t i = 0; i < num_attributes; ++i) { DWARFFormValue form_value; dw_attr_t attr = attributes.AttributeAtIndex(i); if (attributes.ExtractFormValueAtIndex(i, form_value)) { switch (attr) { case DW_AT_name: name.SetCString(form_value.AsCString()); break; case DW_AT_declaration: is_forward_declaration = form_value.Boolean(); break; case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; case DW_AT_linkage_name: linkage_name.SetCString(form_value.AsCString()); break; default: assert(false && "Unsupported attribute for DW_TAG_class_type"); } } } UniqueDWARFASTType unique_ast_entry; if (name) { std::string qualified_name; if (die.GetQualifiedName(qualified_name)) { name.SetCString(qualified_name.c_str()); if (dwarf->GetUniqueDWARFASTTypeMap().Find(name, die, Declaration(), -1, unique_ast_entry)) { if (unique_ast_entry.m_type_sp) { dwarf->GetDIEToType()[die.GetDIE()] = unique_ast_entry.m_type_sp.get(); is_new_type = false; return unique_ast_entry.m_type_sp; } } } } if (is_forward_declaration) { DWARFDeclContext die_decl_ctx; die.GetDWARFDeclContext(die_decl_ctx); TypeSP type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx); if (type_sp) { // We found a real definition for this type elsewhere so lets use it dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); is_new_type = false; return type_sp; } } CompilerType compiler_type(&m_ast, dwarf->GetForwardDeclDieToClangType().lookup(die.GetDIE())); if (!compiler_type) compiler_type = m_ast.CreateObjectType(name, linkage_name, byte_size); is_new_type = true; TypeSP type_sp(new Type(die.GetID(), dwarf, name, -1, // byte size isn't specified nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type, Type::eResolveStateForward)); // Add our type to the unique type map unique_ast_entry.m_type_sp = type_sp; unique_ast_entry.m_die = die; unique_ast_entry.m_declaration = decl; unique_ast_entry.m_byte_size = -1; dwarf->GetUniqueDWARFASTTypeMap().Insert(name, unique_ast_entry); if (!is_forward_declaration) { // Leave this as a forward declaration until we need to know the details of the type dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = compiler_type.GetOpaqueQualType(); dwarf->GetForwardDeclClangTypeToDie()[compiler_type.GetOpaqueQualType()] = die.GetDIERef(); } return type_sp; }