summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2015-12-30 11:46:15 +0000
committerdim <dim@FreeBSD.org>2015-12-30 11:46:15 +0000
commite194cd6d03d91631334d9d5e55b506036f423cc8 (patch)
treefcfbb4df56a744f4ddc6122c50521dd3f1c5e196 /lib/CodeGen/AsmPrinter/DwarfExpression.cpp
parent1f8fab1f5d4699e0d1676fd4e5150ed8635f5035 (diff)
downloadFreeBSD-src-e194cd6d03d91631334d9d5e55b506036f423cc8.zip
FreeBSD-src-e194cd6d03d91631334d9d5e55b506036f423cc8.tar.gz
Vendor import of llvm trunk r256633:
https://llvm.org/svn/llvm-project/llvm/trunk@256633
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfExpression.cpp')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfExpression.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
index a2799b8..7b5b831 100644
--- a/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
@@ -211,12 +211,15 @@ bool DwarfExpression::AddMachineRegExpression(const DIExpression *Expr,
return AddMachineRegPiece(MachineReg, SizeInBits,
getOffsetOrZero(OffsetInBits, PieceOffsetInBits));
}
- case dwarf::DW_OP_plus: {
- // [DW_OP_reg,Offset,DW_OP_plus,DW_OP_deref] --> [DW_OP_breg,Offset].
+ case dwarf::DW_OP_plus:
+ case dwarf::DW_OP_minus: {
+ // [DW_OP_reg,Offset,DW_OP_plus, DW_OP_deref] --> [DW_OP_breg, Offset].
+ // [DW_OP_reg,Offset,DW_OP_minus,DW_OP_deref] --> [DW_OP_breg,-Offset].
auto N = I.getNext();
if (N != E && N->getOp() == dwarf::DW_OP_deref) {
unsigned Offset = I->getArg(0);
- ValidReg = AddMachineRegIndirect(MachineReg, Offset);
+ ValidReg = AddMachineRegIndirect(
+ MachineReg, I->getOp() == dwarf::DW_OP_plus ? Offset : -Offset);
std::advance(I, 2);
break;
} else
@@ -255,6 +258,12 @@ void DwarfExpression::AddExpression(DIExpression::expr_op_iterator I,
EmitOp(dwarf::DW_OP_plus_uconst);
EmitUnsigned(I->getArg(0));
break;
+ case dwarf::DW_OP_minus:
+ // There is no OP_minus_uconst.
+ EmitOp(dwarf::DW_OP_constu);
+ EmitUnsigned(I->getArg(0));
+ EmitOp(dwarf::DW_OP_minus);
+ break;
case dwarf::DW_OP_deref:
EmitOp(dwarf::DW_OP_deref);
break;
OpenPOWER on IntegriCloud