Skip to content

Commit

Permalink
Fix DW_OP_convert to resolve the CU relative offset correctly.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
clayborg committed Sep 12, 2022
1 parent c9ccaf1 commit 376c7bd
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 6 deletions.
6 changes: 4 additions & 2 deletions lldb/source/Expression/DWARFExpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
18 changes: 17 additions & 1 deletion lldb/unittests/Expression/DWARFExpressionTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@

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);

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);
}
2 changes: 1 addition & 1 deletion lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
};
Expand Down

0 comments on commit 376c7bd

Please sign in to comment.