22#include "lldb/Host/Config.h"
53#include "llvm/Support/Compiler.h"
91 m_flags.m_is_synthetic_children_generated =
108 const ArchSpec &arch = target_sp->GetArchitecture();
121 bool did_change_formats =
false;
135 if (update_format && !did_change_formats)
149 m_flags.m_old_value_valid =
false;
151 m_flags.m_old_value_valid =
true;
166 bool need_compare_checksums =
false;
167 llvm::SmallVector<uint8_t, 16> old_checksum;
170 need_compare_checksums =
true;
173 old_checksum.begin());
182 const uint64_t max_checksum_size = 128;
185 need_compare_checksums =
false;
189 assert(!need_compare_checksums ||
194 else if (!
m_flags.m_value_did_change && !success) {
198 }
else if (need_compare_checksums) {
213 "[%s %p] checking for FormatManager revisions. ValueObject "
214 "rev: %d - Global rev: %d",
215 GetName().GetCString(),
static_cast<void *
>(
this),
219 bool any_change =
false;
243 m_flags.m_children_count_valid =
false;
244 m_flags.m_did_calculate_complete_objc_class_type =
false;
255 if (
m_flags.m_did_calculate_complete_objc_class_type) {
259 return compiler_type;
262 m_flags.m_did_calculate_complete_objc_class_type =
true;
268 return compiler_type;
272 if (std::optional<CompilerType> complete_type =
273 runtime->GetRuntimeType(compiler_type)) {
279 return compiler_type;
300 switch (value_type) {
326 sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
345 if (bitfield_bit_size)
356 LazyBool is_logical_true = language->IsLogicalTrue(*
this,
error);
357 switch (is_logical_true) {
360 return (is_logical_true ==
true);
386 if (can_create && !
m_children.HasChildAtIndex(idx)) {
393 if (child !=
nullptr)
394 return child->
GetSP();
401 if (names.size() == 0)
404 for (llvm::StringRef name : names) {
405 root = root->GetChildMemberWithName(name);
413llvm::Expected<size_t>
415 bool omit_empty_base_classes =
true;
417 omit_empty_base_classes);
429 std::vector<uint32_t> child_indexes;
430 bool omit_empty_base_classes =
true;
435 const size_t num_child_indexes =
437 name, omit_empty_base_classes, child_indexes);
438 if (num_child_indexes == 0)
442 for (uint32_t idx : child_indexes)
444 child_sp = child_sp->GetChildAtIndex(idx, can_create);
452 if (
m_flags.m_children_count_valid) {
453 size_t children_count =
m_children.GetChildrenCount();
454 return children_count <= max ? children_count : max;
459 if (!
m_flags.m_children_count_valid) {
461 if (num_children_or_err)
464 return num_children_or_err;
472 return *value_or_err;
479 bool has_children =
false;
482 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
492 m_flags.m_children_count_valid =
true;
497 bool omit_empty_base_classes =
true;
498 bool ignore_array_bounds =
false;
499 std::string child_name;
500 uint32_t child_byte_size = 0;
501 int32_t child_byte_offset = 0;
502 uint32_t child_bitfield_bit_size = 0;
503 uint32_t child_bitfield_bit_offset = 0;
504 bool child_is_base_class =
false;
505 bool child_is_deref_of_parent =
false;
506 uint64_t language_flags = 0;
507 const bool transparent_pointers =
true;
511 auto child_compiler_type_or_err =
513 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
514 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
515 child_bitfield_bit_size, child_bitfield_bit_offset,
516 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
517 if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
519 child_compiler_type_or_err.takeError(),
520 "could not find child: {0}");
525 *
this, *child_compiler_type_or_err,
ConstString(child_name),
526 child_byte_size, child_byte_offset, child_bitfield_bit_size,
527 child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
532 bool omit_empty_base_classes =
true;
533 bool ignore_array_bounds =
true;
534 std::string child_name;
535 uint32_t child_byte_size = 0;
536 int32_t child_byte_offset = 0;
537 uint32_t child_bitfield_bit_size = 0;
538 uint32_t child_bitfield_bit_offset = 0;
539 bool child_is_base_class =
false;
540 bool child_is_deref_of_parent =
false;
541 uint64_t language_flags = 0;
542 const bool transparent_pointers =
false;
546 auto child_compiler_type_or_err =
548 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
549 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
550 child_bitfield_bit_size, child_bitfield_bit_offset,
551 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
552 if (!child_compiler_type_or_err) {
554 child_compiler_type_or_err.takeError(),
555 "could not find child: {0}");
559 if (child_compiler_type_or_err->IsValid()) {
560 child_byte_offset += child_byte_size * idx;
563 *
this, *child_compiler_type_or_err,
ConstString(child_name),
564 child_byte_size, child_byte_offset, child_bitfield_bit_size,
565 child_bitfield_bit_offset, child_is_base_class,
572 return synth_valobj_sp->GetChildAtIndex(idx,
true).get();
578 std::string &destination,
585 std::string &destination,
593 destination =
"<incomplete type>";
599 if (
m_flags.m_is_getting_summary)
602 m_flags.m_is_getting_summary =
true;
626 target_sp->GetSummaryStatisticsCache()
627 .GetSummaryStatisticsForProvider(*summary_ptr);
631 summary_ptr->
FormatObject(
this, destination, actual_options);
633 summary_ptr->
FormatObject(
this, destination, actual_options);
635 m_flags.m_is_getting_summary =
false;
636 return !destination.empty();
659 bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
660 pointee_or_element_compiler_type.
IsCharType());
661 if (!is_char_arr_ptr)
665 if (type_flags.
Test(eTypeIsArray))
672 uint32_t item_count) {
674 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
675 const bool is_pointer_type = type_info & eTypeIsPointer;
676 const bool is_array_type = type_info & eTypeIsArray;
677 if (!(is_pointer_type || is_array_type))
685 std::optional<uint64_t> item_type_size =
686 llvm::expectedToOptional(pointee_or_element_compiler_type.
GetByteSize(
690 const uint64_t bytes = item_count * *item_type_size;
691 const uint64_t offset = item_idx * *item_type_size;
693 if (item_idx == 0 && item_count == 1)
695 if (is_pointer_type) {
698 if (
error.Fail() || pointee_sp.get() ==
nullptr)
700 return pointee_sp->GetData(data,
error);
703 if (child_sp.get() ==
nullptr)
706 return child_sp->GetData(data,
error);
716 auto [addr, addr_type] =
723 addr = addr + offset;
725 module_sp->ResolveFileAddress(addr, so_addr);
732 if (
error.Success()) {
746 target->ReadMemory(target_addr, heap_buf_ptr->
GetBytes(), bytes,
748 if (
error.Success() || bytes_read > 0) {
757 if (max_bytes && *max_bytes > offset) {
758 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
762 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
779 if (
m_data.GetByteSize()) {
803 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
807 switch (value_type) {
813 m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
817 "unable to set scalar value: %s", set_error.
AsCString());
830 if (!
error.Success())
832 if (bytes_written != byte_size) {
842 m_data.SetData(buffer_sp, 0);
844 const_cast<uint8_t *
>(
m_data.GetDataStart()),
845 byte_size,
m_data.GetByteOrder());
865 if ((uint64_t)
m_data.GetDataStart() == start)
868 if ((uint64_t)
m_value.GetBuffer().GetBytes() == start)
869 return m_value.GetBuffer().GetData();
876 llvm::StringRef src = source.
GetString();
877 src = src.rtrim(
'\0');
878 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
879 memcpy(destination->GetBytes(), src.data(), src.size());
883std::pair<size_t, bool>
886 bool was_capped =
false;
892 s <<
"<no target to read from>";
895 return {0, was_capped};
900 size_t bytes_read = 0;
901 size_t total_bytes_read = 0;
906 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
911 bool capped_data =
false;
912 const bool is_array = type_flags.
Test(eTypeIsArray);
915 uint64_t array_size = 0;
916 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
917 cstr_len = array_size;
918 if (cstr_len > max_length) {
920 cstr_len = max_length;
929 if (cstr_address.
address == 0 ||
933 if (cstr ==
nullptr) {
934 s <<
"<invalid address>";
937 return {0, was_capped};
939 s << llvm::StringRef(cstr, cstr_len);
941 return {cstr_len, was_capped};
943 s <<
"<invalid address>";
946 return {0, was_capped};
952 if (cstr_len > 0 && honor_array) {
960 total_bytes_read = bytes_read;
961 for (
size_t offset = 0; offset < bytes_read; offset++)
967 cstr_len = max_length;
968 const size_t k_max_buf_size = 64;
972 int cstr_len_displayed = -1;
973 bool capped_cstr =
false;
978 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
979 total_bytes_read += bytes_read;
980 const char *cstr = data.
PeekCStr(0);
981 size_t len = strnlen(cstr, k_max_buf_size);
982 if (cstr_len_displayed < 0)
983 cstr_len_displayed = len;
987 cstr_len_displayed += len;
988 if (len > bytes_read)
993 for (
size_t offset = 0; offset < bytes_read; offset++)
996 if (len < k_max_buf_size)
999 if (len >= cstr_len) {
1008 if (cstr_len_displayed >= 0) {
1015 s <<
"<not a string object>";
1018 return {total_bytes_read, was_capped};
1023 return llvm::createStringError(
"could not update value");
1032 return llvm::createStringError(
"no process");
1035 auto get_object_description =
1036 [&](
LanguageType language) -> llvm::Expected<std::string> {
1039 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1044 return llvm::createStringError(
"no native language runtime");
1049 llvm::Expected<std::string> desc = get_object_description(native_language);
1057 llvm::consumeError(desc.takeError());
1064 std::string &destination) {
1072 std::string &destination) {
1084 if (
m_flags.m_is_bitfield_for_scalar)
1090 my_format = reg_info->
format;
1100 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1161 return llvm::createStringError(
"type cannot be converted to APSInt");
1169 return llvm::createStringError(
"error occurred; unable to convert to APSInt");
1174 return llvm::createStringError(
"type cannot be converted to APFloat");
1182 return llvm::createStringError(
1183 "error occurred; unable to convert to APFloat");
1192 return value_or_err->getBoolValue();
1197 return value_or_err->isNonZero();
1202 return llvm::createStringError(
"type cannot be converted to bool");
1220 "current value object is not a temporary object");
1226 uint64_t byte_size = 0;
1229 byte_size = temp.value();
1230 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1232 "illegal argument: new value should be of the same size");
1237 reinterpret_cast<const void *
>(value.getRawData()), byte_size,
1238 target->GetArchitecture().GetByteOrder(),
1239 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1259 "current value object is not a temporary object");
1264 CompilerType new_val_type = new_val_sp->GetCompilerType();
1268 "illegal argument: new value should be of the same size");
1273 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1279 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1285 bool success =
true;
1286 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1289 uint64_t num_bits = 0;
1290 if (
auto temp = llvm::expectedToOptional(
1291 new_val_sp->GetCompilerType().GetBitSize(target.get())))
1292 num_bits = temp.value();
1306 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1313 if (flags.
Test(eTypeIsArray)) {
1339 bool do_dump_error) {
1352 bool allow_special =
1354 const bool only_special =
false;
1356 if (allow_special) {
1357 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1370 std::pair<size_t, bool> read_string =
1374 lldb_private::formatters::StringPrinter::
1375 ReadBufferAndDumpToStreamOptions options(*
this);
1379 options.SetStream(&s);
1380 options.SetPrefixToken(
nullptr);
1381 options.SetQuote(
'"');
1382 options.SetSourceSize(buffer_sp->GetByteSize());
1383 options.SetIsTruncated(read_string.second);
1386 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1388 return !
error.Fail();
1396 if (flags.
Test(eTypeIsArray)) {
1402 for (
size_t low = 0; low < count; low++) {
1409 s <<
"<invalid child>";
1412 child->DumpPrintableRepresentation(
1443 for (
size_t low = 0; low < count; low++) {
1450 s <<
"<invalid child>";
1453 child->DumpPrintableRepresentation(
1486 bool var_success =
false;
1489 llvm::StringRef str;
1500 switch (val_obj_display) {
1512 strm <<
"error: " <<
toString(desc.takeError());
1526 strm.
Printf(
"%" PRIu32, *err);
1529 strm <<
"error: " <<
toString(err.takeError());
1578 else if (val_obj_display ==
1580 s.
PutCString(
"<not a valid Objective-C object>");
1585 s.
PutCString(
"<no printable representation>");
1609 switch (
m_value.GetValueType()) {
1613 if (scalar_is_load_address) {
1622 m_value.GetValueAddressType()};
1626 llvm_unreachable(
"Unhandled value type!");
1633 switch (
m_value.GetValueType()) {
1648 llvm_unreachable(
"Unhandled value type!");
1652 const char *value_str) {
1654 if (
auto boolean = language->GetBooleanFromString(value_str))
1655 return *
boolean ?
"1" :
"0";
1657 return llvm::StringSwitch<const char *>(value_str)
1660 .Default(value_str);
1674 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
1680 m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1681 }
else if (byte_size <= 16) {
1690 if (
error.Success()) {
1691 switch (value_type) {
1702 target_addr, new_scalar, byte_size,
error);
1703 if (!
error.Success())
1705 if (bytes_written != byte_size) {
1718 m_data.SetData(buffer_sp, 0);
1719 bool success = new_scalar.
GetData(new_data);
1722 0, byte_size,
const_cast<uint8_t *
>(
m_data.GetDataStart()),
1723 byte_size,
m_data.GetByteOrder());
1761 std::map<ConstString, ValueObject *>::const_iterator pos =
1764 synthetic_child_sp = pos->second->GetSP();
1765 return synthetic_child_sp;
1788 if (runtime->IsAllowedRuntimeValue(
GetName()))
1796 return language->IsNilReference(*
this);
1803 return language->IsUninitializedReference(*
this);
1821 std::string index_str = llvm::formatv(
"[{0}]", index);
1826 if (!synthetic_child_sp) {
1833 if (synthetic_child) {
1835 synthetic_child_sp = synthetic_child->
GetSP();
1836 synthetic_child_sp->SetName(
ConstString(index_str));
1837 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1841 return synthetic_child_sp;
1848 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1853 if (!synthetic_child_sp) {
1854 uint32_t bit_field_size = to - from + 1;
1855 uint32_t bit_field_offset = from;
1858 llvm::expectedToOptional(
GetByteSize()).value_or(0) * 8 -
1859 bit_field_size - bit_field_offset;
1864 llvm::expectedToOptional(
GetByteSize()).value_or(0), 0,
1869 if (synthetic_child) {
1871 synthetic_child_sp = synthetic_child->
GetSP();
1872 synthetic_child_sp->SetName(
ConstString(index_str));
1873 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1877 return synthetic_child_sp;
1881 uint32_t offset,
const CompilerType &type,
bool can_create,
1886 if (name_const_str.
IsEmpty()) {
1887 name_const_str.
SetString(
"@" + std::to_string(offset));
1894 if (synthetic_child_sp.get())
1895 return synthetic_child_sp;
1901 std::optional<uint64_t> size = llvm::expectedToOptional(
1908 if (synthetic_child) {
1910 synthetic_child_sp = synthetic_child->
GetSP();
1911 synthetic_child_sp->SetName(name_const_str);
1912 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1914 return synthetic_child_sp;
1923 if (name_const_str.
IsEmpty()) {
1925 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1934 if (synthetic_child_sp.get())
1935 return synthetic_child_sp;
1940 const bool is_base_class =
true;
1943 std::optional<uint64_t> size = llvm::expectedToOptional(
1950 if (synthetic_child) {
1952 synthetic_child_sp = synthetic_child->
GetSP();
1953 synthetic_child_sp->SetName(name_const_str);
1955 return synthetic_child_sp;
1963 if (!expression || !expression[0])
1965 if (expression[0] ==
'.')
1966 return expression + 1;
1967 if (expression[0] ==
'-' && expression[1] ==
'>')
1968 return expression + 2;
1980 if (!synthetic_child_sp) {
1984 expression,
nullptr,
nullptr,
1990 if (synthetic_child_sp.get()) {
1994 synthetic_child_sp->SetName(
1998 return synthetic_child_sp;
2003 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2100 if (
m_flags.m_is_synthetic_children_generated) {
2109 uint64_t load_addr =
2130 if (is_deref_of_parent &&
2162 if (
m_flags.m_is_array_item_for_pointer &&
2167 if (!is_deref_of_parent) {
2169 if (non_base_class_parent &&
2173 if (non_base_class_parent_compiler_type) {
2178 const uint32_t non_base_class_parent_type_info =
2179 non_base_class_parent_compiler_type.
GetTypeInfo();
2181 if (non_base_class_parent_type_info & eTypeIsPointer) {
2183 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2184 !(non_base_class_parent_type_info & eTypeIsArray)) {
2197 if (is_deref_of_parent &&
2209 using SynthTraversal =
2213 if (synth_traversal == SynthTraversal::FromSynthetic ||
2214 synth_traversal == SynthTraversal::Both)
2217 if (synth_traversal == SynthTraversal::ToSynthetic ||
2218 synth_traversal == SynthTraversal::Both)
2233 if (!result ||
error.Fail()) {
2236 result = alt_obj->Dereference(
error);
2256 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2257 final_value_type ? final_value_type : &dummy_final_value_type, options,
2258 final_task_on_target ? final_task_on_target
2259 : &dummy_final_task_on_target);
2261 if (!final_task_on_target ||
2265 if (ret_val.get() &&
2266 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2270 if ((final_task_on_target ? *final_task_on_target
2271 : dummy_final_task_on_target) ==
2276 if (
error.Fail() || !final_value.get()) {
2280 if (final_value_type)
2284 if (final_task_on_target)
2289 if (*final_task_on_target ==
2293 if (
error.Fail() || !final_value.get()) {
2297 if (final_value_type)
2301 if (final_task_on_target)
2321 llvm::StringRef remainder = expression;
2324 llvm::StringRef temp_expression = remainder;
2326 CompilerType root_compiler_type = root->GetCompilerType();
2328 Flags pointee_compiler_type_info;
2330 Flags root_compiler_type_info(
2331 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2332 if (pointee_compiler_type)
2335 if (temp_expression.empty()) {
2340 switch (temp_expression.front()) {
2342 temp_expression = temp_expression.drop_front();
2344 root_compiler_type_info.
Test(eTypeIsPointer))
2354 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2357 root_compiler_type_info.
Test(eTypeIsPointer) &&
2364 if (!temp_expression.starts_with(
">")) {
2375 temp_expression.front() ==
'.' &&
2376 root_compiler_type_info.
Test(eTypeIsPointer))
2386 temp_expression = temp_expression.drop_front();
2388 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2389 if (next_sep_pos == llvm::StringRef::npos) {
2391 llvm::StringRef child_name = temp_expression;
2393 root->GetChildMemberWithName(child_name);
2394 if (!child_valobj_sp) {
2397 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2399 if (child_valobj_sp) {
2403 return child_valobj_sp;
2410 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2411 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2413 ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name);
2414 if (!child_valobj_sp) {
2417 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2419 if (child_valobj_sp) {
2420 root = child_valobj_sp;
2421 remainder = next_separator;
2430 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2431 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2432 !root_compiler_type_info.
Test(
2435 if (!root_compiler_type_info.
Test(
2457 if (temp_expression[1] ==
2460 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2476 size_t close_bracket_position = temp_expression.find(
']', 1);
2477 if (close_bracket_position ==
2478 llvm::StringRef::npos)
2486 llvm::StringRef bracket_expr =
2487 temp_expression.slice(1, close_bracket_position);
2491 assert(!bracket_expr.empty());
2493 if (!bracket_expr.contains(
'-')) {
2497 unsigned long index = 0;
2498 if (bracket_expr.getAsInteger(0, index)) {
2506 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2507 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2508 if (!child_valobj_sp)
2509 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2510 if (!child_valobj_sp)
2511 if (root->HasSyntheticValue() &&
2512 llvm::expectedToStdOptional(
2513 root->GetSyntheticValue()->GetNumChildren())
2514 .value_or(0) > index)
2516 root->GetSyntheticValue()->GetChildAtIndex(index);
2517 if (child_valobj_sp) {
2518 root = child_valobj_sp;
2520 temp_expression.substr(close_bracket_position + 1);
2529 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2541 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2545 if (
error.Fail() || !root) {
2555 if (root->GetCompilerType().GetMinimumLanguage() ==
2557 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2558 root->HasSyntheticValue() &&
2561 SyntheticChildrenTraversal::ToSynthetic ||
2564 SyntheticChildrenTraversal::Both)) {
2565 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2567 root = root->GetSyntheticArrayMember(index,
true);
2575 temp_expression.substr(close_bracket_position + 1);
2580 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2581 root = root->GetSyntheticBitFieldChild(index, index,
true);
2590 *reason_to_stop = ValueObject::
2591 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2595 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2596 root = root->GetChildAtIndex(index);
2604 temp_expression.substr(close_bracket_position + 1);
2610 SyntheticChildrenTraversal::ToSynthetic ||
2613 SyntheticChildrenTraversal::Both) {
2614 if (root->HasSyntheticValue())
2615 root = root->GetSyntheticValue();
2616 else if (!root->IsSynthetic()) {
2631 root = root->GetChildAtIndex(index);
2639 temp_expression.substr(close_bracket_position + 1);
2651 llvm::StringRef sleft, sright;
2652 unsigned long low_index, high_index;
2653 std::tie(sleft, sright) = bracket_expr.split(
'-');
2654 if (sleft.getAsInteger(0, low_index) ||
2655 sright.getAsInteger(0, high_index)) {
2662 if (low_index > high_index)
2663 std::swap(low_index, high_index);
2665 if (root_compiler_type_info.
Test(
2668 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2675 *reason_to_stop = ValueObject::
2676 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2680 }
else if (root_compiler_type_info.
Test(
2687 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2691 if (
error.Fail() || !root) {
2774 result_sp =
GetSP();
2777 bool is_synthetic = result_sp->IsSynthetic();
2778 if (synthValue && !is_synthetic) {
2779 if (
auto synth_sp = result_sp->GetSyntheticValue())
2782 if (!synthValue && is_synthetic) {
2783 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2784 return non_synth_sp;
2794 std::string deref_name_str;
2795 uint32_t deref_byte_size = 0;
2796 int32_t deref_byte_offset = 0;
2798 uint64_t language_flags = 0;
2804 &exe_ctx, deref_name_str, deref_byte_size, deref_byte_offset,
this,
2807 std::string deref_error;
2808 if (deref_compiler_type_or_err) {
2809 deref_compiler_type = *deref_compiler_type_or_err;
2811 deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
2815 if (deref_compiler_type && deref_byte_size) {
2817 if (!deref_name_str.empty())
2818 deref_name.
SetCString(deref_name_str.c_str());
2822 deref_byte_size, deref_byte_offset, 0, 0,
false,
2835 if (deref_compiler_type) {
2837 if (!deref_name_str.empty())
2838 deref_name.
SetCString(deref_name_str.c_str());
2841 *
this, deref_compiler_type, deref_name, deref_byte_size,
2858 if (deref_error.empty())
2860 "dereference failed: (%s) %s",
2864 "dereference failed: %s: (%s) %s", deref_error.c_str(),
2877 switch (address_type) {
2888 if (compiler_type) {
2889 std::string name(1,
'&');
2890 name.append(
m_name.AsCString(
""));
2908 "'%s' doesn't have a valid address", expr_path_strm.
GetData());
2938 if (llvm::expectedToOptional(compiler_type.
GetByteSize(exe_scope))
2943 return DoCast(compiler_type);
2946 "Can only cast to a type that is equal to or smaller "
2947 "than the orignal type.");
2987 const bool scalar_is_load_address =
true;
2988 auto [addr_value, addr_type] =
GetAddressOf(scalar_is_load_address);
2995 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3007 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3012 return llvm::createStringError(
3013 "Invalid target type: should be a pointer or a reference");
3019 auto target_record_type =
3021 auto start_record_type =
3024 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3025 return llvm::createStringError(
3026 "Underlying start & target types should be record types");
3028 if (target_record_type.CompareTypes(start_record_type))
3029 return llvm::createStringError(
3030 "Underlying start & target types should be different");
3032 if (base_type_indices.empty())
3033 return llvm::createStringError(
"Children sequence must be non-empty");
3042 for (
const uint32_t i : base_type_indices)
3045 inner_value->GetChildAtIndex(i,
true);
3049 CompilerType inner_value_type = inner_value->GetCompilerType();
3052 return llvm::createStringError(
3053 "casted value doesn't match the desired type");
3055 uintptr_t addr = inner_value->GetLoadAddress();
3056 llvm::StringRef name =
"";
3064 return llvm::createStringError(
3065 "casted value doesn't match the desired type");
3070llvm::Expected<lldb::ValueObjectSP>
3076 return llvm::createStringError(
3077 "Invalid target type: should be a pointer or a reference");
3083 auto target_record_type =
3085 auto start_record_type =
3088 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3089 return llvm::createStringError(
3090 "Underlying start & target types should be record types");
3092 if (target_record_type.CompareTypes(start_record_type))
3093 return llvm::createStringError(
3094 "Underlying start & target types should be different");
3097 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3099 return llvm::createStringError(
"virtual base should be valid");
3100 return llvm::createStringError(
3117 llvm::StringRef name =
"";
3120 name, addr - offset, exe_ctx, pointer_type,
false);
3128 return value->Dereference(
error);
3145 if (!is_scalar && !is_enum && !is_pointer)
3151 uint64_t type_byte_size = 0;
3152 uint64_t val_byte_size = 0;
3153 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3154 type_byte_size = temp.value();
3157 val_byte_size = temp.value();
3164 if (!type.
IsBoolean() && type_byte_size < val_byte_size)
3168 "target type cannot be smaller than the pointer type"));
3172 if (!is_scalar || is_integer)
3175 else if (is_scalar && is_float) {
3177 if (float_value_or_err)
3179 target, !float_value_or_err->isZero(),
"result");
3184 "cannot get value as APFloat: %s",
3185 llvm::toString(float_value_or_err.takeError()).c_str()));
3190 if (!is_scalar || is_integer) {
3192 if (int_value_or_err) {
3196 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3203 "cannot get value as APSInt: %s",
3204 llvm::toString(int_value_or_err.takeError()).c_str()));
3205 }
else if (is_scalar && is_float) {
3209 if (float_value_or_err) {
3210 llvm::APFloatBase::opStatus status =
3211 float_value_or_err->convertToInteger(
3212 integer, llvm::APFloat::rmTowardZero, &is_exact);
3216 if (status & llvm::APFloatBase::opInvalidOp)
3220 "invalid type cast detected: %s",
3221 llvm::toString(float_value_or_err.takeError()).c_str()));
3231 if (int_value_or_err) {
3233 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3243 "cannot get value as APSInt: %s",
3244 llvm::toString(int_value_or_err.takeError()).c_str()));
3249 if (int_value_or_err) {
3250 Scalar scalar_int(*int_value_or_err);
3259 "cannot get value as APSInt: %s",
3260 llvm::toString(int_value_or_err.takeError()).c_str()));
3265 if (float_value_or_err) {
3266 Scalar scalar_float(*float_value_or_err);
3275 "cannot get value as APFloat: %s",
3276 llvm::toString(float_value_or_err.takeError()).c_str()));
3293 if (!is_enum && !is_integer && !is_float)
3297 "argument must be an integer, a float, or an enum"));
3305 uint64_t byte_size = 0;
3306 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3307 byte_size = temp.value();
3314 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3315 integer, llvm::APFloat::rmTowardZero, &is_exact);
3319 if (status & llvm::APFloatBase::opInvalidOp)
3323 "invalid type cast detected: %s",
3324 llvm::toString(value_or_err.takeError()).c_str()));
3335 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3342 "cannot get value as APSInt: %s",
3343 llvm::toString(value_or_err.takeError()).c_str()));
3361 process_sp = target_sp->GetProcessSP();
3371 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3404 bool accept_invalid_exe_ctx) {
3407 const bool thread_and_frame_only_if_stopped =
true;
3416 if (process ==
nullptr)
3428 bool changed =
false;
3429 const bool was_valid =
m_mod_id.IsValid();
3447 if (!accept_invalid_exe_ctx) {
3456 changed = was_valid;
3462 changed = was_valid;
3503 if (!
m_parent->IsPointerOrReferenceType())
3504 return m_parent->GetSymbolContextScope();
3511 llvm::StringRef expression,
3518 llvm::StringRef name, llvm::StringRef expression,
3524 if (expression.empty())
3526 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3527 retval_sp, options);
3528 if (retval_sp && !name.empty())
3539 pointer_type = type;
3547 if (ptr_result_valobj_sp) {
3549 ptr_result_valobj_sp->GetValue().SetValueType(
3553 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3554 if (ptr_result_valobj_sp && !name.empty())
3557 return ptr_result_valobj_sp;
3571 if (new_value_sp && !name.empty())
3573 return new_value_sp;
3579 llvm::StringRef name) {
3581 uint64_t byte_size = 0;
3582 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3583 byte_size = temp.value();
3585 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3592 llvm::StringRef name) {
3605 llvm::StringRef name) {
3608 for (
auto type_system_sp : target->GetScratchTypeSystems())
3609 if (
auto compiler_type =
3611 target_type = compiler_type;
3616 uint64_t byte_size = 0;
3618 llvm::expectedToOptional(target_type.
GetByteSize(target.get())))
3619 byte_size = temp.value();
3621 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3635 uint64_t byte_size = 0;
3636 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3637 byte_size = temp.value();
3639 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3681 while (with_dv_info) {
3684 with_dv_info = with_dv_info->
m_parent;
3691 while (with_fmt_info) {
3694 with_fmt_info = with_fmt_info->
m_parent;
3706 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3708 type = cu->GetLanguage();
3740 target_sp->GetPersistentExpressionStateForLanguage(
3743 if (!persistent_state)
3753 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3756 return persistent_var_sp->GetValueObject();
3768 if ((
m_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
3802 return target_sp && target_sp->IsValid();
3807 std::unique_lock<std::recursive_mutex> &lock,
Status &
error) {
3815 Target *target = value_sp->GetTargetSP().get();
3817 if (value_sp->GetError().Fail())
3823 lock = std::unique_lock<std::recursive_mutex>(target->
GetAPIMutex());
3825 ProcessSP process_sp(value_sp->GetProcessSP());
3826 if (process_sp && !stop_locker.
TryLock(&process_sp->GetRunLock())) {
3837 value_sp = dynamic_sp;
3843 value_sp = synthetic_sp;
3849 value_sp->SetName(
m_name);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERRORV(log, error,...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static user_id_t g_value_obj_uid
static const char * ConvertBoolean(lldb::LanguageType language_type, const char *value_str)
static bool CopyStringDataToBufferSP(const StreamString &source, lldb::WritableDataBufferSP &destination)
static ValueObjectSP DereferenceValueOrAlternate(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal, Status &error)
static bool HasFloatingRepresentation(CompilerType ct)
static ValueObjectSP GetAlternateValue(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal)
static const char * SkipLeadingExpressionPathSeparators(const char *expression)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A class that describes a compilation unit.
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()
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)
CompilerType GetCompilerType()
void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType)
virtual const char * GetValueAsCString()
bool HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, lldb::Format custom_format)
virtual const char * GetLocationAsCString()
AddrAndType GetPointerValue()
ConstString GetName() const
std::string m_location_str
Cached location string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetVTable()
If this object represents a C++ class with a vtable, return an object that represents the virtual fun...
virtual bool SetValueFromCString(const char *value_str, Status &error)
virtual lldb::ValueObjectSP GetStaticValue()
lldb::ValueObjectSP Persist()
std::string m_object_desc_str
Cached result of the "object printer".
virtual ValueObject * GetParent()
lldb::SyntheticChildrenSP m_synthetic_children_sp
virtual uint32_t GetBitfieldBitOffset()
llvm::Expected< std::string > GetObjectDescription()
std::string m_old_value_str
Cached old value string from the last time the value was gotten.
virtual lldb::ValueObjectSP GetNonSyntheticValue()
lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression, bool can_create)
virtual bool SetData(DataExtractor &data, Status &error)
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
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.
std::string toString(FormatterBytecode::OpCodes op)
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