[Lldb-commits] [lldb] 376c7bd - Fix DW_OP_convert to resolve the CU relative offset correctly.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Mon Sep 12 16:53:28 PDT 2022
Author: Greg Clayton
Date: 2022-09-12T16:53:19-07:00
New Revision: 376c7bd92aff0e4256b2842400936a9b29343045
URL: https://github.com/llvm/llvm-project/commit/376c7bd92aff0e4256b2842400936a9b29343045
DIFF: https://github.com/llvm/llvm-project/commit/376c7bd92aff0e4256b2842400936a9b29343045.diff
LOG: Fix DW_OP_convert to resolve the CU relative offset correctly.
Debugging some DWARF5 binaries was causing errors to appear when DWARFExpression::Evaluate was called:
error: GetDIE for DIE 0x31 is outside of its CU 0x123450
The issue is in the DWARF expression evaluator. Fixed with this.
Differential Revision: https://reviews.llvm.org/D133623
Added:
Modified:
lldb/source/Expression/DWARFExpression.cpp
lldb/unittests/Expression/DWARFExpressionTest.cpp
lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp
lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h
Removed:
################################################################################
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index 283e04021a52a..8e9c868a6405b 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -2374,9 +2374,11 @@ bool DWARFExpression::Evaluate(
return false;
}
} else {
- // Retrieve the type DIE that the value is being converted to.
+ // Retrieve the type DIE that the value is being converted to. This
+ // offset is compile unit relative so we need to fix it up.
+ const uint64_t abs_die_offset = die_offset + dwarf_cu->GetOffset();
// FIXME: the constness has annoying ripple effects.
- DWARFDIE die = const_cast<DWARFUnit *>(dwarf_cu)->GetDIE(die_offset);
+ DWARFDIE die = const_cast<DWARFUnit *>(dwarf_cu)->GetDIE(abs_die_offset);
if (!die) {
if (error_ptr)
error_ptr->SetErrorString("Cannot resolve DW_OP_convert type DIE");
diff --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp
index 2678db9aa6a42..8d23f1c49564b 100644
--- a/lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -61,6 +61,9 @@ static llvm::Expected<Scalar> Evaluate(llvm::ArrayRef<uint8_t> expr,
class DWARFExpressionTester : public YAMLModuleTester {
public:
+ DWARFExpressionTester(llvm::StringRef yaml_data, size_t cu_index) :
+ YAMLModuleTester(yaml_data, cu_index) {}
+
using YAMLModuleTester::YAMLModuleTester;
llvm::Expected<Scalar> Eval(llvm::ArrayRef<uint8_t> expr) {
return ::Evaluate(expr, m_module_sp, m_dwarf_unit);
@@ -179,6 +182,17 @@ TEST(DWARFExpression, DW_OP_convert) {
debug_info:
- Version: 4
AddrSize: 8
+ AbbrevTableID: 0
+ AbbrOffset: 0x0
+ Entries:
+ - AbbrCode: 0x00000001
+ Values:
+ - Value: 0x000000000000000C
+ - AbbrCode: 0x00000000
+ - Version: 4
+ AddrSize: 8
+ AbbrevTableID: 0
+ AbbrOffset: 0x0
Entries:
- AbbrCode: 0x00000001
Values:
@@ -214,14 +228,16 @@ TEST(DWARFExpression, DW_OP_convert) {
- Value: 0x000000000000000b # DW_ATE_numeric_string
- Value: 0x0000000000000001
- AbbrCode: 0x00000000
+
)";
+ // Compile unit relative offsets to each DW_TAG_base_type
uint8_t offs_uint32_t = 0x0000000e;
uint8_t offs_uint64_t = 0x00000011;
uint8_t offs_sint64_t = 0x00000014;
uint8_t offs_uchar = 0x00000017;
uint8_t offs_schar = 0x0000001a;
- DWARFExpressionTester t(yamldata);
+ DWARFExpressionTester t(yamldata, /*cu_index=*/1);
ASSERT_TRUE((bool)t.GetDwarfUnit());
// Constant is given as little-endian.
diff --git a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp
index 15db62451f91a..14e7c7d5203ed 100644
--- a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp
+++ b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp
@@ -14,7 +14,7 @@
using namespace lldb_private;
-YAMLModuleTester::YAMLModuleTester(llvm::StringRef yaml_data) {
+YAMLModuleTester::YAMLModuleTester(llvm::StringRef yaml_data, size_t cu_index) {
llvm::Expected<TestFile> File = TestFile::fromYaml(yaml_data);
EXPECT_THAT_EXPECTED(File, llvm::Succeeded());
m_file = std::move(*File);
@@ -22,5 +22,5 @@ YAMLModuleTester::YAMLModuleTester(llvm::StringRef yaml_data) {
m_module_sp = std::make_shared<Module>(m_file->moduleSpec());
auto &symfile = *llvm::cast<SymbolFileDWARF>(m_module_sp->GetSymbolFile());
- m_dwarf_unit = symfile.DebugInfo().GetUnitAtIndex(0);
+ m_dwarf_unit = symfile.DebugInfo().GetUnitAtIndex(cu_index);
}
diff --git a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h
index 60715ab2c16a6..1b1bf22be1cb2 100644
--- a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h
+++ b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h
@@ -33,7 +33,7 @@ class YAMLModuleTester {
public:
/// Parse the debug info sections from the YAML description.
- YAMLModuleTester(llvm::StringRef yaml_data);
+ YAMLModuleTester(llvm::StringRef yaml_data, size_t cu_index = 0);
DWARFUnit *GetDwarfUnit() const { return m_dwarf_unit; }
lldb::ModuleSP GetModule() const { return m_module_sp; }
};
More information about the lldb-commits
mailing list