[PATCH] D74404: [DebugInfo] Fix reading addresses in DWARFDebugAddr.

Igor Kudrin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 11 06:29:56 PST 2020


ikudrin created this revision.
ikudrin added reviewers: jhenderson, dblaikie, probinson, aprantl.
ikudrin added projects: LLVM, debug-info.
Herald added a subscriber: hiraditya.

As addresses in the address tables may have relocations, thus, the relocations should be resolved to read the correct address. That is especially important for targets that use RELA relocations because in that case addends are stored in relocation sections.

Thanks, @jhenderson for spotting this!


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D74404

Files:
  llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp
  llvm/test/tools/llvm-dwarfdump/X86/debug_addr_rela.s


Index: llvm/test/tools/llvm-dwarfdump/X86/debug_addr_rela.s
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-dwarfdump/X86/debug_addr_rela.s
@@ -0,0 +1,44 @@
+# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o
+# RUN: obj2yaml %t.o | FileCheck %s --check-prefix=YAML
+# RUN: llvm-dwarfdump -debug-addr %t.o | FileCheck %s
+
+## This checks that we use DWARFDataExtractor::getRelocatedAddress() to read
+## addresses of an address table. The raw data in the .debug_addr section does
+## not contain the full address, thus, it is required to resolve a RELA
+## relocation to recover the real value.
+
+# YAML:      - Name:            .debug_addr
+# YAML-NEXT:   Type:
+# YAML-NEXT:   AddressAlign:
+# YAML-NEXT:   Content:         0C000000050008000000000000000000
+# YAML:      - Name:            .rela.debug_addr
+# YAML-NEXT:   Type:            SHT_RELA
+# YAML-NEXT:   Link:
+# YAML-NEXT:   AddressAlign:
+# YAML-NEXT:   EntSize:
+# YAML-NEXT:   Info:            .debug_addr
+# YAML-NEXT:   Relocations:
+# YAML-NEXT:     - Offset:          0x0000000000000008
+# YAML-NEXT:       Symbol:          .text
+# YAML-NEXT:       Type:            R_X86_64_64
+# YAML-NEXT:       Addend:          42
+
+# CHECK:      .debug_addr contents
+# CHECK-NEXT: length = 0x0000000c, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+# CHECK-NEXT: Addrs: [
+# CHECK-NEXT: 0x000000000000002a
+# CHECK-NEXT: ]
+
+    .text
+    .space  0x2a
+.Lfoo:
+
+    .section .debug_addr,"", at progbits
+    .long   .LAddr0end-.LAddr0version   # Length
+.LAddr0version:
+    .short  5                           # Version
+    .byte   8                           # Address size
+    .byte   0                           # Segment selector size
+.LAddr0table:
+    .quad   .Lfoo
+.LAddr0end:
Index: llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp
===================================================================
--- llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp
+++ llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp
@@ -131,10 +131,7 @@
   Data.setAddressSize(HeaderData.AddrSize);
   uint32_t AddrCount = DataSize / HeaderData.AddrSize;
   for (uint32_t I = 0; I < AddrCount; ++I)
-    if (HeaderData.AddrSize == 4)
-      Addrs.push_back(Data.getU32(OffsetPtr));
-    else
-      Addrs.push_back(Data.getU64(OffsetPtr));
+    Addrs.push_back(Data.getRelocatedAddress(OffsetPtr));
   return Error::success();
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74404.243847.patch
Type: text/x-patch
Size: 2445 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200211/4a3868e2/attachment-0001.bin>


More information about the llvm-commits mailing list