diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp')
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp | 76 |
1 files changed, 36 insertions, 40 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 0af10c77243..871079b3fbd 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -293,7 +293,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, const size_t num_attributes = die.GetAttributes (attributes); uint32_t encoding = 0; - lldb::user_id_t encoding_uid = LLDB_INVALID_UID; + DWARFFormValue encoding_uid; if (num_attributes > 0) { @@ -323,7 +323,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, break; case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; case DW_AT_encoding: encoding = form_value.Unsigned(); break; - case DW_AT_type: encoding_uid = DIERef(form_value).GetUID(); break; + case DW_AT_type: encoding_uid = form_value; break; default: case DW_AT_sibling: break; @@ -332,7 +332,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, } } - DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid); + DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid.Reference()); switch (tag) { @@ -388,7 +388,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, die.GetName()); clang_type = m_ast.GetBasicType(eBasicTypeObjCID); encoding_data_type = Type::eEncodingIsUID; - encoding_uid = LLDB_INVALID_UID; + encoding_uid.Clear(); resolve_state = Type::eResolveStateFull; } @@ -402,7 +402,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, die.GetName()); clang_type = m_ast.GetBasicType(eBasicTypeObjCClass); encoding_data_type = Type::eEncodingIsUID; - encoding_uid = LLDB_INVALID_UID; + encoding_uid.Clear(); resolve_state = Type::eResolveStateFull; } else if (type_name_const_str == g_objc_type_name_selector) @@ -415,15 +415,15 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, die.GetName()); clang_type = m_ast.GetBasicType(eBasicTypeObjCSel); encoding_data_type = Type::eEncodingIsUID; - encoding_uid = LLDB_INVALID_UID; + encoding_uid.Clear(); resolve_state = Type::eResolveStateFull; } } - else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid != LLDB_INVALID_UID) + else if (encoding_data_type == Type::eEncodingIsPointerUID && encoding_uid.IsValid()) { // Clang sometimes erroneously emits id as objc_object*. In that case we fix up the type to "id". - const DWARFDIE encoding_die = die.GetDIE(encoding_uid); + const DWARFDIE encoding_die = dwarf->GetDIE(DIERef(encoding_uid)); if (encoding_die && encoding_die.Tag() == DW_TAG_structure_type) { @@ -439,7 +439,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, die.GetName()); clang_type = m_ast.GetBasicType(eBasicTypeObjCID); encoding_data_type = Type::eEncodingIsUID; - encoding_uid = LLDB_INVALID_UID; + encoding_uid.Clear(); resolve_state = Type::eResolveStateFull; } } @@ -453,7 +453,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, type_name_const_str, byte_size, NULL, - encoding_uid, + DIERef(encoding_uid).GetUID(dwarf), encoding_data_type, &decl, clang_type, @@ -732,7 +732,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, // a complete type for this die dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE( - dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID()))); + dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf))); if (defn_decl_ctx) LinkDeclContextToDIE(defn_decl_ctx, die); return type_sp; @@ -895,8 +895,6 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, "Type already in the forward declaration map!"); // Can't assume m_ast.GetSymbolFile() is actually a SymbolFileDWARF, it can be a // SymbolFileDWARFDebugMap for Apple binaries. - //assert(((SymbolFileDWARF*)m_ast.GetSymbolFile())->UserIDMatches(die.GetDIERef().GetUID()) && - // "Adding incorrect type to forward declaration map"); dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = clang_type.GetOpaqueQualType(); dwarf->GetForwardDeclClangTypeToDie()[ClangUtil::RemoveFastQualifiers(clang_type) .GetOpaqueQualType()] = die.GetDIERef(); @@ -992,8 +990,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, // so lets use it and cache the fact that we found // a complete type for this die dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); - clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE( - dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID()))); + clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID(), dwarf))); if (defn_decl_ctx) LinkDeclContextToDIE(defn_decl_ctx, die); return type_sp; @@ -1008,7 +1005,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, { if (encoding_form.IsValid()) { - Type *enumerator_type = dwarf->ResolveTypeUID(DIERef(encoding_form).GetUID()); + Type *enumerator_type = dwarf->ResolveTypeUID(DIERef(encoding_form)); if (enumerator_type) enumerator_clang_type = enumerator_type->GetFullCompilerType (); } @@ -1035,7 +1032,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, type_name_const_str, byte_size, NULL, - DIERef(encoding_form).GetUID(), + DIERef(encoding_form).GetUID(dwarf), Type::eEncodingIsUID, &decl, clang_type, @@ -1176,7 +1173,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, Type *func_type = NULL; if (type_die_form.IsValid()) - func_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID()); + func_type = dwarf->ResolveTypeUID(DIERef(type_die_form)); if (func_type) return_clang_type = func_type->GetForwardCompilerType (); @@ -1311,12 +1308,12 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, if (debug_map_symfile) { class_symfile = debug_map_symfile->GetSymbolFileByOSOIndex(SymbolFileDWARFDebugMap::GetOSOIndexFromUserID(class_type->GetID())); - class_type_die = class_symfile->DebugInfo()->GetDIE (DIERef(class_type->GetID())); + class_type_die = class_symfile->DebugInfo()->GetDIE (DIERef(class_type->GetID(), dwarf)); } else { class_symfile = dwarf; - class_type_die = dwarf->DebugInfo()->GetDIE (DIERef(class_type->GetID())); + class_type_die = dwarf->DebugInfo()->GetDIE (DIERef(class_type->GetID(), dwarf)); } if (class_type_die) { @@ -1659,7 +1656,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr); - Type *element_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID()); + Type *element_type = dwarf->ResolveTypeUID(DIERef(type_die_form)); if (element_type) { @@ -1696,7 +1693,7 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, empty_name, array_element_bit_stride / 8, NULL, - DIERef(type_die_form).GetUID(), + DIERef(type_die_form).GetUID(dwarf), Type::eEncodingIsUID, &decl, clang_type, @@ -1731,8 +1728,8 @@ DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, } } - Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form).GetUID()); - Type *class_type = dwarf->ResolveTypeUID(DIERef(containing_type_die_form).GetUID()); + Type *pointee_type = dwarf->ResolveTypeUID(DIERef(type_die_form)); + Type *class_type = dwarf->ResolveTypeUID(DIERef(containing_type_die_form)); CompilerType pointee_clang_type = pointee_type->GetForwardCompilerType (); CompilerType class_clang_type = class_type->GetLayoutCompilerType (); @@ -1902,7 +1899,7 @@ DWARFASTParserClang::ParseTemplateDIE (const DWARFDIE &die, case DW_AT_type: if (attributes.ExtractFormValueAtIndex(i, form_value)) { - lldb_type = die.ResolveTypeUID(DIERef(form_value).GetUID()); + lldb_type = die.ResolveTypeUID(DIERef(form_value)); if (lldb_type) clang_type = lldb_type->GetForwardCompilerType (); } @@ -2803,7 +2800,7 @@ DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE & // Handle static members if (is_external && member_byte_offset == UINT32_MAX) { - Type *var_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID()); + Type *var_type = die.ResolveTypeUID(DIERef(encoding_form)); if (var_type) { @@ -2819,7 +2816,7 @@ DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE & if (is_artificial == false) { - Type *member_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID()); + Type *member_type = die.ResolveTypeUID(DIERef(encoding_form)); clang::FieldDecl *field_decl = NULL; if (tag == DW_TAG_member) @@ -3146,7 +3143,7 @@ DWARFASTParserClang::ParseChildMembers(const SymbolContext &sc, const DWARFDIE & } } - Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form).GetUID()); + Type *base_class_type = die.ResolveTypeUID(DIERef(encoding_form)); if (base_class_type == NULL) { module_sp->ReportError("0x%8.8x: DW_TAG_inheritance failed to resolve the base class at 0x%8.8" PRIx64 " from enclosing type 0x%8.8x. \nPlease file a bug and attach the file at the start of this error message", @@ -3292,7 +3289,7 @@ DWARFASTParserClang::ParseChildParameters (const SymbolContext& sc, // being in the formal parameter DIE... if (name == NULL || ::strcmp(name, "this")==0) { - Type *this_type = die.ResolveTypeUID (DIERef(param_type_die_form).GetUID()); + Type *this_type = die.ResolveTypeUID (DIERef(param_type_die_form)); if (this_type) { uint32_t encoding_mask = this_type->GetEncodingMask(); @@ -3335,7 +3332,7 @@ DWARFASTParserClang::ParseChildParameters (const SymbolContext& sc, if (!skip) { - Type *type = die.ResolveTypeUID(DIERef(param_type_die_form).GetUID()); + Type *type = die.ResolveTypeUID(DIERef(param_type_die_form)); if (type) { function_param_types.push_back (type->GetForwardCompilerType ()); @@ -3482,7 +3479,7 @@ DWARFASTParserClang::GetTypeForDIE (const DWARFDIE &die) DWARFFormValue form_value; if (attr == DW_AT_type && attributes.ExtractFormValueAtIndex(i, form_value)) - return dwarf->ResolveTypeUID(DIERef(form_value).GetUID()); + return dwarf->ResolveTypeUID(dwarf->GetDIE (DIERef(form_value)), true); } } } @@ -3538,11 +3535,10 @@ DWARFASTParserClang::GetClangDeclForDIE (const DWARFDIE &die) case DW_TAG_imported_declaration: { SymbolFileDWARF *dwarf = die.GetDWARF(); - lldb::user_id_t imported_uid = die.GetAttributeValueAsReference(DW_AT_import, DW_INVALID_OFFSET); - - if (dwarf->UserIDMatches(imported_uid)) + DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import); + if (imported_uid) { - CompilerDecl imported_decl = dwarf->GetDeclForUID(imported_uid); + CompilerDecl imported_decl = imported_uid.GetDecl(); if (imported_decl) { clang::DeclContext *decl_context = ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID())); @@ -3555,15 +3551,15 @@ DWARFASTParserClang::GetClangDeclForDIE (const DWARFDIE &die) case DW_TAG_imported_module: { SymbolFileDWARF *dwarf = die.GetDWARF(); - lldb::user_id_t imported_uid = die.GetAttributeValueAsReference(DW_AT_import, DW_INVALID_OFFSET); + DWARFDIE imported_uid = die.GetAttributeValueAsReferenceDIE(DW_AT_import); - if (dwarf->UserIDMatches(imported_uid)) + if (imported_uid) { - CompilerDeclContext imported_decl = dwarf->GetDeclContextForUID(imported_uid); - if (imported_decl) + CompilerDeclContext imported_decl_ctx = imported_uid.GetDeclContext(); + if (imported_decl_ctx) { clang::DeclContext *decl_context = ClangASTContext::DeclContextGetAsDeclContext(dwarf->GetDeclContextContainingUID(die.GetID())); - if (clang::NamespaceDecl *ns_decl = ClangASTContext::DeclContextGetAsNamespaceDecl(imported_decl)) + if (clang::NamespaceDecl *ns_decl = ClangASTContext::DeclContextGetAsNamespaceDecl(imported_decl_ctx)) decl = m_ast.CreateUsingDirectiveDeclaration(decl_context, ns_decl); } } |