diff options
18 files changed, 360 insertions, 333 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp index c0754a1fdd5..5fe0cc4d416 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp @@ -10,26 +10,49 @@ #include "DIERef.h" #include "DWARFCompileUnit.h" #include "DWARFFormValue.h" +#include "DWARFDebugInfo.h" +#include "SymbolFileDWARF.h" +#include "SymbolFileDWARFDebugMap.h" DIERef::DIERef() : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) {} -DIERef::DIERef(dw_offset_t d) : - cu_offset(DW_INVALID_OFFSET), - die_offset(d) -{} - DIERef::DIERef(dw_offset_t c, dw_offset_t d) : cu_offset(c), die_offset(d) {} -DIERef::DIERef(lldb::user_id_t uid) : - cu_offset(uid>>32), +DIERef::DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf) : + cu_offset(DW_INVALID_OFFSET), die_offset(uid&0xffffffff) -{} +{ + SymbolFileDWARFDebugMap *debug_map = dwarf->GetDebugMapSymfile(); + if (debug_map) + { + const uint32_t oso_idx = debug_map->GetOSOIndexFromUserID(uid); + SymbolFileDWARF *actual_dwarf = debug_map->GetSymbolFileByOSOIndex(oso_idx); + if (actual_dwarf) + { + DWARFDebugInfo *debug_info = actual_dwarf->DebugInfo(); + if (debug_info) + { + DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIEOffset(die_offset); + if (dwarf_cu) + { + cu_offset = dwarf_cu->GetOffset(); + return; + } + } + } + die_offset = DW_INVALID_OFFSET; + } + else + { + cu_offset = uid>>32; + } +} DIERef::DIERef(const DWARFFormValue& form_value) : cu_offset(DW_INVALID_OFFSET), @@ -50,7 +73,19 @@ DIERef::DIERef(const DWARFFormValue& form_value) : } lldb::user_id_t -DIERef::GetUID() const +DIERef::GetUID(SymbolFileDWARF *dwarf) const { - return ((lldb::user_id_t)cu_offset) << 32 | die_offset; + //---------------------------------------------------------------------- + // Each SymbolFileDWARF will set its ID to what is expected. + // + // SymbolFileDWARF, when used for DWARF with .o files on MacOSX, has the + // ID set to the compile unit index. + // + // SymbolFileDWARFDwo sets the ID to the compile unit offset. + //---------------------------------------------------------------------- + if (dwarf) + return dwarf->GetID() | die_offset; + else + return LLDB_INVALID_UID; } + diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h index 3df07d51174..ad4ad45623a 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h @@ -14,24 +14,34 @@ #include "lldb/lldb-defines.h" class DWARFFormValue; +class SymbolFileDWARF; struct DIERef { DIERef(); - explicit - DIERef(dw_offset_t d); - DIERef(dw_offset_t c, dw_offset_t d); + //---------------------------------------------------------------------- + // In order to properly decode a lldb::user_id_t back into a DIERef we + // need the DWARF file since it knows if DWARF in .o files is being used + // (MacOSX) or if DWO files are being used. The encoding of the user ID + // differs between the two types of DWARF. + //---------------------------------------------------------------------- explicit - DIERef(lldb::user_id_t uid); + DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf); explicit DIERef(const DWARFFormValue& form_value); + //---------------------------------------------------------------------- + // In order to properly encode a DIERef unto a lldb::user_id_t we need + // the DWARF file since it knows if DWARF in .o files is being used + // (MacOSX) or if DWO files are being used. The encoding of the user ID + // differs between the two types of DWARF. + //---------------------------------------------------------------------- lldb::user_id_t - GetUID() const; + GetUID(SymbolFileDWARF *dwarf) const; bool operator< (const DIERef &ref) const 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); } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp index 12f14eeed83..346e2d63b90 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp @@ -144,7 +144,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons } } - DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\") type => 0x%8.8lx\n", dwarf->MakeUserID(die.GetOffset()), + 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); switch (tag) @@ -183,7 +183,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons break; } - type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, byte_size, + type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size, NULL, encoding_uid, encoding_data_type, &decl, compiler_type, resolve_state)); dwarf->m_die_to_type[die.GetDIE()] = type_sp.get(); @@ -254,7 +254,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons } } - DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die.GetOffset()), + DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr); bool compiler_type_was_created = false; @@ -265,7 +265,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons compiler_type = m_ast.CreateStructType(go_kind, type_name_const_str, byte_size); } - type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, byte_size, + type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_size, NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type, Type::eResolveStateForward)); @@ -347,7 +347,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons } } - DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die.GetOffset()), + DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr); std::vector<CompilerType> function_param_types; @@ -363,7 +363,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons compiler_type = m_ast.CreateFunctionType(type_name_const_str, function_param_types.data(), function_param_types.size(), is_variadic); - type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, 0, NULL, + type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, 0, NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type, Type::eResolveStateFull)); assert(type_sp.get()); @@ -410,7 +410,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons } } - DEBUG_PRINTF("0x%8.8" PRIx64 ": %s (\"%s\")\n", dwarf->MakeUserID(die.GetOffset()), + 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(type_die_offset); @@ -433,7 +433,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons { compiler_type = m_ast.CreateArrayType(type_name_const_str, array_element_type, 0); } - type_sp.reset(new Type(dwarf->MakeUserID(die.GetOffset()), dwarf, type_name_const_str, + type_sp.reset(new Type(die.GetID(), dwarf, type_name_const_str, byte_stride, NULL, type_die_offset, Type::eEncodingIsUID, &decl, compiler_type, Type::eResolveStateFull)); type_sp->SetEncodingType(element_type); @@ -463,7 +463,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(const lldb_private::SymbolContext &sc, cons else if (sc.function != NULL && sc_parent_die) { symbol_context_scope = - sc.function->GetBlock(true).FindBlockByID(dwarf->MakeUserID(sc_parent_die.GetOffset())); + sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID()); if (symbol_context_scope == NULL) symbol_context_scope = sc.function; } @@ -510,7 +510,7 @@ DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc, if (num_attributes > 0) { Declaration decl; - dw_offset_t param_type_die_offset = DW_INVALID_OFFSET; + DWARFFormValue param_type_die_offset; uint32_t i; for (i = 0; i < num_attributes; ++i) @@ -525,7 +525,7 @@ DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc, // = form_value.AsCString(); break; case DW_AT_type: - param_type_die_offset = form_value.Reference(); + param_type_die_offset = form_value; break; case DW_AT_location: // if (form_value.BlockData()) @@ -547,7 +547,7 @@ DWARFASTParserGo::ParseChildParameters(const SymbolContext &sc, } } - Type *type = parent_die.ResolveTypeUID(param_type_die_offset); + Type *type = parent_die.ResolveTypeUID(DIERef(param_type_die_offset)); if (type) { function_param_types.push_back(type->GetForwardCompilerType()); @@ -628,7 +628,7 @@ DWARFASTParserGo::CompleteTypeFromDWARF(const DWARFDIE &die, lldb_private::Type Log *log = nullptr; // (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION)); if (log) dwarf->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace( - log, "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", dwarf->MakeUserID(die.GetOffset()), + log, "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", die.GetID(), DW_TAG_value_to_name(tag), type->GetName().AsCString()); assert(compiler_type); DWARFAttributes attributes; @@ -683,7 +683,7 @@ DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &par Declaration decl; const char *name = NULL; - lldb::user_id_t encoding_uid = LLDB_INVALID_UID; + DWARFFormValue encoding_uid; uint32_t member_byte_offset = UINT32_MAX; uint32_t i; for (i = 0; i < num_attributes; ++i) @@ -698,7 +698,7 @@ DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &par name = form_value.AsCString(); break; case DW_AT_type: - encoding_uid = form_value.Reference(); + encoding_uid = form_value; break; case DW_AT_data_member_location: if (form_value.BlockData()) @@ -735,7 +735,7 @@ DWARFASTParserGo::ParseChildMembers(const SymbolContext &sc, const DWARFDIE &par } } - Type *member_type = die.ResolveTypeUID(encoding_uid); + Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid)); if (member_type) { CompilerType member_go_type = member_type->GetFullCompilerType(); @@ -808,10 +808,12 @@ DWARFASTParserGo::ParseFunctionFromDWARF(const SymbolContext &sc, const DWARFDIE if (dwarf->FixupAddress(func_range.GetBaseAddress())) { - const user_id_t func_user_id = dwarf->MakeUserID(die.GetOffset()); + const user_id_t func_user_id = die.GetID(); func_sp.reset(new Function(sc.comp_unit, - dwarf->MakeUserID(func_user_id), // UserID is the DIE offset - dwarf->MakeUserID(func_user_id), func_name, func_type, + func_user_id, // UserID is the DIE offset + func_user_id, + func_name, + func_type, func_range)); // first address range if (func_sp.get() != NULL) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp index a12654996f7..1bb107966a9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserJava.cpp @@ -77,7 +77,7 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die) dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED; ConstString linkage_name; - lldb::user_id_t type_die_offset = DW_INVALID_OFFSET; + DWARFFormValue type_attr_value; lldb::addr_t data_offset = LLDB_INVALID_ADDRESS; DWARFExpression length_expression(die.GetCU()); @@ -95,7 +95,7 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die) linkage_name.SetCString(form_value.AsCString()); break; case DW_AT_type: - type_die_offset = form_value.Reference(); + type_attr_value = form_value; break; case DW_AT_data_member_location: data_offset = form_value.Unsigned(); @@ -140,7 +140,8 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die) } } - Type *element_type = dwarf->ResolveTypeUID(type_die_offset); + DIERef type_die_ref(type_attr_value); + Type *element_type = dwarf->ResolveTypeUID(type_die_ref); if (!element_type) return nullptr; @@ -150,7 +151,7 @@ DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die) Declaration decl; TypeSP type_sp(new Type(die.GetID(), dwarf, array_compiler_type.GetTypeName(), -1, nullptr, - dwarf->MakeUserID(type_die_offset), Type::eEncodingIsUID, &decl, + type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl, array_compiler_type, Type::eResolveStateFull)); type_sp->SetEncodingType(element_type); return type_sp; @@ -163,7 +164,7 @@ DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die) dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED; Declaration decl; - lldb::user_id_t type_die_offset = DW_INVALID_OFFSET; + DWARFFormValue type_attr_value; DWARFAttributes attributes; const size_t num_attributes = die.GetAttributes(attributes); @@ -176,7 +177,7 @@ DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die) switch (attr) { case DW_AT_type: - type_die_offset = form_value.Reference(); + type_attr_value = form_value; break; default: assert(false && "Unsupported attribute for DW_TAG_array_type"); @@ -184,14 +185,15 @@ DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die) } } - Type *pointee_type = dwarf->ResolveTypeUID(type_die_offset); + DIERef type_die_ref(type_attr_value); + Type *pointee_type = dwarf->ResolveTypeUID(type_die_ref); if (!pointee_type) return nullptr; CompilerType pointee_compiler_type = pointee_type->GetForwardCompilerType(); CompilerType reference_compiler_type = m_ast.CreateReferenceType(pointee_compiler_type); TypeSP type_sp(new Type(die.GetID(), dwarf, reference_compiler_type.GetTypeName(), -1, nullptr, - dwarf->MakeUserID(type_die_offset), Type::eEncodingIsUID, &decl, + type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl, reference_compiler_type, Type::eResolveStateFull)); type_sp->SetEncodingType(pointee_type); return type_sp; @@ -463,7 +465,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType & case DW_TAG_member: { const char *name = nullptr; - lldb::user_id_t encoding_uid = LLDB_INVALID_UID; + DWARFFormValue encoding_uid; uint32_t member_byte_offset = UINT32_MAX; DWARFExpression member_location_expression(dwarf_cu); bool artificial = true; @@ -481,7 +483,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType & name = form_value.AsCString(); break; case DW_AT_type: - encoding_uid = form_value.Reference(); + encoding_uid = form_value; break; case DW_AT_data_member_location: if (form_value.BlockData()) @@ -508,7 +510,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType & m_ast.SetDynamicTypeId(compiler_type, member_location_expression); else { - if (Type *member_type = die.ResolveTypeUID(encoding_uid)) + if (Type *member_type = die.ResolveTypeUID(DIERef(encoding_uid))) m_ast.AddMemberToObject(compiler_type, ConstString(name), member_type->GetFullCompilerType(), member_byte_offset); } @@ -516,7 +518,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType & } case DW_TAG_inheritance: { - lldb::user_id_t encoding_uid = LLDB_INVALID_UID; + DWARFFormValue encoding_uid; uint32_t member_byte_offset = UINT32_MAX; DWARFAttributes attributes; @@ -529,7 +531,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType & switch (attributes.AttributeAtIndex(i)) { case DW_AT_type: - encoding_uid = form_value.Reference(); + encoding_uid = form_value; break; case DW_AT_data_member_location: member_byte_offset = form_value.Unsigned(); @@ -543,7 +545,7 @@ DWARFASTParserJava::ParseChildMembers(const DWARFDIE &parent_die, CompilerType & } } } - if (Type *base_type = die.ResolveTypeUID(encoding_uid)) + if (Type *base_type = die.ResolveTypeUID(DIERef(encoding_uid))) m_ast.AddBaseClassToObject(compiler_type, base_type->GetFullCompilerType(), member_byte_offset); break; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp index 51dcb7c2d73..d1328015708 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp @@ -433,7 +433,7 @@ DWARFCompileUnit::GetID () const { dw_offset_t local_id = m_base_obj_offset != DW_INVALID_OFFSET ? m_base_obj_offset : m_offset; if (m_dwarf2Data) - return m_dwarf2Data->MakeUserID(local_id); + return DIERef(local_id, local_id).GetUID(m_dwarf2Data); else return local_id; } @@ -631,7 +631,7 @@ DWARFCompileUnit::GetDIE (dw_offset_t die_offset) { // Don't specify the compile unit offset as we don't know it because the DIE belongs to // a different compile unit in the same symbol file. - return m_dwarf2Data->DebugInfo()->GetDIE (DIERef(die_offset)); + return m_dwarf2Data->DebugInfo()->GetDIEForDIEOffset(die_offset); } } return DWARFDIE(); // Not found diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index 0564de9e5dd..4963f8599da 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -9,6 +9,7 @@ #include "DWARFDIE.h" +#include "DWARFASTParser.h" #include "DWARFCompileUnit.h" #include "DWARFDebugAbbrev.h" #include "DWARFDebugAranges.h" @@ -127,6 +128,21 @@ DWARFDIE::GetAttributeValueAsSigned (const dw_attr_t attr, int64_t fail_value) c return fail_value; } +DWARFDIE +DWARFDIE::GetAttributeValueAsReferenceDIE (const dw_attr_t attr) const +{ + if (IsValid()) + { + DWARFCompileUnit *cu = GetCU(); + SymbolFileDWARF *dwarf = cu->GetSymbolFileDWARF(); + const bool check_specification_or_abstract_origin = true; + DWARFFormValue form_value; + if (m_die->GetAttributeValue(dwarf, cu, attr, form_value, nullptr, check_specification_or_abstract_origin)) + return dwarf->GetDIE(DIERef(form_value)); + } + return DWARFDIE(); +} + uint64_t DWARFDIE::GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const { @@ -166,7 +182,7 @@ DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const if (cu->ContainsDIEOffset(block_die->GetOffset())) return DWARFDIE(cu, block_die); else - return DWARFDIE(dwarf->DebugInfo()->GetCompileUnitContainingDIE(DIERef(cu->GetOffset(), block_die->GetOffset())), block_die); + return DWARFDIE(dwarf->DebugInfo()->GetCompileUnit(DIERef(cu->GetOffset(), block_die->GetOffset())), block_die); } } } @@ -176,27 +192,7 @@ DWARFDIE::LookupDeepestBlock (lldb::addr_t file_addr) const lldb::user_id_t DWARFDIE::GetID () const { - const dw_offset_t die_offset = GetOffset(); - if (die_offset != DW_INVALID_OFFSET) - { - lldb::user_id_t id = 0; - SymbolFileDWARF *dwarf = GetDWARF(); - if (dwarf) - id = dwarf->MakeUserID(die_offset); - else - id = die_offset; - - if (m_cu) - { - lldb::user_id_t cu_id = m_cu->GetID()&0xffffffff00000000ull; - assert ((id&0xffffffff00000000ull) == 0 || - (cu_id&0xffffffff00000000ll) == 0 || - (id&0xffffffff00000000ull) == (cu_id&0xffffffff00000000ll)); - id |= cu_id; - } - return id; - } - return LLDB_INVALID_UID; + return GetDIERef().GetUID(GetDWARF()); } const char * @@ -274,11 +270,11 @@ DWARFDIE::ResolveType () const } lldb_private::Type * -DWARFDIE::ResolveTypeUID (lldb::user_id_t uid) const +DWARFDIE::ResolveTypeUID (const DIERef &die_ref) const { SymbolFileDWARF *dwarf = GetDWARF(); if (dwarf) - return dwarf->ResolveTypeUID(uid); + return dwarf->ResolveTypeUID(dwarf->GetDIE(die_ref), true); else return nullptr; } @@ -530,6 +526,36 @@ DWARFDIE::Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const } +CompilerDecl +DWARFDIE::GetDecl () const +{ + DWARFASTParser *dwarf_ast = GetDWARFParser(); + if (dwarf_ast) + return dwarf_ast->GetDeclForUIDFromDWARF(*this); + else + return CompilerDecl(); +} + +CompilerDeclContext +DWARFDIE::GetDeclContext () const +{ + DWARFASTParser *dwarf_ast = GetDWARFParser(); + if (dwarf_ast) + return dwarf_ast->GetDeclContextForUIDFromDWARF(*this); + else + return CompilerDeclContext(); +} + +CompilerDeclContext +DWARFDIE::GetContainingDeclContext () const +{ + DWARFASTParser *dwarf_ast = GetDWARFParser(); + if (dwarf_ast) + return dwarf_ast->GetDeclContextContainingUIDFromDWARF(*this); + else + return CompilerDeclContext(); +} + bool operator == (const DWARFDIE &lhs, const DWARFDIE &rhs) { return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h index db37a45ad01..2dcd1d7dc43 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h @@ -58,7 +58,7 @@ public: //---------------------------------------------------------------------- // Tests //---------------------------------------------------------------------- - operator bool () const + explicit operator bool () const { return IsValid(); } @@ -180,9 +180,11 @@ public: lldb_private::Type * ResolveType () const; + //---------------------------------------------------------------------- // Resolve a type by UID using this DIE's DWARF file + //---------------------------------------------------------------------- lldb_private::Type * - ResolveTypeUID (lldb::user_id_t uid) const; + ResolveTypeUID (const DIERef &die_ref) const; //---------------------------------------------------------------------- // Functions for obtaining DIE relations and references @@ -245,6 +247,9 @@ public: uint64_t GetAttributeValueAsReference (const dw_attr_t attr, uint64_t fail_value) const; + DWARFDIE + GetAttributeValueAsReferenceDIE (const dw_attr_t attr) const; + uint64_t GetAttributeValueAsAddress (const dw_attr_t attr, uint64_t fail_value) const; @@ -270,6 +275,15 @@ public: void Dump (lldb_private::Stream *s, const uint32_t recurse_depth) const; + lldb_private::CompilerDecl + GetDecl () const; + + lldb_private::CompilerDeclContext + GetDeclContext() const; + + lldb_private::CompilerDeclContext + GetContainingDeclContext() const; + protected: DWARFCompileUnit *m_cu; DWARFDebugInfoEntry *m_die; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp index 9e021c7185b..e9f09fd8776 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.cpp @@ -16,17 +16,6 @@ using namespace lldb_private; using namespace std; -bool -DWARFDIECollection::Insert(const DWARFDIE &die) -{ - iterator end_pos = m_dies.end(); - iterator insert_pos = upper_bound(m_dies.begin(), end_pos, die); - if (insert_pos != end_pos && (*insert_pos == die)) - return false; - m_dies.insert(insert_pos, die); - return true; -} - void DWARFDIECollection::Append (const DWARFDIE &die) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h index e39e1aa4ccd..83d58ec4930 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIECollection.h @@ -33,9 +33,6 @@ public: DWARFDIE GetDIEAtIndex (uint32_t idx) const; - bool - Insert(const DWARFDIE &die); - size_t Size() const; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp index a1b00d1892e..417f2cd79bd 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp @@ -209,48 +209,51 @@ DWARFDebugInfo::GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr) } DWARFCompileUnit * -DWARFDebugInfo::GetCompileUnitContainingDIE (const DIERef& die_ref) +DWARFDebugInfo::GetCompileUnit (const DIERef& die_ref) { - dw_offset_t search_offset = die_ref.die_offset; - bool is_cu_offset = false; - if (m_dwarf2Data->GetID() == 0 && die_ref.cu_offset != DW_INVALID_OFFSET) - { - is_cu_offset = true; - search_offset = die_ref.cu_offset; - } + if (die_ref.cu_offset == DW_INVALID_OFFSET) + return GetCompileUnitContainingDIEOffset(die_ref.die_offset); + else + return GetCompileUnit(die_ref.cu_offset); +} + +DWARFCompileUnit* +DWARFDebugInfo::GetCompileUnitContainingDIEOffset(dw_offset_t die_offset) +{ + ParseCompileUnitHeadersIfNeeded(); DWARFCompileUnitSP cu_sp; - if (search_offset != DW_INVALID_OFFSET) - { - ParseCompileUnitHeadersIfNeeded(); - // Watch out for single compile unit executable as they are pretty common - const size_t num_cus = m_compile_units.size(); - if (num_cus == 1) - { - if ((is_cu_offset && m_compile_units[0]->GetOffset() == search_offset) || - (!is_cu_offset && m_compile_units[0]->ContainsDIEOffset(search_offset))) - { - cu_sp = m_compile_units[0]; - } - } - else if (num_cus) + // Watch out for single compile unit executable as they are pretty common + const size_t num_cus = m_compile_units.size(); + if (num_cus == 1) + { + if (m_compile_units[0]->ContainsDIEOffset(die_offset)) + return m_compile_units[0].get(); + } + else if (num_cus) + { + CompileUnitColl::const_iterator end_pos = m_compile_units.end(); + CompileUnitColl::const_iterator begin_pos = m_compile_units.begin(); + CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, die_offset, OffsetLessThanCompileUnitOffset); + if (pos != begin_pos) { - CompileUnitColl::const_iterator end_pos = m_compile_units.end(); - CompileUnitColl::const_iterator begin_pos = m_compile_units.begin(); - CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, search_offset, OffsetLessThanCompileUnitOffset); - if (pos != begin_pos) - { - --pos; - if ((is_cu_offset && (*pos)->GetOffset() == search_offset) || - (!is_cu_offset && (*pos)->ContainsDIEOffset(search_offset))) - { - cu_sp = *pos; - } - } + --pos; + if ((*pos)->ContainsDIEOffset(die_offset)) + return (*pos).get(); } } - return cu_sp.get(); + + return nullptr; +} + +DWARFDIE +DWARFDebugInfo::GetDIEForDIEOffset(dw_offset_t die_offset) +{ + DWARFCompileUnit* cu = GetCompileUnitContainingDIEOffset(die_offset); + if (cu) + return cu->GetDIE(die_offset); + return DWARFDIE(); } //---------------------------------------------------------------------- @@ -261,7 +264,7 @@ DWARFDebugInfo::GetCompileUnitContainingDIE (const DIERef& die_ref) DWARFDIE DWARFDebugInfo::GetDIE(const DIERef& die_ref) { - DWARFCompileUnit *cu = GetCompileUnitContainingDIE(die_ref); + DWARFCompileUnit *cu = GetCompileUnit(die_ref); if (cu) return cu->GetDIE (die_ref.die_offset); return DWARFDIE(); // Not found diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h index ea2e204db70..7783135bdb9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h @@ -39,9 +39,10 @@ public: size_t GetNumCompileUnits(); bool ContainsCompileUnit (const DWARFCompileUnit *cu) const; DWARFCompileUnit* GetCompileUnitAtIndex (uint32_t idx); - DWARFCompileUnit* GetCompileUnit (dw_offset_t cu_offset, uint32_t* idx_ptr = NULL); - DWARFCompileUnit* GetCompileUnitContainingDIE (const DIERef& die_ref); - + DWARFCompileUnit* GetCompileUnit(dw_offset_t cu_offset, uint32_t* idx_ptr = NULL); + DWARFCompileUnit* GetCompileUnitContainingDIEOffset (dw_offset_t die_offset); + DWARFCompileUnit* GetCompileUnit(const DIERef& die_ref); + DWARFDIE GetDIEForDIEOffset(dw_offset_t die_offset); DWARFDIE GetDIE (const DIERef& die_ref); void Dump(lldb_private::Stream *s, const uint32_t die_offset, const uint32_t recurse_depth); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h index 02bbff8defc..27b4fe93bc3 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h @@ -115,6 +115,13 @@ public: DWARFAttributes& attrs, uint32_t curr_depth = 0) const; // "curr_depth" for internal use only, don't set this yourself!!! + dw_offset_t GetAttributeValue(SymbolFileDWARF* dwarf2Data, + const DWARFCompileUnit* cu, + const dw_attr_t attr, + DWARFFormValue& formValue, + dw_offset_t* end_attr_offset_ptr = nullptr, + bool check_specification_or_abstract_origin = false) const; + const char* GetAttributeValueAsString( SymbolFileDWARF* dwarf2Data, const DWARFCompileUnit* cu, @@ -382,12 +389,6 @@ public: DWARFDebugInfoEntry::collection &die_collection); protected: - dw_offset_t GetAttributeValue(SymbolFileDWARF* dwarf2Data, - const DWARFCompileUnit* cu, - const dw_attr_t attr, - DWARFFormValue& formValue, - dw_offset_t* end_attr_offset_ptr = nullptr, - bool check_specification_or_abstract_origin = false) const; dw_offset_t m_offset; // Offset within the .debug_info of the start of this entry uint32_t m_parent_idx; // How many to subtract from "this" to get the parent. If zero this die has no parent diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp index a0ed9731a56..addc1485846 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp @@ -167,6 +167,14 @@ DWARFFormValue::DWARFFormValue(const DWARFCompileUnit* cu, dw_form_t form) : { } +void +DWARFFormValue::Clear() +{ + m_cu = nullptr; + m_form = 0; + memset(&m_value, 0, sizeof(m_value)); +} + bool DWARFFormValue::ExtractValue(const DWARFDataExtractor& data, lldb::offset_t* offset_ptr) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h index b10f4d3a0ac..07bd038d948 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.h @@ -101,6 +101,7 @@ public: static FixedFormSizes GetFixedFormSizesForAddressSize (uint8_t addr_size, bool is_dwarf64); static int Compare (const DWARFFormValue& a, const DWARFFormValue& b); + void Clear(); protected: const DWARFCompileUnit* m_cu; // Compile unit for this form dw_form_t m_form; // Form for this value diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index e161c08470b..36f4d2b8ca4 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -279,9 +279,11 @@ SymbolFileDWARF::CreateInstance (ObjectFile* obj_file) TypeList * SymbolFileDWARF::GetTypeList () { - if (GetDebugMapSymfile ()) - return m_debug_map_symfile->GetTypeList(); - return m_obj_file->GetModule()->GetTypeList(); + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); + if (debug_map_symfile) + return debug_map_symfile->GetTypeList(); + else + return m_obj_file->GetModule()->GetTypeList(); } void @@ -485,15 +487,17 @@ GetDWARFMachOSegmentName () UniqueDWARFASTTypeMap & SymbolFileDWARF::GetUniqueDWARFASTTypeMap () { - if (GetDebugMapSymfile ()) - return m_debug_map_symfile->GetUniqueDWARFASTTypeMap (); - return m_unique_ast_type_map; + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); + if (debug_map_symfile) + return debug_map_symfile->GetUniqueDWARFASTTypeMap (); + else + return m_unique_ast_type_map; } TypeSystem * SymbolFileDWARF::GetTypeSystemForLanguage (LanguageType language) { - SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile (); + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); TypeSystem *type_system; if (debug_map_symfile) { @@ -825,30 +829,13 @@ SymbolFileDWARF::GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit) DWARFDebugInfo* info = DebugInfo(); if (info) { - if (GetDebugMapSymfile ()) - { - // The debug map symbol file made the compile units for this DWARF - // file which is .o file with DWARF in it, and we should have - // only 1 compile unit which is at offset zero in the DWARF. - // TODO: modify to support LTO .o files where each .o file might - // have multiple DW_TAG_compile_unit tags. - - DWARFCompileUnit *dwarf_cu = info->GetCompileUnit(0); - if (dwarf_cu && dwarf_cu->GetUserData() == NULL) - dwarf_cu->SetUserData(comp_unit); - return dwarf_cu; - } - else - { - // Just a normal DWARF file whose user ID for the compile unit is - // the DWARF offset itself - - DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID()); - if (dwarf_cu && dwarf_cu->GetUserData() == NULL) - dwarf_cu->SetUserData(comp_unit); - return dwarf_cu; + // Just a normal DWARF file whose user ID for the compile unit is + // the DWARF offset itself - } + DWARFCompileUnit *dwarf_cu = info->GetCompileUnit((dw_offset_t)comp_unit->GetID()); + if (dwarf_cu && dwarf_cu->GetUserData() == NULL) + dwarf_cu->SetUserData(comp_unit); + return dwarf_cu; } return NULL; } @@ -895,7 +882,7 @@ SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) { return dwarf_cu->GetSymbolFileDWARF()->ParseCompileUnit(dwarf_cu, cu_idx); } - else if (GetDebugMapSymfile ()) + else if (dwarf_cu->GetOffset() == 0 && GetDebugMapSymfile ()) { // Let the debug map create the compile unit cu_sp = m_debug_map_symfile->GetCompileUnit(this); @@ -1009,7 +996,7 @@ SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, const DWARFD bool SymbolFileDWARF::FixupAddress (Address &addr) { - SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile (); + SymbolFileDWARFDebugMap * debug_map_symfile = GetDebugMapSymfile(); if (debug_map_symfile) { return debug_map_symfile->LinkOSOAddress(addr); @@ -1230,13 +1217,14 @@ SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc) lldb::offset_t offset = cu_line_offset; DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info); - if (m_debug_map_symfile) + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); + if (debug_map_symfile) { // We have an object file that has a line table with addresses // that are not linked. We need to link the line table and convert // the addresses that are relative to the .o file into addresses // for the main executable. - sc.comp_unit->SetLineTable (m_debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get())); + sc.comp_unit->SetLineTable (debug_map_symfile->LinkOSOLineTable (this, line_table_ap.get())); } else { @@ -1474,60 +1462,27 @@ SymbolFileDWARF::ParseDeclsForContext (CompilerDeclContext decl_ctx) CompilerDecl SymbolFileDWARF::GetDeclForUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE die = debug_info->GetDIE(DIERef(type_uid)); - if (die) - { - DWARFASTParser *dwarf_ast = die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->GetDeclForUIDFromDWARF(die); - } - } - } + DWARFDIE die = GetDIE(DIERef(type_uid, this)); + if (die) + return die.GetDecl(); return CompilerDecl(); } CompilerDeclContext SymbolFileDWARF::GetDeclContextForUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE die = debug_info->GetDIE(DIERef(type_uid)); - if (die) - { - DWARFASTParser *dwarf_ast = die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->GetDeclContextForUIDFromDWARF(die); - } - } - } + DWARFDIE die = GetDIE(DIERef(type_uid, this)); + if (die) + return die.GetDeclContext(); return CompilerDeclContext(); } CompilerDeclContext SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE die = debug_info->GetDIE(DIERef(type_uid)); - if (die) - { - DWARFASTParser *dwarf_ast = die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->GetDeclContextContainingUIDFromDWARF(die); - } - } - } + DWARFDIE die = GetDIE (DIERef(type_uid, this)); + if (die) + return die.GetContainingDeclContext(); return CompilerDeclContext(); } @@ -1535,23 +1490,22 @@ SymbolFileDWARF::GetDeclContextContainingUID (lldb::user_id_t type_uid) Type* SymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid) { - if (UserIDMatches(type_uid)) + DWARFDIE type_die = GetDIE (DIERef(type_uid, this)); + if (type_die) { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - { - DWARFDIE type_die = debug_info->GetDIE (DIERef(type_uid)); - if (type_die) - { - const bool assert_not_being_parsed = true; - return ResolveTypeUID (type_die, assert_not_being_parsed); - } - } + const bool assert_not_being_parsed = true; + return ResolveTypeUID (type_die, assert_not_being_parsed); } return NULL; } Type* +SymbolFileDWARF::ResolveTypeUID (const DIERef &die_ref) +{ + return ResolveType (GetDIE(die_ref), true); +} + +Type* SymbolFileDWARF::ResolveTypeUID (const DWARFDIE &die, bool assert_not_being_parsed) { if (die) @@ -1642,30 +1596,29 @@ SymbolFileDWARF::CompleteType (CompilerType &compiler_type) return true; } - DWARFDebugInfo* debug_info = DebugInfo(); - DWARFDIE dwarf_die = debug_info->GetDIE(die_it->getSecond()); - - assert(UserIDMatches(die_it->getSecond().GetUID()) && "CompleteType called on the wrong SymbolFile"); - - // Once we start resolving this type, remove it from the forward declaration - // map in case anyone child members or other types require this type to get resolved. - // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition - // are done. - GetForwardDeclClangTypeToDie().erase (die_it); + DWARFDIE dwarf_die = GetDIE(die_it->getSecond()); + if (dwarf_die) + { + // Once we start resolving this type, remove it from the forward declaration + // map in case anyone child members or other types require this type to get resolved. + // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition + // are done. + GetForwardDeclClangTypeToDie().erase (die_it); - Type *type = GetDIEToType().lookup (dwarf_die.GetDIE()); + Type *type = GetDIEToType().lookup (dwarf_die.GetDIE()); - Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION)); - if (log) - GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log, - "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", - dwarf_die.GetID(), - dwarf_die.GetTagAsCString(), - type->GetName().AsCString()); - assert (compiler_type); - DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type); + Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO|DWARF_LOG_TYPE_COMPLETION)); + if (log) + GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log, + "0x%8.8" PRIx64 ": %s '%s' resolving forward declaration...", + dwarf_die.GetID(), + dwarf_die.GetTagAsCString(), + type->GetName().AsCString()); + assert (compiler_type); + DWARFASTParser *dwarf_ast = dwarf_die.GetDWARFParser(); + if (dwarf_ast) + return dwarf_ast->CompleteTypeFromDWARF (dwarf_die, type, compiler_type); + } return false; } @@ -1674,10 +1627,7 @@ SymbolFileDWARF::ResolveType (const DWARFDIE &die, bool assert_not_being_parsed, { if (die) { - Type *type = GetDIEToType().lookup (die.GetDIE()); - - if (type == NULL) - type = GetTypeForDIE (die, resolve_function_context).get(); + Type *type = GetTypeForDIE (die, resolve_function_context).get(); if (assert_not_being_parsed) { @@ -1763,6 +1713,17 @@ SymbolFileDWARF::GetDWOModule (ConstString name) return lldb::ModuleSP(); } +DWARFDIE +SymbolFileDWARF::GetDIE (const DIERef &die_ref) +{ + DWARFDebugInfo * debug_info = DebugInfo(); + if (debug_info) + return debug_info->GetDIE(die_ref); + else + return DWARFDIE(); +} + + std::unique_ptr<SymbolFileDWARFDwo> SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) { @@ -2330,12 +2291,11 @@ SymbolFileDWARF::FindGlobalVariables (const ConstString &name, const CompilerDec sc.module_sp = m_obj_file->GetModule(); assert (sc.module_sp); - DWARFDebugInfo* debug_info = DebugInfo(); bool done = false; for (size_t i=0; i<num_die_matches && !done; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -2448,11 +2408,10 @@ SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append const size_t num_matches = die_offsets.size(); if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3098,11 +3057,10 @@ SymbolFileDWARF::FindTypes (const SymbolContext& sc, if (num_die_matches) { const uint32_t initial_types_size = types.GetSize(); - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_die_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3221,11 +3179,10 @@ SymbolFileDWARF::FindTypes (const std::vector<CompilerContext> &context, if (num_die_matches) { size_t num_matches = 0; - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_die_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3304,11 +3261,10 @@ SymbolFileDWARF::FindNamespace (const SymbolContext& sc, const size_t num_matches = die_offsets.size(); if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { @@ -3523,11 +3479,10 @@ SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die, if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE type_die = debug_info->GetDIE (die_ref); + DWARFDIE type_die = GetDIE (die_ref); if (type_die) { @@ -3747,11 +3702,10 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext & if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE type_die = debug_info->GetDIE (die_ref); + DWARFDIE type_die = GetDIE (die_ref); if (type_die) { @@ -3995,7 +3949,7 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc) if (sc.function) { - DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID())); + DWARFDIE function_die = info->GetDIE(DIERef(sc.function->GetID(), this)); const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress (DW_AT_low_pc, LLDB_INVALID_ADDRESS); if (func_lo_pc != LLDB_INVALID_ADDRESS) @@ -4050,11 +4004,10 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc) const size_t num_matches = die_offsets.size(); if (num_matches) { - DWARFDebugInfo* debug_info = DebugInfo(); for (size_t i=0; i<num_matches; ++i) { const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); + DWARFDIE die = GetDIE (die_ref); if (die) { VariableSP var_sp (ParseVariableDIE(sc, die, LLDB_INVALID_ADDRESS)); @@ -4233,11 +4186,7 @@ SymbolFileDWARF::ParseVariableDIE } break; case DW_AT_specification: - { - DWARFDebugInfo* debug_info = DebugInfo(); - if (debug_info) - spec_die = debug_info->GetDIE(DIERef(form_value)); - } + spec_die = GetDIE(DIERef(form_value)); break; case DW_AT_start_scope: { @@ -4350,7 +4299,7 @@ SymbolFileDWARF::ParseVariableDIE scope = eValueTypeVariableStatic; - SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile (); + SymbolFileDWARFDebugMap *debug_map_symfile = GetDebugMapSymfile(); if (debug_map_symfile) { @@ -4456,7 +4405,7 @@ SymbolFileDWARF::ParseVariableDIE if (symbol_context_scope) { - SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID())); + SymbolFileTypeSP type_sp(new SymbolFileType(*this, DIERef(type_die_form).GetUID(this))); if (const_value.Form() && type_sp && type_sp->GetType()) location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), die.GetCU()->GetAddressByteSize()); @@ -4615,7 +4564,7 @@ SymbolFileDWARF::ParseVariables (const SymbolContext& sc, // a concrete block counterpart in the current function. We need // to find the concrete block so we can correctly add the // variable to it - const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID()), + const DWARFDIE concrete_block_die = FindBlockContainingSpecification (DIERef(sc.function->GetID(), this), sc_parent_die.GetOffset()); if (concrete_block_die) block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die.GetID()); @@ -4706,7 +4655,7 @@ SymbolFileDWARF::DumpIndexes () SymbolFileDWARFDebugMap * -SymbolFileDWARF::GetDebugMapSymfile () +SymbolFileDWARF::GetDebugMapSymfile() { if (m_debug_map_symfile == NULL && !m_debug_map_module_wp.expired()) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index fa7f12d8417..529284e4d5e 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -68,7 +68,9 @@ public: friend class SymbolFileDWARFDebugMap; friend class SymbolFileDWARFDwo; friend class DebugMapModule; + friend class DIERef; friend class DWARFCompileUnit; + friend class DWARFDIE; friend class DWARFASTParserClang; friend class DWARFASTParserGo; friend class DWARFASTParserJava; @@ -302,12 +304,6 @@ public: GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx = UINT32_MAX); - lldb::user_id_t - MakeUserID (dw_offset_t die_offset) const - { - return GetID() | die_offset; - } - size_t GetObjCMethodDIEOffsets (lldb_private::ConstString class_name, DIEArray &method_die_offsets); @@ -330,6 +326,9 @@ public: lldb::ModuleSP GetDWOModule (lldb_private::ConstString name); + DWARFDIE + GetDIE(const DIERef &die_ref); + virtual std::unique_ptr<SymbolFileDWARFDwo> GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die); @@ -393,8 +392,10 @@ protected: bool *type_is_new); lldb_private::Type * - ResolveTypeUID (const DWARFDIE &die, - bool assert_not_being_parsed); + ResolveTypeUID(const DWARFDIE &die, bool assert_not_being_parsed); + + lldb_private::Type * + ResolveTypeUID(const DIERef &die_ref); lldb::VariableSP ParseVariableDIE(const lldb_private::SymbolContext& sc, @@ -489,15 +490,6 @@ protected: GetUniqueDWARFASTTypeMap (); bool - UserIDMatches (lldb::user_id_t uid) const - { - const lldb::user_id_t high_uid = uid & 0xffffffff00000000ull; - if (high_uid != 0 && GetID() != 0) - return high_uid == GetID(); - return true; - } - - bool DIEDeclContextsMatch (const DWARFDIE &die1, const DWARFDIE &die2); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index 25a4e192486..a9929ef3936 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -107,10 +107,11 @@ protected: kNumFlags }; - friend class DWARFCompileUnit; - friend class SymbolFileDWARF; friend class DebugMapModule; + friend class DIERef; friend class DWARFASTParserClang; + friend class DWARFCompileUnit; + friend class SymbolFileDWARF; struct OSOInfo { lldb::ModuleSP module_sp; |