grimar created this revision.
grimar added reviewers: LLDB, clayborg.
Herald added a subscriber: JDevlieghere.

This adds the support for DW_FORM_rnglistx, DW_FORM_addrx, DW_FORM_addrx1, 
DW_FORM_addrx2, DW_FORM_addrx3, DW_FORM_addrx4 forms.


https://reviews.llvm.org/D53813

Files:
  lit/Breakpoint/Inputs/debug_rnglistx_addrx.yaml
  lit/Breakpoint/debug_rnglistx_addrx.test
  source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
  source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
  source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
  source/Plugins/SymbolFile/DWARF/DWARFUnit.h

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;
 }
 
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,21 +381,24 @@
     return true;
 
     // 1 byte values
+    case DW_FORM_addrx1:
     case DW_FORM_data1:
     case DW_FORM_flag:
     case DW_FORM_ref1:
     case DW_FORM_strx1:
       *offset_ptr += 1;
       return true;
 
     // 2 byte values
+    case DW_FORM_addrx2:
     case DW_FORM_data2:
     case DW_FORM_ref2:
     case DW_FORM_strx2:
       *offset_ptr += 2;
       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/DWARFDebugInfoEntry.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
+++ source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
@@ -118,25 +118,30 @@
             break;
 
           // 1 byte values
+          case DW_FORM_addrx1:
           case DW_FORM_data1:
           case DW_FORM_flag:
           case DW_FORM_ref1:
           case DW_FORM_strx1:
             form_size = 1;
             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: 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: 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:
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to