https://github.com/felipepiovezan updated https://github.com/llvm/llvm-project/pull/77349
>From 1b444a334fdfd5c88e263e9804cffbd7574a670b Mon Sep 17 00:00:00 2001 From: Felipe de Azevedo Piovezan <fpiove...@apple.com> Date: Mon, 11 Dec 2023 12:42:40 -0300 Subject: [PATCH 1/2] [lldb][[DWARFDeclContext] Add function to extract qualified names as vector This functionality will support the efforts to implement the IDX_Parent attribute of accelerator table entries, and it will allow us to more easily compare each of the names in a DIE parent chain hierarchy. --- .../SymbolFile/DWARF/DWARFDeclContext.cpp | 6 + .../SymbolFile/DWARF/DWARFDeclContext.h | 5 + .../SymbolFile/DWARF/DWARFDIETest.cpp | 109 ++++++++++++++++++ 3 files changed, 120 insertions(+) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp index 44421c0eda3eec..3cdb47d50bbfc0 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.cpp @@ -55,6 +55,12 @@ const char *DWARFDeclContext::GetQualifiedName() const { return m_qualified_name.c_str(); } +llvm::SmallVector<llvm::StringRef> +DWARFDeclContext::GetQualifiedNameAsVector() const { + return llvm::to_vector_of<llvm::StringRef>( + llvm::map_range(m_entries, GetName)); +} + bool DWARFDeclContext::operator==(const DWARFDeclContext &rhs) const { if (m_entries.size() != rhs.m_entries.size()) return false; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h index a20a862d340296..40ebb72c91d8f0 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h @@ -68,6 +68,11 @@ class DWARFDeclContext { const char *GetQualifiedName() const; + /// Returns a vector of string, one string per entry in the fully qualified + /// name. For example, for the name `A::B::C`, this methods returns `{"A", + /// "B", "C"}` + llvm::SmallVector<llvm::StringRef> GetQualifiedNameAsVector() const; + // Same as GetQualifiedName, but the life time of the returned string will // be that of the LLDB session. ConstString GetQualifiedNameAsConstString() const { diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFDIETest.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFDIETest.cpp index 8497855b2f3db5..5672270ee31f89 100644 --- a/lldb/unittests/SymbolFile/DWARF/DWARFDIETest.cpp +++ b/lldb/unittests/SymbolFile/DWARF/DWARFDIETest.cpp @@ -7,8 +7,10 @@ //===----------------------------------------------------------------------===// #include "Plugins/SymbolFile/DWARF/DWARFDIE.h" +#include "Plugins/SymbolFile/DWARF/DWARFDeclContext.h" #include "TestingSupport/Symbol/YAMLModuleTester.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringRef.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -104,3 +106,110 @@ TEST(DWARFDIETest, ChildIteration) { DWARFDIE no_children_die(unit, die_child0); EXPECT_TRUE(no_children_die.children().empty()); } + +TEST(DWARFDIETest, DeclContext) { + const char *yamldata = R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_386 +DWARF: + debug_str: + - 'mynamespace' + - 'mystruct' + - 'mytype' + debug_abbrev: + - Table: + - Code: 0x00000001 + Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_language + Form: DW_FORM_data2 + - Code: 0x00000002 + Tag: DW_TAG_structure_type + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Code: 0x00000003 + Tag: DW_TAG_base_type + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Code: 0x00000004 + Tag: DW_TAG_namespace + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_strp + debug_info: + - Version: 4 + AddrSize: 8 + Entries: + - AbbrCode: 0x00000001 # compile_unit + Values: + - Value: 0x000000000000000C + - AbbrCode: 0x00000004 # namespace + Values: + - Value: 0x0000000000000000 # DW_ATE_strp + - AbbrCode: 0x00000002 # structure_type + Values: + - Value: 0x000000000000000c # DW_ATE_strp + - AbbrCode: 0x00000003 # base_type + Values: + - Value: 0x0000000000000015 # DW_ATE_strp + - AbbrCode: 0x00000000 +)"; + + YAMLModuleTester t(yamldata); + DWARFUnit *unit = t.GetDwarfUnit(); + ASSERT_TRUE(unit != nullptr); + auto &ctx = unit->GetSymbolFileDWARF(); + + auto top_level_die = unit->DIE(); + { + ASSERT_TRUE(top_level_die); + auto top_level_ctx = ctx.GetDWARFDeclContext(top_level_die); + auto top_level_name = llvm::StringRef(top_level_ctx.GetQualifiedName()); + ASSERT_EQ(top_level_name, ""); + } + + auto namespace_die = top_level_die.GetFirstChild(); + { + ASSERT_TRUE(namespace_die); + auto namespace_ctx = ctx.GetDWARFDeclContext(namespace_die); + auto namespace_name = llvm::StringRef(namespace_ctx.GetQualifiedName()); + ASSERT_EQ(namespace_name, "::mynamespace"); + auto namespace_names = namespace_ctx.GetQualifiedNameAsVector(); + ASSERT_EQ(namespace_names.size(), 1u); + ASSERT_EQ(namespace_names.front(), "mynamespace"); + } + + auto struct_die = namespace_die.GetFirstChild(); + { + ASSERT_TRUE(struct_die); + auto struct_ctx = ctx.GetDWARFDeclContext(struct_die); + auto struct_name = llvm::StringRef(struct_ctx.GetQualifiedName()); + ASSERT_EQ(struct_name, "mynamespace::mystruct"); + auto struct_names = struct_ctx.GetQualifiedNameAsVector(); + ASSERT_EQ(struct_names.size(), 2u); + ASSERT_EQ(struct_names[0], "mystruct"); + ASSERT_EQ(struct_names[1], "mynamespace"); + } + auto simple_type_die = struct_die.GetFirstChild(); + { + ASSERT_TRUE(simple_type_die); + auto simple_type_ctx = ctx.GetDWARFDeclContext(simple_type_die); + auto simple_type_name = llvm::StringRef(simple_type_ctx.GetQualifiedName()); + ASSERT_EQ(simple_type_name, "mynamespace::mystruct::mytype"); + auto simple_type_names = simple_type_ctx.GetQualifiedNameAsVector(); + ASSERT_EQ(simple_type_names.size(), 3u); + ASSERT_EQ(simple_type_names[0], "mytype"); + ASSERT_EQ(simple_type_names[1], "mystruct"); + ASSERT_EQ(simple_type_names[2], "mynamespace"); + } +} >From 21d0852e1d55421cc96fdae58816784760d0d327 Mon Sep 17 00:00:00 2001 From: Felipe de Azevedo Piovezan <fpiove...@apple.com> Date: Mon, 8 Jan 2024 15:24:09 -0300 Subject: [PATCH 2/2] fixup! [lldb][[DWARFDeclContext] Add function to extract qualified names as vector --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h index 40ebb72c91d8f0..29ab418738edf7 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDeclContext.h @@ -69,8 +69,8 @@ class DWARFDeclContext { const char *GetQualifiedName() const; /// Returns a vector of string, one string per entry in the fully qualified - /// name. For example, for the name `A::B::C`, this methods returns `{"A", - /// "B", "C"}` + /// name. For example, for the DeclContext `A::B::C`, this methods returns + /// `{"C", "B", "A"}` llvm::SmallVector<llvm::StringRef> GetQualifiedNameAsVector() const; // Same as GetQualifiedName, but the life time of the returned string will _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits