Index: lit/Breakpoint/Inputs/debug_rnglistx_addrx.yaml =================================================================== --- lit/Breakpoint/Inputs/debug_rnglistx_addrx.yaml +++ lit/Breakpoint/Inputs/debug_rnglistx_addrx.yaml @@ -0,0 +1,53 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000201000 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000201000 + AddressAlign: 0x0000000000000010 + Content: 31ED4989D15E4889E24883E4F0505449C7C07011200048C7C10011200048C7C7F0102000E887010000F4CCCCCCCCCCCC55B810202000483D102020004889E57417B8000000004885C0740D5DBF10202000FFE00F1F4400005DC3660F1F440000BE10202000554881EE102020004889E548C1FE034889F048C1E83F4801C648D1FE7415B8000000004885C0740B5DBF10202000FFE00F1F005DC3660F1F440000803D592F0000007517554889E5E87EFFFFFFC605472F0000015DC30F1F440000F3C30F1F4000662E0F1F840000000000554889E55DEB89CCCCCCCCCCCCCCCCCCC3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC31C0C3CCCCCCCCCCCCCCCCCCCCCCCCCC415741564189FF415541544C8D25F61E000055488D2DF61E0000534989F64989D54C29E54883EC0848C1FD03E8430000004885ED742031DB0F1F8400000000004C89EA4C89F64489FF41FF14DC4883C3014839EB75EA4883C4085B5D415C415D415E415FC390662E0F1F840000000000F3C3 + - Name: .debug_str_offsets + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: 340000000500000053000000420000001D000000000000007B0000004E0000000D0000004A00000011000000090000004C00000076000000 + - Name: .debug_str + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 5F5A33626172314100666F6F00696E74005F5A4E314133666F6F4576002F686F6D652F756D622F74657374735F323031382F3131326C6C64625F726C657461677300746573742E636300610041006D61696E00636C616E672076657273696F6E20382E302E3020287472756E6B2033343532363929006F626A410062617200 + - Name: .debug_abbrev + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: 011101252513050325721710171B2573171101552374170000022E01111B120640187A196E2503253A0B3B0B3F19000003050003253A0B3B0B49130000042E01111B120640187A1903253A0B3B0B49133F19000005340003253A0B3B0B4913000006240003253E0B0B0B0000071301360B03250B0B3A0B3B0B0000082E016E2503253A0B3B0B3C193F1900000905004913341900000A0F004913000000 + - Name: .debug_info + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: 7000000005000108000000000100040001080000000000000002080000000000000000000000000C000000020001000000015703040107030701075C00000000040103000000015705010B58000000050B010C5C000000000606050407050A0101030808090104096E00000000000A5C00000000 + - Name: .debug_rnglists + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '1300000005000800010000000400000003000103010300' + - Name: .debug_macinfo + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '00' + - Name: .debug_addr + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: 1400000005000800E010200000000000F010200000000000 + - Name: .debug_line + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: 80000000050008004C000000010101FB0E0D00010101010000000100000101011F010000000003011F020F051E0225000000004D3CD81829AA5FCEC81F4AD48AF9D71925000000004D3CD81829AA5FCEC81F4AD48AF9D719000902E0102000000000001805010A140201000101000902F010200000000000030A0105030A160203000101 + - Name: .debug_line_str + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x0000000000000001 + Content: 2F686F6D652F756D622F74657374735F323031382F3131326C6C64625F726C657461677300746573742E636300 +Symbols: Index: lit/Breakpoint/debug_rnglistx_addrx.test =================================================================== --- lit/Breakpoint/debug_rnglistx_addrx.test +++ lit/Breakpoint/debug_rnglistx_addrx.test @@ -0,0 +1,30 @@ +# RUN: yaml2obj %p/Inputs/debug_rnglistx_addrx.yaml > %ttest +# RUN: lldb-test breakpoints %ttest %s | FileCheck %s + +# The following code and invocation were used. +# clang -gdwarf-5 test.cc -o test_v5 -fuse-ld=lld -fno-rtti -O2 -ffunction-sections +# Then output was converted to yaml and reduced. +# +# struct A { +# void foo() {}; +# }; +# +# void bar(struct A a) { +# a.foo(); +# } +# +# int main() { +# A objA; +# bar(objA); +# +# return 0; +# } +# +# clang and LLD versions were 8.0.0 (trunk 345269) +# +# Output file contains DW_FORM_rnglistx and DW_FORM_addrx forms. + +b bar + +# CHECK-LABEL: b bar +# CHECK: Address: {{.*}}`bar(A) at test.cc:9:1 Index: source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp +++ source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp @@ -118,6 +118,7 @@ break; // 1 byte values + case DW_FORM_addrx1: case DW_FORM_data1: case DW_FORM_flag: case DW_FORM_ref1: @@ -126,17 +127,21 @@ break; // 2 byte values + case DW_FORM_addrx2: case DW_FORM_data2: case DW_FORM_ref2: case DW_FORM_strx2: form_size = 2; break; + // 3 byte values + case DW_FORM_addrx3: case DW_FORM_strx3: form_size = 3; break; // 4 byte values + case DW_FORM_addrx4: case DW_FORM_data4: case DW_FORM_ref4: case DW_FORM_strx4: @@ -151,6 +156,8 @@ break; // signed or unsigned LEB 128 values + case DW_FORM_addrx: + case DW_FORM_rnglistx: case DW_FORM_sdata: case DW_FORM_udata: case DW_FORM_ref_udata: Index: source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp +++ source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp @@ -233,18 +233,23 @@ m_value.value.uval = data.GetMaxU64(offset_ptr, DWARFUnit::IsDWARF64(m_cu) ? 8 : 4); break; + case DW_FORM_addrx: case DW_FORM_strx: m_value.value.uval = data.GetULEB128(offset_ptr); break; + case DW_FORM_addrx1: case DW_FORM_strx1: m_value.value.uval = data.GetU8(offset_ptr); break; + case DW_FORM_addrx2: case DW_FORM_strx2: m_value.value.uval = data.GetU16(offset_ptr); break; + case DW_FORM_addrx3: case DW_FORM_strx3: m_value.value.uval = data.GetMaxU64(offset_ptr, 3); break; + case DW_FORM_addrx4: case DW_FORM_strx4: m_value.value.uval = data.GetU32(offset_ptr); break; @@ -376,6 +381,7 @@ return true; // 1 byte values + case DW_FORM_addrx1: case DW_FORM_data1: case DW_FORM_flag: case DW_FORM_ref1: @@ -384,6 +390,7 @@ return true; // 2 byte values + case DW_FORM_addrx2: case DW_FORM_data2: case DW_FORM_ref2: case DW_FORM_strx2: @@ -391,6 +398,7 @@ return true; // 3 byte values + case DW_FORM_addrx3: case DW_FORM_strx3: *offset_ptr += 3; return true; @@ -403,6 +411,7 @@ return true; // 4 byte values + case DW_FORM_addrx4: case DW_FORM_data4: case DW_FORM_ref4: case DW_FORM_strx4: @@ -417,6 +426,8 @@ return true; // signed or unsigned LEB 128 values + case DW_FORM_addrx: + case DW_FORM_rnglistx: case DW_FORM_sdata: case DW_FORM_udata: case DW_FORM_ref_udata: @@ -625,7 +636,9 @@ return Unsigned(); assert(m_cu); - assert(m_form == DW_FORM_GNU_addr_index); + assert(m_form == DW_FORM_GNU_addr_index || m_form == DW_FORM_addrx || + m_form == DW_FORM_addrx1 || m_form == DW_FORM_addrx2 || + m_form == DW_FORM_addrx3 || m_form == DW_FORM_addrx4); if (!symbol_file) return 0; @@ -798,6 +811,7 @@ bool DWARFFormValue::FormIsSupported(dw_form_t form) { switch (form) { case DW_FORM_addr: + case DW_FORM_addrx: case DW_FORM_block2: case DW_FORM_block4: case DW_FORM_data2: @@ -822,6 +836,7 @@ case DW_FORM_ref4: case DW_FORM_ref8: case DW_FORM_ref_udata: + case DW_FORM_rnglistx: case DW_FORM_indirect: case DW_FORM_sec_offset: case DW_FORM_exprloc: Index: source/Plugins/SymbolFile/DWARF/DWARFUnit.h =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -111,8 +111,9 @@ dw_addr_t GetBaseAddress() const { return m_base_addr; } dw_addr_t GetAddrBase() const { return m_addr_base; } dw_addr_t GetRangesBase() const { return m_ranges_base; } - void SetAddrBase(dw_addr_t addr_base, dw_addr_t ranges_base, - dw_offset_t base_obj_offset); + void SetAddrBase(dw_addr_t addr_base); + void SetRangesBase(dw_addr_t ranges_base); + void SetBaseObjOffset(dw_offset_t base_obj_offset); void BuildAddressRangeTable(SymbolFileDWARF *dwarf, DWARFDebugAranges *debug_aranges); Index: source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -307,6 +307,9 @@ // m_die_array_mutex must be already held as read/write. void DWARFUnit::AddUnitDIE(const DWARFDebugInfoEntry &cu_die) { + SetAddrBase( + cu_die.GetAttributeValueAsUnsigned(m_dwarf, this, DW_AT_addr_base, 0)); + uint64_t base_addr = cu_die.GetAttributeValueAsAddress( m_dwarf, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS); if (base_addr == LLDB_INVALID_ADDRESS) @@ -339,9 +342,13 @@ dw_addr_t addr_base = cu_die.GetAttributeValueAsUnsigned(m_dwarf, this, DW_AT_GNU_addr_base, 0); + dwo_cu->SetAddrBase(addr_base); + dw_addr_t ranges_base = cu_die.GetAttributeValueAsUnsigned( m_dwarf, this, DW_AT_GNU_ranges_base, 0); - dwo_cu->SetAddrBase(addr_base, ranges_base, m_offset); + dwo_cu->SetRangesBase(ranges_base); + + dwo_cu->SetBaseObjOffset(m_offset); } DWARFDIE DWARFUnit::LookupAddress(const dw_addr_t address) { @@ -399,11 +406,13 @@ return m_abbrevs ? m_abbrevs->GetOffset() : DW_INVALID_OFFSET; } -void DWARFUnit::SetAddrBase(dw_addr_t addr_base, - dw_addr_t ranges_base, - dw_offset_t base_obj_offset) { - m_addr_base = addr_base; +void DWARFUnit::SetAddrBase(dw_addr_t addr_base) { m_addr_base = addr_base; } + +void DWARFUnit::SetRangesBase(dw_addr_t ranges_base) { m_ranges_base = ranges_base; +} + +void DWARFUnit::SetBaseObjOffset(dw_offset_t base_obj_offset) { m_base_obj_offset = base_obj_offset; }