From aa537da89f0b51e2a6c1b317da0b11fcedd5025e Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 1 May 2018 18:08:45 +0000 Subject: [PATCH] llvm-symbolizer: Handle function definitions nested within other functions LLVM always puts function definition DIEs at the top level, but under some circumstances GCC does not (at least in this case with member functions of a function-local type). To ensure that doesn't appear as though the local type's member function is unduly inlined within the outer function - ensure the inline discovery DIE parent walk stops at the first DW_TAG_subprogram. llvm-svn: 331291 --- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 8 ++++++-- ...llvm-symbolizer-local-mem-func-gcc.elf-x86-64 | Bin 0 -> 9416 bytes llvm/test/DebugInfo/llvm-symbolizer.test | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100755 llvm/test/DebugInfo/Inputs/llvm-symbolizer-local-mem-func-gcc.elf-x86-64 diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index 884d3bbca59d..d54275d302f3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -415,11 +415,15 @@ DWARFUnit::getInlinedChainForAddress(uint64_t Address, DWARFDie SubroutineDIE = (DWO ? DWO.get() : this)->getSubroutineForAddress(Address); - while (SubroutineDIE) { - if (SubroutineDIE.isSubroutineDIE()) + if (!SubroutineDIE) + return; + + while (!SubroutineDIE.isSubprogramDIE()) { + if (SubroutineDIE.getTag() == DW_TAG_inlined_subroutine) InlinedChain.push_back(SubroutineDIE); SubroutineDIE = SubroutineDIE.getParent(); } + InlinedChain.push_back(SubroutineDIE); } const DWARFUnitIndex &llvm::getDWARFUnitIndex(DWARFContext &Context, diff --git a/llvm/test/DebugInfo/Inputs/llvm-symbolizer-local-mem-func-gcc.elf-x86-64 b/llvm/test/DebugInfo/Inputs/llvm-symbolizer-local-mem-func-gcc.elf-x86-64 new file mode 100755 index 0000000000000000000000000000000000000000..39be2996d451aea55029bbd91d3357d3f6e1a135 GIT binary patch literal 9416 zcmeHNU2GiH6~41;#~U_YZ(^r02_*{zlr(r8ha?126R-a=jy48@la>}U8t;zRTlOc~ zoed5`YSaLd1EG=H(omuP36+Pwv=y!LfJBfHQq>obs0yN$+={3Mh1Qf1rA5j1J9q9` z&yL5a>O=dIEA5hZ|djw(eW|z{Z7{(2%0?;RRi^Q*jsyvL2zNcUkFOR(cHQRA3CbebhGkjVXJ6I0zmUh9pbnzVl9o>aUa20GM*g zf+6eO4?U%#Bt9R+75kv_w_Lw;s`weI=8EooZerJt?tG>zpDR|UyQX*V>e{tKuaxxd zvfX5#WcQ68lAgF96Tm3u4*X~i5dVjRbB9a69r?}S@1>5vblWfAZg2T`AL;TB)&IDV z-$a1)Q=qL0pl<{%5kTLw4E<5iZw`;~(aPr@gDI0( z%4@;O6~(^PNdJJjUEi+nlu^6G8A9J`q5uldgX;R+N+CkxjA|RN3!cw$HMthl{Ac=` zYB46_38~3+#@}gk>7-8M$z{$%S5r)~<~?+pA6ynZbe{9XyX>KR_XXp`g^2NV^QYG( zgz@A#CscdWIPrR9R@8Q`i6%tt)((8zHuj1a zHJ?P-#;MkJ33~qp!P?rNLFZ!I#zErr{u#(2<5csz#>{!=dbmDGC|tLW*XAbm zwvA6n7vrG4?tXx!gGagnnmUe`;0C3!eGQ%fF7qOWd!u0?i57r_TcW-g7){64kiyc~8P`fUf|i05gDx5&zqO` zG;&<*UBBl`cWjc|2@aqHLCVqb`{_RkItn=CMP%Lq(sXw;)nPwxl?Wq+;Z1;(l z1F^nxYaqiy*g7oQD>|a7d9p`nT03N($L}U3$8%D9fv77cOC<<}T4?HNVfMuXuOX^PXGK{|9{E62>7#Rd7P`;_YZ#2p`*Y}G?`U=7ON+Z2R z@Oo{eM+C3)M*7P7{?SOkuD(w;(xYNQ?Kh2d?5@1wc^F~QTF=XQ$moSwecx@Qw~2FV zEi}^O_54yJeYJ@5dhjs9$ei##?jgf(yWsu1k=}uPS;9+_^{`kgI3M6;hQ$|*S;^Ug1LFZ-&&d&>=YXS2lBpbeF$vmWV4Q2fN^Y%8-HN5iu^YdlU z6JqIn>jr%d`t28L9r1Q^R?#_6zE#F8#9nDfAs%p-lwZ0|M z-agJOBmXPV;{ok@74(~zx)tw{{m{Dlyke2RDmvc>n0^s->YqN#i>qC>S?i6*b!Q_D1=Gj^oR7&QQRm@Og zeX$YLbfGRjra4imuw9#+xHlT1SB@1NYXZ}h;yfi2EVPv8yLP{^0Jybr{y z&-ZeMGKcR`V4UGepMJfgRKOfBn_!&bcYOMMuVDC7-+-}Sw)ebGpYt#bIe)?O{`UV! z>GR)6`Q5oNJ)K7D?NFf@Ga=YC`TS5cumH0M+J-p7B} z_RBNQknX8%9({h-ET|*`%RxjI#u@$rRGNG2pYNCae*<$Wex9GK$K&`cbV-Eu`JMC* z1%KK-(8(bpX2oFGyZo}$QH-X?~=_*k^Qi| zZ#cz8Fo?E|1r%g`-anbm`V6mt!F84)IH>&l?fPX`f#9c+zN7SiOo*rWWjmMA?^x|B zeaoXuRlmObF7XKgeNO39{>xkZ`rDO%e>>-t{)|@{b=LPnUb|k=BWgpKRueY?CY_Z$ ko;8%pm=!dZPFG6nv=oHw){ZWdHyG literal 0 HcmV?d00001 diff --git a/llvm/test/DebugInfo/llvm-symbolizer.test b/llvm/test/DebugInfo/llvm-symbolizer.test index 1fcc61cbdf97..a6a15491c205 100644 --- a/llvm/test/DebugInfo/llvm-symbolizer.test +++ b/llvm/test/DebugInfo/llvm-symbolizer.test @@ -20,6 +20,7 @@ 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: echo "%p/Inputs/llvm-symbolizer-local-mem-func-gcc.elf-x86-64 0x61a" >> %t.input RUN: echo "%p/Inputs/fission-ranges.elf-x86_64 0x720" >> %t.input RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input RUN: cp %p/Inputs/split-dwarf-test.dwo %t @@ -127,6 +128,10 @@ CHECK: _Z3inci CHECK: main CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11 +CHECK-NOT: local_mem_func +CHECK: _ZZ2f1vEN3foo14local_mem_funcEv +CHECK-NEXT: {{.*}}local-mem-func.cpp:3:0 + CHECK: main CHECK-NEXT: {{.*}}fission-ranges.cc:6