summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
diff options
context:
space:
mode:
authorVedant Kumar <vsk@apple.com>2018-10-22 21:44:21 +0000
committerVedant Kumar <vsk@apple.com>2018-10-22 21:44:21 +0000
commit74533bd3b80c9e57940e06579b162c7db67d5b9d (patch)
tree7e450efbe51936dfecb72196af0a0d837f09f476 /llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
parentdd1c3df72d33c426d08d20dc0f08b53a9075a7d4 (diff)
downloadbcm5719-llvm-74533bd3b80c9e57940e06579b162c7db67d5b9d.tar.gz
bcm5719-llvm-74533bd3b80c9e57940e06579b162c7db67d5b9d.zip
[DWARF] Use a function-local offset for AT_call_return_pc
Logs provided by @stella.stamenova indicate that on Linux, lldb adds a spurious slide offset to the return PC it loads from AT_call_return_pc attributes (see the list thread: "[PATCH] D50478: Add support for artificial tail call frames"). This patch side-steps the issue by getting rid of the load address calculation in lldb's CallEdge::GetReturnPCAddress. The idea is to have the DWARF writer emit function-local offsets to the instruction after a call. I.e. return-pc = label-after-call-insn - function-entry. LLDB can simply add this offset to the base address of a function to get the return PC. Differential Revision: https://reviews.llvm.org/D53469 llvm-svn: 344960
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 2f14f5464fd..5f91674d9f0 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -548,14 +548,15 @@ void DwarfDebug::constructCallSiteEntryDIEs(const DISubprogram &SP,
// For tail calls, no return PC information is needed. For regular calls,
// the return PC is needed to disambiguate paths in the call graph which
// could lead to some target function.
- const MCSymbol *ReturnPC = IsTail ? nullptr : getLabelAfterInsn(&MI);
+ const MCExpr *PCOffset =
+ IsTail ? nullptr : getFunctionLocalOffsetAfterInsn(&MI);
- assert((IsTail || ReturnPC) && "Call without return PC information");
+ assert((IsTail || PCOffset) && "Call without return PC information");
LLVM_DEBUG(dbgs() << "CallSiteEntry: " << MF.getName() << " -> "
<< CalleeDecl->getName() << (IsTail ? " [tail]" : "")
<< "\n");
CU.constructCallSiteEntryDIE(ScopeDIE, *CalleeDecl->getSubprogram(),
- IsTail, ReturnPC);
+ IsTail, PCOffset);
}
}
}
OpenPOWER on IntegriCloud