29#include "lldb/Host/Config.h"
53#include "llvm/Support/Compiler.h"
83 : m_parent(&parent), m_update_point(parent.GetUpdatePoint()),
96 : m_update_point(exe_scope), m_manager(&manager),
97 m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type),
102 const ArchSpec &arch = target_sp->GetArchitecture();
115 bool did_change_formats =
false;
129 if (update_format && !did_change_formats)
160 bool need_compare_checksums =
false;
161 llvm::SmallVector<uint8_t, 16> old_checksum;
164 need_compare_checksums =
true;
167 old_checksum.begin());
176 const uint64_t max_checksum_size = 128;
179 need_compare_checksums =
false;
183 assert(!need_compare_checksums ||
192 }
else if (need_compare_checksums) {
207 "[%s %p] checking for FormatManager revisions. ValueObject "
208 "rev: %d - Global rev: %d",
209 GetName().GetCString(),
static_cast<void *
>(
this),
213 bool any_change =
false;
253 return compiler_type;
262 return compiler_type;
266 if (std::optional<CompilerType> complete_type =
267 runtime->GetRuntimeType(compiler_type)) {
273 return compiler_type;
296 switch (value_type) {
322 sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
341 if (bitfield_bit_size)
352 LazyBool is_logical_true = language->IsLogicalTrue(*
this,
error);
353 switch (is_logical_true) {
356 return (is_logical_true ==
true);
365 error.SetErrorString(
"failed to get a scalar result");
389 if (child !=
nullptr)
390 return child->
GetSP();
397 if (names.size() == 0)
400 for (llvm::StringRef name : names) {
401 root = root->GetChildMemberWithName(name);
410 bool omit_empty_base_classes =
true;
412 omit_empty_base_classes);
424 std::vector<uint32_t> child_indexes;
425 bool omit_empty_base_classes =
true;
430 const size_t num_child_indexes =
432 name, omit_empty_base_classes, child_indexes);
433 if (num_child_indexes == 0)
437 for (uint32_t idx : child_indexes)
439 child_sp = child_sp->GetChildAtIndex(idx, can_create);
449 return children_count <= max ? children_count : max;
456 if (num_children_or_err)
459 return num_children_or_err;
467 return *value_or_err;
474 bool has_children =
false;
477 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
492 bool omit_empty_base_classes =
true;
493 bool ignore_array_bounds =
false;
494 std::string child_name;
495 uint32_t child_byte_size = 0;
496 int32_t child_byte_offset = 0;
497 uint32_t child_bitfield_bit_size = 0;
498 uint32_t child_bitfield_bit_offset = 0;
499 bool child_is_base_class =
false;
500 bool child_is_deref_of_parent =
false;
501 uint64_t language_flags = 0;
502 const bool transparent_pointers =
true;
506 auto child_compiler_type_or_err =
508 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
509 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
510 child_bitfield_bit_size, child_bitfield_bit_offset,
511 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
512 if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
514 child_compiler_type_or_err.takeError(),
515 "could not find child: {0}");
520 *
this, *child_compiler_type_or_err,
ConstString(child_name),
521 child_byte_size, child_byte_offset, child_bitfield_bit_size,
522 child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
527 bool omit_empty_base_classes =
true;
528 bool ignore_array_bounds =
true;
529 std::string child_name;
530 uint32_t child_byte_size = 0;
531 int32_t child_byte_offset = 0;
532 uint32_t child_bitfield_bit_size = 0;
533 uint32_t child_bitfield_bit_offset = 0;
534 bool child_is_base_class =
false;
535 bool child_is_deref_of_parent =
false;
536 uint64_t language_flags = 0;
537 const bool transparent_pointers =
false;
541 auto child_compiler_type_or_err =
543 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
544 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
545 child_bitfield_bit_size, child_bitfield_bit_offset,
546 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
547 if (!child_compiler_type_or_err) {
549 child_compiler_type_or_err.takeError(),
550 "could not find child: {0}");
554 if (child_compiler_type_or_err->IsValid()) {
555 child_byte_offset += child_byte_size * idx;
558 *
this, *child_compiler_type_or_err,
ConstString(child_name),
559 child_byte_size, child_byte_offset, child_bitfield_bit_size,
560 child_bitfield_bit_offset, child_is_base_class,
567 return synth_valobj_sp->GetChildAtIndex(idx,
true).get();
573 std::string &destination,
580 std::string &destination,
588 destination =
"<incomplete type>";
618 summary_ptr->
FormatObject(
this, destination, actual_options);
621 return !destination.empty();
644 bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
645 pointee_or_element_compiler_type.
IsCharType());
646 if (!is_char_arr_ptr)
650 if (type_flags.
Test(eTypeIsArray))
659 uint32_t item_count) {
661 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
662 const bool is_pointer_type = type_info & eTypeIsPointer;
663 const bool is_array_type = type_info & eTypeIsArray;
664 if (!(is_pointer_type || is_array_type))
672 std::optional<uint64_t> item_type_size =
677 const uint64_t bytes = item_count * *item_type_size;
678 const uint64_t offset = item_idx * *item_type_size;
680 if (item_idx == 0 && item_count == 1)
682 if (is_pointer_type) {
685 if (
error.Fail() || pointee_sp.get() ==
nullptr)
687 return pointee_sp->GetData(data,
error);
690 if (child_sp.get() ==
nullptr)
693 return child_sp->GetData(data,
error);
711 addr = addr + offset;
713 module_sp->ResolveFileAddress(addr, so_addr);
720 if (
error.Success()) {
734 if (
error.Success() || bytes_read > 0) {
743 if (max_bytes && *max_bytes > offset) {
744 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
748 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
783 error.SetErrorString(
"unable to read value");
790 const size_t byte_size =
GetByteSize().value_or(0);
794 switch (value_type) {
796 error.SetErrorString(
"invalid location");
803 error.SetErrorStringWithFormat(
"unable to set scalar value: %s",
817 if (!
error.Success())
819 if (bytes_written != byte_size) {
820 error.SetErrorString(
"unable to write value to memory");
847 llvm::StringRef src = source.
GetString();
848 src = src.rtrim(
'\0');
849 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
850 memcpy(destination->GetBytes(), src.data(), src.size());
854std::pair<size_t, bool>
857 bool was_capped =
false;
863 s <<
"<no target to read from>";
864 error.SetErrorString(
"no target to read from");
866 return {0, was_capped};
871 size_t bytes_read = 0;
872 size_t total_bytes_read = 0;
877 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
883 bool capped_data =
false;
884 const bool is_array = type_flags.
Test(eTypeIsArray);
887 uint64_t array_size = 0;
888 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
889 cstr_len = array_size;
890 if (cstr_len > max_length) {
892 cstr_len = max_length;
904 if (cstr ==
nullptr) {
905 s <<
"<invalid address>";
906 error.SetErrorString(
"invalid address");
908 return {0, was_capped};
910 s << llvm::StringRef(cstr, cstr_len);
912 return {cstr_len, was_capped};
914 s <<
"<invalid address>";
915 error.SetErrorString(
"invalid address");
917 return {0, was_capped};
921 Address cstr_so_addr(cstr_address);
923 if (cstr_len > 0 && honor_array) {
931 total_bytes_read = bytes_read;
932 for (
size_t offset = 0; offset < bytes_read; offset++)
938 cstr_len = max_length;
939 const size_t k_max_buf_size = 64;
943 int cstr_len_displayed = -1;
944 bool capped_cstr =
false;
949 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
950 total_bytes_read += bytes_read;
951 const char *cstr = data.
PeekCStr(0);
952 size_t len = strnlen(cstr, k_max_buf_size);
953 if (cstr_len_displayed < 0)
954 cstr_len_displayed = len;
958 cstr_len_displayed += len;
959 if (len > bytes_read)
964 for (
size_t offset = 0; offset < bytes_read; offset++)
967 if (len < k_max_buf_size)
970 if (len >= cstr_len) {
979 if (cstr_len_displayed >= 0) {
985 error.SetErrorString(
"not a string object");
986 s <<
"<not a string object>";
989 return {total_bytes_read, was_capped};
994 return llvm::createStringError(
"could not update value");
1003 return llvm::createStringError(
"no process");
1006 auto get_object_description =
1007 [&](
LanguageType language) -> llvm::Expected<std::string> {
1010 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1015 return llvm::createStringError(
"no native language runtime");
1020 llvm::Expected<std::string> desc = get_object_description(native_language);
1028 llvm::consumeError(desc.takeError());
1035 std::string &destination) {
1043 std::string &destination) {
1061 my_format = reg_info->
format;
1071 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1132 return llvm::make_error<llvm::StringError>(
1133 "type cannot be converted to APSInt", llvm::inconvertibleErrorCode());
1141 return llvm::make_error<llvm::StringError>(
1142 "error occurred; unable to convert to APSInt",
1143 llvm::inconvertibleErrorCode());
1148 return llvm::make_error<llvm::StringError>(
1149 "type cannot be converted to APFloat", llvm::inconvertibleErrorCode());
1157 return llvm::make_error<llvm::StringError>(
1158 "error occurred; unable to convert to APFloat",
1159 llvm::inconvertibleErrorCode());
1168 return value_or_err->getBoolValue();
1173 return value_or_err->isNonZero();
1178 return llvm::make_error<llvm::StringError>(
"type cannot be converted to bool",
1179 llvm::inconvertibleErrorCode());
1188 error.SetErrorString(
"current value object is not an integer objet");
1195 error.SetErrorString(
"current value object is not a temporary object");
1201 uint64_t byte_size = 0;
1203 byte_size = temp.value();
1204 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1205 error.SetErrorString(
1206 "illegal argument: new value should be of the same size");
1211 data_sp->SetData(value.getRawData(), byte_size,
1212 target->GetArchitecture().GetByteOrder());
1213 data_sp->SetAddressByteSize(
1214 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1225 error.SetErrorString(
"current value object is not an integer objet");
1232 error.SetErrorString(
"current value object is not a temporary object");
1237 CompilerType new_val_type = new_val_sp->GetCompilerType();
1240 error.SetErrorString(
1241 "illegal argument: new value should be of the same size");
1246 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1250 error.SetErrorString(
"error getting APSInt from new_val_sp");
1251 }
else if (new_val_type.
IsFloat()) {
1252 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1256 error.SetErrorString(
"error getting APFloat from new_val_sp");
1258 bool success =
true;
1259 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1262 uint64_t num_bits = 0;
1263 if (
auto temp = new_val_sp->GetCompilerType().GetBitSize(target.get()))
1264 num_bits = temp.value();
1267 error.SetErrorString(
"error converting new_val_sp to integer");
1278 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1285 if (flags.
Test(eTypeIsArray)) {
1311 bool do_dump_error) {
1324 bool allow_special =
1326 const bool only_special =
false;
1328 if (allow_special) {
1329 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1342 std::pair<size_t, bool> read_string =
1346 lldb_private::formatters::StringPrinter::
1347 ReadBufferAndDumpToStreamOptions options(*
this);
1351 options.SetStream(&s);
1352 options.SetPrefixToken(
nullptr);
1353 options.SetQuote(
'"');
1354 options.SetSourceSize(buffer_sp->GetByteSize());
1355 options.SetIsTruncated(read_string.second);
1358 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1360 return !
error.Fail();
1368 if (flags.
Test(eTypeIsArray)) {
1374 for (
size_t low = 0; low < count; low++) {
1381 s <<
"<invalid child>";
1384 child->DumpPrintableRepresentation(
1415 for (
size_t low = 0; low < count; low++) {
1422 s <<
"<invalid child>";
1425 child->DumpPrintableRepresentation(
1457 bool var_success =
false;
1460 llvm::StringRef str;
1471 switch (val_obj_display) {
1483 strm <<
"error: " <<
toString(desc.takeError());
1543 else if (val_obj_display ==
1545 s.
PutCString(
"<not a valid Objective-C object>");
1550 s.
PutCString(
"<no printable representation>");
1578 if (scalar_is_load_address) {
1636 error.SetErrorString(
"unable to read value");
1643 const size_t byte_size =
GetByteSize().value_or(0);
1650 }
else if (byte_size <= 16) {
1656 if (
error.Success()) {
1657 switch (value_type) {
1668 target_addr, new_scalar, byte_size,
error);
1669 if (!
error.Success())
1671 if (bytes_written != byte_size) {
1672 error.SetErrorString(
"unable to write value to memory");
1685 bool success = new_scalar.
GetData(new_data);
1695 error.SetErrorString(
"invalid location");
1706 error.SetErrorString(
"unable to write aggregate data type");
1728 std::map<ConstString, ValueObject *>::const_iterator pos =
1731 synthetic_child_sp = pos->second->GetSP();
1732 return synthetic_child_sp;
1755 if (runtime->IsAllowedRuntimeValue(
GetName()))
1763 return language->IsNilReference(*
this);
1770 return language->IsUninitializedReference(*
this);
1788 std::string index_str = llvm::formatv(
"[{0}]", index);
1793 if (!synthetic_child_sp) {
1800 if (synthetic_child) {
1802 synthetic_child_sp = synthetic_child->
GetSP();
1803 synthetic_child_sp->SetName(
ConstString(index_str));
1804 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1808 return synthetic_child_sp;
1815 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1820 if (!synthetic_child_sp) {
1821 uint32_t bit_field_size = to - from + 1;
1822 uint32_t bit_field_offset = from;
1825 GetByteSize().value_or(0) * 8 - bit_field_size - bit_field_offset;
1830 0, bit_field_size, bit_field_offset,
false,
false,
1834 if (synthetic_child) {
1836 synthetic_child_sp = synthetic_child->
GetSP();
1837 synthetic_child_sp->SetName(
ConstString(index_str));
1838 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1842 return synthetic_child_sp;
1846 uint32_t offset,
const CompilerType &type,
bool can_create,
1851 if (name_const_str.
IsEmpty()) {
1852 name_const_str.
SetString(
"@" + std::to_string(offset));
1859 if (synthetic_child_sp.get())
1860 return synthetic_child_sp;
1866 std::optional<uint64_t> size =
1873 if (synthetic_child) {
1875 synthetic_child_sp = synthetic_child->
GetSP();
1876 synthetic_child_sp->SetName(name_const_str);
1877 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1879 return synthetic_child_sp;
1888 if (name_const_str.
IsEmpty()) {
1890 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1899 if (synthetic_child_sp.get())
1900 return synthetic_child_sp;
1905 const bool is_base_class =
true;
1908 std::optional<uint64_t> size =
1915 if (synthetic_child) {
1917 synthetic_child_sp = synthetic_child->
GetSP();
1918 synthetic_child_sp->SetName(name_const_str);
1920 return synthetic_child_sp;
1928 if (!expression || !expression[0])
1930 if (expression[0] ==
'.')
1931 return expression + 1;
1932 if (expression[0] ==
'-' && expression[1] ==
'>')
1933 return expression + 2;
1945 if (!synthetic_child_sp) {
1949 expression,
nullptr,
nullptr,
1955 if (synthetic_child_sp.get()) {
1959 synthetic_child_sp->SetName(
1963 return synthetic_child_sp;
1968 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2074 uint64_t load_addr =
2095 if (is_deref_of_parent &&
2118 if (!is_deref_of_parent) {
2120 if (non_base_class_parent &&
2124 if (non_base_class_parent_compiler_type) {
2129 const uint32_t non_base_class_parent_type_info =
2130 non_base_class_parent_compiler_type.
GetTypeInfo();
2132 if (non_base_class_parent_type_info & eTypeIsPointer) {
2134 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2135 !(non_base_class_parent_type_info & eTypeIsArray)) {
2148 if (is_deref_of_parent &&
2168 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2169 final_value_type ? final_value_type : &dummy_final_value_type, options,
2170 final_task_on_target ? final_task_on_target
2171 : &dummy_final_task_on_target);
2173 if (!final_task_on_target ||
2177 if (ret_val.get() &&
2178 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2182 if ((final_task_on_target ? *final_task_on_target
2183 : dummy_final_task_on_target) ==
2187 if (
error.Fail() || !final_value.get()) {
2191 if (final_value_type)
2195 if (final_task_on_target)
2200 if (*final_task_on_target ==
2204 if (
error.Fail() || !final_value.get()) {
2208 if (final_value_type)
2212 if (final_task_on_target)
2232 llvm::StringRef remainder = expression;
2235 llvm::StringRef temp_expression = remainder;
2237 CompilerType root_compiler_type = root->GetCompilerType();
2239 Flags pointee_compiler_type_info;
2241 Flags root_compiler_type_info(
2242 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2243 if (pointee_compiler_type)
2246 if (temp_expression.empty()) {
2251 switch (temp_expression.front()) {
2253 temp_expression = temp_expression.drop_front();
2255 root_compiler_type_info.
Test(eTypeIsPointer))
2265 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2268 root_compiler_type_info.
Test(eTypeIsPointer) &&
2275 if (!temp_expression.starts_with(
">")) {
2286 temp_expression.front() ==
'.' &&
2287 root_compiler_type_info.
Test(eTypeIsPointer))
2297 temp_expression = temp_expression.drop_front();
2299 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2300 if (next_sep_pos == llvm::StringRef::npos)
2303 llvm::StringRef child_name = temp_expression;
2305 root->GetChildMemberWithName(child_name);
2307 if (child_valobj_sp.get())
2312 return child_valobj_sp;
2320 if (root->IsSynthetic()) {
2321 child_valobj_sp = root->GetNonSyntheticValue();
2322 if (child_valobj_sp.get())
2324 child_valobj_sp->GetChildMemberWithName(child_name);
2329 if (!root->IsSynthetic()) {
2330 child_valobj_sp = root->GetSyntheticValue();
2331 if (child_valobj_sp.get())
2333 child_valobj_sp->GetChildMemberWithName(child_name);
2338 if (root->IsSynthetic()) {
2339 child_valobj_sp = root->GetNonSyntheticValue();
2340 if (child_valobj_sp.get())
2342 child_valobj_sp->GetChildMemberWithName(child_name);
2344 child_valobj_sp = root->GetSyntheticValue();
2345 if (child_valobj_sp.get())
2347 child_valobj_sp->GetChildMemberWithName(child_name);
2356 if (child_valobj_sp.get())
2361 return child_valobj_sp;
2370 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2371 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2374 root->GetChildMemberWithName(child_name);
2375 if (child_valobj_sp.get())
2377 root = child_valobj_sp;
2378 remainder = next_separator;
2388 if (root->IsSynthetic()) {
2389 child_valobj_sp = root->GetNonSyntheticValue();
2390 if (child_valobj_sp.get())
2392 child_valobj_sp->GetChildMemberWithName(child_name);
2397 if (!root->IsSynthetic()) {
2398 child_valobj_sp = root->GetSyntheticValue();
2399 if (child_valobj_sp.get())
2401 child_valobj_sp->GetChildMemberWithName(child_name);
2406 if (root->IsSynthetic()) {
2407 child_valobj_sp = root->GetNonSyntheticValue();
2408 if (child_valobj_sp.get())
2410 child_valobj_sp->GetChildMemberWithName(child_name);
2412 child_valobj_sp = root->GetSyntheticValue();
2413 if (child_valobj_sp.get())
2415 child_valobj_sp->GetChildMemberWithName(child_name);
2424 if (child_valobj_sp.get())
2426 root = child_valobj_sp;
2427 remainder = next_separator;
2440 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2441 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2442 !root_compiler_type_info.
Test(
2445 if (!root_compiler_type_info.
Test(
2467 if (temp_expression[1] ==
2470 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2486 size_t close_bracket_position = temp_expression.find(
']', 1);
2487 if (close_bracket_position ==
2488 llvm::StringRef::npos)
2496 llvm::StringRef bracket_expr =
2497 temp_expression.slice(1, close_bracket_position);
2501 assert(!bracket_expr.empty());
2503 if (!bracket_expr.contains(
'-')) {
2507 unsigned long index = 0;
2508 if (bracket_expr.getAsInteger(0, index)) {
2516 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2517 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2518 if (!child_valobj_sp)
2519 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2520 if (!child_valobj_sp)
2521 if (root->HasSyntheticValue() &&
2522 llvm::expectedToStdOptional(
2523 root->GetSyntheticValue()->GetNumChildren())
2524 .value_or(0) > index)
2526 root->GetSyntheticValue()->GetChildAtIndex(index);
2527 if (child_valobj_sp) {
2528 root = child_valobj_sp;
2530 temp_expression.substr(close_bracket_position + 1);
2539 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2551 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2553 root = root->Dereference(
error);
2554 if (
error.Fail() || !root) {
2564 if (root->GetCompilerType().GetMinimumLanguage() ==
2566 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2567 root->HasSyntheticValue() &&
2570 SyntheticChildrenTraversal::ToSynthetic ||
2573 SyntheticChildrenTraversal::Both)) {
2574 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2576 root = root->GetSyntheticArrayMember(index,
true);
2584 temp_expression.substr(close_bracket_position + 1);
2589 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2590 root = root->GetSyntheticBitFieldChild(index, index,
true);
2604 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2605 root = root->GetChildAtIndex(index);
2613 temp_expression.substr(close_bracket_position + 1);
2619 SyntheticChildrenTraversal::ToSynthetic ||
2622 SyntheticChildrenTraversal::Both) {
2623 if (root->HasSyntheticValue())
2624 root = root->GetSyntheticValue();
2625 else if (!root->IsSynthetic()) {
2640 root = root->GetChildAtIndex(index);
2648 temp_expression.substr(close_bracket_position + 1);
2660 llvm::StringRef sleft, sright;
2661 unsigned long low_index, high_index;
2662 std::tie(sleft, sright) = bracket_expr.split(
'-');
2663 if (sleft.getAsInteger(0, low_index) ||
2664 sright.getAsInteger(0, high_index)) {
2671 if (low_index > high_index)
2672 std::swap(low_index, high_index);
2674 if (root_compiler_type_info.
Test(
2677 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2689 }
else if (root_compiler_type_info.
Test(
2696 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2698 root = root->Dereference(
error);
2699 if (
error.Fail() || !root) {
2782 result_sp =
GetSP();
2785 bool is_synthetic = result_sp->IsSynthetic();
2786 if (synthValue && !is_synthetic) {
2787 if (
auto synth_sp = result_sp->GetSyntheticValue())
2790 if (!synthValue && is_synthetic) {
2791 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2792 return non_synth_sp;
2803 if (is_pointer_or_reference_type) {
2804 bool omit_empty_base_classes =
true;
2805 bool ignore_array_bounds =
false;
2807 std::string child_name_str;
2808 uint32_t child_byte_size = 0;
2809 int32_t child_byte_offset = 0;
2810 uint32_t child_bitfield_bit_size = 0;
2811 uint32_t child_bitfield_bit_offset = 0;
2812 bool child_is_base_class =
false;
2813 bool child_is_deref_of_parent =
false;
2814 const bool transparent_pointers =
false;
2816 uint64_t language_flags = 0;
2822 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
2823 ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset,
2824 child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
2825 child_is_deref_of_parent,
this, language_flags);
2826 if (!child_compiler_type_or_err)
2828 child_compiler_type_or_err.takeError(),
2829 "could not find child: {0}");
2831 child_compiler_type = *child_compiler_type_or_err;
2833 if (child_compiler_type && child_byte_size) {
2835 if (!child_name_str.empty())
2836 child_name.
SetCString(child_name_str.c_str());
2839 *
this, child_compiler_type, child_name, child_byte_size,
2840 child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
2854 if (child_compiler_type) {
2856 if (!child_name_str.empty())
2857 child_name.
SetCString(child_name_str.c_str());
2860 *
this, child_compiler_type, child_name, child_byte_size,
2861 child_byte_offset, child_bitfield_bit_size,
2862 child_bitfield_bit_offset, child_is_base_class,
2882 if (is_pointer_or_reference_type)
2883 error.SetErrorStringWithFormat(
"dereference failed: (%s) %s",
2887 error.SetErrorStringWithFormat(
"not a pointer or reference type: (%s) %s",
2899 const bool scalar_is_load_address =
false;
2903 switch (address_type) {
2907 error.SetErrorStringWithFormat(
"'%s' is not in memory",
2914 if (compiler_type) {
2915 std::string name(1,
'&');
2930 error.SetErrorStringWithFormat(
"'%s' doesn't have a valid address",
2965 return DoCast(compiler_type);
2967 error.SetErrorString(
"Can only cast to a type that is equal to or smaller "
2968 "than the orignal type.");
3011 const bool scalar_is_load_address =
true;
3013 addr_value =
GetAddressOf(scalar_is_load_address, &addr_type);
3020 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3031 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3036 return llvm::make_error<llvm::StringError>(
3037 "Invalid target type: should be a pointer or a reference",
3038 llvm::inconvertibleErrorCode());
3044 auto target_record_type =
3046 auto start_record_type =
3049 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3050 return llvm::make_error<llvm::StringError>(
3051 "Underlying start & target types should be record types",
3052 llvm::inconvertibleErrorCode());
3054 if (target_record_type.CompareTypes(start_record_type))
3055 return llvm::make_error<llvm::StringError>(
3056 "Underlying start & target types should be different",
3057 llvm::inconvertibleErrorCode());
3059 if (base_type_indices.empty())
3060 return llvm::make_error<llvm::StringError>(
3061 "Children sequence must be non-empty", llvm::inconvertibleErrorCode());
3070 for (
const uint32_t i : base_type_indices)
3073 inner_value->GetChildAtIndex(i,
true);
3077 CompilerType inner_value_type = inner_value->GetCompilerType();
3080 return llvm::make_error<llvm::StringError>(
3081 "casted value doesn't match the desired type",
3082 llvm::inconvertibleErrorCode());
3084 uintptr_t addr = inner_value->GetLoadAddress();
3085 llvm::StringRef name =
"";
3093 return llvm::make_error<llvm::StringError>(
3094 "casted value doesn't match the desired type",
3095 llvm::inconvertibleErrorCode());
3100llvm::Expected<lldb::ValueObjectSP>
3106 return llvm::make_error<llvm::StringError>(
3107 "Invalid target type: should be a pointer or a reference",
3108 llvm::inconvertibleErrorCode());
3114 auto target_record_type =
3116 auto start_record_type =
3119 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3120 return llvm::make_error<llvm::StringError>(
3121 "Underlying start & target types should be record types",
3122 llvm::inconvertibleErrorCode());
3124 if (target_record_type.CompareTypes(start_record_type))
3125 return llvm::make_error<llvm::StringError>(
3126 "Underlying start & target types should be different",
3127 llvm::inconvertibleErrorCode());
3130 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3132 return llvm::make_error<llvm::StringError>(
3133 "virtual base should be valid", llvm::inconvertibleErrorCode());
3134 return llvm::make_error<llvm::StringError>(
3138 llvm::inconvertibleErrorCode());
3151 llvm::StringRef name =
"";
3154 name, addr - offset, exe_ctx, pointer_type,
false);
3162 return value->Dereference(
error);
3178 if (!is_scalar && !is_enum && !is_pointer) {
3184 uint64_t type_byte_size = 0;
3185 uint64_t val_byte_size = 0;
3187 type_byte_size = temp.value();
3189 val_byte_size = temp.value();
3196 if (!type.
IsBoolean() && type_byte_size < val_byte_size) {
3198 "target type cannot be smaller than the pointer type");
3204 if (!is_scalar || is_integer)
3207 else if (is_scalar && is_float) {
3209 if (float_value_or_err)
3211 target, !float_value_or_err->isZero(),
"result");
3214 "cannot get value as APFloat: %s",
3215 llvm::toString(float_value_or_err.takeError()).c_str());
3222 if (!is_scalar || is_integer) {
3224 if (int_value_or_err) {
3228 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3233 "cannot get value as APSInt: %s",
3234 llvm::toString(int_value_or_err.takeError()).c_str());
3238 }
else if (is_scalar && is_float) {
3242 if (float_value_or_err) {
3243 llvm::APFloatBase::opStatus status =
3244 float_value_or_err->convertToInteger(
3245 integer, llvm::APFloat::rmTowardZero, &is_exact);
3249 if (status & llvm::APFloatBase::opInvalidOp) {
3251 "invalid type cast detected: %s",
3252 llvm::toString(float_value_or_err.takeError()).c_str());
3264 if (int_value_or_err) {
3266 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3274 "cannot get value as APSInt: %s",
3275 llvm::toString(int_value_or_err.takeError()).c_str());
3281 if (int_value_or_err) {
3282 Scalar scalar_int(*int_value_or_err);
3289 "cannot get value as APSInt: %s",
3290 llvm::toString(int_value_or_err.takeError()).c_str());
3296 if (float_value_or_err) {
3297 Scalar scalar_float(*float_value_or_err);
3304 "cannot get value as APFloat: %s",
3305 llvm::toString(float_value_or_err.takeError()).c_str());
3321 if (!is_enum && !is_integer && !is_float) {
3332 uint64_t byte_size = 0;
3334 byte_size = temp.value();
3341 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3342 integer, llvm::APFloat::rmTowardZero, &is_exact);
3346 if (status & llvm::APFloatBase::opInvalidOp) {
3348 "invalid type cast detected: %s",
3349 llvm::toString(value_or_err.takeError()).c_str());
3362 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3367 "cannot get value as APSInt: %s",
3368 llvm::toString(value_or_err.takeError()).c_str());
3380 : m_mod_id(), m_exe_ctx_ref() {
3387 process_sp = target_sp->GetProcessSP();
3397 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3417 : m_mod_id(), m_exe_ctx_ref(rhs.m_exe_ctx_ref) {}
3430 bool accept_invalid_exe_ctx) {
3433 const bool thread_and_frame_only_if_stopped =
true;
3435 m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped));
3442 if (process ==
nullptr)
3454 bool changed =
false;
3455 const bool was_valid = m_mod_id.
IsValid();
3457 if (m_mod_id == current_mod_id) {
3462 m_mod_id = current_mod_id;
3463 m_needs_update =
true;
3473 if (!accept_invalid_exe_ctx) {
3474 if (m_exe_ctx_ref.HasThreadRef()) {
3475 ThreadSP thread_sp(m_exe_ctx_ref.GetThreadSP());
3477 if (m_exe_ctx_ref.HasFrameRef()) {
3482 changed = was_valid;
3488 changed = was_valid;
3497 ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
3499 m_mod_id = process_sp->GetModID();
3500 m_needs_update =
false;
3537 llvm::StringRef expression,
3544 llvm::StringRef name, llvm::StringRef expression,
3550 if (expression.empty())
3552 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3553 retval_sp, options);
3554 if (retval_sp && !name.empty())
3565 pointer_type = type;
3573 if (ptr_result_valobj_sp) {
3575 ptr_result_valobj_sp->GetValue().SetValueType(
3579 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3580 if (ptr_result_valobj_sp && !name.empty())
3583 return ptr_result_valobj_sp;
3597 if (new_value_sp && !name.empty())
3599 return new_value_sp;
3605 llvm::StringRef name) {
3607 uint64_t byte_size = 0;
3609 byte_size = temp.value();
3611 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3618 llvm::StringRef name) {
3624 llvm::StringRef name) {
3627 for (
auto type_system_sp : target->GetScratchTypeSystems())
3628 if (
auto compiler_type =
3630 target_type = compiler_type;
3635 uint64_t byte_size = 0;
3636 if (
auto temp = target_type.
GetByteSize(target.get()))
3637 byte_size = temp.value();
3639 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3653 uint64_t byte_size = 0;
3655 byte_size = temp.value();
3657 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3699 while (with_dv_info) {
3702 with_dv_info = with_dv_info->
m_parent;
3709 while (with_fmt_info) {
3712 with_fmt_info = with_fmt_info->
m_parent;
3724 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3726 type = cu->GetLanguage();
3760 target_sp->GetPersistentExpressionStateForLanguage(
3763 if (!persistent_state)
3773 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3776 return persistent_var_sp->GetValueObject();
static llvm::raw_ostream & error(Stream &strm)
#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 bool CopyStringDataToBufferSP(const StreamString &source, lldb::WritableDataBufferSP &destination)
static const char * SkipLeadingExpressionPathSeparators(const char *expression)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
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.
void ManageObject(T *new_object)
A class that describes a compilation unit.
Generic representation of a type in a programming language.
bool IsEnumerationType(bool &is_signed) const
lldb::BasicType GetBasicTypeEnumeration() const
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
std::optional< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
lldb::Encoding GetEncoding(uint64_t &count) 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.
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
uint32_t GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const
Lookup a child given a name.
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.
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
bool CompareTypes(CompilerType rhs) const
bool IsScalarType() const
bool IsNullPtrType() const
CompilerType GetCanonicalType() 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.
void SetThreadSP(const lldb::ThreadSP &thread_sp)
Set accessor that creates a weak reference to the thread referenced in thread_sp.
void SetFrameSP(const lldb::StackFrameSP &frame_sp)
Set accessor that creates a weak reference to the frame referenced in frame_sp.
void SetTargetSP(const lldb::TargetSP &target_sp)
Set accessor that creates a weak reference to the target referenced in target_sp.
void SetProcessSP(const lldb::ProcessSP &process_sp)
Set accessor that creates a weak reference to the process referenced in process_sp.
"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
A plug-in interface definition class for debugging a process.
ProcessModID GetModID() const
Get the Modification ID of the process.
virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
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)
Status SetValueFromData(const DataExtractor &data, lldb::Encoding encoding, size_t byte_size)
unsigned long long ULongLong(unsigned long long fail_value=0) const
llvm::APFloat GetAPFloat() const
bool GetData(DataExtractor &data, size_t limit_byte_size=UINT32_MAX) 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)
llvm::APSInt GetAPSInt() const
void Clear()
Clear the object state.
int SetErrorStringWithFormat(const char *format,...) __attribute__((format(printf
Set the current error string to a formatted error string.
bool Fail() const
Test for error condition.
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
void SetErrorString(llvm::StringRef err_str)
Set the current error string to err_str.
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.
"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
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)
virtual bool FormatObject(ValueObject *valobj, std::string &dest, const TypeSummaryOptions &options)=0
lldb::LanguageType GetLanguage() const
TypeSummaryOptions & SetLanguage(lldb::LanguageType)
static lldb::ValueObjectSP Create(ValueObject &parent, ConstString name, const CompilerType &cast_type)
A child of another ValueObject.
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)
ValueObject * GetChildAtIndex(uint32_t idx)
void SetChildrenCount(size_t count)
size_t GetChildrenCount()
void SetChildAtIndex(size_t idx, ValueObject *valobj)
bool HasChildAtIndex(size_t idx)
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...
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()
static lldb::ValueObjectSP CreateValueObjectFromBool(lldb::TargetSP target, bool value, llvm::StringRef name)
Create a value object containing the given boolean value.
lldb::addr_t GetPointerValue(AddressType *address_type=nullptr)
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()
CompilerType GetCompilerType()
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
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()
static lldb::ValueObjectSP CreateValueObjectFromAPFloat(lldb::TargetSP target, const llvm::APFloat &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APFloat value.
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.
@ eExpressionPathScanEndReasonBitfieldRangeOperatorMet
[] is good for bitfields, but I cannot parse after it.
@ 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)
virtual std::optional< uint64_t > GetByteSize()=0
virtual size_t GetIndexOfChildWithName(llvm::StringRef name)
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 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)
virtual void GetExpressionPath(Stream &s, GetExpressionPathFormat=eGetExpressionPathFormatDereferencePointers)
bool UpdateFormatsIfNeeded()
virtual bool HasSyntheticValue()
lldb::StackFrameSP GetFrameSP() const
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)
@ eClearUserVisibleDataItemsDescription
@ eClearUserVisibleDataItemsLocation
@ eClearUserVisibleDataItemsSummary
@ eClearUserVisibleDataItemsValue
@ eClearUserVisibleDataItemsSyntheticChildren
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 lldb::addr_t GetAddressOf(bool scalar_is_load_address=true, AddressType *address_type=nullptr)
virtual bool IsLogicalTrue(Status &error)
lldb::Format m_last_format
virtual SymbolContextScope * GetSymbolContextScope()
virtual bool HasDynamicValueTypeInfo()
static lldb::ValueObjectSP CreateValueObjectFromNullptr(lldb::TargetSP target, CompilerType type, llvm::StringRef name)
Create a nullptr value object with the specified type (must be a nullptr type).
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)
static lldb::ValueObjectSP CreateValueObjectFromAPInt(lldb::TargetSP target, const llvm::APInt &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APInt value.
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)
void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType)
virtual const char * GetValueAsCString()
bool HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, lldb::Format custom_format)
virtual const char * GetLocationAsCString()
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()
virtual CompilerType MaybeCalculateCompleteType()
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.
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)
void SetValueFromInteger(const llvm::APInt &value, Status &error)
Update an existing integer ValueObject with a new integer value.
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
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
const ExecutionContextRef & GetExecutionContextRef() const
uint32_t GetNumChildrenIgnoringErrors(uint32_t max=UINT32_MAX)
Like GetNumChildren but returns 0 on error.
virtual bool CanProvideValue()
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
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
AddressType GetValueAddressType() const
const CompilerType & GetCompilerType()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
@ DoNoSelectMostRelevantFrame
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.
@ 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.
const char * toString(AppleArm64ExceptionClass EC)
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.
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_getting_summary
bool m_is_synthetic_children_generated
bool m_is_bitfield_for_scalar
bool m_is_array_item_for_pointer
bool m_did_calculate_complete_objc_class_type
bool m_children_count_valid
SyntheticChildrenTraversal m_synthetic_children_traversal
bool m_check_dot_vs_arrow_syntax
bool m_allow_bitfields_syntax
SyntheticChildrenTraversal