45#include "llvm/DebugInfo/DWARF/DWARFExpressionPrinter.h"
46#include "llvm/DebugInfo/DWARF/LowLevel/DWARFExpression.h"
47#include "llvm/Support/ErrorExtras.h"
52using namespace llvm::dwarf;
58enum LocationDescriptionKind {
70 ExecutionContext *exe_ctx;
71 RegisterContext *reg_ctx;
73 const DWARFExpression::Delegate *dwarf_cu;
75 const Value *initial_value_ptr;
76 const Value *object_address_ptr;
79 StackFrame *frame =
nullptr;
83 std::vector<Value> stack;
85 uint64_t op_piece_offset = 0;
86 LocationDescriptionKind loc_desc_kind =
Memory;
89 EvalContext(ExecutionContext *exe_ctx, RegisterContext *reg_ctx,
91 const DWARFExpression::Delegate *dwarf_cu,
93 const Value *object_address_ptr)
94 : exe_ctx(exe_ctx), reg_ctx(reg_ctx), module_sp(std::move(module_sp)),
95 dwarf_cu(dwarf_cu), reg_kind(reg_kind),
96 initial_value_ptr(initial_value_ptr),
97 object_address_ptr(object_address_ptr) {
99 process = exe_ctx->GetProcessPtr();
100 frame = exe_ctx->GetFramePtr();
101 target = exe_ctx->GetTargetPtr();
103 if (this->reg_ctx ==
nullptr && frame)
104 this->reg_ctx = frame->GetRegisterContext().get();
121 uint8_t addr_byte_size) {
122 if (!const_value_byte_size)
128 m_data.SetAddressByteSize(addr_byte_size);
133 llvm::DIDumpOptions options)
const {
135 auto GetRegName = [&MCRegInfo](uint64_t DwarfRegNum,
136 bool IsEH) -> llvm::StringRef {
139 if (std::optional<unsigned> LLVMRegNum =
140 MCRegInfo->getLLVMRegNum(DwarfRegNum, IsEH))
141 if (
const char *RegName = MCRegInfo->getName(*LLVMRegNum))
142 return llvm::StringRef(RegName);
145 options.GetNameForDWARFReg = GetRegName;
146 llvm::DWARFExpression E(
m_data.GetAsLLVM(),
m_data.GetAddressByteSize());
147 llvm::printDwarfExpression(&E, s->
AsRawOstream(), options,
nullptr);
159 uint32_t reg_num,
Value &value) {
160 if (reg_ctx ==
nullptr)
161 return llvm::createStringError(
"no register context in frame");
163 const uint32_t native_reg =
166 return llvm::createStringError(
167 "unable to convert register kind=%u reg_num=%u to a native "
178 return llvm::Error::success();
183 return llvm::createStringError(
184 "register %s can't be converted to a scalar value", reg_info->
name);
187 return llvm::createStringError(
"register %s is not available",
195 const LocationAtom op,
200 case DW_OP_LLVM_fragment:
201 case DW_OP_LLVM_convert:
202 case DW_OP_LLVM_tag_offset:
203 case DW_OP_LLVM_entry_value:
204 case DW_OP_LLVM_implicit_pointer:
206 case DW_OP_LLVM_extract_bits_sext:
207 case DW_OP_LLVM_extract_bits_zext:
210 case DW_OP_HP_is_value:
211 case DW_OP_HP_fltconst4:
212 case DW_OP_HP_fltconst8:
213 case DW_OP_HP_mod_range:
214 case DW_OP_HP_unmod_range:
216 case DW_OP_INTEL_bit_piece:
217 case DW_OP_WASM_location:
218 case DW_OP_WASM_location_int:
219 case DW_OP_APPLE_uninit:
220 case DW_OP_PGI_omp_thread_num:
222 case DW_OP_GNU_implicit_pointer:
322 case DW_OP_push_object_address:
323 case DW_OP_form_tls_address:
324 case DW_OP_call_frame_cfa:
325 case DW_OP_stack_value:
326 case DW_OP_GNU_push_tls_address:
333 case DW_OP_deref_size:
334 case DW_OP_xderef_size:
335 case DW_OP_deref_type:
360 case DW_OP_plus_uconst:
397 case DW_OP_reinterpret:
400 case DW_OP_xderef_type:
401 case DW_OP_GNU_addr_index:
402 case DW_OP_GNU_const_index:
404 return offset - data_offset;
408 case DW_OP_bit_piece:
409 case DW_OP_regval_type:
412 return offset - data_offset;
414 case DW_OP_implicit_value:
419 return offset - data_offset;
422 case DW_OP_implicit_pointer:
430 case DW_OP_GNU_entry_value:
431 case DW_OP_entry_value:
433 uint64_t subexpr_len = data.
GetULEB128(&offset);
434 return (offset - data_offset) + subexpr_len;
437 case DW_OP_const_type:
440 uint8_t length = data.
GetU8(&offset);
441 return (offset - data_offset) + length;
444 case DW_OP_LLVM_user:
446 uint64_t constants = data.
GetULEB128(&offset);
447 return (offset - data_offset) + constants;
458 static char invalid[100];
459 llvm::StringRef llvmstr = llvm::dwarf::OperationEncodingString(val);
460 if (llvmstr.empty()) {
461 snprintf(invalid,
sizeof(invalid),
"Unknown DW_OP constant: 0x%x", val);
464 return llvmstr.data();
470 while (
m_data.ValidOffset(offset)) {
471 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
473 if (op == DW_OP_addr)
474 return m_data.GetAddress(&offset);
476 if (op == DW_OP_GNU_addr_index || op == DW_OP_addrx) {
477 const uint64_t index =
m_data.GetULEB128(&offset);
480 return llvm::createStringError(
"cannot evaluate %s without a DWARF unit",
487 return llvm::createStringError(
"cannot get opcode data size for %s",
490 offset += op_arg_size;
499 while (
m_data.ValidOffset(offset)) {
500 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
502 if (op == DW_OP_addr) {
503 const uint32_t addr_byte_size =
m_data.GetAddressByteSize();
513 m_data.GetByteOrder(), addr_byte_size);
524 if (op == DW_OP_addrx) {
528 llvm::ArrayRef data_before_op =
m_data.GetData().take_front(offset - 1);
532 m_data.GetULEB128(&offset);
533 if (old_offset == offset)
535 llvm::ArrayRef data_after_op =
m_data.GetData().drop_front(offset);
549 offset += op_arg_size;
557 while (
m_data.ValidOffset(offset)) {
558 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
560 if (op == DW_OP_form_tls_address || op == DW_OP_GNU_push_tls_address)
566 offset += op_arg_size;
573 &link_address_callback) {
574 const uint32_t addr_byte_size =
m_data.GetAddressByteSize();
582 m_data.GetByteOrder(), addr_byte_size);
587 size_t const_byte_size = 0;
588 while (
m_data.ValidOffset(offset)) {
589 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
591 bool decoded_data =
false;
596 const_offset = offset;
597 const_value =
m_data.GetU32(&offset);
605 const_offset = offset;
606 const_value =
m_data.GetU64(&offset);
611 case DW_OP_form_tls_address:
612 case DW_OP_GNU_push_tls_address:
623 if (const_byte_size > 0) {
624 lldb::addr_t linked_file_addr = link_address_callback(const_value);
628 if (encoder.
PutUnsigned(const_offset, const_byte_size,
647 offset += op_arg_size;
656 llvm::ArrayRef<uint8_t> subexpr) {
705 return llvm::createStringError(
"no exe/reg context");
710 if (!current_frame || !thread)
711 return llvm::createStringError(
"no current frame/thread");
718 for (uint32_t parent_frame_idx = current_frame_idx + 1;; parent_frame_idx++) {
719 parent_frame = thread->GetStackFrameAtIndex(parent_frame_idx);
728 return_pc = parent_frame->GetFrameCodeAddress().GetLoadAddress(&target);
729 LLDB_LOG(log,
"immediate ancestor with pc = {0:x}", return_pc);
734 if (parent_frame->IsInlined())
740 if (!parent_frame || !parent_frame->GetRegisterContext()) {
741 return llvm::createStringError(
"no parent frame with reg ctx");
745 parent_frame->GetSymbolContext(eSymbolContextFunction).function;
747 return llvm::createStringError(
"no parent function");
754 return llvm::createStringError(
"no current function");
760 if (!parent_frame->IsArtificial()) {
765 return llvm::createStringErrorV(
766 "no call edge for retn-pc = {0:x} in parent frame {1}", return_pc,
770 if (callee_func != current_func) {
771 return llvm::createStringError(
772 "ambiguous call sequence, can't find real parent frame");
779 if (edge->GetCallee(modlist, parent_exe_ctx) == current_func) {
780 call_edge = edge.get();
786 return llvm::createStringError(
"no unambiguous edge from parent "
787 "to current function");
795 if (!param.LocationInCallee.GetExpressionData(param_subexpr_extractor))
798 const void *param_subexpr_data =
799 param_subexpr_extractor.
GetData(¶m_subexpr_offset, subexpr.size());
800 if (!param_subexpr_data ||
801 param_subexpr_extractor.
BytesLeft(param_subexpr_offset) != 0)
811 if (memcmp(subexpr.data(), param_subexpr_data, subexpr.size()) == 0) {
812 matched_param = ¶m;
817 return llvm::createStringError(
"no matching call site param found");
825 llvm::Expected<Value> maybe_result = param_expr.
Evaluate(
826 &parent_exe_ctx, parent_frame->GetRegisterContext().get(),
832 "Evaluate_DW_OP_entry_value: call site param evaluation failed");
833 return maybe_result.takeError();
836 eval_ctx.stack.push_back(*maybe_result);
837 return llvm::Error::success();
842 LocationDescriptionKind kind,
843 Value *value =
nullptr) {
850 if (eval_ctx.dwarf_cu && eval_ctx.dwarf_cu->
GetVersion() >= 4) {
852 const char *log_msg =
"DWARF location description kind: %s";
889static llvm::Expected<lldb::addr_t>
892 bool check_sectionoffset =
false) {
893 if (!eval_ctx.module_sp)
894 return llvm::createStringError(
"need module to resolve file address for %s",
897 if (!eval_ctx.module_sp->ResolveFileAddress(file_addr, so_addr))
898 return llvm::createStringError(
"failed to resolve file address in module");
904 return llvm::createStringError(
"failed to resolve load address");
917 size_t size_addr_bytes,
919 DataExtractor addr_data(addr_bytes, size_addr_bytes, byte_order, size);
923 return addr_data.
GetMaxU64(&addr_data_offset, size);
924 return addr_data.
GetAddress(&addr_data_offset);
928 LocationAtom opcode,
unsigned size,
929 size_t size_addr_bytes) {
931 if (eval_ctx.stack.empty())
932 return llvm::createStringError(
"expression stack empty for %s", op_name);
935 return llvm::createStringError(
"Invalid address size for %s: %u", op_name,
938 if (opcode == DW_OP_deref_size && size > size_addr_bytes)
939 return llvm::createStringError(
940 "DW_OP_deref_size size (%u) exceeds address size (%zu)", size,
946 if (eval_ctx.loc_desc_kind == Register ||
947 eval_ctx.loc_desc_kind == Implicit) {
949 eval_ctx.loc_desc_kind =
Memory;
950 eval_ctx.stack.back().ClearContext();
954 Scalar scalar = eval_ctx.stack.back().GetScalar();
958 eval_ctx.stack.back().GetScalar() = scalar;
959 return llvm::Error::success();
963 switch (value_type) {
965 void *src = (
void *)eval_ctx.stack.back().GetScalar().ULongLong();
967 ::memcpy(&ptr, src,
sizeof(
void *));
979 ptr = ptr & 0xffffff;
982 ptr = ptr & 0xffffffff;
988 ptr = (intptr_t)ptr & 0xffffffffffULL;
991 ptr = (intptr_t)ptr & 0xffffffffffffULL;
994 ptr = (intptr_t)ptr & 0xffffffffffffffULL;
999 eval_ctx.stack.back().GetScalar() = ptr;
1000 eval_ctx.stack.back().ClearContext();
1006 auto maybe_load_addr =
1010 if (!maybe_load_addr)
1011 return maybe_load_addr.takeError();
1013 addr_t load_addr = *maybe_load_addr;
1016 uint8_t addr_bytes[8];
1019 if (!eval_ctx.target ||
1022 return llvm::createStringError(
"failed to dereference pointer for %s: "
1024 op_name,
error.AsCString());
1026 ObjectFile *objfile = eval_ctx.module_sp->GetObjectFile();
1030 eval_ctx.stack.back().ClearContext();
1033 eval_ctx.stack.back().GetScalar() = load_addr;
1043 if (!eval_ctx.exe_ctx)
1044 return llvm::createStringError(
"no execution context for %s", op_name);
1045 if (!eval_ctx.process)
1046 return llvm::createStringError(
"no process for %s", op_name);
1053 if (eval_ctx.process->
ReadMemory(pointer_addr, &addr_bytes, size,
error) !=
1055 return llvm::createStringError(
1056 "failed to dereference pointer from 0x%" PRIx64
" for %s: %s\n",
1057 pointer_addr, op_name,
error.AsCString());
1060 addr_bytes,
sizeof(addr_bytes), eval_ctx.process->
GetByteOrder(), size);
1061 eval_ctx.stack.back().ClearContext();
1065 return llvm::createStringError(
"invalid value for %s", op_name);
1068 return llvm::Error::success();
1072 uint64_t piece_byte_size) {
1073 LocationDescriptionKind piece_locdesc = eval_ctx.loc_desc_kind;
1075 eval_ctx.loc_desc_kind =
Memory;
1077 if (piece_byte_size == 0)
1078 return llvm::Error::success();
1082 if (eval_ctx.stack.empty()) {
1084 LocationDescriptionKind::Empty);
1098 Value curr_piece_source_value(eval_ctx.stack.back());
1099 eval_ctx.stack.pop_back();
1101 &curr_piece_source_value);
1107 switch (curr_piece_source_value_type) {
1109 return llvm::createStringError(
"invalid value type");
1111 if (eval_ctx.target) {
1116 return llvm::createStringError(
1117 "unable to convert file address 0x%" PRIx64
" to load address "
1118 "for DW_OP_piece(%" PRIu64
"): "
1119 "no target available",
1120 addr, piece_byte_size);
1124 if (eval_ctx.target) {
1125 if (curr_piece.
ResizeData(piece_byte_size) == piece_byte_size) {
1128 piece_byte_size,
error,
1129 false) != piece_byte_size) {
1130 const char *addr_type =
1134 return llvm::createStringError(
1135 "failed to read memory DW_OP_piece(%" PRIu64
1136 ") from %s address 0x%" PRIx64,
1137 piece_byte_size, addr_type, addr);
1140 return llvm::createStringError(
1141 "failed to resize the piece memory buffer for "
1142 "DW_OP_piece(%" PRIu64
")",
1148 return llvm::createStringError(
1149 "failed to read memory DW_OP_piece(%" PRIu64
1150 ") from host address 0x%" PRIx64,
1151 piece_byte_size, addr);
1155 uint32_t bit_size = piece_byte_size * 8;
1156 uint32_t bit_offset = 0;
1158 return llvm::createStringError(
1159 "unable to extract %" PRIu64
" bytes from a %" PRIu64
1160 " byte scalar value.",
1175 if (eval_ctx.op_piece_offset == 0) {
1180 return llvm::createStringError(
"failed to append piece data");
1186 eval_ctx.op_piece_offset) {
1187 return llvm::createStringError(
1188 "DW_OP_piece for offset %" PRIu64
1189 " but top of stack is of size %" PRIu64,
1190 eval_ctx.op_piece_offset,
1195 return llvm::createStringError(
"failed to append piece data");
1198 eval_ctx.op_piece_offset += piece_byte_size;
1199 return llvm::Error::success();
1203 uint64_t relative_die_offset) {
1206 if (relative_die_offset == 0) {
1210 if (!eval_ctx.module_sp)
1211 return llvm::createStringError(
"no module");
1213 bit_size = eval_ctx.module_sp->GetArchitecture().GetAddressByteSize() * 8;
1215 return llvm::createStringError(
"unspecified architecture");
1217 auto bit_size_sign_or_err =
1219 if (!bit_size_sign_or_err)
1220 return bit_size_sign_or_err.takeError();
1221 bit_size = bit_size_sign_or_err->first;
1222 sign = bit_size_sign_or_err->second;
1224 eval_ctx.stack.back().GetScalar().TruncOrExtendTo(bit_size, sign);
1225 return llvm::Error::success();
1229 LocationAtom opcode) {
1230 if (eval_ctx.stack.empty())
1231 return llvm::createStringError(
"%s needs an argument",
1232 opcode == DW_OP_form_tls_address
1233 ?
"DW_OP_form_tls_address"
1234 :
"DW_OP_GNU_push_tls_address");
1236 if (!eval_ctx.exe_ctx || !eval_ctx.module_sp)
1237 return llvm::createStringError(
"no context to evaluate TLS within");
1241 return llvm::createStringError(
"no thread to evaluate TLS within");
1244 const addr_t tls_file_addr =
1246 const addr_t tls_load_addr =
1247 thread->GetThreadLocalData(eval_ctx.module_sp, tls_file_addr);
1250 return llvm::createStringError(
1251 "no TLS data currently exists for this thread");
1253 eval_ctx.stack.back().GetScalar() = tls_load_addr;
1255 return llvm::Error::success();
1259 int64_t fbreg_offset) {
1260 if (!eval_ctx.exe_ctx)
1261 return llvm::createStringError(
"NULL execution context for DW_OP_fbreg");
1262 if (!eval_ctx.frame)
1263 return llvm::createStringError(
1264 "invalid stack frame in context for DW_OP_fbreg opcode");
1269 value += fbreg_offset;
1270 eval_ctx.stack.push_back(value);
1272 return llvm::Error::success();
1276 if (!eval_ctx.frame)
1277 return llvm::createStringError(
1278 "invalid stack frame in context for DW_OP_call_frame_cfa opcode");
1283 addr_t cfa =
id.GetCallFrameAddressWithMetadata();
1285 return llvm::createStringError(
"stack frame does not include a canonical "
1286 "frame address for DW_OP_call_frame_cfa "
1289 eval_ctx.stack.push_back(
Scalar(cfa));
1291 return llvm::Error::success();
1299 const Value *object_address_ptr) {
1301 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1302 llvm::DWARFExpression expr(expr_data, address_size);
1304 if (expr_data.size() == 0)
1305 return llvm::createStringError(
1306 "no location, value may have been optimized out");
1308 EvalContext eval_ctx(exe_ctx, reg_ctx, std::move(module_sp), dwarf_cu,
1309 reg_kind, initial_value_ptr, object_address_ptr);
1311 Stack &stack = eval_ctx.stack;
1313 if (initial_value_ptr)
1314 stack.push_back(*initial_value_ptr);
1324 auto to_generic = [&](
auto v) {
1327 bool is_signed = std::is_signed<
decltype(v)>::value;
1328 return Scalar(llvm::APSInt(
1329 llvm::APInt(8 * address_size, v, is_signed,
true),
1333 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1334 while (op != op_end) {
1335 const uint64_t op_offset = op.getOffset();
1336 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1339 size_t count = stack.size();
1340 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1341 static_cast<uint64_t
>(count));
1342 for (
size_t i = 0; i < count; ++i) {
1344 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1345 stack[i].Dump(&new_value);
1348 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1352 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1353 if (stack.size() < *arity)
1354 return llvm::createStringError(
1355 "%s needs at least %d stack entries (stack has %d entries)",
1361 stack.push_back(
Scalar(op->getRawOperand(0)));
1373 size_t size = address_size;
1378 case DW_OP_deref_size: {
1379 size_t size = op->getRawOperand(0);
1380 if (llvm::Error err =
1385 case DW_OP_xderef_size:
1386 return llvm::createStringError(
"unimplemented opcode: DW_OP_xderef_size");
1388 return llvm::createStringError(
"unimplemented opcode: DW_OP_xderef");
1391 stack.push_back(to_generic(op->getRawOperand(0)));
1394 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1397 stack.push_back(to_generic(op->getRawOperand(0)));
1400 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1403 stack.push_back(to_generic(op->getRawOperand(0)));
1406 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1409 stack.push_back(to_generic(op->getRawOperand(0)));
1412 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1417 stack.push_back(
Scalar(op->getRawOperand(0)));
1420 stack.push_back(
Scalar(
static_cast<int64_t
>(op->getRawOperand(0))));
1424 if (stack.empty()) {
1425 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1427 stack.push_back(stack.back());
1431 if (stack.empty()) {
1432 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1438 stack.push_back(stack[stack.size() - 2]);
1442 uint8_t pick_idx = op->getRawOperand(0);
1443 if (pick_idx < stack.size())
1444 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1446 return llvm::createStringError(
1447 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1453 stack.back() = stack[stack.size() - 2];
1454 stack[stack.size() - 2] = tmp;
1458 size_t last_idx = stack.size() - 1;
1459 Value old_top = stack[last_idx];
1460 stack[last_idx] = stack[last_idx - 1];
1461 stack[last_idx - 1] = stack[last_idx - 2];
1462 stack[last_idx - 2] = old_top;
1466 if (!stack.back().GetScalar().AbsoluteValue()) {
1467 return llvm::createStringError(
1468 "failed to take the absolute value of the first stack item");
1475 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1481 return llvm::createStringError(
"divide by zero");
1484 Scalar divisor, dividend;
1486 dividend = stack.back().GetScalar();
1489 stack.back() = dividend / divisor;
1491 if (!stack.back().GetScalar().IsValid())
1492 return llvm::createStringError(
"divide failed");
1498 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1504 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1510 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1514 if (!stack.back().GetScalar().UnaryNegate())
1515 return llvm::createStringError(
"unary negate failed");
1519 if (!stack.back().GetScalar().OnesComplement())
1520 return llvm::createStringError(
"logical NOT failed");
1526 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1532 stack.back().GetScalar() += tmp.
GetScalar();
1535 case DW_OP_plus_uconst: {
1536 const uint64_t uconst_value = op->getRawOperand(0);
1538 stack.back().GetScalar() += uconst_value;
1539 if (!stack.back().GetScalar().IsValid())
1540 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1546 stack.back().GetScalar() <<= tmp.
GetScalar();
1552 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1553 return llvm::createStringError(
"DW_OP_shr failed");
1559 stack.back().GetScalar() >>= tmp.
GetScalar();
1565 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1569 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1574 if (new_offset <= expr_data.size()) {
1575 op = op.skipBytes(skip_offset);
1578 return llvm::createStringErrorV(
1579 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1580 op->getEndOffset(), skip_offset, expr_data.size());
1586 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1593 if (new_offset <= expr_data.size()) {
1594 op = op.skipBytes(bra_offset);
1597 return llvm::createStringErrorV(
1598 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1599 op->getEndOffset(), bra_offset, expr_data.size());
1606 stack.back().GetScalar() = stack.back().GetScalar() == tmp.
GetScalar();
1612 stack.back().GetScalar() = stack.back().GetScalar() >= tmp.
GetScalar();
1618 stack.back().GetScalar() = stack.back().GetScalar() > tmp.
GetScalar();
1624 stack.back().GetScalar() = stack.back().GetScalar() <= tmp.
GetScalar();
1630 stack.back().GetScalar() = stack.back().GetScalar() < tmp.
GetScalar();
1636 stack.back().GetScalar() = stack.back().GetScalar() != tmp.
GetScalar();
1671 stack.push_back(to_generic(opcode - DW_OP_lit0));
1706 eval_ctx.loc_desc_kind = Register;
1707 reg_num = opcode - DW_OP_reg0;
1710 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1712 stack.push_back(tmp);
1715 eval_ctx.loc_desc_kind = Register;
1716 reg_num = op->getRawOperand(0);
1719 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1721 stack.push_back(tmp);
1755 case DW_OP_breg31: {
1756 reg_num = opcode - DW_OP_breg0;
1758 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1761 int64_t breg_offset = op->getRawOperand(0);
1762 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1764 stack.push_back(tmp);
1768 reg_num = op->getRawOperand(0);
1770 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1773 int64_t breg_offset = op->getRawOperand(1);
1774 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1776 stack.push_back(tmp);
1781 if (llvm::Error err =
1790 if (llvm::Error err =
1795 case DW_OP_bit_piece:
1796 if (stack.size() < 1) {
1798 LocationDescriptionKind::Empty);
1800 eval_ctx.loc_desc_kind =
Memory;
1801 return llvm::createStringError(
1802 "expression stack needs at least 1 item for DW_OP_bit_piece");
1807 eval_ctx.loc_desc_kind =
Memory;
1808 const uint64_t piece_bit_size = op->getRawOperand(0);
1809 const uint64_t piece_bit_offset = op->getRawOperand(1);
1810 switch (stack.back().GetValueType()) {
1812 return llvm::createStringError(
1813 "unable to extract bit value from invalid value");
1815 if (!stack.back().GetScalar().ExtractBitfield(piece_bit_size,
1816 piece_bit_offset)) {
1817 return llvm::createStringError(
1818 "unable to extract %" PRIu64
" bit value with %" PRIu64
1819 " bit offset from a %" PRIu64
" bit scalar value.",
1820 piece_bit_size, piece_bit_offset,
1821 (uint64_t)(stack.back().GetScalar().GetByteSize() * 8));
1828 return llvm::createStringError(
1829 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
1830 ", bit_offset = %" PRIu64
") from an address value.",
1831 piece_bit_size, piece_bit_offset);
1836 case DW_OP_implicit_value: {
1837 eval_ctx.loc_desc_kind = Implicit;
1841 const uint64_t block_size = op->getRawOperand(0);
1842 uint64_t block_offset = op->getRawOperand(1);
1844 llvm::Error
error = llvm::Error::success();
1845 llvm::StringRef block_data =
1846 expr_data.getBytes(&block_offset, block_size, &
error);
1851 Value result(block_data.data(), block_data.size());
1852 stack.push_back(result);
1856 case DW_OP_implicit_pointer: {
1857 eval_ctx.loc_desc_kind = Implicit;
1858 return llvm::createStringError(
"could not evaluate %s",
1862 case DW_OP_push_object_address:
1863 if (eval_ctx.object_address_ptr)
1864 stack.push_back(*eval_ctx.object_address_ptr);
1866 return llvm::createStringError(
"DW_OP_push_object_address used without "
1867 "specifying an object address");
1872 return llvm::createStringError(
"unimplemented opcode DW_OP_call2");
1874 return llvm::createStringError(
"unimplemented opcode DW_OP_call4");
1876 case DW_OP_stack_value:
1877 eval_ctx.loc_desc_kind = Implicit;
1882 if (llvm::Error err =
1887 case DW_OP_call_frame_cfa:
1892 case DW_OP_form_tls_address:
1893 case DW_OP_GNU_push_tls_address:
1899 case DW_OP_GNU_addr_index: {
1900 if (!eval_ctx.dwarf_cu)
1901 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
1902 "compile unit being specified");
1903 uint64_t index = op->getRawOperand(0);
1906 stack.push_back(
Scalar(value));
1917 case DW_OP_GNU_const_index: {
1918 if (!eval_ctx.dwarf_cu) {
1919 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
1920 "compile unit being specified");
1922 uint64_t index = op->getRawOperand(0);
1925 stack.push_back(
Scalar(value));
1928 case DW_OP_GNU_entry_value:
1929 case DW_OP_entry_value: {
1934 const uint64_t block_size = op->getRawOperand(0);
1935 uint64_t block_offset = op->getEndOffset();
1937 llvm::Error
error = llvm::Error::success();
1938 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
1939 expr_data.getBytes(&block_offset, block_size, &
error));
1945 return llvm::createStringError(
1946 "could not evaluate DW_OP_entry_value: %s",
1947 llvm::toString(std::move(err)).c_str());
1951 op = op.skipBytes(block_size);
1956 if (eval_ctx.dwarf_cu) {
1957 const uint64_t operands_offset = op_offset + 1;
1958 uint64_t offset = operands_offset;
1960 opcode, expr_data, offset, eval_ctx.reg_ctx, eval_ctx.reg_kind,
1969 assert(offset >= op->getEndOffset());
1970 uint64_t offset_to_next_op = offset - op->getEndOffset();
1971 op = op.skipBytes(offset_to_next_op);
1975 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
1981 if (stack.empty()) {
1985 return eval_ctx.pieces;
1987 return llvm::createStringError(
"stack empty after evaluation");
1994 size_t count = stack.size();
1995 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
1996 static_cast<uint64_t
>(count));
1997 for (
size_t i = 0; i < count; ++i) {
1999 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2000 stack[i].Dump(&new_value);
2004 return stack.back();
2019 uint8_t opcode = opcodes.
GetU8(&op_offset);
2021 if (opcode == DW_OP_fbreg) {
2022 int64_t offset = opcodes.
GetSLEB128(&op_offset);
2035 recurse)(operand)) {
2039 return MatchUnaryOp(
2042 MatchImmOp(offset), recurse))(operand);
2045 bool dereference =
false;
2049 if (opcode >= DW_OP_reg0 && opcode <= DW_OP_reg31) {
2050 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_reg0);
2051 }
else if (opcode >= DW_OP_breg0 && opcode <= DW_OP_breg31) {
2053 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_breg0);
2054 }
else if (opcode == DW_OP_regx) {
2055 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2056 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2057 }
else if (opcode == DW_OP_bregx) {
2058 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2060 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2072 MatchRegOp(*reg))(operand)) {
2076 return MatchUnaryOp(
2079 MatchRegOp(*reg), MatchImmOp(offset)))(operand);
2081 return MatchRegOp(*reg)(operand);
static llvm::raw_ostream & error(Stream &strm)
static llvm::Error Evaluate_DW_OP_entry_value(EvalContext &eval_ctx, llvm::ArrayRef< uint8_t > subexpr)
static llvm::Error Evaluate_DW_OP_convert(EvalContext &eval_ctx, uint64_t relative_die_offset)
static llvm::Error Evaluate_DW_OP_piece(EvalContext &eval_ctx, uint64_t piece_byte_size)
static llvm::Error Evaluate_DW_OP_fbreg(EvalContext &eval_ctx, int64_t fbreg_offset)
static const char * DW_OP_value_to_name(uint32_t val)
static llvm::Error Evaluate_DW_OP_form_tls_address(EvalContext &eval_ctx, LocationAtom opcode)
static llvm::Expected< lldb::addr_t > ResolveLoadAddress(EvalContext &eval_ctx, const char *dw_op_type, lldb::addr_t file_addr, Address &so_addr, bool check_sectionoffset=false)
Helper function to move common code used to resolve a file address and turn into a load address.
static lldb::offset_t GetOpcodeDataSize(const DataExtractor &data, const lldb::offset_t data_offset, const LocationAtom op, const DWARFExpression::Delegate *dwarf_cu)
Return the length in bytes of the set of operands for op.
static llvm::Error Evaluate_DW_OP_call_frame_cfa(EvalContext &eval_ctx)
static Scalar DerefSizeExtractDataHelper(uint8_t *addr_bytes, size_t size_addr_bytes, ByteOrder byte_order, size_t size)
Helper function to load sized data from a uint8_t buffer.
static void UpdateValueTypeFromLocationDescription(EvalContext &eval_ctx, LocationDescriptionKind kind, Value *value=nullptr)
Adjust value's ValueType according to the kind of location description.
static llvm::Error Evaluate_DW_OP_deref(EvalContext &eval_ctx, LocationAtom opcode, unsigned size, size_t size_addr_bytes)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
@ Empty
If the Mangled object has neither a mangled name or demangled name we can encode the object with one ...
llvm::MCRegisterInfo & GetMCRegisterInfo()
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool IsSectionOffset() const
Check if an address is section offset.
Represent a call made within a Function.
virtual Function * GetCallee(ModuleList &images, ExecutionContext &exe_ctx)=0
Get the callee's definition.
llvm::ArrayRef< CallSiteParameter > GetCallSiteParameters() const
Get the call site parameters available at this call edge.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
bool MatchesOperand(StackFrame &frame, const Instruction::Operand &operand) const
llvm::Expected< Value > Evaluate(ExecutionContext *exe_ctx, RegisterContext *reg_ctx, lldb::addr_t func_load_addr, const Value *initial_value_ptr, const Value *object_address_ptr) const
virtual uint16_t GetVersion() const =0
virtual lldb::offset_t GetVendorDWARFOpcodeSize(const DataExtractor &data, const lldb::offset_t data_offset, const uint8_t op) const =0
virtual dw_addr_t ReadAddressFromDebugAddrSection(uint32_t index) const =0
virtual bool ParseVendorDWARFOpcode(uint8_t op, const llvm::DataExtractor &opcodes, lldb::offset_t &offset, RegisterContext *reg_ctx, lldb::RegisterKind reg_kind, Stack &stack) const =0
virtual llvm::Expected< std::pair< uint64_t, bool > > GetDIEBitSizeAndSign(uint64_t relative_die_offset) const =0
virtual uint8_t GetAddressByteSize() const =0
DataExtractor m_data
A data extractor capable of reading opcode bytes.
std::vector< Value > Stack
~DWARFExpression()
Destructor.
llvm::Expected< lldb::addr_t > GetLocation_DW_OP_addr(const Delegate *dwarf_cu) const
Return the address specified by the first DW_OP_{addr, addrx, GNU_addr_index} in the operation stream...
void UpdateValue(uint64_t const_value, lldb::offset_t const_value_byte_size, uint8_t addr_byte_size)
static llvm::Expected< Value > Evaluate(ExecutionContext *exe_ctx, RegisterContext *reg_ctx, lldb::ModuleSP module_sp, const DataExtractor &opcodes, const Delegate *dwarf_cu, const lldb::RegisterKind reg_set, const Value *initial_value_ptr, const Value *object_address_ptr)
Evaluate a DWARF location expression in a particular context.
bool ContainsThreadLocalStorage(const Delegate *dwarf_cu) const
bool LinkThreadLocalStorage(const Delegate *dwarf_cu, std::function< lldb::addr_t(lldb::addr_t file_addr)> const &link_address_callback)
lldb::RegisterKind m_reg_kind
One of the defines that starts with LLDB_REGKIND_.
bool Update_DW_OP_addr(const Delegate *dwarf_cu, lldb::addr_t file_addr)
void SetRegisterKind(lldb::RegisterKind reg_kind)
Set the call-frame-info style register kind.
static llvm::Error ReadRegisterValueAsScalar(RegisterContext *reg_ctx, lldb::RegisterKind reg_kind, uint32_t reg_num, Value &value)
bool MatchesOperand(StackFrame &frame, const Instruction::Operand &op) const
void DumpLocation(Stream *s, lldb::DescriptionLevel level, ABI *abi, llvm::DIDumpOptions options={}) const
lldb::RegisterKind GetRegisterKind() const
Return the call-frame-info style register kind.
bool IsValid() const
Return true if the location expression contains data.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t GetByteSize() const override
Get the number of bytes in the data buffer.
An binary data encoding class.
std::shared_ptr< lldb_private::DataBufferHeap > GetDataBuffer()
Get a shared copy of the heap based memory buffer owned by this object.
uint32_t PutUnsigned(uint32_t offset, uint32_t byte_size, uint64_t value)
Encode an unsigned integer of size byte_size to offset.
uint32_t PutAddress(uint32_t offset, lldb::addr_t addr)
Encode an address in the existing buffer at offset bytes into the buffer.
void AppendAddress(lldb::addr_t addr)
Append an address sized integer to the end of the owned data.
void AppendU8(uint8_t value)
Append a unsigned integer to the end of the owned data.
void AppendData(llvm::StringRef data)
Append a bytes to the end of the owned data.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
void SetFrameSP(const lldb::StackFrameSP &frame_sp)
Set accessor to set only the frame shared pointer.
StackFrame * GetFramePtr() const
Returns a pointer to the frame object.
bool HasTargetScope() const
Returns true the ExecutionContext object contains a valid target.
Target & GetTargetRef() const
Returns a reference to the target object.
Thread * GetThreadPtr() const
Returns a pointer to the thread object.
A class that describes a function.
ConstString GetName() const
CallEdge * GetCallEdgeForReturnAddress(lldb::addr_t return_pc, Target &target)
Get the outgoing call edge from this function which has the given return address return_pc,...
llvm::ArrayRef< std::unique_ptr< CallEdge > > GetTailCallingEdges()
Get the outgoing tail-calling edges from this function.
A collection class for Module objects.
A plug-in interface definition class for object file parsers.
virtual lldb::ByteOrder GetByteOrder() const =0
Gets whether endian swapping should occur when extracting data from this object file.
virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
lldb::ByteOrder GetByteOrder() const
virtual uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num)
Convert from a given register numbering scheme to the lldb register numbering scheme.
virtual const RegisterInfo * GetRegisterInfoAtIndex(size_t reg)=0
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0
bool GetScalarValue(Scalar &scalar) const
size_t GetByteSize() const
void TruncOrExtendTo(uint16_t bits, bool sign)
Convert to an integer with bits and the given signedness.
unsigned long long ULongLong(unsigned long long fail_value=0) const
bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset)
This base class provides an interface to stack frames.
virtual DWARFExpressionList * GetFrameBaseExpression(Status *error_ptr)
Get the DWARFExpressionList corresponding to the Canonical Frame Address.
virtual llvm::Error GetFrameBaseValue(Scalar &value)
Return the Canonical Frame Address (DWARF term) for this frame.
virtual lldb::RegisterContextSP GetRegisterContext()
Get the RegisterContext for this frame, if possible.
virtual StackID & GetStackID()
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
virtual uint32_t GetFrameIndex() const
Query this frame to find what frame it is in this Thread's StackFrameList.
const char * GetData() const
A stream class that can stream formatted output to a file.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Function * function
The Function for a given query.
virtual size_t ReadMemory(const Address &addr, void *dst, size_t dst_len, Status &error, bool force_live_memory=false, lldb::addr_t *load_addr_ptr=nullptr, bool *did_read_live_memory=nullptr)
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
const Scalar & GetScalar() const
See comment on m_scalar to understand what GetScalar returns.
ValueType
Type that describes Value::m_value.
@ HostAddress
A host address value (for memory in the process that < A is using liblldb).
@ FileAddress
A file address value.
@ LoadAddress
A load address value.
@ Scalar
A raw scalar value.
size_t AppendDataToHostBuffer(const Value &rhs)
ValueType GetValueType() const
void SetContext(ContextType context_type, void *p)
DataBufferHeap & GetBuffer()
void SetValueType(ValueType value_type)
@ RegisterInfo
RegisterInfo * (can be a scalar or a vector register).
void ConvertToLoadAddress(Module *module, Target *target)
Convert this value's file address to a load address, if possible.
size_t ResizeData(size_t len)
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_OFFSET
#define LLDB_INVALID_REGNUM
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::Module > ModuleSP
RegisterKind
Register numbering types.
Represent the locations of a parameter at a call site, both in the caller and in the callee.
DWARFExpressionList LocationInCaller
Every register is described in detail including its name, alternate name (optional),...
const char * name
Name of this register, can't be NULL.