mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-02 15:51:54 +00:00
[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. llvm-svn: 206665
This commit is contained in:
parent
d9f7325c10
commit
b94b4557c0
@ -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.
|
||||
|
BIN
test/DebugInfo/Inputs/llvm-symbolizer-dwo-test
Executable file
BIN
test/DebugInfo/Inputs/llvm-symbolizer-dwo-test
Executable file
Binary file not shown.
18
test/DebugInfo/Inputs/llvm-symbolizer-dwo-test.cc
Normal file
18
test/DebugInfo/Inputs/llvm-symbolizer-dwo-test.cc
Normal file
@ -0,0 +1,18 @@
|
||||
int f(int a, int b) {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
int g(int a) {
|
||||
return a + 1;
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
return f(2, g(2));
|
||||
}
|
||||
|
||||
// Built with Clang 3.5.0:
|
||||
// $ mkdir -p /tmp/dbginfo
|
||||
// $ cp llvm-symbolizer-dwo-test.cc /tmp/dbginfo
|
||||
// $ cd /tmp/dbginfo
|
||||
// $ clang -gsplit-dwarf llvm-symbolizer-dwo-test.cc
|
@ -8,6 +8,7 @@ RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x633" >> %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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user