22#include "lldb/Host/Config.h" 
   53#include "llvm/Support/Compiler.h" 
   83  m_flags.m_is_synthetic_children_generated =
 
 
  100      const ArchSpec &arch = target_sp->GetArchitecture();
 
 
  113  bool did_change_formats = 
false;
 
  127    if (update_format && !did_change_formats)
 
  141      m_flags.m_old_value_valid = 
false;
 
  143      m_flags.m_old_value_valid = 
true;
 
  158      bool need_compare_checksums = 
false;
 
  159      llvm::SmallVector<uint8_t, 16> old_checksum;
 
  162        need_compare_checksums = 
true;
 
  165                  old_checksum.begin());
 
  174        const uint64_t max_checksum_size = 128;
 
  177        need_compare_checksums = 
false;
 
  181      assert(!need_compare_checksums ||
 
  186      else if (!
m_flags.m_value_did_change && !success) {
 
  190      } 
else if (need_compare_checksums) {
 
 
  205            "[%s %p] checking for FormatManager revisions. ValueObject " 
  206            "rev: %d - Global rev: %d",
 
  207            GetName().GetCString(), 
static_cast<void *
>(
this),
 
  211  bool any_change = 
false;
 
 
  235  m_flags.m_children_count_valid = 
false;
 
  236  m_flags.m_did_calculate_complete_objc_class_type = 
false;
 
 
  247  if (
m_flags.m_did_calculate_complete_objc_class_type) {
 
  251      return compiler_type;
 
  254  m_flags.m_did_calculate_complete_objc_class_type = 
true;
 
  260    return compiler_type;
 
  264    if (std::optional<CompilerType> complete_type =
 
  265            runtime->GetRuntimeType(compiler_type)) {
 
  271  return compiler_type;
 
 
  292      switch (value_type) {
 
  318        sstr.
Printf(
"0x%*.*llx", addr_nibble_size, addr_nibble_size,
 
 
  337      if (bitfield_bit_size)
 
 
  348    LazyBool is_logical_true = language->IsLogicalTrue(*
this, 
error);
 
  349    switch (is_logical_true) {
 
  352      return (is_logical_true == 
true);
 
 
  378    if (can_create && !
m_children.HasChildAtIndex(idx)) {
 
  385    if (child != 
nullptr)
 
  386      return child->
GetSP();
 
 
  393  if (names.size() == 0)
 
  396  for (llvm::StringRef name : names) {
 
  397    root = root->GetChildMemberWithName(name);
 
 
  405llvm::Expected<size_t>
 
  407  bool omit_empty_base_classes = 
true;
 
  409                                                   omit_empty_base_classes);
 
 
  421  std::vector<uint32_t> child_indexes;
 
  422  bool omit_empty_base_classes = 
true;
 
  427  const size_t num_child_indexes =
 
  429          name, omit_empty_base_classes, child_indexes);
 
  430  if (num_child_indexes == 0)
 
  434  for (uint32_t idx : child_indexes)
 
  436      child_sp = child_sp->GetChildAtIndex(idx, can_create);
 
 
  444    if (
m_flags.m_children_count_valid) {
 
  445      size_t children_count = 
m_children.GetChildrenCount();
 
  446      return children_count <= max ? children_count : max;
 
  451  if (!
m_flags.m_children_count_valid) {
 
  453    if (num_children_or_err)
 
  456      return num_children_or_err;
 
 
  464    return *value_or_err;
 
 
  471  bool has_children = 
false;
 
  474    if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
 
 
  484  m_flags.m_children_count_valid = 
true;
 
 
  489  bool omit_empty_base_classes = 
true;
 
  490  bool ignore_array_bounds = 
false;
 
  491  std::string child_name;
 
  492  uint32_t child_byte_size = 0;
 
  493  int32_t child_byte_offset = 0;
 
  494  uint32_t child_bitfield_bit_size = 0;
 
  495  uint32_t child_bitfield_bit_offset = 0;
 
  496  bool child_is_base_class = 
false;
 
  497  bool child_is_deref_of_parent = 
false;
 
  498  uint64_t language_flags = 0;
 
  499  const bool transparent_pointers = 
true;
 
  503  auto child_compiler_type_or_err =
 
  505          &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
 
  506          ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
 
  507          child_bitfield_bit_size, child_bitfield_bit_offset,
 
  508          child_is_base_class, child_is_deref_of_parent, 
this, language_flags);
 
  509  if (!child_compiler_type_or_err || !child_compiler_type_or_err->IsValid()) {
 
  511                   child_compiler_type_or_err.takeError(),
 
  512                   "could not find child: {0}");
 
  517      *
this, *child_compiler_type_or_err, 
ConstString(child_name),
 
  518      child_byte_size, child_byte_offset, child_bitfield_bit_size,
 
  519      child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent,
 
 
  524  bool omit_empty_base_classes = 
true;
 
  525  bool ignore_array_bounds = 
true;
 
  526  std::string child_name;
 
  527  uint32_t child_byte_size = 0;
 
  528  int32_t child_byte_offset = 0;
 
  529  uint32_t child_bitfield_bit_size = 0;
 
  530  uint32_t child_bitfield_bit_offset = 0;
 
  531  bool child_is_base_class = 
false;
 
  532  bool child_is_deref_of_parent = 
false;
 
  533  uint64_t language_flags = 0;
 
  534  const bool transparent_pointers = 
false;
 
  538  auto child_compiler_type_or_err =
 
  540          &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
 
  541          ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
 
  542          child_bitfield_bit_size, child_bitfield_bit_offset,
 
  543          child_is_base_class, child_is_deref_of_parent, 
this, language_flags);
 
  544  if (!child_compiler_type_or_err) {
 
  546                   child_compiler_type_or_err.takeError(),
 
  547                   "could not find child: {0}");
 
  551  if (child_compiler_type_or_err->IsValid()) {
 
  552    child_byte_offset += child_byte_size * idx;
 
  555        *
this, *child_compiler_type_or_err, 
ConstString(child_name),
 
  556        child_byte_size, child_byte_offset, child_bitfield_bit_size,
 
  557        child_bitfield_bit_offset, child_is_base_class,
 
  564    return synth_valobj_sp->GetChildAtIndex(idx, 
true).get();
 
 
  570                                      std::string &destination,
 
 
  577                                      std::string &destination,
 
  585    destination = 
"<incomplete type>";
 
  591  if ( 
m_flags.m_is_getting_summary)
 
  594  m_flags.m_is_getting_summary = 
true;
 
  618          target_sp->GetSummaryStatisticsCache()
 
  619              .GetSummaryStatisticsForProvider(*summary_ptr);
 
  623      summary_ptr->
FormatObject(
this, destination, actual_options);
 
  625      summary_ptr->
FormatObject(
this, destination, actual_options);
 
  627  m_flags.m_is_getting_summary = 
false;
 
  628  return !destination.empty();
 
 
  651  bool is_char_arr_ptr(type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
 
  652                       pointee_or_element_compiler_type.
IsCharType());
 
  653  if (!is_char_arr_ptr)
 
  657  if (type_flags.
Test(eTypeIsArray))
 
 
  664                                   uint32_t item_count) {
 
  666  const uint32_t type_info = 
GetTypeInfo(&pointee_or_element_compiler_type);
 
  667  const bool is_pointer_type = type_info & eTypeIsPointer;
 
  668  const bool is_array_type = type_info & eTypeIsArray;
 
  669  if (!(is_pointer_type || is_array_type))
 
  677  std::optional<uint64_t> item_type_size =
 
  678      llvm::expectedToOptional(pointee_or_element_compiler_type.
GetByteSize(
 
  682  const uint64_t bytes = item_count * *item_type_size;
 
  683  const uint64_t offset = item_idx * *item_type_size;
 
  685  if (item_idx == 0 && item_count == 1) 
 
  687    if (is_pointer_type) {
 
  690      if (
error.Fail() || pointee_sp.get() == 
nullptr)
 
  692      return pointee_sp->GetData(data, 
error);
 
  695      if (child_sp.get() == 
nullptr)
 
  698      return child_sp->GetData(data, 
error);
 
  708    auto [addr, addr_type] =
 
  715        addr = addr + offset;
 
  717        module_sp->ResolveFileAddress(addr, so_addr);
 
  724          if (
error.Success()) {
 
  738            target->ReadMemory(target_addr, heap_buf_ptr->
GetBytes(), bytes,
 
  740        if (
error.Success() || bytes_read > 0) {
 
  749      if (max_bytes && *max_bytes > offset) {
 
  750        size_t bytes_read = std::min<uint64_t>(*max_bytes - offset, bytes);
 
  754        heap_buf_ptr->
CopyData((uint8_t *)(addr + offset), bytes_read);
 
 
  771    if (
m_data.GetByteSize()) {
 
 
  796  const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
 
  800  switch (value_type) {
 
  806        m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
 
  810          "unable to set scalar value: %s", set_error.
AsCString());
 
  823      if (!
error.Success())
 
  825      if (bytes_written != byte_size) {
 
  835    m_data.SetData(buffer_sp, 0);
 
  837                             const_cast<uint8_t *
>(
m_data.GetDataStart()),
 
  838                             byte_size, 
m_data.GetByteOrder());
 
 
  858  if ((uint64_t)
m_data.GetDataStart() == start)
 
  861  if ((uint64_t)
m_value.GetBuffer().GetBytes() == start)
 
  862    return m_value.GetBuffer().GetData();
 
 
  869  llvm::StringRef src = source.
GetString();
 
  870  src = src.rtrim(
'\0');
 
  871  destination = std::make_shared<DataBufferHeap>(src.size(), 0);
 
  872  memcpy(destination->GetBytes(), src.data(), src.size());
 
 
  876std::pair<size_t, bool>
 
  879  bool was_capped = 
false;
 
  885    s << 
"<no target to read from>";
 
  888    return {0, was_capped};
 
  893  size_t bytes_read = 0;
 
  894  size_t total_bytes_read = 0;
 
  899  if (type_flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
 
  904    bool capped_data = 
false;
 
  905    const bool is_array = type_flags.
Test(eTypeIsArray);
 
  908      uint64_t array_size = 0;
 
  909      if (compiler_type.
IsArrayType(
nullptr, &array_size)) {
 
  910        cstr_len = array_size;
 
  911        if (cstr_len > max_length) {
 
  913          cstr_len = max_length;
 
  922    if (cstr_address.
address == 0 ||
 
  926        if (cstr == 
nullptr) {
 
  927          s << 
"<invalid address>";
 
  930          return {0, was_capped};
 
  932        s << llvm::StringRef(cstr, cstr_len);
 
  934        return {cstr_len, was_capped};
 
  936        s << 
"<invalid address>";
 
  939        return {0, was_capped};
 
  945    if (cstr_len > 0 && honor_array) {
 
  953        total_bytes_read = bytes_read;
 
  954        for (
size_t offset = 0; offset < bytes_read; offset++)
 
  960      cstr_len = max_length;
 
  961      const size_t k_max_buf_size = 64;
 
  965      int cstr_len_displayed = -1;
 
  966      bool capped_cstr = 
false;
 
  971      while ((bytes_read = 
GetPointeeData(data, offset, k_max_buf_size)) > 0) {
 
  972        total_bytes_read += bytes_read;
 
  973        const char *cstr = data.
PeekCStr(0);
 
  974        size_t len = strnlen(cstr, k_max_buf_size);
 
  975        if (cstr_len_displayed < 0)
 
  976          cstr_len_displayed = len;
 
  980        cstr_len_displayed += len;
 
  981        if (len > bytes_read)
 
  986        for (
size_t offset = 0; offset < bytes_read; offset++)
 
  989        if (len < k_max_buf_size)
 
  992        if (len >= cstr_len) {
 
 1001      if (cstr_len_displayed >= 0) {
 
 1008    s << 
"<not a string object>";
 
 1011  return {total_bytes_read, was_capped};
 
 
 1016    return llvm::createStringError(
"could not update value");
 
 1025    return llvm::createStringError(
"no process");
 
 1028  auto get_object_description =
 
 1029      [&](
LanguageType language) -> llvm::Expected<std::string> {
 
 1032      if (llvm::Error 
error = runtime->GetObjectDescription(s, *
this))
 
 1037    return llvm::createStringError(
"no native language runtime");
 
 1042  llvm::Expected<std::string> desc = get_object_description(native_language);
 
 1050    llvm::consumeError(desc.takeError());
 
 
 1057                                    std::string &destination) {
 
 
 1065                                    std::string &destination) {
 
 
 1077        if (
m_flags.m_is_bitfield_for_scalar)
 
 1083              my_format = reg_info->
format;
 
 1093        format_sp = std::make_shared<TypeFormatImpl_Format>(my_format);
 
 
 1154    return llvm::make_error<llvm::StringError>(
 
 1155        "type cannot be converted to APSInt", llvm::inconvertibleErrorCode());
 
 1163  return llvm::make_error<llvm::StringError>(
 
 1164      "error occurred; unable to convert to APSInt",
 
 1165      llvm::inconvertibleErrorCode());
 
 
 1170    return llvm::make_error<llvm::StringError>(
 
 1171        "type cannot be converted to APFloat", llvm::inconvertibleErrorCode());
 
 1179  return llvm::make_error<llvm::StringError>(
 
 1180      "error occurred; unable to convert to APFloat",
 
 1181      llvm::inconvertibleErrorCode());
 
 
 1190      return value_or_err->getBoolValue();
 
 1195      return value_or_err->isNonZero();
 
 1200  return llvm::make_error<llvm::StringError>(
"type cannot be converted to bool",
 
 1201                                             llvm::inconvertibleErrorCode());
 
 
 1219        "current value object is not a temporary object");
 
 1225  uint64_t byte_size = 0;
 
 1228    byte_size = temp.value();
 
 1229  if (value.getBitWidth() != byte_size * CHAR_BIT) {
 
 1231        "illegal argument: new value should be of the same size");
 
 1236  data_sp->SetData(value.getRawData(), byte_size,
 
 1237                   target->GetArchitecture().GetByteOrder());
 
 1238  data_sp->SetAddressByteSize(
 
 1239      static_cast<uint8_t
>(target->GetArchitecture().GetAddressByteSize()));
 
 
 1259        "current value object is not a temporary object");
 
 1264  CompilerType new_val_type = new_val_sp->GetCompilerType();
 
 1268        "illegal argument: new value should be of the same size");
 
 1273    auto value_or_err = new_val_sp->GetValueAsAPSInt();
 
 1278  } 
else if (new_val_type.
IsFloat()) {
 
 1279    auto value_or_err = new_val_sp->GetValueAsAPFloat();
 
 1285    bool success = 
true;
 
 1286    uint64_t int_val = new_val_sp->GetValueAsUnsigned(0, &success);
 
 1289      uint64_t num_bits = 0;
 
 1290      if (
auto temp = llvm::expectedToOptional(
 
 1291              new_val_sp->GetCompilerType().GetBitSize(target.get())))
 
 1292        num_bits = temp.value();
 
 
 1306  if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
 
 1313    if (flags.
Test(eTypeIsArray)) {
 
 
 1339    bool do_dump_error) {
 
 1352  bool allow_special =
 
 1354  const bool only_special = 
false;
 
 1356  if (allow_special) {
 
 1357    if (flags.
AnySet(eTypeIsArray | eTypeIsPointer) &&
 
 1370        std::pair<size_t, bool> read_string =
 
 1374        lldb_private::formatters::StringPrinter::
 
 1375            ReadBufferAndDumpToStreamOptions options(*
this);
 
 1379        options.SetStream(&s);
 
 1380        options.SetPrefixToken(
nullptr);
 
 1381        options.SetQuote(
'"');
 
 1382        options.SetSourceSize(buffer_sp->GetByteSize());
 
 1383        options.SetIsTruncated(read_string.second);
 
 1386            lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
 
 1388        return !
error.Fail();
 
 1396      if (flags.
Test(eTypeIsArray)) {
 
 1402          for (
size_t low = 0; low < count; low++) {
 
 1409              s << 
"<invalid child>";
 
 1412            child->DumpPrintableRepresentation(
 
 1443          for (
size_t low = 0; low < count; low++) {
 
 1450              s << 
"<invalid child>";
 
 1453            child->DumpPrintableRepresentation(
 
 1486  bool var_success = 
false;
 
 1489    llvm::StringRef str;
 
 1500    switch (val_obj_display) {
 
 1512        strm << 
"error: " << 
toString(desc.takeError());
 
 1526        strm.
Printf(
"%" PRIu32, *err);
 
 1529        strm << 
"error: " << 
toString(err.takeError());
 
 1578      else if (val_obj_display ==
 
 1580        s.
PutCString(
"<not a valid Objective-C object>"); 
 
 1585        s.
PutCString(
"<no printable representation>");
 
 
 1609  switch (
m_value.GetValueType()) {
 
 1613    if (scalar_is_load_address) {
 
 1622            m_value.GetValueAddressType()};
 
 1626  llvm_unreachable(
"Unhandled value type!");
 
 
 1633  switch (
m_value.GetValueType()) {
 
 1648  llvm_unreachable(
"Unhandled value type!");
 
 
 1652                                  const char *value_str) {
 
 1654    if (
auto boolean = language->GetBooleanFromString(value_str))
 
 1655      return *
boolean ? 
"1" : 
"0";
 
 1657  return llvm::StringSwitch<const char *>(value_str)
 
 1660      .Default(value_str);
 
 
 1675  const size_t byte_size = llvm::expectedToOptional(
GetByteSize()).value_or(0);
 
 1681    m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
 
 1682  } 
else if (byte_size <= 16) {
 
 1691    if (
error.Success()) {
 
 1692      switch (value_type) {
 
 1703              target_addr, new_scalar, byte_size, 
error);
 
 1704          if (!
error.Success())
 
 1706          if (bytes_written != byte_size) {
 
 1719        m_data.SetData(buffer_sp, 0);
 
 1720        bool success = new_scalar.
GetData(new_data);
 
 1723              0, byte_size, 
const_cast<uint8_t *
>(
m_data.GetDataStart()),
 
 1724              byte_size, 
m_data.GetByteOrder());
 
 
 1762  std::map<ConstString, ValueObject *>::const_iterator pos =
 
 1765    synthetic_child_sp = pos->second->GetSP();
 
 1766  return synthetic_child_sp;
 
 
 1789    if (runtime->IsAllowedRuntimeValue(
GetName()))
 
 
 1797    return language->IsNilReference(*
this);
 
 
 1804    return language->IsUninitializedReference(*
this);
 
 
 1822    std::string index_str = llvm::formatv(
"[{0}]", index);
 
 1827    if (!synthetic_child_sp) {
 
 1834      if (synthetic_child) {
 
 1836        synthetic_child_sp = synthetic_child->
GetSP();
 
 1837        synthetic_child_sp->SetName(
ConstString(index_str));
 
 1838        synthetic_child_sp->m_flags.m_is_array_item_for_pointer = 
true;
 
 1842  return synthetic_child_sp;
 
 
 1849    std::string index_str = llvm::formatv(
"[{0}-{1}]", from, to);
 
 1854    if (!synthetic_child_sp) {
 
 1855      uint32_t bit_field_size = to - from + 1;
 
 1856      uint32_t bit_field_offset = from;
 
 1859            llvm::expectedToOptional(
GetByteSize()).value_or(0) * 8 -
 
 1860            bit_field_size - bit_field_offset;
 
 1865          llvm::expectedToOptional(
GetByteSize()).value_or(0), 0,
 
 1870      if (synthetic_child) {
 
 1872        synthetic_child_sp = synthetic_child->
GetSP();
 
 1873        synthetic_child_sp->SetName(
ConstString(index_str));
 
 1874        synthetic_child_sp->m_flags.m_is_bitfield_for_scalar = 
true;
 
 1878  return synthetic_child_sp;
 
 
 1882    uint32_t offset, 
const CompilerType &type, 
bool can_create,
 
 1887  if (name_const_str.
IsEmpty()) {
 
 1888    name_const_str.
SetString(
"@" + std::to_string(offset));
 
 1895  if (synthetic_child_sp.get())
 
 1896    return synthetic_child_sp;
 
 1902  std::optional<uint64_t> size = llvm::expectedToOptional(
 
 1909  if (synthetic_child) {
 
 1911    synthetic_child_sp = synthetic_child->
GetSP();
 
 1912    synthetic_child_sp->SetName(name_const_str);
 
 1913    synthetic_child_sp->m_flags.m_is_child_at_offset = 
true;
 
 1915  return synthetic_child_sp;
 
 
 1924  if (name_const_str.
IsEmpty()) {
 
 1926    snprintf(name_str, 
sizeof(name_str), 
"base%s@%i",
 
 1935  if (synthetic_child_sp.get())
 
 1936    return synthetic_child_sp;
 
 1941  const bool is_base_class = 
true;
 
 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);
 
 1956  return synthetic_child_sp;
 
 
 1964  if (!expression || !expression[0])
 
 1966  if (expression[0] == 
'.')
 
 1967    return expression + 1;
 
 1968  if (expression[0] == 
'-' && expression[1] == 
'>')
 
 1969    return expression + 2;
 
 
 1981  if (!synthetic_child_sp) {
 
 1985        expression, 
nullptr, 
nullptr,
 
 1991    if (synthetic_child_sp.get()) {
 
 1995      synthetic_child_sp->SetName(
 
 1999  return synthetic_child_sp;
 
 
 2004  if (target_sp && !target_sp->GetEnableSyntheticValue()) {
 
 
 2101  if (
m_flags.m_is_synthetic_children_generated) {
 
 2110        uint64_t load_addr =
 
 2131  if (is_deref_of_parent &&
 
 2149  if (
m_flags.m_is_array_item_for_pointer &&
 
 2154    if (!is_deref_of_parent) {
 
 2156      if (non_base_class_parent &&
 
 2160        if (non_base_class_parent_compiler_type) {
 
 2165            const uint32_t non_base_class_parent_type_info =
 
 2166                non_base_class_parent_compiler_type.
GetTypeInfo();
 
 2168            if (non_base_class_parent_type_info & eTypeIsPointer) {
 
 2170            } 
else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
 
 2171                       !(non_base_class_parent_type_info & eTypeIsArray)) {
 
 2184  if (is_deref_of_parent &&
 
 
 2196  using SynthTraversal =
 
 2200    if (synth_traversal == SynthTraversal::FromSynthetic ||
 
 2201        synth_traversal == SynthTraversal::Both)
 
 2204    if (synth_traversal == SynthTraversal::ToSynthetic ||
 
 2205        synth_traversal == SynthTraversal::Both)
 
 
 2220  if (!result || 
error.Fail()) {
 
 2223      result = alt_obj->Dereference(
error);
 
 
 2243      expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
 
 2244      final_value_type ? final_value_type : &dummy_final_value_type, options,
 
 2245      final_task_on_target ? final_task_on_target
 
 2246                           : &dummy_final_task_on_target);
 
 2248  if (!final_task_on_target ||
 
 2252  if (ret_val.get() &&
 
 2253      ((final_value_type ? *final_value_type : dummy_final_value_type) ==
 
 2257    if ((final_task_on_target ? *final_task_on_target
 
 2258                              : dummy_final_task_on_target) ==
 
 2263      if (
error.Fail() || !final_value.get()) {
 
 2267        if (final_value_type)
 
 2271        if (final_task_on_target)
 
 2276    if (*final_task_on_target ==
 
 2280      if (
error.Fail() || !final_value.get()) {
 
 2284        if (final_value_type)
 
 2288        if (final_task_on_target)
 
 
 2308  llvm::StringRef remainder = expression;
 
 2311    llvm::StringRef temp_expression = remainder;
 
 2313    CompilerType root_compiler_type = root->GetCompilerType();
 
 2315    Flags pointee_compiler_type_info;
 
 2317    Flags root_compiler_type_info(
 
 2318        root_compiler_type.
GetTypeInfo(&pointee_compiler_type));
 
 2319    if (pointee_compiler_type)
 
 2322    if (temp_expression.empty()) {
 
 2327    switch (temp_expression.front()) {
 
 2329      temp_expression = temp_expression.drop_front();
 
 2331          root_compiler_type_info.
Test(eTypeIsPointer)) 
 
 2341      if (root_compiler_type_info.
Test(eTypeIsObjC) && 
 
 2344          root_compiler_type_info.
Test(eTypeIsPointer) &&
 
 2351      if (!temp_expression.starts_with(
">")) {
 
 2362          temp_expression.front() == 
'.' &&
 
 2363          root_compiler_type_info.
Test(eTypeIsPointer)) 
 
 2373      temp_expression = temp_expression.drop_front(); 
 
 2375      size_t next_sep_pos = temp_expression.find_first_of(
"-.[", 1);
 
 2376      if (next_sep_pos == llvm::StringRef::npos) {
 
 2378        llvm::StringRef child_name = temp_expression;
 
 2380            root->GetChildMemberWithName(child_name);
 
 2381        if (!child_valobj_sp) {
 
 2384            child_valobj_sp = altroot->GetChildMemberWithName(child_name);
 
 2386        if (child_valobj_sp) {
 
 2390          return child_valobj_sp;
 
 2397      llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
 
 2398      llvm::StringRef child_name = temp_expression.slice(0, next_sep_pos);
 
 2400      ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name);
 
 2401      if (!child_valobj_sp) {
 
 2404          child_valobj_sp = altroot->GetChildMemberWithName(child_name);
 
 2406      if (child_valobj_sp) {
 
 2407        root = child_valobj_sp;
 
 2408        remainder = next_separator;
 
 2417      if (!root_compiler_type_info.
Test(eTypeIsArray) &&
 
 2418          !root_compiler_type_info.
Test(eTypeIsPointer) &&
 
 2419          !root_compiler_type_info.
Test(
 
 2422        if (!root_compiler_type_info.
Test(
 
 2444      if (temp_expression[1] ==
 
 2447        if (!root_compiler_type_info.
Test(eTypeIsArray)) {
 
 2463      size_t close_bracket_position = temp_expression.find(
']', 1);
 
 2464      if (close_bracket_position ==
 
 2465          llvm::StringRef::npos) 
 
 2473      llvm::StringRef bracket_expr =
 
 2474          temp_expression.slice(1, close_bracket_position);
 
 2478      assert(!bracket_expr.empty());
 
 2480      if (!bracket_expr.contains(
'-')) {
 
 2484        unsigned long index = 0;
 
 2485        if (bracket_expr.getAsInteger(0, index)) {
 
 2493        if (root_compiler_type_info.
Test(eTypeIsArray)) {
 
 2494          ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index);
 
 2495          if (!child_valobj_sp)
 
 2496            child_valobj_sp = root->GetSyntheticArrayMember(index, 
true);
 
 2497          if (!child_valobj_sp)
 
 2498            if (root->HasSyntheticValue() &&
 
 2499                llvm::expectedToStdOptional(
 
 2500                    root->GetSyntheticValue()->GetNumChildren())
 
 2501                        .value_or(0) > index)
 
 2503                  root->GetSyntheticValue()->GetChildAtIndex(index);
 
 2504          if (child_valobj_sp) {
 
 2505            root = child_valobj_sp;
 
 2507                temp_expression.substr(close_bracket_position + 1); 
 
 2516        } 
else if (root_compiler_type_info.
Test(eTypeIsPointer)) {
 
 2528              pointee_compiler_type_info.
Test(eTypeIsScalar)) {
 
 2532            if (
error.Fail() || !root) {
 
 2542            if (root->GetCompilerType().GetMinimumLanguage() ==
 
 2544                pointee_compiler_type_info.
AllClear(eTypeIsPointer) &&
 
 2545                root->HasSyntheticValue() &&
 
 2548                         SyntheticChildrenTraversal::ToSynthetic ||
 
 2551                         SyntheticChildrenTraversal::Both)) {
 
 2552              root = root->GetSyntheticValue()->GetChildAtIndex(index);
 
 2554              root = root->GetSyntheticArrayMember(index, 
true);
 
 2562                  temp_expression.substr(close_bracket_position + 1); 
 
 2567        } 
else if (root_compiler_type_info.
Test(eTypeIsScalar)) {
 
 2568          root = root->GetSyntheticBitFieldChild(index, index, 
true);
 
 2577            *reason_to_stop = ValueObject::
 
 2578                eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
 
 2582        } 
else if (root_compiler_type_info.
Test(eTypeIsVector)) {
 
 2583          root = root->GetChildAtIndex(index);
 
 2591                temp_expression.substr(close_bracket_position + 1); 
 
 2597                           SyntheticChildrenTraversal::ToSynthetic ||
 
 2600                           SyntheticChildrenTraversal::Both) {
 
 2601          if (root->HasSyntheticValue())
 
 2602            root = root->GetSyntheticValue();
 
 2603          else if (!root->IsSynthetic()) {
 
 2618          root = root->GetChildAtIndex(index);
 
 2626                temp_expression.substr(close_bracket_position + 1); 
 
 2638        llvm::StringRef sleft, sright;
 
 2639        unsigned long low_index, high_index;
 
 2640        std::tie(sleft, sright) = bracket_expr.split(
'-');
 
 2641        if (sleft.getAsInteger(0, low_index) ||
 
 2642            sright.getAsInteger(0, high_index)) {
 
 2649        if (low_index > high_index) 
 
 2650          std::swap(low_index, high_index);
 
 2652        if (root_compiler_type_info.
Test(
 
 2655          root = root->GetSyntheticBitFieldChild(low_index, high_index, 
true);
 
 2662            *reason_to_stop = ValueObject::
 
 2663                eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
 
 2667        } 
else if (root_compiler_type_info.
Test(
 
 2674                   pointee_compiler_type_info.
Test(eTypeIsScalar)) {
 
 2678          if (
error.Fail() || !root) {
 
 
 2761    result_sp = 
GetSP();
 
 2764  bool is_synthetic = result_sp->IsSynthetic();
 
 2765  if (synthValue && !is_synthetic) {
 
 2766    if (
auto synth_sp = result_sp->GetSyntheticValue())
 
 2769  if (!synthValue && is_synthetic) {
 
 2770    if (
auto non_synth_sp = result_sp->GetNonSyntheticValue())
 
 2771      return non_synth_sp;
 
 
 2781  std::string deref_name_str;
 
 2782  uint32_t deref_byte_size = 0;
 
 2783  int32_t deref_byte_offset = 0;
 
 2785  uint64_t language_flags = 0;
 
 2791      &exe_ctx, deref_name_str, deref_byte_size, deref_byte_offset, 
this,
 
 2794  std::string deref_error;
 
 2795  if (deref_compiler_type_or_err) {
 
 2796    deref_compiler_type = *deref_compiler_type_or_err;
 
 2798    deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
 
 2802  if (deref_compiler_type && deref_byte_size) {
 
 2804    if (!deref_name_str.empty())
 
 2805      deref_name.
SetCString(deref_name_str.c_str());
 
 2809                             deref_byte_size, deref_byte_offset, 0, 0, 
false,
 
 2822      if (deref_compiler_type) {
 
 2824        if (!deref_name_str.empty())
 
 2825          deref_name.
SetCString(deref_name_str.c_str());
 
 2828            *
this, deref_compiler_type, deref_name, deref_byte_size,
 
 2845    if (deref_error.empty())
 
 2847          "dereference failed: (%s) %s",
 
 2851          "dereference failed: %s: (%s) %s", deref_error.c_str(),
 
 
 2864    switch (address_type) {
 
 2875      if (compiler_type) {
 
 2876        std::string name(1, 
'&');
 
 2877        name.append(
m_name.AsCString(
""));
 
 2895        "'%s' doesn't have a valid address", expr_path_strm.
GetData());
 
 
 2925  if (llvm::expectedToOptional(compiler_type.
GetByteSize(exe_scope))
 
 2930    return DoCast(compiler_type);
 
 2933      "Can only cast to a type that is equal to or smaller " 
 2934      "than the orignal type.");
 
 
 2974    const bool scalar_is_load_address = 
true;
 
 2975    auto [addr_value, addr_type] = 
GetAddressOf(scalar_is_load_address);
 
 2982        module_sp->ResolveFileAddress(addr_value, tmp_addr);
 
 
 2994    CompilerType type, 
const llvm::ArrayRef<uint32_t> &base_type_indices) {
 
 2999    return llvm::make_error<llvm::StringError>(
 
 3000        "Invalid target type: should be a pointer or a reference",
 
 3001        llvm::inconvertibleErrorCode());
 
 3007  auto target_record_type =
 
 3009  auto start_record_type =
 
 3012  if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
 
 3013    return llvm::make_error<llvm::StringError>(
 
 3014        "Underlying start & target types should be record types",
 
 3015        llvm::inconvertibleErrorCode());
 
 3017  if (target_record_type.CompareTypes(start_record_type))
 
 3018    return llvm::make_error<llvm::StringError>(
 
 3019        "Underlying start & target types should be different",
 
 3020        llvm::inconvertibleErrorCode());
 
 3022  if (base_type_indices.empty())
 
 3023    return llvm::make_error<llvm::StringError>(
 
 3024        "Children sequence must be non-empty", llvm::inconvertibleErrorCode());
 
 3033  for (
const uint32_t i : base_type_indices)
 
 3036        inner_value->GetChildAtIndex(i,  
true);
 
 3040  CompilerType inner_value_type = inner_value->GetCompilerType();
 
 3043      return llvm::make_error<llvm::StringError>(
 
 3044          "casted value doesn't match the desired type",
 
 3045          llvm::inconvertibleErrorCode());
 
 3047    uintptr_t addr = inner_value->GetLoadAddress();
 
 3048    llvm::StringRef name = 
"";
 
 3056    return llvm::make_error<llvm::StringError>(
 
 3057        "casted value doesn't match the desired type",
 
 3058        llvm::inconvertibleErrorCode());
 
 
 3063llvm::Expected<lldb::ValueObjectSP>
 
 3069    return llvm::make_error<llvm::StringError>(
 
 3070        "Invalid target type: should be a pointer or a reference",
 
 3071        llvm::inconvertibleErrorCode());
 
 3077  auto target_record_type =
 
 3079  auto start_record_type =
 
 3082  if (!target_record_type.IsRecordType() || !start_record_type.IsRecordType())
 
 3083    return llvm::make_error<llvm::StringError>(
 
 3084        "Underlying start & target types should be record types",
 
 3085        llvm::inconvertibleErrorCode());
 
 3087  if (target_record_type.CompareTypes(start_record_type))
 
 3088    return llvm::make_error<llvm::StringError>(
 
 3089        "Underlying start & target types should be different",
 
 3090        llvm::inconvertibleErrorCode());
 
 3093  if (target_record_type.IsVirtualBase(start_record_type, &virtual_base)) {
 
 3095      return llvm::make_error<llvm::StringError>(
 
 3096          "virtual base should be valid", llvm::inconvertibleErrorCode());
 
 3097    return llvm::make_error<llvm::StringError>(
 
 3101        llvm::inconvertibleErrorCode());
 
 3114  llvm::StringRef name = 
"";
 
 3117      name, addr - offset, exe_ctx, pointer_type,  
false);
 
 3125  return value->Dereference(
error);
 
 
 3142  if (!is_scalar && !is_enum && !is_pointer)
 
 3148  uint64_t type_byte_size = 0;
 
 3149  uint64_t val_byte_size = 0;
 
 3150  if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
 
 3151    type_byte_size = temp.value();
 
 3154    val_byte_size = temp.value();
 
 3161    if (!type.
IsBoolean() && type_byte_size < val_byte_size)
 
 3165              "target type cannot be smaller than the pointer type"));
 
 3169    if (!is_scalar || is_integer)
 
 3172    else if (is_scalar && is_float) {
 
 3174      if (float_value_or_err)
 
 3176            target, !float_value_or_err->isZero(), 
"result");
 
 3181                "cannot get value as APFloat: %s",
 
 3182                llvm::toString(float_value_or_err.takeError()).c_str()));
 
 3187    if (!is_scalar || is_integer) {
 
 3189      if (int_value_or_err) {
 
 3193            int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
 
 3200                "cannot get value as APSInt: %s",
 
 3201                llvm::toString(int_value_or_err.takeError()).c_str()));
 
 3202    } 
else if (is_scalar && is_float) {
 
 3206      if (float_value_or_err) {
 
 3207        llvm::APFloatBase::opStatus status =
 
 3208            float_value_or_err->convertToInteger(
 
 3209                integer, llvm::APFloat::rmTowardZero, &is_exact);
 
 3213        if (status & llvm::APFloatBase::opInvalidOp)
 
 3217                  "invalid type cast detected: %s",
 
 3218                  llvm::toString(float_value_or_err.takeError()).c_str()));
 
 3228      if (int_value_or_err) {
 
 3230            int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
 
 3240                "cannot get value as APSInt: %s",
 
 3241                llvm::toString(int_value_or_err.takeError()).c_str()));
 
 3246        if (int_value_or_err) {
 
 3247          Scalar scalar_int(*int_value_or_err);
 
 3256                  "cannot get value as APSInt: %s",
 
 3257                  llvm::toString(int_value_or_err.takeError()).c_str()));
 
 3262        if (float_value_or_err) {
 
 3263          Scalar scalar_float(*float_value_or_err);
 
 3272                  "cannot get value as APFloat: %s",
 
 3273                  llvm::toString(float_value_or_err.takeError()).c_str()));
 
 
 3290  if (!is_enum && !is_integer && !is_float)
 
 3294            "argument must be an integer, a float, or an enum"));
 
 3302  uint64_t byte_size = 0;
 
 3303  if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
 
 3304    byte_size = temp.value();
 
 3311      llvm::APFloatBase::opStatus status = value_or_err->convertToInteger(
 
 3312          integer, llvm::APFloat::rmTowardZero, &is_exact);
 
 3316      if (status & llvm::APFloatBase::opInvalidOp)
 
 3320                "invalid type cast detected: %s",
 
 3321                llvm::toString(value_or_err.takeError()).c_str()));
 
 3332      llvm::APSInt ext = value_or_err->extOrTrunc(byte_size * CHAR_BIT);
 
 3339              "cannot get value as APSInt: %s",
 
 3340              llvm::toString(value_or_err.takeError()).c_str()));
 
 
 3358      process_sp = target_sp->GetProcessSP();
 
 3368          thread_sp = process_sp->GetThreadList().GetSelectedThread();
 
 
 3401    bool accept_invalid_exe_ctx) {
 
 3404  const bool thread_and_frame_only_if_stopped = 
true;
 
 3413  if (process == 
nullptr)
 
 3425  bool changed = 
false;
 
 3426  const bool was_valid = 
m_mod_id.IsValid();
 
 3444  if (!accept_invalid_exe_ctx) {
 
 3453            changed = was_valid;
 
 3459        changed = was_valid;
 
 
 3500    if (!
m_parent->IsPointerOrReferenceType())
 
 3501      return m_parent->GetSymbolContextScope();
 
 
 3508                                             llvm::StringRef expression,
 
 
 3515    llvm::StringRef name, llvm::StringRef expression,
 
 3521  if (expression.empty())
 
 3523  target_sp->EvaluateExpression(expression, exe_ctx.
GetFrameSP().get(),
 
 3524                                retval_sp, options);
 
 3525  if (retval_sp && !name.empty())
 
 
 3536      pointer_type = type;
 
 3544      if (ptr_result_valobj_sp) {
 
 3546          ptr_result_valobj_sp->GetValue().SetValueType(
 
 3550          ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
 
 3551        if (ptr_result_valobj_sp && !name.empty())
 
 3554      return ptr_result_valobj_sp;
 
 
 3568  if (new_value_sp && !name.empty())
 
 3570  return new_value_sp;
 
 
 3576                                        llvm::StringRef name) {
 
 3578  uint64_t byte_size = 0;
 
 3579  if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
 
 3580    byte_size = temp.value();
 
 3582      reinterpret_cast<const void *
>(v.getRawData()), byte_size,
 
 
 3589    llvm::StringRef name) {
 
 
 3602                                       llvm::StringRef name) {
 
 3605    for (
auto type_system_sp : target->GetScratchTypeSystems())
 
 3606      if (
auto compiler_type =
 
 3608        target_type = compiler_type;
 
 3613  uint64_t byte_size = 0;
 
 3615          llvm::expectedToOptional(target_type.
GetByteSize(target.get())))
 
 3616    byte_size = temp.value();
 
 3618      reinterpret_cast<const void *
>(&value), byte_size, exe_ctx.
GetByteOrder(),
 
 
 3632  uint64_t byte_size = 0;
 
 3633  if (
auto temp = llvm::expectedToOptional(type.
GetByteSize(target.get())))
 
 3634    byte_size = temp.value();
 
 3636      reinterpret_cast<const void *
>(zero), byte_size, exe_ctx.
GetByteOrder(),
 
 
 3678  while (with_dv_info) {
 
 3681    with_dv_info = with_dv_info->
m_parent;
 
 
 3688  while (with_fmt_info) {
 
 3691    with_fmt_info = with_fmt_info->
m_parent;
 
 
 3703              frame_sp->GetSymbolContext(eSymbolContextCompUnit));
 
 3705            type = cu->GetLanguage();
 
 
 3737      target_sp->GetPersistentExpressionStateForLanguage(
 
 3740  if (!persistent_state)
 
 3750  persistent_var_sp->m_live_sp = persistent_var_sp->m_frozen_sp;
 
 3753  return persistent_var_sp->GetValueObject();
 
 
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERRORV(log, error,...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static user_id_t g_value_obj_uid
static const char * ConvertBoolean(lldb::LanguageType language_type, const char *value_str)
static bool CopyStringDataToBufferSP(const StreamString &source, lldb::WritableDataBufferSP &destination)
static ValueObjectSP DereferenceValueOrAlternate(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal, Status &error)
static ValueObjectSP GetAlternateValue(ValueObject &valobj, ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal synth_traversal)
static const char * SkipLeadingExpressionPathSeparators(const char *expression)
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A class that describes a compilation unit.
Generic representation of a type in a programming language.
bool IsEnumerationType(bool &is_signed) const
lldb::BasicType GetBasicTypeEnumeration() const
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
lldb::Encoding GetEncoding(uint64_t &count) const
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
size_t GetIndexOfChildMemberWithName(llvm::StringRef name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) const
Lookup a child member given a name.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
CompilerType GetNonReferenceType() const
If this type is a reference to a type (L value or R value reference), return a new type with the refe...
ConstString GetTypeName(bool BaseOnly=false) const
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
std::string TypeDescription()
bool IsInteger() const
This is used when you don't care about the signedness of the integer.
llvm::Expected< CompilerType > GetDereferencedType(ExecutionContext *exe_ctx, std::string &deref_name, uint32_t &deref_byte_size, int32_t &deref_byte_offset, ValueObject *valobj, uint64_t &language_flags) const
lldb::Format GetFormat() const
llvm::Expected< CompilerType > GetChildCompilerTypeAtIndex(ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool IsUnscopedEnumerationType() const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
llvm::Expected< uint32_t > GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const
Lookup a child given a name.
bool CompareTypes(CompilerType rhs) const
bool IsScalarType() const
bool IsNullPtrType() const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
void SetCString(const char *cstr)
Set the C string value.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
void SetString(llvm::StringRef s)
const char * GetCString() const
Get the string value as a C string.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t SetByteSize(lldb::offset_t byte_size)
Set the number of bytes in the data buffer.
void CopyData(const void *src, lldb::offset_t src_len)
Makes a copy of the src_len bytes in src.
static lldb::TypeSummaryImplSP GetSummaryFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static lldb::TypeFormatImplSP GetFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static lldb::SyntheticChildrenSP GetSyntheticChildren(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
static uint32_t GetCurrentRevision()
A class that describes the declaration location of a lldb object.
void Clear()
Clear the object's state.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
virtual lldb::TargetSP CalculateTarget()=0
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
uint32_t GetAddressByteSize() const
const lldb::ProcessSP & GetProcessSP() const
Get accessor to get the process shared pointer.
lldb::ByteOrder GetByteOrder() const
const lldb::StackFrameSP & GetFrameSP() const
Get accessor to get the frame shared pointer.
Target * GetTargetPtr() const
Returns a pointer to the target object.
const lldb::ThreadSP & GetThreadSP() const
Get accessor to get the thread shared pointer.
Process * GetProcessPtr() const
Returns a pointer to the process object.
@ EVIsProgramReference
This variable is a reference to a (possibly invalid) area managed by the target program.
bool AllClear(ValueType mask) const
Test if all bits in mask are clear.
void Reset(ValueType flags)
Set accessor for all flags.
bool Test(ValueType bit) const
Test a single flag bit.
bool AnySet(ValueType mask) const
Test one or more flags.
static Language * FindPlugin(lldb::LanguageType language)
static bool LanguageIsCFamily(lldb::LanguageType language)
Equivalent to LanguageIsC||LanguageIsObjC||LanguageIsCPlusPlus.
static bool LanguageIsObjC(lldb::LanguageType language)
virtual lldb::ExpressionVariableSP CreatePersistentVariable(const lldb::ValueObjectSP &valobj_sp)=0
virtual ConstString GetNextPersistentVariableName(bool is_error=false)=0
Return a new persistent variable name with the specified prefix.
uint32_t GetStopID() const
A plug-in interface definition class for debugging a process.
ProcessModID GetModID() const
Get the Modification ID of the process.
bool IsPossibleDynamicValue(ValueObject &in_value)
LanguageRuntime * GetLanguageRuntime(lldb::LanguageType language)
size_t WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error)
Write memory to a process.
size_t WriteScalarToMemory(lldb::addr_t vm_addr, const Scalar &scalar, size_t size, Status &error)
Write all or part of a scalar value to memory.
llvm::APFloat CreateAPFloatFromAPFloat(lldb::BasicType basic_type)
llvm::APFloat CreateAPFloatFromAPSInt(lldb::BasicType basic_type)
unsigned long long ULongLong(unsigned long long fail_value=0) const
llvm::APFloat GetAPFloat() const
long long SLongLong(long long fail_value=0) const
bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset)
Status SetValueFromCString(const char *s, lldb::Encoding encoding, size_t byte_size)
bool GetData(DataExtractor &data) const
Get data with a byte size of GetByteSize().
llvm::APSInt GetAPSInt() const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
const char * AsCString(const char *default_error_str="unknown error") const
Get the error string associated with the current error.
bool Success() const
Test for success condition.
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Basic RAII class to increment the summary count when the call is complete.
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
Defines a symbol context baton that can be handed other debug core functions.
CompileUnit * comp_unit
The CompileUnit for a given query.
uint32_t GetMaximumSizeOfStringSummary() const
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)
static lldb::ValueObjectSP Create(ValueObject &parent, ConstString name, const CompilerType &cast_type)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size, lldb::addr_t address=LLDB_INVALID_ADDRESS)
A ValueObject that represents memory at a given address, viewed as some set lldb type.
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, llvm::StringRef name, const Address &address, lldb::TypeSP &type_sp)
llvm::Error PrintValueObject()
static lldb::ValueObjectSP Create(ValueObject &parent)
bool SyncWithProcessState(bool accept_invalid_exe_ctx)
ExecutionContextRef m_exe_ctx_ref
AddressType m_address_type_of_ptr_or_ref_children
void SetValueIsValid(bool valid)
EvaluationPoint m_update_point
Stores both the stop id and the full context at which this value was last updated.
lldb::TypeSummaryImplSP GetSummaryFormat()
llvm::SmallVector< uint8_t, 16 > m_value_checksum
llvm::Expected< llvm::APFloat > GetValueAsAPFloat()
If the current ValueObject is of an appropriate type, convert the value to an APFloat and return that...
virtual uint32_t GetBitfieldBitSize()
void ClearUserVisibleData(uint32_t items=ValueObject::eClearUserVisibleDataItemsAllStrings)
ValueObject * FollowParentChain(std::function< bool(ValueObject *)>)
Given a ValueObject, loop over itself and its parent, and its parent's parent, .
CompilerType m_override_type
If the type of the value object should be overridden, the type to impose.
lldb::ValueObjectSP Cast(const CompilerType &compiler_type)
const EvaluationPoint & GetUpdatePoint() const
void AddSyntheticChild(ConstString key, ValueObject *valobj)
virtual uint64_t GetData(DataExtractor &data, Status &error)
uint32_t m_last_format_mgr_revision
friend class ValueObjectSynthetic
bool DumpPrintableRepresentation(Stream &s, ValueObjectRepresentationStyle val_obj_display=eValueObjectRepresentationStyleSummary, lldb::Format custom_format=lldb::eFormatInvalid, PrintableRepresentationSpecialCases special=PrintableRepresentationSpecialCases::eAllow, bool do_dump_error=true)
ValueObject * m_deref_valobj
virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx, bool can_create=true)
virtual lldb::DynamicValueType GetDynamicValueTypeImpl()
static lldb::ValueObjectSP CreateValueObjectFromBool(lldb::TargetSP target, bool value, llvm::StringRef name)
Create a value object containing the given boolean value.
PrintableRepresentationSpecialCases
virtual bool GetIsConstant() const
virtual bool MightHaveChildren()
Find out if a ValueObject might have children.
static lldb::ValueObjectSP CreateValueObjectFromExpression(llvm::StringRef name, llvm::StringRef expression, const ExecutionContext &exe_ctx)
virtual bool IsDereferenceOfParent()
CompilerType GetCompilerType()
virtual llvm::Expected< size_t > GetIndexOfChildWithName(llvm::StringRef name)
virtual ValueObject * CreateSyntheticArrayMember(size_t idx)
Should only be called by ValueObject::GetSyntheticArrayMember().
void SetValueFormat(lldb::TypeFormatImplSP format)
virtual void CalculateSyntheticValue()
void SetPreferredDisplayLanguage(lldb::LanguageType lt)
struct lldb_private::ValueObject::Bitflags m_flags
ClusterManager< ValueObject > ValueObjectManager
ValueObject(ExecutionContextScope *exe_scope, ValueObjectManager &manager, AddressType child_ptr_or_ref_addr_type=eAddressTypeLoad)
Use this constructor to create a "root variable object".
std::string m_summary_str
Cached summary string that will get cleared if/when the value is updated.
virtual lldb::ValueObjectSP DoCast(const CompilerType &compiler_type)
lldb::ValueObjectSP GetSP()
ChildrenManager m_children
virtual lldb::ValueObjectSP CastPointerType(const char *name, CompilerType &ast_type)
Status m_error
An error object that can describe any errors that occur when updating values.
virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx=0, uint32_t item_count=1)
lldb::ValueObjectSP GetSyntheticValue()
static lldb::ValueObjectSP CreateValueObjectFromAPFloat(lldb::TargetSP target, const llvm::APFloat &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APFloat value.
ValueObjectManager * m_manager
This object is managed by the root object (any ValueObject that gets created without a parent....
lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to, bool can_create)
lldb::ProcessSP GetProcessSP() const
lldb::ValueObjectSP GetSyntheticChild(ConstString key) const
ExpressionPathScanEndReason
@ eExpressionPathScanEndReasonArrowInsteadOfDot
-> used when . should be used.
@ eExpressionPathScanEndReasonDereferencingFailed
Impossible to apply * operator.
@ eExpressionPathScanEndReasonNoSuchChild
Child element not found.
@ eExpressionPathScanEndReasonUnknown
@ eExpressionPathScanEndReasonDotInsteadOfArrow
. used when -> should be used.
@ eExpressionPathScanEndReasonEndOfString
Out of data to parse.
@ eExpressionPathScanEndReasonRangeOperatorNotAllowed
[] not allowed by options.
@ eExpressionPathScanEndReasonEmptyRangeNotAllowed
[] only allowed for arrays.
@ eExpressionPathScanEndReasonRangeOperatorInvalid
[] not valid on objects other than scalars, pointers or arrays.
@ eExpressionPathScanEndReasonUnexpectedSymbol
Something is malformed in he expression.
@ eExpressionPathScanEndReasonArrayRangeOperatorMet
[] is good for arrays, but I cannot parse it.
@ eExpressionPathScanEndReasonSyntheticValueMissing
getting the synthetic children failed.
@ eExpressionPathScanEndReasonTakingAddressFailed
Impossible to apply & operator.
@ eExpressionPathScanEndReasonFragileIVarNotAllowed
ObjC ivar expansion not allowed.
virtual bool UpdateValue()=0
lldb::Format GetFormat() const
virtual lldb::VariableSP GetVariable()
@ eExpressionPathAftermathNothing
Just return it.
@ eExpressionPathAftermathDereference
Dereference the target.
@ eExpressionPathAftermathTakeAddress
Take target's address.
lldb::ValueObjectSP CastToBasicType(CompilerType type)
ValueObject * GetNonBaseClassParent()
virtual ValueObject * CreateChildAtIndex(size_t idx)
Should only be called by ValueObject::GetChildAtIndex().
lldb::ValueObjectSP GetValueForExpressionPath(llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop=nullptr, ExpressionPathEndResultType *final_value_type=nullptr, const GetValueForExpressionPathOptions &options=GetValueForExpressionPathOptions::DefaultOptions(), ExpressionPathAftermath *final_task_on_target=nullptr)
virtual lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic)
bool IsPossibleDynamicType()
DataExtractor m_data
A data extractor that can be used to extract the value.
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type, bool do_deref=true)
Given an address either create a value object containing the value at that address,...
virtual llvm::Expected< uint64_t > GetByteSize()=0
virtual CompilerType GetCompilerTypeImpl()=0
virtual lldb::ValueObjectSP GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
@ eGetExpressionPathFormatDereferencePointers
@ eGetExpressionPathFormatHonorPointers
virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name, bool can_create=true)
lldb::ValueObjectSP CastToEnumType(CompilerType type)
llvm::Expected< uint32_t > GetNumChildren(uint32_t max=UINT32_MAX)
virtual void GetExpressionPath(Stream &s, GetExpressionPathFormat=eGetExpressionPathFormatDereferencePointers)
bool UpdateFormatsIfNeeded()
virtual bool HasSyntheticValue()
lldb::StackFrameSP GetFrameSP() const
friend class ValueObjectChild
lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef< llvm::StringRef > names)
void SetSummaryFormat(lldb::TypeSummaryImplSP format)
virtual bool IsRuntimeSupportValue()
virtual ConstString GetTypeName()
DataExtractor & GetDataExtractor()
static lldb::ValueObjectSP CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type)
void SetValueDidChange(bool value_changed)
@ eClearUserVisibleDataItemsDescription
@ eClearUserVisibleDataItemsLocation
@ eClearUserVisibleDataItemsSummary
@ eClearUserVisibleDataItemsValue
@ eClearUserVisibleDataItemsSyntheticChildren
ValueObjectManager * GetManager()
ValueObject * m_root
The root of the hierarchy for this ValueObject (or nullptr if never calculated).
lldb::addr_t GetLoadAddress()
Return the target load address associated with this value object.
bool GetValueIsValid() const
virtual lldb::ModuleSP GetModule()
Return the module associated with this value object in case the value is from an executable file and ...
static lldb::ValueObjectSP CreateValueObjectFromScalar(lldb::TargetSP target, Scalar &s, CompilerType type, llvm::StringRef name)
Create a value object containing the given Scalar value.
virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType)
void UpdateChildrenAddressType()
llvm::Expected< lldb::ValueObjectSP > CastDerivedToBaseType(CompilerType type, const llvm::ArrayRef< uint32_t > &base_type_indices)
Take a ValueObject whose type is an inherited class, and cast it to 'type', which should be one of it...
virtual lldb::ValueObjectSP AddressOf(Status &error)
lldb::DynamicValueType GetDynamicValueType()
llvm::Expected< lldb::ValueObjectSP > CastBaseToDerivedType(CompilerType type, uint64_t offset)
Take a ValueObject whose type is a base class, and cast it to 'type', which should be one of its deri...
lldb::LanguageType m_preferred_display_language
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr)
virtual llvm::Expected< uint32_t > CalculateNumChildren(uint32_t max=UINT32_MAX)=0
Should only be called by ValueObject::GetNumChildren().
lldb::LanguageType GetObjectRuntimeLanguage()
virtual lldb::ValueObjectSP CreateConstantValue(ConstString name)
virtual bool IsLogicalTrue(Status &error)
lldb::Format m_last_format
virtual SymbolContextScope * GetSymbolContextScope()
virtual bool HasDynamicValueTypeInfo()
static lldb::ValueObjectSP CreateValueObjectFromNullptr(lldb::TargetSP target, CompilerType type, llvm::StringRef name)
Create a nullptr value object with the specified type (must be a nullptr type).
ValueObject * m_synthetic_value
void SetNumChildren(uint32_t num_children)
ValueObject * m_parent
The parent value object, or nullptr if this has no parent.
virtual bool IsBaseClass()
llvm::Expected< bool > GetValueAsBool()
If the current ValueObject is of an appropriate type, convert the value to a boolean and return that.
virtual bool GetDeclaration(Declaration &decl)
virtual lldb::ValueObjectSP Clone(ConstString new_name)
Creates a copy of the ValueObject with a new name and setting the current ValueObject as its parent.
lldb::ValueObjectSP GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue, bool synthValue)
lldb::ValueObjectSP m_addr_of_valobj_sp
We have to hold onto a shared pointer to this one because it is created as an independent ValueObject...
std::pair< size_t, bool > ReadPointedString(lldb::WritableDataBufferSP &buffer_sp, Status &error, bool honor_array)
llvm::Error Dump(Stream &s)
bool IsUninitializedReference()
bool UpdateValueIfNeeded(bool update_format=true)
static lldb::ValueObjectSP CreateValueObjectFromAPInt(lldb::TargetSP target, const llvm::APInt &v, CompilerType type, llvm::StringRef name)
Create a value object containing the given APInt value.
AddressType GetAddressTypeOfChildren()
const Status & GetError()
lldb::TypeFormatImplSP m_type_format_sp
lldb::TargetSP GetTargetSP() const
ExpressionPathEndResultType
@ eExpressionPathEndResultTypeInvalid
@ eExpressionPathEndResultTypePlain
Anything but...
@ eExpressionPathEndResultTypeBoundedRange
A range [low-high].
@ eExpressionPathEndResultTypeBitfield
A bitfield.
@ eExpressionPathEndResultTypeUnboundedRange
A range [].
virtual lldb::ValueObjectSP Dereference(Status &error)
void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType)
virtual const char * GetValueAsCString()
bool HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, lldb::Format custom_format)
virtual const char * GetLocationAsCString()
AddrAndType GetPointerValue()
ConstString GetName() const
std::string m_location_str
Cached location string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetVTable()
If this object represents a C++ class with a vtable, return an object that represents the virtual fun...
virtual bool SetValueFromCString(const char *value_str, Status &error)
virtual lldb::ValueObjectSP GetStaticValue()
lldb::ValueObjectSP Persist()
std::string m_object_desc_str
Cached result of the "object printer".
virtual ValueObject * GetParent()
virtual CompilerType MaybeCalculateCompleteType()
lldb::SyntheticChildrenSP m_synthetic_children_sp
virtual uint32_t GetBitfieldBitOffset()
llvm::Expected< std::string > GetObjectDescription()
std::string m_old_value_str
Cached old value string from the last time the value was gotten.
virtual lldb::ValueObjectSP GetNonSyntheticValue()
lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression, bool can_create)
virtual bool SetData(DataExtractor &data, Status &error)
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
void SetValueFromInteger(const llvm::APInt &value, Status &error)
Update an existing integer ValueObject with a new integer value.
const char * GetSummaryAsCString(lldb::LanguageType lang=lldb::eLanguageTypeUnknown)
ValueObjectRepresentationStyle
@ eValueObjectRepresentationStyleLocation
@ eValueObjectRepresentationStyleSummary
@ eValueObjectRepresentationStyleName
@ eValueObjectRepresentationStyleType
@ eValueObjectRepresentationStyleChildrenCount
@ eValueObjectRepresentationStyleExpressionPath
@ eValueObjectRepresentationStyleValue
@ eValueObjectRepresentationStyleLanguageSpecific
std::string m_value_str
Cached value string that will get cleared if/when the value is updated.
lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create)
virtual bool ResolveValue(Scalar &scalar)
llvm::Expected< llvm::APSInt > GetValueAsAPSInt()
If the current ValueObject is of an appropriate type, convert the value to an APSInt and return that.
void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp)
ConstString m_name
The name of this object.
bool IsPointerOrReferenceType()
const char * GetLocationAsCStringImpl(const Value &value, const DataExtractor &data)
virtual void SetFormat(lldb::Format format)
ValueObject * m_dynamic_value
void ClearDynamicTypeInformation()
bool IsCStringContainer(bool check_pointer=false)
Returns true if this is a char* or a char[] if it is a char* and check_pointer is true,...
virtual bool IsSynthetic()
std::map< ConstString, ValueObject * > m_synthetic_children
llvm::ArrayRef< uint8_t > GetLocalBuffer() const
Returns the local buffer that this ValueObject points to if it's available.
const ExecutionContextRef & GetExecutionContextRef() const
virtual AddrAndType GetAddressOf(bool scalar_is_load_address=true)
uint32_t GetNumChildrenIgnoringErrors(uint32_t max=UINT32_MAX)
Like GetNumChildren but returns 0 on error.
virtual bool CanProvideValue()
UserID m_id
Unique identifier for every value object.
const Value & GetValue() const
virtual lldb::LanguageType GetPreferredDisplayLanguage()
lldb::ValueObjectSP GetValueForExpressionPath_Impl(llvm::StringRef expression_cstr, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target)
const Scalar & GetScalar() const
See comment on m_scalar to understand what GetScalar returns.
Status GetValueAsData(ExecutionContext *exe_ctx, DataExtractor &data, Module *module)
RegisterInfo * GetRegisterInfo() const
ValueType
Type that describes Value::m_value.
@ HostAddress
A host address value (for memory in the process that < A is using liblldb).
@ FileAddress
A file address value.
@ LoadAddress
A load address value.
@ Scalar
A raw scalar value.
ValueType GetValueType() const
Scalar & ResolveValue(ExecutionContext *exe_ctx, Module *module=nullptr)
@ RegisterInfo
RegisterInfo * (can be a scalar or a vector register).
ContextType GetContextType() const
const CompilerType & GetCompilerType()
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
@ DoNoSelectMostRelevantFrame
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< SummaryStatistics > SummaryStatisticsSP
@ eAddressTypeFile
Address is an address as found in an object or symbol file.
@ eAddressTypeLoad
Address is an address as in the current target inferior process.
@ eAddressTypeHost
Address is an address in the process that is running this code.
const char * toString(AppleArm64ExceptionClass EC)
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::TypeFormatImpl > TypeFormatImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ExpressionVariable > ExpressionVariableSP
Format
Display format definitions.
@ eFormatCString
NULL terminated C strings.
@ eFormatCharArray
Print characters with no single quotes, used for character arrays that can contain non printable char...
@ eFormatComplex
Floating point complex type.
@ eFormatOSType
OS character codes encoded into an integer 'PICT' 'text' etc...
@ eFormatCharPrintable
Only printable characters, '.' if not printable.
@ eFormatComplexInteger
Integer complex type.
@ eFormatFloat128
Disambiguate between 128-bit long double (which uses eFormatFloat) and __float128 (which uses eFormat...
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::Process > ProcessSP
Encoding
Register encoding definitions.
@ eEncodingVector
vector registers
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::Module > ModuleSP
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
const char * alt_name
Alternate name of this register, can be NULL.
const char * name
Name of this register, can't be NULL.
lldb::Format format
Default display format.
bool m_is_synthetic_children_generated
SyntheticChildrenTraversal m_synthetic_children_traversal
bool m_check_dot_vs_arrow_syntax
bool m_allow_bitfields_syntax
SyntheticChildrenTraversal