1126 uint64_t piece_bit_size) {
1127 if (piece_bit_size == 0)
1128 return llvm::Error::success();
1132 return llvm::createStringError(
1133 "unsupported byte order for composite DWARF piece");
1135 if (eval_ctx.op_piece_bit_offset >
1136 std::numeric_limits<uint64_t>::max() - piece_bit_size)
1137 return llvm::createStringError(
"composite DWARF piece size overflow");
1138 const uint64_t next_bit_offset =
1139 eval_ctx.op_piece_bit_offset + piece_bit_size;
1141 std::optional<uint64_t> current_byte_size =
1143 std::optional<uint64_t> next_byte_size =
BitsToBytes(next_bit_offset);
1144 if (!current_byte_size || !next_byte_size ||
1145 *next_byte_size > std::numeric_limits<size_t>::max())
1146 return llvm::createStringError(
"composite DWARF piece size overflow");
1148 return llvm::createStringError(
1149 "composite DWARF piece buffer size does not match its bit offset");
1151 const uint8_t *source_data =
nullptr;
1152 uint64_t source_byte_size = 0;
1153 uint64_t source_bit_offset = 0;
1154 std::vector<uint8_t> scalar_data;
1158 if (piece_bit_size > std::numeric_limits<uint16_t>::max())
1159 return llvm::createStringError(
"scalar DWARF piece is too large");
1160 std::optional<uint64_t> scalar_byte_size =
BitsToBytes(piece_bit_size);
1161 if (!scalar_byte_size ||
1162 *scalar_byte_size > std::numeric_limits<size_t>::max())
1163 return llvm::createStringError(
"scalar DWARF piece is too large");
1165 scalar_data.resize(
static_cast<size_t>(*scalar_byte_size));
1168 scalar_data.data(), scalar_data.size(), eval_ctx.byte_order,
1169 error) != scalar_data.size())
1170 return llvm::createStringError(
"failed to serialize scalar DWARF piece");
1172 source_data = scalar_data.data();
1173 source_byte_size = scalar_data.size();
1177 source_bit_offset = 8 - piece_bit_size % 8;
1187 return llvm::createStringError(
1188 "unsupported value type for composite DWARF piece");
1191 if (source_bit_offset >
1192 std::numeric_limits<uint64_t>::max() - piece_bit_size ||
1193 source_byte_size > std::numeric_limits<uint64_t>::max() / 8 ||
1194 source_bit_offset + piece_bit_size > source_byte_size * 8)
1195 return llvm::createStringError(
"DWARF piece exceeds its source buffer");
1197 if (eval_ctx.pieces.
ResizeData(
static_cast<size_t>(*next_byte_size)) !=
1199 return llvm::createStringError(
1200 "failed to resize composite DWARF piece buffer");
1203 if (eval_ctx.op_piece_bit_offset % 8 == 0 && source_bit_offset % 8 == 0 &&
1204 piece_bit_size % 8 == 0) {
1205 ::memcpy(destination_data + eval_ctx.op_piece_bit_offset / 8,
1206 source_data + source_bit_offset / 8, piece_bit_size / 8);
1208 for (uint64_t i = 0; i < piece_bit_size; ++i) {
1209 const uint64_t source_offset = source_bit_offset + i;
1210 const uint64_t destination_offset = eval_ctx.op_piece_bit_offset + i;
1211 const bool bit = source_data[source_offset / 8] &
1212 GetBitMask(source_offset, eval_ctx.byte_order);
1213 uint8_t &destination_byte = destination_data[destination_offset / 8];
1214 const uint8_t destination_mask =
1215 GetBitMask(destination_offset, eval_ctx.byte_order);
1217 destination_byte |= destination_mask;
1219 destination_byte &=
static_cast<uint8_t
>(~destination_mask);
1223 eval_ctx.op_piece_bit_offset = next_bit_offset;
1224 return llvm::Error::success();
1558 const Value *object_address_ptr) {
1560 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1561 llvm::DWARFExpression expr(expr_data, address_size);
1563 if (expr_data.size() == 0)
1564 return llvm::createStringError(
1565 "no location, value may have been optimized out");
1567 EvalContext eval_ctx(exe_ctx, reg_ctx, std::move(module_sp), dwarf_cu,
1569 object_address_ptr);
1571 Stack &stack = eval_ctx.stack;
1573 if (initial_value_ptr)
1574 stack.push_back(*initial_value_ptr);
1584 auto to_generic = [&](
auto v) {
1587 bool is_signed = std::is_signed<
decltype(v)>::value;
1588 return Scalar(llvm::APSInt(
1589 llvm::APInt(8 * address_size, v, is_signed,
true),
1593 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1594 while (op != op_end) {
1595 const uint64_t op_offset = op.getOffset();
1596 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1599 size_t count = stack.size();
1600 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1601 static_cast<uint64_t
>(count));
1602 for (
size_t i = 0; i < count; ++i) {
1604 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1605 stack[i].Dump(&new_value);
1608 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1612 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1613 if (stack.size() < *arity)
1614 return llvm::createStringError(
1615 "%s needs at least %d stack entries (stack has %d entries)",
1621 stack.push_back(to_generic(op->getRawOperand(0)));
1626 size_t size = address_size;
1631 case DW_OP_deref_size: {
1632 size_t size = op->getRawOperand(0);
1633 if (llvm::Error err =
1639 stack.push_back(to_generic(op->getRawOperand(0)));
1642 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1645 stack.push_back(to_generic(op->getRawOperand(0)));
1648 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1651 stack.push_back(to_generic(op->getRawOperand(0)));
1654 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1657 stack.push_back(to_generic(op->getRawOperand(0)));
1660 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1663 stack.push_back(to_generic(op->getRawOperand(0)));
1666 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1670 if (stack.empty()) {
1671 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1673 stack.push_back(stack.back());
1677 if (stack.empty()) {
1678 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1684 stack.push_back(stack[stack.size() - 2]);
1688 uint8_t pick_idx = op->getRawOperand(0);
1689 if (pick_idx < stack.size())
1690 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1692 return llvm::createStringError(
1693 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1699 stack.back() = stack[stack.size() - 2];
1700 stack[stack.size() - 2] = tmp;
1704 size_t last_idx = stack.size() - 1;
1705 Value old_top = stack[last_idx];
1706 stack[last_idx] = stack[last_idx - 1];
1707 stack[last_idx - 1] = stack[last_idx - 2];
1708 stack[last_idx - 2] = old_top;
1712 if (!stack.back().GetScalar().AbsoluteValue()) {
1713 return llvm::createStringError(
1714 "failed to take the absolute value of the first stack item");
1720 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1721 opcode, address_size))
1725 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1730 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1731 opcode, address_size))
1735 return llvm::createStringError(
"divide by zero");
1738 Scalar divisor, dividend;
1740 dividend = stack.back().GetScalar();
1743 stack.back() = dividend / divisor;
1745 if (!stack.back().GetScalar().IsValid())
1746 return llvm::createStringError(
"divide failed");
1751 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1752 opcode, address_size))
1756 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1761 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1762 opcode, address_size))
1770 stack.back().GetScalar().MakeUnsigned();
1772 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1777 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1778 opcode, address_size))
1782 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1786 if (!stack.back().GetScalar().UnaryNegate())
1787 return llvm::createStringError(
"unary negate failed");
1791 if (!stack.back().GetScalar().OnesComplement())
1792 return llvm::createStringError(
"logical NOT failed");
1797 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1798 opcode, address_size))
1802 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1807 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1808 opcode, address_size))
1812 stack.back().GetScalar() += tmp.
GetScalar();
1815 case DW_OP_plus_uconst: {
1816 const uint64_t uconst_value = op->getRawOperand(0);
1817 Scalar &operand = stack.back().GetScalar();
1818 Scalar addend(uconst_value);
1828 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1833 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1834 opcode, address_size))
1838 stack.back().GetScalar() <<= tmp.
GetScalar();
1843 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1844 opcode, address_size))
1848 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1849 return llvm::createStringError(
"DW_OP_shr failed");
1854 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1855 opcode, address_size))
1859 stack.back().GetScalar() >>= tmp.
GetScalar();
1864 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1865 opcode, address_size))
1869 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1873 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1878 if (new_offset <= expr_data.size()) {
1879 op = op.skipBytes(skip_offset);
1882 return llvm::createStringErrorV(
1883 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1884 op->getEndOffset(), skip_offset, expr_data.size());
1890 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1897 if (new_offset <= expr_data.size()) {
1898 op = op.skipBytes(bra_offset);
1901 return llvm::createStringErrorV(
1902 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1903 op->getEndOffset(), bra_offset, expr_data.size());
1909 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1910 opcode, address_size))
1914 stack.back().GetScalar() =
1915 to_generic(stack.back().GetScalar() == tmp.
GetScalar());
1920 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1921 opcode, address_size))
1929 stack.back().GetScalar().MakeSigned();
1931 stack.back().GetScalar() =
1932 to_generic(stack.back().GetScalar() >= tmp.
GetScalar());
1937 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1938 opcode, address_size))
1946 stack.back().GetScalar().MakeSigned();
1948 stack.back().GetScalar() =
1949 to_generic(stack.back().GetScalar() > tmp.
GetScalar());
1954 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1955 opcode, address_size))
1963 stack.back().GetScalar().MakeSigned();
1965 stack.back().GetScalar() =
1966 to_generic(stack.back().GetScalar() <= tmp.
GetScalar());
1971 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1972 opcode, address_size))
1980 stack.back().GetScalar().MakeSigned();
1982 stack.back().GetScalar() =
1983 to_generic(stack.back().GetScalar() < tmp.
GetScalar());
1988 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1989 opcode, address_size))
1993 stack.back().GetScalar() =
1994 to_generic(stack.back().GetScalar() != tmp.
GetScalar());
2029 stack.push_back(to_generic(opcode - DW_OP_lit0));
2064 eval_ctx.loc_desc_kind = Register;
2065 reg_num = opcode - DW_OP_reg0;
2068 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2070 stack.push_back(tmp);
2073 eval_ctx.loc_desc_kind = Register;
2074 reg_num = op->getRawOperand(0);
2077 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2079 stack.push_back(tmp);
2113 case DW_OP_breg31: {
2114 reg_num = opcode - DW_OP_breg0;
2116 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2119 int64_t breg_offset = op->getRawOperand(0);
2121 tmp.
GetScalar() += to_generic(breg_offset);
2123 stack.push_back(tmp);
2127 reg_num = op->getRawOperand(0);
2129 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2132 int64_t breg_offset = op->getRawOperand(1);
2134 tmp.
GetScalar() += to_generic(breg_offset);
2136 stack.push_back(tmp);
2141 if (llvm::Error err =
2144 stack.back().GetScalar() =
2145 to_generic(stack.back().GetScalar().ULongLong());
2152 if (llvm::Error err =
2157 case DW_OP_bit_piece:
2158 if (stack.size() < 1) {
2160 LocationDescriptionKind::Empty);
2162 eval_ctx.loc_desc_kind =
Memory;
2163 return llvm::createStringError(
2164 "expression stack needs at least 1 item for DW_OP_bit_piece");
2166 const LocationDescriptionKind piece_locdesc = eval_ctx.loc_desc_kind;
2170 eval_ctx.loc_desc_kind =
Memory;
2171 const uint64_t piece_bit_size = op->getRawOperand(0);
2172 const uint64_t piece_bit_offset = op->getRawOperand(1);
2173 if (piece_bit_size == 0) {
2178 switch (stack.back().GetValueType()) {
2180 return llvm::createStringError(
2181 "unable to extract bit value from invalid value");
2183 if (piece_bit_size > std::numeric_limits<uint16_t>::max())
2184 return llvm::createStringError(
2185 "scalar DW_OP_bit_piece is too large");
2187 Value curr_piece(stack.back());
2190 return llvm::createStringError(
2191 "unable to extract %" PRIu64
" bit value with %" PRIu64
2192 " bit offset from a non-integer scalar value.",
2193 piece_bit_size, piece_bit_offset);
2194 const uint64_t scalar_bit_size = scalar.
GetAPSInt().getBitWidth();
2195 if (piece_bit_offset >= scalar_bit_size) {
2196 scalar =
Scalar(llvm::APInt(
static_cast<unsigned>(piece_bit_size),
2199 static_cast<uint32_t
>(piece_bit_size),
2200 static_cast<uint32_t
>(piece_bit_offset))) {
2201 return llvm::createStringError(
2202 "unable to extract %" PRIu64
" bit value with %" PRIu64
2203 " bit offset from a %" PRIu64
" bit scalar value.",
2204 piece_bit_size, piece_bit_offset, scalar_bit_size);
2210 if (llvm::Error err =
2217 return llvm::createStringError(
2218 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
2219 ", bit_offset = %" PRIu64
") from an address value.",
2220 piece_bit_size, piece_bit_offset);
2225 if (piece_locdesc == Implicit && piece_bit_offset == 0 &&
2226 piece_bit_size % 8 == 0 &&
2227 stack.back().GetBuffer().GetByteSize() == piece_bit_size / 8)
2229 return llvm::createStringError(
2230 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
2231 ", bit_offset = %" PRIu64
") from an address value.",
2232 piece_bit_size, piece_bit_offset);
2237 case DW_OP_implicit_value: {
2238 eval_ctx.loc_desc_kind = Implicit;
2242 const uint64_t block_size = op->getRawOperand(0);
2243 uint64_t block_offset = op->getRawOperand(1);
2245 llvm::Error
error = llvm::Error::success();
2246 llvm::StringRef block_data =
2247 expr_data.getBytes(&block_offset, block_size, &
error);
2252 Value result(block_data.data(), block_data.size());
2253 stack.push_back(result);
2257 case DW_OP_implicit_pointer: {
2258 eval_ctx.loc_desc_kind = Implicit;
2259 return llvm::createStringError(
"could not evaluate %s",
2263 case DW_OP_push_object_address:
2264 if (eval_ctx.object_address_ptr)
2265 stack.push_back(*eval_ctx.object_address_ptr);
2267 return llvm::createStringError(
"DW_OP_push_object_address used without "
2268 "specifying an object address");
2272 case DW_OP_stack_value:
2273 eval_ctx.loc_desc_kind = Implicit;
2278 if (llvm::Error err =
2283 case DW_OP_call_frame_cfa:
2286 stack.back().GetScalar() =
2287 to_generic(stack.back().GetScalar().ULongLong());
2290 case DW_OP_form_tls_address:
2291 case DW_OP_GNU_push_tls_address:
2297 case DW_OP_GNU_addr_index: {
2298 if (!eval_ctx.dwarf_cu)
2299 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
2300 "compile unit being specified");
2301 uint64_t index = op->getRawOperand(0);
2304 stack.push_back(to_generic(value));
2308 case DW_OP_GNU_const_index: {
2309 if (!eval_ctx.dwarf_cu) {
2310 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
2311 "compile unit being specified");
2313 uint64_t index = op->getRawOperand(0);
2316 stack.push_back(to_generic(value));
2319 case DW_OP_GNU_entry_value:
2320 case DW_OP_entry_value: {
2325 const uint64_t block_size = op->getRawOperand(0);
2326 uint64_t block_offset = op->getEndOffset();
2328 llvm::Error
error = llvm::Error::success();
2329 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
2330 expr_data.getBytes(&block_offset, block_size, &
error));
2336 return llvm::createStringError(
2337 "could not evaluate DW_OP_entry_value: %s",
2338 llvm::toString(std::move(err)).c_str());
2342 op = op.skipBytes(block_size);
2348 case DW_OP_xderef_size:
2351 case DW_OP_call_ref:
2353 case DW_OP_const_type:
2354 case DW_OP_regval_type:
2355 case DW_OP_deref_type:
2356 case DW_OP_xderef_type:
2357 case DW_OP_reinterpret:
2358 case DW_OP_GNU_implicit_pointer:
2359 return llvm::createStringError(
"unimplemented opcode %s",
2362 case DW_OP_LLVM_user:
2363 if (op->getSubCode() == DW_OP_LLVM_piece_end) {
2364 if (op->getEndOffset() != expr_data.size())
2365 return llvm::createStringError(
2366 "DW_OP_LLVM_piece_end is only supported at the end of an "
2381 if (eval_ctx.dwarf_cu) {
2382 const uint64_t operands_offset = op_offset + 1;
2383 uint64_t offset = operands_offset;
2385 opcode, expr_data, offset, eval_ctx.reg_ctx, eval_ctx.reg_kind,
2394 assert(offset >= op->getEndOffset());
2395 uint64_t offset_to_next_op = offset - op->getEndOffset();
2396 op = op.skipBytes(offset_to_next_op);
2400 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
2406 if (stack.empty()) {
2410 return eval_ctx.pieces;
2412 return llvm::createStringError(
"stack empty after evaluation");
2419 size_t count = stack.size();
2420 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
2421 static_cast<uint64_t
>(count));
2422 for (
size_t i = 0; i < count; ++i) {
2424 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2425 stack[i].Dump(&new_value);
2429 return stack.back();