From 61dba579befdd5c3ed1bd60a61e6ded9716a1449 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 2 Aug 2017 20:16:22 +0000 Subject: [PATCH] DebugInfo: Test & handle (differently) non-zero DW_AT_ranges_base Followup to r309570, fixing it slightly differently (ranges_base and addr_base should never be read from a DWO file - so there shouldn't be any issue with 'overriding' the values - conditionalize the code and assert that the values aren't being overriden). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309879 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/DWARF/DWARFUnit.h | 2 +- lib/DebugInfo/DWARF/DWARFUnit.cpp | 13 ++++++----- test/DebugInfo/Inputs/split-dwarf-dwp.cpp | 24 ++++++++++++++------ test/DebugInfo/Inputs/split-dwarf-dwp.o | Bin 2744 -> 4474 bytes test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp | Bin 1256 -> 1600 bytes test/DebugInfo/llvm-symbolizer.test | 6 ++--- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/include/llvm/DebugInfo/DWARF/DWARFUnit.h index b4e3f008f31..c39fc4c9744 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -123,7 +123,7 @@ class DWARFUnit { const DWARFSection &StringOffsetSection; uint64_t StringOffsetSectionBase = 0; const DWARFSection *AddrOffsetSection; - uint32_t AddrOffsetSectionBase; + uint32_t AddrOffsetSectionBase = 0; bool isLittleEndian; bool isDWO; const DWARFUnitSectionBase &UnitSection; diff --git a/lib/DebugInfo/DWARF/DWARFUnit.cpp b/lib/DebugInfo/DWARF/DWARFUnit.cpp index 0a12fb2ecaa..5b0b3f65f6c 100644 --- a/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -245,12 +245,13 @@ size_t DWARFUnit::extractDIEsIfNeeded(bool CUDieOnly) { auto BaseAddr = toAddress(UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc})); if (BaseAddr) setBaseAddress(*BaseAddr); - Optional AddrBase = UnitDie.find(DW_AT_GNU_addr_base); - if (AddrBase) - AddrOffsetSectionBase = *toSectionOffset(AddrBase); - Optional RngListsBase = UnitDie.find(DW_AT_rnglists_base); - if (RngListsBase) - RangeSectionBase = *toSectionOffset(RngListsBase); + if (!isDWO) { + assert(AddrOffsetSectionBase == 0); + assert(RangeSectionBase == 0); + AddrOffsetSectionBase = + toSectionOffset(UnitDie.find(DW_AT_GNU_addr_base), 0); + RangeSectionBase = toSectionOffset(UnitDie.find(DW_AT_rnglists_base), 0); + } // In general, we derive the offset of the unit's contibution to the // debug_str_offsets{.dwo} section from the unit DIE's diff --git a/test/DebugInfo/Inputs/split-dwarf-dwp.cpp b/test/DebugInfo/Inputs/split-dwarf-dwp.cpp index b07a1537d6b..ced32e41008 100644 --- a/test/DebugInfo/Inputs/split-dwarf-dwp.cpp +++ b/test/DebugInfo/Inputs/split-dwarf-dwp.cpp @@ -1,12 +1,22 @@ -void f1(); -__attribute__((always_inline)) void f2() { +__attribute__((optnone)) void f1() {} +inline __attribute__((always_inline)) void f2() { f1(); } -void f3() { +// throw a gap in the address range to force use of DW_AT_ranges, ranges_base, +// range contribution in the .dwo file, etc. +__attribute__((nodebug)) void gap() { +} +int main() { f2(); } -To produce split-dwarf-dwp.o{,dwp}, run: - - $ clang++ split-dwarf-dwp.cpp -gsplit-dwarf -c -Xclang -fdebug-compilation-dir=Output -fno-split-dwarf-inlining - $ llvm-dwp split-dwarf-dwp.dwo -o split-dwarf-dwp.o.dwp +// To produce split-dwarf-dwp.o{,dwp}, Create another file that has ranges, so +// the ranges_base of the CU for split-dwarf-dwp.cpp is non-zero. +// +// $ cat > other.cpp +// void other1() {} +// __attribute__((nodebug)) void other2() {} +// void other3() {} +// $ clang++ other.cpp split-dwarf-dwp.cpp -gsplit-dwarf -c -Xclang -fdebug-compilation-dir -Xclang Output -fno-split-dwarf-inlining +// $ llvm-dwp other.dwo other.dwo split-dwarf-dwp.dwo -o test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp +// $ ld -r other.o split-dwarf-dwp.o -o test/DebugInfo/Inputs/split-dwarf-dwp.o diff --git a/test/DebugInfo/Inputs/split-dwarf-dwp.o b/test/DebugInfo/Inputs/split-dwarf-dwp.o index 614c62040dec63fc13b815d42ca1ea408e9cbcfa..2bf4fe3e494f042e30490666b7a58e58a7dc3c98 100644 GIT binary patch literal 4474 zcmd5uy;X7!KK_nI?}dH$=bfFM ziR-JkDC0vqt5Vj*Gs@b^SR)5|`?jgULxexZzWXqq7|gtznj3%)-wZGk(}$R|+OyjS z_`j?-fC8~TVX8vKt*zTFFKCqOHGA3_cgF3}Flg2`?WytO)6dKtwMQ$JRyEtfW{w^G z*Kto$$&@ZUPS;22R}VM5U_u=hbxM0-c6d*bRdvfX9Z-tMrAbYEny&k_*4K4zygPG? z-@VuSm3GB0d+~p{G4|(6TR(jhqiWR}Qkmhavx6gpU(EJin;jmqmWRo)2Ruivl(Ipv z{u&&ht3KP*nH5dcDfm8lN%lw6BhBi`^e^RNjJo#Oer$~GH8 zwo)&+mF#-GzFzUN8}+J}%~#y=X4%UYy;fGAgho)6L)Og<9>{dya^E5>ssAPYa_pQ7^p7KD_WwTTlyxRk%jI-5 z?zMl?$A?4{J&K5~KXN=zqwO-epY0KUo8$3%i;Efm2|1JIe<@-92Z?LW|0ZE(PSmqF z={XoNF}YupFRA`ju790lvHnB!Gwa_b%*=@pmy?ddh>6MlfqY5zeY~?swxU75upT7c ztdE{}shJrKS2*c!UFhy!(T};u2)WDkN7;%07)kTrPk2)O49FyJL__;(&fjJa%EW!o z8hD27R}I`|d)vU}e)!bDb8LTW;7e@Fd!(Oi(czNkfZ&o}IKX>BWZ}n;0xo+7SBCw- zv34TzKU;8&5L;iB&cjDiBXVDXC$-?1*4~JZez0#4Sx@lM5B~B%a{3za(T~KRH1Gws zWu1@*{m6V?i}BHqtj`$Z*xUI2eqi9jkFTfbpvwCab%6^XK8TrL)?9GOCH)F+>*!8? z!H+O5bp#iChW&!ey5$UfiS5${ZvHQkJWOk!8NqFKnEgvXvOdC>x)LY&St;-jW4ddn zI>dD1lLGgD(i04L>?668hH%-97)WZmJ!=!kuJ4w#ej_H~@jIpCPwNkXjxAbR;mxvJ z()x*)gyTuvEm+@u>W`gnG#w-UmRehxEKOjDkSVBB>#pC5zMlmr F%HQ4&Q9A$t literal 2744 zcmbtV&1(};5TDJqrmbyEYrmv|3yQR2W7<%x7mf8RV9_GIArgv}sa& zZw0R&Ja|;GcoanN>fhi^@TlhsIV2dBK5dB6F3^WHSOb!G8t%rJn-fb$UT z7zLQ`j`VDxW?>XYU^(~v`w!aR{nDsc%Kmh5!}dzZ>#5>K4Q@95deaAE5Rzl>7ZMYR zorU;^g|R_n=m5r?#??i^(6guJ@axuY95%KBlVAts4eLiyi3OW9@*}uPvv7<=CP1N3 zvE5ax<#>&9&9&xI=~UX9^u4CLZe`M$xpSE*YqC;lRnJJ+>=echhw)%MyamQ)(wOLv z_iW=KsUj_+;7At}$!D=k1Jn*t4p$6LAvcWO!~pW(axu~X^@0lZI)woAhCQG*+HLmb zx{W)r7)A!ReHarmy9O#O1nrkVKCZAnh9}f7pW%n zL>oyn!<&_mP&Hwo10%qM#6I|;4txZWWCt3)>5z19?QzpR+RE+O(o73TWLjY|zA1W1 zI?eAtA@N-FAr_8$=-(d-AY8s3J{#fkYwQho2CkBU(k$E!AV@9h)+j*=iHL(%4Hd=)La{(p-8`TnSX z`n6X3e~Orz6CwCS49N<3#8ltMXwucU2t?vJqxv+hf7Twr9MAXi88O{amjt+oc9~S) zk7(4@U((d4ud-U7@~OR3y;q{p6Cvq4L*Fwso@Ppn8fp<)0z4i;fu^3H&ZLW96X*Z> GkNCeP(yvbd diff --git a/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp b/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp index 16a0af8c062f3c5c18997352081cefe736489fad..20eff18217faacd7f5f4823ae406d48c551fd133 100644 GIT binary patch literal 1600 zcmbtTOKTHR6h3$IXl+oa-BeH*w1sxj$)i|ng)!D=w7M)-(2&PWJDARd%p|QFt#MOa z`4jvDf`TA!iru&nm+oEpCv@X?X6{YmRS@yOckVgg`OcZios%b5*RB~tkTO9w4Ku|O zeMk-CavYXv0!j;UI?l%hi8L9`x65}v?~lDVC<|Jwr_w?gB8f9uk)j)V$JfJ!@3(iq z9HF z4T|4b{5Xbt{f!8sEvI8OcLHj(YW}9#b2_0H_~w#TunOi})am*U&Bem`rE|;k=3J}Q z+s+TU<+JmY3~035RK2$pC&gYu76;6tWELrGx4dYfxl`-7@a_1)krPJwD^9(;S@GQ< zU-8@BD9r21-wrRz1Jz?2^oD^?JwY#rGBA57O)pwT&QE3<<=PL6@swfr@8j>WuL zY%gO!bh>r}C7omS14*79w#JdJT>;BnLDTI?;U|q({pvg;`!yNeG!mw)6;z+1IoCO^ eJ(vA2lu(|!b`QLi{-QMH_n#i=KsF1Q&%wyR$il!RvZU-cJ41Or6Eh1V6C*PN zH&Bu>jFpX%l|>T7WCamy3={WC)aNzXF*n&+aa(iSODX`>G3zl3HrffXIY=PO0L_S&C3oX8hBRZK`3wvq zK %t.input +RUN: echo "%T/split-dwarf-dwp-different-name.o 0x54" > %t.input RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \ RUN: --default-arch=i386 --dwp=%p/Inputs/split-dwarf-dwp.o.dwp < %t.input | FileCheck --check-prefix=DWP %s @@ -158,8 +158,8 @@ CHECK-NEXT: split-dwarf-addr-object-relocation.cpp:6:0 DWP: f2 DWP-NEXT: split-dwarf-dwp.cpp:3:3 -DWP-NEXT: f3 -DWP-NEXT: split-dwarf-dwp.cpp:6:0 +DWP-NEXT: main +DWP-NEXT: split-dwarf-dwp.cpp:10:0 RUN: echo "unexisting-file 0x1234" > %t.input2 RUN: llvm-symbolizer < %t.input2 2>&1 | FileCheck %s --check-prefix=MISSING-FILE -- 2.40.0