diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -2387,7 +2387,8 @@ } else { // Retrieve the type DIE that the value is being converted to. // FIXME: the constness has annoying ripple effects. - DWARFDIE die = const_cast(dwarf_cu)->GetDIE(die_offset); + DWARFDIE die = const_cast(dwarf_cu)->GetDIE( + dwarf_cu->GetOffset() + 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 --- a/lldb/unittests/Expression/DWARFExpressionTest.cpp +++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp @@ -54,8 +54,8 @@ class DWARFExpressionTester : public YAMLModuleTester { public: using YAMLModuleTester::YAMLModuleTester; - llvm::Expected Eval(llvm::ArrayRef expr) { - return ::Evaluate(expr, m_module_sp, m_dwarf_unit); + llvm::Expected Eval(llvm::ArrayRef expr, DWARFUnit *unit) { + return ::Evaluate(expr, m_module_sp, unit); } }; @@ -86,7 +86,8 @@ Machine: EM_386 DWARF: debug_abbrev: - - Table: + - ID: 0 + Table: - Code: 0x00000001 Tag: DW_TAG_compile_unit Children: DW_CHILDREN_yes @@ -104,50 +105,64 @@ debug_info: - Version: 4 AddrSize: 8 + AbbrevTableID: 0 + Entries: + - AbbrCode: 0x00000001 + Values: + - Value: 0x000000000000000C + - AbbrCode: 0x00000002 + Values: + - Value: 0x0000000000000007 # DW_ATE_unsigned + - Value: 0x0000000000000004 + - AbbrCode: 0x00000000 + - Version: 4 + AddrSize: 8 + AbbrevTableID: 0 Entries: - AbbrCode: 0x00000001 Values: - Value: 0x000000000000000C - # 0x0000000e: - AbbrCode: 0x00000002 Values: - Value: 0x0000000000000007 # DW_ATE_unsigned - Value: 0x0000000000000004 - # 0x00000011: - AbbrCode: 0x00000002 Values: - Value: 0x0000000000000007 # DW_ATE_unsigned - Value: 0x0000000000000008 - # 0x00000014: - AbbrCode: 0x00000002 Values: - Value: 0x0000000000000005 # DW_ATE_signed - Value: 0x0000000000000008 - # 0x00000017: - AbbrCode: 0x00000002 Values: - Value: 0x0000000000000008 # DW_ATE_unsigned_char - Value: 0x0000000000000001 - # 0x0000001a: - AbbrCode: 0x00000002 Values: - Value: 0x0000000000000006 # DW_ATE_signed_char - Value: 0x0000000000000001 - # 0x0000001d: - AbbrCode: 0x00000002 Values: - Value: 0x000000000000000b # DW_ATE_numeric_string - Value: 0x0000000000000001 - AbbrCode: 0x00000000 )"; - 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); - ASSERT_TRUE((bool)t.GetDwarfUnit()); + ASSERT_EQ(2u, t.GetNumUnits()); + DWARFUnit *unit = t.GetUnitAtIndex(1); + DWARFDIE uint32_die = unit->DIE().GetFirstChild(); + DWARFDIE uint64_die = uint32_die.GetSibling(); + DWARFDIE sint64_die = uint64_die.GetSibling(); + DWARFDIE uchar_die = sint64_die.GetSibling(); + DWARFDIE schar_die = uchar_die.GetSibling(); + DWARFDIE numeric_string_die = schar_die.GetSibling(); + auto offset = [](DWARFDIE die) -> uint8_t { + dw_offset_t result = die.GetOffset() - die.GetCU()->GetOffset(); + assert(result <= 0x7f); + return result; + }; // Constant is given as little-endian. bool is_signed = true; @@ -160,54 +175,62 @@ // Truncate to default unspecified (pointer-sized) type. EXPECT_THAT_EXPECTED( t.Eval({DW_OP_const8u, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, // - DW_OP_convert, 0x00}), + DW_OP_convert, 0x00}, + unit), llvm::HasValue(GetScalar(32, 0x44332211, not_signed))); // Truncate to 32 bits. - EXPECT_THAT_EXPECTED(t.Eval({DW_OP_const8u, // - 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,// - DW_OP_convert, offs_uint32_t}), - llvm::HasValue(GetScalar(32, 0x44332211, not_signed))); + EXPECT_THAT_EXPECTED( + t.Eval({DW_OP_const8u, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, // + DW_OP_convert, offset(uint32_die)}, + unit), + llvm::HasValue(GetScalar(32, 0x44332211, not_signed))); // Leave as is. EXPECT_THAT_EXPECTED( t.Eval({DW_OP_const8u, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, // - DW_OP_convert, offs_uint64_t}), + DW_OP_convert, offset(uint64_die)}, + unit), llvm::HasValue(GetScalar(64, 0x8877665544332211, not_signed))); // Sign-extend to 64 bits. EXPECT_THAT_EXPECTED( t.Eval({DW_OP_const4s, 0xcc, 0xdd, 0xee, 0xff, // - DW_OP_convert, offs_sint64_t}), + DW_OP_convert, offset(sint64_die)}, + unit), llvm::HasValue(GetScalar(64, 0xffffffffffeeddcc, is_signed))); // Truncate to 8 bits. - EXPECT_THAT_EXPECTED( - t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', DW_OP_convert, offs_uchar}), - llvm::HasValue(GetScalar(8, 'A', not_signed))); + EXPECT_THAT_EXPECTED(t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', // + DW_OP_convert, offset(uchar_die)}, + unit), + llvm::HasValue(GetScalar(8, 'A', not_signed))); // Also truncate to 8 bits. - EXPECT_THAT_EXPECTED( - t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', DW_OP_convert, offs_schar}), - llvm::HasValue(GetScalar(8, 'A', is_signed))); + EXPECT_THAT_EXPECTED(t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', // + DW_OP_convert, offset(schar_die)}, + unit), + llvm::HasValue(GetScalar(8, 'A', is_signed))); // // Errors. // // No Module. - EXPECT_THAT_ERROR(Evaluate({DW_OP_const1s, 'X', DW_OP_convert, 0x00}, nullptr, - t.GetDwarfUnit()) - .takeError(), - llvm::Failed()); + EXPECT_THAT_ERROR( + Evaluate({DW_OP_const1s, 'X', DW_OP_convert, 0x00}, nullptr, unit) + .takeError(), + llvm::Failed()); // No DIE. EXPECT_THAT_ERROR( - t.Eval({DW_OP_const1s, 'X', DW_OP_convert, 0x01}).takeError(), + t.Eval({DW_OP_const1s, 'X', DW_OP_convert, 0x01}, unit).takeError(), llvm::Failed()); // Unsupported. EXPECT_THAT_ERROR( - t.Eval({DW_OP_const1s, 'X', DW_OP_convert, 0x1d}).takeError(), + t.Eval({DW_OP_const1s, 'X', DW_OP_convert, offset(numeric_string_die)}, + unit) + .takeError(), llvm::Failed()); } diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp --- a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp +++ b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp @@ -90,12 +90,12 @@ )"; YAMLModuleTester t(yamldata); - ASSERT_TRUE((bool)t.GetDwarfUnit()); + ASSERT_EQ(1u, t.GetNumUnits()); TypeSystemClang ast_ctx("dummy ASTContext", HostInfoBase::GetTargetTriple()); DWARFASTParserClangStub ast_parser(ast_ctx); - DWARFUnit *unit = t.GetDwarfUnit(); + DWARFUnit *unit = t.GetUnitAtIndex(0); const DWARFDebugInfoEntry *die_first = unit->DIE().GetDIE(); const DWARFDebugInfoEntry *die_child0 = die_first->GetFirstChild(); const DWARFDebugInfoEntry *die_child1 = die_child0->GetSibling(); diff --git a/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp b/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp --- a/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp +++ b/lldb/unittests/SymbolFile/DWARF/XcodeSDKModuleTests.cpp @@ -67,7 +67,8 @@ )"; YAMLModuleTester t(yamldata); - DWARFUnit *dwarf_unit = t.GetDwarfUnit(); + ASSERT_EQ(1u, t.GetNumUnits()); + DWARFUnit *dwarf_unit = t.GetUnitAtIndex(0); auto *dwarf_cu = llvm::cast(dwarf_unit); ASSERT_TRUE(static_cast(dwarf_cu)); SymbolFileDWARF &sym_file = dwarf_cu->GetSymbolFileDWARF(); diff --git a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h --- a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h +++ b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.h @@ -29,13 +29,14 @@ subsystems; llvm::Optional m_file; lldb::ModuleSP m_module_sp; - DWARFUnit *m_dwarf_unit; public: /// Parse the debug info sections from the YAML description. YAMLModuleTester(llvm::StringRef yaml_data); - DWARFUnit *GetDwarfUnit() const { return m_dwarf_unit; } lldb::ModuleSP GetModule() const { return m_module_sp; } + + size_t GetNumUnits(); + DWARFUnit *GetUnitAtIndex(size_t idx); }; } // namespace lldb_private diff --git a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp --- a/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp +++ b/lldb/unittests/TestingSupport/Symbol/YAMLModuleTester.cpp @@ -20,7 +20,16 @@ m_file = std::move(*File); m_module_sp = std::make_shared(m_file->moduleSpec()); - auto &symfile = *llvm::cast(m_module_sp->GetSymbolFile()); +} + +size_t YAMLModuleTester::GetNumUnits() { + return llvm::cast(m_module_sp->GetSymbolFile()) + ->DebugInfo() + .GetNumUnits(); +} - m_dwarf_unit = symfile.DebugInfo().GetUnitAtIndex(0); +DWARFUnit *YAMLModuleTester::GetUnitAtIndex(size_t idx) { + return llvm::cast(m_module_sp->GetSymbolFile()) + ->DebugInfo() + .GetUnitAtIndex(idx); }