From 61aed52c9ec0bca9979922ed2762785ec1f39755 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Wed, 23 Nov 2022 14:29:40 -0800 Subject: [PATCH] [lldb] Change FindDefinitionTypeForDWARFDeclContext() to take DWARFDIE This simplifies an upcoming patch. Reviewed By: labath Differential Revision: https://reviews.llvm.org/D138612 --- .../SymbolFile/DWARF/DWARFASTParserClang.cpp | 14 +- .../Plugins/SymbolFile/DWARF/DWARFDeclContext.h | 5 - .../Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 186 ++++++++++----------- .../Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 2 +- .../SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 4 +- .../SymbolFile/DWARF/SymbolFileDWARFDebugMap.h | 3 +- .../SymbolFile/DWARF/SymbolFileDWARFDwo.cpp | 7 +- .../Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h | 4 +- 8 files changed, 102 insertions(+), 123 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index a340f1d..2a71705 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -753,17 +753,14 @@ TypeSP DWARFASTParserClang::ParseEnum(const SymbolContext &sc, if (type_sp) return type_sp; - DWARFDeclContext die_decl_ctx = SymbolFileDWARF::GetDWARFDeclContext(die); - - type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx); + type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die); if (!type_sp) { SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile(); if (debug_map_symfile) { // We weren't able to find a full declaration in this DWARF, // see if we have a declaration anywhere else... - type_sp = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext( - die_decl_ctx); + type_sp = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext(die); } } @@ -1732,19 +1729,16 @@ DWARFASTParserClang::ParseStructureLikeDIE(const SymbolContext &sc, if (type_sp) return type_sp; - DWARFDeclContext die_decl_ctx = SymbolFileDWARF::GetDWARFDeclContext(die); - // type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, // type_name_const_str); - type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx); + type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die); if (!type_sp) { SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile(); if (debug_map_symfile) { // We weren't able to find a full declaration in this DWARF, see // if we have a declaration anywhere else... - type_sp = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext( - die_decl_ctx); + type_sp = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext(die); } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h index e466944..fa776f2 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h @@ -75,15 +75,10 @@ public: m_qualified_name.clear(); } - lldb::LanguageType GetLanguage() const { return m_language; } - - void SetLanguage(lldb::LanguageType language) { m_language = language; } - protected: typedef std::vector collection; collection m_entries; mutable std::string m_qualified_name; - lldb::LanguageType m_language = lldb::eLanguageTypeUnknown; }; #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index fef2a36..bd29d41 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2946,119 +2946,112 @@ bool SymbolFileDWARF::DIEDeclContextsMatch(const DWARFDIE &die1, return true; } -TypeSP SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext( - const DWARFDeclContext &dwarf_decl_ctx) { +TypeSP +SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die) { TypeSP type_sp; - const uint32_t dwarf_decl_ctx_count = dwarf_decl_ctx.GetSize(); - if (dwarf_decl_ctx_count > 0) { - const ConstString type_name(dwarf_decl_ctx[0].name); - const dw_tag_t tag = dwarf_decl_ctx[0].tag; + if (die.GetName()) { + const dw_tag_t tag = die.Tag(); - if (type_name) { - Log *log = GetLog(DWARFLog::TypeCompletion | DWARFLog::Lookups); - if (log) { - GetObjectFile()->GetModule()->LogMessage( - log, - "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%" - "s, qualified-name='%s')", - DW_TAG_value_to_name(dwarf_decl_ctx[0].tag), - dwarf_decl_ctx.GetQualifiedName()); - } + Log *log = GetLog(DWARFLog::TypeCompletion | DWARFLog::Lookups); + if (log) { + GetObjectFile()->GetModule()->LogMessage( + log, + "SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(tag=%" + "s, name='%s')", + DW_TAG_value_to_name(tag), die.GetName()); + } - // Get the type system that we are looking to find a type for. We will - // use this to ensure any matches we find are in a language that this - // type system supports - const LanguageType language = dwarf_decl_ctx.GetLanguage(); - TypeSystemSP type_system = nullptr; - if (language != eLanguageTypeUnknown) { - auto type_system_or_err = GetTypeSystemForLanguage(language); - if (auto err = type_system_or_err.takeError()) { - LLDB_LOG_ERROR(GetLog(LLDBLog::Symbols), std::move(err), - "Cannot get TypeSystem for language {}", - Language::GetNameForLanguageType(language)); - } else { - type_system = *type_system_or_err; - } + // Get the type system that we are looking to find a type for. We will + // use this to ensure any matches we find are in a language that this + // type system supports + const LanguageType language = GetLanguage(*die.GetCU()); + TypeSystemSP type_system = nullptr; + if (language != eLanguageTypeUnknown) { + auto type_system_or_err = GetTypeSystemForLanguage(language); + if (auto err = type_system_or_err.takeError()) { + LLDB_LOG_ERROR(GetLog(LLDBLog::Symbols), std::move(err), + "Cannot get TypeSystem for language {}", + Language::GetNameForLanguageType(language)); + } else { + type_system = *type_system_or_err; } + } - m_index->GetTypes(dwarf_decl_ctx, [&](DWARFDIE type_die) { - // Make sure type_die's language matches the type system we are - // looking for. We don't want to find a "Foo" type from Java if we - // are looking for a "Foo" type for C, C++, ObjC, or ObjC++. - if (type_system && - !type_system->SupportsLanguage(GetLanguage(*type_die.GetCU()))) - return true; - bool try_resolving_type = false; - - // Don't try and resolve the DIE we are looking for with the DIE - // itself! - const dw_tag_t type_tag = type_die.Tag(); - // Make sure the tags match - if (type_tag == tag) { - // The tags match, lets try resolving this type - try_resolving_type = true; - } else { - // The tags don't match, but we need to watch our for a forward - // declaration for a struct and ("struct foo") ends up being a - // class ("class foo { ... };") or vice versa. - switch (type_tag) { - case DW_TAG_class_type: - // We had a "class foo", see if we ended up with a "struct foo - // { ... };" - try_resolving_type = (tag == DW_TAG_structure_type); - break; - case DW_TAG_structure_type: - // We had a "struct foo", see if we ended up with a "class foo - // { ... };" - try_resolving_type = (tag == DW_TAG_class_type); - break; - default: - // Tags don't match, don't event try to resolve using this type - // whose name matches.... - break; - } - } - - if (!try_resolving_type) { - if (log) { - GetObjectFile()->GetModule()->LogMessage( - log, - "SymbolFileDWARF::" - "FindDefinitionTypeForDWARFDeclContext(tag=%s, " - "qualified-name='%s') ignoring die=0x%8.8x (%s)", - DW_TAG_value_to_name(dwarf_decl_ctx[0].tag), - dwarf_decl_ctx.GetQualifiedName(), type_die.GetOffset(), - type_die.GetName()); - } - return true; + m_index->GetTypes(GetDWARFDeclContext(die), [&](DWARFDIE type_die) { + // Make sure type_die's language matches the type system we are + // looking for. We don't want to find a "Foo" type from Java if we + // are looking for a "Foo" type for C, C++, ObjC, or ObjC++. + if (type_system && + !type_system->SupportsLanguage(GetLanguage(*type_die.GetCU()))) + return true; + bool try_resolving_type = false; + + // Don't try and resolve the DIE we are looking for with the DIE + // itself! + const dw_tag_t type_tag = type_die.Tag(); + // Make sure the tags match + if (type_tag == tag) { + // The tags match, lets try resolving this type + try_resolving_type = true; + } else { + // The tags don't match, but we need to watch our for a forward + // declaration for a struct and ("struct foo") ends up being a + // class ("class foo { ... };") or vice versa. + switch (type_tag) { + case DW_TAG_class_type: + // We had a "class foo", see if we ended up with a "struct foo + // { ... };" + try_resolving_type = (tag == DW_TAG_structure_type); + break; + case DW_TAG_structure_type: + // We had a "struct foo", see if we ended up with a "class foo + // { ... };" + try_resolving_type = (tag == DW_TAG_class_type); + break; + default: + // Tags don't match, don't event try to resolve using this type + // whose name matches.... + break; } + } - DWARFDeclContext type_dwarf_decl_ctx = GetDWARFDeclContext(type_die); - + if (!try_resolving_type) { if (log) { GetObjectFile()->GetModule()->LogMessage( log, "SymbolFileDWARF::" "FindDefinitionTypeForDWARFDeclContext(tag=%s, " - "qualified-name='%s') trying die=0x%8.8x (%s)", - DW_TAG_value_to_name(dwarf_decl_ctx[0].tag), - dwarf_decl_ctx.GetQualifiedName(), type_die.GetOffset(), - type_dwarf_decl_ctx.GetQualifiedName()); + "name='%s') ignoring die=0x%8.8x (%s)", + DW_TAG_value_to_name(tag), die.GetName(), type_die.GetOffset(), + type_die.GetName()); } + return true; + } - // Make sure the decl contexts match all the way up - if (dwarf_decl_ctx != type_dwarf_decl_ctx) - return true; + DWARFDeclContext type_dwarf_decl_ctx = GetDWARFDeclContext(type_die); - Type *resolved_type = ResolveType(type_die, false); - if (!resolved_type || resolved_type == DIE_IS_BEING_PARSED) - return true; + if (log) { + GetObjectFile()->GetModule()->LogMessage( + log, + "SymbolFileDWARF::" + "FindDefinitionTypeForDWARFDeclContext(tag=%s, " + "name='%s') trying die=0x%8.8x (%s)", + DW_TAG_value_to_name(tag), die.GetName(), type_die.GetOffset(), + type_dwarf_decl_ctx.GetQualifiedName()); + } - type_sp = resolved_type->shared_from_this(); - return false; - }); - } + // Make sure the decl contexts match all the way up + if (GetDWARFDeclContext(die) != type_dwarf_decl_ctx) + return true; + + Type *resolved_type = ResolveType(type_die, false); + if (!resolved_type || resolved_type == DIE_IS_BEING_PARSED) + return true; + + type_sp = resolved_type->shared_from_this(); + return false; + }); } return type_sp; } @@ -4172,7 +4165,6 @@ DWARFDeclContext SymbolFileDWARF::GetDWARFDeclContext(const DWARFDIE &die) { return {}; DWARFDeclContext dwarf_decl_ctx = die.GetDIE()->GetDWARFDeclContext(die.GetCU()); - dwarf_decl_ctx.SetLanguage(GetLanguage(*die.GetCU())); return dwarf_decl_ctx; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 8926ab8..89f935b 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -443,7 +443,7 @@ protected: lldb_private::SymbolContext &sc); virtual lldb::TypeSP - FindDefinitionTypeForDWARFDeclContext(const DWARFDeclContext &die_decl_ctx); + FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die); virtual lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE(const DWARFDIE &die, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 0156337..2dfd5dc 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1125,10 +1125,10 @@ SymbolFileDWARFDebugMap::ParseCallEdgesInFunction(UserID func_id) { } TypeSP SymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext( - const DWARFDeclContext &die_decl_ctx) { + const DWARFDIE &die) { TypeSP type_sp; ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { - type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx); + type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext(die); return ((bool)type_sp); }); return type_sp; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index dcc1a74..7c523c7 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -282,8 +282,7 @@ protected: CompileUnitInfo *GetCompileUnitInfo(SymbolFileDWARF *oso_dwarf); - lldb::TypeSP - FindDefinitionTypeForDWARFDeclContext(const DWARFDeclContext &die_decl_ctx); + lldb::TypeSP FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die); bool Supports_DW_AT_APPLE_objc_complete_type(SymbolFileDWARF *skip_dwarf_oso); diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp index f891ccc..b587b4f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp @@ -117,10 +117,9 @@ UniqueDWARFASTTypeMap &SymbolFileDWARFDwo::GetUniqueDWARFASTTypeMap() { return GetBaseSymbolFile().GetUniqueDWARFASTTypeMap(); } -lldb::TypeSP SymbolFileDWARFDwo::FindDefinitionTypeForDWARFDeclContext( - const DWARFDeclContext &die_decl_ctx) { - return GetBaseSymbolFile().FindDefinitionTypeForDWARFDeclContext( - die_decl_ctx); +lldb::TypeSP +SymbolFileDWARFDwo::FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die) { + return GetBaseSymbolFile().FindDefinitionTypeForDWARFDeclContext(die); } lldb::TypeSP SymbolFileDWARFDwo::FindCompleteObjCDefinitionTypeForDIE( diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h index 9da6e63..4cc3ca8 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h @@ -63,8 +63,8 @@ protected: UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap() override; - lldb::TypeSP FindDefinitionTypeForDWARFDeclContext( - const DWARFDeclContext &die_decl_ctx) override; + lldb::TypeSP + FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die) override; lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE( const DWARFDIE &die, lldb_private::ConstString type_name, -- 2.7.4