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
This commit is contained in:
David Blaikie 2018-05-01 18:08:45 +00:00
parent c708868cb1
commit aa537da89f
3 changed files with 11 additions and 2 deletions

View File

@ -415,11 +415,15 @@ DWARFUnit::getInlinedChainForAddress(uint64_t Address,
DWARFDie SubroutineDIE = DWARFDie SubroutineDIE =
(DWO ? DWO.get() : this)->getSubroutineForAddress(Address); (DWO ? DWO.get() : this)->getSubroutineForAddress(Address);
while (SubroutineDIE) { if (!SubroutineDIE)
if (SubroutineDIE.isSubroutineDIE()) return;
while (!SubroutineDIE.isSubprogramDIE()) {
if (SubroutineDIE.getTag() == DW_TAG_inlined_subroutine)
InlinedChain.push_back(SubroutineDIE); InlinedChain.push_back(SubroutineDIE);
SubroutineDIE = SubroutineDIE.getParent(); SubroutineDIE = SubroutineDIE.getParent();
} }
InlinedChain.push_back(SubroutineDIE);
} }
const DWARFUnitIndex &llvm::getDWARFUnitIndex(DWARFContext &Context, const DWARFUnitIndex &llvm::getDWARFUnitIndex(DWARFContext &Context,

View File

@ -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:i386 0x1f67" >> %t.input
RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %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-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/fission-ranges.elf-x86_64 0x720" >> %t.input
RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input
RUN: cp %p/Inputs/split-dwarf-test.dwo %t RUN: cp %p/Inputs/split-dwarf-test.dwo %t
@ -127,6 +128,10 @@ CHECK: _Z3inci
CHECK: main CHECK: main
CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11 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: main
CHECK-NEXT: {{.*}}fission-ranges.cc:6 CHECK-NEXT: {{.*}}fission-ranges.cc:6