48#define RESOLVED_FRAME_CODE_ADDR (uint32_t(eSymbolContextLastItem) << 1)
49#define RESOLVED_FRAME_ID_SYMBOL_SCOPE (RESOLVED_FRAME_CODE_ADDR << 1)
50#define GOT_FRAME_BASE (RESOLVED_FRAME_ID_SYMBOL_SCOPE << 1)
51#define RESOLVED_VARIABLES (GOT_FRAME_BASE << 1)
52#define RESOLVED_GLOBAL_VARIABLES (RESOLVED_VARIABLES << 1)
57 bool behaves_like_zeroth_frame,
59 : m_thread_wp(thread_sp), m_frame_index(frame_idx),
60 m_concrete_frame_index(unwind_frame_index), m_reg_context_sp(),
61 m_id(
pc, cfa, nullptr), m_frame_code_addr(
pc), m_sc(), m_flags(),
62 m_frame_base(), m_frame_base_error(), m_cfa_is_valid(cfa_is_valid),
63 m_stack_frame_kind(kind),
64 m_behaves_like_zeroth_frame(behaves_like_zeroth_frame),
65 m_variable_list_sp(), m_variable_list_value_objects(),
66 m_recognized_frame_sp(), m_disassembly(), m_mutex() {
74 if (sc_ptr !=
nullptr) {
83 addr_t pc,
bool behaves_like_zeroth_frame,
85 : m_thread_wp(thread_sp), m_frame_index(frame_idx),
86 m_concrete_frame_index(unwind_frame_index),
87 m_reg_context_sp(reg_context_sp), m_id(
pc, cfa, nullptr),
88 m_frame_code_addr(
pc), m_sc(), m_flags(), m_frame_base(),
89 m_frame_base_error(), m_cfa_is_valid(true),
91 m_behaves_like_zeroth_frame(behaves_like_zeroth_frame),
92 m_variable_list_sp(), m_variable_list_value_objects(),
93 m_recognized_frame_sp(), m_disassembly(), m_mutex() {
94 if (sc_ptr !=
nullptr) {
109 const Address &pc_addr,
bool behaves_like_zeroth_frame,
111 : m_thread_wp(thread_sp), m_frame_index(frame_idx),
112 m_concrete_frame_index(unwind_frame_index),
113 m_reg_context_sp(reg_context_sp),
114 m_id(pc_addr.GetLoadAddress(thread_sp->CalculateTarget().get()), cfa,
116 m_frame_code_addr(pc_addr), m_sc(), m_flags(), m_frame_base(),
117 m_frame_base_error(), m_cfa_is_valid(true),
119 m_behaves_like_zeroth_frame(behaves_like_zeroth_frame),
120 m_variable_list_sp(), m_variable_list_value_objects(),
121 m_recognized_frame_sp(), m_disassembly(), m_mutex() {
122 if (sc_ptr !=
nullptr) {
147 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
160 if (scope ==
nullptr) {
179 return thread_sp->GetStackFrameList()->GetVisibleStackFrameIndex(
186 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
192 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
201 TargetSP target_sp(thread_sp->CalculateTarget());
203 const bool allow_section_end =
true;
249 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
258 thread_sp->ClearStackFrames();
263 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
302 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
304 if ((
m_flags.
Get() & resolve_scope) != resolve_scope) {
305 uint32_t resolved = 0;
311 resolved |= eSymbolContextTarget;
330 SymbolContextItem actual_resolve_scope = SymbolContextItem(0);
332 if (resolve_scope & eSymbolContextCompUnit) {
335 resolved |= eSymbolContextCompUnit;
337 actual_resolve_scope |= eSymbolContextCompUnit;
341 if (resolve_scope & eSymbolContextFunction) {
344 resolved |= eSymbolContextFunction;
346 actual_resolve_scope |= eSymbolContextFunction;
350 if (resolve_scope & eSymbolContextBlock) {
353 resolved |= eSymbolContextBlock;
355 actual_resolve_scope |= eSymbolContextBlock;
359 if (resolve_scope & eSymbolContextSymbol) {
362 resolved |= eSymbolContextSymbol;
364 actual_resolve_scope |= eSymbolContextSymbol;
368 if (resolve_scope & eSymbolContextLineEntry) {
371 resolved |= eSymbolContextLineEntry;
373 actual_resolve_scope |= eSymbolContextLineEntry;
377 if (actual_resolve_scope) {
384 lookup_addr, actual_resolve_scope, sc);
388 if ((resolved & eSymbolContextCompUnit) &&
m_sc.
comp_unit ==
nullptr)
390 if ((resolved & eSymbolContextFunction) &&
m_sc.
function ==
nullptr)
392 if ((resolved & eSymbolContextBlock) &&
m_sc.
block ==
nullptr)
394 if ((resolved & eSymbolContextSymbol) &&
m_sc.
symbol ==
nullptr)
396 if ((resolved & eSymbolContextLineEntry) &&
407 resolved |=
m_sc.
target_sp->GetImages().ResolveSymbolContextForAddress(
408 lookup_addr, resolve_scope,
m_sc);
427 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
435 const bool get_child_variables =
true;
436 const bool can_create =
true;
437 const bool stop_if_child_block_is_inlined_function =
true;
439 stop_if_child_block_is_inlined_function,
477 bool must_have_valid_location) {
478 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
487 const bool can_create =
true;
488 const bool get_parent_variables =
true;
489 const bool stop_if_block_is_inlined_function =
true;
491 can_create, get_parent_variables, stop_if_block_is_inlined_function,
492 [
this, must_have_valid_location](
Variable *v) {
493 return v->
IsInScope(
this) && (!must_have_valid_location ||
502 if (global_variable_list_sp)
503 var_list_sp->AddVariables(global_variable_list_sp.get());
535 llvm::StringRef original_var_expr = var_expr;
540 if (var_expr.empty()) {
546 const bool check_ptr_vs_member =
548 const bool no_fragile_ivar =
550 const bool no_synth_child =
556 bool address_of =
false;
558 const bool get_file_globals =
true;
568 std::string var_expr_storage;
569 if (var_expr[0] ==
'*') {
571 var_expr = var_expr.drop_front();
572 }
else if (var_expr[0] ==
'&') {
574 var_expr = var_expr.drop_front();
577 size_t separator_idx = var_expr.find_first_of(
".-[=+~|&^%#@!/?,<>{}");
580 ConstString name_const_string(var_expr.substr(0, separator_idx));
582 var_sp = variable_list->
FindVariable(name_const_string,
false);
584 bool synthetically_added_instance_object =
false;
587 var_expr = var_expr.drop_front(name_const_string.
GetLength());
595 if (!instance_var_name.empty()) {
599 if (
Type *var_type = var_sp->GetType())
600 if (
auto compiler_type = var_type->GetForwardCompilerType())
601 if (!compiler_type.IsPointerType())
602 var_expr_storage =
".";
604 if (var_expr_storage.empty())
605 var_expr_storage =
"->";
606 var_expr_storage += var_expr;
607 var_expr = var_expr_storage;
608 synthetically_added_instance_object =
true;
616 for (
const VariableSP &variable_sp : *variable_list) {
619 if (!variable_sp->GetName().IsEmpty())
622 Type *var_type = variable_sp->GetType();
631 valobj_sp = valobj_sp->GetChildMemberWithName(name_const_string);
637 if (var_sp && !valobj_sp) {
644 "no variable named '{0}' found in this frame", name_const_string);
649 while (!var_expr.empty()) {
652 const char separator_type = var_expr[0];
653 bool expr_is_ptr =
false;
654 switch (separator_type) {
657 if (var_expr.size() >= 2 && var_expr[1] !=
'>')
660 if (no_fragile_ivar) {
663 const uint32_t pointer_type_flags =
664 valobj_sp->GetCompilerType().GetTypeInfo(
nullptr);
665 if ((pointer_type_flags & eTypeIsObjC) &&
666 (pointer_type_flags & eTypeIsPointer)) {
675 if (!valobj_sp->IsPointerType() && valobj_sp->HasSyntheticValue()) {
677 if (valobj_sp->GetCompilerType().IsReferenceType()) {
678 valobj_sp = valobj_sp->GetSyntheticValue()->Dereference(deref_error);
679 if (!valobj_sp || deref_error.
Fail()) {
681 "Failed to dereference reference type: {0}", deref_error);
686 valobj_sp = valobj_sp->Dereference(deref_error);
687 if (!valobj_sp || deref_error.
Fail()) {
689 "Failed to dereference synthetic value: {0}", deref_error);
701 var_expr = var_expr.drop_front();
704 var_expr = var_expr.drop_front();
705 separator_idx = var_expr.find_first_of(
".-[");
706 ConstString child_name(var_expr.substr(0, var_expr.find_first_of(
".-[")));
708 if (check_ptr_vs_member) {
712 const bool actual_is_ptr = valobj_sp->IsPointerType();
714 if (actual_is_ptr != expr_is_ptr) {
717 valobj_sp->GetExpressionPath(var_expr_path_strm);
720 "\"%s\" is a pointer and . was used to attempt to access "
721 "\"%s\". Did you mean \"%s->%s\"?",
723 var_expr_path_strm.
GetData(), var_expr.str().c_str());
726 "\"%s\" is not a pointer and -> was used to attempt to "
727 "access \"%s\". Did you mean \"%s.%s\"?",
729 var_expr_path_strm.
GetData(), var_expr.str().c_str());
733 child_valobj_sp = valobj_sp->GetChildMemberWithName(child_name);
734 if (!child_valobj_sp) {
735 if (!no_synth_child) {
736 child_valobj_sp = valobj_sp->GetSyntheticValue();
739 child_valobj_sp->GetChildMemberWithName(child_name);
742 if (no_synth_child || !child_valobj_sp) {
744 if (synthetically_added_instance_object) {
749 "no variable or instance variable named '%s' found in "
753 valobj_sp->GetExpressionPath(var_expr_path_strm);
756 "\"%s\" is not a member of \"(%s) %s\"",
758 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
762 "incomplete expression path after \"%s\" in \"%s\"",
764 original_var_expr.str().c_str());
770 synthetically_added_instance_object =
false;
772 var_expr = var_expr.drop_front(child_name.
GetLength());
775 child_valobj_sp->GetDynamicValue(use_dynamic));
776 if (dynamic_value_sp)
777 child_valobj_sp = dynamic_value_sp;
784 if (var_expr.size() <= 2) {
786 "invalid square bracket encountered after \"%s\" in \"%s\"",
787 var_expr_path_strm.
GetData(), var_expr.str().c_str());
792 var_expr = var_expr.drop_front();
793 long child_index = 0;
796 size_t end_pos = var_expr.find_first_of(
']');
797 if (end_pos == llvm::StringRef::npos) {
799 "missing closing square bracket in expression \"%s\"",
803 llvm::StringRef index_expr = var_expr.take_front(end_pos);
804 llvm::StringRef original_index_expr = index_expr;
806 var_expr = var_expr.drop_front(end_pos + 1);
808 if (index_expr.consumeInteger(0, child_index)) {
812 "invalid index expression \"%s\"", index_expr.str().c_str());
816 if (index_expr.empty()) {
819 if (valobj_sp->GetCompilerType().IsPointerToScalarType() && deref) {
825 if (!temp || deref_error.
Fail()) {
826 valobj_sp->GetExpressionPath(var_expr_path_strm);
828 "could not dereference \"(%s) %s\"",
829 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
835 }
else if (valobj_sp->GetCompilerType().IsArrayOfScalarType() &&
843 valobj_sp->GetExpressionPath(var_expr_path_strm);
845 "could not get item 0 for \"(%s) %s\"",
846 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
854 bool is_incomplete_array =
false;
855 if (valobj_sp->IsPointerType()) {
856 bool is_objc_pointer =
true;
858 if (valobj_sp->GetCompilerType().GetMinimumLanguage() !=
860 is_objc_pointer =
false;
861 else if (!valobj_sp->GetCompilerType().IsPointerType())
862 is_objc_pointer =
false;
864 if (no_synth_child && is_objc_pointer) {
866 "\"(%s) %s\" is an Objective-C pointer, and cannot be "
868 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
872 }
else if (is_objc_pointer) {
877 || synthetic == valobj_sp)
880 valobj_sp->GetExpressionPath(var_expr_path_strm);
882 "\"(%s) %s\" is not an array type",
883 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
885 }
else if (
static_cast<uint32_t
>(child_index) >=
887 ->GetNumChildrenIgnoringErrors()
890 valobj_sp->GetExpressionPath(var_expr_path_strm);
892 "array index %ld is not valid for \"(%s) %s\"", child_index,
893 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
896 child_valobj_sp = synthetic->GetChildAtIndex(child_index);
897 if (!child_valobj_sp) {
898 valobj_sp->GetExpressionPath(var_expr_path_strm);
900 "array index %ld is not valid for \"(%s) %s\"", child_index,
901 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
907 valobj_sp->GetSyntheticArrayMember(child_index,
true);
908 if (!child_valobj_sp) {
909 valobj_sp->GetExpressionPath(var_expr_path_strm);
911 "failed to use pointer as array for index %ld for "
914 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
918 }
else if (valobj_sp->GetCompilerType().IsArrayType(
919 nullptr,
nullptr, &is_incomplete_array)) {
922 child_valobj_sp = valobj_sp->GetChildAtIndex(child_index);
923 if (!child_valobj_sp && (is_incomplete_array || !no_synth_child))
925 valobj_sp->GetSyntheticArrayMember(child_index,
true);
927 if (!child_valobj_sp) {
928 valobj_sp->GetExpressionPath(var_expr_path_strm);
930 "array index %ld is not valid for \"(%s) %s\"", child_index,
931 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
934 }
else if (valobj_sp->GetCompilerType().IsScalarType()) {
936 child_valobj_sp = valobj_sp->GetSyntheticBitFieldChild(
937 child_index, child_index,
true);
938 if (!child_valobj_sp) {
939 valobj_sp->GetExpressionPath(var_expr_path_strm);
941 "bitfield range %ld-%ld is not valid for \"(%s) %s\"",
942 child_index, child_index,
943 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
948 if (no_synth_child ||
950 || synthetic == valobj_sp)
953 valobj_sp->GetExpressionPath(var_expr_path_strm);
955 "\"(%s) %s\" is not an array type",
956 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
958 }
else if (
static_cast<uint32_t
>(child_index) >=
959 synthetic->GetNumChildrenIgnoringErrors()
961 valobj_sp->GetExpressionPath(var_expr_path_strm);
963 "array index %ld is not valid for \"(%s) %s\"", child_index,
964 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
967 child_valobj_sp = synthetic->GetChildAtIndex(child_index);
968 if (!child_valobj_sp) {
969 valobj_sp->GetExpressionPath(var_expr_path_strm);
971 "array index %ld is not valid for \"(%s) %s\"", child_index,
972 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
978 if (!child_valobj_sp) {
985 child_valobj_sp->GetDynamicValue(use_dynamic));
986 if (dynamic_value_sp)
987 child_valobj_sp = dynamic_value_sp;
995 if (index_expr.front() !=
'-') {
997 "invalid range expression \"'%s'\"",
998 original_index_expr.str().c_str());
1002 index_expr = index_expr.drop_front();
1003 long final_index = 0;
1004 if (index_expr.getAsInteger(0, final_index)) {
1006 "invalid range expression \"'%s'\"",
1007 original_index_expr.str().c_str());
1012 if (child_index > final_index) {
1013 long temp = child_index;
1014 child_index = final_index;
1018 if (valobj_sp->GetCompilerType().IsPointerToScalarType() && deref) {
1025 if (!temp || deref_error.
Fail()) {
1026 valobj_sp->GetExpressionPath(var_expr_path_strm);
1028 "could not dereference \"(%s) %s\"",
1029 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
1030 var_expr_path_strm.
GetData());
1035 }
else if (valobj_sp->GetCompilerType().IsArrayOfScalarType() && deref) {
1042 valobj_sp->GetExpressionPath(var_expr_path_strm);
1044 "could not get item 0 for \"(%s) %s\"",
1045 valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
1046 var_expr_path_strm.
GetData());
1054 valobj_sp->GetSyntheticBitFieldChild(child_index, final_index,
true);
1055 if (!child_valobj_sp) {
1056 valobj_sp->GetExpressionPath(var_expr_path_strm);
1058 "bitfield range %ld-%ld is not valid for \"(%s) %s\"", child_index,
1059 final_index, valobj_sp->GetTypeName().AsCString(
"<invalid type>"),
1060 var_expr_path_strm.
GetData());
1063 if (!child_valobj_sp) {
1070 child_valobj_sp->GetDynamicValue(use_dynamic));
1071 if (dynamic_value_sp)
1072 child_valobj_sp = dynamic_value_sp;
1081 valobj_sp->GetExpressionPath(var_expr_path_strm);
1083 "unexpected char '%c' encountered after \"%s\" in \"%s\"",
1084 separator_type, var_expr_path_strm.
GetData(),
1085 var_expr.str().c_str());
1091 if (child_valobj_sp)
1092 valobj_sp = child_valobj_sp;
1097 valobj_sp = deref_valobj_sp;
1098 }
else if (address_of) {
1100 valobj_sp = address_of_valobj_sp;
1107 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
1110 "No frame base available for this historical stack frame.");
1126 llvm::Expected<Value> expr_value =
1128 &exe_ctx,
nullptr, loclist_base_addr,
nullptr,
nullptr);
1143 return llvm::Error::success();
1158 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
1182 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
1190 const uint32_t num_variables = var_list->
GetSize();
1191 if (var_idx < num_variables) {
1204 ValueObjectSP dynamic_sp = valobj_sp->GetDynamicValue(use_dynamic);
1229 return recognized_frame_sp->ShouldHide();
1238 if (
auto runtime_sp =
1240 return runtime_sp->GetLanguageSpecificData(
1246 const char *name =
nullptr;
1248 eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol);
1251 if (inlined_block) {
1259 if (name ==
nullptr) {
1264 if (name ==
nullptr) {
1273 const char *name =
nullptr;
1275 eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol);
1278 if (inlined_block) {
1286 if (name ==
nullptr) {
1291 if (name ==
nullptr) {
1321std::pair<const Instruction::Operand *, int64_t>
1324 switch (operand.
m_type) {
1330 return std::make_pair(
nullptr, 0);
1342 if (!immediate_child) {
1343 return std::make_pair(
nullptr, 0);
1351 std::pair<const Instruction::Operand *, int64_t> base_and_offset =
1352 GetBaseExplainingValue(*variable_child, register_context,
1354 if (!base_and_offset.first) {
1355 return std::make_pair(
nullptr, 0);
1358 base_and_offset.second -= immediate_child->
m_immediate;
1360 base_and_offset.second += immediate_child->
m_immediate;
1362 return base_and_offset;
1368 return std::make_pair(
nullptr, 0);
1372 return std::make_pair(
nullptr, 0);
1375 return std::make_pair(&operand, 0);
1377 return std::make_pair(
nullptr, 0);
1381 return std::make_pair(
nullptr, 0);
1384std::pair<const Instruction::Operand *, int64_t>
1389 return GetBaseExplainingValue(operand.
m_children[0], register_context,
1392 return std::make_pair(
nullptr, 0);
1399 const ArchSpec &target_arch = target_sp->GetArchitecture();
1405 const char *plugin_name =
nullptr;
1406 const char *flavor =
nullptr;
1407 const char *cpu =
nullptr;
1408 const char *features =
nullptr;
1409 const bool force_live_memory =
true;
1412 target_arch, plugin_name, flavor, cpu, features, *target_sp, pc_range,
1415 if (!disassembler_sp || !disassembler_sp->GetInstructionList().GetSize()) {
1420 disassembler_sp->GetInstructionList().GetInstructionAtIndex(0);
1422 llvm::SmallVector<Instruction::Operand, 3> operands;
1424 if (!instruction_sp->ParseOperands(operands)) {
1430 if (!register_context_sp) {
1435 std::pair<const Instruction::Operand *, int64_t> base_and_offset =
1436 GetBaseExplainingDereference(operand, *register_context_sp, addr);
1438 if (!base_and_offset.first) {
1442 switch (base_and_offset.first->m_type) {
1445 if (target_sp->ResolveLoadAddress(base_and_offset.first->m_immediate +
1446 base_and_offset.second,
1448 auto c_type_system_or_err =
1450 if (
auto err = c_type_system_or_err.takeError()) {
1452 "Unable to guess value for given address: {0}");
1455 auto ts = *c_type_system_or_err;
1470 base_and_offset.second);
1483 if (offset < 0 || uint64_t(offset) >= parent->GetByteSize()) {
1487 if (parent->IsPointerOrReferenceType()) {
1491 for (
int ci = 0, ce = parent->GetNumChildrenIgnoringErrors(); ci != ce;
1499 int64_t child_offset = child_sp->GetByteOffset();
1500 int64_t child_size = child_sp->GetByteSize().value_or(0);
1502 if (offset >= child_offset && offset < (child_offset + child_size)) {
1503 return GetValueForOffset(frame, child_sp, offset - child_offset);
1521 if (!base->IsPointerOrReferenceType()) {
1532 if (offset >= 0 && uint64_t(offset) >= pointee->GetByteSize()) {
1533 int64_t index = offset / pointee->GetByteSize().value_or(1);
1534 offset = offset % pointee->GetByteSize().value_or(1);
1535 const bool can_create =
true;
1536 pointee = base->GetSyntheticArrayMember(index, can_create);
1539 if (!pointee ||
error.Fail()) {
1543 return GetValueForOffset(frame, pointee, offset);
1598 using namespace OperandMatchers;
1615 if (var_sp->LocationExpressionList().MatchesOperand(frame, op))
1619 const uint32_t current_inst =
1625 for (uint32_t ii = current_inst - 1; ii != (uint32_t)-1; --ii) {
1633 if (instruction_sp->IsCall()) {
1639 const char *return_register_name;
1640 if (!abi_sp->GetPointerReturnRegister(return_register_name)) {
1646 return_register_name);
1647 if (!return_register_info) {
1663 llvm::SmallVector<Instruction::Operand, 1> operands;
1664 if (!instruction_sp->ParseOperands(operands) || operands.size() != 1) {
1668 switch (operands[0].m_type) {
1675 operands[0].m_immediate, load_address)) {
1679 load_address, eSymbolContextFunction, sc);
1693 std::string name_str(
1695 name_str.append(
"()");
1698 &frame, name_str, return_value_address, return_type);
1699 return GetValueForDereferincingOffset(frame, return_value_sp, offset);
1706 llvm::SmallVector<Instruction::Operand, 2> operands;
1707 if (!instruction_sp->ParseOperands(operands) || operands.size() != 2) {
1716 if (clobbered_reg_matcher(operands[0])) {
1717 origin_operand = &operands[1];
1719 else if (clobbered_reg_matcher(operands[1])) {
1720 origin_operand = &operands[0];
1729 int64_t origin_offset = 0;
1731 if (
FetchRegOp(origin_register)(*origin_operand)) {
1732 source_path = DoGuessValueAt(frame, origin_register, 0, disassembler,
1733 variables, instruction_sp->GetAddress());
1736 FetchRegOp(origin_register))(*origin_operand) ||
1741 FetchImmOp(origin_offset)))(*origin_operand)) {
1743 DoGuessValueAt(frame, origin_register, origin_offset, disassembler,
1744 variables, instruction_sp->GetAddress());
1749 GetValueForDereferincingOffset(frame, source_path, offset);
1765 const ArchSpec &target_arch = target_sp->GetArchitecture();
1788 const char *plugin_name =
nullptr;
1789 const char *flavor =
nullptr;
1790 const char *cpu =
nullptr;
1791 const char *features =
nullptr;
1792 const bool force_live_memory =
true;
1794 target_arch, plugin_name, flavor, cpu, features, *target_sp, pc_range,
1797 if (!disassembler_sp || !disassembler_sp->GetInstructionList().GetSize()) {
1801 const bool get_file_globals =
false;
1808 return DoGuessValueAt(*
this, reg, offset, *disassembler_sp, *variables,
1821 if (!target_sp && !process_sp)
1829 const bool can_create =
true;
1830 const bool get_parent_variables =
true;
1831 const bool stop_if_block_is_inlined_function =
true;
1834 can_create, get_parent_variables, stop_if_block_is_inlined_function,
1835 [
this](
Variable *v) { return v->IsInScope(this); },
1851 ProcessSP process_sp(thread_sp->CalculateProcess());
1853 target_sp = process_sp->CalculateTarget();
1862 process_sp = thread_sp->CalculateProcess();
1876 llvm::StringRef frame_marker) {
1883 nullptr,
false,
false)) {
1891 const char *frame_marker) {
1892 if (strm ==
nullptr)
1907 Dump(strm,
true,
false);
1913 bool show_fullpaths) {
1914 if (strm ==
nullptr)
1917 if (show_frame_index)
1921 strm->
Printf(
"0x%0*" PRIx64
" ",
1926 const bool show_module =
true;
1927 const bool show_inline =
true;
1928 const bool show_function_arguments =
true;
1929 const bool show_function_name =
true;
1932 show_inline, show_function_arguments,
1933 show_function_name);
1937 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
1949 std::lock_guard<std::recursive_mutex> guard(
m_mutex);
1985 bool show_unique,
const char *frame_marker) {
1986 if (show_frame_info) {
1993 bool have_source =
false, have_debuginfo =
false;
1999 const uint32_t source_lines_before =
2001 const uint32_t source_lines_after =
2007 have_debuginfo =
true;
2008 if (source_lines_before > 0 || source_lines_after > 0) {
2018 source_lines_before, source_lines_after,
"->", &strm);
2023 strm <<
"note: This address is not associated with a specific line "
2024 "of code. This may be due to compiler optimizations.\n";
2027 switch (disasm_display) {
2044 if (disasm_lines > 0) {
2046 const char *plugin_name =
nullptr;
2047 const char *flavor =
nullptr;
2048 const bool mixed_source_and_assembly =
false;
2050 target->
GetDebugger(), target_arch, plugin_name, flavor,
2054 mixed_source_and_assembly, 0,
2066 auto process =
GetThread()->GetProcess();
2070 auto &manager = process->GetTarget().GetFrameRecognizerManager();
2071 auto new_generation = manager.GetGeneration();
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG_ERROR(log, error,...)
#define RESOLVED_GLOBAL_VARIABLES
#define RESOLVED_FRAME_ID_SYMBOL_SCOPE
#define RESOLVED_FRAME_CODE_ADDR
#define RESOLVED_VARIABLES
A section + offset based address range class.
Address & GetBaseAddress()
Get accessor for the base address of the range.
void SetByteSize(lldb::addr_t byte_size)
Set accessor for the byte size of this range.
lldb::addr_t GetByteSize() const
Get accessor for the byte size of this range.
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
lldb::addr_t GetOpcodeLoadAddress(Target *target, AddressClass addr_class=AddressClass::eInvalid) const
Get the load address as an opcode load address.
bool SetOpcodeLoadAddress(lldb::addr_t load_addr, Target *target, AddressClass addr_class=AddressClass::eInvalid, bool allow_section_end=false)
void SetRawAddress(lldb::addr_t addr)
lldb::ModuleSP GetModule() const
Get accessor for the module for this address.
lldb::addr_t GetFileAddress() const
Get the file address.
lldb::addr_t GetOffset() const
Get the section relative offset value.
bool IsValid() const
Check if the object state is valid.
bool IsSectionOffset() const
Check if an address is section offset.
bool SetOffset(lldb::addr_t offset)
Set accessor for the offset.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
uint32_t GetMaximumOpcodeByteSize() const
A class that describes a single lexical block.
Block * GetContainingInlinedBlock()
Get the inlined block that contains this block.
const InlineFunctionInfo * GetInlinedFunctionInfo() const
Get const accessor for any inlined function information.
Function * CalculateSymbolContextFunction() override
uint32_t AppendVariables(bool can_create, bool get_parent_variables, bool stop_if_block_is_inlined_function, const std::function< bool(Variable *)> &filter, VariableList *variable_list)
Appends the variables from this block, and optionally from all parent blocks, to variable_list.
uint32_t AppendBlockVariables(bool can_create, bool get_child_block_variables, bool stop_if_child_block_is_inlined_function, const std::function< bool(Variable *)> &filter, VariableList *variable_list)
Get the variable list for this block and optionally all child blocks if get_child_variables is true.
A class that describes a compilation unit.
lldb::VariableListSP GetVariableList(bool can_create)
Get the variable list for a compile unit.
lldb::LanguageType GetLanguage()
Generic representation of a type in a programming language.
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) const
Create related types using the current type's AST.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
bool IsAnonymousType() const
bool IsFunctionType() const
CompilerType GetFunctionReturnType() const
A uniqued constant string class.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
size_t GetLength() const
Get the length in bytes of string value.
const char * GetCString() const
Get the string value as a C string.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
bool IsAlwaysValidSingleExpr() 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
A class to manage flag bits.
uint64_t GetDisassemblyLineCount() const
StopDisassemblyType GetStopDisassemblyDisplay() const
@ eStopDisassemblyTypeNever
@ eStopDisassemblyTypeNoDebugInfo
@ eStopDisassemblyTypeNoSource
@ eStopDisassemblyTypeAlways
uint64_t GetStopSourceLineCount(bool before) const
const FormatEntity::Entry * GetFrameFormat() const
const FormatEntity::Entry * GetFrameFormatUnique() const
static bool Disassemble(Debugger &debugger, const ArchSpec &arch, const char *plugin_name, const char *flavor, const char *cpu, const char *features, const ExecutionContext &exe_ctx, const Address &start, Limit limit, bool mixed_source_and_assembly, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm)
static lldb::DisassemblerSP DisassembleRange(const ArchSpec &arch, const char *plugin_name, const char *flavor, const char *cpu, const char *features, Target &target, const AddressRange &disasm_range, bool force_live_memory=false)
InstructionList & GetInstructionList()
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
void SetContext(const lldb::TargetSP &target_sp, bool get_process)
Target * GetTargetPtr() const
Returns a pointer to the target object.
Target & GetTargetRef() const
Returns a reference to the target object.
bool IsClear(ValueType bit) const
Test a single flag bit to see if it is clear (zero).
ValueType Get() const
Get accessor for all flags.
ValueType Clear(ValueType mask=~static_cast< ValueType >(0))
Clear one or more flags.
void Reset(ValueType flags)
Set accessor for all flags.
ValueType Set(ValueType mask)
Set one or more flags by logical OR'ing mask with the current flags.
A class that describes a function.
const Address & GetAddress() const
Return the address of the function (its entry point).
void GetStartLineSourceInfo(lldb::SupportFileSP &source_file_sp, uint32_t &line_no)
Find the file and line number of the source location of the start of the function.
const AddressRange & GetAddressRange()
DEPRECATED: Use GetAddressRanges instead.
CompilerType GetCompilerType()
DWARFExpressionList & GetFrameBaseExpression()
Get accessor for the frame base location.
ConstString GetName() const
const Mangled & GetMangled() const
ConstString GetDisplayName() const
Block & GetBlock(bool can_create)
Get accessor for the block list.
A class that describes information for an inlined function.
ConstString GetDisplayName() const
ConstString GetName() const
uint32_t GetIndexOfInstructionAtAddress(const Address &addr)
lldb::InstructionSP GetInstructionAtIndex(size_t idx) const
lldb::LanguageType GuessLanguage() const
Try to guess the language from the mangling.
const RegisterInfo * GetRegisterInfoByName(llvm::StringRef reg_name, uint32_t start_idx=0)
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0
uint64_t GetAsUInt64(uint64_t fail_value=UINT64_MAX, bool *success_ptr=nullptr) const
size_t DisplaySourceLinesWithLineNumbers(lldb::SupportFileSP support_file_sp, uint32_t line, uint32_t column, uint32_t context_before, uint32_t context_after, const char *current_line_cstr, Stream *s, const SymbolContextList *bp_locs=nullptr)
This base class provides an interface to stack frames.
void SetSymbolContextScope(SymbolContextScope *symbol_scope)
uint16_t m_frame_recognizer_generation
lldb::VariableListSP m_variable_list_sp
void UpdatePreviousFrameFromCurrentFrame(StackFrame &curr_frame)
lldb::ThreadSP GetThread() const
Address m_frame_code_addr
The frame code address (might not be the same as the actual PC for inlined frames) as a section/offse...
@ eExpressionPathOptionsNoFragileObjcIvar
@ eExpressionPathOptionCheckPtrVsMember
@ eExpressionPathOptionsInspectAnonymousUnions
@ eExpressionPathOptionsAllowDirectIVarAccess
@ eExpressionPathOptionsNoSyntheticChildren
const char * GetFunctionName()
Get the frame's demangled name.
bool IsHidden()
Query whether this frame should be hidden from backtraces.
VariableList * GetVariableList(bool get_file_globals, Status *error_ptr)
Retrieve the list of variables that are in scope at this StackFrame's pc.
DWARFExpressionList * GetFrameBaseExpression(Status *error_ptr)
Get the DWARFExpressionList corresponding to the Canonical Frame Address.
void UpdateCurrentFrameFromPreviousFrame(StackFrame &prev_frame)
ValueObjectList m_variable_list_value_objects
Value objects for each variable in m_variable_list_sp.
bool m_cfa_is_valid
Does this frame have a CFA? Different from CFA == LLDB_INVALID_ADDRESS.
llvm::Error GetFrameBaseValue(Scalar &value)
Return the Canonical Frame Address (DWARF term) for this frame.
std::optional< lldb::RecognizedStackFrameSP > m_recognized_frame_sp
void DumpUsingSettingsFormat(Stream *strm, bool show_unique=false, const char *frame_marker=nullptr)
Print a description for this frame using the frame-format formatter settings.
bool IsInlined()
Query whether this frame is a concrete frame on the call stack, or if it is an inlined frame derived ...
lldb::ValueObjectSP GetValueForVariableExpressionPath(llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic, uint32_t options, lldb::VariableSP &var_sp, Status &error)
Create a ValueObject for a variable name / pathname, possibly including simple dereference/child sele...
SourceLanguage GuessLanguage()
Similar to GetLanguage(), but is allowed to take a potentially incorrect guess if exact information i...
lldb::RegisterContextSP GetRegisterContext()
Get the RegisterContext for this frame, if possible.
lldb::RegisterContextSP m_reg_context_sp
lldb::ValueObjectSP GuessValueForRegisterAndOffset(ConstString reg, int64_t offset)
Attempt to reconstruct the ValueObject for the address contained in a given register plus an offset.
lldb::VariableListSP GetInScopeVariableList(bool get_file_globals, bool must_have_valid_location=false)
Retrieve the list of variables that are in scope at this StackFrame's pc.
StructuredData::ObjectSP GetLanguageSpecificData()
Language plugins can use this API to report language-specific runtime information about this compile ...
Address GetFrameCodeAddressForSymbolication()
Get the current code Address suitable for symbolication, may not be the same as GetFrameCodeAddress()...
@ History
A historical stack frame – possibly without CFA or registers or local variables.
@ Artificial
An artificial stack frame (e.g.
uint32_t m_concrete_frame_index
lldb::ValueObjectSP DILGetValueForVariableExpressionPath(llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic, uint32_t options, lldb::VariableSP &var_sp, Status &error)
bool m_behaves_like_zeroth_frame
Whether this frame behaves like the zeroth frame, in the sense that its pc value might not immediatel...
lldb::ValueObjectSP GuessValueForAddress(lldb::addr_t addr)
Attempt to econstruct the ValueObject for a given raw address touched by the current instruction.
bool ChangePC(lldb::addr_t pc)
Change the pc value for a given thread.
lldb::ValueObjectSP LegacyGetValueForVariableExpressionPath(llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic, uint32_t options, lldb::VariableSP &var_sp, Status &error)
Private methods, called from GetValueForVariableExpressionPath.
lldb::ThreadSP CalculateThread() override
SourceLanguage GetLanguage()
Query this frame to determine what the default language should be when parsing expressions given the ...
lldb::ValueObjectSP GetValueObjectForFrameVariable(const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic)
Create a ValueObject for a given Variable in this StackFrame.
bool HasCachedData() const
StreamString m_disassembly
lldb::StackFrameSP CalculateStackFrame() override
const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
const char * GetDisplayFunctionName()
Get the frame's demangled display name.
Status m_frame_base_error
bool IsHistorical() const
Query whether this frame is part of a historical backtrace.
const char * Disassemble()
Return the disassembly for the instructions of this StackFrame's function as a single C string.
bool IsArtificial() const
Query whether this frame is artificial (e.g a synthesized result of inferring missing tail call frame...
void CalculateExecutionContext(ExecutionContext &exe_ctx) override
Reconstruct the object's execution context into sc.
void Dump(Stream *strm, bool show_frame_index, bool show_fullpaths)
Print a description for this frame using a default format.
uint32_t GetFrameIndex() const
Query this frame to find what frame it is in this Thread's StackFrameList.
bool HasDebugInformation()
Determine whether this StackFrame has debug information available or not.
bool GetStatus(Stream &strm, bool show_frame_info, bool show_source, bool show_unique=false, const char *frame_marker=nullptr)
Print a description of this stack frame and/or the source context/assembly for this stack frame.
Block * GetFrameBlock()
Get the current lexical scope block for this StackFrame, if possible.
bool DumpUsingFormat(Stream &strm, const lldb_private::FormatEntity::Entry *format, llvm::StringRef frame_marker={})
Print a description of this frame using the provided frame format.
lldb::ProcessSP CalculateProcess() override
lldb::RecognizedStackFrameSP GetRecognizedFrame()
std::recursive_mutex m_mutex
StackFrame(const lldb::ThreadSP &thread_sp, lldb::user_id_t frame_idx, lldb::user_id_t concrete_frame_idx, lldb::addr_t cfa, bool cfa_is_valid, lldb::addr_t pc, Kind frame_kind, bool behaves_like_zeroth_frame, const SymbolContext *sc_ptr)
Construct a StackFrame object without supplying a RegisterContextSP.
lldb::ValueObjectSP FindVariable(ConstString name)
Attempt to reconstruct the ValueObject for a variable with a given name from within the current Stack...
const Address & GetFrameCodeAddress()
Get an Address for the current pc value in this StackFrame.
lldb::TargetSP CalculateTarget() override
void SetPC(lldb::addr_t pc)
SymbolContextScope * GetSymbolContextScope() const
lldb::addr_t GetPC() const
void SetSymbolContextScope(SymbolContextScope *symbol_scope)
void SetCFA(lldb::addr_t cfa)
void Clear()
Clear the object state.
llvm::Error ToError() const
FIXME: Replace all uses with takeError() instead.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
size_t EOL()
Output and End of Line character to the stream.
std::shared_ptr< Object > ObjectSP
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
llvm::StringRef GetInstanceVariableName()
Determines the name of the instance variable for the this decl context.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
CompileUnit * comp_unit
The CompileUnit for a given query.
bool DumpStopContext(Stream *s, ExecutionContextScope *exe_scope, const Address &so_addr, bool show_fullpaths, bool show_module, bool show_inlined_frames, bool show_function_arguments, bool show_function_name, bool show_function_display_name=false, std::optional< Stream::HighlightSettings > settings=std::nullopt) const
Dump the stop context in this object to a Stream.
uint32_t GetResolvedMask() const
void Clear(bool clear_target)
Clear the object's state.
Symbol * symbol
The Symbol for a given query.
lldb::TargetSP target_sp
The Target for a given query.
LineEntry line_entry
The LineEntry for a given query.
Provides public interface for all SymbolFiles.
Status GetFrameVariableError(StackFrame &frame)
Get an error that describes why variables might be missing for a given symbol context.
ConstString GetName() const
ConstString GetDisplayName() const
const char * GetDisassemblyFeatures() const
const char * GetDisassemblyCPU() const
bool GetUseDIL(ExecutionContext *exe_ctx) const
SourceManager & GetSourceManager()
const ArchSpec & GetArchitecture() const
CompilerType GetForwardCompilerType()
void SetValueObjectAtIndex(size_t idx, const lldb::ValueObjectSP &valobj_sp)
lldb::ValueObjectSP GetValueObjectAtIndex(size_t idx)
void Swap(ValueObjectList &value_object_list)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, llvm::StringRef name, const Address &address, lldb::TypeSP &type_sp)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp)
lldb::VariableSP FindVariable(ConstString name, bool include_static_members=true)
uint32_t FindIndexForVariable(Variable *variable)
bool IsInScope(StackFrame *frame)
bool LocationIsValidForFrame(StackFrame *frame)
#define LLDB_INVALID_ADDRESS
std::function< bool(const Instruction::Operand &)> MatchRegOp(const RegisterInfo &info)
std::function< bool(const Instruction::Operand &)> FetchRegOp(ConstString ®)
std::function< bool(const Instruction::Operand &)> FetchImmOp(int64_t &imm)
std::function< bool(const Instruction::Operand &)> MatchOpType(Instruction::Operand::Type type)
std::function< bool(const Instruction::Operand &)> MatchBinaryOp(std::function< bool(const Instruction::Operand &)> base, std::function< bool(const Instruction::Operand &)> left, std::function< bool(const Instruction::Operand &)> right)
std::function< bool(const Instruction::Operand &)> MatchUnaryOp(std::function< bool(const Instruction::Operand &)> base, std::function< bool(const Instruction::Operand &)> child)
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::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::RecognizedStackFrame > RecognizedStackFrameSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::SupportFile > SupportFileSP
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeC
Non-standardized C, such as K&R.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::Instruction > InstructionSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Disassembler > DisassemblerSP
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::Variable > VariableSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::Module > ModuleSP
enum lldb_private::Instruction::Operand::Type m_type
static Operand BuildImmediate(lldb::addr_t imm, bool neg)
static Operand BuildDereference(const Operand &ref)
std::vector< Operand > m_children
static Operand BuildSum(const Operand &lhs, const Operand &rhs)
static Operand BuildRegister(ConstString &r)
uint16_t column
The column number of the source line, or zero if there is no column information.
bool IsValid() const
Check if a line entry object is valid.
uint32_t line
The source line number, or LLDB_INVALID_LINE_NUMBER if there is no line number information.
lldb::SupportFileSP file_sp
The source file, possibly mapped by the target.source-map setting.
void ApplyFileMappings(lldb::TargetSP target_sp)
Apply file mappings from target.source-map to the LineEntry's file.
Every register is described in detail including its name, alternate name (optional),...
A type-erased pair of llvm::dwarf::SourceLanguageName and version.
lldb::LanguageType AsLanguageType() const