22#include "lldb/Host/Config.h"
54#include "llvm/Support/Compiler.h"
82 : m_parent(&parent), m_update_point(parent.GetUpdatePoint()),
95 : m_update_point(exe_scope), m_manager(&manager),
96 m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type),
101 const ArchSpec &arch = target_sp->GetArchitecture();
114 bool did_change_formats =
false;
128 if (update_format && !did_change_formats)
159 bool need_compare_checksums =
false;
160 llvm::SmallVector<uint8_t, 16> old_checksum;
163 need_compare_checksums =
true;
166 old_checksum.begin());
175 const uint64_t max_checksum_size = 128;
178 need_compare_checksums =
false;
182 assert(!need_compare_checksums ||
191 }
else if (need_compare_checksums) {
206 "[%s %p] checking for FormatManager revisions. ValueObject "
207 "rev: %d - Global rev: %d",
208 GetName().GetCString(),
static_cast<void *
>(
this),
212 bool any_change =
false;
252 return compiler_type;
261 return compiler_type;
265 if (std::optional<CompilerType> complete_type =
266 runtime->GetRuntimeType(compiler_type)) {
272 return compiler_type;
293 switch (value_type) {
319 sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
338 if (bitfield_bit_size)
349 LazyBool is_logical_true = language->IsLogicalTrue(*
this,
error);
350 switch (is_logical_true) {
353 return (is_logical_true ==
true);
386 if (child !=
nullptr)
387 return child->
GetSP();
394 if (names.size() == 0)
397 for (llvm::StringRef name : names) {
398 root = root->GetChildMemberWithName(name);
407 bool omit_empty_base_classes =
true;
409 omit_empty_base_classes);
421 std::vector<uint32_t> child_indexes;
422 bool omit_empty_base_classes =
true;
427 const size_t num_child_indexes =
429 name, omit_empty_base_classes, child_indexes);
430 if (num_child_indexes == 0)
434 for (uint32_t idx : child_indexes)
436 child_sp = child_sp->GetChildAtIndex(idx, can_create);
446 return children_count <= max ? children_count : max;
453 if (num_children_or_err)
456 return num_children_or_err;
464 return *value_or_err;
471 bool has_children =
false;
474 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
489 bool omit_empty_base_classes =
true;
490 bool ignore_array_bounds =
false;
491 std::string child_name;
492 uint32_t child_byte_size = 0;
493 int32_t child_byte_offset = 0;
494 uint32_t child_bitfield_bit_size = 0;
495 uint32_t child_bitfield_bit_offset = 0;
496 bool child_is_base_class =
false;
497 bool child_is_deref_of_parent =
false;
498 uint64_t language_flags = 0;
499 const bool transparent_pointers =
true;
503 auto child_compiler_type_or_err =
505 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
506 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
507 child_bitfield_bit_size, child_bitfield_bit_offset,
508 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
509 if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
511 child_compiler_type_or_err.takeError(),
512 "could not find child: {0}");
517 *
this, *child_compiler_type_or_err,
ConstString(child_name),
518 child_byte_size, child_byte_offset, child_bitfield_bit_size,
519 child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
524 bool omit_empty_base_classes =
true;
525 bool ignore_array_bounds =
true;
526 std::string child_name;
527 uint32_t child_byte_size = 0;
528 int32_t child_byte_offset = 0;
529 uint32_t child_bitfield_bit_size = 0;
530 uint32_t child_bitfield_bit_offset = 0;
531 bool child_is_base_class =
false;
532 bool child_is_deref_of_parent =
false;
533 uint64_t language_flags = 0;
534 const bool transparent_pointers =
false;
538 auto child_compiler_type_or_err =
540 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
541 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
542 child_bitfield_bit_size, child_bitfield_bit_offset,
543 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
544 if (!child_compiler_type_or_err) {
546 child_compiler_type_or_err.takeError(),
547 "could not find child: {0}");
551 if (child_compiler_type_or_err->IsValid()) {
552 child_byte_offset += child_byte_size * idx;
555 *
this, *child_compiler_type_or_err,
ConstString(child_name),
556 child_byte_size, child_byte_offset, child_bitfield_bit_size,
557 child_bitfield_bit_offset, child_is_base_class,
564 return synth_valobj_sp->GetChildAtIndex(idx,
true).get();
570 std::string &destination,
577 std::string &destination,
585 destination =
"<incomplete type>";
618 target_sp->GetSummaryStatisticsCache()
619 .GetSummaryStatisticsForProvider(*summary_ptr);
623 summary_ptr->
FormatObject(
this, destination, actual_options);
625 summary_ptr->
FormatObject(
this, destination, actual_options);
628 return !destination.empty();
651 bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
652 pointee_or_element_compiler_type.
IsCharType());
653 if (!is_char_arr_ptr)
657 if (type_flags.
Test(eTypeIsArray))
666 uint32_t item_count) {
668 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
669 const bool is_pointer_type = type_info & eTypeIsPointer;
670 const bool is_array_type = type_info & eTypeIsArray;
671 if (!(is_pointer_type || is_array_type))
679 std::optional<uint64_t> item_type_size =
684 const uint64_t bytes = item_count * *item_type_size;
685 const uint64_t offset = item_idx * *item_type_size;
687 if (item_idx == 0 && item_count == 1)
689 if (is_pointer_type) {
692 if (
error.Fail() || pointee_sp.get() ==
nullptr)
694 return pointee_sp->GetData(data,
error);
697 if (child_sp.get() ==
nullptr)
700 return child_sp->GetData(data,
error);
718 addr = addr + offset;
720 module_sp->ResolveFileAddress(addr, so_addr);
727 if (
error.Success()) {
741 if (
error.Success() || bytes_read > 0) {
750 if (max_bytes && *max_bytes > offset) {
751 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
755 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
797 const size_t byte_size =
GetByteSize().value_or(0);
801 switch (value_type) {
811 "unable to set scalar value: %s", set_error.
AsCString());
824 if (!
error.Success())
826 if (bytes_written != byte_size) {
854 llvm::StringRef src = source.
GetString();
855 src = src.rtrim(
'\0');
856 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
857 memcpy(destination->GetBytes(), src.data(), src.size());
861std::pair<size_t, bool>
864 bool was_capped =
false;
870 s <<
"<no target to read from>";
873 return {0, was_capped};
878 size_t bytes_read = 0;
879 size_t total_bytes_read = 0;
884 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
890 bool capped_data =
false;
891 const bool is_array = type_flags.
Test(eTypeIsArray);
894 uint64_t array_size = 0;
895 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
896 cstr_len = array_size;
897 if (cstr_len > max_length) {
899 cstr_len = max_length;
911 if (cstr ==
nullptr) {
912 s <<
"<invalid address>";
915 return {0, was_capped};
917 s << llvm::StringRef(cstr, cstr_len);
919 return {cstr_len, was_capped};
921 s <<
"<invalid address>";
924 return {0, was_capped};
928 Address cstr_so_addr(cstr_address);
930 if (cstr_len > 0 && honor_array) {
938 total_bytes_read = bytes_read;
939 for (
size_t offset = 0; offset < bytes_read; offset++)
945 cstr_len = max_length;
946 const size_t k_max_buf_size = 64;
950 int cstr_len_displayed = -1;
951 bool capped_cstr =
false;
956 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
957 total_bytes_read += bytes_read;
958 const char *cstr = data.
PeekCStr(0);
959 size_t len = strnlen(cstr, k_max_buf_size);
960 if (cstr_len_displayed < 0)
961 cstr_len_displayed = len;
965 cstr_len_displayed += len;
966 if (len > bytes_read)
971 for (
size_t offset = 0; offset < bytes_read; offset++)
974 if (len < k_max_buf_size)
977 if (len >= cstr_len) {
986 if (cstr_len_displayed >= 0) {
993 s <<
"<not a string object>";
996 return {total_bytes_read, was_capped};
1001 return llvm::createStringError(
"could not update value");
1010 return llvm::createStringError(
"no process");
1013 auto get_object_description =
1014 [&](
LanguageType language) -> llvm::Expected<std::string> {
1017 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1022 return llvm::createStringError(
"no native language runtime");
1027 llvm::Expected<std::string> desc = get_object_description(native_language);
1035 llvm::consumeError(desc.takeError());
1042 std::string &destination) {
1050 std::string &destination) {
1068 my_format = reg_info->
format;
1078 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1139 return llvm::make_error<llvm::StringError>(
1140 "type cannot be converted to APSInt", llvm::inconvertibleErrorCode());
1148 return llvm::make_error<llvm::StringError>(
1149 "error occurred; unable to convert to APSInt",
1150 llvm::inconvertibleErrorCode());
1155 return llvm::make_error<llvm::StringError>(
1156 "type cannot be converted to APFloat", llvm::inconvertibleErrorCode());
1164 return llvm::make_error<llvm::StringError>(
1165 "error occurred; unable to convert to APFloat",
1166 llvm::inconvertibleErrorCode());
1175 return value_or_err->getBoolValue();
1180 return value_or_err->isNonZero();
1185 return llvm::make_error<llvm::StringError>(
"type cannot be converted to bool",
1186 llvm::inconvertibleErrorCode());
1204 "current value object is not a temporary object");
1210 uint64_t byte_size = 0;
1212 byte_size = temp.value();
1213 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1215 "illegal argument: new value should be of the same size");
1220 data_sp->SetData(value.getRawData(), byte_size,
1221 target->GetArchitecture().GetByteOrder());
1222 data_sp->SetAddressByteSize(
1223 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1243 "current value object is not a temporary object");
1248 CompilerType new_val_type = new_val_sp->GetCompilerType();
1252 "illegal argument: new value should be of the same size");
1257 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1262 }
else if (new_val_type.
IsFloat()) {
1263 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1269 bool success =
true;
1270 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1273 uint64_t num_bits = 0;
1274 if (
auto temp = new_val_sp->GetCompilerType().GetBitSize(target.get()))
1275 num_bits = temp.value();
1289 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1296 if (flags.
Test(eTypeIsArray)) {
1322 bool do_dump_error) {
1335 bool allow_special =
1337 const bool only_special =
false;
1339 if (allow_special) {
1340 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1353 std::pair<size_t, bool> read_string =
1357 lldb_private::formatters::StringPrinter::
1358 ReadBufferAndDumpToStreamOptions options(*
this);
1362 options.SetStream(&s);
1363 options.SetPrefixToken(
nullptr);
1364 options.SetQuote(
'"');
1365 options.SetSourceSize(buffer_sp->GetByteSize());
1366 options.SetIsTruncated(read_string.second);
1369 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1371 return !
error.Fail();
1379 if (flags.
Test(eTypeIsArray)) {
1385 for (
size_t low = 0; low < count; low++) {
1392 s <<
"<invalid child>";
1395 child->DumpPrintableRepresentation(
1426 for (
size_t low = 0; low < count; low++) {
1433 s <<
"<invalid child>";
1436 child->DumpPrintableRepresentation(
1468 bool var_success =
false;
1471 llvm::StringRef str;
1482 switch (val_obj_display) {
1494 strm <<
"error: " <<
toString(desc.takeError());
1554 else if (val_obj_display ==
1556 s.
PutCString(
"<not a valid Objective-C object>");
1561 s.
PutCString(
"<no printable representation>");
1589 if (scalar_is_load_address) {
1643 const char *value_str) {
1645 if (
auto boolean = language->GetBooleanFromString(value_str))
1646 return *
boolean ?
"1" :
"0";
1648 return llvm::StringSwitch<const char *>(value_str)
1651 .Default(value_str);
1666 const size_t byte_size =
GetByteSize().value_or(0);
1673 }
else if (byte_size <= 16) {
1682 if (
error.Success()) {
1683 switch (value_type) {
1694 target_addr, new_scalar, byte_size,
error);
1695 if (!
error.Success())
1697 if (bytes_written != byte_size) {
1711 bool success = new_scalar.
GetData(new_data);
1753 std::map<ConstString, ValueObject *>::const_iterator pos =
1756 synthetic_child_sp = pos->second->GetSP();
1757 return synthetic_child_sp;
1780 if (runtime->IsAllowedRuntimeValue(
GetName()))
1788 return language->IsNilReference(*
this);
1795 return language->IsUninitializedReference(*
this);
1813 std::string index_str = llvm::formatv(
"[{0}]", index);
1818 if (!synthetic_child_sp) {
1825 if (synthetic_child) {
1827 synthetic_child_sp = synthetic_child->
GetSP();
1828 synthetic_child_sp->SetName(
ConstString(index_str));
1829 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1833 return synthetic_child_sp;
1840 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1845 if (!synthetic_child_sp) {
1846 uint32_t bit_field_size = to - from + 1;
1847 uint32_t bit_field_offset = from;
1850 GetByteSize().value_or(0) * 8 - bit_field_size - bit_field_offset;
1855 0, bit_field_size, bit_field_offset,
false,
false,
1859 if (synthetic_child) {
1861 synthetic_child_sp = synthetic_child->
GetSP();
1862 synthetic_child_sp->SetName(
ConstString(index_str));
1863 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1867 return synthetic_child_sp;
1871 uint32_t offset,
const CompilerType &type,
bool can_create,
1876 if (name_const_str.
IsEmpty()) {
1877 name_const_str.
SetString(
"@" + std::to_string(offset));
1884 if (synthetic_child_sp.get())
1885 return synthetic_child_sp;
1891 std::optional<uint64_t> size =
1898 if (synthetic_child) {
1900 synthetic_child_sp = synthetic_child->
GetSP();
1901 synthetic_child_sp->SetName(name_const_str);
1902 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1904 return synthetic_child_sp;
1913 if (name_const_str.
IsEmpty()) {
1915 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1924 if (synthetic_child_sp.get())
1925 return synthetic_child_sp;
1930 const bool is_base_class =
true;
1933 std::optional<uint64_t> size =
1940 if (synthetic_child) {
1942 synthetic_child_sp = synthetic_child->
GetSP();
1943 synthetic_child_sp->SetName(name_const_str);
1945 return synthetic_child_sp;
1953 if (!expression || !expression[0])
1955 if (expression[0] ==
'.')
1956 return expression + 1;
1957 if (expression[0] ==
'-' && expression[1] ==
'>')
1958 return expression + 2;
1970 if (!synthetic_child_sp) {
1974 expression,
nullptr,
nullptr,
1980 if (synthetic_child_sp.get()) {
1984 synthetic_child_sp->SetName(
1988 return synthetic_child_sp;
1993 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2099 uint64_t load_addr =
2120 if (is_deref_of_parent &&
2143 if (!is_deref_of_parent) {
2145 if (non_base_class_parent &&
2149 if (non_base_class_parent_compiler_type) {
2154 const uint32_t non_base_class_parent_type_info =
2155 non_base_class_parent_compiler_type.
GetTypeInfo();
2157 if (non_base_class_parent_type_info & eTypeIsPointer) {
2159 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2160 !(non_base_class_parent_type_info & eTypeIsArray)) {
2173 if (is_deref_of_parent &&
2193 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2194 final_value_type ? final_value_type : &dummy_final_value_type, options,
2195 final_task_on_target ? final_task_on_target
2196 : &dummy_final_task_on_target);
2198 if (!final_task_on_target ||
2202 if (ret_val.get() &&
2203 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2207 if ((final_task_on_target ? *final_task_on_target
2208 : dummy_final_task_on_target) ==
2212 if (
error.Fail() || !final_value.get()) {
2216 if (final_value_type)
2220 if (final_task_on_target)
2225 if (*final_task_on_target ==
2229 if (
error.Fail() || !final_value.get()) {
2233 if (final_value_type)
2237 if (final_task_on_target)
2257 llvm::StringRef remainder = expression;
2260 llvm::StringRef temp_expression = remainder;
2262 CompilerType root_compiler_type = root->GetCompilerType();
2264 Flags pointee_compiler_type_info;
2266 Flags root_compiler_type_info(
2267 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2268 if (pointee_compiler_type)
2271 if (temp_expression.empty()) {
2276 switch (temp_expression.front()) {
2278 temp_expression = temp_expression.drop_front();
2280 root_compiler_type_info.
Test(eTypeIsPointer))
2290 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2293 root_compiler_type_info.
Test(eTypeIsPointer) &&
2300 if (!temp_expression.starts_with(
">")) {
2311 temp_expression.front() ==
'.' &&
2312 root_compiler_type_info.
Test(eTypeIsPointer))
2322 temp_expression = temp_expression.drop_front();
2324 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2325 if (next_sep_pos == llvm::StringRef::npos)
2328 llvm::StringRef child_name = temp_expression;
2330 root->GetChildMemberWithName(child_name);
2332 if (child_valobj_sp.get())
2337 return child_valobj_sp;
2345 if (root->IsSynthetic()) {
2346 child_valobj_sp = root->GetNonSyntheticValue();
2347 if (child_valobj_sp.get())
2349 child_valobj_sp->GetChildMemberWithName(child_name);
2354 if (!root->IsSynthetic()) {
2355 child_valobj_sp = root->GetSyntheticValue();
2356 if (child_valobj_sp.get())
2358 child_valobj_sp->GetChildMemberWithName(child_name);
2363 if (root->IsSynthetic()) {
2364 child_valobj_sp = root->GetNonSyntheticValue();
2365 if (child_valobj_sp.get())
2367 child_valobj_sp->GetChildMemberWithName(child_name);
2369 child_valobj_sp = root->GetSyntheticValue();
2370 if (child_valobj_sp.get())
2372 child_valobj_sp->GetChildMemberWithName(child_name);
2381 if (child_valobj_sp.get())
2386 return child_valobj_sp;
2395 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2396 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2399 root->GetChildMemberWithName(child_name);
2400 if (child_valobj_sp.get())
2402 root = child_valobj_sp;
2403 remainder = next_separator;
2413 if (root->IsSynthetic()) {
2414 child_valobj_sp = root->GetNonSyntheticValue();
2415 if (child_valobj_sp.get())
2417 child_valobj_sp->GetChildMemberWithName(child_name);
2422 if (!root->IsSynthetic()) {
2423 child_valobj_sp = root->GetSyntheticValue();
2424 if (child_valobj_sp.get())
2426 child_valobj_sp->GetChildMemberWithName(child_name);
2431 if (root->IsSynthetic()) {
2432 child_valobj_sp = root->GetNonSyntheticValue();
2433 if (child_valobj_sp.get())
2435 child_valobj_sp->GetChildMemberWithName(child_name);
2437 child_valobj_sp = root->GetSyntheticValue();
2438 if (child_valobj_sp.get())
2440 child_valobj_sp->GetChildMemberWithName(child_name);
2449 if (child_valobj_sp.get())
2451 root = child_valobj_sp;
2452 remainder = next_separator;
2465 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2466 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2467 !root_compiler_type_info.
Test(
2470 if (!root_compiler_type_info.
Test(
2492 if (temp_expression[1] ==
2495 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2511 size_t close_bracket_position = temp_expression.find(
']', 1);
2512 if (close_bracket_position ==
2513 llvm::StringRef::npos)
2521 llvm::StringRef bracket_expr =
2522 temp_expression.slice(1, close_bracket_position);
2526 assert(!bracket_expr.empty());
2528 if (!bracket_expr.contains(
'-')) {
2532 unsigned long index = 0;
2533 if (bracket_expr.getAsInteger(0, index)) {
2541 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2542 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2543 if (!child_valobj_sp)
2544 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2545 if (!child_valobj_sp)
2546 if (root->HasSyntheticValue() &&
2547 llvm::expectedToStdOptional(
2548 root->GetSyntheticValue()->GetNumChildren())
2549 .value_or(0) > index)
2551 root->GetSyntheticValue()->GetChildAtIndex(index);
2552 if (child_valobj_sp) {
2553 root = child_valobj_sp;
2555 temp_expression.substr(close_bracket_position + 1);
2564 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2576 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2578 root = root->Dereference(
error);
2579 if (
error.Fail() || !root) {
2589 if (root->GetCompilerType().GetMinimumLanguage() ==
2591 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2592 root->HasSyntheticValue() &&
2595 SyntheticChildrenTraversal::ToSynthetic ||
2598 SyntheticChildrenTraversal::Both)) {
2599 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2601 root = root->GetSyntheticArrayMember(index,
true);
2609 temp_expression.substr(close_bracket_position + 1);
2614 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2615 root = root->GetSyntheticBitFieldChild(index, index,
true);
2629 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2630 root = root->GetChildAtIndex(index);
2638 temp_expression.substr(close_bracket_position + 1);
2644 SyntheticChildrenTraversal::ToSynthetic ||
2647 SyntheticChildrenTraversal::Both) {
2648 if (root->HasSyntheticValue())
2649 root = root->GetSyntheticValue();
2650 else if (!root->IsSynthetic()) {
2665 root = root->GetChildAtIndex(index);
2673 temp_expression.substr(close_bracket_position + 1);
2685 llvm::StringRef sleft, sright;
2686 unsigned long low_index, high_index;
2687 std::tie(sleft, sright) = bracket_expr.split(
'-');
2688 if (sleft.getAsInteger(0, low_index) ||
2689 sright.getAsInteger(0, high_index)) {
2696 if (low_index > high_index)
2697 std::swap(low_index, high_index);
2699 if (root_compiler_type_info.
Test(
2702 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2714 }
else if (root_compiler_type_info.
Test(
2721 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2723 root = root->Dereference(
error);
2724 if (
error.Fail() || !root) {
2807 result_sp =
GetSP();
2810 bool is_synthetic = result_sp->IsSynthetic();
2811 if (synthValue && !is_synthetic) {
2812 if (
auto synth_sp = result_sp->GetSyntheticValue())
2815 if (!synthValue && is_synthetic) {
2816 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2817 return non_synth_sp;
2828 if (is_pointer_or_reference_type) {
2829 bool omit_empty_base_classes =
true;
2830 bool ignore_array_bounds =
false;
2832 std::string child_name_str;
2833 uint32_t child_byte_size = 0;
2834 int32_t child_byte_offset = 0;
2835 uint32_t child_bitfield_bit_size = 0;
2836 uint32_t child_bitfield_bit_offset = 0;
2837 bool child_is_base_class =
false;
2838 bool child_is_deref_of_parent =
false;
2839 const bool transparent_pointers =
false;
2841 uint64_t language_flags = 0;
2847 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
2848 ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset,
2849 child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
2850 child_is_deref_of_parent,
this, language_flags);
2851 if (!child_compiler_type_or_err)
2853 child_compiler_type_or_err.takeError(),
2854 "could not find child: {0}");
2856 child_compiler_type = *child_compiler_type_or_err;
2858 if (child_compiler_type && child_byte_size) {
2860 if (!child_name_str.empty())
2861 child_name.
SetCString(child_name_str.c_str());
2864 *
this, child_compiler_type, child_name, child_byte_size,
2865 child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
2879 if (child_compiler_type) {
2881 if (!child_name_str.empty())
2882 child_name.
SetCString(child_name_str.c_str());
2885 *
this, child_compiler_type, child_name, child_byte_size,
2886 child_byte_offset, child_bitfield_bit_size,
2887 child_bitfield_bit_offset, child_is_base_class,
2907 if (is_pointer_or_reference_type)
2909 "dereference failed: (%s) %s",
2913 "not a pointer or reference type: (%s) %s",
2924 const bool scalar_is_load_address =
false;
2928 switch (address_type) {
2939 if (compiler_type) {
2940 std::string name(1,
'&');
2956 "'%s' doesn't have a valid address", expr_path_strm.
GetData());
2989 return DoCast(compiler_type);
2992 "Can only cast to a type that is equal to or smaller "
2993 "than the orignal type.");
3036 const bool scalar_is_load_address =
true;
3038 addr_value =
GetAddressOf(scalar_is_load_address, &addr_type);
3045 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3056 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3061 return llvm::make_error<llvm::StringError>(
3062 "Invalid target type: should be a pointer or a reference",
3063 llvm::inconvertibleErrorCode());
3069 auto target_record_type =
3071 auto start_record_type =
3074 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3075 return llvm::make_error<llvm::StringError>(
3076 "Underlying start & target types should be record types",
3077 llvm::inconvertibleErrorCode());
3079 if (target_record_type.CompareTypes(start_record_type))
3080 return llvm::make_error<llvm::StringError>(
3081 "Underlying start & target types should be different",
3082 llvm::inconvertibleErrorCode());
3084 if (base_type_indices.empty())
3085 return llvm::make_error<llvm::StringError>(
3086 "Children sequence must be non-empty", llvm::inconvertibleErrorCode());
3095 for (
const uint32_t i : base_type_indices)
3098 inner_value->GetChildAtIndex(i,
true);
3102 CompilerType inner_value_type = inner_value->GetCompilerType();
3105 return llvm::make_error<llvm::StringError>(
3106 "casted value doesn't match the desired type",
3107 llvm::inconvertibleErrorCode());
3109 uintptr_t addr = inner_value->GetLoadAddress();
3110 llvm::StringRef name =
"";
3118 return llvm::make_error<llvm::StringError>(
3119 "casted value doesn't match the desired type",
3120 llvm::inconvertibleErrorCode());
3125llvm::Expected<lldb::ValueObjectSP>
3131 return llvm::make_error<llvm::StringError>(
3132 "Invalid target type: should be a pointer or a reference",
3133 llvm::inconvertibleErrorCode());
3139 auto target_record_type =
3141 auto start_record_type =
3144 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3145 return llvm::make_error<llvm::StringError>(
3146 "Underlying start & target types should be record types",
3147 llvm::inconvertibleErrorCode());
3149 if (target_record_type.CompareTypes(start_record_type))
3150 return llvm::make_error<llvm::StringError>(
3151 "Underlying start & target types should be different",
3152 llvm::inconvertibleErrorCode());
3155 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3157 return llvm::make_error<llvm::StringError>(
3158 "virtual base should be valid", llvm::inconvertibleErrorCode());
3159 return llvm::make_error<llvm::StringError>(
3163 llvm::inconvertibleErrorCode());
3176 llvm::StringRef name =
"";
3179 name, addr - offset, exe_ctx, pointer_type,
false);
3187 return value->Dereference(
error);
3204 if (!is_scalar && !is_enum && !is_pointer)
3210 uint64_t type_byte_size = 0;
3211 uint64_t val_byte_size = 0;
3213 type_byte_size = temp.value();
3215 val_byte_size = temp.value();
3222 if (!type.
IsBoolean() && type_byte_size < val_byte_size)
3226 "target type cannot be smaller than the pointer type"));
3230 if (!is_scalar || is_integer)
3233 else if (is_scalar && is_float) {
3235 if (float_value_or_err)
3237 target, !float_value_or_err->isZero(),
"result");
3242 "cannot get value as APFloat: %s",
3243 llvm::toString(float_value_or_err.takeError()).c_str()));
3248 if (!is_scalar || is_integer) {
3250 if (int_value_or_err) {
3254 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3261 "cannot get value as APSInt: %s",
3262 llvm::toString(int_value_or_err.takeError()).c_str()));
3263 }
else if (is_scalar && is_float) {
3267 if (float_value_or_err) {
3268 llvm::APFloatBase::opStatus status =
3269 float_value_or_err->convertToInteger(
3270 integer, llvm::APFloat::rmTowardZero, &is_exact);
3274 if (status & llvm::APFloatBase::opInvalidOp)
3278 "invalid type cast detected: %s",
3279 llvm::toString(float_value_or_err.takeError()).c_str()));
3289 if (int_value_or_err) {
3291 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3301 "cannot get value as APSInt: %s",
3302 llvm::toString(int_value_or_err.takeError()).c_str()));
3307 if (int_value_or_err) {
3308 Scalar scalar_int(*int_value_or_err);
3317 "cannot get value as APSInt: %s",
3318 llvm::toString(int_value_or_err.takeError()).c_str()));
3323 if (float_value_or_err) {
3324 Scalar scalar_float(*float_value_or_err);
3333 "cannot get value as APFloat: %s",
3334 llvm::toString(float_value_or_err.takeError()).c_str()));
3351 if (!is_enum && !is_integer && !is_float)
3355 "argument must be an integer, a float, or an enum"));
3363 uint64_t byte_size = 0;
3365 byte_size = temp.value();
3372 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3373 integer, llvm::APFloat::rmTowardZero, &is_exact);
3377 if (status & llvm::APFloatBase::opInvalidOp)
3381 "invalid type cast detected: %s",
3382 llvm::toString(value_or_err.takeError()).c_str()));
3393 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3400 "cannot get value as APSInt: %s",
3401 llvm::toString(value_or_err.takeError()).c_str()));
3412 : m_mod_id(), m_exe_ctx_ref() {
3419 process_sp = target_sp->GetProcessSP();
3429 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3449 : m_mod_id(), m_exe_ctx_ref(rhs.m_exe_ctx_ref) {}
3462 bool accept_invalid_exe_ctx) {
3465 const bool thread_and_frame_only_if_stopped =
true;
3467 m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped));
3474 if (process ==
nullptr)
3486 bool changed =
false;
3487 const bool was_valid = m_mod_id.
IsValid();
3489 if (m_mod_id == current_mod_id) {
3494 m_mod_id = current_mod_id;
3495 m_needs_update =
true;
3505 if (!accept_invalid_exe_ctx) {
3506 if (m_exe_ctx_ref.HasThreadRef()) {
3507 ThreadSP thread_sp(m_exe_ctx_ref.GetThreadSP());
3509 if (m_exe_ctx_ref.HasFrameRef()) {
3514 changed = was_valid;
3520 changed = was_valid;
3529 ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
3531 m_mod_id = process_sp->GetModID();
3532 m_needs_update =
false;
3569 llvm::StringRef expression,
3576 llvm::StringRef name, llvm::StringRef expression,
3582 if (expression.empty())
3584 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3585 retval_sp, options);
3586 if (retval_sp && !name.empty())
3597 pointer_type = type;
3605 if (ptr_result_valobj_sp) {
3607 ptr_result_valobj_sp->GetValue().SetValueType(
3611 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3612 if (ptr_result_valobj_sp && !name.empty())
3615 return ptr_result_valobj_sp;
3629 if (new_value_sp && !name.empty())
3631 return new_value_sp;
3637 llvm::StringRef name) {
3639 uint64_t byte_size = 0;
3641 byte_size = temp.value();
3643 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3650 llvm::StringRef name) {
3656 llvm::StringRef name) {
3659 for (
auto type_system_sp : target->GetScratchTypeSystems())
3660 if (
auto compiler_type =
3662 target_type = compiler_type;
3667 uint64_t byte_size = 0;
3668 if (
auto temp = target_type.
GetByteSize(target.get()))
3669 byte_size = temp.value();
3671 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3685 uint64_t byte_size = 0;
3687 byte_size = temp.value();
3689 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3731 while (with_dv_info) {
3734 with_dv_info = with_dv_info->
m_parent;
3741 while (with_fmt_info) {
3744 with_fmt_info = with_fmt_info->
m_parent;
3756 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3758 type = cu->GetLanguage();
3790 target_sp->GetPersistentExpressionStateForLanguage(
3793 if (!persistent_state)
3803 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3806 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 const char * ConvertBoolean(lldb::LanguageType language_type, const char *value_str)
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.
Status Clone() const
Don't call this function in new code.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
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.
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
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.
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.
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