From b50f7b927b2ae99543c747a480b03969f0e73c87 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 16 Dec 2016 16:31:10 +0000 Subject: [PATCH] dwarfdump: Support/process relocations on a CU's abbrev_off Input can be produced by ld -r, for example (a normal LLVM workflow never hits this - LLVM only ever produces a single abbrev table in an object (shared by multiple CUs), so the reloc's always 0, and when it's linked together the relocation's resolved so it doesn't need to be handled) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289954 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/DWARF/DWARFUnit.cpp | 3 +++ test/DebugInfo/Inputs/dwarfdump-abbrev-off.elf-x86-64 | Bin 0 -> 2720 bytes test/DebugInfo/dwarfdump-abbrev-off.test | 8 ++++++++ 3 files changed, 11 insertions(+) create mode 100644 test/DebugInfo/Inputs/dwarfdump-abbrev-off.elf-x86-64 create mode 100644 test/DebugInfo/dwarfdump-abbrev-off.test diff --git a/lib/DebugInfo/DWARF/DWARFUnit.cpp b/lib/DebugInfo/DWARF/DWARFUnit.cpp index 2ddbc507ff6..8e5691aebab 100644 --- a/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -87,7 +87,10 @@ bool DWARFUnit::getStringOffsetSectionItem(uint32_t Index, bool DWARFUnit::extractImpl(DataExtractor debug_info, uint32_t *offset_ptr) { Length = debug_info.getU32(offset_ptr); Version = debug_info.getU16(offset_ptr); + auto AI = InfoSection.Relocs.find(*offset_ptr); uint64_t AbbrOffset = debug_info.getU32(offset_ptr); + if (AI != InfoSection.Relocs.end()) + AbbrOffset += AI->second.second; if (IndexEntry) { if (AbbrOffset) return false; diff --git a/test/DebugInfo/Inputs/dwarfdump-abbrev-off.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-abbrev-off.elf-x86-64 new file mode 100644 index 0000000000000000000000000000000000000000..bc196b5995bc5ef9534950e10f6dc290ab882fb8 GIT binary patch literal 2720 zcmb_e&1(};5T8x@Wj|s+{HRtXph6Ygt+8P1S5wqlv4{v&QKW9tZ5z7Tgxxf>MNkon z9t831LGhqhkKPn7{s{%Wde^fDo!OmfUS2mA#7Fkc%x~uRX5PoX&4Y_m6A8lrX$G8w znk6W}tLB=X4b?2{fIgU>eER+FXFxq_#_Dx2mb;CC&epc)IM67mv_-FT{dEpfgp z)X~hlwl|-yI(|?ndFf$u$Q()!R{SMzF`XG19T^=uk{)#3YSB`#<43?Y^W`#FOM!2> zrM&H0^QF?f>sSk=qGRP;yRcYrtXZdO1$p1DnfM z3>ZCdIMvsjOm*)bNMTh*k5RLGj9#oZVFD@HelL|wo$5HPz4j;dG2&sV?lp;jm8poeZ6{Gn<{!>Yxi?+eTqV zv(bJfk-+fKA^X>kRx(7Qu9J1bH@K+xYB=Smwkr}q@yZbk7nWQy&RLE-#8UEhvwc*- z)x1L*US)e&!71;4wnr44#*w^d7^m4sD-Z#f8{jt?m-_FseMiF|v%M2#RQCncXf}8( zm8PyY9jOECOS2@dTGs^Qdc6$Cie%jgwUA`p4y(AjV=6Ay)-ckN;cnJrR9_SP{9TU% zv^K!I5bss$+{hH&2z4(un6pl9X@17e<$R|KX2n^qfSE59i;jni@3=Ncl$UazU33Cr z_;@MRtf1nHqiE*~-dw4U906Xb;+U7NP9F;@c7Cxgz%6(V1J1(CoR67gJiNTX3>Gj$ z#m=E7a-~T2e`wor3|ixjb>cCzEOlJoCw9XNRFGee&ZeLMldQ`7BAzx;SdOEl{PG@( z`ynf90pF(*Z&O%>iZ{rk&hbW|H=Wk(62V(2}buF-B(!wSdMVv*O<_QIGsf~Km8nc z5T!mQxt{Pxhdy#@(_`tLjLZLy`I3k7)3-~{|EvN3V+^0Br1R4bB&UX>h z=Y$aaU_R-8Yah_5pAm`|{yLNC`%Jm@{O=KqOZ9~&g-!nVMb_q8-=ZUq|Bd;dgve5# F>mR?$y{Z5J literal 0 HcmV?d00001 diff --git a/test/DebugInfo/dwarfdump-abbrev-off.test b/test/DebugInfo/dwarfdump-abbrev-off.test new file mode 100644 index 00000000000..2937d8cbdde --- /dev/null +++ b/test/DebugInfo/dwarfdump-abbrev-off.test @@ -0,0 +1,8 @@ +RUN: llvm-dwarfdump -debug-dump=info %p/Inputs/dwarfdump-abbrev-off.elf-x86-64 | FileCheck %s + +Check that we apply relocations to the abbr_offset - while LLVM never produces +an object file like this, a reproduction can be produced by linking two simple +object files together with ld -r. + +CHECK: abbr_offset = 0x0000 +CHECK: abbr_offset = 0x0010 -- 2.11.0