1455 const Value *object_address_ptr) {
1457 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1458 llvm::DWARFExpression expr(expr_data, address_size);
1460 if (expr_data.size() == 0)
1461 return llvm::createStringError(
1462 "no location, value may have been optimized out");
1464 EvalContext eval_ctx(exe_ctx, reg_ctx, std::move(module_sp), dwarf_cu,
1465 reg_kind, initial_value_ptr, object_address_ptr);
1467 Stack &stack = eval_ctx.stack;
1469 if (initial_value_ptr)
1470 stack.push_back(*initial_value_ptr);
1480 auto to_generic = [&](
auto v) {
1483 bool is_signed = std::is_signed<
decltype(v)>::value;
1484 return Scalar(llvm::APSInt(
1485 llvm::APInt(8 * address_size, v, is_signed,
true),
1489 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1490 while (op != op_end) {
1491 const uint64_t op_offset = op.getOffset();
1492 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1495 size_t count = stack.size();
1496 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1497 static_cast<uint64_t
>(count));
1498 for (
size_t i = 0; i < count; ++i) {
1500 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1501 stack[i].Dump(&new_value);
1504 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1508 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1509 if (stack.size() < *arity)
1510 return llvm::createStringError(
1511 "%s needs at least %d stack entries (stack has %d entries)",
1517 stack.push_back(to_generic(op->getRawOperand(0)));
1522 size_t size = address_size;
1527 case DW_OP_deref_size: {
1528 size_t size = op->getRawOperand(0);
1529 if (llvm::Error err =
1535 stack.push_back(to_generic(op->getRawOperand(0)));
1538 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1541 stack.push_back(to_generic(op->getRawOperand(0)));
1544 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1547 stack.push_back(to_generic(op->getRawOperand(0)));
1550 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1553 stack.push_back(to_generic(op->getRawOperand(0)));
1556 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1559 stack.push_back(to_generic(op->getRawOperand(0)));
1562 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1566 if (stack.empty()) {
1567 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1569 stack.push_back(stack.back());
1573 if (stack.empty()) {
1574 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1580 stack.push_back(stack[stack.size() - 2]);
1584 uint8_t pick_idx = op->getRawOperand(0);
1585 if (pick_idx < stack.size())
1586 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1588 return llvm::createStringError(
1589 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1595 stack.back() = stack[stack.size() - 2];
1596 stack[stack.size() - 2] = tmp;
1600 size_t last_idx = stack.size() - 1;
1601 Value old_top = stack[last_idx];
1602 stack[last_idx] = stack[last_idx - 1];
1603 stack[last_idx - 1] = stack[last_idx - 2];
1604 stack[last_idx - 2] = old_top;
1608 if (!stack.back().GetScalar().AbsoluteValue()) {
1609 return llvm::createStringError(
1610 "failed to take the absolute value of the first stack item");
1616 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1617 opcode, address_size))
1621 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1626 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1627 opcode, address_size))
1631 return llvm::createStringError(
"divide by zero");
1634 Scalar divisor, dividend;
1636 dividend = stack.back().GetScalar();
1639 stack.back() = dividend / divisor;
1641 if (!stack.back().GetScalar().IsValid())
1642 return llvm::createStringError(
"divide failed");
1647 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1648 opcode, address_size))
1652 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1657 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1658 opcode, address_size))
1666 stack.back().GetScalar().MakeUnsigned();
1668 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1673 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1674 opcode, address_size))
1678 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1682 if (!stack.back().GetScalar().UnaryNegate())
1683 return llvm::createStringError(
"unary negate failed");
1687 if (!stack.back().GetScalar().OnesComplement())
1688 return llvm::createStringError(
"logical NOT failed");
1693 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1694 opcode, address_size))
1698 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1703 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1704 opcode, address_size))
1708 stack.back().GetScalar() += tmp.
GetScalar();
1711 case DW_OP_plus_uconst: {
1712 const uint64_t uconst_value = op->getRawOperand(0);
1713 Scalar &operand = stack.back().GetScalar();
1714 Scalar addend(uconst_value);
1724 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1729 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1730 opcode, address_size))
1734 stack.back().GetScalar() <<= tmp.
GetScalar();
1739 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1740 opcode, address_size))
1744 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1745 return llvm::createStringError(
"DW_OP_shr failed");
1750 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1751 opcode, address_size))
1755 stack.back().GetScalar() >>= tmp.
GetScalar();
1760 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1761 opcode, address_size))
1765 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1769 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1774 if (new_offset <= expr_data.size()) {
1775 op = op.skipBytes(skip_offset);
1778 return llvm::createStringErrorV(
1779 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1780 op->getEndOffset(), skip_offset, expr_data.size());
1786 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1793 if (new_offset <= expr_data.size()) {
1794 op = op.skipBytes(bra_offset);
1797 return llvm::createStringErrorV(
1798 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1799 op->getEndOffset(), bra_offset, expr_data.size());
1805 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1806 opcode, address_size))
1810 stack.back().GetScalar() =
1811 to_generic(stack.back().GetScalar() == tmp.
GetScalar());
1816 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1817 opcode, address_size))
1825 stack.back().GetScalar().MakeSigned();
1827 stack.back().GetScalar() =
1828 to_generic(stack.back().GetScalar() >= tmp.
GetScalar());
1833 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1834 opcode, address_size))
1842 stack.back().GetScalar().MakeSigned();
1844 stack.back().GetScalar() =
1845 to_generic(stack.back().GetScalar() > tmp.
GetScalar());
1850 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1851 opcode, address_size))
1859 stack.back().GetScalar().MakeSigned();
1861 stack.back().GetScalar() =
1862 to_generic(stack.back().GetScalar() <= tmp.
GetScalar());
1867 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1868 opcode, address_size))
1876 stack.back().GetScalar().MakeSigned();
1878 stack.back().GetScalar() =
1879 to_generic(stack.back().GetScalar() < tmp.
GetScalar());
1884 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1885 opcode, address_size))
1889 stack.back().GetScalar() =
1890 to_generic(stack.back().GetScalar() != tmp.
GetScalar());
1925 stack.push_back(to_generic(opcode - DW_OP_lit0));
1960 eval_ctx.loc_desc_kind = Register;
1961 reg_num = opcode - DW_OP_reg0;
1964 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1966 stack.push_back(tmp);
1969 eval_ctx.loc_desc_kind = Register;
1970 reg_num = op->getRawOperand(0);
1973 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1975 stack.push_back(tmp);
2009 case DW_OP_breg31: {
2010 reg_num = opcode - DW_OP_breg0;
2012 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2015 int64_t breg_offset = op->getRawOperand(0);
2017 tmp.
GetScalar() += to_generic(breg_offset);
2019 stack.push_back(tmp);
2023 reg_num = op->getRawOperand(0);
2025 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2028 int64_t breg_offset = op->getRawOperand(1);
2030 tmp.
GetScalar() += to_generic(breg_offset);
2032 stack.push_back(tmp);
2037 if (llvm::Error err =
2040 stack.back().GetScalar() =
2041 to_generic(stack.back().GetScalar().ULongLong());
2048 if (llvm::Error err =
2053 case DW_OP_bit_piece:
2054 if (stack.size() < 1) {
2056 LocationDescriptionKind::Empty);
2058 eval_ctx.loc_desc_kind =
Memory;
2059 return llvm::createStringError(
2060 "expression stack needs at least 1 item for DW_OP_bit_piece");
2062 const LocationDescriptionKind piece_locdesc = eval_ctx.loc_desc_kind;
2066 eval_ctx.loc_desc_kind =
Memory;
2067 const uint64_t piece_bit_size = op->getRawOperand(0);
2068 const uint64_t piece_bit_offset = op->getRawOperand(1);
2069 switch (stack.back().GetValueType()) {
2071 return llvm::createStringError(
2072 "unable to extract bit value from invalid value");
2074 if (!stack.back().GetScalar().ExtractBitfield(piece_bit_size,
2075 piece_bit_offset)) {
2076 return llvm::createStringError(
2077 "unable to extract %" PRIu64
" bit value with %" PRIu64
2078 " bit offset from a %" PRIu64
" bit scalar value.",
2079 piece_bit_size, piece_bit_offset,
2080 (uint64_t)(stack.back().GetScalar().GetByteSize() * 8));
2086 return llvm::createStringError(
2087 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
2088 ", bit_offset = %" PRIu64
") from an address value.",
2089 piece_bit_size, piece_bit_offset);
2094 if (piece_locdesc == Implicit && piece_bit_offset == 0 &&
2095 piece_bit_size % 8 == 0 &&
2096 stack.back().GetBuffer().GetByteSize() == piece_bit_size / 8)
2098 return llvm::createStringError(
2099 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
2100 ", bit_offset = %" PRIu64
") from an address value.",
2101 piece_bit_size, piece_bit_offset);
2106 case DW_OP_implicit_value: {
2107 eval_ctx.loc_desc_kind = Implicit;
2111 const uint64_t block_size = op->getRawOperand(0);
2112 uint64_t block_offset = op->getRawOperand(1);
2114 llvm::Error
error = llvm::Error::success();
2115 llvm::StringRef block_data =
2116 expr_data.getBytes(&block_offset, block_size, &
error);
2121 Value result(block_data.data(), block_data.size());
2122 stack.push_back(result);
2126 case DW_OP_implicit_pointer: {
2127 eval_ctx.loc_desc_kind = Implicit;
2128 return llvm::createStringError(
"could not evaluate %s",
2132 case DW_OP_push_object_address:
2133 if (eval_ctx.object_address_ptr)
2134 stack.push_back(*eval_ctx.object_address_ptr);
2136 return llvm::createStringError(
"DW_OP_push_object_address used without "
2137 "specifying an object address");
2141 case DW_OP_stack_value:
2142 eval_ctx.loc_desc_kind = Implicit;
2147 if (llvm::Error err =
2152 case DW_OP_call_frame_cfa:
2155 stack.back().GetScalar() =
2156 to_generic(stack.back().GetScalar().ULongLong());
2159 case DW_OP_form_tls_address:
2160 case DW_OP_GNU_push_tls_address:
2166 case DW_OP_GNU_addr_index: {
2167 if (!eval_ctx.dwarf_cu)
2168 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
2169 "compile unit being specified");
2170 uint64_t index = op->getRawOperand(0);
2173 stack.push_back(to_generic(value));
2177 case DW_OP_GNU_const_index: {
2178 if (!eval_ctx.dwarf_cu) {
2179 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
2180 "compile unit being specified");
2182 uint64_t index = op->getRawOperand(0);
2185 stack.push_back(to_generic(value));
2188 case DW_OP_GNU_entry_value:
2189 case DW_OP_entry_value: {
2194 const uint64_t block_size = op->getRawOperand(0);
2195 uint64_t block_offset = op->getEndOffset();
2197 llvm::Error
error = llvm::Error::success();
2198 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
2199 expr_data.getBytes(&block_offset, block_size, &
error));
2205 return llvm::createStringError(
2206 "could not evaluate DW_OP_entry_value: %s",
2207 llvm::toString(std::move(err)).c_str());
2211 op = op.skipBytes(block_size);
2217 case DW_OP_xderef_size:
2220 case DW_OP_call_ref:
2222 case DW_OP_const_type:
2223 case DW_OP_regval_type:
2224 case DW_OP_deref_type:
2225 case DW_OP_xderef_type:
2226 case DW_OP_reinterpret:
2227 case DW_OP_GNU_implicit_pointer:
2228 return llvm::createStringError(
"unimplemented opcode %s",
2231 case DW_OP_LLVM_user:
2232 if (op->getSubCode() == DW_OP_LLVM_piece_end) {
2233 if (op->getEndOffset() != expr_data.size())
2234 return llvm::createStringError(
2235 "DW_OP_LLVM_piece_end is only supported at the end of an "
2250 if (eval_ctx.dwarf_cu) {
2251 const uint64_t operands_offset = op_offset + 1;
2252 uint64_t offset = operands_offset;
2254 opcode, expr_data, offset, eval_ctx.reg_ctx, eval_ctx.reg_kind,
2263 assert(offset >= op->getEndOffset());
2264 uint64_t offset_to_next_op = offset - op->getEndOffset();
2265 op = op.skipBytes(offset_to_next_op);
2269 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
2275 if (stack.empty()) {
2279 return eval_ctx.pieces;
2281 return llvm::createStringError(
"stack empty after evaluation");
2288 size_t count = stack.size();
2289 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
2290 static_cast<uint64_t
>(count));
2291 for (
size_t i = 0; i < count; ++i) {
2293 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2294 stack[i].Dump(&new_value);
2298 return stack.back();