[DebugInfo] Fix reading location tables headers of v5 units in DWP.
authorIgor Kudrin <ikudrin@accesssoftek.com>
Fri, 20 Mar 2020 16:33:19 +0000 (23:33 +0700)
committerIgor Kudrin <ikudrin@accesssoftek.com>
Mon, 6 Apr 2020 06:28:06 +0000 (13:28 +0700)
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.

Differential revision: https://reviews.llvm.org/D77146

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

index 43fc8f7..356bed5 100644 (file)
@@ -538,6 +538,9 @@ Error DWARFUnit::tryExtractDIEsIfNeeded(bool CUDieOnly) {
                                  " list table with base = 0x%" PRIx64 "\n",
                                  Offset);
       Offset -= HeaderSize;
+      if (auto *IndexEntry = Header.getIndexEntry())
+        if (const auto *Contrib = IndexEntry->getContribution(DW_SECT_LOCLISTS))
+          Offset += Contrib->Offset;
       if (Error E = LoclistTableHeader->extract(Data, &Offset))
         return createStringError(errc::invalid_argument,
                                  "parsing a loclist table: " +
index 27b9a3b..9bc6639 100644 (file)
 # 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:
     .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:
 
     .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:
 
     .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
     .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