[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
Fri Apr 3 08:02:44 PDT 2020
ikudrin updated this revision to Diff 254805.
ikudrin added a comment.
- Rebase to the tip.
- `const auto *Contrib` -> `auto *Contrib`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77146/new/
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 (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: " +
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77146.254805.patch
Type: text/x-patch
Size: 4361 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200403/799ae9a6/attachment.bin>
More information about the llvm-commits
mailing list