From e0d2d7fb26a2dac464f6e245594176a2a7f1ccf7 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Fri, 18 Apr 2014 22:22:44 +0000 Subject: [PATCH] [llvm-symbolizer] Print file/line for a PC even if there is no DIE describing it. This is important for symbolizing executables with debug info in unavailable .dwo files. Even if all DIE entries are missing, we can still symbolize an address: function name can be fetched from symbol table, and file/line info can be fetched from line table. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206665 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/DWARFContext.cpp | 29 ++++++++++++------ .../DebugInfo/Inputs/llvm-symbolizer-dwo-test | Bin 0 -> 9579 bytes .../Inputs/llvm-symbolizer-dwo-test.cc | 18 +++++++++++ test/DebugInfo/llvm-symbolizer.test | 4 +++ 4 files changed, 42 insertions(+), 9 deletions(-) create mode 100755 test/DebugInfo/Inputs/llvm-symbolizer-dwo-test create mode 100644 test/DebugInfo/Inputs/llvm-symbolizer-dwo-test.cc diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp index 50ec4d3cb47..148d56800f8 100644 --- a/lib/DebugInfo/DWARFContext.cpp +++ b/lib/DebugInfo/DWARFContext.cpp @@ -545,18 +545,32 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address, DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address, DILineInfoSpecifier Specifier) { + DIInliningInfo InliningInfo; + DWARFCompileUnit *CU = getCompileUnitForAddress(Address); if (!CU) - return DIInliningInfo(); + return InliningInfo; + const DWARFLineTable *LineTable = nullptr; + const bool NeedsAbsoluteFilePath = + Specifier.needs(DILineInfoSpecifier::AbsoluteFilePath); const DWARFDebugInfoEntryInlinedChain &InlinedChain = CU->getInlinedChainForAddress(Address); - if (InlinedChain.DIEs.size() == 0) - return DIInliningInfo(); + if (InlinedChain.DIEs.size() == 0) { + // If there is no DIE for address (e.g. it is in unavailable .dwo file), + // try to at least get file/line info from symbol table. + if (Specifier.needs(DILineInfoSpecifier::FileLineInfo)) { + DILineInfo Frame; + LineTable = getLineTableForCompileUnit(CU); + if (getFileLineInfoForCompileUnit(CU, LineTable, Address, + NeedsAbsoluteFilePath, Frame)) { + InliningInfo.addFrame(Frame); + } + } + return InliningInfo; + } - DIInliningInfo InliningInfo; uint32_t CallFile = 0, CallLine = 0, CallColumn = 0; - const DWARFLineTable *LineTable = nullptr; for (uint32_t i = 0, n = InlinedChain.DIEs.size(); i != n; i++) { const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain.DIEs[i]; DILineInfo Frame; @@ -566,16 +580,13 @@ DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address, Frame.FunctionName = Name; } if (Specifier.needs(DILineInfoSpecifier::FileLineInfo)) { - const bool NeedsAbsoluteFilePath = - Specifier.needs(DILineInfoSpecifier::AbsoluteFilePath); if (i == 0) { // For the topmost frame, initialize the line table of this // compile unit and fetch file/line info from it. LineTable = getLineTableForCompileUnit(CU); // For the topmost routine, get file/line info from line table. getFileLineInfoForCompileUnit(CU, LineTable, Address, - NeedsAbsoluteFilePath, - Frame); + NeedsAbsoluteFilePath, Frame); } else { // Otherwise, use call file, call line and call column from // previous DIE in inlined chain. diff --git a/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test b/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test new file mode 100755 index 0000000000000000000000000000000000000000..c28c3d277a7c18b3c907438d41d9940206fb7b95 GIT binary patch literal 9579 zcmeHNU2GKB6~4P`!}909(BJ?K+pwr4smC@y&W1oU{)07LenOmzHX-Bn?%LjVy=(2x zf}x}Z8BkU(sUPw{e?+T_hrU#ziqs;dQjAFBK12~!S{120&b2W#@sc!Vz#=K)|ib3d@xiELd`eBq?68=&EYT&GRjl zr4T*|5RY=zYorRy7v^BMD&@w4)o$NRHC);g1UyzY_92=og&P#F79H91QZBy`ia_ZKy>5C%+ zcYgWqvuAckh|346U$`uSrERJfcwa`%SI}$~^dmxPw+X|bx{)!%Y10@E$CE$?hf_&~ z7-Czfr=!zYr>)aA!hv;RUC5I1G2tsnK|{`7J%_d#&% z>dfxmo~g;nYFz}U&bLT0B_O7!VEDxrWU7V@zyA)84j|6h> zO#c*Pg*@x_U9kF7NPZ4*O?=xtIJH%?|^i z$FH^L?)Btu2hZR0^yL0Jz2ZLn9skH&+4?uSexclFq1^4R+{f+trI&+a7cho5ve$#- zFZpq468^f-c+}q*Ld_Q%H~niv?*%8ZA+UbsSi$SXKDn>QbMla@Jk zU2b@BoyT##X7kybdhJQF|+n!B&x%jbI`&%op`&5W{f`k$Hkd}j2mjJndrjR5cjppbqhndUtAQp;FAld@M+UAtHA`@o zJ05W95{bnA;ik;N;r>)2ekhi1iXKQcnX!ziMd&RIWr3R`xEB80`{Kf^_ryZ)7WXoE zsmO&B(QFQnG)Maf=Pco>d~{neqxlP1o^^slIH&=@{X)x_X-f`q4cu6I zL}bSDYSSpj$QVe6hhxT26kOJX7BN%l3<6r>I}tR(XLvXs zLBJH;;G{|4mY@C%tRt!6;TT3ni^lr1gT_dZF zD=6x%sM`6aTbGTda_E;@@#N%pq3Jf(9FBj=txMxm3gG;C-R1R78sW4P2d%NpKj+q= z32{yVL8)2qj?{PN(=VLLH*wG!%zWX|p`j3n60k(!>>R(B(L!q|^LgD2C_djGIDfWd zNvj2|$*l9btSi1xMJ7M?{1q$?p+aNI{63X`pW<^rIli<1#~ggVuZ))A)4kHke+?Mr z#r@>_=!An06IqOQpE&q@-}kBx zsqI!amt$Q}Q27N8%Afc88t3WIaKBf4XMb5|`778GpReCa#piw3&E(8hn8(m>QL*#) zD*j#-|0)|Q$=8qJNmPihhRe1eZCUU*TUzn@vp$82oliS#RCcR@`#k=8u(k7Pca2J) z;yd$o>hHsry2|{}7lg`#kTEX7Ziv8z2{_fxl^&H0& z)yG67naA?FgYQ#(pGuJPWH-!XeFhc6xc@DR-|_|dpMp#MZ^2em=01JQx+dto;JfR~BDbc>gQ)vq<^uYjI!G?U1Z{u-Nf^%iib_^@8t5rFcW(K2wT6g!@LH9g=kqcE9<) zU~lx`ZJO8nQv6}T>v$=S)qvM$TZ0F0=e+LPV9bU`1h1#1xbs(OwR!|Sjn6Hf!herT z+dT3evJ@lDBOaX#N_FEE7%*rU3luDf9TlD zu*BzH$L~pe?sa?>IK}l<>8KUUX;fXd@u$40{2B-00d*aDJ$Vy2`I&I|sg%F<+|nR| zj{N^D{nv}Yd>yr7`2bZ{nR)n6;1u^_wO%wvjsEvkZk)-e9PX1HY!I6r`LqIem6_+8 zD%kIk_H*Ys{Uf^pc}}W4d0EW>_m!Fd-v?d?+&TY`OFwhhhjHNb?uP{ZQ`TNiNqakD z)qkh_JAZd?1NY4}7w-eFcQ=Z)j^FPU!bNdis#4sKfy@4?`LI;sw-rwRhNdF_=LR_s z15$^1r91pD0#1JTy+V?3YEbsh@p)9)^Y+P;im)2EkI6Rql(N6#$a9Ot%dF?k*-V-~ zdT1VuM4IungVDA@efoe+mS${$HEWvso6{Oen{h2ABH={B_C%}N?A4f*1xZM?@4$uyf5l*MW2aQ-VDvYjg z?QGxC(^=XgKdunQw$QGQ_K>k_>(=MHdyU@qj!-xCT7G{K$z%<=!$jLc*0&eJh{-)7 z3s> %t.input RUN: echo "%p/Inputs/macho-universal 0x1f84" >> %t.input RUN: echo "%p/Inputs/macho-universal:i386 0x1f67" >> %t.input RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %t.input +RUN: echo "%p/Inputs/llvm-symbolizer-dwo-test 0x400514" >> %t.input RUN: llvm-symbolizer --functions --inlining --demangle=false \ RUN: --default-arch=i386 < %t.input | FileCheck %s @@ -48,6 +49,9 @@ CHECK: main CHECK: _Z3inci CHECK: _Z3inci +CHECK: main +CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11 + RUN: echo "unexisting-file 0x1234" > %t.input2 RUN: llvm-symbolizer < %t.input2 -- 2.34.1