aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp50
1 files changed, 40 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index baef5e7..5827a5f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -5503,6 +5503,35 @@ bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
if (!Arg)
return false;
+ MachineFunction &MF = DAG.getMachineFunction();
+ const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
+
+ // Helper to create DBG_INSTR_REFs or DBG_VALUEs, depending on what kind
+ // we've been asked to pursue.
+ auto MakeVRegDbgValue = [&](Register Reg, DIExpression *FragExpr,
+ bool Indirect) {
+ if (Reg.isVirtual() && TM.Options.ValueTrackingVariableLocations) {
+ // For VRegs, in instruction referencing mode, create a DBG_INSTR_REF
+ // pointing at the VReg, which will be patched up later.
+ auto &Inst = TII->get(TargetOpcode::DBG_INSTR_REF);
+ auto MIB = BuildMI(MF, DL, Inst);
+ MIB.addReg(Reg, RegState::Debug);
+ MIB.addImm(0);
+ MIB.addMetadata(Variable);
+ auto *NewDIExpr = FragExpr;
+ // We don't have an "Indirect" field in DBG_INSTR_REF, fold that into
+ // the DIExpression.
+ if (Indirect)
+ NewDIExpr = DIExpression::prepend(FragExpr, DIExpression::DerefBefore);
+ MIB.addMetadata(NewDIExpr);
+ return MIB;
+ } else {
+ // Create a completely standard DBG_VALUE.
+ auto &Inst = TII->get(TargetOpcode::DBG_VALUE);
+ return BuildMI(MF, DL, Inst, Indirect, Reg, Variable, FragExpr);
+ }
+ };
+
if (!IsDbgDeclare) {
// ArgDbgValues are hoisted to the beginning of the entry block. So we
// should only emit as ArgDbgValue if the dbg.value intrinsic is found in
@@ -5568,9 +5597,6 @@ bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
}
}
- MachineFunction &MF = DAG.getMachineFunction();
- const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo();
-
bool IsIndirect = false;
Optional<MachineOperand> Op;
// Some arguments' frame index is recorded during argument lowering.
@@ -5640,9 +5666,9 @@ bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
DAG.AddDbgValue(SDV, false);
continue;
}
- FuncInfo.ArgDbgValues.push_back(
- BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), IsDbgDeclare,
- RegAndSize.first, Variable, *FragmentExpr));
+ MachineInstr *NewMI =
+ MakeVRegDbgValue(RegAndSize.first, *FragmentExpr, IsDbgDeclare);
+ FuncInfo.ArgDbgValues.push_back(NewMI);
}
};
@@ -5673,11 +5699,15 @@ bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
assert(Variable->isValidLocationForIntrinsic(DL) &&
"Expected inlined-at fields to agree");
- IsIndirect = (Op->isReg()) ? IsIndirect : true;
- FuncInfo.ArgDbgValues.push_back(
- BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), IsIndirect,
- *Op, Variable, Expr));
+ MachineInstr *NewMI = nullptr;
+
+ if (Op->isReg())
+ NewMI = MakeVRegDbgValue(Op->getReg(), Expr, IsIndirect);
+ else
+ NewMI = BuildMI(MF, DL, TII->get(TargetOpcode::DBG_VALUE), true, *Op,
+ Variable, Expr);
+ FuncInfo.ArgDbgValues.push_back(NewMI);
return true;
}