Skip to content

Commit

Permalink
[llvm-objdump] Add simple memory expressions to variable display
Browse files Browse the repository at this point in the history
Add the DW_OP_breg0..DW_OP_breg31 and DW_OP_bregx opcodes to the DWARF
expression printer.

Differential revision: https://reviews.llvm.org/D74841
  • Loading branch information
ostannard committed Jul 14, 2020
1 parent c15e04e commit 1d7311e
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
33 changes: 32 additions & 1 deletion llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,20 @@ static bool printCompactDWARFExpr(raw_ostream &OS, DWARFExpression::iterator I,
S << MRI.getName(*LLVMRegNum);
break;
}
case dwarf::DW_OP_bregx: {
int DwarfRegNum = Op.getRawOperand(0);
int64_t Offset = Op.getRawOperand(1);
Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, false);
if (!LLVMRegNum) {
OS << "<unknown register " << DwarfRegNum << ">";
return false;
}
raw_svector_ostream S(Stack.emplace_back().String);
S << MRI.getName(*LLVMRegNum);
if (Offset)
S << format("%+" PRId64, Offset);
break;
}
default:
if (Opcode >= dwarf::DW_OP_reg0 && Opcode <= dwarf::DW_OP_reg31) {
// DW_OP_reg<N>: A register, with the register num implied by the
Expand All @@ -422,6 +436,19 @@ static bool printCompactDWARFExpr(raw_ostream &OS, DWARFExpression::iterator I,
}
raw_svector_ostream S(Stack.emplace_back(PrintedExpr::Value).String);
S << MRI.getName(*LLVMRegNum);
} else if (Opcode >= dwarf::DW_OP_breg0 &&
Opcode <= dwarf::DW_OP_breg31) {
int DwarfRegNum = Opcode - dwarf::DW_OP_breg0;
int64_t Offset = Op.getRawOperand(0);
Optional<unsigned> LLVMRegNum = MRI.getLLVMRegNum(DwarfRegNum, false);
if (!LLVMRegNum) {
OS << "<unknown register " << DwarfRegNum << ">";
return false;
}
raw_svector_ostream S(Stack.emplace_back().String);
S << MRI.getName(*LLVMRegNum);
if (Offset)
S << format("%+" PRId64, Offset);
} else {
// If we hit an unknown operand, we don't know its effect on the stack,
// so bail out on the whole expression.
Expand All @@ -435,7 +462,11 @@ static bool printCompactDWARFExpr(raw_ostream &OS, DWARFExpression::iterator I,
}

assert(Stack.size() == 1 && "expected one value on stack");
OS << Stack.front().String;

if (Stack.front().Kind == PrintedExpr::Address)
OS << "[" << Stack.front().String << "]";
else
OS << Stack.front().String;

return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,27 @@ TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_reg10) {
TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_regx) {
TestExprPrinter({DW_OP_regx, 0x80, 0x02}, "D0");
}

TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_breg0) {
TestExprPrinter({DW_OP_breg0, 0x04}, "[R0+4]");
}

TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_breg0_large_offset) {
TestExprPrinter({DW_OP_breg0, 0x80, 0x02}, "[R0+256]");
}

TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_breg13) {
TestExprPrinter({DW_OP_breg13, 0x10}, "[SP+16]");
}

TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_breg13_zero_offset) {
TestExprPrinter({DW_OP_breg13, 0x00}, "[SP]");
}

TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_breg0_negative) {
TestExprPrinter({DW_OP_breg0, 0x70}, "[R0-16]");
}

TEST_F(DWARFExpressionCompactPrinterTest, Test_OP_bregx) {
TestExprPrinter({DW_OP_bregx, 0x0d, 0x28}, "[SP+40]");
}

0 comments on commit 1d7311e

Please sign in to comment.