aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
diff options
context:
space:
mode:
authorgbtozers <stephen.tozer@sony.com>2020-09-11 15:48:39 +0100
committerStephen Tozer <Stephen.Tozer@Sony.com>2021-03-10 13:46:20 +0000
commit0da27ba56c9f5e3f534a65401962301189eac342 (patch)
tree01879937a9ef1bee69c936a6be854b1e78b3c620 /llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
parente02dd790b1ed32723725d5402f9bf2c3593d2ad9 (diff)
downloadllvm-0da27ba56c9f5e3f534a65401962301189eac342.zip
llvm-0da27ba56c9f5e3f534a65401962301189eac342.tar.gz
llvm-0da27ba56c9f5e3f534a65401962301189eac342.tar.bz2
[DebugInfo] Add DWARF emission for DBG_VALUE_LIST
This patch allows DBG_VALUE_LIST instructions to be emitted to DWARF with valid DW_AT_locations. This change mainly affects DbgEntityHistoryCalculator, which now tracks multiple registers per value, and DwarfDebug+DwarfExpression, which can now emit multiple machine locations as part of a DWARF expression. Differential Revision: https://reviews.llvm.org/D83495
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
index 68a4bfb..b9a9e1c 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
@@ -35,7 +35,8 @@ Optional<DbgVariableLocation>
DbgVariableLocation::extractFromMachineInstruction(
const MachineInstr &Instruction) {
DbgVariableLocation Location;
- if (!Instruction.isDebugValue())
+ // Variables calculated from multiple locations can't be represented here.
+ if (Instruction.getNumDebugOperands() != 1)
return None;
if (!Instruction.getDebugOperand(0).isReg())
return None;
@@ -46,6 +47,15 @@ DbgVariableLocation::extractFromMachineInstruction(
int64_t Offset = 0;
const DIExpression *DIExpr = Instruction.getDebugExpression();
auto Op = DIExpr->expr_op_begin();
+ // We can handle a DBG_VALUE_LIST iff it has exactly one location operand that
+ // appears exactly once at the start of the expression.
+ if (Instruction.isDebugValueList()) {
+ if (Instruction.getNumDebugOperands() == 1 &&
+ Op->getOp() == dwarf::DW_OP_LLVM_arg)
+ ++Op;
+ else
+ return None;
+ }
while (Op != DIExpr->expr_op_end()) {
switch (Op->getOp()) {
case dwarf::DW_OP_constu: {
@@ -261,7 +271,8 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) {
continue;
auto IsDescribedByReg = [](const MachineInstr *MI) {
- return MI->getDebugOperand(0).isReg() && MI->getDebugOperand(0).getReg();
+ return any_of(MI->debug_operands(),
+ [](auto &MO) { return MO.isReg() && MO.getReg(); });
};
// The first mention of a function argument gets the CurrentFnBegin label,