[Lldb-commits] [lldb] [lldb] Update the String table offset based on the DWARF format (PR #147054)
Hemang Gadhavi via lldb-commits
lldb-commits at lists.llvm.org
Mon Jul 14 02:41:16 PDT 2025
https://github.com/HemangGadhavi updated https://github.com/llvm/llvm-project/pull/147054
>From 4ae4d0ab6ba44317e00dced8f247341ec9930c2c Mon Sep 17 00:00:00 2001
From: HemangGadhavi <hemang.gadhavi at ibm.com>
Date: Fri, 4 Jul 2025 09:28:30 -0400
Subject: [PATCH 1/3] [lldb] Updated the String table offset based on the DWARF
format
---
lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
index f216ab13e8936..daaa4eca6f198 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -1077,7 +1077,8 @@ uint32_t DWARFUnit::GetHeaderByteSize() const { return m_header.getSize(); }
std::optional<uint64_t>
DWARFUnit::GetStringOffsetSectionItem(uint32_t index) const {
- lldb::offset_t offset = GetStrOffsetsBase() + index * 4;
+ lldb::offset_t offset =
+ GetStrOffsetsBase() + index * m_header.getDwarfOffsetByteSize();
return m_dwarf.GetDWARFContext().getOrLoadStrOffsetsData().GetU32(&offset);
}
>From 6620ef231817e5247bd4141da9528fc961ccbfed Mon Sep 17 00:00:00 2001
From: HemangGadhavi <hemang.gadhavi at ibm.com>
Date: Fri, 11 Jul 2025 09:43:46 -0400
Subject: [PATCH 2/3] Added testcase
---
.../Plugins/SymbolFile/DWARF/DWARFUnit.cpp | 3 +-
.../SymbolFile/DWARF/DWARF64UnitTest.cpp | 97 +++++++++++++++++++
2 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
index daaa4eca6f198..8b0fade86f177 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -1079,7 +1079,8 @@ std::optional<uint64_t>
DWARFUnit::GetStringOffsetSectionItem(uint32_t index) const {
lldb::offset_t offset =
GetStrOffsetsBase() + index * m_header.getDwarfOffsetByteSize();
- return m_dwarf.GetDWARFContext().getOrLoadStrOffsetsData().GetU32(&offset);
+ return m_dwarf.GetDWARFContext().getOrLoadStrOffsetsData().GetMaxU64(
+ &offset, m_header.getDwarfOffsetByteSize());
}
llvm::Expected<llvm::DWARFAddressRangesVector>
diff --git a/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp b/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp
index 2303f68674e4c..de584d2b1433c 100644
--- a/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp
+++ b/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp
@@ -84,3 +84,100 @@ TEST(DWARF64UnitTest, DWARF64DebugInfoAndCU) {
ASSERT_TRUE(declaration.IsValid());
ASSERT_EQ(declaration.Tag(), DW_TAG_subprogram);
}
+
+TEST(DWARF64UnitTest, DWARF5StrTable) {
+ const char *yamldata = R"(
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_PPC64
+DWARF:
+ debug_str:
+ - 'clang version 18.1.8 (clang-18.1.8-1)'
+ - 'main.c'
+ - 'foo'
+ - 'main'
+ debug_abbrev:
+ - Table:
+ - Code: 0x1
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_producer
+ Form: DW_FORM_strx1
+ - Attribute: DW_AT_language
+ Form: DW_FORM_data2
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strx1
+ - Attribute: DW_AT_str_offsets_base
+ Form: DW_FORM_sec_offset
+ - Code: 0x2
+ Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strx1
+ debug_info:
+ - Format: DWARF64
+ Version: 0x05
+ UnitType: DW_UT_compile
+ AbbrOffset: 0x0
+ AddrSize: 0x08
+ Entries:
+ - AbbrCode: 0x1
+ Values:
+ - Value: 0x0
+ - Value: 0x04
+ - Value: 0x1
+ - Value: 0x00000010
+ - AbbrCode: 0x2
+ Values:
+ - Value: 0x2
+ - AbbrCode: 0x2
+ Values:
+ - Value: 0x3
+ - AbbrCode: 0x0
+
+ debug_str_offsets:
+ - Format: DWARF64
+ Version: "0x05"
+ Offsets:
+ - 0x00000000
+ - 0x00000026
+ - 0x0000002d
+ - 0x00000031
+)";
+
+ YAMLModuleTester t(yamldata);
+ auto *symbol_file =
+ llvm::cast<SymbolFileDWARF>(t.GetModule()->GetSymbolFile());
+ DWARFUnit *unit = symbol_file->DebugInfo().GetUnitAtIndex(0);
+ ASSERT_TRUE(unit);
+ ASSERT_EQ(unit->GetFormParams().Format, DwarfFormat::DWARF64);
+ ASSERT_EQ(unit->GetVersion(), 5);
+ ASSERT_EQ(unit->GetAddressByteSize(), 8);
+
+ DWARFFormValue form_value;
+ const DWARFDebugInfoEntry *cu_entry = unit->DIE().GetDIE();
+ ASSERT_EQ(cu_entry->Tag(), DW_TAG_compile_unit);
+ ASSERT_EQ(unit->GetProducer(), eProducerClang);
+ ASSERT_EQ(unit->GetDWARFLanguageType(), DW_LANG_C_plus_plus);
+ auto attrs = cu_entry->GetAttributes(unit, DWARFDebugInfoEntry::Recurse::yes);
+ attrs.ExtractFormValueAtIndex(3,
+ form_value); // Validate DW_AT_str_offsets_bae
+ ASSERT_EQ(form_value.Unsigned(), 0x00000010UL);
+ DWARFDIE cu_die(unit, cu_entry);
+ ASSERT_EQ(ConstString(cu_die.GetName()), "main.c");
+
+ auto func_foo = cu_die.GetFirstChild();
+ ASSERT_TRUE(func_foo.IsValid());
+ ASSERT_EQ(func_foo.Tag(), DW_TAG_subprogram);
+ ASSERT_EQ(ConstString(func_foo.GetName()), "foo");
+
+ auto func_main = func_foo.GetSibling();
+ ASSERT_TRUE(func_main.IsValid());
+ ASSERT_EQ(func_main.Tag(), DW_TAG_subprogram);
+ ASSERT_EQ(ConstString(func_main.GetName()), "main");
+}
>From 2243f0948a003b47f057c50cfc23a9bf2305b717 Mon Sep 17 00:00:00 2001
From: HemangGadhavi <hemang.gadhavi at ibm.com>
Date: Mon, 14 Jul 2025 05:40:53 -0400
Subject: [PATCH 3/3] changed LE to BE
---
lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp b/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp
index de584d2b1433c..20061ec191ca1 100644
--- a/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp
+++ b/lldb/unittests/SymbolFile/DWARF/DWARF64UnitTest.cpp
@@ -90,7 +90,7 @@ TEST(DWARF64UnitTest, DWARF5StrTable) {
--- !ELF
FileHeader:
Class: ELFCLASS64
- Data: ELFDATA2LSB
+ Data: ELFDATA2MSB
Type: ET_EXEC
Machine: EM_PPC64
DWARF:
More information about the lldb-commits
mailing list