1022 const Value *object_address_ptr) {
1024 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1025 llvm::DWARFExpression expr(expr_data, address_size);
1027 if (expr_data.size() == 0)
1028 return llvm::createStringError(
1029 "no location, value may have been optimized out");
1035 Target *target =
nullptr;
1042 if (reg_ctx ==
nullptr && frame)
1045 if (initial_value_ptr)
1046 stack.push_back(*initial_value_ptr);
1052 uint64_t op_piece_offset = 0;
1060 auto to_generic = [&](
auto v) {
1063 bool is_signed = std::is_signed<
decltype(v)>::value;
1064 return Scalar(llvm::APSInt(
1065 llvm::APInt(8 * address_size, v, is_signed,
true),
1072 LocationDescriptionKind dwarf4_location_description_kind =
Memory;
1074 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1075 while (op != op_end) {
1076 const uint64_t op_offset = op.getOffset();
1077 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1080 size_t count = stack.size();
1081 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1082 static_cast<uint64_t
>(count));
1083 for (
size_t i = 0; i < count; ++i) {
1085 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1086 stack[i].Dump(&new_value);
1089 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1093 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1094 if (stack.size() < *arity)
1095 return llvm::createStringError(
1096 "%s needs at least %d stack entries (stack has %d entries)",
1104 stack.push_back(
Scalar(op->getRawOperand(0)));
1159 size_t size = address_size;
1161 stack, exe_ctx, module_sp, process, target, size, size,
1162 dwarf4_location_description_kind))
1178 case DW_OP_deref_size: {
1179 size_t size = op->getRawOperand(0);
1181 stack, exe_ctx, module_sp, process, target, size, address_size,
1182 dwarf4_location_description_kind))
1201 case DW_OP_xderef_size:
1202 return llvm::createStringError(
"unimplemented opcode: DW_OP_xderef_size");
1214 return llvm::createStringError(
"unimplemented opcode: DW_OP_xderef");
1230 stack.push_back(to_generic(op->getRawOperand(0)));
1233 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1236 stack.push_back(to_generic(op->getRawOperand(0)));
1239 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1242 stack.push_back(to_generic(op->getRawOperand(0)));
1245 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1248 stack.push_back(to_generic(op->getRawOperand(0)));
1251 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1256 stack.push_back(
Scalar(op->getRawOperand(0)));
1259 stack.push_back(
Scalar(
static_cast<int64_t
>(op->getRawOperand(0))));
1266 if (stack.empty()) {
1267 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1269 stack.push_back(stack.back());
1276 if (stack.empty()) {
1277 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1287 stack.push_back(stack[stack.size() - 2]);
1295 uint8_t pick_idx = op->getRawOperand(0);
1296 if (pick_idx < stack.size())
1297 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1299 return llvm::createStringError(
1300 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1311 stack.back() = stack[stack.size() - 2];
1312 stack[stack.size() - 2] = tmp;
1322 size_t last_idx = stack.size() - 1;
1323 Value old_top = stack[last_idx];
1324 stack[last_idx] = stack[last_idx - 1];
1325 stack[last_idx - 1] = stack[last_idx - 2];
1326 stack[last_idx - 2] = old_top;
1335 if (!stack.back().GetScalar().AbsoluteValue()) {
1336 return llvm::createStringError(
1337 "failed to take the absolute value of the first stack item");
1348 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1359 return llvm::createStringError(
"divide by zero");
1362 Scalar divisor, dividend;
1364 dividend = stack.back().GetScalar();
1367 stack.back() = dividend / divisor;
1369 if (!stack.back().GetScalar().IsValid())
1370 return llvm::createStringError(
"divide failed");
1380 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1391 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1401 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1408 if (!stack.back().GetScalar().UnaryNegate())
1409 return llvm::createStringError(
"unary negate failed");
1417 if (!stack.back().GetScalar().OnesComplement())
1418 return llvm::createStringError(
"logical NOT failed");
1428 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1438 stack.back().GetScalar() += tmp.
GetScalar();
1445 case DW_OP_plus_uconst: {
1446 const uint64_t uconst_value = op->getRawOperand(0);
1448 stack.back().GetScalar() += uconst_value;
1449 if (!stack.back().GetScalar().IsValid())
1450 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1461 stack.back().GetScalar() <<= tmp.
GetScalar();
1472 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1473 return llvm::createStringError(
"DW_OP_shr failed");
1485 stack.back().GetScalar() >>= tmp.
GetScalar();
1495 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1505 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1510 if (new_offset <= expr_data.size()) {
1511 op = op.skipBytes(skip_offset);
1514 return llvm::createStringErrorV(
1515 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1516 op->getEndOffset(), skip_offset, expr_data.size());
1529 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1536 if (new_offset <= expr_data.size()) {
1537 op = op.skipBytes(bra_offset);
1540 return llvm::createStringErrorV(
1541 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1542 op->getEndOffset(), bra_offset, expr_data.size());
1556 stack.back().GetScalar() = stack.back().GetScalar() == tmp.
GetScalar();
1569 stack.back().GetScalar() = stack.back().GetScalar() >= tmp.
GetScalar();
1582 stack.back().GetScalar() = stack.back().GetScalar() > tmp.
GetScalar();
1595 stack.back().GetScalar() = stack.back().GetScalar() <= tmp.
GetScalar();
1608 stack.back().GetScalar() = stack.back().GetScalar() < tmp.
GetScalar();
1621 stack.back().GetScalar() = stack.back().GetScalar() != tmp.
GetScalar();
1661 stack.push_back(to_generic(opcode - DW_OP_lit0));
1699 dwarf4_location_description_kind = Register;
1700 reg_num = opcode - DW_OP_reg0;
1702 if (llvm::Error err =
1705 stack.push_back(tmp);
1712 dwarf4_location_description_kind = Register;
1713 reg_num = op->getRawOperand(0);
1715 if (llvm::Error err =
1718 stack.push_back(tmp);
1757 case DW_OP_breg31: {
1758 reg_num = opcode - DW_OP_breg0;
1759 if (llvm::Error err =
1763 int64_t breg_offset = op->getRawOperand(0);
1764 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1766 stack.push_back(tmp);
1776 reg_num = op->getRawOperand(0);
1777 if (llvm::Error err =
1781 int64_t breg_offset = op->getRawOperand(1);
1782 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1784 stack.push_back(tmp);
1794 int64_t fbreg_offset = op->getRawOperand(0);
1795 value += fbreg_offset;
1796 stack.push_back(value);
1799 return llvm::createStringError(
1800 "invalid stack frame in context for DW_OP_fbreg opcode");
1803 return llvm::createStringError(
1804 "NULL execution context for DW_OP_fbreg");
1830 LocationDescriptionKind piece_locdesc = dwarf4_location_description_kind;
1832 dwarf4_location_description_kind =
Memory;
1834 const uint64_t piece_byte_size = op->getRawOperand(0);
1836 if (piece_byte_size > 0) {
1839 if (stack.empty()) {
1840 UpdateValueTypeFromLocationDescription(
1841 log, dwarf_cu, LocationDescriptionKind::Empty);
1855 Value curr_piece_source_value(stack.back());
1857 UpdateValueTypeFromLocationDescription(log, dwarf_cu, piece_locdesc,
1858 &curr_piece_source_value);
1864 switch (curr_piece_source_value_type) {
1866 return llvm::createStringError(
"invalid value type");
1873 return llvm::createStringError(
1874 "unable to convert file address 0x%" PRIx64
1876 "for DW_OP_piece(%" PRIu64
"): "
1877 "no target available",
1878 addr, piece_byte_size);
1883 if (curr_piece.
ResizeData(piece_byte_size) == piece_byte_size) {
1886 piece_byte_size,
error,
1887 false) != piece_byte_size) {
1888 const char *addr_type = (curr_piece_source_value_type ==
1892 return llvm::createStringError(
1893 "failed to read memory DW_OP_piece(%" PRIu64
1894 ") from %s address 0x%" PRIx64,
1895 piece_byte_size, addr_type, addr);
1898 return llvm::createStringError(
1899 "failed to resize the piece memory buffer for "
1900 "DW_OP_piece(%" PRIu64
")",
1906 return llvm::createStringError(
1907 "failed to read memory DW_OP_piece(%" PRIu64
1908 ") from host address 0x%" PRIx64,
1909 piece_byte_size, addr);
1913 uint32_t bit_size = piece_byte_size * 8;
1914 uint32_t bit_offset = 0;
1916 return llvm::createStringError(
1917 "unable to extract %" PRIu64
" bytes from a %" PRIu64
1918 " byte scalar value.",
1933 if (op_piece_offset == 0) {
1938 return llvm::createStringError(
"failed to append piece data");
1944 return llvm::createStringError(
1945 "DW_OP_piece for offset %" PRIu64
1946 " but top of stack is of size %" PRIu64,
1951 return llvm::createStringError(
"failed to append piece data");
1954 op_piece_offset += piece_byte_size;
1958 case DW_OP_bit_piece:
1959 if (stack.size() < 1) {
1960 UpdateValueTypeFromLocationDescription(log, dwarf_cu,
1961 LocationDescriptionKind::Empty);
1963 dwarf4_location_description_kind =
Memory;
1964 return llvm::createStringError(
1965 "expression stack needs at least 1 item for DW_OP_bit_piece");
1967 UpdateValueTypeFromLocationDescription(
1968 log, dwarf_cu, dwarf4_location_description_kind, &stack.back());
1970 dwarf4_location_description_kind =
Memory;
1971 const uint64_t piece_bit_size = op->getRawOperand(0);
1972 const uint64_t piece_bit_offset = op->getRawOperand(1);
1973 switch (stack.back().GetValueType()) {
1975 return llvm::createStringError(
1976 "unable to extract bit value from invalid value");
1978 if (!stack.back().GetScalar().ExtractBitfield(piece_bit_size,
1979 piece_bit_offset)) {
1980 return llvm::createStringError(
1981 "unable to extract %" PRIu64
" bit value with %" PRIu64
1982 " bit offset from a %" PRIu64
" bit scalar value.",
1983 piece_bit_size, piece_bit_offset,
1984 (uint64_t)(stack.back().GetScalar().GetByteSize() * 8));
1991 return llvm::createStringError(
1992 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
1993 ", bit_offset = %" PRIu64
") from an address value.",
1994 piece_bit_size, piece_bit_offset);
2006 case DW_OP_implicit_value: {
2007 dwarf4_location_description_kind = Implicit;
2011 const uint64_t block_size = op->getRawOperand(0);
2012 uint64_t block_offset = op->getRawOperand(1);
2014 llvm::Error
error = llvm::Error::success();
2015 llvm::StringRef block_data =
2016 expr_data.getBytes(&block_offset, block_size, &
error);
2021 Value result(block_data.data(), block_data.size());
2022 stack.push_back(result);
2026 case DW_OP_implicit_pointer: {
2027 dwarf4_location_description_kind = Implicit;
2028 return llvm::createStringError(
"could not evaluate %s",
2040 case DW_OP_push_object_address:
2041 if (object_address_ptr)
2042 stack.push_back(*object_address_ptr);
2044 return llvm::createStringError(
"DW_OP_push_object_address used without "
2045 "specifying an object address");
2068 return llvm::createStringError(
"unimplemented opcode DW_OP_call2");
2089 return llvm::createStringError(
"unimplemented opcode DW_OP_call4");
2096 case DW_OP_stack_value:
2097 dwarf4_location_description_kind = Implicit;
2108 case DW_OP_convert: {
2109 const uint64_t relative_die_offset = op->getRawOperand(0);
2112 if (relative_die_offset == 0) {
2117 return llvm::createStringError(
"no module");
2119 bit_size = module_sp->GetArchitecture().GetAddressByteSize() * 8;
2121 return llvm::createStringError(
"unspecified architecture");
2123 auto bit_size_sign_or_err =
2125 if (!bit_size_sign_or_err)
2126 return bit_size_sign_or_err.takeError();
2127 bit_size = bit_size_sign_or_err->first;
2128 sign = bit_size_sign_or_err->second;
2130 Scalar &top = stack.back().GetScalar();
2140 case DW_OP_call_frame_cfa:
2145 addr_t cfa =
id.GetCallFrameAddressWithMetadata();
2147 stack.push_back(
Scalar(cfa));
2150 return llvm::createStringError(
2151 "stack frame does not include a canonical "
2152 "frame address for DW_OP_call_frame_cfa "
2156 return llvm::createStringError(
"unvalid stack frame in context for "
2157 "DW_OP_call_frame_cfa opcode");
2167 case DW_OP_form_tls_address:
2168 case DW_OP_GNU_push_tls_address: {
2169 if (stack.size() < 1) {
2170 if (opcode == DW_OP_form_tls_address)
2171 return llvm::createStringError(
2172 "DW_OP_form_tls_address needs an argument");
2174 return llvm::createStringError(
2175 "DW_OP_GNU_push_tls_address needs an argument");
2178 if (!exe_ctx || !module_sp)
2179 return llvm::createStringError(
"no context to evaluate TLS within");
2183 return llvm::createStringError(
"no thread to evaluate TLS within");
2186 const addr_t tls_file_addr =
2188 const addr_t tls_load_addr =
2189 thread->GetThreadLocalData(module_sp, tls_file_addr);
2192 return llvm::createStringError(
2193 "no TLS data currently exists for this thread");
2195 stack.back().GetScalar() = tls_load_addr;
2206 case DW_OP_GNU_addr_index: {
2208 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
2209 "compile unit being specified");
2210 uint64_t index = op->getRawOperand(0);
2212 stack.push_back(
Scalar(value));
2230 case DW_OP_GNU_const_index: {
2232 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
2233 "compile unit being specified");
2235 uint64_t index = op->getRawOperand(0);
2237 stack.push_back(
Scalar(value));
2240 case DW_OP_GNU_entry_value:
2241 case DW_OP_entry_value: {
2246 const uint64_t block_size = op->getRawOperand(0);
2247 uint64_t block_offset = op->getEndOffset();
2249 llvm::Error
error = llvm::Error::success();
2250 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
2251 expr_data.getBytes(&block_offset, block_size, &
error));
2258 return llvm::createStringError(
2259 "could not evaluate DW_OP_entry_value: %s",
2260 llvm::toString(std::move(err)).c_str());
2264 op = op.skipBytes(block_size);
2270 const uint64_t operands_offset = op_offset + 1;
2271 uint64_t offset = operands_offset;
2281 assert(offset >= op->getEndOffset());
2282 uint64_t offset_to_next_op = offset - op->getEndOffset();
2283 op = op.skipBytes(offset_to_next_op);
2287 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
2293 if (stack.empty()) {
2299 return llvm::createStringError(
"stack empty after evaluation");
2302 UpdateValueTypeFromLocationDescription(
2303 log, dwarf_cu, dwarf4_location_description_kind, &stack.back());
2306 size_t count = stack.size();
2307 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
2308 static_cast<uint64_t
>(count));
2309 for (
size_t i = 0; i < count; ++i) {
2311 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2312 stack[i].Dump(&new_value);
2316 return stack.back();