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:
417 uint64_t block_len = data.
GetULEB128(&offset);
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;
574 while (
m_data.ValidOffset(offset)) {
575 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
581 case DW_OP_stack_value:
582 case DW_OP_implicit_value:
583 case DW_OP_implicit_pointer:
585 case DW_OP_bit_piece:
595 offset += op_arg_size;
603 &link_address_callback) {
604 const uint32_t addr_byte_size =
m_data.GetAddressByteSize();
612 m_data.GetByteOrder(), addr_byte_size);
617 size_t const_byte_size = 0;
618 while (
m_data.ValidOffset(offset)) {
619 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
621 bool decoded_data =
false;
626 const_offset = offset;
627 const_value =
m_data.GetU32(&offset);
635 const_offset = offset;
636 const_value =
m_data.GetU64(&offset);
641 case DW_OP_form_tls_address:
642 case DW_OP_GNU_push_tls_address:
653 if (const_byte_size > 0) {
654 lldb::addr_t linked_file_addr = link_address_callback(const_value);
658 if (encoder.
PutUnsigned(const_offset, const_byte_size,
677 offset += op_arg_size;
686 llvm::ArrayRef<uint8_t> subexpr) {
735 return llvm::createStringError(
"no exe/reg context");
740 if (!current_frame || !thread)
741 return llvm::createStringError(
"no current frame/thread");
748 for (uint32_t parent_frame_idx = current_frame_idx + 1;; parent_frame_idx++) {
749 parent_frame = thread->GetStackFrameAtIndex(parent_frame_idx);
758 return_pc = parent_frame->GetFrameCodeAddress().GetLoadAddress(&target);
759 LLDB_LOG(log,
"immediate ancestor with pc = {0:x}", return_pc);
764 if (parent_frame->IsInlined())
770 if (!parent_frame || !parent_frame->GetRegisterContext()) {
771 return llvm::createStringError(
"no parent frame with reg ctx");
775 parent_frame->GetSymbolContext(eSymbolContextFunction).function;
777 return llvm::createStringError(
"no parent function");
784 return llvm::createStringError(
"no current function");
790 if (!parent_frame->IsArtificial()) {
795 return llvm::createStringErrorV(
796 "no call edge for retn-pc = {0:x} in parent frame {1}", return_pc,
800 if (callee_func != current_func) {
801 return llvm::createStringError(
802 "ambiguous call sequence, can't find real parent frame");
809 if (edge->GetCallee(modlist, parent_exe_ctx) == current_func) {
810 call_edge = edge.get();
816 return llvm::createStringError(
"no unambiguous edge from parent "
817 "to current function");
825 if (!param.LocationInCallee.GetExpressionData(param_subexpr_extractor))
828 const void *param_subexpr_data =
829 param_subexpr_extractor.
GetData(¶m_subexpr_offset, subexpr.size());
830 if (!param_subexpr_data ||
831 param_subexpr_extractor.
BytesLeft(param_subexpr_offset) != 0)
841 if (memcmp(subexpr.data(), param_subexpr_data, subexpr.size()) == 0) {
842 matched_param = ¶m;
847 return llvm::createStringError(
"no matching call site param found");
855 llvm::Expected<Value> maybe_result = param_expr.
Evaluate(
856 &parent_exe_ctx, parent_frame->GetRegisterContext().get(),
862 "Evaluate_DW_OP_entry_value: call site param evaluation failed");
863 return maybe_result.takeError();
866 eval_ctx.stack.push_back(*maybe_result);
867 return llvm::Error::success();
872 LocationDescriptionKind kind,
873 Value *value =
nullptr) {
880 if (eval_ctx.dwarf_cu && eval_ctx.dwarf_cu->
GetVersion() >= 4) {
882 const char *log_msg =
"DWARF location description kind: %s";
919static llvm::Expected<lldb::addr_t>
922 bool check_sectionoffset =
false) {
923 if (!eval_ctx.module_sp)
924 return llvm::createStringError(
"need module to resolve file address for %s",
927 if (!eval_ctx.module_sp->ResolveFileAddress(file_addr, so_addr))
928 return llvm::createStringError(
"failed to resolve file address in module");
934 return llvm::createStringError(
"failed to resolve load address");
947 size_t size_addr_bytes,
949 DataExtractor addr_data(addr_bytes, size_addr_bytes, byte_order, size);
953 return addr_data.
GetMaxU64(&addr_data_offset, size);
954 return addr_data.
GetAddress(&addr_data_offset);
958 LocationAtom opcode,
unsigned size,
959 size_t size_addr_bytes) {
961 if (eval_ctx.stack.empty())
962 return llvm::createStringError(
"expression stack empty for %s", op_name);
964 if (size == 0 || size > 8)
965 return llvm::createStringError(
"Invalid address size for %s: %u", op_name,
968 if (opcode == DW_OP_deref_size && size > size_addr_bytes)
969 return llvm::createStringError(
970 "DW_OP_deref_size size (%u) exceeds address size (%zu)", size,
976 if (eval_ctx.loc_desc_kind == Register ||
977 eval_ctx.loc_desc_kind == Implicit) {
979 eval_ctx.loc_desc_kind =
Memory;
980 eval_ctx.stack.back().ClearContext();
984 Scalar scalar = eval_ctx.stack.back().GetScalar();
988 eval_ctx.stack.back().GetScalar() = scalar;
989 return llvm::Error::success();
993 switch (value_type) {
995 void *src = (
void *)eval_ctx.stack.back().GetScalar().ULongLong();
997 ::memcpy(&ptr, src,
sizeof(
void *));
1009 ptr = ptr & 0xffffff;
1012 ptr = ptr & 0xffffffff;
1018 ptr = (intptr_t)ptr & 0xffffffffffULL;
1021 ptr = (intptr_t)ptr & 0xffffffffffffULL;
1024 ptr = (intptr_t)ptr & 0xffffffffffffffULL;
1029 eval_ctx.stack.back().GetScalar() = ptr;
1030 eval_ctx.stack.back().ClearContext();
1036 auto maybe_load_addr =
1040 if (!maybe_load_addr)
1041 return maybe_load_addr.takeError();
1043 addr_t load_addr = *maybe_load_addr;
1046 uint8_t addr_bytes[8];
1049 if (!eval_ctx.target ||
1052 return llvm::createStringError(
"failed to dereference pointer for %s: "
1054 op_name,
error.AsCString());
1056 ObjectFile *objfile = eval_ctx.module_sp->GetObjectFile();
1060 eval_ctx.stack.back().ClearContext();
1063 eval_ctx.stack.back().GetScalar() = load_addr;
1073 if (!eval_ctx.exe_ctx)
1074 return llvm::createStringError(
"no execution context for %s", op_name);
1075 if (!eval_ctx.process)
1076 return llvm::createStringError(
"no process for %s", op_name);
1083 if (eval_ctx.process->
ReadMemory(pointer_addr, &addr_bytes, size,
error) !=
1085 return llvm::createStringError(
1086 "failed to dereference pointer from 0x%" PRIx64
" for %s: %s\n",
1087 pointer_addr, op_name,
error.AsCString());
1090 addr_bytes,
sizeof(addr_bytes), eval_ctx.process->
GetByteOrder(), size);
1091 eval_ctx.stack.back().ClearContext();
1095 return llvm::createStringError(
"invalid value for %s", op_name);
1098 return llvm::Error::success();
1102 uint64_t piece_byte_size) {
1103 LocationDescriptionKind piece_locdesc = eval_ctx.loc_desc_kind;
1105 eval_ctx.loc_desc_kind =
Memory;
1107 if (piece_byte_size == 0)
1108 return llvm::Error::success();
1112 if (eval_ctx.stack.empty()) {
1114 LocationDescriptionKind::Empty);
1128 Value curr_piece_source_value(eval_ctx.stack.back());
1129 eval_ctx.stack.pop_back();
1131 &curr_piece_source_value);
1137 switch (curr_piece_source_value_type) {
1139 return llvm::createStringError(
"invalid value type");
1141 if (eval_ctx.target) {
1146 return llvm::createStringError(
1147 "unable to convert file address 0x%" PRIx64
" to load address "
1148 "for DW_OP_piece(%" PRIu64
"): "
1149 "no target available",
1150 addr, piece_byte_size);
1154 if (eval_ctx.target) {
1155 if (curr_piece.
ResizeData(piece_byte_size) == piece_byte_size) {
1158 piece_byte_size,
error,
1159 false) != piece_byte_size) {
1160 const char *addr_type =
1164 return llvm::createStringError(
1165 "failed to read memory DW_OP_piece(%" PRIu64
1166 ") from %s address 0x%" PRIx64,
1167 piece_byte_size, addr_type, addr);
1170 return llvm::createStringError(
1171 "failed to resize the piece memory buffer for "
1172 "DW_OP_piece(%" PRIu64
")",
1178 return llvm::createStringError(
1179 "failed to read memory DW_OP_piece(%" PRIu64
1180 ") from host address 0x%" PRIx64,
1181 piece_byte_size, addr);
1185 uint32_t bit_size = piece_byte_size * 8;
1186 uint32_t bit_offset = 0;
1188 return llvm::createStringError(
1189 "unable to extract %" PRIu64
" bytes from a %" PRIu64
1190 " byte scalar value.",
1205 if (eval_ctx.op_piece_offset == 0) {
1210 return llvm::createStringError(
"failed to append piece data");
1216 eval_ctx.op_piece_offset) {
1217 return llvm::createStringError(
1218 "DW_OP_piece for offset %" PRIu64
1219 " but top of stack is of size %" PRIu64,
1220 eval_ctx.op_piece_offset,
1225 return llvm::createStringError(
"failed to append piece data");
1228 eval_ctx.op_piece_offset += piece_byte_size;
1229 return llvm::Error::success();
1233 uint64_t relative_die_offset) {
1236 if (relative_die_offset == 0) {
1240 if (!eval_ctx.module_sp)
1241 return llvm::createStringError(
"no module");
1243 bit_size = eval_ctx.module_sp->GetArchitecture().GetAddressByteSize() * 8;
1245 return llvm::createStringError(
"unspecified architecture");
1247 if (!eval_ctx.dwarf_cu)
1248 return llvm::createStringError(
1249 "DW_OP_convert with a DIE offset requires a DWARF unit");
1250 auto bit_size_sign_or_err =
1252 if (!bit_size_sign_or_err)
1253 return bit_size_sign_or_err.takeError();
1254 bit_size = bit_size_sign_or_err->first;
1255 sign = bit_size_sign_or_err->second;
1257 eval_ctx.stack.back().GetScalar().TruncOrExtendTo(bit_size, sign);
1258 return llvm::Error::success();
1262 LocationAtom opcode) {
1263 if (eval_ctx.stack.empty())
1264 return llvm::createStringError(
"%s needs an argument",
1265 opcode == DW_OP_form_tls_address
1266 ?
"DW_OP_form_tls_address"
1267 :
"DW_OP_GNU_push_tls_address");
1269 if (!eval_ctx.exe_ctx || !eval_ctx.module_sp)
1270 return llvm::createStringError(
"no context to evaluate TLS within");
1274 return llvm::createStringError(
"no thread to evaluate TLS within");
1277 const addr_t tls_file_addr =
1279 const addr_t tls_load_addr =
1280 thread->GetThreadLocalData(eval_ctx.module_sp, tls_file_addr);
1283 return llvm::createStringError(
1284 "no TLS data currently exists for this thread");
1286 eval_ctx.stack.back().GetScalar() = tls_load_addr;
1288 return llvm::Error::success();
1292 int64_t fbreg_offset) {
1293 if (!eval_ctx.exe_ctx)
1294 return llvm::createStringError(
"NULL execution context for DW_OP_fbreg");
1295 if (!eval_ctx.frame)
1296 return llvm::createStringError(
1297 "invalid stack frame in context for DW_OP_fbreg opcode");
1302 value += fbreg_offset;
1303 eval_ctx.stack.push_back(value);
1305 return llvm::Error::success();
1309 if (!eval_ctx.frame)
1310 return llvm::createStringError(
1311 "invalid stack frame in context for DW_OP_call_frame_cfa opcode");
1316 addr_t cfa =
id.GetCallFrameAddressWithMetadata();
1318 return llvm::createStringError(
"stack frame does not include a canonical "
1319 "frame address for DW_OP_call_frame_cfa "
1322 eval_ctx.stack.push_back(
Scalar(cfa));
1324 return llvm::Error::success();
1332 const Value *object_address_ptr) {
1334 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1335 llvm::DWARFExpression expr(expr_data, address_size);
1337 if (expr_data.size() == 0)
1338 return llvm::createStringError(
1339 "no location, value may have been optimized out");
1341 EvalContext eval_ctx(exe_ctx, reg_ctx, std::move(module_sp), dwarf_cu,
1342 reg_kind, initial_value_ptr, object_address_ptr);
1344 Stack &stack = eval_ctx.stack;
1346 if (initial_value_ptr)
1347 stack.push_back(*initial_value_ptr);
1357 auto to_generic = [&](
auto v) {
1360 bool is_signed = std::is_signed<
decltype(v)>::value;
1361 return Scalar(llvm::APSInt(
1362 llvm::APInt(8 * address_size, v, is_signed,
true),
1366 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1367 while (op != op_end) {
1368 const uint64_t op_offset = op.getOffset();
1369 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1372 size_t count = stack.size();
1373 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1374 static_cast<uint64_t
>(count));
1375 for (
size_t i = 0; i < count; ++i) {
1377 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1378 stack[i].Dump(&new_value);
1381 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1385 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1386 if (stack.size() < *arity)
1387 return llvm::createStringError(
1388 "%s needs at least %d stack entries (stack has %d entries)",
1394 stack.push_back(
Scalar(op->getRawOperand(0)));
1399 size_t size = address_size;
1404 case DW_OP_deref_size: {
1405 size_t size = op->getRawOperand(0);
1406 if (llvm::Error err =
1411 case DW_OP_xderef_size:
1412 return llvm::createStringError(
"unimplemented opcode: DW_OP_xderef_size");
1414 return llvm::createStringError(
"unimplemented opcode: DW_OP_xderef");
1417 stack.push_back(to_generic(op->getRawOperand(0)));
1420 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1423 stack.push_back(to_generic(op->getRawOperand(0)));
1426 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1429 stack.push_back(to_generic(op->getRawOperand(0)));
1432 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1435 stack.push_back(to_generic(op->getRawOperand(0)));
1438 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1441 stack.push_back(to_generic(op->getRawOperand(0)));
1444 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1448 if (stack.empty()) {
1449 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1451 stack.push_back(stack.back());
1455 if (stack.empty()) {
1456 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1462 stack.push_back(stack[stack.size() - 2]);
1466 uint8_t pick_idx = op->getRawOperand(0);
1467 if (pick_idx < stack.size())
1468 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1470 return llvm::createStringError(
1471 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1477 stack.back() = stack[stack.size() - 2];
1478 stack[stack.size() - 2] = tmp;
1482 size_t last_idx = stack.size() - 1;
1483 Value old_top = stack[last_idx];
1484 stack[last_idx] = stack[last_idx - 1];
1485 stack[last_idx - 1] = stack[last_idx - 2];
1486 stack[last_idx - 2] = old_top;
1490 if (!stack.back().GetScalar().AbsoluteValue()) {
1491 return llvm::createStringError(
1492 "failed to take the absolute value of the first stack item");
1499 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1505 return llvm::createStringError(
"divide by zero");
1508 Scalar divisor, dividend;
1510 dividend = stack.back().GetScalar();
1513 stack.back() = dividend / divisor;
1515 if (!stack.back().GetScalar().IsValid())
1516 return llvm::createStringError(
"divide failed");
1522 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1528 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1534 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1538 if (!stack.back().GetScalar().UnaryNegate())
1539 return llvm::createStringError(
"unary negate failed");
1543 if (!stack.back().GetScalar().OnesComplement())
1544 return llvm::createStringError(
"logical NOT failed");
1550 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1556 stack.back().GetScalar() += tmp.
GetScalar();
1559 case DW_OP_plus_uconst: {
1560 const uint64_t uconst_value = op->getRawOperand(0);
1562 stack.back().GetScalar() += uconst_value;
1563 if (!stack.back().GetScalar().IsValid())
1564 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1570 stack.back().GetScalar() <<= tmp.
GetScalar();
1576 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1577 return llvm::createStringError(
"DW_OP_shr failed");
1583 stack.back().GetScalar() >>= tmp.
GetScalar();
1589 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1593 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1598 if (new_offset <= expr_data.size()) {
1599 op = op.skipBytes(skip_offset);
1602 return llvm::createStringErrorV(
1603 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1604 op->getEndOffset(), skip_offset, expr_data.size());
1610 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1617 if (new_offset <= expr_data.size()) {
1618 op = op.skipBytes(bra_offset);
1621 return llvm::createStringErrorV(
1622 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1623 op->getEndOffset(), bra_offset, expr_data.size());
1630 stack.back().GetScalar() = stack.back().GetScalar() == tmp.
GetScalar();
1636 stack.back().GetScalar() = stack.back().GetScalar() >= tmp.
GetScalar();
1642 stack.back().GetScalar() = stack.back().GetScalar() > tmp.
GetScalar();
1648 stack.back().GetScalar() = stack.back().GetScalar() <= tmp.
GetScalar();
1654 stack.back().GetScalar() = stack.back().GetScalar() < tmp.
GetScalar();
1660 stack.back().GetScalar() = stack.back().GetScalar() != tmp.
GetScalar();
1695 stack.push_back(to_generic(opcode - DW_OP_lit0));
1730 eval_ctx.loc_desc_kind = Register;
1731 reg_num = opcode - DW_OP_reg0;
1734 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1736 stack.push_back(tmp);
1739 eval_ctx.loc_desc_kind = Register;
1740 reg_num = op->getRawOperand(0);
1743 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1745 stack.push_back(tmp);
1779 case DW_OP_breg31: {
1780 reg_num = opcode - DW_OP_breg0;
1782 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1785 int64_t breg_offset = op->getRawOperand(0);
1786 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1788 stack.push_back(tmp);
1792 reg_num = op->getRawOperand(0);
1794 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1797 int64_t breg_offset = op->getRawOperand(1);
1798 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1800 stack.push_back(tmp);
1805 if (llvm::Error err =
1814 if (llvm::Error err =
1819 case DW_OP_bit_piece:
1820 if (stack.size() < 1) {
1822 LocationDescriptionKind::Empty);
1824 eval_ctx.loc_desc_kind =
Memory;
1825 return llvm::createStringError(
1826 "expression stack needs at least 1 item for DW_OP_bit_piece");
1831 eval_ctx.loc_desc_kind =
Memory;
1832 const uint64_t piece_bit_size = op->getRawOperand(0);
1833 const uint64_t piece_bit_offset = op->getRawOperand(1);
1834 switch (stack.back().GetValueType()) {
1836 return llvm::createStringError(
1837 "unable to extract bit value from invalid value");
1839 if (!stack.back().GetScalar().ExtractBitfield(piece_bit_size,
1840 piece_bit_offset)) {
1841 return llvm::createStringError(
1842 "unable to extract %" PRIu64
" bit value with %" PRIu64
1843 " bit offset from a %" PRIu64
" bit scalar value.",
1844 piece_bit_size, piece_bit_offset,
1845 (uint64_t)(stack.back().GetScalar().GetByteSize() * 8));
1852 return llvm::createStringError(
1853 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
1854 ", bit_offset = %" PRIu64
") from an address value.",
1855 piece_bit_size, piece_bit_offset);
1860 case DW_OP_implicit_value: {
1861 eval_ctx.loc_desc_kind = Implicit;
1865 const uint64_t block_size = op->getRawOperand(0);
1866 uint64_t block_offset = op->getRawOperand(1);
1868 llvm::Error
error = llvm::Error::success();
1869 llvm::StringRef block_data =
1870 expr_data.getBytes(&block_offset, block_size, &
error);
1875 Value result(block_data.data(), block_data.size());
1876 stack.push_back(result);
1880 case DW_OP_implicit_pointer: {
1881 eval_ctx.loc_desc_kind = Implicit;
1882 return llvm::createStringError(
"could not evaluate %s",
1886 case DW_OP_push_object_address:
1887 if (eval_ctx.object_address_ptr)
1888 stack.push_back(*eval_ctx.object_address_ptr);
1890 return llvm::createStringError(
"DW_OP_push_object_address used without "
1891 "specifying an object address");
1896 return llvm::createStringError(
"unimplemented opcode DW_OP_call2");
1898 return llvm::createStringError(
"unimplemented opcode DW_OP_call4");
1900 case DW_OP_stack_value:
1901 eval_ctx.loc_desc_kind = Implicit;
1906 if (llvm::Error err =
1911 case DW_OP_call_frame_cfa:
1916 case DW_OP_form_tls_address:
1917 case DW_OP_GNU_push_tls_address:
1923 case DW_OP_GNU_addr_index: {
1924 if (!eval_ctx.dwarf_cu)
1925 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
1926 "compile unit being specified");
1927 uint64_t index = op->getRawOperand(0);
1930 stack.push_back(
Scalar(value));
1934 case DW_OP_GNU_const_index: {
1935 if (!eval_ctx.dwarf_cu) {
1936 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
1937 "compile unit being specified");
1939 uint64_t index = op->getRawOperand(0);
1942 stack.push_back(
Scalar(value));
1945 case DW_OP_GNU_entry_value:
1946 case DW_OP_entry_value: {
1951 const uint64_t block_size = op->getRawOperand(0);
1952 uint64_t block_offset = op->getEndOffset();
1954 llvm::Error
error = llvm::Error::success();
1955 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
1956 expr_data.getBytes(&block_offset, block_size, &
error));
1962 return llvm::createStringError(
1963 "could not evaluate DW_OP_entry_value: %s",
1964 llvm::toString(std::move(err)).c_str());
1968 op = op.skipBytes(block_size);
1973 if (eval_ctx.dwarf_cu) {
1974 const uint64_t operands_offset = op_offset + 1;
1975 uint64_t offset = operands_offset;
1977 opcode, expr_data, offset, eval_ctx.reg_ctx, eval_ctx.reg_kind,
1986 assert(offset >= op->getEndOffset());
1987 uint64_t offset_to_next_op = offset - op->getEndOffset();
1988 op = op.skipBytes(offset_to_next_op);
1992 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
1998 if (stack.empty()) {
2002 return eval_ctx.pieces;
2004 return llvm::createStringError(
"stack empty after evaluation");
2011 size_t count = stack.size();
2012 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
2013 static_cast<uint64_t
>(count));
2014 for (
size_t i = 0; i < count; ++i) {
2016 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2017 stack[i].Dump(&new_value);
2021 return stack.back();
2036 uint8_t opcode = opcodes.
GetU8(&op_offset);
2038 if (opcode == DW_OP_fbreg) {
2039 int64_t offset = opcodes.
GetSLEB128(&op_offset);
2052 recurse)(operand)) {
2056 return MatchUnaryOp(
2059 MatchImmOp(offset), recurse))(operand);
2062 bool dereference =
false;
2066 if (opcode >= DW_OP_reg0 && opcode <= DW_OP_reg31) {
2067 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_reg0);
2068 }
else if (opcode >= DW_OP_breg0 && opcode <= DW_OP_breg31) {
2070 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_breg0);
2071 }
else if (opcode == DW_OP_regx) {
2072 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2073 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2074 }
else if (opcode == DW_OP_bregx) {
2075 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2077 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2089 MatchRegOp(*reg))(operand)) {
2093 return MatchUnaryOp(
2096 MatchRegOp(*reg), MatchImmOp(offset)))(operand);
2098 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 IsImplicit(const Delegate *dwarf_cu) const
Return true if this expression produces a DWARF implicit or composite location description that LLDB ...
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 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 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.