22#include "lldb/Host/Config.h"
53#include "llvm/Support/Compiler.h"
83 m_flags.m_is_synthetic_children_generated =
100 const ArchSpec &arch = target_sp->GetArchitecture();
113 bool did_change_formats =
false;
127 if (update_format && !did_change_formats)
141 m_flags.m_old_value_valid =
false;
143 m_flags.m_old_value_valid =
true;
158 bool need_compare_checksums =
false;
159 llvm::SmallVector<uint8_t, 16> old_checksum;
162 need_compare_checksums =
true;
165 old_checksum.begin());
174 const uint64_t max_checksum_size = 128;
177 need_compare_checksums =
false;
181 assert(!need_compare_checksums ||
186 else if (!
m_flags.m_value_did_change && !success) {
190 }
else if (need_compare_checksums) {
205 "[%s %p] checking for FormatManager revisions. ValueObject "
206 "rev: %d - Global rev: %d",
207 GetName().GetCString(),
static_cast<void *
>(
this),
211 bool any_change =
false;
235 m_flags.m_children_count_valid =
false;
236 m_flags.m_did_calculate_complete_objc_class_type =
false;
247 if (
m_flags.m_did_calculate_complete_objc_class_type) {
251 return compiler_type;
254 m_flags.m_did_calculate_complete_objc_class_type =
true;
260 return compiler_type;
264 if (std::optional<CompilerType> complete_type =
265 runtime->GetRuntimeType(compiler_type)) {
271 return compiler_type;
292 switch (value_type) {
318 sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
337 if (bitfield_bit_size)
348 LazyBool is_logical_true = language->IsLogicalTrue(*
this,
error);
349 switch (is_logical_true) {
352 return (is_logical_true ==
true);
378 if (can_create && !
m_children.HasChildAtIndex(idx)) {
385 if (child !=
nullptr)
386 return child->
GetSP();
393 if (names.size() == 0)
396 for (llvm::StringRef name : names) {
397 root = root->GetChildMemberWithName(name);
405llvm::Expected<size_t>
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);
444 if (
m_flags.m_children_count_valid) {
445 size_t children_count =
m_children.GetChildrenCount();
446 return children_count <= max ? children_count : max;
451 if (!
m_flags.m_children_count_valid) {
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))
484 m_flags.m_children_count_valid =
true;
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>";
591 if (
m_flags.m_is_getting_summary)
594 m_flags.m_is_getting_summary =
true;
618 target_sp->GetSummaryStatisticsCache()
619 .GetSummaryStatisticsForProvider(*summary_ptr);
623 summary_ptr->
FormatObject(
this, destination, actual_options);
625 summary_ptr->
FormatObject(
this, destination, actual_options);
627 m_flags.m_is_getting_summary =
false;
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))
664 uint32_t item_count) {
666 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
667 const bool is_pointer_type = type_info & eTypeIsPointer;
668 const bool is_array_type = type_info & eTypeIsArray;
669 if (!(is_pointer_type || is_array_type))
677 std::optional<uint64_t> item_type_size =
678 llvm::expectedToOptional(pointee_or_element_compiler_type.
GetByteSize(
682 const uint64_t bytes = item_count * *item_type_size;
683 const uint64_t offset = item_idx * *item_type_size;
685 if (item_idx == 0 && item_count == 1)
687 if (is_pointer_type) {
690 if (
error.Fail() || pointee_sp.get() ==
nullptr)
692 return pointee_sp->GetData(data,
error);
695 if (child_sp.get() ==
nullptr)
698 return child_sp->GetData(data,
error);
708 auto [addr, addr_type] =
715 addr = addr + offset;
717 module_sp->ResolveFileAddress(addr, so_addr);
724 if (
error.Success()) {
738 target->ReadMemory(target_addr, heap_buf_ptr->
GetBytes(), bytes,
740 if (
error.Success() || bytes_read > 0) {
749 if (max_bytes && *max_bytes > offset) {
750 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
754 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
771 if (
m_data.GetByteSize()) {
795 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
799 switch (value_type) {
805 m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
809 "unable to set scalar value: %s", set_error.
AsCString());
822 if (!
error.Success())
824 if (bytes_written != byte_size) {
834 m_data.SetData(buffer_sp, 0);
836 const_cast<uint8_t *
>(
m_data.GetDataStart()),
837 byte_size,
m_data.GetByteOrder());
857 if ((uint64_t)
m_data.GetDataStart() == start)
860 if ((uint64_t)
m_value.GetBuffer().GetBytes() == start)
861 return m_value.GetBuffer().GetData();
868 llvm::StringRef src = source.
GetString();
869 src = src.rtrim(
'\0');
870 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
871 memcpy(destination->GetBytes(), src.data(), src.size());
875std::pair<size_t, bool>
878 bool was_capped =
false;
884 s <<
"<no target to read from>";
887 return {0, was_capped};
892 size_t bytes_read = 0;
893 size_t total_bytes_read = 0;
898 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
903 bool capped_data =
false;
904 const bool is_array = type_flags.
Test(eTypeIsArray);
907 uint64_t array_size = 0;
908 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
909 cstr_len = array_size;
910 if (cstr_len > max_length) {
912 cstr_len = max_length;
921 if (cstr_address.
address == 0 ||
925 if (cstr ==
nullptr) {
926 s <<
"<invalid address>";
929 return {0, was_capped};
931 s << llvm::StringRef(cstr, cstr_len);
933 return {cstr_len, was_capped};
935 s <<
"<invalid address>";
938 return {0, was_capped};
944 if (cstr_len > 0 && honor_array) {
952 total_bytes_read = bytes_read;
953 for (
size_t offset = 0; offset < bytes_read; offset++)
959 cstr_len = max_length;
960 const size_t k_max_buf_size = 64;
964 int cstr_len_displayed = -1;
965 bool capped_cstr =
false;
970 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
971 total_bytes_read += bytes_read;
972 const char *cstr = data.
PeekCStr(0);
973 size_t len = strnlen(cstr, k_max_buf_size);
974 if (cstr_len_displayed < 0)
975 cstr_len_displayed = len;
979 cstr_len_displayed += len;
980 if (len > bytes_read)
985 for (
size_t offset = 0; offset < bytes_read; offset++)
988 if (len < k_max_buf_size)
991 if (len >= cstr_len) {
1000 if (cstr_len_displayed >= 0) {
1007 s <<
"<not a string object>";
1010 return {total_bytes_read, was_capped};
1015 return llvm::createStringError(
"could not update value");
1024 return llvm::createStringError(
"no process");
1027 auto get_object_description =
1028 [&](
LanguageType language) -> llvm::Expected<std::string> {
1031 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1036 return llvm::createStringError(
"no native language runtime");
1041 llvm::Expected<std::string> desc = get_object_description(native_language);
1049 llvm::consumeError(desc.takeError());
1056 std::string &destination) {
1064 std::string &destination) {
1076 if (
m_flags.m_is_bitfield_for_scalar)
1082 my_format = reg_info->
format;
1092 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1153 return llvm::make_error<llvm::StringError>(
1154 "type cannot be converted to APSInt", llvm::inconvertibleErrorCode());
1162 return llvm::make_error<llvm::StringError>(
1163 "error occurred; unable to convert to APSInt",
1164 llvm::inconvertibleErrorCode());
1169 return llvm::make_error<llvm::StringError>(
1170 "type cannot be converted to APFloat", llvm::inconvertibleErrorCode());
1178 return llvm::make_error<llvm::StringError>(
1179 "error occurred; unable to convert to APFloat",
1180 llvm::inconvertibleErrorCode());
1189 return value_or_err->getBoolValue();
1194 return value_or_err->isNonZero();
1199 return llvm::make_error<llvm::StringError>(
"type cannot be converted to bool",
1200 llvm::inconvertibleErrorCode());
1218 "current value object is not a temporary object");
1224 uint64_t byte_size = 0;
1227 byte_size = temp.value();
1228 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1230 "illegal argument: new value should be of the same size");
1235 data_sp->SetData(value.getRawData(), byte_size,
1236 target->GetArchitecture().GetByteOrder());
1237 data_sp->SetAddressByteSize(
1238 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1258 "current value object is not a temporary object");
1263 CompilerType new_val_type = new_val_sp->GetCompilerType();
1267 "illegal argument: new value should be of the same size");
1272 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1277 }
else if (new_val_type.
IsFloat()) {
1278 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1284 bool success =
true;
1285 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1288 uint64_t num_bits = 0;
1289 if (
auto temp = llvm::expectedToOptional(
1290 new_val_sp->GetCompilerType().GetBitSize(target.get())))
1291 num_bits = temp.value();
1305 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1312 if (flags.
Test(eTypeIsArray)) {
1338 bool do_dump_error) {
1351 bool allow_special =
1353 const bool only_special =
false;
1355 if (allow_special) {
1356 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1369 std::pair<size_t, bool> read_string =
1373 lldb_private::formatters::StringPrinter::
1374 ReadBufferAndDumpToStreamOptions options(*
this);
1378 options.SetStream(&s);
1379 options.SetPrefixToken(
nullptr);
1380 options.SetQuote(
'"');
1381 options.SetSourceSize(buffer_sp->GetByteSize());
1382 options.SetIsTruncated(read_string.second);
1385 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1387 return !
error.Fail();
1395 if (flags.
Test(eTypeIsArray)) {
1401 for (
size_t low = 0; low < count; low++) {
1408 s <<
"<invalid child>";
1411 child->DumpPrintableRepresentation(
1442 for (
size_t low = 0; low < count; low++) {
1449 s <<
"<invalid child>";
1452 child->DumpPrintableRepresentation(
1485 bool var_success =
false;
1488 llvm::StringRef str;
1499 switch (val_obj_display) {
1511 strm <<
"error: " <<
toString(desc.takeError());
1525 strm.
Printf(
"%" PRIu32, *err);
1528 strm <<
"error: " <<
toString(err.takeError());
1577 else if (val_obj_display ==
1579 s.
PutCString(
"<not a valid Objective-C object>");
1584 s.
PutCString(
"<no printable representation>");
1608 switch (
m_value.GetValueType()) {
1612 if (scalar_is_load_address) {
1621 m_value.GetValueAddressType()};
1625 llvm_unreachable(
"Unhandled value type!");
1632 switch (
m_value.GetValueType()) {
1647 llvm_unreachable(
"Unhandled value type!");
1651 const char *value_str) {
1653 if (
auto boolean = language->GetBooleanFromString(value_str))
1654 return *
boolean ?
"1" :
"0";
1656 return llvm::StringSwitch<const char *>(value_str)
1659 .Default(value_str);
1673 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
1679 m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1680 }
else if (byte_size <= 16) {
1689 if (
error.Success()) {
1690 switch (value_type) {
1701 target_addr, new_scalar, byte_size,
error);
1702 if (!
error.Success())
1704 if (bytes_written != byte_size) {
1717 m_data.SetData(buffer_sp, 0);
1718 bool success = new_scalar.
GetData(new_data);
1721 0, byte_size,
const_cast<uint8_t *
>(
m_data.GetDataStart()),
1722 byte_size,
m_data.GetByteOrder());
1760 std::map<ConstString, ValueObject *>::const_iterator pos =
1763 synthetic_child_sp = pos->second->GetSP();
1764 return synthetic_child_sp;
1787 if (runtime->IsAllowedRuntimeValue(
GetName()))
1795 return language->IsNilReference(*
this);
1802 return language->IsUninitializedReference(*
this);
1820 std::string index_str = llvm::formatv(
"[{0}]", index);
1825 if (!synthetic_child_sp) {
1832 if (synthetic_child) {
1834 synthetic_child_sp = synthetic_child->
GetSP();
1835 synthetic_child_sp->SetName(
ConstString(index_str));
1836 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1840 return synthetic_child_sp;
1847 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1852 if (!synthetic_child_sp) {
1853 uint32_t bit_field_size = to - from + 1;
1854 uint32_t bit_field_offset = from;
1857 llvm::expectedToOptional(
GetByteSize()).value_or(0) * 8 -
1858 bit_field_size - bit_field_offset;
1863 llvm::expectedToOptional(
GetByteSize()).value_or(0), 0,
1868 if (synthetic_child) {
1870 synthetic_child_sp = synthetic_child->
GetSP();
1871 synthetic_child_sp->SetName(
ConstString(index_str));
1872 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1876 return synthetic_child_sp;
1880 uint32_t offset,
const CompilerType &type,
bool can_create,
1885 if (name_const_str.
IsEmpty()) {
1886 name_const_str.
SetString(
"@" + std::to_string(offset));
1893 if (synthetic_child_sp.get())
1894 return synthetic_child_sp;
1900 std::optional<uint64_t> size = llvm::expectedToOptional(
1907 if (synthetic_child) {
1909 synthetic_child_sp = synthetic_child->
GetSP();
1910 synthetic_child_sp->SetName(name_const_str);
1911 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1913 return synthetic_child_sp;
1922 if (name_const_str.
IsEmpty()) {
1924 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1933 if (synthetic_child_sp.get())
1934 return synthetic_child_sp;
1939 const bool is_base_class =
true;
1942 std::optional<uint64_t> size = llvm::expectedToOptional(
1949 if (synthetic_child) {
1951 synthetic_child_sp = synthetic_child->
GetSP();
1952 synthetic_child_sp->SetName(name_const_str);
1954 return synthetic_child_sp;
1962 if (!expression || !expression[0])
1964 if (expression[0] ==
'.')
1965 return expression + 1;
1966 if (expression[0] ==
'-' && expression[1] ==
'>')
1967 return expression + 2;
1979 if (!synthetic_child_sp) {
1983 expression,
nullptr,
nullptr,
1989 if (synthetic_child_sp.get()) {
1993 synthetic_child_sp->SetName(
1997 return synthetic_child_sp;
2002 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2099 if (
m_flags.m_is_synthetic_children_generated) {
2108 uint64_t load_addr =
2129 if (is_deref_of_parent &&
2161 if (
m_flags.m_is_array_item_for_pointer &&
2166 if (!is_deref_of_parent) {
2168 if (non_base_class_parent &&
2172 if (non_base_class_parent_compiler_type) {
2177 const uint32_t non_base_class_parent_type_info =
2178 non_base_class_parent_compiler_type.
GetTypeInfo();
2180 if (non_base_class_parent_type_info & eTypeIsPointer) {
2182 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2183 !(non_base_class_parent_type_info & eTypeIsArray)) {
2196 if (is_deref_of_parent &&
2208 using SynthTraversal =
2212 if (synth_traversal == SynthTraversal::FromSynthetic ||
2213 synth_traversal == SynthTraversal::Both)
2216 if (synth_traversal == SynthTraversal::ToSynthetic ||
2217 synth_traversal == SynthTraversal::Both)
2232 if (!result ||
error.Fail()) {
2235 result = alt_obj->Dereference(
error);
2255 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2256 final_value_type ? final_value_type : &dummy_final_value_type, options,
2257 final_task_on_target ? final_task_on_target
2258 : &dummy_final_task_on_target);
2260 if (!final_task_on_target ||
2264 if (ret_val.get() &&
2265 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2269 if ((final_task_on_target ? *final_task_on_target
2270 : dummy_final_task_on_target) ==
2275 if (
error.Fail() || !final_value.get()) {
2279 if (final_value_type)
2283 if (final_task_on_target)
2288 if (*final_task_on_target ==
2292 if (
error.Fail() || !final_value.get()) {
2296 if (final_value_type)
2300 if (final_task_on_target)
2320 llvm::StringRef remainder = expression;
2323 llvm::StringRef temp_expression = remainder;
2325 CompilerType root_compiler_type = root->GetCompilerType();
2327 Flags pointee_compiler_type_info;
2329 Flags root_compiler_type_info(
2330 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2331 if (pointee_compiler_type)
2334 if (temp_expression.empty()) {
2339 switch (temp_expression.front()) {
2341 temp_expression = temp_expression.drop_front();
2343 root_compiler_type_info.
Test(eTypeIsPointer))
2353 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2356 root_compiler_type_info.
Test(eTypeIsPointer) &&
2363 if (!temp_expression.starts_with(
">")) {
2374 temp_expression.front() ==
'.' &&
2375 root_compiler_type_info.
Test(eTypeIsPointer))
2385 temp_expression = temp_expression.drop_front();
2387 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2388 if (next_sep_pos == llvm::StringRef::npos) {
2390 llvm::StringRef child_name = temp_expression;
2392 root->GetChildMemberWithName(child_name);
2393 if (!child_valobj_sp) {
2396 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2398 if (child_valobj_sp) {
2402 return child_valobj_sp;
2409 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2410 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2412 ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name);
2413 if (!child_valobj_sp) {
2416 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2418 if (child_valobj_sp) {
2419 root = child_valobj_sp;
2420 remainder = next_separator;
2429 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2430 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2431 !root_compiler_type_info.
Test(
2434 if (!root_compiler_type_info.
Test(
2456 if (temp_expression[1] ==
2459 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2475 size_t close_bracket_position = temp_expression.find(
']', 1);
2476 if (close_bracket_position ==
2477 llvm::StringRef::npos)
2485 llvm::StringRef bracket_expr =
2486 temp_expression.slice(1, close_bracket_position);
2490 assert(!bracket_expr.empty());
2492 if (!bracket_expr.contains(
'-')) {
2496 unsigned long index = 0;
2497 if (bracket_expr.getAsInteger(0, index)) {
2505 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2506 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2507 if (!child_valobj_sp)
2508 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2509 if (!child_valobj_sp)
2510 if (root->HasSyntheticValue() &&
2511 llvm::expectedToStdOptional(
2512 root->GetSyntheticValue()->GetNumChildren())
2513 .value_or(0) > index)
2515 root->GetSyntheticValue()->GetChildAtIndex(index);
2516 if (child_valobj_sp) {
2517 root = child_valobj_sp;
2519 temp_expression.substr(close_bracket_position + 1);
2528 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2540 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2544 if (
error.Fail() || !root) {
2554 if (root->GetCompilerType().GetMinimumLanguage() ==
2556 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2557 root->HasSyntheticValue() &&
2560 SyntheticChildrenTraversal::ToSynthetic ||
2563 SyntheticChildrenTraversal::Both)) {
2564 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2566 root = root->GetSyntheticArrayMember(index,
true);
2574 temp_expression.substr(close_bracket_position + 1);
2579 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2580 root = root->GetSyntheticBitFieldChild(index, index,
true);
2589 *reason_to_stop = ValueObject::
2590 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2594 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2595 root = root->GetChildAtIndex(index);
2603 temp_expression.substr(close_bracket_position + 1);
2609 SyntheticChildrenTraversal::ToSynthetic ||
2612 SyntheticChildrenTraversal::Both) {
2613 if (root->HasSyntheticValue())
2614 root = root->GetSyntheticValue();
2615 else if (!root->IsSynthetic()) {
2630 root = root->GetChildAtIndex(index);
2638 temp_expression.substr(close_bracket_position + 1);
2650 llvm::StringRef sleft, sright;
2651 unsigned long low_index, high_index;
2652 std::tie(sleft, sright) = bracket_expr.split(
'-');
2653 if (sleft.getAsInteger(0, low_index) ||
2654 sright.getAsInteger(0, high_index)) {
2661 if (low_index > high_index)
2662 std::swap(low_index, high_index);
2664 if (root_compiler_type_info.
Test(
2667 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2674 *reason_to_stop = ValueObject::
2675 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2679 }
else if (root_compiler_type_info.
Test(
2686 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2690 if (
error.Fail() || !root) {
2773 result_sp =
GetSP();
2776 bool is_synthetic = result_sp->IsSynthetic();
2777 if (synthValue && !is_synthetic) {
2778 if (
auto synth_sp = result_sp->GetSyntheticValue())
2781 if (!synthValue && is_synthetic) {
2782 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2783 return non_synth_sp;
2793 std::string deref_name_str;
2794 uint32_t deref_byte_size = 0;
2795 int32_t deref_byte_offset = 0;
2797 uint64_t language_flags = 0;
2803 &exe_ctx, deref_name_str, deref_byte_size, deref_byte_offset,
this,
2806 std::string deref_error;
2807 if (deref_compiler_type_or_err) {
2808 deref_compiler_type = *deref_compiler_type_or_err;
2810 deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
2814 if (deref_compiler_type && deref_byte_size) {
2816 if (!deref_name_str.empty())
2817 deref_name.
SetCString(deref_name_str.c_str());
2821 deref_byte_size, deref_byte_offset, 0, 0,
false,
2834 if (deref_compiler_type) {
2836 if (!deref_name_str.empty())
2837 deref_name.
SetCString(deref_name_str.c_str());
2840 *
this, deref_compiler_type, deref_name, deref_byte_size,
2857 if (deref_error.empty())
2859 "dereference failed: (%s) %s",
2863 "dereference failed: %s: (%s) %s", deref_error.c_str(),
2876 switch (address_type) {
2887 if (compiler_type) {
2888 std::string name(1,
'&');
2889 name.append(
m_name.AsCString(
""));
2907 "'%s' doesn't have a valid address", expr_path_strm.
GetData());
2937 if (llvm::expectedToOptional(compiler_type.
GetByteSize(exe_scope))
2942 return DoCast(compiler_type);
2945 "Can only cast to a type that is equal to or smaller "
2946 "than the orignal type.");
2986 const bool scalar_is_load_address =
true;
2987 auto [addr_value, addr_type] =
GetAddressOf(scalar_is_load_address);
2994 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3006 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3011 return llvm::make_error<llvm::StringError>(
3012 "Invalid target type: should be a pointer or a reference",
3013 llvm::inconvertibleErrorCode());
3019 auto target_record_type =
3021 auto start_record_type =
3024 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3025 return llvm::make_error<llvm::StringError>(
3026 "Underlying start & target types should be record types",
3027 llvm::inconvertibleErrorCode());
3029 if (target_record_type.CompareTypes(start_record_type))
3030 return llvm::make_error<llvm::StringError>(
3031 "Underlying start & target types should be different",
3032 llvm::inconvertibleErrorCode());
3034 if (base_type_indices.empty())
3035 return llvm::make_error<llvm::StringError>(
3036 "Children sequence must be non-empty", llvm::inconvertibleErrorCode());
3045 for (
const uint32_t i : base_type_indices)
3048 inner_value->GetChildAtIndex(i,
true);
3052 CompilerType inner_value_type = inner_value->GetCompilerType();
3055 return llvm::make_error<llvm::StringError>(
3056 "casted value doesn't match the desired type",
3057 llvm::inconvertibleErrorCode());
3059 uintptr_t addr = inner_value->GetLoadAddress();
3060 llvm::StringRef name =
"";
3068 return llvm::make_error<llvm::StringError>(
3069 "casted value doesn't match the desired type",
3070 llvm::inconvertibleErrorCode());
3075llvm::Expected<lldb::ValueObjectSP>
3081 return llvm::make_error<llvm::StringError>(
3082 "Invalid target type: should be a pointer or a reference",
3083 llvm::inconvertibleErrorCode());
3089 auto target_record_type =
3091 auto start_record_type =
3094 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3095 return llvm::make_error<llvm::StringError>(
3096 "Underlying start & target types should be record types",
3097 llvm::inconvertibleErrorCode());
3099 if (target_record_type.CompareTypes(start_record_type))
3100 return llvm::make_error<llvm::StringError>(
3101 "Underlying start & target types should be different",
3102 llvm::inconvertibleErrorCode());
3105 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3107 return llvm::make_error<llvm::StringError>(
3108 "virtual base should be valid", llvm::inconvertibleErrorCode());
3109 return llvm::make_error<llvm::StringError>(
3113 llvm::inconvertibleErrorCode());
3126 llvm::StringRef name =
"";
3129 name, addr - offset, exe_ctx, pointer_type,
false);
3137 return value->Dereference(
error);
3154 if (!is_scalar && !is_enum && !is_pointer)
3160 uint64_t type_byte_size = 0;
3161 uint64_t val_byte_size = 0;
3162 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3163 type_byte_size = temp.value();
3166 val_byte_size = temp.value();
3173 if (!type.
IsBoolean() && type_byte_size < val_byte_size)
3177 "target type cannot be smaller than the pointer type"));
3181 if (!is_scalar || is_integer)
3184 else if (is_scalar && is_float) {
3186 if (float_value_or_err)
3188 target, !float_value_or_err->isZero(),
"result");
3193 "cannot get value as APFloat: %s",
3194 llvm::toString(float_value_or_err.takeError()).c_str()));
3199 if (!is_scalar || is_integer) {
3201 if (int_value_or_err) {
3205 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3212 "cannot get value as APSInt: %s",
3213 llvm::toString(int_value_or_err.takeError()).c_str()));
3214 }
else if (is_scalar && is_float) {
3218 if (float_value_or_err) {
3219 llvm::APFloatBase::opStatus status =
3220 float_value_or_err->convertToInteger(
3221 integer, llvm::APFloat::rmTowardZero, &is_exact);
3225 if (status & llvm::APFloatBase::opInvalidOp)
3229 "invalid type cast detected: %s",
3230 llvm::toString(float_value_or_err.takeError()).c_str()));
3240 if (int_value_or_err) {
3242 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3252 "cannot get value as APSInt: %s",
3253 llvm::toString(int_value_or_err.takeError()).c_str()));
3258 if (int_value_or_err) {
3259 Scalar scalar_int(*int_value_or_err);
3268 "cannot get value as APSInt: %s",
3269 llvm::toString(int_value_or_err.takeError()).c_str()));
3274 if (float_value_or_err) {
3275 Scalar scalar_float(*float_value_or_err);
3284 "cannot get value as APFloat: %s",
3285 llvm::toString(float_value_or_err.takeError()).c_str()));
3302 if (!is_enum && !is_integer && !is_float)
3306 "argument must be an integer, a float, or an enum"));
3314 uint64_t byte_size = 0;
3315 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3316 byte_size = temp.value();
3323 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3324 integer, llvm::APFloat::rmTowardZero, &is_exact);
3328 if (status & llvm::APFloatBase::opInvalidOp)
3332 "invalid type cast detected: %s",
3333 llvm::toString(value_or_err.takeError()).c_str()));
3344 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3351 "cannot get value as APSInt: %s",
3352 llvm::toString(value_or_err.takeError()).c_str()));
3370 process_sp = target_sp->GetProcessSP();
3380 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3413 bool accept_invalid_exe_ctx) {
3416 const bool thread_and_frame_only_if_stopped =
true;
3425 if (process ==
nullptr)
3437 bool changed =
false;
3438 const bool was_valid =
m_mod_id.IsValid();
3456 if (!accept_invalid_exe_ctx) {
3465 changed = was_valid;
3471 changed = was_valid;
3512 if (!
m_parent->IsPointerOrReferenceType())
3513 return m_parent->GetSymbolContextScope();
3520 llvm::StringRef expression,
3527 llvm::StringRef name, llvm::StringRef expression,
3533 if (expression.empty())
3535 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3536 retval_sp, options);
3537 if (retval_sp && !name.empty())
3548 pointer_type = type;
3556 if (ptr_result_valobj_sp) {
3558 ptr_result_valobj_sp->GetValue().SetValueType(
3562 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3563 if (ptr_result_valobj_sp && !name.empty())
3566 return ptr_result_valobj_sp;
3580 if (new_value_sp && !name.empty())
3582 return new_value_sp;
3588 llvm::StringRef name) {
3590 uint64_t byte_size = 0;
3591 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3592 byte_size = temp.value();
3594 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3601 llvm::StringRef name) {
3614 llvm::StringRef name) {
3617 for (
auto type_system_sp : target->GetScratchTypeSystems())
3618 if (
auto compiler_type =
3620 target_type = compiler_type;
3625 uint64_t byte_size = 0;
3627 llvm::expectedToOptional(target_type.
GetByteSize(target.get())))
3628 byte_size = temp.value();
3630 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3644 uint64_t byte_size = 0;
3645 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3646 byte_size = temp.value();
3648 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3690 while (with_dv_info) {
3693 with_dv_info = with_dv_info->
m_parent;
3700 while (with_fmt_info) {
3703 with_fmt_info = with_fmt_info->
m_parent;
3715 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3717 type = cu->GetLanguage();
3749 target_sp->GetPersistentExpressionStateForLanguage(
3752 if (!persistent_state)
3762 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3765 return persistent_var_sp->GetValueObject();
3777 if ((
m_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
3811 return target_sp && target_sp->IsValid();
3816 std::unique_lock<std::recursive_mutex> &lock,
Status &
error) {
3824 Target *target = value_sp->GetTargetSP().get();
3826 if (value_sp->GetError().Fail())
3832 lock = std::unique_lock<std::recursive_mutex>(target->
GetAPIMutex());
3834 ProcessSP process_sp(value_sp->GetProcessSP());
3835 if (process_sp && !stop_locker.
TryLock(&process_sp->GetRunLock())) {
3846 value_sp = dynamic_sp;
3852 value_sp = synthetic_sp;
3858 value_sp->SetName(
m_name);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERRORV(log, error,...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static user_id_t g_value_obj_uid
static const char * ConvertBoolean(lldb::LanguageType language_type, const char *value_str)
static bool CopyStringDataToBufferSP(const StreamString &source, lldb::WritableDataBufferSP &destination)
static ValueObjectSP DereferenceValueOrAlternate(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal, Status &error)
static ValueObjectSP GetAlternateValue(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal)
static const char * SkipLeadingExpressionPathSeparators(const char *expression)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A class that describes a compilation unit.
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
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
size_t GetIndexOfChildMemberWithName(llvm::StringRef name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) const
Lookup a child member given a name.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
lldb::Encoding GetEncoding() const
CompilerType GetNonReferenceType() const
If this type is a reference to a type (L value or R value reference), return a new type with the refe...
ConstString GetTypeName(bool BaseOnly=false) const
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
std::string TypeDescription()
bool IsInteger() const
This is used when you don't care about the signedness of the integer.
llvm::Expected< CompilerType > GetDereferencedType(ExecutionContext *exe_ctx, std::string &deref_name, uint32_t &deref_byte_size, int32_t &deref_byte_offset, ValueObject *valobj, uint64_t &language_flags) const
lldb::Format GetFormat() const
llvm::Expected< CompilerType > GetChildCompilerTypeAtIndex(ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool IsUnscopedEnumerationType() const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
llvm::Expected< uint32_t > GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const
Lookup a child given a name.
bool CompareTypes(CompilerType rhs) const
bool IsScalarType() const
bool IsNullPtrType() const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
void SetCString(const char *cstr)
Set the C string value.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
void SetString(llvm::StringRef s)
const char * GetCString() const
Get the string value as a C string.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t SetByteSize(lldb::offset_t byte_size)
Set the number of bytes in the data buffer.
void CopyData(const void *src, lldb::offset_t src_len)
Makes a copy of the src_len bytes in src.
static lldb::TypeSummaryImplSP GetSummaryFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static lldb::TypeFormatImplSP GetFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static lldb::SyntheticChildrenSP GetSyntheticChildren(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static uint32_t GetCurrentRevision()
A class that describes the declaration location of a lldb object.
void Clear()
Clear the object's state.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
virtual lldb::TargetSP CalculateTarget()=0
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
uint32_t GetAddressByteSize() const
const lldb::ProcessSP & GetProcessSP() const
Get accessor to get the process shared pointer.
lldb::ByteOrder GetByteOrder() const
const lldb::StackFrameSP & GetFrameSP() const
Get accessor to get the frame shared pointer.
Target * GetTargetPtr() const
Returns a pointer to the target object.
const lldb::ThreadSP & GetThreadSP() const
Get accessor to get the thread shared pointer.
Process * GetProcessPtr() const
Returns a pointer to the process object.
@ EVIsProgramReference
This variable is a reference to a (possibly invalid) area managed by the target program.
bool AllClear(ValueType mask) const
Test if all bits in mask are clear.
void Reset(ValueType flags)
Set accessor for all flags.
bool Test(ValueType bit) const
Test a single flag bit.
bool AnySet(ValueType mask) const
Test one or more flags.
static Language * FindPlugin(lldb::LanguageType language)
static bool LanguageIsCFamily(lldb::LanguageType language)
Equivalent to LanguageIsC||LanguageIsObjC||LanguageIsCPlusPlus.
static bool LanguageIsObjC(lldb::LanguageType language)
virtual lldb::ExpressionVariableSP CreatePersistentVariable(const lldb::ValueObjectSP &valobj_sp)=0
virtual ConstString GetNextPersistentVariableName(bool is_error=false)=0
Return a new persistent variable name with the specified prefix.
uint32_t GetStopID() const
bool TryLock(ProcessRunLock *lock)
A plug-in interface definition class for debugging a process.
ProcessModID GetModID() const
Get the Modification ID of the process.
ProcessRunLock::ProcessRunLocker StopLocker
bool IsPossibleDynamicValue(ValueObject &in_value)
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
size_t WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Write memory to a process.
size_t WriteScalarToMemory(lldb::addr_t vm_addr, const Scalar &scalar, size_t size, Status &error)
Write all or part of a scalar value to memory.
llvm::APFloat CreateAPFloatFromAPFloat(lldb::BasicType basic_type)
llvm::APFloat CreateAPFloatFromAPSInt(lldb::BasicType basic_type)
unsigned long long ULongLong(unsigned long long fail_value=0) const
llvm::APFloat GetAPFloat() const
long long SLongLong(long long fail_value=0) const
bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset)
Status SetValueFromCString(const char *s, lldb::Encoding encoding, size_t byte_size)
bool GetData(DataExtractor &data) const
Get data with a byte size of GetByteSize().
llvm::APSInt GetAPSInt() const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
bool Success() const
Test for success condition.
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Basic RAII class to increment the summary count when the call is complete.
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
Defines a symbol context baton that can be handed other debug core functions.
CompileUnit * comp_unit
The CompileUnit for a given query.
uint32_t GetMaximumSizeOfStringSummary() const
std::recursive_mutex & GetAPIMutex()
virtual size_t ReadMemory(const Address &addr, void *dst, size_t dst_len, Status &error, bool force_live_memory=false, lldb::addr_t *load_addr_ptr=nullptr, bool *did_read_live_memory=nullptr)
virtual bool FormatObject(ValueObject *valobj, std::string &dest, const TypeSummaryOptions &options)=0
lldb::LanguageType GetLanguage() const
TypeSummaryOptions & SetLanguage(lldb::LanguageType)
lldb::ValueObjectSP m_valobj_sp
lldb::DynamicValueType m_use_dynamic
lldb::ValueObjectSP GetSP(Process::StopLocker &stop_locker, std::unique_lock< std::recursive_mutex > &lock, Status &error)
ValueImpl & operator=(const ValueImpl &rhs)
static lldb::ValueObjectSP Create(ValueObject &parent, ConstString name, const CompilerType &cast_type)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size, lldb::addr_t address=LLDB_INVALID_ADDRESS)
A ValueObject that represents memory at a given address, viewed as some set lldb type.
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, llvm::StringRef name, const Address &address, lldb::TypeSP &type_sp)
llvm::Error PrintValueObject()
static lldb::ValueObjectSP Create(ValueObject &parent)
bool SyncWithProcessState(bool accept_invalid_exe_ctx)
ExecutionContextRef m_exe_ctx_ref
AddressType m_address_type_of_ptr_or_ref_children
void SetValueIsValid(bool valid)
EvaluationPoint m_update_point
Stores both the stop id and the full context at which this value was last updated.
lldb::TypeSummaryImplSP GetSummaryFormat()
llvm::SmallVector< uint8_t, 16 > m_value_checksum
llvm::Expected< llvm::APFloat > GetValueAsAPFloat()
If the current ValueObject is of an appropriate type, convert the value to an APFloat and return that...
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.
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 llvm::Expected< size_t > GetIndexOfChildWithName(llvm::StringRef name)
virtual ValueObject * CreateSyntheticArrayMember(size_t idx)
Should only be called by ValueObject::GetSyntheticArrayMember().
void SetValueFormat(lldb::TypeFormatImplSP format)
virtual void CalculateSyntheticValue()
void SetPreferredDisplayLanguage(lldb::LanguageType lt)
struct lldb_private::ValueObject::Bitflags m_flags
ClusterManager< ValueObject > ValueObjectManager
ValueObject(ExecutionContextScope *exe_scope, ValueObjectManager &manager, AddressType child_ptr_or_ref_addr_type=eAddressTypeLoad)
Use this constructor to create a "root variable object".
std::string m_summary_str
Cached summary string that will get cleared if/when the value is updated.
virtual lldb::ValueObjectSP DoCast(const CompilerType &compiler_type)
lldb::ValueObjectSP GetSP()
ChildrenManager m_children
virtual lldb::ValueObjectSP CastPointerType(const char *name, CompilerType &ast_type)
Status m_error
An error object that can describe any errors that occur when updating values.
virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx=0, uint32_t item_count=1)
lldb::ValueObjectSP GetSyntheticValue()
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.
@ eExpressionPathScanEndReasonRangeOperatorNotAllowed
[] not allowed by options.
@ eExpressionPathScanEndReasonEmptyRangeNotAllowed
[] only allowed for arrays.
@ eExpressionPathScanEndReasonRangeOperatorInvalid
[] not valid on objects other than scalars, pointers or arrays.
@ eExpressionPathScanEndReasonUnexpectedSymbol
Something is malformed in he expression.
@ eExpressionPathScanEndReasonArrayRangeOperatorMet
[] is good for arrays, but I cannot parse it.
@ eExpressionPathScanEndReasonSyntheticValueMissing
getting the synthetic children failed.
@ eExpressionPathScanEndReasonTakingAddressFailed
Impossible to apply & operator.
@ eExpressionPathScanEndReasonFragileIVarNotAllowed
ObjC ivar expansion not allowed.
virtual bool UpdateValue()=0
lldb::Format GetFormat() const
virtual lldb::VariableSP GetVariable()
@ eExpressionPathAftermathNothing
Just return it.
@ eExpressionPathAftermathDereference
Dereference the target.
@ eExpressionPathAftermathTakeAddress
Take target's address.
lldb::ValueObjectSP CastToBasicType(CompilerType type)
ValueObject * GetNonBaseClassParent()
virtual ValueObject * CreateChildAtIndex(size_t idx)
Should only be called by ValueObject::GetChildAtIndex().
lldb::ValueObjectSP GetValueForExpressionPath(llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop=nullptr, ExpressionPathEndResultType *final_value_type=nullptr, const GetValueForExpressionPathOptions &options=GetValueForExpressionPathOptions::DefaultOptions(), ExpressionPathAftermath *final_task_on_target=nullptr)
virtual lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic)
bool IsPossibleDynamicType()
DataExtractor m_data
A data extractor that can be used to extract the value.
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type, bool do_deref=true)
Given an address either create a value object containing the value at that address,...
virtual llvm::Expected< uint64_t > GetByteSize()=0
virtual CompilerType GetCompilerTypeImpl()=0
virtual lldb::ValueObjectSP GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
@ eGetExpressionPathFormatDereferencePointers
@ eGetExpressionPathFormatHonorPointers
virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create=true)
lldb::ValueObjectSP CastToEnumType(CompilerType type)
llvm::Expected< uint32_t > GetNumChildren(uint32_t max=UINT32_MAX)
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
ValueObjectManager * GetManager()
ValueObject * m_root
The root of the hierarchy for this ValueObject (or nullptr if never calculated).
lldb::addr_t GetLoadAddress()
Return the target load address associated with this value object.
bool GetValueIsValid() const
virtual lldb::ModuleSP GetModule()
Return the module associated with this value object in case the value is from an executable file and ...
static lldb::ValueObjectSP CreateValueObjectFromScalar(lldb::TargetSP target, Scalar &s, CompilerType type, llvm::StringRef name)
Create a value object containing the given Scalar value.
virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType)
void UpdateChildrenAddressType()
llvm::Expected< lldb::ValueObjectSP > CastDerivedToBaseType(CompilerType type, const llvm::ArrayRef< uint32_t > &base_type_indices)
Take a ValueObject whose type is an inherited class, and cast it to 'type', which should be one of it...
virtual lldb::ValueObjectSP AddressOf(Status &error)
lldb::DynamicValueType GetDynamicValueType()
llvm::Expected< lldb::ValueObjectSP > CastBaseToDerivedType(CompilerType type, uint64_t offset)
Take a ValueObject whose type is a base class, and cast it to 'type', which should be one of its deri...
lldb::LanguageType m_preferred_display_language
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr)
virtual llvm::Expected< uint32_t > CalculateNumChildren(uint32_t max=UINT32_MAX)=0
Should only be called by ValueObject::GetNumChildren().
lldb::LanguageType GetObjectRuntimeLanguage()
virtual lldb::ValueObjectSP CreateConstantValue(ConstString name)
virtual bool IsLogicalTrue(Status &error)
lldb::Format m_last_format
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()
AddrAndType GetPointerValue()
ConstString GetName() const
std::string m_location_str
Cached location string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetVTable()
If this object represents a C++ class with a vtable, return an object that represents the virtual fun...
virtual bool SetValueFromCString(const char *value_str, Status &error)
virtual lldb::ValueObjectSP GetStaticValue()
lldb::ValueObjectSP Persist()
std::string m_object_desc_str
Cached result of the "object printer".
virtual ValueObject * GetParent()
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.
virtual lldb::ValueObjectSP GetNonSyntheticValue()
lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression, bool can_create)
virtual bool SetData(DataExtractor &data, Status &error)
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
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
llvm::ArrayRef< uint8_t > GetLocalBuffer() const
Returns the local buffer that this ValueObject points to if it's available.
const ExecutionContextRef & GetExecutionContextRef() const
virtual AddrAndType GetAddressOf(bool scalar_is_load_address=true)
uint32_t GetNumChildrenIgnoringErrors(uint32_t max=UINT32_MAX)
Like GetNumChildren but returns 0 on error.
virtual bool CanProvideValue()
UserID m_id
Unique identifier for every value object.
const Value & GetValue() const
virtual lldb::LanguageType GetPreferredDisplayLanguage()
lldb::ValueObjectSP GetValueForExpressionPath_Impl(llvm::StringRef expression_cstr, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target)
const Scalar & GetScalar() const
See comment on m_scalar to understand what GetScalar returns.
Status GetValueAsData(ExecutionContext *exe_ctx, DataExtractor &data, Module *module)
RegisterInfo * GetRegisterInfo() const
ValueType
Type that describes Value::m_value.
@ HostAddress
A host address value (for memory in the process that < A is using liblldb).
@ FileAddress
A file address value.
@ LoadAddress
A load address value.
@ Scalar
A raw scalar value.
ValueType GetValueType() const
Scalar & ResolveValue(ExecutionContext *exe_ctx, Module *module=nullptr)
@ RegisterInfo
RegisterInfo * (can be a scalar or a vector register).
ContextType GetContextType() const
const CompilerType & GetCompilerType()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
@ DoNoSelectMostRelevantFrame
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< SummaryStatistics > SummaryStatisticsSP
@ eAddressTypeFile
Address is an address as found in an object or symbol file.
@ eAddressTypeLoad
Address is an address as in the current target inferior process.
@ eAddressTypeHost
Address is an address in the process that is running this code.
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.
@ eFormatFloat128
Disambiguate between 128-bit long double (which uses eFormatFloat) and __float128 (which uses eFormat...
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::Process > ProcessSP
Encoding
Register encoding definitions.
@ eEncodingVector
vector registers
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
const char * alt_name
Alternate name of this register, can be NULL.
const char * name
Name of this register, can't be NULL.
lldb::Format format
Default display format.
bool m_is_synthetic_children_generated
SyntheticChildrenTraversal m_synthetic_children_traversal
bool m_check_dot_vs_arrow_syntax
bool m_allow_bitfields_syntax
SyntheticChildrenTraversal