[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