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(); } 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,"",@progbits + .long .LAddr0end-.LAddr0version # Length +.LAddr0version: + .short 5 # Version + .byte 8 # Address size + .byte 0 # Segment selector size +.LAddr0table: + .quad .Lfoo +.LAddr0end: