[PATCH] D77146: [DebugInfo] Fix reading location tables headers of v5 units in DWP.

Igor Kudrin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 31 07:44:49 PDT 2020


ikudrin created this revision.
ikudrin added reviewers: dblaikie, jhenderson, probinson, aprantl.
ikudrin added projects: LLVM, debug-info.
Herald added a subscriber: hiraditya.
ikudrin added a parent revision: D77145: [DebugInfo] Fix reading location tables of v5 units in DWP..

This fixes the reading of location lists headers for compilation units in package files by adjusting the reading offset according to the corresponding record in the unit index. This is required for `DW_FORM_loclistx` to work.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D77146

Files:
  llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
  llvm/test/DebugInfo/X86/dwp-v5-loclists.s


Index: llvm/test/DebugInfo/X86/dwp-v5-loclists.s
===================================================================
--- llvm/test/DebugInfo/X86/dwp-v5-loclists.s
+++ llvm/test/DebugInfo/X86/dwp-v5-loclists.s
@@ -12,12 +12,19 @@
 # CHECK-NEXT:   DW_AT_name ("a")
 # CHECK-NEXT:   DW_AT_location (0x{{[0-9a-f]+}}:
 # CHECK-NEXT:     DW_LLE_startx_length (0x0000000000000001, 0x0000000000000010): DW_OP_reg5 RDI)
+# CHECK:      DW_TAG_variable
+# CHECK-NEXT:   DW_AT_name ("b")
+# CHECK-NEXT:   DW_AT_location (indexed (0x1) loclist = 0x{{[0-9a-f]+}}:
+# CHECK-NEXT:     DW_LLE_startx_length (0x0000000000000005, 0x0000000000000020): DW_OP_regx RDI)
 
 # CHECK:      .debug_loclists.dwo contents:
 # CHECK:      locations list header:
 # CHECK:      locations list header:
+# CHECK:      offsets:
 # CHECK:      0x{{[0-9a-f]+}}:
 # CHECK-NEXT:   DW_LLE_startx_length (0x0000000000000001, 0x0000000000000010): DW_OP_reg5 RDI
+# CHECK:      0x{{[0-9a-f]+}}:
+# CHECK-NEXT:   DW_LLE_startx_length (0x0000000000000005, 0x0000000000000020): DW_OP_regx RDI
 
 .section .debug_abbrev.dwo, "e", @progbits
 .LAbbrevBegin:
@@ -35,6 +42,15 @@
     .uleb128 23                         # DW_FORM_sec_offset
     .byte 0                             # EOM(1)
     .byte 0                             # EOM(2)
+    .uleb128 3                          # Abbreviation Code
+    .uleb128 52                         # DW_TAG_variable
+    .byte 0                             # DW_CHILDREN_no
+    .uleb128 3                          # DW_AT_name
+    .uleb128 8                          # DW_FORM_string
+    .uleb128 2                          # DW_AT_location
+    .uleb128 34                         # DW_FORM_loclistx
+    .byte 0                             # EOM(1)
+    .byte 0                             # EOM(2)
     .byte 0                             # EOM(3)
 .LAbbrevEnd:
 
@@ -50,7 +66,10 @@
     .uleb128 1                          # Abbrev [1] DW_TAG_compile_unit
     .uleb128 2                          # Abbrev [2] DW_TAG_variable
     .asciz "a"                          # DW_AT_name
-    .long .LLL0-.LLLBegin               # DW_AT_location
+    .long .LLL0-.LLLBegin               # DW_AT_location (DW_FORM_sec_offset)
+    .uleb128 3                          # Abbrev [3] DW_TAG_variable
+    .asciz "b"                          # DW_AT_name
+    .uleb128 1                          # DW_AT_location (DW_FORM_loclistx)
     .byte 0                             # End Of Children Mark
 .LCUEnd:
 
@@ -72,7 +91,10 @@
     .short 5                            # Version
     .byte 8                             # Address size
     .byte 0                             # Segment selector size
-    .long 0                             # Offset entry count
+    .long 2                             # Offset entry count
+.LLLBase:
+    .long .LLL0-.LLLBase
+    .long .LLL1-.LLLBase
 .LLL0:
     .byte 3                             # DW_LLE_startx_length
     .uleb128 1                          # Index
@@ -80,6 +102,14 @@
     .uleb128 1                          # Loc expr size
     .byte 85                            # DW_OP_reg5
     .byte 0                             # DW_LLE_end_of_list
+.LLL1:
+    .byte 3                             # DW_LLE_startx_length
+    .uleb128 5                          # Index
+    .uleb128 0x20                       # Length
+    .uleb128 2                          # Loc expr size
+    .byte 144                           # DW_OP_regx
+    .uleb128 5                          # RDI
+    .byte 0                             # DW_LLE_end_of_list
 .LLLEnd:
 
     .section .debug_cu_index, "", @progbits
Index: llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
===================================================================
--- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
+++ llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
@@ -538,6 +538,9 @@
                                  " list table with base = 0x%" PRIx64 "\n",
                                  Offset);
       Offset -= HeaderSize;
+      if (auto *IndexEntry = Header.getIndexEntry())
+        if (const auto *C = IndexEntry->getOffset(DW_SECT_LOCLISTS))
+          Offset += C->Offset;
       if (Error E = LoclistTableHeader->extract(Data, &Offset))
         return createStringError(errc::invalid_argument,
                                  "parsing a loclist table: " +


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77146.253887.patch
Type: text/x-patch
Size: 4349 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200331/671d82b3/attachment-0001.bin>


More information about the llvm-commits mailing list