47#include "llvm/DebugInfo/DWARF/DWARFExpressionUnit.h"
48#include "llvm/DebugInfo/DWARF/LowLevel/DWARFExpression.h"
49#include "llvm/Support/ErrorExtras.h"
54using namespace llvm::dwarf;
60enum LocationDescriptionKind {
72 ExecutionContext *exe_ctx;
73 RegisterContext *reg_ctx;
75 const DWARFExpression::Delegate *dwarf_cu;
78 const Value *initial_value_ptr;
79 const Value *object_address_ptr;
82 StackFrame *frame =
nullptr;
86 std::vector<Value> stack;
88 uint64_t op_piece_bit_offset = 0;
89 LocationDescriptionKind loc_desc_kind =
Memory;
92 EvalContext(ExecutionContext *exe_ctx, RegisterContext *reg_ctx,
94 const DWARFExpression::Delegate *dwarf_cu,
96 const Value *initial_value_ptr,
const Value *object_address_ptr)
97 : exe_ctx(exe_ctx), reg_ctx(reg_ctx), module_sp(std::move(module_sp)),
98 dwarf_cu(dwarf_cu), reg_kind(reg_kind), byte_order(byte_order),
99 initial_value_ptr(initial_value_ptr),
100 object_address_ptr(object_address_ptr) {
102 process = exe_ctx->GetProcessPtr();
103 frame = exe_ctx->GetFramePtr();
104 target = exe_ctx->GetTargetPtr();
106 if (this->reg_ctx ==
nullptr && frame)
107 this->reg_ctx = frame->GetRegisterContext().get();
124 uint8_t addr_byte_size) {
125 if (!const_value_byte_size)
131 m_data.SetAddressByteSize(addr_byte_size);
136 llvm::DIDumpOptions options)
const {
138 auto GetRegName = [&MCRegInfo](uint64_t DwarfRegNum,
139 bool IsEH) -> llvm::StringRef {
142 if (std::optional<unsigned> LLVMRegNum =
143 MCRegInfo->getLLVMRegNum(DwarfRegNum, IsEH))
144 if (
const char *RegName = MCRegInfo->getName(*LLVMRegNum))
145 return llvm::StringRef(RegName);
148 options.GetNameForDWARFReg = GetRegName;
149 llvm::DWARFExpression E(
m_data.GetAsLLVM(),
m_data.GetAddressByteSize());
150 llvm::printDwarfExpression(&E, s->
AsRawOstream(), options);
162 uint32_t reg_num,
Value &value) {
163 if (reg_ctx ==
nullptr)
164 return llvm::createStringError(
"no register context in frame");
166 const uint32_t native_reg =
169 return llvm::createStringError(
170 "unable to convert register kind=%u reg_num=%u to a native "
181 return llvm::Error::success();
186 return llvm::createStringError(
187 "register %s can't be converted to a scalar value", reg_info->
name);
190 return llvm::createStringError(
"register %s is not available",
198 const LocationAtom op,
203 case DW_OP_LLVM_fragment:
204 case DW_OP_LLVM_convert:
205 case DW_OP_LLVM_tag_offset:
206 case DW_OP_LLVM_entry_value:
207 case DW_OP_LLVM_implicit_pointer:
209 case DW_OP_LLVM_extract_bits_sext:
210 case DW_OP_LLVM_extract_bits_zext:
213 case DW_OP_HP_is_value:
214 case DW_OP_HP_fltconst4:
215 case DW_OP_HP_fltconst8:
216 case DW_OP_HP_mod_range:
217 case DW_OP_HP_unmod_range:
219 case DW_OP_INTEL_bit_piece:
220 case DW_OP_WASM_location:
221 case DW_OP_WASM_location_int:
222 case DW_OP_APPLE_uninit:
223 case DW_OP_PGI_omp_thread_num:
225 case DW_OP_GNU_implicit_pointer:
325 case DW_OP_push_object_address:
326 case DW_OP_form_tls_address:
327 case DW_OP_call_frame_cfa:
328 case DW_OP_stack_value:
329 case DW_OP_GNU_push_tls_address:
336 case DW_OP_deref_size:
337 case DW_OP_xderef_size:
338 case DW_OP_deref_type:
363 case DW_OP_plus_uconst:
400 case DW_OP_reinterpret:
403 case DW_OP_xderef_type:
404 case DW_OP_GNU_addr_index:
405 case DW_OP_GNU_const_index:
407 return offset - data_offset;
411 case DW_OP_bit_piece:
412 case DW_OP_regval_type:
415 return offset - data_offset;
417 case DW_OP_implicit_value:
420 uint64_t block_len = data.
GetULEB128(&offset);
422 return offset - data_offset;
425 case DW_OP_implicit_pointer:
433 case DW_OP_GNU_entry_value:
434 case DW_OP_entry_value:
436 uint64_t subexpr_len = data.
GetULEB128(&offset);
437 return (offset - data_offset) + subexpr_len;
440 case DW_OP_const_type:
443 uint8_t length = data.
GetU8(&offset);
444 return (offset - data_offset) + length;
447 case DW_OP_LLVM_user:
449 uint64_t constants = data.
GetULEB128(&offset);
450 return (offset - data_offset) + constants;
461 static char invalid[100];
462 llvm::StringRef llvmstr = llvm::dwarf::OperationEncodingString(val);
463 if (llvmstr.empty()) {
464 snprintf(invalid,
sizeof(invalid),
"Unknown DW_OP constant: 0x%x", val);
467 return llvmstr.data();
473 while (
m_data.ValidOffset(offset)) {
474 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
476 if (op == DW_OP_addr)
477 return m_data.GetAddress(&offset);
479 if (op == DW_OP_GNU_addr_index || op == DW_OP_addrx) {
480 const uint64_t index =
m_data.GetULEB128(&offset);
483 return llvm::createStringError(
"cannot evaluate %s without a DWARF unit",
490 return llvm::createStringError(
"cannot get opcode data size for %s",
493 offset += op_arg_size;
502 while (
m_data.ValidOffset(offset)) {
503 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
505 if (op == DW_OP_addr) {
506 const uint32_t addr_byte_size =
m_data.GetAddressByteSize();
516 m_data.GetByteOrder(), addr_byte_size);
527 if (op == DW_OP_addrx) {
531 llvm::ArrayRef data_before_op =
m_data.GetData().take_front(offset - 1);
535 m_data.GetULEB128(&offset);
536 if (old_offset == offset)
538 llvm::ArrayRef data_after_op =
m_data.GetData().drop_front(offset);
552 offset += op_arg_size;
560 while (
m_data.ValidOffset(offset)) {
561 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
563 if (op == DW_OP_form_tls_address || op == DW_OP_GNU_push_tls_address)
569 offset += op_arg_size;
577 while (
m_data.ValidOffset(offset)) {
578 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
584 case DW_OP_stack_value:
585 case DW_OP_implicit_value:
586 case DW_OP_implicit_pointer:
588 case DW_OP_bit_piece:
598 offset += op_arg_size;
606 &link_address_callback) {
607 const uint32_t addr_byte_size =
m_data.GetAddressByteSize();
615 m_data.GetByteOrder(), addr_byte_size);
620 size_t const_byte_size = 0;
621 while (
m_data.ValidOffset(offset)) {
622 const LocationAtom op =
static_cast<LocationAtom
>(
m_data.GetU8(&offset));
624 bool decoded_data =
false;
629 const_offset = offset;
630 const_value =
m_data.GetU32(&offset);
638 const_offset = offset;
639 const_value =
m_data.GetU64(&offset);
644 case DW_OP_form_tls_address:
645 case DW_OP_GNU_push_tls_address:
656 if (const_byte_size > 0) {
657 lldb::addr_t linked_file_addr = link_address_callback(const_value);
661 if (encoder.
PutUnsigned(const_offset, const_byte_size,
680 offset += op_arg_size;
691static std::optional<Value>
693 llvm::ArrayRef<uint8_t> entry_value,
694 llvm::ArrayRef<uint8_t> &following) {
695 if (!eval_ctx.frame || !eval_ctx.process)
706 llvm::ArrayRef<uint8_t> rest = following;
707 std::optional<Value> value =
710 if (!value || rest.end() != following.end() || rest.size() > following.size())
717 llvm::ArrayRef<uint8_t> subexpr) {
766 return llvm::createStringError(
"no exe/reg context");
771 if (!current_frame || !thread)
772 return llvm::createStringError(
"no current frame/thread");
779 for (uint32_t parent_frame_idx = current_frame_idx + 1;; parent_frame_idx++) {
780 parent_frame = thread->GetStackFrameAtIndex(parent_frame_idx);
789 return_pc = parent_frame->GetFrameCodeAddress().GetLoadAddress(&target);
790 LLDB_LOG(log,
"immediate ancestor with pc = {0:x}", return_pc);
795 if (parent_frame->IsInlined())
801 if (!parent_frame || !parent_frame->GetRegisterContext()) {
802 return llvm::createStringError(
"no parent frame with reg ctx");
806 parent_frame->GetSymbolContext(eSymbolContextFunction).function;
808 return llvm::createStringError(
"no parent function");
815 return llvm::createStringError(
"no current function");
821 if (!parent_frame->IsArtificial()) {
826 return llvm::createStringErrorV(
827 "no call edge for retn-pc = {0:x} in parent frame {1}", return_pc,
831 if (callee.
function != current_func) {
832 return llvm::createStringError(
833 "ambiguous call sequence, can't find real parent frame");
840 if (edge->GetCallee(modlist, parent_exe_ctx).function == current_func) {
841 call_edge = edge.get();
847 return llvm::createStringError(
"no unambiguous edge from parent "
848 "to current function");
856 if (!param.LocationInCallee.GetExpressionData(param_subexpr_extractor))
859 const void *param_subexpr_data =
860 param_subexpr_extractor.
GetData(¶m_subexpr_offset, subexpr.size());
861 if (!param_subexpr_data ||
862 param_subexpr_extractor.
BytesLeft(param_subexpr_offset) != 0)
872 if (memcmp(subexpr.data(), param_subexpr_data, subexpr.size()) == 0) {
873 matched_param = ¶m;
878 return llvm::createStringError(
"no matching call site param found");
886 llvm::Expected<Value> maybe_result = param_expr.
Evaluate(
887 &parent_exe_ctx, parent_frame->GetRegisterContext().get(),
893 "Evaluate_DW_OP_entry_value: call site param evaluation failed");
894 return maybe_result.takeError();
897 eval_ctx.stack.push_back(*maybe_result);
898 return llvm::Error::success();
903 LocationDescriptionKind kind,
904 Value *value =
nullptr) {
911 if (eval_ctx.dwarf_cu && eval_ctx.dwarf_cu->
GetVersion() >= 4) {
913 const char *log_msg =
"DWARF location description kind: %s";
950static llvm::Expected<lldb::addr_t>
953 bool check_sectionoffset =
false) {
954 if (!eval_ctx.module_sp)
955 return llvm::createStringError(
"need module to resolve file address for %s",
958 if (!eval_ctx.module_sp->ResolveFileAddress(file_addr, so_addr))
959 return llvm::createStringError(
"failed to resolve file address in module");
965 return llvm::createStringError(
"failed to resolve load address");
978 size_t size_addr_bytes,
980 DataExtractor addr_data(addr_bytes, size_addr_bytes, byte_order, size);
984 return addr_data.
GetMaxU64(&addr_data_offset, size);
985 return addr_data.
GetAddress(&addr_data_offset);
989 LocationAtom opcode,
unsigned size,
990 size_t size_addr_bytes) {
992 if (eval_ctx.stack.empty())
993 return llvm::createStringError(
"expression stack empty for %s", op_name);
995 if (size == 0 || size > 8)
996 return llvm::createStringError(
"Invalid address size for %s: %u", op_name,
999 if (opcode == DW_OP_deref_size && size > size_addr_bytes)
1000 return llvm::createStringError(
1001 "DW_OP_deref_size size (%u) exceeds address size (%zu)", size,
1007 if (eval_ctx.loc_desc_kind == Register ||
1008 eval_ctx.loc_desc_kind == Implicit) {
1010 eval_ctx.loc_desc_kind =
Memory;
1011 eval_ctx.stack.back().ClearContext();
1015 Scalar scalar = eval_ctx.stack.back().GetScalar();
1019 eval_ctx.stack.back().GetScalar() = scalar;
1020 return llvm::Error::success();
1024 switch (value_type) {
1026 void *src = (
void *)eval_ctx.stack.back().GetScalar().ULongLong();
1028 ::memcpy(&ptr, src,
sizeof(
void *));
1040 ptr = ptr & 0xffffff;
1043 ptr = ptr & 0xffffffff;
1049 ptr = (intptr_t)ptr & 0xffffffffffULL;
1052 ptr = (intptr_t)ptr & 0xffffffffffffULL;
1055 ptr = (intptr_t)ptr & 0xffffffffffffffULL;
1060 eval_ctx.stack.back().GetScalar() = ptr;
1061 eval_ctx.stack.back().ClearContext();
1067 auto maybe_load_addr =
1071 if (!maybe_load_addr)
1072 return maybe_load_addr.takeError();
1074 addr_t load_addr = *maybe_load_addr;
1077 uint8_t addr_bytes[8];
1080 if (!eval_ctx.target ||
1083 return llvm::createStringError(
"failed to dereference pointer for %s: "
1085 op_name,
error.AsCString());
1087 ObjectFile *objfile = eval_ctx.module_sp->GetObjectFile();
1091 eval_ctx.stack.back().ClearContext();
1094 eval_ctx.stack.back().GetScalar() = load_addr;
1104 if (!eval_ctx.exe_ctx)
1105 return llvm::createStringError(
"no execution context for %s", op_name);
1106 if (!eval_ctx.process)
1107 return llvm::createStringError(
"no process for %s", op_name);
1114 if (eval_ctx.process->
ReadMemory(pointer_addr, &addr_bytes, size,
error) !=
1116 return llvm::createStringError(
1117 "failed to dereference pointer from 0x%" PRIx64
" for %s: %s\n",
1118 pointer_addr, op_name,
error.AsCString());
1121 addr_bytes,
sizeof(addr_bytes), eval_ctx.process->
GetByteOrder(), size);
1122 eval_ctx.stack.back().ClearContext();
1126 return llvm::createStringError(
"invalid value for %s", op_name);
1133 eval_ctx.stack.back().GetScalar().TruncOrExtendTo(size * 8,
false);
1134 eval_ctx.stack.back().GetScalar().TruncOrExtendTo(size_addr_bytes * 8,
1136 return llvm::Error::success();
1140 if (bit_size > std::numeric_limits<uint64_t>::max() - 7)
1141 return std::nullopt;
1142 return (bit_size + 7) / 8;
1146 uint8_t bit_in_byte = bit_offset % 8;
1148 bit_in_byte = 7 - bit_in_byte;
1149 return static_cast<uint8_t
>(1u << bit_in_byte);
1155 uint64_t piece_bit_size) {
1156 if (piece_bit_size == 0)
1157 return llvm::Error::success();
1161 return llvm::createStringError(
1162 "unsupported byte order for composite DWARF piece");
1164 if (eval_ctx.op_piece_bit_offset >
1165 std::numeric_limits<uint64_t>::max() - piece_bit_size)
1166 return llvm::createStringError(
"composite DWARF piece size overflow");
1167 const uint64_t next_bit_offset =
1168 eval_ctx.op_piece_bit_offset + piece_bit_size;
1170 std::optional<uint64_t> current_byte_size =
1172 std::optional<uint64_t> next_byte_size =
BitsToBytes(next_bit_offset);
1173 if (!current_byte_size || !next_byte_size ||
1174 *next_byte_size > std::numeric_limits<size_t>::max())
1175 return llvm::createStringError(
"composite DWARF piece size overflow");
1177 return llvm::createStringError(
1178 "composite DWARF piece buffer size does not match its bit offset");
1180 const uint8_t *source_data =
nullptr;
1181 uint64_t source_byte_size = 0;
1182 uint64_t source_bit_offset = 0;
1183 std::vector<uint8_t> scalar_data;
1187 if (piece_bit_size > std::numeric_limits<uint16_t>::max())
1188 return llvm::createStringError(
"scalar DWARF piece is too large");
1189 std::optional<uint64_t> scalar_byte_size =
BitsToBytes(piece_bit_size);
1190 if (!scalar_byte_size ||
1191 *scalar_byte_size > std::numeric_limits<size_t>::max())
1192 return llvm::createStringError(
"scalar DWARF piece is too large");
1194 scalar_data.resize(
static_cast<size_t>(*scalar_byte_size));
1197 scalar_data.data(), scalar_data.size(), eval_ctx.byte_order,
1198 error) != scalar_data.size())
1199 return llvm::createStringError(
"failed to serialize scalar DWARF piece");
1201 source_data = scalar_data.data();
1202 source_byte_size = scalar_data.size();
1206 source_bit_offset = 8 - piece_bit_size % 8;
1216 return llvm::createStringError(
1217 "unsupported value type for composite DWARF piece");
1220 if (source_bit_offset >
1221 std::numeric_limits<uint64_t>::max() - piece_bit_size ||
1222 source_byte_size > std::numeric_limits<uint64_t>::max() / 8 ||
1223 source_bit_offset + piece_bit_size > source_byte_size * 8)
1224 return llvm::createStringError(
"DWARF piece exceeds its source buffer");
1226 if (eval_ctx.pieces.
ResizeData(
static_cast<size_t>(*next_byte_size)) !=
1228 return llvm::createStringError(
1229 "failed to resize composite DWARF piece buffer");
1232 if (eval_ctx.op_piece_bit_offset % 8 == 0 && source_bit_offset % 8 == 0 &&
1233 piece_bit_size % 8 == 0) {
1234 ::memcpy(destination_data + eval_ctx.op_piece_bit_offset / 8,
1235 source_data + source_bit_offset / 8, piece_bit_size / 8);
1237 for (uint64_t i = 0; i < piece_bit_size; ++i) {
1238 const uint64_t source_offset = source_bit_offset + i;
1239 const uint64_t destination_offset = eval_ctx.op_piece_bit_offset + i;
1240 const bool bit = source_data[source_offset / 8] &
1241 GetBitMask(source_offset, eval_ctx.byte_order);
1242 uint8_t &destination_byte = destination_data[destination_offset / 8];
1243 const uint8_t destination_mask =
1244 GetBitMask(destination_offset, eval_ctx.byte_order);
1246 destination_byte |= destination_mask;
1248 destination_byte &=
static_cast<uint8_t
>(~destination_mask);
1252 eval_ctx.op_piece_bit_offset = next_bit_offset;
1253 return llvm::Error::success();
1257 uint64_t piece_byte_size) {
1258 LocationDescriptionKind piece_locdesc = eval_ctx.loc_desc_kind;
1260 eval_ctx.loc_desc_kind =
Memory;
1262 if (piece_byte_size == 0) {
1265 if (!eval_ctx.stack.empty())
1266 eval_ctx.stack.pop_back();
1267 return llvm::Error::success();
1270 if (piece_byte_size > std::numeric_limits<uint64_t>::max() / 8 ||
1271 piece_byte_size > std::numeric_limits<size_t>::max())
1272 return llvm::createStringError(
"DW_OP_piece size overflow");
1273 const uint64_t piece_bit_size = piece_byte_size * 8;
1277 if (eval_ctx.stack.empty()) {
1279 LocationDescriptionKind::Empty);
1291 Value curr_piece_source_value(eval_ctx.stack.back());
1292 eval_ctx.stack.pop_back();
1294 &curr_piece_source_value);
1300 switch (curr_piece_source_value_type) {
1302 return llvm::createStringError(
"invalid value type");
1304 if (eval_ctx.target) {
1309 return llvm::createStringError(
1310 "unable to convert file address 0x%" PRIx64
" to load address "
1311 "for DW_OP_piece(%" PRIu64
"): "
1312 "no target available",
1313 addr, piece_byte_size);
1317 if (eval_ctx.target) {
1318 if (curr_piece.
ResizeData(piece_byte_size) == piece_byte_size) {
1321 piece_byte_size,
error,
1322 false) != piece_byte_size) {
1323 const char *addr_type =
1327 return llvm::createStringError(
1328 "failed to read memory DW_OP_piece(%" PRIu64
1329 ") from %s address 0x%" PRIx64,
1330 piece_byte_size, addr_type, addr);
1333 return llvm::createStringError(
1334 "failed to resize the piece memory buffer for "
1335 "DW_OP_piece(%" PRIu64
")",
1344 if (piece_locdesc == Implicit &&
1347 curr_piece = curr_piece_source_value;
1350 return llvm::createStringError(
1351 "failed to read memory DW_OP_piece(%" PRIu64
1352 ") from host address 0x%" PRIx64,
1353 piece_byte_size, addr);
1357 if (piece_bit_size > std::numeric_limits<uint16_t>::max())
1358 return llvm::createStringError(
"scalar DW_OP_piece is too large");
1359 const uint32_t bit_size =
static_cast<uint32_t
>(piece_bit_size);
1360 uint32_t bit_offset = 0;
1362 return llvm::createStringError(
1363 "unable to extract %" PRIu64
" bytes from a %" PRIu64
1364 " byte scalar value.",
1382 uint64_t relative_die_offset) {
1384 llvm::dwarf::TypeKind encoding;
1385 if (relative_die_offset == 0) {
1389 if (!eval_ctx.module_sp)
1390 return llvm::createStringError(
"no module");
1391 encoding = llvm::dwarf::DW_ATE_unsigned;
1392 bit_size = eval_ctx.module_sp->GetArchitecture().GetAddressByteSize() * 8;
1394 return llvm::createStringError(
"unspecified architecture");
1396 if (!eval_ctx.dwarf_cu)
1397 return llvm::createStringError(
1398 "DW_OP_convert with a DIE offset requires a DWARF unit");
1399 auto bit_size_encoding_or_err =
1401 if (!bit_size_encoding_or_err)
1402 return bit_size_encoding_or_err.takeError();
1403 bit_size = bit_size_encoding_or_err->first;
1404 encoding = bit_size_encoding_or_err->second;
1407 Scalar &scalar = eval_ctx.stack.back().GetScalar();
1408 if (encoding == llvm::dwarf::DW_ATE_float) {
1409 const llvm::fltSemantics *semantics;
1412 semantics = &llvm::APFloat::IEEEsingle();
1415 semantics = &llvm::APFloat::IEEEdouble();
1418 semantics = &llvm::APFloat::x87DoubleExtended();
1421 return llvm::createStringError(
"unsupported floating-point type size");
1427 value.convert(*semantics, llvm::APFloat::rmNearestTiesToEven,
1429 scalar =
Scalar(std::move(value));
1431 return llvm::createStringError(
"cannot convert value to floating point");
1433 return llvm::Error::success();
1436 const bool sign = encoding == llvm::dwarf::DW_ATE_signed ||
1437 encoding == llvm::dwarf::DW_ATE_signed_char;
1439 if (bit_size > std::numeric_limits<uint16_t>::max())
1440 return llvm::createStringError(
"unsupported integer type size: %" PRIu64,
1443 llvm::APSInt value(
static_cast<unsigned>(bit_size),
1446 llvm::APFloat::opStatus status = scalar.
GetAPFloat().convertToInteger(
1447 value, llvm::APFloat::rmTowardZero, &is_exact);
1448 if (status & llvm::APFloat::opInvalidOp)
1449 return llvm::createStringError(
1450 "cannot convert floating-point value to integer");
1451 scalar =
Scalar(std::move(value));
1455 return llvm::Error::success();
1459 LocationAtom opcode) {
1460 if (eval_ctx.stack.empty())
1461 return llvm::createStringError(
"%s needs an argument",
1462 opcode == DW_OP_form_tls_address
1463 ?
"DW_OP_form_tls_address"
1464 :
"DW_OP_GNU_push_tls_address");
1466 if (!eval_ctx.exe_ctx || !eval_ctx.module_sp)
1467 return llvm::createStringError(
"no context to evaluate TLS within");
1471 return llvm::createStringError(
"no thread to evaluate TLS within");
1474 const addr_t tls_file_addr =
1476 const addr_t tls_load_addr =
1477 thread->GetThreadLocalData(eval_ctx.module_sp, tls_file_addr);
1480 return llvm::createStringError(
1481 "no TLS data currently exists for this thread");
1483 eval_ctx.stack.back().GetScalar() = tls_load_addr;
1485 return llvm::Error::success();
1489 int64_t fbreg_offset) {
1490 if (!eval_ctx.exe_ctx)
1491 return llvm::createStringError(
"NULL execution context for DW_OP_fbreg");
1492 if (!eval_ctx.frame)
1493 return llvm::createStringError(
1494 "invalid stack frame in context for DW_OP_fbreg opcode");
1499 value += fbreg_offset;
1500 eval_ctx.stack.push_back(value);
1502 return llvm::Error::success();
1506 if (!eval_ctx.frame)
1507 return llvm::createStringError(
1508 "invalid stack frame in context for DW_OP_call_frame_cfa opcode");
1513 addr_t cfa =
id.GetCallFrameAddressWithMetadata();
1517 return llvm::createStringError(
"stack frame does not include a canonical "
1518 "frame address for DW_OP_call_frame_cfa "
1521 eval_ctx.stack.push_back(
Scalar(cfa));
1523 return llvm::Error::success();
1528 LocationAtom opcode,
1529 size_t address_size) {
1530 auto mismatch = [&](
const char *what) {
1531 return llvm::createStringError(
"%s requires operands to have the same %s",
1539 return mismatch(
"type");
1546 return mismatch(
"size");
1547 return llvm::Error::success();
1561 if (address_size != 0 && lhs.
GetByteSize() >= address_size &&
1563 return llvm::Error::success();
1568 return mismatch(
"size");
1570 return mismatch(
"signedness");
1572 return llvm::Error::success();
1579 size_t address_size) {
1589 const Value *object_address_ptr) {
1591 llvm::DataExtractor expr_data = opcodes.
GetAsLLVM();
1592 llvm::DWARFExpression expr(expr_data, address_size);
1594 if (expr_data.size() == 0)
1595 return llvm::createStringError(
1596 "no location, value may have been optimized out");
1598 EvalContext eval_ctx(exe_ctx, reg_ctx, std::move(module_sp), dwarf_cu,
1600 object_address_ptr);
1602 Stack &stack = eval_ctx.stack;
1604 if (initial_value_ptr)
1605 stack.push_back(*initial_value_ptr);
1615 auto to_generic = [&](
auto v) {
1618 bool is_signed = std::is_signed<
decltype(v)>::value;
1619 return Scalar(llvm::APSInt(
1620 llvm::APInt(8 * address_size, v, is_signed,
true),
1624 llvm::DWARFExpression::iterator op = expr.begin(), op_end = expr.end();
1625 while (op != op_end) {
1626 const uint64_t op_offset = op.getOffset();
1627 const LocationAtom opcode =
static_cast<LocationAtom
>(op->getCode());
1630 size_t count = stack.size();
1631 LLDB_LOGF(log,
"Stack before operation has %" PRIu64
" values:",
1632 static_cast<uint64_t
>(count));
1633 for (
size_t i = 0; i < count; ++i) {
1635 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
1636 stack[i].Dump(&new_value);
1639 LLDB_LOGF(log,
"0x%8.8" PRIx64
": %s", op_offset,
1643 if (std::optional<unsigned> arity = OperationArity(opcode)) {
1644 if (stack.size() < *arity)
1645 return llvm::createStringError(
1646 "%s needs at least %d stack entries (stack has %d entries)",
1652 stack.push_back(to_generic(op->getRawOperand(0)));
1657 size_t size = address_size;
1662 case DW_OP_deref_size: {
1663 size_t size = op->getRawOperand(0);
1664 if (llvm::Error err =
1670 stack.push_back(to_generic(op->getRawOperand(0)));
1673 stack.push_back(to_generic(
static_cast<int8_t
>(op->getRawOperand(0))));
1676 stack.push_back(to_generic(op->getRawOperand(0)));
1679 stack.push_back(to_generic(
static_cast<int16_t
>(op->getRawOperand(0))));
1682 stack.push_back(to_generic(op->getRawOperand(0)));
1685 stack.push_back(to_generic(
static_cast<int32_t
>(op->getRawOperand(0))));
1688 stack.push_back(to_generic(op->getRawOperand(0)));
1691 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1694 stack.push_back(to_generic(op->getRawOperand(0)));
1697 stack.push_back(to_generic(
static_cast<int64_t
>(op->getRawOperand(0))));
1701 if (stack.empty()) {
1702 return llvm::createStringError(
"expression stack empty for DW_OP_dup");
1704 stack.push_back(stack.back());
1708 if (stack.empty()) {
1709 return llvm::createStringError(
"expression stack empty for DW_OP_drop");
1715 stack.push_back(stack[stack.size() - 2]);
1719 uint8_t pick_idx = op->getRawOperand(0);
1720 if (pick_idx < stack.size())
1721 stack.push_back(stack[stack.size() - 1 - pick_idx]);
1723 return llvm::createStringError(
1724 "Index %u out of range for DW_OP_pick.\n", pick_idx);
1730 stack.back() = stack[stack.size() - 2];
1731 stack[stack.size() - 2] = tmp;
1735 size_t last_idx = stack.size() - 1;
1736 Value old_top = stack[last_idx];
1737 stack[last_idx] = stack[last_idx - 1];
1738 stack[last_idx - 1] = stack[last_idx - 2];
1739 stack[last_idx - 2] = old_top;
1743 if (!stack.back().GetScalar().AbsoluteValue()) {
1744 return llvm::createStringError(
1745 "failed to take the absolute value of the first stack item");
1751 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1752 opcode, address_size))
1756 stack.back().GetScalar() = stack.back().GetScalar() & tmp.
GetScalar();
1761 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1762 opcode, address_size))
1766 return llvm::createStringError(
"divide by zero");
1769 Scalar divisor, dividend;
1771 dividend = stack.back().GetScalar();
1774 stack.back() = dividend / divisor;
1776 if (!stack.back().GetScalar().IsValid())
1777 return llvm::createStringError(
"divide failed");
1782 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1783 opcode, address_size))
1787 stack.back().GetScalar() = stack.back().GetScalar() - tmp.
GetScalar();
1792 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1793 opcode, address_size))
1801 stack.back().GetScalar().MakeUnsigned();
1803 stack.back().GetScalar() = stack.back().GetScalar() % tmp.
GetScalar();
1808 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1809 opcode, address_size))
1813 stack.back().GetScalar() = stack.back().GetScalar() * tmp.
GetScalar();
1817 if (!stack.back().GetScalar().UnaryNegate())
1818 return llvm::createStringError(
"unary negate failed");
1822 if (!stack.back().GetScalar().OnesComplement())
1823 return llvm::createStringError(
"logical NOT failed");
1828 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1829 opcode, address_size))
1833 stack.back().GetScalar() = stack.back().GetScalar() | tmp.
GetScalar();
1838 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1839 opcode, address_size))
1843 stack.back().GetScalar() += tmp.
GetScalar();
1846 case DW_OP_plus_uconst: {
1847 const uint64_t uconst_value = op->getRawOperand(0);
1848 Scalar &operand = stack.back().GetScalar();
1849 Scalar addend(uconst_value);
1859 return llvm::createStringError(
"DW_OP_plus_uconst failed");
1864 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1865 opcode, address_size))
1869 stack.back().GetScalar() <<= tmp.
GetScalar();
1874 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1875 opcode, address_size))
1879 if (!stack.back().GetScalar().ShiftRightLogical(tmp.
GetScalar()))
1880 return llvm::createStringError(
"DW_OP_shr failed");
1885 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1886 opcode, address_size))
1890 stack.back().GetScalar() >>= tmp.
GetScalar();
1895 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1896 opcode, address_size))
1900 stack.back().GetScalar() = stack.back().GetScalar() ^ tmp.
GetScalar();
1904 int16_t skip_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1909 if (new_offset <= expr_data.size()) {
1910 op = op.skipBytes(skip_offset);
1913 return llvm::createStringErrorV(
1914 "Invalid opcode offset in DW_OP_skip: {0}+({1}) > {2}",
1915 op->getEndOffset(), skip_offset, expr_data.size());
1921 int16_t bra_offset =
static_cast<int16_t
>(op->getRawOperand(0));
1928 if (new_offset <= expr_data.size()) {
1929 op = op.skipBytes(bra_offset);
1932 return llvm::createStringErrorV(
1933 "Invalid opcode offset in DW_OP_bra: {0}+({1}) > {2}",
1934 op->getEndOffset(), bra_offset, expr_data.size());
1940 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1941 opcode, address_size))
1945 stack.back().GetScalar() =
1946 to_generic(stack.back().GetScalar() == tmp.
GetScalar());
1951 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1952 opcode, address_size))
1960 stack.back().GetScalar().MakeSigned();
1962 stack.back().GetScalar() =
1963 to_generic(stack.back().GetScalar() >= tmp.
GetScalar());
1968 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1969 opcode, address_size))
1977 stack.back().GetScalar().MakeSigned();
1979 stack.back().GetScalar() =
1980 to_generic(stack.back().GetScalar() > tmp.
GetScalar());
1985 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
1986 opcode, address_size))
1994 stack.back().GetScalar().MakeSigned();
1996 stack.back().GetScalar() =
1997 to_generic(stack.back().GetScalar() <= tmp.
GetScalar());
2002 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
2003 opcode, address_size))
2011 stack.back().GetScalar().MakeSigned();
2013 stack.back().GetScalar() =
2014 to_generic(stack.back().GetScalar() < tmp.
GetScalar());
2019 stack[stack.size() - 2].GetScalar(), stack.back().GetScalar(),
2020 opcode, address_size))
2024 stack.back().GetScalar() =
2025 to_generic(stack.back().GetScalar() != tmp.
GetScalar());
2060 stack.push_back(to_generic(opcode - DW_OP_lit0));
2095 eval_ctx.loc_desc_kind = Register;
2096 reg_num = opcode - DW_OP_reg0;
2099 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2101 stack.push_back(tmp);
2104 eval_ctx.loc_desc_kind = Register;
2105 reg_num = op->getRawOperand(0);
2108 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2110 stack.push_back(tmp);
2144 case DW_OP_breg31: {
2145 reg_num = opcode - DW_OP_breg0;
2147 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2150 int64_t breg_offset = op->getRawOperand(0);
2152 tmp.
GetScalar() += to_generic(breg_offset);
2154 stack.push_back(tmp);
2158 reg_num = op->getRawOperand(0);
2160 eval_ctx.reg_ctx, eval_ctx.reg_kind, reg_num, tmp))
2163 int64_t breg_offset = op->getRawOperand(1);
2165 tmp.
GetScalar() += to_generic(breg_offset);
2167 stack.push_back(tmp);
2172 if (llvm::Error err =
2175 stack.back().GetScalar() =
2176 to_generic(stack.back().GetScalar().ULongLong());
2183 if (llvm::Error err =
2188 case DW_OP_bit_piece:
2189 if (stack.size() < 1) {
2191 LocationDescriptionKind::Empty);
2193 eval_ctx.loc_desc_kind =
Memory;
2194 return llvm::createStringError(
2195 "expression stack needs at least 1 item for DW_OP_bit_piece");
2197 const LocationDescriptionKind piece_locdesc = eval_ctx.loc_desc_kind;
2201 eval_ctx.loc_desc_kind =
Memory;
2202 const uint64_t piece_bit_size = op->getRawOperand(0);
2203 const uint64_t piece_bit_offset = op->getRawOperand(1);
2204 if (piece_bit_size == 0) {
2209 switch (stack.back().GetValueType()) {
2211 return llvm::createStringError(
2212 "unable to extract bit value from invalid value");
2214 if (piece_bit_size > std::numeric_limits<uint16_t>::max())
2215 return llvm::createStringError(
2216 "scalar DW_OP_bit_piece is too large");
2218 Value curr_piece(stack.back());
2221 return llvm::createStringError(
2222 "unable to extract %" PRIu64
" bit value with %" PRIu64
2223 " bit offset from a non-integer scalar value.",
2224 piece_bit_size, piece_bit_offset);
2225 const uint64_t scalar_bit_size = scalar.
GetAPSInt().getBitWidth();
2226 if (piece_bit_offset >= scalar_bit_size) {
2227 scalar =
Scalar(llvm::APInt(
static_cast<unsigned>(piece_bit_size),
2230 static_cast<uint32_t
>(piece_bit_size),
2231 static_cast<uint32_t
>(piece_bit_offset))) {
2232 return llvm::createStringError(
2233 "unable to extract %" PRIu64
" bit value with %" PRIu64
2234 " bit offset from a %" PRIu64
" bit scalar value.",
2235 piece_bit_size, piece_bit_offset, scalar_bit_size);
2241 if (llvm::Error err =
2248 return llvm::createStringError(
2249 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
2250 ", bit_offset = %" PRIu64
") from an address value.",
2251 piece_bit_size, piece_bit_offset);
2256 if (piece_locdesc == Implicit && piece_bit_offset == 0 &&
2257 piece_bit_size % 8 == 0 &&
2258 stack.back().GetBuffer().GetByteSize() == piece_bit_size / 8)
2260 return llvm::createStringError(
2261 "unable to extract DW_OP_bit_piece(bit_size = %" PRIu64
2262 ", bit_offset = %" PRIu64
") from an address value.",
2263 piece_bit_size, piece_bit_offset);
2268 case DW_OP_implicit_value: {
2269 eval_ctx.loc_desc_kind = Implicit;
2273 const uint64_t block_size = op->getRawOperand(0);
2274 uint64_t block_offset = op->getRawOperand(1);
2276 llvm::Error
error = llvm::Error::success();
2277 llvm::StringRef block_data =
2278 expr_data.getBytes(&block_offset, block_size, &
error);
2283 Value result(block_data.data(), block_data.size());
2284 stack.push_back(result);
2288 case DW_OP_implicit_pointer: {
2289 eval_ctx.loc_desc_kind = Implicit;
2290 return llvm::createStringError(
"could not evaluate %s",
2294 case DW_OP_push_object_address:
2295 if (eval_ctx.object_address_ptr)
2296 stack.push_back(*eval_ctx.object_address_ptr);
2298 return llvm::createStringError(
"DW_OP_push_object_address used without "
2299 "specifying an object address");
2303 case DW_OP_stack_value:
2304 eval_ctx.loc_desc_kind = Implicit;
2309 if (llvm::Error err =
2314 case DW_OP_call_frame_cfa:
2317 stack.back().GetScalar() =
2318 to_generic(stack.back().GetScalar().ULongLong());
2321 case DW_OP_form_tls_address:
2322 case DW_OP_GNU_push_tls_address:
2328 case DW_OP_GNU_addr_index: {
2329 if (!eval_ctx.dwarf_cu)
2330 return llvm::createStringError(
"DW_OP_GNU_addr_index found without a "
2331 "compile unit being specified");
2332 uint64_t index = op->getRawOperand(0);
2335 stack.push_back(to_generic(value));
2339 case DW_OP_GNU_const_index: {
2340 if (!eval_ctx.dwarf_cu) {
2341 return llvm::createStringError(
"DW_OP_GNU_const_index found without a "
2342 "compile unit being specified");
2344 uint64_t index = op->getRawOperand(0);
2347 stack.push_back(to_generic(value));
2350 case DW_OP_GNU_entry_value:
2351 case DW_OP_entry_value: {
2356 const uint64_t block_size = op->getRawOperand(0);
2357 uint64_t block_offset = op->getEndOffset();
2359 llvm::Error
error = llvm::Error::success();
2360 llvm::ArrayRef<uint8_t> block_data = llvm::arrayRefFromStringRef(
2361 expr_data.getBytes(&block_offset, block_size, &
error));
2368 llvm::ArrayRef<uint8_t> following = llvm::arrayRefFromStringRef(
2369 expr_data.getData().drop_front(block_offset));
2370 const size_t following_size = following.size();
2372 eval_ctx, block_data, following)) {
2373 stack.push_back(*value);
2374 op = op.skipBytes(block_size + following_size - following.size());
2379 return llvm::createStringError(
2380 "could not evaluate DW_OP_entry_value: %s",
2381 llvm::toString(std::move(err)).c_str());
2385 op = op.skipBytes(block_size);
2391 case DW_OP_xderef_size:
2394 case DW_OP_call_ref:
2396 case DW_OP_const_type:
2397 case DW_OP_regval_type:
2398 case DW_OP_deref_type:
2399 case DW_OP_xderef_type:
2400 case DW_OP_reinterpret:
2401 case DW_OP_GNU_implicit_pointer:
2402 return llvm::createStringError(
"unimplemented opcode %s",
2405 case DW_OP_LLVM_user:
2406 if (op->getSubCode() == DW_OP_LLVM_piece_end) {
2407 if (op->getEndOffset() != expr_data.size())
2408 return llvm::createStringError(
2409 "DW_OP_LLVM_piece_end is only supported at the end of an "
2424 if (eval_ctx.dwarf_cu) {
2425 const uint64_t operands_offset = op_offset + 1;
2426 uint64_t offset = operands_offset;
2428 opcode, expr_data, offset, eval_ctx.reg_ctx, eval_ctx.reg_kind,
2437 assert(offset >= op->getEndOffset());
2438 uint64_t offset_to_next_op = offset - op->getEndOffset();
2439 op = op.skipBytes(offset_to_next_op);
2443 return llvm::createStringErrorV(
"unhandled opcode {0} in DWARFExpression",
2449 if (stack.empty()) {
2453 return eval_ctx.pieces;
2455 return llvm::createStringError(
"stack empty after evaluation");
2462 size_t count = stack.size();
2463 LLDB_LOGF(log,
"Stack after operation has %" PRIu64
" values:",
2464 static_cast<uint64_t
>(count));
2465 for (
size_t i = 0; i < count; ++i) {
2467 new_value.
Printf(
"[%" PRIu64
"]",
static_cast<uint64_t
>(i));
2468 stack[i].Dump(&new_value);
2472 return stack.back();
2487 uint8_t opcode = opcodes.
GetU8(&op_offset);
2489 if (opcode == DW_OP_fbreg) {
2490 int64_t offset = opcodes.
GetSLEB128(&op_offset);
2503 recurse)(operand)) {
2507 return MatchUnaryOp(
2510 MatchImmOp(offset), recurse))(operand);
2513 bool dereference =
false;
2517 if (opcode >= DW_OP_reg0 && opcode <= DW_OP_reg31) {
2518 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_reg0);
2519 }
else if (opcode >= DW_OP_breg0 && opcode <= DW_OP_breg31) {
2521 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, opcode - DW_OP_breg0);
2522 }
else if (opcode == DW_OP_regx) {
2523 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2524 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2525 }
else if (opcode == DW_OP_bregx) {
2526 uint32_t reg_num =
static_cast<uint32_t
>(opcodes.
GetULEB128(&op_offset));
2528 reg = reg_ctx_sp->GetRegisterInfo(
m_reg_kind, reg_num);
2540 MatchRegOp(*reg))(operand)) {
2544 return MatchUnaryOp(
2547 MatchRegOp(*reg), MatchImmOp(offset)))(operand);
2549 return MatchRegOp(*reg)(operand);
static llvm::raw_ostream & error(Stream &strm)
static std::optional< Value > EvaluateEntryValueInLanguageRuntime(EvalContext &eval_ctx, llvm::ArrayRef< uint8_t > entry_value, llvm::ArrayRef< uint8_t > &following)
Asks the language runtime of the current function to evaluate DW_OP_entry_value(entry_value),...
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 AppendPieceToComposite(EvalContext &eval_ctx, const Value &piece, uint64_t piece_bit_size)
Appends an eagerly materialized piece at the next composite bit 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 std::optional< uint64_t > BitsToBytes(uint64_t bit_size)
static uint8_t GetBitMask(uint64_t bit_offset, lldb::ByteOrder byte_order)
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)
static bool IsPotentiallyGenericIntegerOperand(const Scalar &operand, size_t address_size)
#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 SymbolContext GetCallee(ModuleList &images, ExecutionContext &exe_ctx)=0
Get the callee's definition, resolved against images.
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 llvm::Expected< std::pair< uint64_t, llvm::dwarf::TypeKind > > GetDIEBitSizeAndEncoding(uint64_t relative_die_offset) const =0
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 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.
lldb::LanguageType GetLanguage() const
virtual std::optional< Value > EvaluateEntryValue(StackFrame &frame, llvm::ArrayRef< uint8_t > entry_value, llvm::ArrayRef< uint8_t > &following)
This allows a language runtime to evaluate DW_OP_entry_value(entry_value) in frame without call site ...
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.
size_t ReadMemory(const ProcessAddress &process_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
lldb::ByteOrder GetByteOrder() const
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
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
llvm::APFloat GetAPFloat() const
size_t GetAsMemoryData(void *dst, size_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
bool FloatPromote(const llvm::fltSemantics &semantics)
bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset)
llvm::APSInt GetAPSInt() const
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.
Defines a symbol context baton that can be handed other debug core functions.
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.
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.