From cd6834c109a8d99666ab4471b6f275bd32e09766 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Tue, 15 Oct 2019 23:43:37 +0000 Subject: [PATCH] [dsymutil] Support and relocate base address selection entries for debug_loc Since r374600 clang emits base address selection entries. Currently dsymutil does not support these entries and incorrectly interprets them as location list entries. This patch adds support for base address selection entries in dsymutil and makes sure they are relocated correctly. Thanks to Dave for coming up with the test case! Differential revision: https://reviews.llvm.org/D69005 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374957 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Inputs/private/tmp/baseaddr/loc1.o | Bin 0 -> 2852 bytes .../Inputs/private/tmp/baseaddr/loc1.x86_64 | Bin 0 -> 4664 bytes .../dsymutil/X86/debug-loc-base-addr.test | 29 ++++++++++++++++++ tools/dsymutil/DwarfStreamer.cpp | 12 ++++++++ 4 files changed, 41 insertions(+) create mode 100644 test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o create mode 100755 test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.x86_64 create mode 100644 test/tools/dsymutil/X86/debug-loc-base-addr.test diff --git a/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o b/test/tools/dsymutil/Inputs/private/tmp/baseaddr/loc1.o new file mode 100644 index 0000000000000000000000000000000000000000..f92ea7b2f82bd5b35f09eaebe7f3aa5445544577 GIT binary patch literal 2852 zcmb7GO>7%Q6n<-a?GPunLy?jQq%KmB0;v8=fTT!}h_ry^E6 z(+VjORHcSAaUV<#HAA45S0k;&A!<3f@DCghg3kEq&w!YAG5-(RI(-_I%s- zS5K|49{SRnW`p>Sd^QHV5<^>(f5r7vH@Fhz>t{QhJ#FB|gA zC+Sg#_zc&rTe@R3D7~Kb{>5l{qzVJ_HA^*7;BbBx7jcRc`f@-%k)LarVZJLNz8?nU z^Uk|{*L#ckUgZ4l+?UU6HZU(w-*V2`PFdGqS>mZe{mp#uaB%Jc{~UjJ&+}|m^-2q? z;ZM-@qxW~655-mHyT*L%LK2`VZPN1o)@?^HhWGCe<~zfarZF#)pHcG}I&xm9ZW#ik zeIN}^VEYwaTIvWUKt3vX9b321IB!RHcp!Ui`O5Df#h%&NPaof<3FL3=SF-8j7sY(? z3%57+%{pE*tz)&?cGJ-c`7Hiv(^b!N+b46mP1~z(m9ki}T)p1$yAy7!S+h(}E0psy z`O1trH(!{4dS>1*pDLE-=8TGIRb~pahBaR)n#EbG^f=(-RmhsI3puxCcMQ+Uc?~yL zGTN3=F1Mgk0R8P^rC{68Fl+~G#{(N`a2~dy1zS$ps=xt@NFF;bgLum+7KO3s4Srhy zYb*qVu^Vg$Y5*qnzLUaVQhJI9%9!$4>X;f$WyT*){kAhXrmT(QW0J-AgYkul3zJSN znmU<$Hu=)A=O=L-*PudVLdI~3vk)0Sbk$inbmCc%G&0B}i7A9VmrT-u`Uac7QA6Tv zJ_>wGzzMd)H-a-uTc@1;0DC$oit;t~QDyB~m$Q03a0K}txlsbf&S3W$xe?*+p!qqu zF>=)}$W+OMxJEq+Jr~N^kEtJ_k;Et1sj|8dlv2Ym$+WL}`{g$lmuZpm(u^>KVhZ@b zVq{bKe@VPn+dKCb)ON1FyM!_Ny)R>YYK*8jy2 z*F%EMUkl|P1r_T^6$QxeUQW)UrhOtTZQ2yJknk0dnFXWbEkcif)_cY^M)EV>GcHq8 zF06pEol!C)iJ_~Aq7)v%cKI$X`rtrbL0C*>E=67#mH$Q%ZV8*qI2rGUt0Qimahwl? zai_7Q{9kV9k{TU;ITFKZLHXk={`|N& zo48ejTELu!N1;s*w6m2VJO%SXH3;qbED79z{Qb>pV*wBUiBH7dyL2}ST zL7^x0n3LeG-qe$ji#NglLFmPcM-Srn&F<1{jnJEyeeh=HdvE5wH{a~#?blyFejgSw zq9VPBh#Z6NV)0y3Sc#m0=AlY0-nf%n$vwDFYfy|J9Elib7pl}!?$J_ki$0$S+Qh?$ zV5YJ*ic*fX;kauT2jgwWaTz$Kye-7Bz3l|OVW?EM@z`!ul-;N{;n-i_2QMBupb-1D zxR&6!$Jf32g}b@i^Zs3NpTIr6`^|d6=+k~L+&R3*dL0-wU%KQ8hH z^HJKM6u7jKkCV{he1HcMejh35IMnQR+GfoznU&321(IY%sUIE&!x`5=V9#Cf_ffqb{wmo zzL`c{cF8?`9uwo|F^plJ_AvPhC1fCEAY>q9AY>q9AY>q9AY>q9AY|ZwFtD88`u;L@ zwJ?Y$d(2N<7*x~oTY@utBKEvjFjGHz{S(*hwZ_paCEP9y2n$1@ zzm6zL)QfgQZb_uRrmPLC+;uFqW)&+|TV__WRY~h^E0VEoxt3j*xu|R>5wXum+Vne*gf6p9%l~ literal 0 HcmV?d00001 diff --git a/test/tools/dsymutil/X86/debug-loc-base-addr.test b/test/tools/dsymutil/X86/debug-loc-base-addr.test new file mode 100644 index 00000000000..de5f30fce17 --- /dev/null +++ b/test/tools/dsymutil/X86/debug-loc-base-addr.test @@ -0,0 +1,29 @@ +RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/baseaddr/loc1.x86_64 -f -o - | llvm-dwarfdump -debug-loc - | FileCheck %s + +The test was compiled from a single source: +$ cat loc1.cpp +int f1(int i, int j) { + int x = 5; + int y = 3; + int r = i + j; + int undef; + x = undef; + y = 4; + return r; +} +__attribute__((nodebug)) void f2() { +} +int main() { + return 0; +} + +CHECK: .debug_loc contents: +CHECK: [0xffffffffffffffff, 0x0000000100000f90): +CHECK: [0x0000000000000004, 0x0000000000000007): DW_OP_consts +3, DW_OP_stack_value +CHECK: [0x0000000000000007, 0x0000000000000009): DW_OP_consts +4, DW_OP_stack_value + +CHECK: [0xffffffffffffffff, 0x0000000100000f90): +CHECK: [0x0000000000000004, 0x0000000000000007): DW_OP_consts +5, DW_OP_stack_value + +CHECK: [0xffffffffffffffff, 0x0000000100000f90): +CHECK: [0x0000000000000007, 0x0000000000000009): DW_OP_reg0 RAX diff --git a/tools/dsymutil/DwarfStreamer.cpp b/tools/dsymutil/DwarfStreamer.cpp index 732260f0346..88ca4b34a3e 100644 --- a/tools/dsymutil/DwarfStreamer.cpp +++ b/tools/dsymutil/DwarfStreamer.cpp @@ -399,6 +399,9 @@ void DwarfStreamer::emitLocationsForUnit( MS->SwitchSection(MC->getObjectFileInfo()->getDwarfLocSection()); unsigned AddressSize = Unit.getOrigUnit().getAddressByteSize(); + uint64_t BaseAddressMarker = (AddressSize == 8) + ? std::numeric_limits::max() + : std::numeric_limits::max(); const DWARFSection &InputSec = Dwarf.getDWARFObj().getLocSection(); DataExtractor Data(InputSec.Data, Dwarf.isLittleEndian(), AddressSize); DWARFUnit &OrigUnit = Unit.getOrigUnit(); @@ -418,11 +421,20 @@ void DwarfStreamer::emitLocationsForUnit( uint64_t Low = Data.getUnsigned(&Offset, AddressSize); uint64_t High = Data.getUnsigned(&Offset, AddressSize); LocSectionSize += 2 * AddressSize; + // End of list entry. if (Low == 0 && High == 0) { Asm->OutStreamer->EmitIntValue(0, AddressSize); Asm->OutStreamer->EmitIntValue(0, AddressSize); break; } + // Base address selection entry. + if (Low == BaseAddressMarker) { + Asm->OutStreamer->EmitIntValue(BaseAddressMarker, AddressSize); + Asm->OutStreamer->EmitIntValue(High + Attr.second, AddressSize); + LocPcOffset = 0; + continue; + } + // Location list entry. Asm->OutStreamer->EmitIntValue(Low + LocPcOffset, AddressSize); Asm->OutStreamer->EmitIntValue(High + LocPcOffset, AddressSize); uint64_t Length = Data.getU16(&Offset); -- 2.40.0