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();
1329 LocationAtom opcode,
1330 size_t address_size) {
1331 auto mismatch = [&](
const char *what) {
1332 return llvm::createStringError(
"%s requires operands to have the same %s",
1340 return mismatch(
"type");
1347 return mismatch(
"size");
1348 return llvm::Error::success();
1362 if (address_size != 0 && lhs.
GetByteSize() >= address_size &&
1364 return llvm::Error::success();
1369 return mismatch(
"size");
1371 return mismatch(
"signedness");
1373 return llvm::Error::success();
1381 const Value *object_address_ptr) {
1383 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1384 llvm::DWARFExpression expr(expr_data, address_size);
1386 if (expr_data.size() == 0)
1387 return llvm::createStringError(
1388 "no location, value may have been optimized out");
1390 EvalContext eval_ctx(exe_ctx, reg_ctx, std::move(module_sp), dwarf_cu,
1391 reg_kind, initial_value_ptr, object_address_ptr);
1393 Stack &stack = eval_ctx.stack;
1395 if (initial_value_ptr)
1396 stack.push_back(*initial_value_ptr);
1406 auto to_generic = [&](
auto v) {
1409 bool is_signed = std::is_signed<
decltype(v)>::value;
1410 return Scalar(llvm::APSInt(
1411 llvm::APInt(8 * address_size, v, is_signed,
true),
1415 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1416 while (op != op_end) {
1417 const uint64_t op_offset = op.getOffset();
1418 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1421 size_t count = stack.size();
1422 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1423 static_cast<uint64_t
>(count));
1424 for (
size_t i = 0; i < count; ++i) {
1426 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1427 stack[i].Dump(&new_value);
1430 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1434 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1435 if (stack.size() < *arity)
1436 return llvm::createStringError(
1437 "%s needs at least %d stack entries (stack has %d entries)",
1443 stack.push_back(
Scalar(op->getRawOperand(0)));
1448 size_t size = address_size;
1453 case DW_OP_deref_size: {
1454 size_t size = op->getRawOperand(0);
1455 if (llvm::Error err =
1461 stack.push_back(to_generic(op->getRawOperand(0)));
1464 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1467 stack.push_back(to_generic(op->getRawOperand(0)));
1470 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1473 stack.push_back(to_generic(op->getRawOperand(0)));
1476 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1479 stack.push_back(to_generic(op->getRawOperand(0)));
1482 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1485 stack.push_back(to_generic(op->getRawOperand(0)));
1488 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1492 if (stack.empty()) {
1493 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1495 stack.push_back(stack.back());
1499 if (stack.empty()) {
1500 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1506 stack.push_back(stack[stack.size() - 2]);
1510 uint8_t pick_idx = op->getRawOperand(0);
1511 if (pick_idx < stack.size())
1512 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1514 return llvm::createStringError(
1515 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1521 stack.back() = stack[stack.size() - 2];
1522 stack[stack.size() - 2] = tmp;
1526 size_t last_idx = stack.size() - 1;
1527 Value old_top = stack[last_idx];
1528 stack[last_idx] = stack[last_idx - 1];
1529 stack[last_idx - 1] = stack[last_idx - 2];
1530 stack[last_idx - 2] = old_top;
1534 if (!stack.back().GetScalar().AbsoluteValue()) {
1535 return llvm::createStringError(
1536 "failed to take the absolute value of the first stack item");
1542 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1543 opcode, address_size))
1547 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1552 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1553 opcode, address_size))
1557 return llvm::createStringError(
"divide by zero");
1560 Scalar divisor, dividend;
1562 dividend = stack.back().GetScalar();
1565 stack.back() = dividend / divisor;
1567 if (!stack.back().GetScalar().IsValid())
1568 return llvm::createStringError(
"divide failed");
1573 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1574 opcode, address_size))
1578 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1583 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1584 opcode, address_size))
1588 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1593 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1594 opcode, address_size))
1598 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1602 if (!stack.back().GetScalar().UnaryNegate())
1603 return llvm::createStringError(
"unary negate failed");
1607 if (!stack.back().GetScalar().OnesComplement())
1608 return llvm::createStringError(
"logical NOT failed");
1613 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1614 opcode, address_size))
1618 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1623 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1624 opcode, address_size))
1628 stack.back().GetScalar() += tmp.
GetScalar();
1631 case DW_OP_plus_uconst: {
1632 const uint64_t uconst_value = op->getRawOperand(0);
1634 stack.back().GetScalar() += uconst_value;
1635 if (!stack.back().GetScalar().IsValid())
1636 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1641 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1642 opcode, address_size))
1646 stack.back().GetScalar() <<= tmp.
GetScalar();
1651 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1652 opcode, address_size))
1656 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1657 return llvm::createStringError(
"DW_OP_shr failed");
1662 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1663 opcode, address_size))
1667 stack.back().GetScalar() >>= tmp.
GetScalar();
1672 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1673 opcode, address_size))
1677 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1681 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1686 if (new_offset <= expr_data.size()) {
1687 op = op.skipBytes(skip_offset);
1690 return llvm::createStringErrorV(
1691 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1692 op->getEndOffset(), skip_offset, expr_data.size());
1698 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1705 if (new_offset <= expr_data.size()) {
1706 op = op.skipBytes(bra_offset);
1709 return llvm::createStringErrorV(
1710 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1711 op->getEndOffset(), bra_offset, expr_data.size());
1717 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1718 opcode, address_size))
1722 stack.back().GetScalar() =
1723 to_generic(stack.back().GetScalar() == tmp.
GetScalar());
1728 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1729 opcode, address_size))
1733 stack.back().GetScalar() =
1734 to_generic(stack.back().GetScalar() >= tmp.
GetScalar());
1739 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1740 opcode, address_size))
1744 stack.back().GetScalar() =
1745 to_generic(stack.back().GetScalar() > tmp.
GetScalar());
1750 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1751 opcode, address_size))
1755 stack.back().GetScalar() =
1756 to_generic(stack.back().GetScalar() <= tmp.
GetScalar());
1761 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1762 opcode, address_size))
1766 stack.back().GetScalar() =
1767 to_generic(stack.back().GetScalar() < tmp.
GetScalar());
1772 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1773 opcode, address_size))
1777 stack.back().GetScalar() =
1778 to_generic(stack.back().GetScalar() != tmp.
GetScalar());
1813 stack.push_back(to_generic(opcode - DW_OP_lit0));
1848 eval_ctx.loc_desc_kind = Register;
1849 reg_num = opcode - DW_OP_reg0;
1852 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1854 stack.push_back(tmp);
1857 eval_ctx.loc_desc_kind = Register;
1858 reg_num = op->getRawOperand(0);
1861 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1863 stack.push_back(tmp);
1897 case DW_OP_breg31: {
1898 reg_num = opcode - DW_OP_breg0;
1900 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1903 int64_t breg_offset = op->getRawOperand(0);
1904 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1906 stack.push_back(tmp);
1910 reg_num = op->getRawOperand(0);
1912 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
1915 int64_t breg_offset = op->getRawOperand(1);
1916 tmp.
GetScalar() +=
static_cast<uint64_t
>(breg_offset);
1918 stack.push_back(tmp);
1923 if (llvm::Error err =
1932 if (llvm::Error err =
1937 case DW_OP_bit_piece:
1938 if (stack.size() < 1) {
1940 LocationDescriptionKind::Empty);
1942 eval_ctx.loc_desc_kind =
Memory;
1943 return llvm::createStringError(
1944 "expression stack needs at least 1 item for DW_OP_bit_piece");
1949 eval_ctx.loc_desc_kind =
Memory;
1950 const uint64_t piece_bit_size = op->getRawOperand(0);
1951 const uint64_t piece_bit_offset = op->getRawOperand(1);
1952 switch (stack.back().GetValueType()) {
1954 return llvm::createStringError(
1955 "unable to extract bit value from invalid value");
1957 if (!stack.back().GetScalar().ExtractBitfield(piece_bit_size,
1958 piece_bit_offset)) {
1959 return llvm::createStringError(
1960 "unable to extract %" PRIu64
" bit value with %" PRIu64
1961 " bit offset from a %" PRIu64
" bit scalar value.",
1962 piece_bit_size, piece_bit_offset,
1963 (uint64_t)(stack.back().GetScalar().GetByteSize() * 8));
1970 return llvm::createStringError(
1971 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
1972 ", bit_offset = %" PRIu64
") from an address value.",
1973 piece_bit_size, piece_bit_offset);
1978 case DW_OP_implicit_value: {
1979 eval_ctx.loc_desc_kind = Implicit;
1983 const uint64_t block_size = op->getRawOperand(0);
1984 uint64_t block_offset = op->getRawOperand(1);
1986 llvm::Error
error = llvm::Error::success();
1987 llvm::StringRef block_data =
1988 expr_data.getBytes(&block_offset, block_size, &
error);
1993 Value result(block_data.data(), block_data.size());
1994 stack.push_back(result);
1998 case DW_OP_implicit_pointer: {
1999 eval_ctx.loc_desc_kind = Implicit;
2000 return llvm::createStringError(
"could not evaluate %s",
2004 case DW_OP_push_object_address:
2005 if (eval_ctx.object_address_ptr)
2006 stack.push_back(*eval_ctx.object_address_ptr);
2008 return llvm::createStringError(
"DW_OP_push_object_address used without "
2009 "specifying an object address");
2013 case DW_OP_stack_value:
2014 eval_ctx.loc_desc_kind = Implicit;
2019 if (llvm::Error err =
2024 case DW_OP_call_frame_cfa:
2029 case DW_OP_form_tls_address:
2030 case DW_OP_GNU_push_tls_address:
2036 case DW_OP_GNU_addr_index: {
2037 if (!eval_ctx.dwarf_cu)
2038 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
2039 "compile unit being specified");
2040 uint64_t index = op->getRawOperand(0);
2043 stack.push_back(
Scalar(value));
2047 case DW_OP_GNU_const_index: {
2048 if (!eval_ctx.dwarf_cu) {
2049 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
2050 "compile unit being specified");
2052 uint64_t index = op->getRawOperand(0);
2055 stack.push_back(
Scalar(value));
2058 case DW_OP_GNU_entry_value:
2059 case DW_OP_entry_value: {
2064 const uint64_t block_size = op->getRawOperand(0);
2065 uint64_t block_offset = op->getEndOffset();
2067 llvm::Error
error = llvm::Error::success();
2068 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
2069 expr_data.getBytes(&block_offset, block_size, &
error));
2075 return llvm::createStringError(
2076 "could not evaluate DW_OP_entry_value: %s",
2077 llvm::toString(std::move(err)).c_str());
2081 op = op.skipBytes(block_size);
2087 case DW_OP_xderef_size:
2090 case DW_OP_call_ref:
2092 case DW_OP_const_type:
2093 case DW_OP_regval_type:
2094 case DW_OP_deref_type:
2095 case DW_OP_xderef_type:
2096 case DW_OP_reinterpret:
2097 case DW_OP_GNU_implicit_pointer:
2098 return llvm::createStringError(
"unimplemented opcode %s",
2102 if (eval_ctx.dwarf_cu) {
2103 const uint64_t operands_offset = op_offset + 1;
2104 uint64_t offset = operands_offset;
2106 opcode, expr_data, offset, eval_ctx.reg_ctx, eval_ctx.reg_kind,
2115 assert(offset >= op->getEndOffset());
2116 uint64_t offset_to_next_op = offset - op->getEndOffset();
2117 op = op.skipBytes(offset_to_next_op);
2121 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
2127 if (stack.empty()) {
2131 return eval_ctx.pieces;
2133 return llvm::createStringError(
"stack empty after evaluation");
2140 size_t count = stack.size();
2141 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
2142 static_cast<uint64_t
>(count));
2143 for (
size_t i = 0; i < count; ++i) {
2145 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2146 stack[i].Dump(&new_value);
2150 return stack.back();
2165 uint8_t opcode = opcodes.
GetU8(&op_offset);
2167 if (opcode == DW_OP_fbreg) {
2168 int64_t offset = opcodes.
GetSLEB128(&op_offset);
2181 recurse)(operand)) {
2185 return MatchUnaryOp(
2188 MatchImmOp(offset), recurse))(operand);
2191 bool dereference =
false;
2195 if (opcode >= DW_OP_reg0 && opcode <= DW_OP_reg31) {
2196 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_reg0);
2197 }
else if (opcode >= DW_OP_breg0 && opcode <= DW_OP_breg31) {
2199 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_breg0);
2200 }
else if (opcode == DW_OP_regx) {
2201 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2202 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2203 }
else if (opcode == DW_OP_bregx) {
2204 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2206 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2218 MatchRegOp(*reg))(operand)) {
2222 return MatchUnaryOp(
2225 MatchRegOp(*reg), MatchImmOp(offset)))(operand);
2227 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 CheckScalarOperandsHaveSameType(const Scalar &lhs, const Scalar &rhs, LocationAtom opcode, size_t address_size)
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
Scalar::Type GetType() 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.