22#include "lldb/Host/Config.h"
54#include "llvm/Support/Compiler.h"
92 m_flags.m_is_synthetic_children_generated =
109 const ArchSpec &arch = target_sp->GetArchitecture();
122 bool did_change_formats =
false;
136 if (update_format && !did_change_formats)
150 m_flags.m_old_value_valid =
false;
152 m_flags.m_old_value_valid =
true;
167 bool need_compare_checksums =
false;
168 llvm::SmallVector<uint8_t, 16> old_checksum;
171 need_compare_checksums =
true;
174 old_checksum.begin());
183 const uint64_t max_checksum_size = 128;
186 need_compare_checksums =
false;
190 assert(!need_compare_checksums ||
195 else if (!
m_flags.m_value_did_change && !success) {
199 }
else if (need_compare_checksums) {
214 "[%s %p] checking for FormatManager revisions. ValueObject "
215 "rev: %d - Global rev: %d",
216 GetName().GetCString(),
static_cast<void *
>(
this),
220 bool any_change =
false;
244 m_flags.m_children_count_valid =
false;
245 m_flags.m_did_calculate_complete_objc_class_type =
false;
256 if (
m_flags.m_did_calculate_complete_objc_class_type) {
260 return compiler_type;
263 m_flags.m_did_calculate_complete_objc_class_type =
true;
269 return compiler_type;
273 if (std::optional<CompilerType> complete_type =
274 runtime->GetRuntimeType(compiler_type)) {
280 return compiler_type;
301 switch (value_type) {
327 sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
346 if (bitfield_bit_size)
357 LazyBool is_logical_true = language->IsLogicalTrue(*
this,
error);
358 switch (is_logical_true) {
361 return (is_logical_true ==
true);
389 "ValueObject: '{0}' not owned by its parent: '{1}'", child->
GetName(),
405 if (can_create && !
m_children.HasChildAtIndex(idx)) {
412 if (child !=
nullptr)
413 return child->
GetSP();
420 if (names.size() == 0)
423 for (llvm::StringRef name : names) {
424 root = root->GetChildMemberWithName(name);
432llvm::Expected<size_t>
434 bool omit_empty_base_classes =
true;
436 omit_empty_base_classes);
448 std::vector<uint32_t> child_indexes;
449 bool omit_empty_base_classes =
true;
454 const size_t num_child_indexes =
456 name, omit_empty_base_classes, child_indexes);
457 if (num_child_indexes == 0)
461 for (uint32_t idx : child_indexes)
463 child_sp = child_sp->GetChildAtIndex(idx, can_create);
471 if (
m_flags.m_children_count_valid) {
472 size_t children_count =
m_children.GetChildrenCount();
473 return children_count <= max ? children_count : max;
478 if (!
m_flags.m_children_count_valid) {
480 if (num_children_or_err)
483 return num_children_or_err;
491 return *value_or_err;
498 bool has_children =
false;
501 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
511 m_flags.m_children_count_valid =
true;
516 bool omit_empty_base_classes =
true;
517 bool ignore_array_bounds =
false;
518 std::string child_name;
519 uint32_t child_byte_size = 0;
520 int32_t child_byte_offset = 0;
521 uint32_t child_bitfield_bit_size = 0;
522 uint32_t child_bitfield_bit_offset = 0;
523 bool child_is_base_class =
false;
524 bool child_is_deref_of_parent =
false;
525 uint64_t language_flags = 0;
526 const bool transparent_pointers =
true;
530 auto child_compiler_type_or_err =
532 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
533 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
534 child_bitfield_bit_size, child_bitfield_bit_offset,
535 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
536 if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
538 child_compiler_type_or_err.takeError(),
539 "could not find child: {0}");
544 *
this, *child_compiler_type_or_err,
ConstString(child_name),
545 child_byte_size, child_byte_offset, child_bitfield_bit_size,
546 child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
551 bool omit_empty_base_classes =
true;
552 bool ignore_array_bounds =
true;
553 std::string child_name;
554 uint32_t child_byte_size = 0;
555 int32_t child_byte_offset = 0;
556 uint32_t child_bitfield_bit_size = 0;
557 uint32_t child_bitfield_bit_offset = 0;
558 bool child_is_base_class =
false;
559 bool child_is_deref_of_parent =
false;
560 uint64_t language_flags = 0;
561 const bool transparent_pointers =
false;
565 auto child_compiler_type_or_err =
567 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
568 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
569 child_bitfield_bit_size, child_bitfield_bit_offset,
570 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
571 if (!child_compiler_type_or_err) {
573 child_compiler_type_or_err.takeError(),
574 "could not find child: {0}");
578 if (child_compiler_type_or_err->IsValid()) {
579 child_byte_offset += child_byte_size * idx;
582 *
this, *child_compiler_type_or_err,
ConstString(child_name),
583 child_byte_size, child_byte_offset, child_bitfield_bit_size,
584 child_bitfield_bit_offset, child_is_base_class,
591 return synth_valobj_sp->GetChildAtIndex(idx,
true).get();
597 std::string &destination,
604 std::string &destination,
612 destination =
"<incomplete type>";
618 if (
m_flags.m_is_getting_summary)
621 m_flags.m_is_getting_summary =
true;
645 target_sp->GetSummaryStatisticsCache()
646 .GetSummaryStatisticsForProvider(*summary_ptr);
650 summary_ptr->
FormatObject(
this, destination, actual_options);
652 summary_ptr->
FormatObject(
this, destination, actual_options);
654 m_flags.m_is_getting_summary =
false;
655 return !destination.empty();
678 bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
679 pointee_or_element_compiler_type.
IsCharType());
680 if (!is_char_arr_ptr)
684 if (type_flags.
Test(eTypeIsArray))
691 uint32_t item_count) {
693 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
694 const bool is_pointer_type = type_info & eTypeIsPointer;
695 const bool is_array_type = type_info & eTypeIsArray;
696 if (!(is_pointer_type || is_array_type))
704 std::optional<uint64_t> item_type_size =
705 llvm::expectedToOptional(pointee_or_element_compiler_type.
GetByteSize(
709 const uint64_t bytes = item_count * *item_type_size;
710 const uint64_t offset = item_idx * *item_type_size;
712 if (item_idx == 0 && item_count == 1)
714 if (is_pointer_type) {
717 if (
error.Fail() || pointee_sp.get() ==
nullptr)
719 return pointee_sp->GetData(data,
error);
722 if (child_sp.get() ==
nullptr)
725 return child_sp->GetData(data,
error);
735 auto [addr, addr_type] =
742 addr = addr + offset;
744 module_sp->ResolveFileAddress(addr, so_addr);
751 if (
error.Success()) {
765 target->ReadMemory(target_addr, heap_buf_ptr->
GetBytes(), bytes,
767 if (
error.Success() || bytes_read > 0) {
776 if (max_bytes && *max_bytes > offset) {
777 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
781 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
798 if (
m_data.GetByteSize()) {
822 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
826 switch (value_type) {
832 m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
836 "unable to set scalar value: %s", set_error.
AsCString());
849 if (!
error.Success())
851 if (bytes_written != byte_size) {
861 m_data.SetData(buffer_sp, 0);
863 const_cast<uint8_t *
>(
m_data.GetDataStart()),
864 byte_size,
m_data.GetByteOrder());
884 if ((uint64_t)
m_data.GetDataStart() == start)
887 if ((uint64_t)
m_value.GetBuffer().GetBytes() == start)
888 return m_value.GetBuffer().GetData();
895 llvm::StringRef src = source.
GetString();
896 src = src.rtrim(
'\0');
897 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
898 memcpy(destination->GetBytes(), src.data(), src.size());
902std::pair<size_t, bool>
905 bool was_capped =
false;
911 s <<
"<no target to read from>";
914 return {0, was_capped};
919 size_t bytes_read = 0;
920 size_t total_bytes_read = 0;
925 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
930 bool capped_data =
false;
931 const bool is_array = type_flags.
Test(eTypeIsArray);
934 uint64_t array_size = 0;
935 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
936 cstr_len = array_size;
937 if (cstr_len > max_length) {
939 cstr_len = max_length;
948 if (cstr_address.
address == 0 ||
952 if (cstr ==
nullptr) {
953 s <<
"<invalid address>";
956 return {0, was_capped};
958 s << llvm::StringRef(cstr, cstr_len);
960 return {cstr_len, was_capped};
962 s <<
"<invalid address>";
965 return {0, was_capped};
971 if (cstr_len > 0 && honor_array) {
979 total_bytes_read = bytes_read;
980 for (
size_t offset = 0; offset < bytes_read; offset++)
986 cstr_len = max_length;
987 const size_t k_max_buf_size = 64;
991 int cstr_len_displayed = -1;
992 bool capped_cstr =
false;
997 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
998 total_bytes_read += bytes_read;
999 const char *cstr = data.
PeekCStr(0);
1000 size_t len = strnlen(cstr, k_max_buf_size);
1001 if (cstr_len_displayed < 0)
1002 cstr_len_displayed = len;
1006 cstr_len_displayed += len;
1007 if (len > bytes_read)
1012 for (
size_t offset = 0; offset < bytes_read; offset++)
1015 if (len < k_max_buf_size)
1018 if (len >= cstr_len) {
1027 if (cstr_len_displayed >= 0) {
1034 s <<
"<not a string object>";
1037 return {total_bytes_read, was_capped};
1042 return llvm::createStringError(
"could not update value");
1051 return llvm::createStringError(
"no process");
1054 auto get_object_description =
1055 [&](
LanguageType language) -> llvm::Expected<std::string> {
1058 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1063 return llvm::createStringError(
"no native language runtime");
1068 llvm::Expected<std::string> desc = get_object_description(native_language);
1076 llvm::consumeError(desc.takeError());
1083 std::string &destination) {
1091 std::string &destination) {
1103 if (
m_flags.m_is_bitfield_for_scalar)
1109 my_format = reg_info->
format;
1119 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1180 return llvm::createStringError(
"type cannot be converted to APSInt");
1188 return llvm::createStringError(
"error occurred; unable to convert to APSInt");
1193 return llvm::createStringError(
"type cannot be converted to APFloat");
1201 return llvm::createStringError(
1202 "error occurred; unable to convert to APFloat");
1211 return value_or_err->getBoolValue();
1214 "GetValueAsAPSInt failed: {0}");
1219 return value_or_err->isNonZero();
1222 "GetValueAsAPFloat failed: {0}");
1227 return llvm::createStringError(
"type cannot be converted to bool");
1231 bool can_update_var) {
1246 "Not allowed to update program variables in this case.");
1252 uint64_t byte_size = 0;
1255 byte_size = temp.value();
1256 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1258 "illegal argument: new value should be of the same size");
1263 reinterpret_cast<const void *
>(value.getRawData()), byte_size,
1264 target->GetArchitecture().GetByteOrder(),
1265 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1285 "Not allowed to update program variables in this case.");
1290 CompilerType new_val_type = new_val_sp->GetCompilerType();
1294 "illegal argument: new value should be of the same size");
1299 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1305 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1312 bool success =
true;
1313 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1316 uint64_t num_bits = 0;
1317 if (
auto temp = llvm::expectedToOptional(
1318 new_val_sp->GetCompilerType().GetBitSize(target.get())))
1319 num_bits = temp.value();
1334 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1341 if (flags.
Test(eTypeIsArray)) {
1367 bool do_dump_error) {
1380 bool allow_special =
1382 const bool only_special =
false;
1384 if (allow_special) {
1385 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1398 std::pair<size_t, bool> read_string =
1402 lldb_private::formatters::StringPrinter::
1403 ReadBufferAndDumpToStreamOptions options(*
this);
1407 options.SetStream(&s);
1408 options.SetPrefixToken(
nullptr);
1409 options.SetQuote(
'"');
1410 options.SetSourceSize(buffer_sp->GetByteSize());
1411 options.SetIsTruncated(read_string.second);
1413 options.SetZeroTermination(
1416 options.SetZeroTermination(
1420 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1422 return !
error.Fail();
1430 if (flags.
Test(eTypeIsArray)) {
1436 for (
size_t low = 0; low < count; low++) {
1443 s <<
"<invalid child>";
1446 child->DumpPrintableRepresentation(
1477 for (
size_t low = 0; low < count; low++) {
1484 s <<
"<invalid child>";
1487 child->DumpPrintableRepresentation(
1520 bool var_success =
false;
1523 llvm::StringRef str;
1534 switch (val_obj_display) {
1546 strm <<
"error: " <<
toString(desc.takeError());
1560 strm.
Printf(
"%" PRIu32, *err);
1563 strm <<
"error: " <<
toString(err.takeError());
1611 else if (val_obj_display ==
1613 s.
PutCString(
"<not a valid Objective-C object>");
1618 s.
PutCString(
"<no printable representation>");
1642 switch (
m_value.GetValueType()) {
1646 if (scalar_is_load_address) {
1655 m_value.GetValueAddressType()};
1659 llvm_unreachable(
"Unhandled value type!");
1666 if (
ABISP abi_sp = process->GetABI())
1667 return abi_sp->FixCodeAddress(address);
1669 return std::nullopt;
1676 switch (
m_value.GetValueType()) {
1691 llvm_unreachable(
"Unhandled value type!");
1695 const char *value_str) {
1697 if (
auto boolean = language->GetBooleanFromString(value_str))
1698 return *
boolean ?
"1" :
"0";
1700 return llvm::StringSwitch<const char *>(value_str)
1703 .Default(value_str);
1717 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
1723 m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1724 }
else if (byte_size <= 16) {
1733 if (
error.Success()) {
1734 switch (value_type) {
1745 target_addr, new_scalar, byte_size,
error);
1746 if (!
error.Success())
1748 if (bytes_written != byte_size) {
1761 m_data.SetData(buffer_sp, 0);
1762 bool success = new_scalar.
GetData(new_data);
1765 0, byte_size,
const_cast<uint8_t *
>(
m_data.GetDataStart()),
1766 byte_size,
m_data.GetByteOrder());
1804 std::map<ConstString, ValueObject *>::const_iterator pos =
1807 synthetic_child_sp = pos->second->GetSP();
1808 return synthetic_child_sp;
1831 if (runtime->IsAllowedRuntimeValue(
GetName()))
1839 return language->IsNilReference(*
this);
1846 return language->IsUninitializedReference(*
this);
1864 std::string index_str = llvm::formatv(
"[{0}]", index);
1869 if (!synthetic_child_sp) {
1876 if (synthetic_child) {
1878 synthetic_child_sp = synthetic_child->
GetSP();
1879 synthetic_child_sp->SetName(
ConstString(index_str));
1880 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1884 return synthetic_child_sp;
1891 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1896 if (!synthetic_child_sp) {
1897 uint32_t bit_field_size = to - from + 1;
1898 uint32_t bit_field_offset = from;
1901 llvm::expectedToOptional(
GetByteSize()).value_or(0) * 8 -
1902 bit_field_size - bit_field_offset;
1907 llvm::expectedToOptional(
GetByteSize()).value_or(0), 0,
1912 if (synthetic_child) {
1914 synthetic_child_sp = synthetic_child->
GetSP();
1915 synthetic_child_sp->SetName(
ConstString(index_str));
1916 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1920 return synthetic_child_sp;
1924 uint32_t offset,
const CompilerType &type,
bool can_create,
1929 if (name_const_str.
IsEmpty()) {
1930 name_const_str.
SetString(
"@" + std::to_string(offset));
1937 if (synthetic_child_sp.get())
1938 return synthetic_child_sp;
1944 std::optional<uint64_t> size = llvm::expectedToOptional(
1951 if (synthetic_child) {
1953 synthetic_child_sp = synthetic_child->
GetSP();
1954 synthetic_child_sp->SetName(name_const_str);
1955 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1957 return synthetic_child_sp;
1966 if (name_const_str.
IsEmpty()) {
1968 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1977 if (synthetic_child_sp.get())
1978 return synthetic_child_sp;
1983 const bool is_base_class =
true;
1986 std::optional<uint64_t> size = llvm::expectedToOptional(
1993 if (synthetic_child) {
1995 synthetic_child_sp = synthetic_child->
GetSP();
1996 synthetic_child_sp->SetName(name_const_str);
1998 return synthetic_child_sp;
2006 if (!expression || !expression[0])
2008 if (expression[0] ==
'.')
2009 return expression + 1;
2010 if (expression[0] ==
'-' && expression[1] ==
'>')
2011 return expression + 2;
2023 if (!synthetic_child_sp) {
2027 expression,
nullptr,
nullptr,
2033 if (synthetic_child_sp.get()) {
2037 synthetic_child_sp->SetName(
2041 return synthetic_child_sp;
2046 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2128 if (
m_flags.m_is_synthetic_children_generated) {
2137 uint64_t load_addr =
2158 if (is_deref_of_parent &&
2190 if (
m_flags.m_is_array_item_for_pointer &&
2195 if (!is_deref_of_parent) {
2197 if (non_base_class_parent &&
2201 if (non_base_class_parent_compiler_type) {
2206 const uint32_t non_base_class_parent_type_info =
2207 non_base_class_parent_compiler_type.
GetTypeInfo();
2209 if (non_base_class_parent_type_info & eTypeIsPointer) {
2211 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2212 !(non_base_class_parent_type_info & eTypeIsArray)) {
2225 if (is_deref_of_parent &&
2237 using SynthTraversal =
2241 if (synth_traversal == SynthTraversal::FromSynthetic ||
2242 synth_traversal == SynthTraversal::Both)
2245 if (synth_traversal == SynthTraversal::ToSynthetic ||
2246 synth_traversal == SynthTraversal::Both)
2261 if (!result ||
error.Fail()) {
2264 result = alt_obj->Dereference(
error);
2284 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2285 final_value_type ? final_value_type : &dummy_final_value_type, options,
2286 final_task_on_target ? final_task_on_target
2287 : &dummy_final_task_on_target);
2289 if (!final_task_on_target ||
2293 if (ret_val.get() &&
2294 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2298 if ((final_task_on_target ? *final_task_on_target
2299 : dummy_final_task_on_target) ==
2304 if (
error.Fail() || !final_value.get()) {
2308 if (final_value_type)
2312 if (final_task_on_target)
2317 if (*final_task_on_target ==
2321 if (
error.Fail() || !final_value.get()) {
2325 if (final_value_type)
2329 if (final_task_on_target)
2349 llvm::StringRef remainder = expression;
2352 llvm::StringRef temp_expression = remainder;
2354 CompilerType root_compiler_type = root->GetCompilerType();
2356 Flags pointee_compiler_type_info;
2358 Flags root_compiler_type_info(
2359 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2360 if (pointee_compiler_type)
2363 if (temp_expression.empty()) {
2368 switch (temp_expression.front()) {
2370 temp_expression = temp_expression.drop_front();
2372 root_compiler_type_info.
Test(eTypeIsPointer))
2382 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2385 root_compiler_type_info.
Test(eTypeIsPointer) &&
2392 if (!temp_expression.starts_with(
">")) {
2403 temp_expression.front() ==
'.' &&
2404 root_compiler_type_info.
Test(eTypeIsPointer))
2414 temp_expression = temp_expression.drop_front();
2416 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2417 if (next_sep_pos == llvm::StringRef::npos) {
2419 llvm::StringRef child_name = temp_expression;
2421 root->GetChildMemberWithName(child_name);
2422 if (!child_valobj_sp) {
2425 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2427 if (child_valobj_sp) {
2431 return child_valobj_sp;
2438 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2439 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2441 ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name);
2442 if (!child_valobj_sp) {
2445 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2447 if (child_valobj_sp) {
2448 root = child_valobj_sp;
2449 remainder = next_separator;
2458 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2459 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2460 !root_compiler_type_info.
Test(
2463 if (!root_compiler_type_info.
Test(
2485 if (temp_expression[1] ==
2488 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2504 size_t close_bracket_position = temp_expression.find(
']', 1);
2505 if (close_bracket_position ==
2506 llvm::StringRef::npos)
2514 llvm::StringRef bracket_expr =
2515 temp_expression.slice(1, close_bracket_position);
2519 assert(!bracket_expr.empty());
2521 if (!bracket_expr.contains(
'-')) {
2525 unsigned long index = 0;
2526 if (bracket_expr.getAsInteger(0, index)) {
2534 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2535 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2536 if (!child_valobj_sp)
2537 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2538 if (!child_valobj_sp)
2539 if (root->HasSyntheticValue() &&
2540 llvm::expectedToOptional(
2541 root->GetSyntheticValue()->GetNumChildren())
2542 .value_or(0) > index)
2544 root->GetSyntheticValue()->GetChildAtIndex(index);
2545 if (child_valobj_sp) {
2546 root = child_valobj_sp;
2548 temp_expression.substr(close_bracket_position + 1);
2557 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2569 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2573 if (
error.Fail() || !root) {
2583 if (root->GetCompilerType().GetMinimumLanguage() ==
2585 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2586 root->HasSyntheticValue() &&
2589 SyntheticChildrenTraversal::ToSynthetic ||
2592 SyntheticChildrenTraversal::Both)) {
2593 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2595 root = root->GetSyntheticArrayMember(index,
true);
2603 temp_expression.substr(close_bracket_position + 1);
2608 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2609 root = root->GetSyntheticBitFieldChild(index, index,
true);
2618 *reason_to_stop = ValueObject::
2619 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2623 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2624 root = root->GetChildAtIndex(index);
2632 temp_expression.substr(close_bracket_position + 1);
2638 SyntheticChildrenTraversal::ToSynthetic ||
2641 SyntheticChildrenTraversal::Both) {
2642 if (root->HasSyntheticValue())
2643 root = root->GetSyntheticValue();
2644 else if (!root->IsSynthetic()) {
2659 root = root->GetChildAtIndex(index);
2667 temp_expression.substr(close_bracket_position + 1);
2679 llvm::StringRef sleft, sright;
2680 unsigned long low_index, high_index;
2681 std::tie(sleft, sright) = bracket_expr.split(
'-');
2682 if (sleft.getAsInteger(0, low_index) ||
2683 sright.getAsInteger(0, high_index)) {
2690 if (low_index > high_index)
2691 std::swap(low_index, high_index);
2693 if (root_compiler_type_info.
Test(
2696 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2703 *reason_to_stop = ValueObject::
2704 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2708 }
else if (root_compiler_type_info.
Test(
2715 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2719 if (
error.Fail() || !root) {
2802 result_sp =
GetSP();
2805 bool is_synthetic = result_sp->IsSynthetic();
2806 if (synthValue && !is_synthetic) {
2807 if (
auto synth_sp = result_sp->GetSyntheticValue())
2810 if (!synthValue && is_synthetic) {
2811 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2812 return non_synth_sp;
2822 std::string deref_name_str;
2823 uint32_t deref_byte_size = 0;
2824 int32_t deref_byte_offset = 0;
2826 uint64_t language_flags = 0;
2832 &exe_ctx, deref_name_str, deref_byte_size, deref_byte_offset,
this,
2835 std::string deref_error;
2836 if (deref_compiler_type_or_err) {
2837 deref_compiler_type = *deref_compiler_type_or_err;
2839 deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
2843 if (deref_compiler_type && deref_byte_size) {
2845 if (!deref_name_str.empty())
2846 deref_name.
SetCString(deref_name_str.c_str());
2850 deref_byte_size, deref_byte_offset, 0, 0,
false,
2863 if (deref_compiler_type) {
2865 if (!deref_name_str.empty())
2866 deref_name.
SetCString(deref_name_str.c_str());
2869 *
this, deref_compiler_type, deref_name, deref_byte_size,
2886 if (deref_error.empty())
2888 "dereference failed: (%s) %s",
2892 "dereference failed: %s: (%s) %s", deref_error.c_str(),
2905 switch (address_type) {
2916 if (compiler_type) {
2917 std::string name(1,
'&');
2918 name.append(
m_name.AsCString(
""));
2937 "'%s' doesn't have a valid address", expr_path_strm.
GetData());
2967 if (llvm::expectedToOptional(compiler_type.
GetByteSize(exe_scope))
2972 return DoCast(compiler_type);
2975 "Can only cast to a type that is equal to or smaller "
2976 "than the orignal type.");
3016 const bool scalar_is_load_address =
true;
3017 auto [addr_value, addr_type] =
GetAddressOf(scalar_is_load_address);
3024 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3036 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3041 return llvm::createStringError(
3042 "Invalid target type: should be a pointer or a reference");
3048 auto target_record_type =
3050 auto start_record_type =
3053 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3054 return llvm::createStringError(
3055 "Underlying start & target types should be record types");
3057 if (target_record_type.CompareTypes(start_record_type))
3058 return llvm::createStringError(
3059 "Underlying start & target types should be different");
3061 if (base_type_indices.empty())
3062 return llvm::createStringError(
"children sequence must be non-empty");
3071 for (
const uint32_t i : base_type_indices)
3074 inner_value->GetChildAtIndex(i,
true);
3078 CompilerType inner_value_type = inner_value->GetCompilerType();
3081 return llvm::createStringError(
3082 "casted value doesn't match the desired type");
3084 uintptr_t addr = inner_value->GetLoadAddress();
3085 llvm::StringRef name =
"";
3093 return llvm::createStringError(
3094 "casted value doesn't match the desired type");
3099llvm::Expected<lldb::ValueObjectSP>
3105 return llvm::createStringError(
3106 "Invalid target type: should be a pointer or a reference");
3112 auto target_record_type =
3114 auto start_record_type =
3117 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3118 return llvm::createStringError(
3119 "Underlying start & target types should be record types");
3121 if (target_record_type.CompareTypes(start_record_type))
3122 return llvm::createStringError(
3123 "Underlying start & target types should be different");
3126 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3128 return llvm::createStringError(
"virtual base should be valid");
3129 return llvm::createStringError(
3146 llvm::StringRef name =
"";
3149 name, addr - offset, exe_ctx, pointer_type,
false);
3157 return value->Dereference(
error);
3174 if (!is_scalar && !is_enum && !is_pointer)
3180 uint64_t type_byte_size = 0;
3181 uint64_t val_byte_size = 0;
3182 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3183 type_byte_size = temp.value();
3186 val_byte_size = temp.value();
3193 if (!type.
IsBoolean() && type_byte_size < val_byte_size)
3197 "target type cannot be smaller than the pointer type"));
3201 if (!is_scalar || is_integer)
3205 else if (is_scalar && is_float) {
3207 if (float_value_or_err)
3210 !float_value_or_err->isZero(),
"result");
3215 "cannot get value as APFloat: %s",
3216 llvm::toString(float_value_or_err.takeError()).c_str()));
3221 if (!is_scalar || is_integer) {
3223 if (int_value_or_err) {
3227 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3234 "cannot get value as APSInt: %s",
3235 llvm::toString(int_value_or_err.takeError()).c_str()));
3236 }
else if (is_scalar && is_float) {
3240 if (float_value_or_err) {
3241 llvm::APFloatBase::opStatus status =
3242 float_value_or_err->convertToInteger(
3243 integer, llvm::APFloat::rmTowardZero, &is_exact);
3247 if (status & llvm::APFloatBase::opInvalidOp)
3251 "invalid type cast detected: %s",
3252 llvm::toString(float_value_or_err.takeError()).c_str()));
3262 if (int_value_or_err) {
3264 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3274 "cannot get value as APSInt: %s",
3275 llvm::toString(int_value_or_err.takeError()).c_str()));
3280 if (int_value_or_err) {
3281 Scalar scalar_int(*int_value_or_err);
3290 "cannot get value as APSInt: %s",
3291 llvm::toString(int_value_or_err.takeError()).c_str()));
3296 if (float_value_or_err) {
3297 Scalar scalar_float(*float_value_or_err);
3306 "cannot get value as APFloat: %s",
3307 llvm::toString(float_value_or_err.takeError()).c_str()));
3324 if (!is_enum && !is_integer && !is_float)
3328 "argument must be an integer, a float, or an enum"));
3336 uint64_t byte_size = 0;
3337 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3338 byte_size = temp.value();
3345 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3346 integer, llvm::APFloat::rmTowardZero, &is_exact);
3350 if (status & llvm::APFloatBase::opInvalidOp)
3354 "invalid type cast detected: %s",
3355 llvm::toString(value_or_err.takeError()).c_str()));
3366 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3373 "cannot get value as APSInt: %s",
3374 llvm::toString(value_or_err.takeError()).c_str()));
3392 process_sp = target_sp->GetProcessSP();
3402 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3435 bool accept_invalid_exe_ctx) {
3438 const bool thread_and_frame_only_if_stopped =
true;
3447 if (process ==
nullptr)
3459 bool changed =
false;
3460 const bool was_valid =
m_mod_id.IsValid();
3478 if (!accept_invalid_exe_ctx) {
3487 changed = was_valid;
3493 changed = was_valid;
3534 if (!
m_parent->IsPointerOrReferenceType())
3535 return m_parent->GetSymbolContextScope();
3541 llvm::StringRef name, llvm::StringRef expression,
3548 llvm::StringRef name, llvm::StringRef expression,
3558 if (expression.empty())
3561 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3562 retval_sp, options);
3563 if (retval_sp && !name.empty())
3574 pointer_type = type;
3583 if (ptr_result_valobj_sp) {
3585 ptr_result_valobj_sp->GetValue().SetValueType(
3589 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3590 if (ptr_result_valobj_sp && !name.empty())
3593 return ptr_result_valobj_sp;
3607 if (new_value_sp && !name.empty())
3609 return new_value_sp;
3615 uint64_t byte_size =
3616 llvm::expectedToOptional(
3620 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3638 nullptr, parent ? parent->
GetManager() :
nullptr);
3646 uint64_t byte_size =
3647 llvm::expectedToOptional(type.
GetByteSize(exe_scope)).value_or(0);
3649 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3663 uint64_t byte_size = 0;
3664 if (
auto temp = llvm::expectedToOptional(
3666 byte_size = temp.value();
3668 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3711 while (with_dv_info) {
3714 with_dv_info = with_dv_info->
m_parent;
3721 while (with_fmt_info) {
3724 with_fmt_info = with_fmt_info->
m_parent;
3736 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3738 type = cu->GetLanguage();
3770 target_sp->GetPersistentExpressionStateForLanguage(
3773 if (!persistent_state)
3783 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3786 return persistent_var_sp->GetValueObject();
3798 if ((
m_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
3832 return target_sp && target_sp->IsValid();
3837 std::unique_lock<std::recursive_mutex> &lock,
Status &
error) {
3845 Target *target = value_sp->GetTargetSP().get();
3847 if (value_sp->GetError().Fail())
3853 lock = std::unique_lock<std::recursive_mutex>(target->
GetAPIMutex());
3855 ProcessSP process_sp(value_sp->GetProcessSP());
3856 if (process_sp && !stop_locker.
TryLock(&process_sp->GetRunLock())) {
3867 value_sp = dynamic_sp;
3873 value_sp = synthetic_sp;
3879 value_sp->SetName(
m_name);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERRORV(log, error,...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static user_id_t g_value_obj_uid
static const char * ConvertBoolean(lldb::LanguageType language_type, const char *value_str)
static bool CopyStringDataToBufferSP(const StreamString &source, lldb::WritableDataBufferSP &destination)
static ValueObjectSP DereferenceValueOrAlternate(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal, Status &error)
static bool HasFloatingRepresentation(CompilerType ct)
static ValueObjectSP GetAlternateValue(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal)
static const char * SkipLeadingExpressionPathSeparators(const char *expression)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A class that describes a compilation unit.
lldb::TypeSystemSP GetSharedPointer() const
Generic representation of a type in a programming language.
bool IsEnumerationType(bool &is_signed) const
lldb::BasicType GetBasicTypeEnumeration() const
TypeSystemSPWrapper GetTypeSystem() const
Accessors.
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
size_t GetIndexOfChildMemberWithName(llvm::StringRef name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) const
Lookup a child member given a name.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
lldb::Encoding GetEncoding() const
CompilerType GetNonReferenceType() const
If this type is a reference to a type (L value or R value reference), return a new type with the refe...
ConstString GetTypeName(bool BaseOnly=false) const
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
std::string TypeDescription()
bool IsInteger() const
This is used when you don't care about the signedness of the integer.
llvm::Expected< CompilerType > GetDereferencedType(ExecutionContext *exe_ctx, std::string &deref_name, uint32_t &deref_byte_size, int32_t &deref_byte_offset, ValueObject *valobj, uint64_t &language_flags) const
lldb::Format GetFormat() const
llvm::Expected< CompilerType > GetChildCompilerTypeAtIndex(ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool IsUnscopedEnumerationType() const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
llvm::Expected< uint32_t > GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const
Lookup a child given a name.
bool CompareTypes(CompilerType rhs) const
bool IsScalarType() const
bool IsNullPtrType() const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
void SetCString(const char *cstr)
Set the C string value.
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.
const char * AsCString(const char *value_if_empty) 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.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
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.
void Format(const char *format, Args &&... args)
Forwards the arguments to llvm::formatv and writes to the stream.
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
bool GetCheckValueObjectOwnership() 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, ValueObjectManager *manager=nullptr)
These routines create ValueObjectConstResult ValueObjects from various data sources.
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, ValueObject *parent=nullptr)
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()
lldb::ValueObjectSP CheckValueObjectOwnership(ValueObject *child)
llvm::SmallVector< uint8_t, 16 > m_value_checksum
static lldb::ValueObjectSP CreateValueObjectFromNullptr(const ExecutionContext &exe_ctx, CompilerType type, llvm::StringRef name, ValueObject *parent=nullptr)
Create a nullptr value object with the specified type (must be a nullptr type).
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()
PrintableRepresentationSpecialCases
virtual bool GetIsConstant() const
virtual bool MightHaveChildren()
Find out if a ValueObject might have children.
virtual bool IsDereferenceOfParent()
virtual llvm::Expected< size_t > GetIndexOfChildWithName(llvm::StringRef name)
static lldb::ValueObjectSP CreateValueObjectFromScalar(const ExecutionContext &exe_ctx, Scalar &s, CompilerType type, llvm::StringRef name, ValueObject *parent=nullptr)
Create a value object containing the given Scalar value.
virtual ValueObject * CreateSyntheticArrayMember(size_t idx)
Should only be called by ValueObject::GetSyntheticArrayMember().
void SetValueFormat(lldb::TypeFormatImplSP format)
virtual void CalculateSyntheticValue()
void SetPreferredDisplayLanguage(lldb::LanguageType lt)
struct lldb_private::ValueObject::Bitflags m_flags
ClusterManager< ValueObject > ValueObjectManager
ValueObject(ExecutionContextScope *exe_scope, ValueObjectManager &manager, AddressType child_ptr_or_ref_addr_type=eAddressTypeLoad)
Use this constructor to create a "root variable object".
std::string m_summary_str
Cached summary string that will get cleared if/when the value is updated.
virtual lldb::ValueObjectSP DoCast(const CompilerType &compiler_type)
lldb::ValueObjectSP GetSP()
ChildrenManager m_children
virtual lldb::ValueObjectSP CastPointerType(const char *name, CompilerType &ast_type)
Status m_error
An error object that can describe any errors that occur when updating values.
virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx=0, uint32_t item_count=1)
lldb::ValueObjectSP GetSyntheticValue()
ValueObjectManager * m_manager
This object is managed by the root object (any ValueObject that gets created without a parent....
lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to, bool can_create)
lldb::ProcessSP GetProcessSP() const
lldb::ValueObjectSP GetSyntheticChild(ConstString key) const
ExpressionPathScanEndReason
@ eExpressionPathScanEndReasonArrowInsteadOfDot
-> used when . should be used.
@ eExpressionPathScanEndReasonDereferencingFailed
Impossible to apply * operator.
@ eExpressionPathScanEndReasonNoSuchChild
Child element not found.
@ eExpressionPathScanEndReasonUnknown
@ eExpressionPathScanEndReasonDotInsteadOfArrow
. used when -> should be used.
@ eExpressionPathScanEndReasonEndOfString
Out of data to parse.
@ eExpressionPathScanEndReasonRangeOperatorNotAllowed
[] not allowed by options.
@ eExpressionPathScanEndReasonEmptyRangeNotAllowed
[] only allowed for arrays.
@ eExpressionPathScanEndReasonRangeOperatorInvalid
[] not valid on objects other than scalars, pointers or arrays.
@ eExpressionPathScanEndReasonUnexpectedSymbol
Something is malformed in he expression.
@ eExpressionPathScanEndReasonArrayRangeOperatorMet
[] is good for arrays, but I cannot parse it.
@ eExpressionPathScanEndReasonSyntheticValueMissing
getting the synthetic children failed.
@ eExpressionPathScanEndReasonTakingAddressFailed
Impossible to apply & operator.
@ eExpressionPathScanEndReasonFragileIVarNotAllowed
ObjC ivar expansion not allowed.
virtual bool UpdateValue()=0
lldb::Format GetFormat() const
virtual lldb::VariableSP GetVariable()
@ eExpressionPathAftermathNothing
Just return it.
@ eExpressionPathAftermathDereference
Dereference the target.
@ eExpressionPathAftermathTakeAddress
Take target's address.
lldb::ValueObjectSP CastToBasicType(CompilerType type)
ValueObject * GetNonBaseClassParent()
virtual ValueObject * CreateChildAtIndex(size_t idx)
Should only be called by ValueObject::GetChildAtIndex().
lldb::ValueObjectSP GetValueForExpressionPath(llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop=nullptr, ExpressionPathEndResultType *final_value_type=nullptr, const GetValueForExpressionPathOptions &options=GetValueForExpressionPathOptions::DefaultOptions(), ExpressionPathAftermath *final_task_on_target=nullptr)
virtual lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic)
bool IsPossibleDynamicType()
DataExtractor m_data
A data extractor that can be used to extract the value.
virtual llvm::Expected< uint64_t > GetByteSize()=0
virtual CompilerType GetCompilerTypeImpl()=0
virtual lldb::ValueObjectSP GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
@ eGetExpressionPathFormatDereferencePointers
@ eGetExpressionPathFormatHonorPointers
virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create=true)
lldb::ValueObjectSP CastToEnumType(CompilerType type)
llvm::Expected< uint32_t > GetNumChildren(uint32_t max=UINT32_MAX)
void SetValueFromInteger(const llvm::APInt &value, Status &error, bool can_update_var=true)
Update an existing integer ValueObject with a new integer value.
virtual void GetExpressionPath(Stream &s, GetExpressionPathFormat=eGetExpressionPathFormatDereferencePointers)
bool UpdateFormatsIfNeeded()
virtual bool HasSyntheticValue()
lldb::StackFrameSP GetFrameSP() const
friend class ValueObjectChild
lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef< llvm::StringRef > names)
void SetSummaryFormat(lldb::TypeSummaryImplSP format)
virtual bool IsRuntimeSupportValue()
virtual ConstString GetTypeName()
DataExtractor & GetDataExtractor()
void SetValueDidChange(bool value_changed)
static lldb::ValueObjectSP CreateValueObjectFromBool(const ExecutionContext &exe_ctx, lldb::TypeSystemSP typesystem, bool value, llvm::StringRef name, ValueObject *parent=nullptr)
Create a value object containing the given boolean value.
@ eClearUserVisibleDataItemsDescription
@ eClearUserVisibleDataItemsLocation
@ eClearUserVisibleDataItemsSummary
@ eClearUserVisibleDataItemsValue
@ eClearUserVisibleDataItemsSyntheticChildren
ValueObjectManager * GetManager()
ValueObject * m_root
The root of the hierarchy for this ValueObject (or nullptr if never calculated).
lldb::addr_t GetLoadAddress()
Return the target load address associated with this value object.
bool GetValueIsValid() const
virtual lldb::ModuleSP GetModule()
Return the module associated with this value object in case the value is from an executable file and ...
virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType)
void UpdateChildrenAddressType()
llvm::Expected< lldb::ValueObjectSP > CastDerivedToBaseType(CompilerType type, const llvm::ArrayRef< uint32_t > &base_type_indices)
Take a ValueObject whose type is an inherited class, and cast it to 'type', which should be one of it...
virtual lldb::ValueObjectSP AddressOf(Status &error)
lldb::DynamicValueType GetDynamicValueType()
llvm::Expected< lldb::ValueObjectSP > CastBaseToDerivedType(CompilerType type, uint64_t offset)
Take a ValueObject whose type is a base class, and cast it to 'type', which should be one of its deri...
lldb::LanguageType m_preferred_display_language
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr)
virtual llvm::Expected< uint32_t > CalculateNumChildren(uint32_t max=UINT32_MAX)=0
Should only be called by ValueObject::GetNumChildren().
lldb::LanguageType GetObjectRuntimeLanguage()
virtual lldb::ValueObjectSP CreateConstantValue(ConstString name)
virtual bool IsLogicalTrue(Status &error)
lldb::Format m_last_format
virtual SymbolContextScope * GetSymbolContextScope()
virtual bool HasDynamicValueTypeInfo()
ValueObject * m_synthetic_value
void SetNumChildren(uint32_t num_children)
ValueObject * m_parent
The parent value object, or nullptr if this has no parent.
static lldb::ValueObjectSP CreateValueObjectFromAPInt(const ExecutionContext &exe_ctx, const llvm::APInt &v, CompilerType type, llvm::StringRef name, ValueObject *parent=nullptr)
Create a value object containing the given APInt value.
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)
static lldb::ValueObjectSP CreateValueObjectFromExpression(llvm::StringRef name, llvm::StringRef expression, const ExecutionContext &exe_ctx, ValueObject *parent=nullptr)
The following static routines create "Root" ValueObjects if parent is null.
virtual lldb::ValueObjectSP Clone(ConstString new_name)
Creates a copy of the ValueObject with a new name and setting the current ValueObject as its parent.
lldb::ValueObjectSP GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue, bool synthValue)
lldb::ValueObjectSP m_addr_of_valobj_sp
We have to hold onto a shared pointer to this one because it is created as an independent ValueObject...
std::pair< size_t, bool > ReadPointedString(lldb::WritableDataBufferSP &buffer_sp, Status &error, bool honor_array)
llvm::Error Dump(Stream &s)
bool IsUninitializedReference()
bool UpdateValueIfNeeded(bool update_format=true)
AddressType GetAddressTypeOfChildren()
const Status & GetError()
lldb::TypeFormatImplSP m_type_format_sp
lldb::TargetSP GetTargetSP() const
ExpressionPathEndResultType
@ eExpressionPathEndResultTypeInvalid
@ eExpressionPathEndResultTypePlain
Anything but...
@ eExpressionPathEndResultTypeBoundedRange
A range [low-high].
@ eExpressionPathEndResultTypeBitfield
A bitfield.
@ eExpressionPathEndResultTypeUnboundedRange
A range [].
virtual lldb::ValueObjectSP Dereference(Status &error)
CompilerType GetCompilerType()
void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType)
virtual const char * GetValueAsCString()
bool HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, lldb::Format custom_format)
virtual const char * GetLocationAsCString()
AddrAndType GetPointerValue()
ConstString GetName() const
std::string m_location_str
Cached location string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetVTable()
If this object represents a C++ class with a vtable, return an object that represents the virtual fun...
virtual bool SetValueFromCString(const char *value_str, Status &error)
virtual lldb::ValueObjectSP GetStaticValue()
lldb::ValueObjectSP Persist()
std::string m_object_desc_str
Cached result of the "object printer".
virtual ValueObject * GetParent()
static lldb::ValueObjectSP CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type, ValueObject *parent=nullptr)
lldb::SyntheticChildrenSP m_synthetic_children_sp
static lldb::ValueObjectSP CreateValueObjectFromAPFloat(const ExecutionContext &exe_ctx, const llvm::APFloat &v, CompilerType type, llvm::StringRef name, ValueObject *parent=nullptr)
Create a value object containing the given APFloat value.
virtual uint32_t GetBitfieldBitOffset()
llvm::Expected< std::string > GetObjectDescription()
std::string m_old_value_str
Cached old value string from the last time the value was gotten.
virtual lldb::ValueObjectSP GetNonSyntheticValue()
lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression, bool can_create)
virtual bool SetData(DataExtractor &data, Status &error)
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
const char * GetSummaryAsCString(lldb::LanguageType lang=lldb::eLanguageTypeUnknown)
ValueObjectRepresentationStyle
@ eValueObjectRepresentationStyleLocation
@ eValueObjectRepresentationStyleSummary
@ eValueObjectRepresentationStyleName
@ eValueObjectRepresentationStyleType
@ eValueObjectRepresentationStyleChildrenCount
@ eValueObjectRepresentationStyleExpressionPath
@ eValueObjectRepresentationStyleValue
@ eValueObjectRepresentationStyleLanguageSpecific
std::string m_value_str
Cached value string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create)
virtual bool ResolveValue(Scalar &scalar)
llvm::Expected< llvm::APSInt > GetValueAsAPSInt()
If the current ValueObject is of an appropriate type, convert the value to an APSInt and return that.
void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp)
ConstString m_name
The name of this object.
bool IsPointerOrReferenceType()
const char * GetLocationAsCStringImpl(const Value &value, const DataExtractor &data)
virtual void SetFormat(lldb::Format format)
ValueObject * m_dynamic_value
void ClearDynamicTypeInformation()
bool IsCStringContainer(bool check_pointer=false)
Returns true if this is a char* or a char[] if it is a char* and check_pointer is true,...
virtual bool IsSynthetic()
std::map< ConstString, ValueObject * > m_synthetic_children
llvm::ArrayRef< uint8_t > GetLocalBuffer() const
Returns the local buffer that this ValueObject points to if it's available.
std::optional< lldb::addr_t > GetStrippedPointerValue(lldb::addr_t address)
Remove ptrauth bits from address if the type has a ptrauth qualifier.
const ExecutionContextRef & GetExecutionContextRef() const
virtual AddrAndType GetAddressOf(bool scalar_is_load_address=true)
uint32_t GetNumChildrenIgnoringErrors(uint32_t max=UINT32_MAX)
Like GetNumChildren but returns 0 on error.
virtual bool CanProvideValue()
UserID m_id
Unique identifier for every value object.
const Value & GetValue() const
virtual lldb::LanguageType GetPreferredDisplayLanguage()
lldb::ValueObjectSP GetValueForExpressionPath_Impl(llvm::StringRef expression_cstr, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target)
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type, bool do_deref=true, ValueObject *parent=nullptr)
Given an address either create a value object containing the value at that address,...
const Scalar & GetScalar() const
See comment on m_scalar to understand what GetScalar returns.
Status GetValueAsData(ExecutionContext *exe_ctx, DataExtractor &data, Module *module)
RegisterInfo * GetRegisterInfo() const
ValueType
Type that describes Value::m_value.
@ HostAddress
A host address value (for memory in the process that < A is using liblldb).
@ FileAddress
A file address value.
@ LoadAddress
A load address value.
@ Scalar
A raw scalar value.
ValueType GetValueType() const
Scalar & ResolveValue(ExecutionContext *exe_ctx, Module *module=nullptr)
@ RegisterInfo
RegisterInfo * (can be a scalar or a vector register).
ContextType GetContextType() const
const CompilerType & GetCompilerType()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
@ DoNoSelectMostRelevantFrame
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< SummaryStatistics > SummaryStatisticsSP
@ eAddressTypeFile
Address is an address as found in an object or symbol file.
@ eAddressTypeLoad
Address is an address as in the current target inferior process.
@ eAddressTypeHost
Address is an address in the process that is running this code.
std::string toString(FormatterBytecode::OpCodes op)
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::TypeFormatImpl > TypeFormatImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ExpressionVariable > ExpressionVariableSP
Format
Display format definitions.
@ eFormatCString
NULL terminated C strings.
@ eFormatCharArray
Print characters with no single quotes, used for character arrays that can contain non printable char...
@ eFormatComplex
Floating point complex type.
@ eFormatOSType
OS character codes encoded into an integer 'PICT' 'text' etc...
@ eFormatCharPrintable
Only printable characters, '.' if not printable.
@ eFormatComplexInteger
Integer complex type.
@ eFormatFloat128
Disambiguate between 128-bit long double (which uses eFormatFloat) and __float128 (which uses eFormat...
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::Process > ProcessSP
Encoding
Register encoding definitions.
@ eEncodingVector
vector registers
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
const char * alt_name
Alternate name of this register, can be NULL.
const char * name
Name of this register, can't be NULL.
lldb::Format format
Default display format.
bool m_is_synthetic_children_generated
SyntheticChildrenTraversal m_synthetic_children_traversal
bool m_check_dot_vs_arrow_syntax
bool m_allow_bitfields_syntax
SyntheticChildrenTraversal