22#include "lldb/Host/Config.h"
54#include "llvm/Support/Compiler.h"
92 m_flags.m_is_synthetic_children_generated =
109 const ArchSpec &arch = target_sp->GetArchitecture();
122 bool did_change_formats =
false;
136 if (update_format && !did_change_formats)
150 m_flags.m_old_value_valid =
false;
152 m_flags.m_old_value_valid =
true;
167 bool need_compare_checksums =
false;
168 llvm::SmallVector<uint8_t, 16> old_checksum;
171 need_compare_checksums =
true;
174 old_checksum.begin());
183 const uint64_t max_checksum_size = 128;
186 need_compare_checksums =
false;
190 assert(!need_compare_checksums ||
195 else if (!
m_flags.m_value_did_change && !success) {
199 }
else if (need_compare_checksums) {
214 "[%s %p] checking for FormatManager revisions. ValueObject "
215 "rev: %d - Global rev: %d",
216 GetName().GetCString(),
static_cast<void *
>(
this),
220 bool any_change =
false;
244 m_flags.m_children_count_valid =
false;
245 m_flags.m_did_calculate_complete_objc_class_type =
false;
256 if (
m_flags.m_did_calculate_complete_objc_class_type) {
260 return compiler_type;
263 m_flags.m_did_calculate_complete_objc_class_type =
true;
269 return compiler_type;
273 if (std::optional<CompilerType> complete_type =
274 runtime->GetRuntimeType(compiler_type)) {
280 return compiler_type;
301 switch (value_type) {
327 sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
346 if (bitfield_bit_size)
357 LazyBool is_logical_true = language->IsLogicalTrue(*
this,
error);
358 switch (is_logical_true) {
361 return (is_logical_true ==
true);
387 if (can_create && !
m_children.HasChildAtIndex(idx)) {
394 if (child !=
nullptr)
395 return child->
GetSP();
402 if (names.size() == 0)
405 for (llvm::StringRef name : names) {
406 root = root->GetChildMemberWithName(name);
414llvm::Expected<size_t>
416 bool omit_empty_base_classes =
true;
418 omit_empty_base_classes);
430 std::vector<uint32_t> child_indexes;
431 bool omit_empty_base_classes =
true;
436 const size_t num_child_indexes =
438 name, omit_empty_base_classes, child_indexes);
439 if (num_child_indexes == 0)
443 for (uint32_t idx : child_indexes)
445 child_sp = child_sp->GetChildAtIndex(idx, can_create);
453 if (
m_flags.m_children_count_valid) {
454 size_t children_count =
m_children.GetChildrenCount();
455 return children_count <= max ? children_count : max;
460 if (!
m_flags.m_children_count_valid) {
462 if (num_children_or_err)
465 return num_children_or_err;
473 return *value_or_err;
480 bool has_children =
false;
483 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
493 m_flags.m_children_count_valid =
true;
498 bool omit_empty_base_classes =
true;
499 bool ignore_array_bounds =
false;
500 std::string child_name;
501 uint32_t child_byte_size = 0;
502 int32_t child_byte_offset = 0;
503 uint32_t child_bitfield_bit_size = 0;
504 uint32_t child_bitfield_bit_offset = 0;
505 bool child_is_base_class =
false;
506 bool child_is_deref_of_parent =
false;
507 uint64_t language_flags = 0;
508 const bool transparent_pointers =
true;
512 auto child_compiler_type_or_err =
514 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
515 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
516 child_bitfield_bit_size, child_bitfield_bit_offset,
517 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
518 if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
520 child_compiler_type_or_err.takeError(),
521 "could not find child: {0}");
526 *
this, *child_compiler_type_or_err,
ConstString(child_name),
527 child_byte_size, child_byte_offset, child_bitfield_bit_size,
528 child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
533 bool omit_empty_base_classes =
true;
534 bool ignore_array_bounds =
true;
535 std::string child_name;
536 uint32_t child_byte_size = 0;
537 int32_t child_byte_offset = 0;
538 uint32_t child_bitfield_bit_size = 0;
539 uint32_t child_bitfield_bit_offset = 0;
540 bool child_is_base_class =
false;
541 bool child_is_deref_of_parent =
false;
542 uint64_t language_flags = 0;
543 const bool transparent_pointers =
false;
547 auto child_compiler_type_or_err =
549 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
550 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
551 child_bitfield_bit_size, child_bitfield_bit_offset,
552 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
553 if (!child_compiler_type_or_err) {
555 child_compiler_type_or_err.takeError(),
556 "could not find child: {0}");
560 if (child_compiler_type_or_err->IsValid()) {
561 child_byte_offset += child_byte_size * idx;
564 *
this, *child_compiler_type_or_err,
ConstString(child_name),
565 child_byte_size, child_byte_offset, child_bitfield_bit_size,
566 child_bitfield_bit_offset, child_is_base_class,
573 return synth_valobj_sp->GetChildAtIndex(idx,
true).get();
579 std::string &destination,
586 std::string &destination,
594 destination =
"<incomplete type>";
600 if (
m_flags.m_is_getting_summary)
603 m_flags.m_is_getting_summary =
true;
627 target_sp->GetSummaryStatisticsCache()
628 .GetSummaryStatisticsForProvider(*summary_ptr);
632 summary_ptr->
FormatObject(
this, destination, actual_options);
634 summary_ptr->
FormatObject(
this, destination, actual_options);
636 m_flags.m_is_getting_summary =
false;
637 return !destination.empty();
660 bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
661 pointee_or_element_compiler_type.
IsCharType());
662 if (!is_char_arr_ptr)
666 if (type_flags.
Test(eTypeIsArray))
673 uint32_t item_count) {
675 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
676 const bool is_pointer_type = type_info & eTypeIsPointer;
677 const bool is_array_type = type_info & eTypeIsArray;
678 if (!(is_pointer_type || is_array_type))
686 std::optional<uint64_t> item_type_size =
687 llvm::expectedToOptional(pointee_or_element_compiler_type.
GetByteSize(
691 const uint64_t bytes = item_count * *item_type_size;
692 const uint64_t offset = item_idx * *item_type_size;
694 if (item_idx == 0 && item_count == 1)
696 if (is_pointer_type) {
699 if (
error.Fail() || pointee_sp.get() ==
nullptr)
701 return pointee_sp->GetData(data,
error);
704 if (child_sp.get() ==
nullptr)
707 return child_sp->GetData(data,
error);
717 auto [addr, addr_type] =
724 addr = addr + offset;
726 module_sp->ResolveFileAddress(addr, so_addr);
733 if (
error.Success()) {
747 target->ReadMemory(target_addr, heap_buf_ptr->
GetBytes(), bytes,
749 if (
error.Success() || bytes_read > 0) {
758 if (max_bytes && *max_bytes > offset) {
759 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
763 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
780 if (
m_data.GetByteSize()) {
804 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
808 switch (value_type) {
814 m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
818 "unable to set scalar value: %s", set_error.
AsCString());
831 if (!
error.Success())
833 if (bytes_written != byte_size) {
843 m_data.SetData(buffer_sp, 0);
845 const_cast<uint8_t *
>(
m_data.GetDataStart()),
846 byte_size,
m_data.GetByteOrder());
866 if ((uint64_t)
m_data.GetDataStart() == start)
869 if ((uint64_t)
m_value.GetBuffer().GetBytes() == start)
870 return m_value.GetBuffer().GetData();
877 llvm::StringRef src = source.
GetString();
878 src = src.rtrim(
'\0');
879 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
880 memcpy(destination->GetBytes(), src.data(), src.size());
884std::pair<size_t, bool>
887 bool was_capped =
false;
893 s <<
"<no target to read from>";
896 return {0, was_capped};
901 size_t bytes_read = 0;
902 size_t total_bytes_read = 0;
907 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
912 bool capped_data =
false;
913 const bool is_array = type_flags.
Test(eTypeIsArray);
916 uint64_t array_size = 0;
917 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
918 cstr_len = array_size;
919 if (cstr_len > max_length) {
921 cstr_len = max_length;
930 if (cstr_address.
address == 0 ||
934 if (cstr ==
nullptr) {
935 s <<
"<invalid address>";
938 return {0, was_capped};
940 s << llvm::StringRef(cstr, cstr_len);
942 return {cstr_len, was_capped};
944 s <<
"<invalid address>";
947 return {0, was_capped};
953 if (cstr_len > 0 && honor_array) {
961 total_bytes_read = bytes_read;
962 for (
size_t offset = 0; offset < bytes_read; offset++)
968 cstr_len = max_length;
969 const size_t k_max_buf_size = 64;
973 int cstr_len_displayed = -1;
974 bool capped_cstr =
false;
979 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
980 total_bytes_read += bytes_read;
981 const char *cstr = data.
PeekCStr(0);
982 size_t len = strnlen(cstr, k_max_buf_size);
983 if (cstr_len_displayed < 0)
984 cstr_len_displayed = len;
988 cstr_len_displayed += len;
989 if (len > bytes_read)
994 for (
size_t offset = 0; offset < bytes_read; offset++)
997 if (len < k_max_buf_size)
1000 if (len >= cstr_len) {
1009 if (cstr_len_displayed >= 0) {
1016 s <<
"<not a string object>";
1019 return {total_bytes_read, was_capped};
1024 return llvm::createStringError(
"could not update value");
1033 return llvm::createStringError(
"no process");
1036 auto get_object_description =
1037 [&](
LanguageType language) -> llvm::Expected<std::string> {
1040 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1045 return llvm::createStringError(
"no native language runtime");
1050 llvm::Expected<std::string> desc = get_object_description(native_language);
1058 llvm::consumeError(desc.takeError());
1065 std::string &destination) {
1073 std::string &destination) {
1085 if (
m_flags.m_is_bitfield_for_scalar)
1091 my_format = reg_info->
format;
1101 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1162 return llvm::createStringError(
"type cannot be converted to APSInt");
1170 return llvm::createStringError(
"error occurred; unable to convert to APSInt");
1175 return llvm::createStringError(
"type cannot be converted to APFloat");
1183 return llvm::createStringError(
1184 "error occurred; unable to convert to APFloat");
1193 return value_or_err->getBoolValue();
1198 return value_or_err->isNonZero();
1203 return llvm::createStringError(
"type cannot be converted to bool");
1207 bool can_update_var) {
1222 "Not allowed to update program variables in this case.");
1228 uint64_t byte_size = 0;
1231 byte_size = temp.value();
1232 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1234 "illegal argument: new value should be of the same size");
1239 reinterpret_cast<const void *
>(value.getRawData()), byte_size,
1240 target->GetArchitecture().GetByteOrder(),
1241 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1261 "Not allowed to update program variables in this case.");
1266 CompilerType new_val_type = new_val_sp->GetCompilerType();
1270 "illegal argument: new value should be of the same size");
1275 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1281 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1288 bool success =
true;
1289 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1292 uint64_t num_bits = 0;
1293 if (
auto temp = llvm::expectedToOptional(
1294 new_val_sp->GetCompilerType().GetBitSize(target.get())))
1295 num_bits = temp.value();
1310 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1317 if (flags.
Test(eTypeIsArray)) {
1343 bool do_dump_error) {
1356 bool allow_special =
1358 const bool only_special =
false;
1360 if (allow_special) {
1361 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1374 std::pair<size_t, bool> read_string =
1378 lldb_private::formatters::StringPrinter::
1379 ReadBufferAndDumpToStreamOptions options(*
this);
1383 options.SetStream(&s);
1384 options.SetPrefixToken(
nullptr);
1385 options.SetQuote(
'"');
1386 options.SetSourceSize(buffer_sp->GetByteSize());
1387 options.SetIsTruncated(read_string.second);
1390 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1392 return !
error.Fail();
1400 if (flags.
Test(eTypeIsArray)) {
1406 for (
size_t low = 0; low < count; low++) {
1413 s <<
"<invalid child>";
1416 child->DumpPrintableRepresentation(
1447 for (
size_t low = 0; low < count; low++) {
1454 s <<
"<invalid child>";
1457 child->DumpPrintableRepresentation(
1490 bool var_success =
false;
1493 llvm::StringRef str;
1504 switch (val_obj_display) {
1516 strm <<
"error: " <<
toString(desc.takeError());
1530 strm.
Printf(
"%" PRIu32, *err);
1533 strm <<
"error: " <<
toString(err.takeError());
1582 else if (val_obj_display ==
1584 s.
PutCString(
"<not a valid Objective-C object>");
1589 s.
PutCString(
"<no printable representation>");
1613 switch (
m_value.GetValueType()) {
1617 if (scalar_is_load_address) {
1626 m_value.GetValueAddressType()};
1630 llvm_unreachable(
"Unhandled value type!");
1637 if (
ABISP abi_sp = process->GetABI())
1638 return abi_sp->FixCodeAddress(address);
1640 return std::nullopt;
1647 switch (
m_value.GetValueType()) {
1662 llvm_unreachable(
"Unhandled value type!");
1666 const char *value_str) {
1668 if (
auto boolean = language->GetBooleanFromString(value_str))
1669 return *
boolean ?
"1" :
"0";
1671 return llvm::StringSwitch<const char *>(value_str)
1674 .Default(value_str);
1688 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
1694 m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1695 }
else if (byte_size <= 16) {
1704 if (
error.Success()) {
1705 switch (value_type) {
1716 target_addr, new_scalar, byte_size,
error);
1717 if (!
error.Success())
1719 if (bytes_written != byte_size) {
1732 m_data.SetData(buffer_sp, 0);
1733 bool success = new_scalar.
GetData(new_data);
1736 0, byte_size,
const_cast<uint8_t *
>(
m_data.GetDataStart()),
1737 byte_size,
m_data.GetByteOrder());
1775 std::map<ConstString, ValueObject *>::const_iterator pos =
1778 synthetic_child_sp = pos->second->GetSP();
1779 return synthetic_child_sp;
1802 if (runtime->IsAllowedRuntimeValue(
GetName()))
1810 return language->IsNilReference(*
this);
1817 return language->IsUninitializedReference(*
this);
1835 std::string index_str = llvm::formatv(
"[{0}]", index);
1840 if (!synthetic_child_sp) {
1847 if (synthetic_child) {
1849 synthetic_child_sp = synthetic_child->
GetSP();
1850 synthetic_child_sp->SetName(
ConstString(index_str));
1851 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1855 return synthetic_child_sp;
1862 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1867 if (!synthetic_child_sp) {
1868 uint32_t bit_field_size = to - from + 1;
1869 uint32_t bit_field_offset = from;
1872 llvm::expectedToOptional(
GetByteSize()).value_or(0) * 8 -
1873 bit_field_size - bit_field_offset;
1878 llvm::expectedToOptional(
GetByteSize()).value_or(0), 0,
1883 if (synthetic_child) {
1885 synthetic_child_sp = synthetic_child->
GetSP();
1886 synthetic_child_sp->SetName(
ConstString(index_str));
1887 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1891 return synthetic_child_sp;
1895 uint32_t offset,
const CompilerType &type,
bool can_create,
1900 if (name_const_str.
IsEmpty()) {
1901 name_const_str.
SetString(
"@" + std::to_string(offset));
1908 if (synthetic_child_sp.get())
1909 return synthetic_child_sp;
1915 std::optional<uint64_t> size = llvm::expectedToOptional(
1922 if (synthetic_child) {
1924 synthetic_child_sp = synthetic_child->
GetSP();
1925 synthetic_child_sp->SetName(name_const_str);
1926 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1928 return synthetic_child_sp;
1937 if (name_const_str.
IsEmpty()) {
1939 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1948 if (synthetic_child_sp.get())
1949 return synthetic_child_sp;
1954 const bool is_base_class =
true;
1957 std::optional<uint64_t> size = llvm::expectedToOptional(
1964 if (synthetic_child) {
1966 synthetic_child_sp = synthetic_child->
GetSP();
1967 synthetic_child_sp->SetName(name_const_str);
1969 return synthetic_child_sp;
1977 if (!expression || !expression[0])
1979 if (expression[0] ==
'.')
1980 return expression + 1;
1981 if (expression[0] ==
'-' && expression[1] ==
'>')
1982 return expression + 2;
1994 if (!synthetic_child_sp) {
1998 expression,
nullptr,
nullptr,
2004 if (synthetic_child_sp.get()) {
2008 synthetic_child_sp->SetName(
2012 return synthetic_child_sp;
2017 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2114 if (
m_flags.m_is_synthetic_children_generated) {
2123 uint64_t load_addr =
2144 if (is_deref_of_parent &&
2176 if (
m_flags.m_is_array_item_for_pointer &&
2181 if (!is_deref_of_parent) {
2183 if (non_base_class_parent &&
2187 if (non_base_class_parent_compiler_type) {
2192 const uint32_t non_base_class_parent_type_info =
2193 non_base_class_parent_compiler_type.
GetTypeInfo();
2195 if (non_base_class_parent_type_info & eTypeIsPointer) {
2197 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2198 !(non_base_class_parent_type_info & eTypeIsArray)) {
2211 if (is_deref_of_parent &&
2223 using SynthTraversal =
2227 if (synth_traversal == SynthTraversal::FromSynthetic ||
2228 synth_traversal == SynthTraversal::Both)
2231 if (synth_traversal == SynthTraversal::ToSynthetic ||
2232 synth_traversal == SynthTraversal::Both)
2247 if (!result ||
error.Fail()) {
2250 result = alt_obj->Dereference(
error);
2270 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2271 final_value_type ? final_value_type : &dummy_final_value_type, options,
2272 final_task_on_target ? final_task_on_target
2273 : &dummy_final_task_on_target);
2275 if (!final_task_on_target ||
2279 if (ret_val.get() &&
2280 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2284 if ((final_task_on_target ? *final_task_on_target
2285 : dummy_final_task_on_target) ==
2290 if (
error.Fail() || !final_value.get()) {
2294 if (final_value_type)
2298 if (final_task_on_target)
2303 if (*final_task_on_target ==
2307 if (
error.Fail() || !final_value.get()) {
2311 if (final_value_type)
2315 if (final_task_on_target)
2335 llvm::StringRef remainder = expression;
2338 llvm::StringRef temp_expression = remainder;
2340 CompilerType root_compiler_type = root->GetCompilerType();
2342 Flags pointee_compiler_type_info;
2344 Flags root_compiler_type_info(
2345 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2346 if (pointee_compiler_type)
2349 if (temp_expression.empty()) {
2354 switch (temp_expression.front()) {
2356 temp_expression = temp_expression.drop_front();
2358 root_compiler_type_info.
Test(eTypeIsPointer))
2368 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2371 root_compiler_type_info.
Test(eTypeIsPointer) &&
2378 if (!temp_expression.starts_with(
">")) {
2389 temp_expression.front() ==
'.' &&
2390 root_compiler_type_info.
Test(eTypeIsPointer))
2400 temp_expression = temp_expression.drop_front();
2402 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2403 if (next_sep_pos == llvm::StringRef::npos) {
2405 llvm::StringRef child_name = temp_expression;
2407 root->GetChildMemberWithName(child_name);
2408 if (!child_valobj_sp) {
2411 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2413 if (child_valobj_sp) {
2417 return child_valobj_sp;
2424 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2425 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2427 ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name);
2428 if (!child_valobj_sp) {
2431 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2433 if (child_valobj_sp) {
2434 root = child_valobj_sp;
2435 remainder = next_separator;
2444 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2445 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2446 !root_compiler_type_info.
Test(
2449 if (!root_compiler_type_info.
Test(
2471 if (temp_expression[1] ==
2474 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2490 size_t close_bracket_position = temp_expression.find(
']', 1);
2491 if (close_bracket_position ==
2492 llvm::StringRef::npos)
2500 llvm::StringRef bracket_expr =
2501 temp_expression.slice(1, close_bracket_position);
2505 assert(!bracket_expr.empty());
2507 if (!bracket_expr.contains(
'-')) {
2511 unsigned long index = 0;
2512 if (bracket_expr.getAsInteger(0, index)) {
2520 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2521 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2522 if (!child_valobj_sp)
2523 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2524 if (!child_valobj_sp)
2525 if (root->HasSyntheticValue() &&
2526 llvm::expectedToStdOptional(
2527 root->GetSyntheticValue()->GetNumChildren())
2528 .value_or(0) > index)
2530 root->GetSyntheticValue()->GetChildAtIndex(index);
2531 if (child_valobj_sp) {
2532 root = child_valobj_sp;
2534 temp_expression.substr(close_bracket_position + 1);
2543 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2555 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2559 if (
error.Fail() || !root) {
2569 if (root->GetCompilerType().GetMinimumLanguage() ==
2571 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2572 root->HasSyntheticValue() &&
2575 SyntheticChildrenTraversal::ToSynthetic ||
2578 SyntheticChildrenTraversal::Both)) {
2579 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2581 root = root->GetSyntheticArrayMember(index,
true);
2589 temp_expression.substr(close_bracket_position + 1);
2594 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2595 root = root->GetSyntheticBitFieldChild(index, index,
true);
2604 *reason_to_stop = ValueObject::
2605 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2609 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2610 root = root->GetChildAtIndex(index);
2618 temp_expression.substr(close_bracket_position + 1);
2624 SyntheticChildrenTraversal::ToSynthetic ||
2627 SyntheticChildrenTraversal::Both) {
2628 if (root->HasSyntheticValue())
2629 root = root->GetSyntheticValue();
2630 else if (!root->IsSynthetic()) {
2645 root = root->GetChildAtIndex(index);
2653 temp_expression.substr(close_bracket_position + 1);
2665 llvm::StringRef sleft, sright;
2666 unsigned long low_index, high_index;
2667 std::tie(sleft, sright) = bracket_expr.split(
'-');
2668 if (sleft.getAsInteger(0, low_index) ||
2669 sright.getAsInteger(0, high_index)) {
2676 if (low_index > high_index)
2677 std::swap(low_index, high_index);
2679 if (root_compiler_type_info.
Test(
2682 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2689 *reason_to_stop = ValueObject::
2690 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2694 }
else if (root_compiler_type_info.
Test(
2701 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2705 if (
error.Fail() || !root) {
2788 result_sp =
GetSP();
2791 bool is_synthetic = result_sp->IsSynthetic();
2792 if (synthValue && !is_synthetic) {
2793 if (
auto synth_sp = result_sp->GetSyntheticValue())
2796 if (!synthValue && is_synthetic) {
2797 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2798 return non_synth_sp;
2808 std::string deref_name_str;
2809 uint32_t deref_byte_size = 0;
2810 int32_t deref_byte_offset = 0;
2812 uint64_t language_flags = 0;
2818 &exe_ctx, deref_name_str, deref_byte_size, deref_byte_offset,
this,
2821 std::string deref_error;
2822 if (deref_compiler_type_or_err) {
2823 deref_compiler_type = *deref_compiler_type_or_err;
2825 deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
2829 if (deref_compiler_type && deref_byte_size) {
2831 if (!deref_name_str.empty())
2832 deref_name.
SetCString(deref_name_str.c_str());
2836 deref_byte_size, deref_byte_offset, 0, 0,
false,
2849 if (deref_compiler_type) {
2851 if (!deref_name_str.empty())
2852 deref_name.
SetCString(deref_name_str.c_str());
2855 *
this, deref_compiler_type, deref_name, deref_byte_size,
2872 if (deref_error.empty())
2874 "dereference failed: (%s) %s",
2878 "dereference failed: %s: (%s) %s", deref_error.c_str(),
2891 switch (address_type) {
2902 if (compiler_type) {
2903 std::string name(1,
'&');
2904 name.append(
m_name.AsCString(
""));
2922 "'%s' doesn't have a valid address", expr_path_strm.
GetData());
2952 if (llvm::expectedToOptional(compiler_type.
GetByteSize(exe_scope))
2957 return DoCast(compiler_type);
2960 "Can only cast to a type that is equal to or smaller "
2961 "than the orignal type.");
3001 const bool scalar_is_load_address =
true;
3002 auto [addr_value, addr_type] =
GetAddressOf(scalar_is_load_address);
3009 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3021 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3026 return llvm::createStringError(
3027 "Invalid target type: should be a pointer or a reference");
3033 auto target_record_type =
3035 auto start_record_type =
3038 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3039 return llvm::createStringError(
3040 "Underlying start & target types should be record types");
3042 if (target_record_type.CompareTypes(start_record_type))
3043 return llvm::createStringError(
3044 "Underlying start & target types should be different");
3046 if (base_type_indices.empty())
3047 return llvm::createStringError(
"Children sequence must be non-empty");
3056 for (
const uint32_t i : base_type_indices)
3059 inner_value->GetChildAtIndex(i,
true);
3063 CompilerType inner_value_type = inner_value->GetCompilerType();
3066 return llvm::createStringError(
3067 "casted value doesn't match the desired type");
3069 uintptr_t addr = inner_value->GetLoadAddress();
3070 llvm::StringRef name =
"";
3078 return llvm::createStringError(
3079 "casted value doesn't match the desired type");
3084llvm::Expected<lldb::ValueObjectSP>
3090 return llvm::createStringError(
3091 "Invalid target type: should be a pointer or a reference");
3097 auto target_record_type =
3099 auto start_record_type =
3102 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3103 return llvm::createStringError(
3104 "Underlying start & target types should be record types");
3106 if (target_record_type.CompareTypes(start_record_type))
3107 return llvm::createStringError(
3108 "Underlying start & target types should be different");
3111 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3113 return llvm::createStringError(
"virtual base should be valid");
3114 return llvm::createStringError(
3131 llvm::StringRef name =
"";
3134 name, addr - offset, exe_ctx, pointer_type,
false);
3142 return value->Dereference(
error);
3159 if (!is_scalar && !is_enum && !is_pointer)
3165 uint64_t type_byte_size = 0;
3166 uint64_t val_byte_size = 0;
3167 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3168 type_byte_size = temp.value();
3171 val_byte_size = temp.value();
3178 if (!type.
IsBoolean() && type_byte_size < val_byte_size)
3182 "target type cannot be smaller than the pointer type"));
3186 if (!is_scalar || is_integer)
3190 else if (is_scalar && is_float) {
3192 if (float_value_or_err)
3195 !float_value_or_err->isZero(),
"result");
3200 "cannot get value as APFloat: %s",
3201 llvm::toString(float_value_or_err.takeError()).c_str()));
3206 if (!is_scalar || is_integer) {
3208 if (int_value_or_err) {
3212 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3219 "cannot get value as APSInt: %s",
3220 llvm::toString(int_value_or_err.takeError()).c_str()));
3221 }
else if (is_scalar && is_float) {
3225 if (float_value_or_err) {
3226 llvm::APFloatBase::opStatus status =
3227 float_value_or_err->convertToInteger(
3228 integer, llvm::APFloat::rmTowardZero, &is_exact);
3232 if (status & llvm::APFloatBase::opInvalidOp)
3236 "invalid type cast detected: %s",
3237 llvm::toString(float_value_or_err.takeError()).c_str()));
3247 if (int_value_or_err) {
3249 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3259 "cannot get value as APSInt: %s",
3260 llvm::toString(int_value_or_err.takeError()).c_str()));
3265 if (int_value_or_err) {
3266 Scalar scalar_int(*int_value_or_err);
3275 "cannot get value as APSInt: %s",
3276 llvm::toString(int_value_or_err.takeError()).c_str()));
3281 if (float_value_or_err) {
3282 Scalar scalar_float(*float_value_or_err);
3291 "cannot get value as APFloat: %s",
3292 llvm::toString(float_value_or_err.takeError()).c_str()));
3309 if (!is_enum && !is_integer && !is_float)
3313 "argument must be an integer, a float, or an enum"));
3321 uint64_t byte_size = 0;
3322 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3323 byte_size = temp.value();
3330 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3331 integer, llvm::APFloat::rmTowardZero, &is_exact);
3335 if (status & llvm::APFloatBase::opInvalidOp)
3339 "invalid type cast detected: %s",
3340 llvm::toString(value_or_err.takeError()).c_str()));
3351 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3358 "cannot get value as APSInt: %s",
3359 llvm::toString(value_or_err.takeError()).c_str()));
3377 process_sp = target_sp->GetProcessSP();
3387 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3420 bool accept_invalid_exe_ctx) {
3423 const bool thread_and_frame_only_if_stopped =
true;
3432 if (process ==
nullptr)
3444 bool changed =
false;
3445 const bool was_valid =
m_mod_id.IsValid();
3463 if (!accept_invalid_exe_ctx) {
3472 changed = was_valid;
3478 changed = was_valid;
3519 if (!
m_parent->IsPointerOrReferenceType())
3520 return m_parent->GetSymbolContextScope();
3527 llvm::StringRef expression,
3534 llvm::StringRef name, llvm::StringRef expression,
3540 if (expression.empty())
3542 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3543 retval_sp, options);
3544 if (retval_sp && !name.empty())
3555 pointer_type = type;
3563 if (ptr_result_valobj_sp) {
3565 ptr_result_valobj_sp->GetValue().SetValueType(
3569 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3570 if (ptr_result_valobj_sp && !name.empty())
3573 return ptr_result_valobj_sp;
3587 if (new_value_sp && !name.empty())
3589 return new_value_sp;
3595 llvm::StringRef name) {
3596 uint64_t byte_size =
3597 llvm::expectedToOptional(
3601 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3608 llvm::StringRef name) {
3615 llvm::StringRef name) {
3623 llvm::StringRef name) {
3626 uint64_t byte_size =
3627 llvm::expectedToOptional(type.
GetByteSize(exe_scope)).value_or(0);
3629 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3641 uint64_t byte_size = 0;
3642 if (
auto temp = llvm::expectedToOptional(
3644 byte_size = temp.value();
3646 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3688 while (with_dv_info) {
3691 with_dv_info = with_dv_info->
m_parent;
3698 while (with_fmt_info) {
3701 with_fmt_info = with_fmt_info->
m_parent;
3713 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3715 type = cu->GetLanguage();
3747 target_sp->GetPersistentExpressionStateForLanguage(
3750 if (!persistent_state)
3760 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3763 return persistent_var_sp->GetValueObject();
3775 if ((
m_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
3809 return target_sp && target_sp->IsValid();
3814 std::unique_lock<std::recursive_mutex> &lock,
Status &
error) {
3822 Target *target = value_sp->GetTargetSP().get();
3824 if (value_sp->GetError().Fail())
3830 lock = std::unique_lock<std::recursive_mutex>(target->
GetAPIMutex());
3832 ProcessSP process_sp(value_sp->GetProcessSP());
3833 if (process_sp && !stop_locker.
TryLock(&process_sp->GetRunLock())) {
3844 value_sp = dynamic_sp;
3850 value_sp = synthetic_sp;
3856 value_sp->SetName(
m_name);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERRORV(log, error,...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static user_id_t g_value_obj_uid
static const char * ConvertBoolean(lldb::LanguageType language_type, const char *value_str)
static bool CopyStringDataToBufferSP(const StreamString &source, lldb::WritableDataBufferSP &destination)
static ValueObjectSP DereferenceValueOrAlternate(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal, Status &error)
static bool HasFloatingRepresentation(CompilerType ct)
static ValueObjectSP GetAlternateValue(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal)
static const char * SkipLeadingExpressionPathSeparators(const char *expression)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A class that describes a compilation unit.
lldb::TypeSystemSP GetSharedPointer() const
Generic representation of a type in a programming language.
bool IsEnumerationType(bool &is_signed) const
lldb::BasicType GetBasicTypeEnumeration() const
TypeSystemSPWrapper GetTypeSystem() const
Accessors.
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
size_t GetIndexOfChildMemberWithName(llvm::StringRef name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) const
Lookup a child member given a name.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
lldb::Encoding GetEncoding() const
CompilerType GetNonReferenceType() const
If this type is a reference to a type (L value or R value reference), return a new type with the refe...
ConstString GetTypeName(bool BaseOnly=false) const
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
std::string TypeDescription()
bool IsInteger() const
This is used when you don't care about the signedness of the integer.
llvm::Expected< CompilerType > GetDereferencedType(ExecutionContext *exe_ctx, std::string &deref_name, uint32_t &deref_byte_size, int32_t &deref_byte_offset, ValueObject *valobj, uint64_t &language_flags) const
lldb::Format GetFormat() const
llvm::Expected< CompilerType > GetChildCompilerTypeAtIndex(ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool IsUnscopedEnumerationType() const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
llvm::Expected< uint32_t > GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const
Lookup a child given a name.
bool CompareTypes(CompilerType rhs) const
bool IsScalarType() const
bool IsNullPtrType() const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
void SetCString(const char *cstr)
Set the C string value.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
void SetString(llvm::StringRef s)
const char * GetCString() const
Get the string value as a C string.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t SetByteSize(lldb::offset_t byte_size)
Set the number of bytes in the data buffer.
void CopyData(const void *src, lldb::offset_t src_len)
Makes a copy of the src_len bytes in src.
static lldb::TypeSummaryImplSP GetSummaryFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static lldb::TypeFormatImplSP GetFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static lldb::SyntheticChildrenSP GetSyntheticChildren(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static uint32_t GetCurrentRevision()
A class that describes the declaration location of a lldb object.
void Clear()
Clear the object's state.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
virtual lldb::TargetSP CalculateTarget()=0
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
uint32_t GetAddressByteSize() const
const lldb::ProcessSP & GetProcessSP() const
Get accessor to get the process shared pointer.
lldb::ByteOrder GetByteOrder() const
const lldb::StackFrameSP & GetFrameSP() const
Get accessor to get the frame shared pointer.
Target * GetTargetPtr() const
Returns a pointer to the target object.
const lldb::ThreadSP & GetThreadSP() const
Get accessor to get the thread shared pointer.
Process * GetProcessPtr() const
Returns a pointer to the process object.
@ EVIsProgramReference
This variable is a reference to a (possibly invalid) area managed by the target program.
bool AllClear(ValueType mask) const
Test if all bits in mask are clear.
void Reset(ValueType flags)
Set accessor for all flags.
bool Test(ValueType bit) const
Test a single flag bit.
bool AnySet(ValueType mask) const
Test one or more flags.
static Language * FindPlugin(lldb::LanguageType language)
static bool LanguageIsCFamily(lldb::LanguageType language)
Equivalent to LanguageIsC||LanguageIsObjC||LanguageIsCPlusPlus.
static bool LanguageIsObjC(lldb::LanguageType language)
virtual lldb::ExpressionVariableSP CreatePersistentVariable(const lldb::ValueObjectSP &valobj_sp)=0
virtual ConstString GetNextPersistentVariableName(bool is_error=false)=0
Return a new persistent variable name with the specified prefix.
uint32_t GetStopID() const
bool TryLock(ProcessRunLock *lock)
A plug-in interface definition class for debugging a process.
ProcessModID GetModID() const
Get the Modification ID of the process.
ProcessRunLock::ProcessRunLocker StopLocker
bool IsPossibleDynamicValue(ValueObject &in_value)
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
size_t WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Write memory to a process.
size_t WriteScalarToMemory(lldb::addr_t vm_addr, const Scalar &scalar, size_t size, Status &error)
Write all or part of a scalar value to memory.
llvm::APFloat CreateAPFloatFromAPFloat(lldb::BasicType basic_type)
llvm::APFloat CreateAPFloatFromAPSInt(lldb::BasicType basic_type)
unsigned long long ULongLong(unsigned long long fail_value=0) const
llvm::APFloat GetAPFloat() const
long long SLongLong(long long fail_value=0) const
bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset)
Status SetValueFromCString(const char *s, lldb::Encoding encoding, size_t byte_size)
bool GetData(DataExtractor &data) const
Get data with a byte size of GetByteSize().
llvm::APSInt GetAPSInt() const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
bool Success() const
Test for success condition.
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
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.
Basic RAII class to increment the summary count when the call is complete.
"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.
CompileUnit * comp_unit
The CompileUnit for a given query.
uint32_t GetMaximumSizeOfStringSummary() const
std::recursive_mutex & GetAPIMutex()
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)
virtual bool FormatObject(ValueObject *valobj, std::string &dest, const TypeSummaryOptions &options)=0
lldb::LanguageType GetLanguage() const
TypeSummaryOptions & SetLanguage(lldb::LanguageType)
lldb::ValueObjectSP m_valobj_sp
lldb::DynamicValueType m_use_dynamic
lldb::ValueObjectSP GetSP(Process::StopLocker &stop_locker, std::unique_lock< std::recursive_mutex > &lock, Status &error)
ValueImpl & operator=(const ValueImpl &rhs)
static lldb::ValueObjectSP Create(ValueObject &parent, ConstString name, const CompilerType &cast_type)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size, lldb::addr_t address=LLDB_INVALID_ADDRESS)
A ValueObject that represents memory at a given address, viewed as some set lldb type.
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, llvm::StringRef name, const Address &address, lldb::TypeSP &type_sp)
llvm::Error PrintValueObject()
static lldb::ValueObjectSP Create(ValueObject &parent)
bool SyncWithProcessState(bool accept_invalid_exe_ctx)
ExecutionContextRef m_exe_ctx_ref
AddressType m_address_type_of_ptr_or_ref_children
void SetValueIsValid(bool valid)
EvaluationPoint m_update_point
Stores both the stop id and the full context at which this value was last updated.
lldb::TypeSummaryImplSP GetSummaryFormat()
llvm::SmallVector< uint8_t, 16 > m_value_checksum
llvm::Expected< llvm::APFloat > GetValueAsAPFloat()
If the current ValueObject is of an appropriate type, convert the value to an APFloat and return that...
static lldb::ValueObjectSP CreateValueObjectFromAPInt(const ExecutionContext &exe_ctx, const llvm::APInt &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APInt value.
virtual uint32_t GetBitfieldBitSize()
void ClearUserVisibleData(uint32_t items=ValueObject::eClearUserVisibleDataItemsAllStrings)
ValueObject * FollowParentChain(std::function< bool(ValueObject *)>)
Given a ValueObject, loop over itself and its parent, and its parent's parent, .
CompilerType m_override_type
If the type of the value object should be overridden, the type to impose.
lldb::ValueObjectSP Cast(const CompilerType &compiler_type)
const EvaluationPoint & GetUpdatePoint() const
void AddSyntheticChild(ConstString key, ValueObject *valobj)
virtual uint64_t GetData(DataExtractor &data, Status &error)
uint32_t m_last_format_mgr_revision
friend class ValueObjectSynthetic
bool DumpPrintableRepresentation(Stream &s, ValueObjectRepresentationStyle val_obj_display=eValueObjectRepresentationStyleSummary, lldb::Format custom_format=lldb::eFormatInvalid, PrintableRepresentationSpecialCases special=PrintableRepresentationSpecialCases::eAllow, bool do_dump_error=true)
ValueObject * m_deref_valobj
virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx, bool can_create=true)
virtual lldb::DynamicValueType GetDynamicValueTypeImpl()
PrintableRepresentationSpecialCases
virtual bool GetIsConstant() const
virtual bool MightHaveChildren()
Find out if a ValueObject might have children.
static lldb::ValueObjectSP CreateValueObjectFromExpression(llvm::StringRef name, llvm::StringRef expression, const ExecutionContext &exe_ctx)
virtual bool IsDereferenceOfParent()
virtual llvm::Expected< size_t > GetIndexOfChildWithName(llvm::StringRef name)
virtual ValueObject * CreateSyntheticArrayMember(size_t idx)
Should only be called by ValueObject::GetSyntheticArrayMember().
void SetValueFormat(lldb::TypeFormatImplSP format)
virtual void CalculateSyntheticValue()
void SetPreferredDisplayLanguage(lldb::LanguageType lt)
struct lldb_private::ValueObject::Bitflags m_flags
ClusterManager< ValueObject > ValueObjectManager
ValueObject(ExecutionContextScope *exe_scope, ValueObjectManager &manager, AddressType child_ptr_or_ref_addr_type=eAddressTypeLoad)
Use this constructor to create a "root variable object".
std::string m_summary_str
Cached summary string that will get cleared if/when the value is updated.
virtual lldb::ValueObjectSP DoCast(const CompilerType &compiler_type)
lldb::ValueObjectSP GetSP()
ChildrenManager m_children
virtual lldb::ValueObjectSP CastPointerType(const char *name, CompilerType &ast_type)
Status m_error
An error object that can describe any errors that occur when updating values.
virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx=0, uint32_t item_count=1)
lldb::ValueObjectSP GetSyntheticValue()
ValueObjectManager * m_manager
This object is managed by the root object (any ValueObject that gets created without a parent....
lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to, bool can_create)
lldb::ProcessSP GetProcessSP() const
lldb::ValueObjectSP GetSyntheticChild(ConstString key) const
ExpressionPathScanEndReason
@ eExpressionPathScanEndReasonArrowInsteadOfDot
-> used when . should be used.
@ eExpressionPathScanEndReasonDereferencingFailed
Impossible to apply * operator.
@ eExpressionPathScanEndReasonNoSuchChild
Child element not found.
@ eExpressionPathScanEndReasonUnknown
@ eExpressionPathScanEndReasonDotInsteadOfArrow
. used when -> should be used.
@ eExpressionPathScanEndReasonEndOfString
Out of data to parse.
@ eExpressionPathScanEndReasonRangeOperatorNotAllowed
[] not allowed by options.
@ eExpressionPathScanEndReasonEmptyRangeNotAllowed
[] only allowed for arrays.
@ eExpressionPathScanEndReasonRangeOperatorInvalid
[] not valid on objects other than scalars, pointers or arrays.
@ eExpressionPathScanEndReasonUnexpectedSymbol
Something is malformed in he expression.
@ eExpressionPathScanEndReasonArrayRangeOperatorMet
[] is good for arrays, but I cannot parse it.
@ eExpressionPathScanEndReasonSyntheticValueMissing
getting the synthetic children failed.
@ eExpressionPathScanEndReasonTakingAddressFailed
Impossible to apply & operator.
@ eExpressionPathScanEndReasonFragileIVarNotAllowed
ObjC ivar expansion not allowed.
virtual bool UpdateValue()=0
lldb::Format GetFormat() const
virtual lldb::VariableSP GetVariable()
@ eExpressionPathAftermathNothing
Just return it.
@ eExpressionPathAftermathDereference
Dereference the target.
@ eExpressionPathAftermathTakeAddress
Take target's address.
lldb::ValueObjectSP CastToBasicType(CompilerType type)
ValueObject * GetNonBaseClassParent()
virtual ValueObject * CreateChildAtIndex(size_t idx)
Should only be called by ValueObject::GetChildAtIndex().
lldb::ValueObjectSP GetValueForExpressionPath(llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop=nullptr, ExpressionPathEndResultType *final_value_type=nullptr, const GetValueForExpressionPathOptions &options=GetValueForExpressionPathOptions::DefaultOptions(), ExpressionPathAftermath *final_task_on_target=nullptr)
virtual lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic)
bool IsPossibleDynamicType()
DataExtractor m_data
A data extractor that can be used to extract the value.
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type, bool do_deref=true)
Given an address either create a value object containing the value at that address,...
virtual llvm::Expected< uint64_t > GetByteSize()=0
virtual CompilerType GetCompilerTypeImpl()=0
virtual lldb::ValueObjectSP GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
@ eGetExpressionPathFormatDereferencePointers
@ eGetExpressionPathFormatHonorPointers
virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create=true)
lldb::ValueObjectSP CastToEnumType(CompilerType type)
llvm::Expected< uint32_t > GetNumChildren(uint32_t max=UINT32_MAX)
void SetValueFromInteger(const llvm::APInt &value, Status &error, bool can_update_var=true)
Update an existing integer ValueObject with a new integer value.
virtual void GetExpressionPath(Stream &s, GetExpressionPathFormat=eGetExpressionPathFormatDereferencePointers)
bool UpdateFormatsIfNeeded()
virtual bool HasSyntheticValue()
lldb::StackFrameSP GetFrameSP() const
static lldb::ValueObjectSP CreateValueObjectFromNullptr(const ExecutionContext &exe_ctx, CompilerType type, llvm::StringRef name)
Create a nullptr value object with the specified type (must be a nullptr type).
friend class ValueObjectChild
lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef< llvm::StringRef > names)
void SetSummaryFormat(lldb::TypeSummaryImplSP format)
virtual bool IsRuntimeSupportValue()
virtual ConstString GetTypeName()
DataExtractor & GetDataExtractor()
static lldb::ValueObjectSP CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type)
void SetValueDidChange(bool value_changed)
static lldb::ValueObjectSP CreateValueObjectFromScalar(const ExecutionContext &exe_ctx, Scalar &s, CompilerType type, llvm::StringRef name)
Create a value object containing the given Scalar value.
@ eClearUserVisibleDataItemsDescription
@ eClearUserVisibleDataItemsLocation
@ eClearUserVisibleDataItemsSummary
@ eClearUserVisibleDataItemsValue
@ eClearUserVisibleDataItemsSyntheticChildren
ValueObjectManager * GetManager()
ValueObject * m_root
The root of the hierarchy for this ValueObject (or nullptr if never calculated).
lldb::addr_t GetLoadAddress()
Return the target load address associated with this value object.
bool GetValueIsValid() const
virtual lldb::ModuleSP GetModule()
Return the module associated with this value object in case the value is from an executable file and ...
virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType)
void UpdateChildrenAddressType()
llvm::Expected< lldb::ValueObjectSP > CastDerivedToBaseType(CompilerType type, const llvm::ArrayRef< uint32_t > &base_type_indices)
Take a ValueObject whose type is an inherited class, and cast it to 'type', which should be one of it...
virtual lldb::ValueObjectSP AddressOf(Status &error)
lldb::DynamicValueType GetDynamicValueType()
llvm::Expected< lldb::ValueObjectSP > CastBaseToDerivedType(CompilerType type, uint64_t offset)
Take a ValueObject whose type is a base class, and cast it to 'type', which should be one of its deri...
lldb::LanguageType m_preferred_display_language
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr)
virtual llvm::Expected< uint32_t > CalculateNumChildren(uint32_t max=UINT32_MAX)=0
Should only be called by ValueObject::GetNumChildren().
lldb::LanguageType GetObjectRuntimeLanguage()
virtual lldb::ValueObjectSP CreateConstantValue(ConstString name)
virtual bool IsLogicalTrue(Status &error)
lldb::Format m_last_format
static lldb::ValueObjectSP CreateValueObjectFromAPFloat(const ExecutionContext &exe_ctx, const llvm::APFloat &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APFloat value.
virtual SymbolContextScope * GetSymbolContextScope()
virtual bool HasDynamicValueTypeInfo()
ValueObject * m_synthetic_value
void SetNumChildren(uint32_t num_children)
ValueObject * m_parent
The parent value object, or nullptr if this has no parent.
virtual bool IsBaseClass()
llvm::Expected< bool > GetValueAsBool()
If the current ValueObject is of an appropriate type, convert the value to a boolean and return that.
virtual bool GetDeclaration(Declaration &decl)
virtual lldb::ValueObjectSP Clone(ConstString new_name)
Creates a copy of the ValueObject with a new name and setting the current ValueObject as its parent.
lldb::ValueObjectSP GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue, bool synthValue)
lldb::ValueObjectSP m_addr_of_valobj_sp
We have to hold onto a shared pointer to this one because it is created as an independent ValueObject...
std::pair< size_t, bool > ReadPointedString(lldb::WritableDataBufferSP &buffer_sp, Status &error, bool honor_array)
llvm::Error Dump(Stream &s)
bool IsUninitializedReference()
bool UpdateValueIfNeeded(bool update_format=true)
AddressType GetAddressTypeOfChildren()
const Status & GetError()
lldb::TypeFormatImplSP m_type_format_sp
lldb::TargetSP GetTargetSP() const
ExpressionPathEndResultType
@ eExpressionPathEndResultTypeInvalid
@ eExpressionPathEndResultTypePlain
Anything but...
@ eExpressionPathEndResultTypeBoundedRange
A range [low-high].
@ eExpressionPathEndResultTypeBitfield
A bitfield.
@ eExpressionPathEndResultTypeUnboundedRange
A range [].
virtual lldb::ValueObjectSP Dereference(Status &error)
CompilerType GetCompilerType()
void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType)
virtual const char * GetValueAsCString()
bool HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, lldb::Format custom_format)
virtual const char * GetLocationAsCString()
AddrAndType GetPointerValue()
ConstString GetName() const
std::string m_location_str
Cached location string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetVTable()
If this object represents a C++ class with a vtable, return an object that represents the virtual fun...
virtual bool SetValueFromCString(const char *value_str, Status &error)
virtual lldb::ValueObjectSP GetStaticValue()
lldb::ValueObjectSP Persist()
std::string m_object_desc_str
Cached result of the "object printer".
virtual ValueObject * GetParent()
lldb::SyntheticChildrenSP m_synthetic_children_sp
virtual uint32_t GetBitfieldBitOffset()
llvm::Expected< std::string > GetObjectDescription()
std::string m_old_value_str
Cached old value string from the last time the value was gotten.
virtual lldb::ValueObjectSP GetNonSyntheticValue()
lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression, bool can_create)
virtual bool SetData(DataExtractor &data, Status &error)
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
const char * GetSummaryAsCString(lldb::LanguageType lang=lldb::eLanguageTypeUnknown)
ValueObjectRepresentationStyle
@ eValueObjectRepresentationStyleLocation
@ eValueObjectRepresentationStyleSummary
@ eValueObjectRepresentationStyleName
@ eValueObjectRepresentationStyleType
@ eValueObjectRepresentationStyleChildrenCount
@ eValueObjectRepresentationStyleExpressionPath
@ eValueObjectRepresentationStyleValue
@ eValueObjectRepresentationStyleLanguageSpecific
std::string m_value_str
Cached value string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create)
virtual bool ResolveValue(Scalar &scalar)
llvm::Expected< llvm::APSInt > GetValueAsAPSInt()
If the current ValueObject is of an appropriate type, convert the value to an APSInt and return that.
void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp)
ConstString m_name
The name of this object.
bool IsPointerOrReferenceType()
const char * GetLocationAsCStringImpl(const Value &value, const DataExtractor &data)
virtual void SetFormat(lldb::Format format)
ValueObject * m_dynamic_value
static lldb::ValueObjectSP CreateValueObjectFromBool(const ExecutionContext &exe_ctx, lldb::TypeSystemSP typesystem, bool value, llvm::StringRef name)
Create a value object containing the given boolean value.
void ClearDynamicTypeInformation()
bool IsCStringContainer(bool check_pointer=false)
Returns true if this is a char* or a char[] if it is a char* and check_pointer is true,...
virtual bool IsSynthetic()
std::map< ConstString, ValueObject * > m_synthetic_children
llvm::ArrayRef< uint8_t > GetLocalBuffer() const
Returns the local buffer that this ValueObject points to if it's available.
std::optional< lldb::addr_t > GetStrippedPointerValue(lldb::addr_t address)
Remove ptrauth bits from address if the type has a ptrauth qualifier.
const ExecutionContextRef & GetExecutionContextRef() const
virtual AddrAndType GetAddressOf(bool scalar_is_load_address=true)
uint32_t GetNumChildrenIgnoringErrors(uint32_t max=UINT32_MAX)
Like GetNumChildren but returns 0 on error.
virtual bool CanProvideValue()
UserID m_id
Unique identifier for every value object.
const Value & GetValue() const
virtual lldb::LanguageType GetPreferredDisplayLanguage()
lldb::ValueObjectSP GetValueForExpressionPath_Impl(llvm::StringRef expression_cstr, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target)
const Scalar & GetScalar() const
See comment on m_scalar to understand what GetScalar returns.
Status GetValueAsData(ExecutionContext *exe_ctx, DataExtractor &data, Module *module)
RegisterInfo * GetRegisterInfo() const
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
Scalar & ResolveValue(ExecutionContext *exe_ctx, Module *module=nullptr)
@ RegisterInfo
RegisterInfo * (can be a scalar or a vector register).
ContextType GetContextType() const
const CompilerType & GetCompilerType()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
@ DoNoSelectMostRelevantFrame
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< SummaryStatistics > SummaryStatisticsSP
@ eAddressTypeFile
Address is an address as found in an object or symbol file.
@ eAddressTypeLoad
Address is an address as in the current target inferior process.
@ eAddressTypeHost
Address is an address in the process that is running this code.
std::string toString(FormatterBytecode::OpCodes op)
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::TypeFormatImpl > TypeFormatImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ExpressionVariable > ExpressionVariableSP
Format
Display format definitions.
@ eFormatCString
NULL terminated C strings.
@ eFormatCharArray
Print characters with no single quotes, used for character arrays that can contain non printable char...
@ eFormatComplex
Floating point complex type.
@ eFormatOSType
OS character codes encoded into an integer 'PICT' 'text' etc...
@ eFormatCharPrintable
Only printable characters, '.' if not printable.
@ eFormatComplexInteger
Integer complex type.
@ eFormatFloat128
Disambiguate between 128-bit long double (which uses eFormatFloat) and __float128 (which uses eFormat...
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::Process > ProcessSP
Encoding
Register encoding definitions.
@ eEncodingVector
vector registers
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
const char * alt_name
Alternate name of this register, can be NULL.
const char * name
Name of this register, can't be NULL.
lldb::Format format
Default display format.
bool m_is_synthetic_children_generated
SyntheticChildrenTraversal m_synthetic_children_traversal
bool m_check_dot_vs_arrow_syntax
bool m_allow_bitfields_syntax
SyntheticChildrenTraversal