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);
387 if (can_create && !
m_children.HasChildAtIndex(idx)) {
394 if (child !=
nullptr)
395 return child->
GetSP();
402 if (names.size() == 0)
405 for (llvm::StringRef name : names) {
406 root = root->GetChildMemberWithName(name);
414llvm::Expected<size_t>
416 bool omit_empty_base_classes =
true;
418 omit_empty_base_classes);
430 std::vector<uint32_t> child_indexes;
431 bool omit_empty_base_classes =
true;
436 const size_t num_child_indexes =
438 name, omit_empty_base_classes, child_indexes);
439 if (num_child_indexes == 0)
443 for (uint32_t idx : child_indexes)
445 child_sp = child_sp->GetChildAtIndex(idx, can_create);
453 if (
m_flags.m_children_count_valid) {
454 size_t children_count =
m_children.GetChildrenCount();
455 return children_count <= max ? children_count : max;
460 if (!
m_flags.m_children_count_valid) {
462 if (num_children_or_err)
465 return num_children_or_err;
473 return *value_or_err;
480 bool has_children =
false;
483 if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
493 m_flags.m_children_count_valid =
true;
498 bool omit_empty_base_classes =
true;
499 bool ignore_array_bounds =
false;
500 std::string child_name;
501 uint32_t child_byte_size = 0;
502 int32_t child_byte_offset = 0;
503 uint32_t child_bitfield_bit_size = 0;
504 uint32_t child_bitfield_bit_offset = 0;
505 bool child_is_base_class =
false;
506 bool child_is_deref_of_parent =
false;
507 uint64_t language_flags = 0;
508 const bool transparent_pointers =
true;
512 auto child_compiler_type_or_err =
514 &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
515 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
516 child_bitfield_bit_size, child_bitfield_bit_offset,
517 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
518 if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
520 child_compiler_type_or_err.takeError(),
521 "could not find child: {0}");
526 *
this, *child_compiler_type_or_err,
ConstString(child_name),
527 child_byte_size, child_byte_offset, child_bitfield_bit_size,
528 child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
533 bool omit_empty_base_classes =
true;
534 bool ignore_array_bounds =
true;
535 std::string child_name;
536 uint32_t child_byte_size = 0;
537 int32_t child_byte_offset = 0;
538 uint32_t child_bitfield_bit_size = 0;
539 uint32_t child_bitfield_bit_offset = 0;
540 bool child_is_base_class =
false;
541 bool child_is_deref_of_parent =
false;
542 uint64_t language_flags = 0;
543 const bool transparent_pointers =
false;
547 auto child_compiler_type_or_err =
549 &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
550 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
551 child_bitfield_bit_size, child_bitfield_bit_offset,
552 child_is_base_class, child_is_deref_of_parent,
this, language_flags);
553 if (!child_compiler_type_or_err) {
555 child_compiler_type_or_err.takeError(),
556 "could not find child: {0}");
560 if (child_compiler_type_or_err->IsValid()) {
561 child_byte_offset += child_byte_size * idx;
564 *
this, *child_compiler_type_or_err,
ConstString(child_name),
565 child_byte_size, child_byte_offset, child_bitfield_bit_size,
566 child_bitfield_bit_offset, child_is_base_class,
573 return synth_valobj_sp->GetChildAtIndex(idx,
true).get();
579 std::string &destination,
586 std::string &destination,
594 destination =
"<incomplete type>";
600 if (
m_flags.m_is_getting_summary)
603 m_flags.m_is_getting_summary =
true;
627 target_sp->GetSummaryStatisticsCache()
628 .GetSummaryStatisticsForProvider(*summary_ptr);
632 summary_ptr->
FormatObject(
this, destination, actual_options);
634 summary_ptr->
FormatObject(
this, destination, actual_options);
636 m_flags.m_is_getting_summary =
false;
637 return !destination.empty();
660 bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
661 pointee_or_element_compiler_type.
IsCharType());
662 if (!is_char_arr_ptr)
666 if (type_flags.
Test(eTypeIsArray))
673 uint32_t item_count) {
675 const uint32_t type_info =
GetTypeInfo(&pointee_or_element_compiler_type);
676 const bool is_pointer_type = type_info & eTypeIsPointer;
677 const bool is_array_type = type_info & eTypeIsArray;
678 if (!(is_pointer_type || is_array_type))
686 std::optional<uint64_t> item_type_size =
687 llvm::expectedToOptional(pointee_or_element_compiler_type.
GetByteSize(
691 const uint64_t bytes = item_count * *item_type_size;
692 const uint64_t offset = item_idx * *item_type_size;
694 if (item_idx == 0 && item_count == 1)
696 if (is_pointer_type) {
699 if (
error.Fail() || pointee_sp.get() ==
nullptr)
701 return pointee_sp->GetData(data,
error);
704 if (child_sp.get() ==
nullptr)
707 return child_sp->GetData(data,
error);
717 auto [addr, addr_type] =
724 addr = addr + offset;
726 module_sp->ResolveFileAddress(addr, so_addr);
733 if (
error.Success()) {
747 target->ReadMemory(target_addr, heap_buf_ptr->
GetBytes(), bytes,
749 if (
error.Success() || bytes_read > 0) {
758 if (max_bytes && *max_bytes > offset) {
759 size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
763 heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
780 if (
m_data.GetByteSize()) {
804 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
808 switch (value_type) {
814 m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
818 "unable to set scalar value: %s", set_error.
AsCString());
831 if (!
error.Success())
833 if (bytes_written != byte_size) {
843 m_data.SetData(buffer_sp, 0);
845 const_cast<uint8_t *
>(
m_data.GetDataStart()),
846 byte_size,
m_data.GetByteOrder());
866 if ((uint64_t)
m_data.GetDataStart() == start)
869 if ((uint64_t)
m_value.GetBuffer().GetBytes() == start)
870 return m_value.GetBuffer().GetData();
877 llvm::StringRef src = source.
GetString();
878 src = src.rtrim(
'\0');
879 destination = std::make_shared<DataBufferHeap>(src.size(), 0);
880 memcpy(destination->GetBytes(), src.data(), src.size());
884std::pair<size_t, bool>
887 bool was_capped =
false;
893 s <<
"<no target to read from>";
896 return {0, was_capped};
901 size_t bytes_read = 0;
902 size_t total_bytes_read = 0;
907 if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
912 bool capped_data =
false;
913 const bool is_array = type_flags.
Test(eTypeIsArray);
916 uint64_t array_size = 0;
917 if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
918 cstr_len = array_size;
919 if (cstr_len > max_length) {
921 cstr_len = max_length;
930 if (cstr_address.
address == 0 ||
934 if (cstr ==
nullptr) {
935 s <<
"<invalid address>";
938 return {0, was_capped};
940 s << llvm::StringRef(cstr, cstr_len);
942 return {cstr_len, was_capped};
944 s <<
"<invalid address>";
947 return {0, was_capped};
953 if (cstr_len > 0 && honor_array) {
961 total_bytes_read = bytes_read;
962 for (
size_t offset = 0; offset < bytes_read; offset++)
968 cstr_len = max_length;
969 const size_t k_max_buf_size = 64;
973 int cstr_len_displayed = -1;
974 bool capped_cstr =
false;
979 while ((bytes_read =
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
980 total_bytes_read += bytes_read;
981 const char *cstr = data.
PeekCStr(0);
982 size_t len = strnlen(cstr, k_max_buf_size);
983 if (cstr_len_displayed < 0)
984 cstr_len_displayed = len;
988 cstr_len_displayed += len;
989 if (len > bytes_read)
994 for (
size_t offset = 0; offset < bytes_read; offset++)
997 if (len < k_max_buf_size)
1000 if (len >= cstr_len) {
1009 if (cstr_len_displayed >= 0) {
1016 s <<
"<not a string object>";
1019 return {total_bytes_read, was_capped};
1024 return llvm::createStringError(
"could not update value");
1033 return llvm::createStringError(
"no process");
1036 auto get_object_description =
1037 [&](
LanguageType language) -> llvm::Expected<std::string> {
1040 if (llvm::Error
error = runtime->GetObjectDescription(s, *
this))
1045 return llvm::createStringError(
"no native language runtime");
1050 llvm::Expected<std::string> desc = get_object_description(native_language);
1058 llvm::consumeError(desc.takeError());
1065 std::string &destination) {
1073 std::string &destination) {
1085 if (
m_flags.m_is_bitfield_for_scalar)
1091 my_format = reg_info->
format;
1101 format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
1162 return llvm::createStringError(
"type cannot be converted to APSInt");
1170 return llvm::createStringError(
"error occurred; unable to convert to APSInt");
1175 return llvm::createStringError(
"type cannot be converted to APFloat");
1183 return llvm::createStringError(
1184 "error occurred; unable to convert to APFloat");
1193 return value_or_err->getBoolValue();
1198 return value_or_err->isNonZero();
1203 return llvm::createStringError(
"type cannot be converted to bool");
1207 bool can_update_var) {
1222 "Not allowed to update program variables in this case.");
1228 uint64_t byte_size = 0;
1231 byte_size = temp.value();
1232 if (value.getBitWidth() != byte_size * CHAR_BIT) {
1234 "illegal argument: new value should be of the same size");
1239 reinterpret_cast<const void *
>(value.getRawData()), byte_size,
1240 target->GetArchitecture().GetByteOrder(),
1241 static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
1261 "Not allowed to update program variables in this case.");
1266 CompilerType new_val_type = new_val_sp->GetCompilerType();
1270 "illegal argument: new value should be of the same size");
1275 auto value_or_err = new_val_sp->GetValueAsAPSInt();
1281 auto value_or_err = new_val_sp->GetValueAsAPFloat();
1288 bool success =
true;
1289 uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
1292 uint64_t num_bits = 0;
1293 if (
auto temp = llvm::expectedToOptional(
1294 new_val_sp->GetCompilerType().GetBitSize(target.get())))
1295 num_bits = temp.value();
1310 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1317 if (flags.
Test(eTypeIsArray)) {
1343 bool do_dump_error) {
1356 bool allow_special =
1358 const bool only_special =
false;
1360 if (allow_special) {
1361 if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
1374 std::pair<size_t, bool> read_string =
1378 lldb_private::formatters::StringPrinter::
1379 ReadBufferAndDumpToStreamOptions options(*
this);
1383 options.SetStream(&s);
1384 options.SetPrefixToken(
nullptr);
1385 options.SetQuote(
'"');
1386 options.SetSourceSize(buffer_sp->GetByteSize());
1387 options.SetIsTruncated(read_string.second);
1390 lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1392 return !
error.Fail();
1400 if (flags.
Test(eTypeIsArray)) {
1406 for (
size_t low = 0; low < count; low++) {
1413 s <<
"<invalid child>";
1416 child->DumpPrintableRepresentation(
1447 for (
size_t low = 0; low < count; low++) {
1454 s <<
"<invalid child>";
1457 child->DumpPrintableRepresentation(
1490 bool var_success =
false;
1493 llvm::StringRef str;
1504 switch (val_obj_display) {
1516 strm <<
"error: " <<
toString(desc.takeError());
1530 strm.
Printf(
"%" PRIu32, *err);
1533 strm <<
"error: " <<
toString(err.takeError());
1581 else if (val_obj_display ==
1583 s.
PutCString(
"<not a valid Objective-C object>");
1588 s.
PutCString(
"<no printable representation>");
1612 switch (
m_value.GetValueType()) {
1616 if (scalar_is_load_address) {
1625 m_value.GetValueAddressType()};
1629 llvm_unreachable(
"Unhandled value type!");
1636 if (
ABISP abi_sp = process->GetABI())
1637 return abi_sp->FixCodeAddress(address);
1639 return std::nullopt;
1646 switch (
m_value.GetValueType()) {
1661 llvm_unreachable(
"Unhandled value type!");
1665 const char *value_str) {
1667 if (
auto boolean = language->GetBooleanFromString(value_str))
1668 return *
boolean ?
"1" :
"0";
1670 return llvm::StringSwitch<const char *>(value_str)
1673 .Default(value_str);
1687 const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
1693 m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1694 }
else if (byte_size <= 16) {
1703 if (
error.Success()) {
1704 switch (value_type) {
1715 target_addr, new_scalar, byte_size,
error);
1716 if (!
error.Success())
1718 if (bytes_written != byte_size) {
1731 m_data.SetData(buffer_sp, 0);
1732 bool success = new_scalar.
GetData(new_data);
1735 0, byte_size,
const_cast<uint8_t *
>(
m_data.GetDataStart()),
1736 byte_size,
m_data.GetByteOrder());
1774 std::map<ConstString, ValueObject *>::const_iterator pos =
1777 synthetic_child_sp = pos->second->GetSP();
1778 return synthetic_child_sp;
1801 if (runtime->IsAllowedRuntimeValue(
GetName()))
1809 return language->IsNilReference(*
this);
1816 return language->IsUninitializedReference(*
this);
1834 std::string index_str = llvm::formatv(
"[{0}]", index);
1839 if (!synthetic_child_sp) {
1846 if (synthetic_child) {
1848 synthetic_child_sp = synthetic_child->
GetSP();
1849 synthetic_child_sp->SetName(
ConstString(index_str));
1850 synthetic_child_sp->m_flags.m_is_array_item_for_pointer =
true;
1854 return synthetic_child_sp;
1861 std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
1866 if (!synthetic_child_sp) {
1867 uint32_t bit_field_size = to - from + 1;
1868 uint32_t bit_field_offset = from;
1871 llvm::expectedToOptional(
GetByteSize()).value_or(0) * 8 -
1872 bit_field_size - bit_field_offset;
1877 llvm::expectedToOptional(
GetByteSize()).value_or(0), 0,
1882 if (synthetic_child) {
1884 synthetic_child_sp = synthetic_child->
GetSP();
1885 synthetic_child_sp->SetName(
ConstString(index_str));
1886 synthetic_child_sp->m_flags.m_is_bitfield_for_scalar =
true;
1890 return synthetic_child_sp;
1894 uint32_t offset,
const CompilerType &type,
bool can_create,
1899 if (name_const_str.
IsEmpty()) {
1900 name_const_str.
SetString(
"@" + std::to_string(offset));
1907 if (synthetic_child_sp.get())
1908 return synthetic_child_sp;
1914 std::optional<uint64_t> size = llvm::expectedToOptional(
1921 if (synthetic_child) {
1923 synthetic_child_sp = synthetic_child->
GetSP();
1924 synthetic_child_sp->SetName(name_const_str);
1925 synthetic_child_sp->m_flags.m_is_child_at_offset =
true;
1927 return synthetic_child_sp;
1936 if (name_const_str.
IsEmpty()) {
1938 snprintf(name_str,
sizeof(name_str),
"base%s@%i",
1947 if (synthetic_child_sp.get())
1948 return synthetic_child_sp;
1953 const bool is_base_class =
true;
1956 std::optional<uint64_t> size = llvm::expectedToOptional(
1963 if (synthetic_child) {
1965 synthetic_child_sp = synthetic_child->
GetSP();
1966 synthetic_child_sp->SetName(name_const_str);
1968 return synthetic_child_sp;
1976 if (!expression || !expression[0])
1978 if (expression[0] ==
'.')
1979 return expression + 1;
1980 if (expression[0] ==
'-' && expression[1] ==
'>')
1981 return expression + 2;
1993 if (!synthetic_child_sp) {
1997 expression,
nullptr,
nullptr,
2003 if (synthetic_child_sp.get()) {
2007 synthetic_child_sp->SetName(
2011 return synthetic_child_sp;
2016 if (target_sp && !target_sp->GetEnableSyntheticValue()) {
2113 if (
m_flags.m_is_synthetic_children_generated) {
2122 uint64_t load_addr =
2143 if (is_deref_of_parent &&
2175 if (
m_flags.m_is_array_item_for_pointer &&
2180 if (!is_deref_of_parent) {
2182 if (non_base_class_parent &&
2186 if (non_base_class_parent_compiler_type) {
2191 const uint32_t non_base_class_parent_type_info =
2192 non_base_class_parent_compiler_type.
GetTypeInfo();
2194 if (non_base_class_parent_type_info & eTypeIsPointer) {
2196 }
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2197 !(non_base_class_parent_type_info & eTypeIsArray)) {
2210 if (is_deref_of_parent &&
2222 using SynthTraversal =
2226 if (synth_traversal == SynthTraversal::FromSynthetic ||
2227 synth_traversal == SynthTraversal::Both)
2230 if (synth_traversal == SynthTraversal::ToSynthetic ||
2231 synth_traversal == SynthTraversal::Both)
2246 if (!result ||
error.Fail()) {
2249 result = alt_obj->Dereference(
error);
2269 expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2270 final_value_type ? final_value_type : &dummy_final_value_type, options,
2271 final_task_on_target ? final_task_on_target
2272 : &dummy_final_task_on_target);
2274 if (!final_task_on_target ||
2278 if (ret_val.get() &&
2279 ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2283 if ((final_task_on_target ? *final_task_on_target
2284 : dummy_final_task_on_target) ==
2289 if (
error.Fail() || !final_value.get()) {
2293 if (final_value_type)
2297 if (final_task_on_target)
2302 if (*final_task_on_target ==
2306 if (
error.Fail() || !final_value.get()) {
2310 if (final_value_type)
2314 if (final_task_on_target)
2334 llvm::StringRef remainder = expression;
2337 llvm::StringRef temp_expression = remainder;
2339 CompilerType root_compiler_type = root->GetCompilerType();
2341 Flags pointee_compiler_type_info;
2343 Flags root_compiler_type_info(
2344 root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
2345 if (pointee_compiler_type)
2348 if (temp_expression.empty()) {
2353 switch (temp_expression.front()) {
2355 temp_expression = temp_expression.drop_front();
2357 root_compiler_type_info.
Test(eTypeIsPointer))
2367 if (root_compiler_type_info.
Test(eTypeIsObjC) &&
2370 root_compiler_type_info.
Test(eTypeIsPointer) &&
2377 if (!temp_expression.starts_with(
">")) {
2388 temp_expression.front() ==
'.' &&
2389 root_compiler_type_info.
Test(eTypeIsPointer))
2399 temp_expression = temp_expression.drop_front();
2401 size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
2402 if (next_sep_pos == llvm::StringRef::npos) {
2404 llvm::StringRef child_name = temp_expression;
2406 root->GetChildMemberWithName(child_name);
2407 if (!child_valobj_sp) {
2410 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2412 if (child_valobj_sp) {
2416 return child_valobj_sp;
2423 llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2424 llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
2426 ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name);
2427 if (!child_valobj_sp) {
2430 child_valobj_sp = altroot->GetChildMemberWithName(child_name);
2432 if (child_valobj_sp) {
2433 root = child_valobj_sp;
2434 remainder = next_separator;
2443 if (!root_compiler_type_info.
Test(eTypeIsArray) &&
2444 !root_compiler_type_info.
Test(eTypeIsPointer) &&
2445 !root_compiler_type_info.
Test(
2448 if (!root_compiler_type_info.
Test(
2470 if (temp_expression[1] ==
2473 if (!root_compiler_type_info.
Test(eTypeIsArray)) {
2489 size_t close_bracket_position = temp_expression.find(
']', 1);
2490 if (close_bracket_position ==
2491 llvm::StringRef::npos)
2499 llvm::StringRef bracket_expr =
2500 temp_expression.slice(1, close_bracket_position);
2504 assert(!bracket_expr.empty());
2506 if (!bracket_expr.contains(
'-')) {
2510 unsigned long index = 0;
2511 if (bracket_expr.getAsInteger(0, index)) {
2519 if (root_compiler_type_info.
Test(eTypeIsArray)) {
2520 ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
2521 if (!child_valobj_sp)
2522 child_valobj_sp = root->GetSyntheticArrayMember(index,
true);
2523 if (!child_valobj_sp)
2524 if (root->HasSyntheticValue() &&
2525 llvm::expectedToOptional(
2526 root->GetSyntheticValue()->GetNumChildren())
2527 .value_or(0) > index)
2529 root->GetSyntheticValue()->GetChildAtIndex(index);
2530 if (child_valobj_sp) {
2531 root = child_valobj_sp;
2533 temp_expression.substr(close_bracket_position + 1);
2542 }
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
2554 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2558 if (
error.Fail() || !root) {
2568 if (root->GetCompilerType().GetMinimumLanguage() ==
2570 pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
2571 root->HasSyntheticValue() &&
2574 SyntheticChildrenTraversal::ToSynthetic ||
2577 SyntheticChildrenTraversal::Both)) {
2578 root = root->GetSyntheticValue()->GetChildAtIndex(index);
2580 root = root->GetSyntheticArrayMember(index,
true);
2588 temp_expression.substr(close_bracket_position + 1);
2593 }
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
2594 root = root->GetSyntheticBitFieldChild(index, index,
true);
2603 *reason_to_stop = ValueObject::
2604 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2608 }
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
2609 root = root->GetChildAtIndex(index);
2617 temp_expression.substr(close_bracket_position + 1);
2623 SyntheticChildrenTraversal::ToSynthetic ||
2626 SyntheticChildrenTraversal::Both) {
2627 if (root->HasSyntheticValue())
2628 root = root->GetSyntheticValue();
2629 else if (!root->IsSynthetic()) {
2644 root = root->GetChildAtIndex(index);
2652 temp_expression.substr(close_bracket_position + 1);
2664 llvm::StringRef sleft, sright;
2665 unsigned long low_index, high_index;
2666 std::tie(sleft, sright) = bracket_expr.split(
'-');
2667 if (sleft.getAsInteger(0, low_index) ||
2668 sright.getAsInteger(0, high_index)) {
2675 if (low_index > high_index)
2676 std::swap(low_index, high_index);
2678 if (root_compiler_type_info.
Test(
2681 root = root->GetSyntheticBitFieldChild(low_index, high_index,
true);
2688 *reason_to_stop = ValueObject::
2689 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2693 }
else if (root_compiler_type_info.
Test(
2700 pointee_compiler_type_info.
Test(eTypeIsScalar)) {
2704 if (
error.Fail() || !root) {
2787 result_sp =
GetSP();
2790 bool is_synthetic = result_sp->IsSynthetic();
2791 if (synthValue && !is_synthetic) {
2792 if (
auto synth_sp = result_sp->GetSyntheticValue())
2795 if (!synthValue && is_synthetic) {
2796 if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
2797 return non_synth_sp;
2807 std::string deref_name_str;
2808 uint32_t deref_byte_size = 0;
2809 int32_t deref_byte_offset = 0;
2811 uint64_t language_flags = 0;
2817 &exe_ctx, deref_name_str, deref_byte_size, deref_byte_offset,
this,
2820 std::string deref_error;
2821 if (deref_compiler_type_or_err) {
2822 deref_compiler_type = *deref_compiler_type_or_err;
2824 deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
2828 if (deref_compiler_type && deref_byte_size) {
2830 if (!deref_name_str.empty())
2831 deref_name.
SetCString(deref_name_str.c_str());
2835 deref_byte_size, deref_byte_offset, 0, 0,
false,
2848 if (deref_compiler_type) {
2850 if (!deref_name_str.empty())
2851 deref_name.
SetCString(deref_name_str.c_str());
2854 *
this, deref_compiler_type, deref_name, deref_byte_size,
2871 if (deref_error.empty())
2873 "dereference failed: (%s) %s",
2877 "dereference failed: %s: (%s) %s", deref_error.c_str(),
2890 switch (address_type) {
2901 if (compiler_type) {
2902 std::string name(1,
'&');
2903 name.append(
m_name.AsCString(
""));
2921 "'%s' doesn't have a valid address", expr_path_strm.
GetData());
2951 if (llvm::expectedToOptional(compiler_type.
GetByteSize(exe_scope))
2956 return DoCast(compiler_type);
2959 "Can only cast to a type that is equal to or smaller "
2960 "than the orignal type.");
3000 const bool scalar_is_load_address =
true;
3001 auto [addr_value, addr_type] =
GetAddressOf(scalar_is_load_address);
3008 module_sp->ResolveFileAddress(addr_value, tmp_addr);
3020 CompilerType type,
const llvm::ArrayRef<uint32_t> &base_type_indices) {
3025 return llvm::createStringError(
3026 "Invalid target type: should be a pointer or a reference");
3032 auto target_record_type =
3034 auto start_record_type =
3037 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3038 return llvm::createStringError(
3039 "Underlying start & target types should be record types");
3041 if (target_record_type.CompareTypes(start_record_type))
3042 return llvm::createStringError(
3043 "Underlying start & target types should be different");
3045 if (base_type_indices.empty())
3046 return llvm::createStringError(
"children sequence must be non-empty");
3055 for (
const uint32_t i : base_type_indices)
3058 inner_value->GetChildAtIndex(i,
true);
3062 CompilerType inner_value_type = inner_value->GetCompilerType();
3065 return llvm::createStringError(
3066 "casted value doesn't match the desired type");
3068 uintptr_t addr = inner_value->GetLoadAddress();
3069 llvm::StringRef name =
"";
3077 return llvm::createStringError(
3078 "casted value doesn't match the desired type");
3083llvm::Expected<lldb::ValueObjectSP>
3089 return llvm::createStringError(
3090 "Invalid target type: should be a pointer or a reference");
3096 auto target_record_type =
3098 auto start_record_type =
3101 if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
3102 return llvm::createStringError(
3103 "Underlying start & target types should be record types");
3105 if (target_record_type.CompareTypes(start_record_type))
3106 return llvm::createStringError(
3107 "Underlying start & target types should be different");
3110 if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
3112 return llvm::createStringError(
"virtual base should be valid");
3113 return llvm::createStringError(
3130 llvm::StringRef name =
"";
3133 name, addr - offset, exe_ctx, pointer_type,
false);
3141 return value->Dereference(
error);
3158 if (!is_scalar && !is_enum && !is_pointer)
3164 uint64_t type_byte_size = 0;
3165 uint64_t val_byte_size = 0;
3166 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3167 type_byte_size = temp.value();
3170 val_byte_size = temp.value();
3177 if (!type.
IsBoolean() && type_byte_size < val_byte_size)
3181 "target type cannot be smaller than the pointer type"));
3185 if (!is_scalar || is_integer)
3189 else if (is_scalar && is_float) {
3191 if (float_value_or_err)
3194 !float_value_or_err->isZero(),
"result");
3199 "cannot get value as APFloat: %s",
3200 llvm::toString(float_value_or_err.takeError()).c_str()));
3205 if (!is_scalar || is_integer) {
3207 if (int_value_or_err) {
3211 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3218 "cannot get value as APSInt: %s",
3219 llvm::toString(int_value_or_err.takeError()).c_str()));
3220 }
else if (is_scalar && is_float) {
3224 if (float_value_or_err) {
3225 llvm::APFloatBase::opStatus status =
3226 float_value_or_err->convertToInteger(
3227 integer, llvm::APFloat::rmTowardZero, &is_exact);
3231 if (status & llvm::APFloatBase::opInvalidOp)
3235 "invalid type cast detected: %s",
3236 llvm::toString(float_value_or_err.takeError()).c_str()));
3246 if (int_value_or_err) {
3248 int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
3258 "cannot get value as APSInt: %s",
3259 llvm::toString(int_value_or_err.takeError()).c_str()));
3264 if (int_value_or_err) {
3265 Scalar scalar_int(*int_value_or_err);
3274 "cannot get value as APSInt: %s",
3275 llvm::toString(int_value_or_err.takeError()).c_str()));
3280 if (float_value_or_err) {
3281 Scalar scalar_float(*float_value_or_err);
3290 "cannot get value as APFloat: %s",
3291 llvm::toString(float_value_or_err.takeError()).c_str()));
3308 if (!is_enum && !is_integer && !is_float)
3312 "argument must be an integer, a float, or an enum"));
3320 uint64_t byte_size = 0;
3321 if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
3322 byte_size = temp.value();
3329 llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
3330 integer, llvm::APFloat::rmTowardZero, &is_exact);
3334 if (status & llvm::APFloatBase::opInvalidOp)
3338 "invalid type cast detected: %s",
3339 llvm::toString(value_or_err.takeError()).c_str()));
3350 llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
3357 "cannot get value as APSInt: %s",
3358 llvm::toString(value_or_err.takeError()).c_str()));
3376 process_sp = target_sp->GetProcessSP();
3386 thread_sp = process_sp->GetThreadList().GetSelectedThread();
3419 bool accept_invalid_exe_ctx) {
3422 const bool thread_and_frame_only_if_stopped =
true;
3431 if (process ==
nullptr)
3443 bool changed =
false;
3444 const bool was_valid =
m_mod_id.IsValid();
3462 if (!accept_invalid_exe_ctx) {
3471 changed = was_valid;
3477 changed = was_valid;
3518 if (!
m_parent->IsPointerOrReferenceType())
3519 return m_parent->GetSymbolContextScope();
3526 llvm::StringRef expression,
3533 llvm::StringRef name, llvm::StringRef expression,
3539 if (expression.empty())
3541 target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
3542 retval_sp, options);
3543 if (retval_sp && !name.empty())
3554 pointer_type = type;
3562 if (ptr_result_valobj_sp) {
3564 ptr_result_valobj_sp->GetValue().SetValueType(
3568 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3569 if (ptr_result_valobj_sp && !name.empty())
3572 return ptr_result_valobj_sp;
3586 if (new_value_sp && !name.empty())
3588 return new_value_sp;
3594 llvm::StringRef name) {
3595 uint64_t byte_size =
3596 llvm::expectedToOptional(
3600 reinterpret_cast<const void *
>(v.getRawData()), byte_size,
3607 llvm::StringRef name) {
3614 llvm::StringRef name) {
3622 llvm::StringRef name) {
3625 uint64_t byte_size =
3626 llvm::expectedToOptional(type.
GetByteSize(exe_scope)).value_or(0);
3628 reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
3640 uint64_t byte_size = 0;
3641 if (
auto temp = llvm::expectedToOptional(
3643 byte_size = temp.value();
3645 reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
3687 while (with_dv_info) {
3690 with_dv_info = with_dv_info->
m_parent;
3697 while (with_fmt_info) {
3700 with_fmt_info = with_fmt_info->
m_parent;
3712 frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3714 type = cu->GetLanguage();
3746 target_sp->GetPersistentExpressionStateForLanguage(
3749 if (!persistent_state)
3759 persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
3762 return persistent_var_sp->GetValueObject();
3774 if ((
m_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
3808 return target_sp && target_sp->IsValid();
3813 std::unique_lock<std::recursive_mutex> &lock,
Status &
error) {
3821 Target *target = value_sp->GetTargetSP().get();
3823 if (value_sp->GetError().Fail())
3829 lock = std::unique_lock<std::recursive_mutex>(target->
GetAPIMutex());
3831 ProcessSP process_sp(value_sp->GetProcessSP());
3832 if (process_sp && !stop_locker.
TryLock(&process_sp->GetRunLock())) {
3843 value_sp = dynamic_sp;
3849 value_sp = synthetic_sp;
3855 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.
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
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...
static lldb::ValueObjectSP CreateValueObjectFromAPInt(const ExecutionContext &exe_ctx, const llvm::APInt &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APInt value.
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.
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()
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)
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
static lldb::ValueObjectSP CreateValueObjectFromNullptr(const ExecutionContext &exe_ctx, CompilerType type, llvm::StringRef name)
Create a nullptr value object with the specified type (must be a nullptr type).
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)
static lldb::ValueObjectSP CreateValueObjectFromScalar(const ExecutionContext &exe_ctx, Scalar &s, CompilerType type, llvm::StringRef name)
Create a value object containing the given Scalar 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
static lldb::ValueObjectSP CreateValueObjectFromAPFloat(const ExecutionContext &exe_ctx, const llvm::APFloat &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APFloat value.
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.
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)
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)
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
static lldb::ValueObjectSP CreateValueObjectFromBool(const ExecutionContext &exe_ctx, lldb::TypeSystemSP typesystem, bool value, llvm::StringRef name)
Create a value object containing the given boolean 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)
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