1 //===-- ValueObject.cpp -----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Core/ValueObject.h"
11 
12 #include "lldb/Core/Address.h" // for Address
13 #include "lldb/Core/Module.h"
14 #include "lldb/Core/Scalar.h" // for Scalar
15 #include "lldb/Core/ValueObjectCast.h"
16 #include "lldb/Core/ValueObjectChild.h"
17 #include "lldb/Core/ValueObjectConstResult.h"
18 #include "lldb/Core/ValueObjectDynamicValue.h"
19 #include "lldb/Core/ValueObjectMemory.h"
20 #include "lldb/Core/ValueObjectSyntheticFilter.h"
21 #include "lldb/DataFormatters/DataVisualization.h"
22 #include "lldb/DataFormatters/FormatManager.h" // for FormatManager
23 #include "lldb/DataFormatters/StringPrinter.h"
24 #include "lldb/DataFormatters/TypeFormat.h"    // for TypeFormatImpl_F...
25 #include "lldb/DataFormatters/TypeSummary.h"   // for TypeSummaryOptions
26 #include "lldb/DataFormatters/TypeValidator.h" // for TypeValidatorImp...
27 #include "lldb/DataFormatters/ValueObjectPrinter.h"
28 #include "lldb/Expression/ExpressionVariable.h" // for ExpressionVariable
29 #include "lldb/Symbol/ClangASTContext.h"
30 #include "lldb/Symbol/CompileUnit.h"
31 #include "lldb/Symbol/CompilerType.h"
32 #include "lldb/Symbol/Declaration.h"   // for Declaration
33 #include "lldb/Symbol/SymbolContext.h" // for SymbolContext
34 #include "lldb/Symbol/Type.h"
35 #include "lldb/Target/ExecutionContext.h"
36 #include "lldb/Target/Language.h"
37 #include "lldb/Target/LanguageRuntime.h"
38 #include "lldb/Target/ObjCLanguageRuntime.h"
39 #include "lldb/Target/Process.h"
40 #include "lldb/Target/StackFrame.h" // for StackFrame
41 #include "lldb/Target/Target.h"
42 #include "lldb/Target/Thread.h"
43 #include "lldb/Target/ThreadList.h"  // for ThreadList
44 #include "lldb/Utility/DataBuffer.h" // for DataBuffer
45 #include "lldb/Utility/DataBufferHeap.h"
46 #include "lldb/Utility/Flags.h" // for Flags
47 #include "lldb/Utility/Log.h"
48 #include "lldb/Utility/Logging.h"    // for GetLogIfAllCateg...
49 #include "lldb/Utility/SharingPtr.h" // for SharingPtr
50 #include "lldb/Utility/Stream.h"     // for Stream
51 #include "lldb/Utility/StreamString.h"
52 #include "lldb/lldb-private-types.h" // for RegisterInfo
53 
54 #include "llvm/Support/Compiler.h" // for LLVM_FALLTHROUGH
55 
56 #include <algorithm> // for min
57 #include <cstdint>   // for uint32_t, uint64_t
58 #include <cstdlib>   // for size_t, NULL
59 #include <memory>    // for shared_ptr, oper...
60 #include <tuple>     // for tie, tuple
61 
62 #include <assert.h>   // for assert
63 #include <inttypes.h> // for PRIu64, PRIx64
64 #include <stdio.h>    // for snprintf
65 #include <string.h>   // for memcpy, memcmp
66 
67 namespace lldb_private {
68 class ExecutionContextScope;
69 }
70 namespace lldb_private {
71 class SymbolContextScope;
72 }
73 
74 using namespace lldb;
75 using namespace lldb_private;
76 using namespace lldb_utility;
77 
78 static user_id_t g_value_obj_uid = 0;
79 
80 //----------------------------------------------------------------------
81 // ValueObject constructor
82 //----------------------------------------------------------------------
83 ValueObject::ValueObject(ValueObject &parent)
84     : UserID(++g_value_obj_uid), // Unique identifier for every value object
85       m_parent(&parent), m_root(NULL), m_update_point(parent.GetUpdatePoint()),
86       m_name(), m_data(), m_value(), m_error(), m_value_str(),
87       m_old_value_str(), m_location_str(), m_summary_str(), m_object_desc_str(),
88       m_validation_result(), m_manager(parent.GetManager()), m_children(),
89       m_synthetic_children(), m_dynamic_value(NULL), m_synthetic_value(NULL),
90       m_deref_valobj(NULL), m_format(eFormatDefault),
91       m_last_format(eFormatDefault), m_last_format_mgr_revision(0),
92       m_type_summary_sp(), m_type_format_sp(), m_synthetic_children_sp(),
93       m_type_validator_sp(), m_user_id_of_forced_summary(),
94       m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid),
95       m_value_checksum(),
96       m_preferred_display_language(lldb::eLanguageTypeUnknown),
97       m_language_flags(0), m_value_is_valid(false), m_value_did_change(false),
98       m_children_count_valid(false), m_old_value_valid(false),
99       m_is_deref_of_parent(false), m_is_array_item_for_pointer(false),
100       m_is_bitfield_for_scalar(false), m_is_child_at_offset(false),
101       m_is_getting_summary(false),
102       m_did_calculate_complete_objc_class_type(false),
103       m_is_synthetic_children_generated(
104           parent.m_is_synthetic_children_generated) {
105   m_manager->ManageObject(this);
106 }
107 
108 //----------------------------------------------------------------------
109 // ValueObject constructor
110 //----------------------------------------------------------------------
111 ValueObject::ValueObject(ExecutionContextScope *exe_scope,
112                          AddressType child_ptr_or_ref_addr_type)
113     : UserID(++g_value_obj_uid), // Unique identifier for every value object
114       m_parent(NULL), m_root(NULL), m_update_point(exe_scope), m_name(),
115       m_data(), m_value(), m_error(), m_value_str(), m_old_value_str(),
116       m_location_str(), m_summary_str(), m_object_desc_str(),
117       m_validation_result(), m_manager(), m_children(), m_synthetic_children(),
118       m_dynamic_value(NULL), m_synthetic_value(NULL), m_deref_valobj(NULL),
119       m_format(eFormatDefault), m_last_format(eFormatDefault),
120       m_last_format_mgr_revision(0), m_type_summary_sp(), m_type_format_sp(),
121       m_synthetic_children_sp(), m_type_validator_sp(),
122       m_user_id_of_forced_summary(),
123       m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type),
124       m_value_checksum(),
125       m_preferred_display_language(lldb::eLanguageTypeUnknown),
126       m_language_flags(0), m_value_is_valid(false), m_value_did_change(false),
127       m_children_count_valid(false), m_old_value_valid(false),
128       m_is_deref_of_parent(false), m_is_array_item_for_pointer(false),
129       m_is_bitfield_for_scalar(false), m_is_child_at_offset(false),
130       m_is_getting_summary(false),
131       m_did_calculate_complete_objc_class_type(false),
132       m_is_synthetic_children_generated(false) {
133   m_manager = new ValueObjectManager();
134   m_manager->ManageObject(this);
135 }
136 
137 //----------------------------------------------------------------------
138 // Destructor
139 //----------------------------------------------------------------------
140 ValueObject::~ValueObject() {}
141 
142 bool ValueObject::UpdateValueIfNeeded(bool update_format) {
143 
144   bool did_change_formats = false;
145 
146   if (update_format)
147     did_change_formats = UpdateFormatsIfNeeded();
148 
149   // If this is a constant value, then our success is predicated on whether we
150   // have an error or not
151   if (GetIsConstant()) {
152     // if you are constant, things might still have changed behind your back
153     // (e.g. you are a frozen object and things have changed deeper than you
154     // cared to freeze-dry yourself) in this case, your value has not changed,
155     // but "computed" entries might have, so you might now have a different
156     // summary, or a different object description. clear these so we will
157     // recompute them
158     if (update_format && !did_change_formats)
159       ClearUserVisibleData(eClearUserVisibleDataItemsSummary |
160                            eClearUserVisibleDataItemsDescription);
161     return m_error.Success();
162   }
163 
164   bool first_update = IsChecksumEmpty();
165 
166   if (NeedsUpdating()) {
167     m_update_point.SetUpdated();
168 
169     // Save the old value using swap to avoid a string copy which also will
170     // clear our m_value_str
171     if (m_value_str.empty()) {
172       m_old_value_valid = false;
173     } else {
174       m_old_value_valid = true;
175       m_old_value_str.swap(m_value_str);
176       ClearUserVisibleData(eClearUserVisibleDataItemsValue);
177     }
178 
179     ClearUserVisibleData();
180 
181     if (IsInScope()) {
182       const bool value_was_valid = GetValueIsValid();
183       SetValueDidChange(false);
184 
185       m_error.Clear();
186 
187       // Call the pure virtual function to update the value
188 
189       bool need_compare_checksums = false;
190       llvm::SmallVector<uint8_t, 16> old_checksum;
191 
192       if (!first_update && CanProvideValue()) {
193         need_compare_checksums = true;
194         old_checksum.resize(m_value_checksum.size());
195         std::copy(m_value_checksum.begin(), m_value_checksum.end(),
196                   old_checksum.begin());
197       }
198 
199       bool success = UpdateValue();
200 
201       SetValueIsValid(success);
202 
203       if (success) {
204         const uint64_t max_checksum_size = 128;
205         m_data.Checksum(m_value_checksum, max_checksum_size);
206       } else {
207         need_compare_checksums = false;
208         m_value_checksum.clear();
209       }
210 
211       assert(!need_compare_checksums ||
212              (!old_checksum.empty() && !m_value_checksum.empty()));
213 
214       if (first_update)
215         SetValueDidChange(false);
216       else if (!m_value_did_change && success == false) {
217         // The value wasn't gotten successfully, so we mark this as changed if
218         // the value used to be valid and now isn't
219         SetValueDidChange(value_was_valid);
220       } else if (need_compare_checksums) {
221         SetValueDidChange(memcmp(&old_checksum[0], &m_value_checksum[0],
222                                  m_value_checksum.size()));
223       }
224 
225     } else {
226       m_error.SetErrorString("out of scope");
227     }
228   }
229   return m_error.Success();
230 }
231 
232 bool ValueObject::UpdateFormatsIfNeeded() {
233   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS));
234   if (log)
235     log->Printf("[%s %p] checking for FormatManager revisions. ValueObject "
236                 "rev: %d - Global rev: %d",
237                 GetName().GetCString(), static_cast<void *>(this),
238                 m_last_format_mgr_revision,
239                 DataVisualization::GetCurrentRevision());
240 
241   bool any_change = false;
242 
243   if ((m_last_format_mgr_revision != DataVisualization::GetCurrentRevision())) {
244     m_last_format_mgr_revision = DataVisualization::GetCurrentRevision();
245     any_change = true;
246 
247     SetValueFormat(DataVisualization::GetFormat(*this, eNoDynamicValues));
248     SetSummaryFormat(
249         DataVisualization::GetSummaryFormat(*this, GetDynamicValueType()));
250 #ifndef LLDB_DISABLE_PYTHON
251     SetSyntheticChildren(
252         DataVisualization::GetSyntheticChildren(*this, GetDynamicValueType()));
253 #endif
254     SetValidator(DataVisualization::GetValidator(*this, GetDynamicValueType()));
255   }
256 
257   return any_change;
258 }
259 
260 void ValueObject::SetNeedsUpdate() {
261   m_update_point.SetNeedsUpdate();
262   // We have to clear the value string here so ConstResult children will notice
263   // if their values are changed by hand (i.e. with SetValueAsCString).
264   ClearUserVisibleData(eClearUserVisibleDataItemsValue);
265 }
266 
267 void ValueObject::ClearDynamicTypeInformation() {
268   m_children_count_valid = false;
269   m_did_calculate_complete_objc_class_type = false;
270   m_last_format_mgr_revision = 0;
271   m_override_type = CompilerType();
272   SetValueFormat(lldb::TypeFormatImplSP());
273   SetSummaryFormat(lldb::TypeSummaryImplSP());
274   SetSyntheticChildren(lldb::SyntheticChildrenSP());
275 }
276 
277 CompilerType ValueObject::MaybeCalculateCompleteType() {
278   CompilerType compiler_type(GetCompilerTypeImpl());
279 
280   if (m_did_calculate_complete_objc_class_type) {
281     if (m_override_type.IsValid())
282       return m_override_type;
283     else
284       return compiler_type;
285   }
286 
287   CompilerType class_type;
288   bool is_pointer_type = false;
289 
290   if (ClangASTContext::IsObjCObjectPointerType(compiler_type, &class_type)) {
291     is_pointer_type = true;
292   } else if (ClangASTContext::IsObjCObjectOrInterfaceType(compiler_type)) {
293     class_type = compiler_type;
294   } else {
295     return compiler_type;
296   }
297 
298   m_did_calculate_complete_objc_class_type = true;
299 
300   if (class_type) {
301     ConstString class_name(class_type.GetConstTypeName());
302 
303     if (class_name) {
304       ProcessSP process_sp(
305           GetUpdatePoint().GetExecutionContextRef().GetProcessSP());
306 
307       if (process_sp) {
308         ObjCLanguageRuntime *objc_language_runtime(
309             process_sp->GetObjCLanguageRuntime());
310 
311         if (objc_language_runtime) {
312           TypeSP complete_objc_class_type_sp =
313               objc_language_runtime->LookupInCompleteClassCache(class_name);
314 
315           if (complete_objc_class_type_sp) {
316             CompilerType complete_class(
317                 complete_objc_class_type_sp->GetFullCompilerType());
318 
319             if (complete_class.GetCompleteType()) {
320               if (is_pointer_type) {
321                 m_override_type = complete_class.GetPointerType();
322               } else {
323                 m_override_type = complete_class;
324               }
325 
326               if (m_override_type.IsValid())
327                 return m_override_type;
328             }
329           }
330         }
331       }
332     }
333   }
334   return compiler_type;
335 }
336 
337 CompilerType ValueObject::GetCompilerType() {
338   return MaybeCalculateCompleteType();
339 }
340 
341 TypeImpl ValueObject::GetTypeImpl() { return TypeImpl(GetCompilerType()); }
342 
343 DataExtractor &ValueObject::GetDataExtractor() {
344   UpdateValueIfNeeded(false);
345   return m_data;
346 }
347 
348 const Status &ValueObject::GetError() {
349   UpdateValueIfNeeded(false);
350   return m_error;
351 }
352 
353 const ConstString &ValueObject::GetName() const { return m_name; }
354 
355 const char *ValueObject::GetLocationAsCString() {
356   return GetLocationAsCStringImpl(m_value, m_data);
357 }
358 
359 const char *ValueObject::GetLocationAsCStringImpl(const Value &value,
360                                                   const DataExtractor &data) {
361   if (UpdateValueIfNeeded(false)) {
362     if (m_location_str.empty()) {
363       StreamString sstr;
364 
365       Value::ValueType value_type = value.GetValueType();
366 
367       switch (value_type) {
368       case Value::eValueTypeScalar:
369       case Value::eValueTypeVector:
370         if (value.GetContextType() == Value::eContextTypeRegisterInfo) {
371           RegisterInfo *reg_info = value.GetRegisterInfo();
372           if (reg_info) {
373             if (reg_info->name)
374               m_location_str = reg_info->name;
375             else if (reg_info->alt_name)
376               m_location_str = reg_info->alt_name;
377             if (m_location_str.empty())
378               m_location_str = (reg_info->encoding == lldb::eEncodingVector)
379                                    ? "vector"
380                                    : "scalar";
381           }
382         }
383         if (m_location_str.empty())
384           m_location_str =
385               (value_type == Value::eValueTypeVector) ? "vector" : "scalar";
386         break;
387 
388       case Value::eValueTypeLoadAddress:
389       case Value::eValueTypeFileAddress:
390       case Value::eValueTypeHostAddress: {
391         uint32_t addr_nibble_size = data.GetAddressByteSize() * 2;
392         sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size,
393                     value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
394         m_location_str = sstr.GetString();
395       } break;
396       }
397     }
398   }
399   return m_location_str.c_str();
400 }
401 
402 Value &ValueObject::GetValue() { return m_value; }
403 
404 const Value &ValueObject::GetValue() const { return m_value; }
405 
406 bool ValueObject::ResolveValue(Scalar &scalar) {
407   if (UpdateValueIfNeeded(
408           false)) // make sure that you are up to date before returning anything
409   {
410     ExecutionContext exe_ctx(GetExecutionContextRef());
411     Value tmp_value(m_value);
412     scalar = tmp_value.ResolveValue(&exe_ctx);
413     if (scalar.IsValid()) {
414       const uint32_t bitfield_bit_size = GetBitfieldBitSize();
415       if (bitfield_bit_size)
416         return scalar.ExtractBitfield(bitfield_bit_size,
417                                       GetBitfieldBitOffset());
418       return true;
419     }
420   }
421   return false;
422 }
423 
424 bool ValueObject::IsLogicalTrue(Status &error) {
425   if (Language *language = Language::FindPlugin(GetObjectRuntimeLanguage())) {
426     LazyBool is_logical_true = language->IsLogicalTrue(*this, error);
427     switch (is_logical_true) {
428     case eLazyBoolYes:
429     case eLazyBoolNo:
430       return (is_logical_true == true);
431     case eLazyBoolCalculate:
432       break;
433     }
434   }
435 
436   Scalar scalar_value;
437 
438   if (!ResolveValue(scalar_value)) {
439     error.SetErrorString("failed to get a scalar result");
440     return false;
441   }
442 
443   bool ret;
444   if (scalar_value.ULongLong(1) == 0)
445     ret = false;
446   else
447     ret = true;
448   error.Clear();
449   return ret;
450 }
451 
452 bool ValueObject::GetValueIsValid() const { return m_value_is_valid; }
453 
454 void ValueObject::SetValueIsValid(bool b) { m_value_is_valid = b; }
455 
456 bool ValueObject::GetValueDidChange() { return m_value_did_change; }
457 
458 void ValueObject::SetValueDidChange(bool value_changed) {
459   m_value_did_change = value_changed;
460 }
461 
462 ValueObjectSP ValueObject::GetChildAtIndex(size_t idx, bool can_create) {
463   ValueObjectSP child_sp;
464   // We may need to update our value if we are dynamic
465   if (IsPossibleDynamicType())
466     UpdateValueIfNeeded(false);
467   if (idx < GetNumChildren()) {
468     // Check if we have already made the child value object?
469     if (can_create && !m_children.HasChildAtIndex(idx)) {
470       // No we haven't created the child at this index, so lets have our
471       // subclass do it and cache the result for quick future access.
472       m_children.SetChildAtIndex(idx, CreateChildAtIndex(idx, false, 0));
473     }
474 
475     ValueObject *child = m_children.GetChildAtIndex(idx);
476     if (child != NULL)
477       return child->GetSP();
478   }
479   return child_sp;
480 }
481 
482 lldb::ValueObjectSP
483 ValueObject::GetChildAtIndexPath(llvm::ArrayRef<size_t> idxs,
484                                  size_t *index_of_error) {
485   if (idxs.size() == 0)
486     return GetSP();
487   ValueObjectSP root(GetSP());
488   for (size_t idx : idxs) {
489     root = root->GetChildAtIndex(idx, true);
490     if (!root) {
491       if (index_of_error)
492         *index_of_error = idx;
493       return root;
494     }
495   }
496   return root;
497 }
498 
499 lldb::ValueObjectSP ValueObject::GetChildAtIndexPath(
500   llvm::ArrayRef<std::pair<size_t, bool>> idxs, size_t *index_of_error) {
501   if (idxs.size() == 0)
502     return GetSP();
503   ValueObjectSP root(GetSP());
504   for (std::pair<size_t, bool> idx : idxs) {
505     root = root->GetChildAtIndex(idx.first, idx.second);
506     if (!root) {
507       if (index_of_error)
508         *index_of_error = idx.first;
509       return root;
510     }
511   }
512   return root;
513 }
514 
515 lldb::ValueObjectSP
516 ValueObject::GetChildAtNamePath(llvm::ArrayRef<ConstString> names,
517                                 ConstString *name_of_error) {
518   if (names.size() == 0)
519     return GetSP();
520   ValueObjectSP root(GetSP());
521   for (ConstString name : names) {
522     root = root->GetChildMemberWithName(name, true);
523     if (!root) {
524       if (name_of_error)
525         *name_of_error = name;
526       return root;
527     }
528   }
529   return root;
530 }
531 
532 lldb::ValueObjectSP ValueObject::GetChildAtNamePath(
533     llvm::ArrayRef<std::pair<ConstString, bool>> names,
534     ConstString *name_of_error) {
535   if (names.size() == 0)
536     return GetSP();
537   ValueObjectSP root(GetSP());
538   for (std::pair<ConstString, bool> name : names) {
539     root = root->GetChildMemberWithName(name.first, name.second);
540     if (!root) {
541       if (name_of_error)
542         *name_of_error = name.first;
543       return root;
544     }
545   }
546   return root;
547 }
548 
549 size_t ValueObject::GetIndexOfChildWithName(const ConstString &name) {
550   bool omit_empty_base_classes = true;
551   return GetCompilerType().GetIndexOfChildWithName(name.GetCString(),
552                                                    omit_empty_base_classes);
553 }
554 
555 ValueObjectSP ValueObject::GetChildMemberWithName(const ConstString &name,
556                                                   bool can_create) {
557   // when getting a child by name, it could be buried inside some base classes
558   // (which really aren't part of the expression path), so we need a vector of
559   // indexes that can get us down to the correct child
560   ValueObjectSP child_sp;
561 
562   // We may need to update our value if we are dynamic
563   if (IsPossibleDynamicType())
564     UpdateValueIfNeeded(false);
565 
566   std::vector<uint32_t> child_indexes;
567   bool omit_empty_base_classes = true;
568   const size_t num_child_indexes =
569       GetCompilerType().GetIndexOfChildMemberWithName(
570           name.GetCString(), omit_empty_base_classes, child_indexes);
571   if (num_child_indexes > 0) {
572     std::vector<uint32_t>::const_iterator pos = child_indexes.begin();
573     std::vector<uint32_t>::const_iterator end = child_indexes.end();
574 
575     child_sp = GetChildAtIndex(*pos, can_create);
576     for (++pos; pos != end; ++pos) {
577       if (child_sp) {
578         ValueObjectSP new_child_sp(child_sp->GetChildAtIndex(*pos, can_create));
579         child_sp = new_child_sp;
580       } else {
581         child_sp.reset();
582       }
583     }
584   }
585   return child_sp;
586 }
587 
588 size_t ValueObject::GetNumChildren(uint32_t max) {
589   UpdateValueIfNeeded();
590 
591   if (max < UINT32_MAX) {
592     if (m_children_count_valid) {
593       size_t children_count = m_children.GetChildrenCount();
594       return children_count <= max ? children_count : max;
595     } else
596       return CalculateNumChildren(max);
597   }
598 
599   if (!m_children_count_valid) {
600     SetNumChildren(CalculateNumChildren());
601   }
602   return m_children.GetChildrenCount();
603 }
604 
605 bool ValueObject::MightHaveChildren() {
606   bool has_children = false;
607   const uint32_t type_info = GetTypeInfo();
608   if (type_info) {
609     if (type_info & (eTypeHasChildren | eTypeIsPointer | eTypeIsReference))
610       has_children = true;
611   } else {
612     has_children = GetNumChildren() > 0;
613   }
614   return has_children;
615 }
616 
617 // Should only be called by ValueObject::GetNumChildren()
618 void ValueObject::SetNumChildren(size_t num_children) {
619   m_children_count_valid = true;
620   m_children.SetChildrenCount(num_children);
621 }
622 
623 void ValueObject::SetName(const ConstString &name) { m_name = name; }
624 
625 ValueObject *ValueObject::CreateChildAtIndex(size_t idx,
626                                              bool synthetic_array_member,
627                                              int32_t synthetic_index) {
628   ValueObject *valobj = NULL;
629 
630   bool omit_empty_base_classes = true;
631   bool ignore_array_bounds = synthetic_array_member;
632   std::string child_name_str;
633   uint32_t child_byte_size = 0;
634   int32_t child_byte_offset = 0;
635   uint32_t child_bitfield_bit_size = 0;
636   uint32_t child_bitfield_bit_offset = 0;
637   bool child_is_base_class = false;
638   bool child_is_deref_of_parent = false;
639   uint64_t language_flags = 0;
640 
641   const bool transparent_pointers = synthetic_array_member == false;
642   CompilerType child_compiler_type;
643 
644   ExecutionContext exe_ctx(GetExecutionContextRef());
645 
646   child_compiler_type = GetCompilerType().GetChildCompilerTypeAtIndex(
647       &exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
648       ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset,
649       child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
650       child_is_deref_of_parent, this, language_flags);
651   if (child_compiler_type) {
652     if (synthetic_index)
653       child_byte_offset += child_byte_size * synthetic_index;
654 
655     ConstString child_name;
656     if (!child_name_str.empty())
657       child_name.SetCString(child_name_str.c_str());
658 
659     valobj = new ValueObjectChild(
660         *this, child_compiler_type, child_name, child_byte_size,
661         child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
662         child_is_base_class, child_is_deref_of_parent, eAddressTypeInvalid,
663         language_flags);
664     // if (valobj)
665     //    valobj->SetAddressTypeOfChildren(eAddressTypeInvalid);
666   }
667 
668   return valobj;
669 }
670 
671 bool ValueObject::GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
672                                       std::string &destination,
673                                       lldb::LanguageType lang) {
674   return GetSummaryAsCString(summary_ptr, destination,
675                              TypeSummaryOptions().SetLanguage(lang));
676 }
677 
678 bool ValueObject::GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
679                                       std::string &destination,
680                                       const TypeSummaryOptions &options) {
681   destination.clear();
682 
683   // ideally we would like to bail out if passing NULL, but if we do so we end
684   // up not providing the summary for function pointers anymore
685   if (/*summary_ptr == NULL ||*/ m_is_getting_summary)
686     return false;
687 
688   m_is_getting_summary = true;
689 
690   TypeSummaryOptions actual_options(options);
691 
692   if (actual_options.GetLanguage() == lldb::eLanguageTypeUnknown)
693     actual_options.SetLanguage(GetPreferredDisplayLanguage());
694 
695   // this is a hot path in code and we prefer to avoid setting this string all
696   // too often also clearing out other information that we might care to see in
697   // a crash log. might be useful in very specific situations though.
698   /*Host::SetCrashDescriptionWithFormat("Trying to fetch a summary for %s %s.
699    Summary provider's description is %s",
700    GetTypeName().GetCString(),
701    GetName().GetCString(),
702    summary_ptr->GetDescription().c_str());*/
703 
704   if (UpdateValueIfNeeded(false) && summary_ptr) {
705     if (HasSyntheticValue())
706       m_synthetic_value->UpdateValueIfNeeded(); // the summary might depend on
707                                                 // the synthetic children being
708                                                 // up-to-date (e.g. ${svar%#})
709     summary_ptr->FormatObject(this, destination, actual_options);
710   }
711   m_is_getting_summary = false;
712   return !destination.empty();
713 }
714 
715 const char *ValueObject::GetSummaryAsCString(lldb::LanguageType lang) {
716   if (UpdateValueIfNeeded(true) && m_summary_str.empty()) {
717     TypeSummaryOptions summary_options;
718     summary_options.SetLanguage(lang);
719     GetSummaryAsCString(GetSummaryFormat().get(), m_summary_str,
720                         summary_options);
721   }
722   if (m_summary_str.empty())
723     return NULL;
724   return m_summary_str.c_str();
725 }
726 
727 bool ValueObject::GetSummaryAsCString(std::string &destination,
728                                       const TypeSummaryOptions &options) {
729   return GetSummaryAsCString(GetSummaryFormat().get(), destination, options);
730 }
731 
732 bool ValueObject::IsCStringContainer(bool check_pointer) {
733   CompilerType pointee_or_element_compiler_type;
734   const Flags type_flags(GetTypeInfo(&pointee_or_element_compiler_type));
735   bool is_char_arr_ptr(type_flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
736                        pointee_or_element_compiler_type.IsCharType());
737   if (!is_char_arr_ptr)
738     return false;
739   if (!check_pointer)
740     return true;
741   if (type_flags.Test(eTypeIsArray))
742     return true;
743   addr_t cstr_address = LLDB_INVALID_ADDRESS;
744   AddressType cstr_address_type = eAddressTypeInvalid;
745   cstr_address = GetAddressOf(true, &cstr_address_type);
746   return (cstr_address != LLDB_INVALID_ADDRESS);
747 }
748 
749 size_t ValueObject::GetPointeeData(DataExtractor &data, uint32_t item_idx,
750                                    uint32_t item_count) {
751   CompilerType pointee_or_element_compiler_type;
752   const uint32_t type_info = GetTypeInfo(&pointee_or_element_compiler_type);
753   const bool is_pointer_type = type_info & eTypeIsPointer;
754   const bool is_array_type = type_info & eTypeIsArray;
755   if (!(is_pointer_type || is_array_type))
756     return 0;
757 
758   if (item_count == 0)
759     return 0;
760 
761   ExecutionContext exe_ctx(GetExecutionContextRef());
762 
763   const uint64_t item_type_size = pointee_or_element_compiler_type.GetByteSize(
764       exe_ctx.GetBestExecutionContextScope());
765   const uint64_t bytes = item_count * item_type_size;
766   const uint64_t offset = item_idx * item_type_size;
767 
768   if (item_idx == 0 && item_count == 1) // simply a deref
769   {
770     if (is_pointer_type) {
771       Status error;
772       ValueObjectSP pointee_sp = Dereference(error);
773       if (error.Fail() || pointee_sp.get() == NULL)
774         return 0;
775       return pointee_sp->GetData(data, error);
776     } else {
777       ValueObjectSP child_sp = GetChildAtIndex(0, true);
778       if (child_sp.get() == NULL)
779         return 0;
780       Status error;
781       return child_sp->GetData(data, error);
782     }
783     return true;
784   } else /* (items > 1) */
785   {
786     Status error;
787     lldb_private::DataBufferHeap *heap_buf_ptr = NULL;
788     lldb::DataBufferSP data_sp(heap_buf_ptr =
789                                    new lldb_private::DataBufferHeap());
790 
791     AddressType addr_type;
792     lldb::addr_t addr = is_pointer_type ? GetPointerValue(&addr_type)
793                                         : GetAddressOf(true, &addr_type);
794 
795     switch (addr_type) {
796     case eAddressTypeFile: {
797       ModuleSP module_sp(GetModule());
798       if (module_sp) {
799         addr = addr + offset;
800         Address so_addr;
801         module_sp->ResolveFileAddress(addr, so_addr);
802         ExecutionContext exe_ctx(GetExecutionContextRef());
803         Target *target = exe_ctx.GetTargetPtr();
804         if (target) {
805           heap_buf_ptr->SetByteSize(bytes);
806           size_t bytes_read = target->ReadMemory(
807               so_addr, false, heap_buf_ptr->GetBytes(), bytes, error);
808           if (error.Success()) {
809             data.SetData(data_sp);
810             return bytes_read;
811           }
812         }
813       }
814     } break;
815     case eAddressTypeLoad: {
816       ExecutionContext exe_ctx(GetExecutionContextRef());
817       Process *process = exe_ctx.GetProcessPtr();
818       if (process) {
819         heap_buf_ptr->SetByteSize(bytes);
820         size_t bytes_read = process->ReadMemory(
821             addr + offset, heap_buf_ptr->GetBytes(), bytes, error);
822         if (error.Success() || bytes_read > 0) {
823           data.SetData(data_sp);
824           return bytes_read;
825         }
826       }
827     } break;
828     case eAddressTypeHost: {
829       const uint64_t max_bytes =
830           GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope());
831       if (max_bytes > offset) {
832         size_t bytes_read = std::min<uint64_t>(max_bytes - offset, bytes);
833         addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
834         if (addr == 0 || addr == LLDB_INVALID_ADDRESS)
835           break;
836         heap_buf_ptr->CopyData((uint8_t *)(addr + offset), bytes_read);
837         data.SetData(data_sp);
838         return bytes_read;
839       }
840     } break;
841     case eAddressTypeInvalid:
842       break;
843     }
844   }
845   return 0;
846 }
847 
848 uint64_t ValueObject::GetData(DataExtractor &data, Status &error) {
849   UpdateValueIfNeeded(false);
850   ExecutionContext exe_ctx(GetExecutionContextRef());
851   error = m_value.GetValueAsData(&exe_ctx, data, 0, GetModule().get());
852   if (error.Fail()) {
853     if (m_data.GetByteSize()) {
854       data = m_data;
855       error.Clear();
856       return data.GetByteSize();
857     } else {
858       return 0;
859     }
860   }
861   data.SetAddressByteSize(m_data.GetAddressByteSize());
862   data.SetByteOrder(m_data.GetByteOrder());
863   return data.GetByteSize();
864 }
865 
866 bool ValueObject::SetData(DataExtractor &data, Status &error) {
867   error.Clear();
868   // Make sure our value is up to date first so that our location and location
869   // type is valid.
870   if (!UpdateValueIfNeeded(false)) {
871     error.SetErrorString("unable to read value");
872     return false;
873   }
874 
875   uint64_t count = 0;
876   const Encoding encoding = GetCompilerType().GetEncoding(count);
877 
878   const size_t byte_size = GetByteSize();
879 
880   Value::ValueType value_type = m_value.GetValueType();
881 
882   switch (value_type) {
883   case Value::eValueTypeScalar: {
884     Status set_error =
885         m_value.GetScalar().SetValueFromData(data, encoding, byte_size);
886 
887     if (!set_error.Success()) {
888       error.SetErrorStringWithFormat("unable to set scalar value: %s",
889                                      set_error.AsCString());
890       return false;
891     }
892   } break;
893   case Value::eValueTypeLoadAddress: {
894     // If it is a load address, then the scalar value is the storage location
895     // of the data, and we have to shove this value down to that load location.
896     ExecutionContext exe_ctx(GetExecutionContextRef());
897     Process *process = exe_ctx.GetProcessPtr();
898     if (process) {
899       addr_t target_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
900       size_t bytes_written = process->WriteMemory(
901           target_addr, data.GetDataStart(), byte_size, error);
902       if (!error.Success())
903         return false;
904       if (bytes_written != byte_size) {
905         error.SetErrorString("unable to write value to memory");
906         return false;
907       }
908     }
909   } break;
910   case Value::eValueTypeHostAddress: {
911     // If it is a host address, then we stuff the scalar as a DataBuffer into
912     // the Value's data.
913     DataBufferSP buffer_sp(new DataBufferHeap(byte_size, 0));
914     m_data.SetData(buffer_sp, 0);
915     data.CopyByteOrderedData(0, byte_size,
916                              const_cast<uint8_t *>(m_data.GetDataStart()),
917                              byte_size, m_data.GetByteOrder());
918     m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
919   } break;
920   case Value::eValueTypeFileAddress:
921   case Value::eValueTypeVector:
922     break;
923   }
924 
925   // If we have reached this point, then we have successfully changed the
926   // value.
927   SetNeedsUpdate();
928   return true;
929 }
930 
931 static bool CopyStringDataToBufferSP(const StreamString &source,
932                                      lldb::DataBufferSP &destination) {
933   destination.reset(new DataBufferHeap(source.GetSize() + 1, 0));
934   memcpy(destination->GetBytes(), source.GetString().data(), source.GetSize());
935   return true;
936 }
937 
938 std::pair<size_t, bool>
939 ValueObject::ReadPointedString(lldb::DataBufferSP &buffer_sp, Status &error,
940                                uint32_t max_length, bool honor_array,
941                                Format item_format) {
942   bool was_capped = false;
943   StreamString s;
944   ExecutionContext exe_ctx(GetExecutionContextRef());
945   Target *target = exe_ctx.GetTargetPtr();
946 
947   if (!target) {
948     s << "<no target to read from>";
949     error.SetErrorString("no target to read from");
950     CopyStringDataToBufferSP(s, buffer_sp);
951     return {0, was_capped};
952   }
953 
954   if (max_length == 0)
955     max_length = target->GetMaximumSizeOfStringSummary();
956 
957   size_t bytes_read = 0;
958   size_t total_bytes_read = 0;
959 
960   CompilerType compiler_type = GetCompilerType();
961   CompilerType elem_or_pointee_compiler_type;
962   const Flags type_flags(GetTypeInfo(&elem_or_pointee_compiler_type));
963   if (type_flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
964       elem_or_pointee_compiler_type.IsCharType()) {
965     addr_t cstr_address = LLDB_INVALID_ADDRESS;
966     AddressType cstr_address_type = eAddressTypeInvalid;
967 
968     size_t cstr_len = 0;
969     bool capped_data = false;
970     const bool is_array = type_flags.Test(eTypeIsArray);
971     if (is_array) {
972       // We have an array
973       uint64_t array_size = 0;
974       if (compiler_type.IsArrayType(NULL, &array_size, NULL)) {
975         cstr_len = array_size;
976         if (cstr_len > max_length) {
977           capped_data = true;
978           cstr_len = max_length;
979         }
980       }
981       cstr_address = GetAddressOf(true, &cstr_address_type);
982     } else {
983       // We have a pointer
984       cstr_address = GetPointerValue(&cstr_address_type);
985     }
986 
987     if (cstr_address == 0 || cstr_address == LLDB_INVALID_ADDRESS) {
988       if (cstr_address_type == eAddressTypeHost && is_array) {
989         const char *cstr = GetDataExtractor().PeekCStr(0);
990         if (cstr == nullptr) {
991           s << "<invalid address>";
992           error.SetErrorString("invalid address");
993           CopyStringDataToBufferSP(s, buffer_sp);
994           return {0, was_capped};
995         }
996         buffer_sp.reset(new DataBufferHeap(cstr_len, 0));
997         memcpy(buffer_sp->GetBytes(), cstr, cstr_len);
998         return {cstr_len, was_capped};
999       } else {
1000         s << "<invalid address>";
1001         error.SetErrorString("invalid address");
1002         CopyStringDataToBufferSP(s, buffer_sp);
1003         return {0, was_capped};
1004       }
1005     }
1006 
1007     Address cstr_so_addr(cstr_address);
1008     DataExtractor data;
1009     if (cstr_len > 0 && honor_array) {
1010       // I am using GetPointeeData() here to abstract the fact that some
1011       // ValueObjects are actually frozen pointers in the host but the pointed-
1012       // to data lives in the debuggee, and GetPointeeData() automatically
1013       // takes care of this
1014       GetPointeeData(data, 0, cstr_len);
1015 
1016       if ((bytes_read = data.GetByteSize()) > 0) {
1017         total_bytes_read = bytes_read;
1018         for (size_t offset = 0; offset < bytes_read; offset++)
1019           s.Printf("%c", *data.PeekData(offset, 1));
1020         if (capped_data)
1021           was_capped = true;
1022       }
1023     } else {
1024       cstr_len = max_length;
1025       const size_t k_max_buf_size = 64;
1026 
1027       size_t offset = 0;
1028 
1029       int cstr_len_displayed = -1;
1030       bool capped_cstr = false;
1031       // I am using GetPointeeData() here to abstract the fact that some
1032       // ValueObjects are actually frozen pointers in the host but the pointed-
1033       // to data lives in the debuggee, and GetPointeeData() automatically
1034       // takes care of this
1035       while ((bytes_read = GetPointeeData(data, offset, k_max_buf_size)) > 0) {
1036         total_bytes_read += bytes_read;
1037         const char *cstr = data.PeekCStr(0);
1038         size_t len = strnlen(cstr, k_max_buf_size);
1039         if (cstr_len_displayed < 0)
1040           cstr_len_displayed = len;
1041 
1042         if (len == 0)
1043           break;
1044         cstr_len_displayed += len;
1045         if (len > bytes_read)
1046           len = bytes_read;
1047         if (len > cstr_len)
1048           len = cstr_len;
1049 
1050         for (size_t offset = 0; offset < bytes_read; offset++)
1051           s.Printf("%c", *data.PeekData(offset, 1));
1052 
1053         if (len < k_max_buf_size)
1054           break;
1055 
1056         if (len >= cstr_len) {
1057           capped_cstr = true;
1058           break;
1059         }
1060 
1061         cstr_len -= len;
1062         offset += len;
1063       }
1064 
1065       if (cstr_len_displayed >= 0) {
1066         if (capped_cstr)
1067           was_capped = true;
1068       }
1069     }
1070   } else {
1071     error.SetErrorString("not a string object");
1072     s << "<not a string object>";
1073   }
1074   CopyStringDataToBufferSP(s, buffer_sp);
1075   return {total_bytes_read, was_capped};
1076 }
1077 
1078 std::pair<TypeValidatorResult, std::string> ValueObject::GetValidationStatus() {
1079   if (!UpdateValueIfNeeded(true))
1080     return {TypeValidatorResult::Success,
1081             ""}; // not the validator's job to discuss update problems
1082 
1083   if (m_validation_result.hasValue())
1084     return m_validation_result.getValue();
1085 
1086   if (!m_type_validator_sp)
1087     return {TypeValidatorResult::Success, ""}; // no validator no failure
1088 
1089   auto outcome = m_type_validator_sp->FormatObject(this);
1090 
1091   return (m_validation_result = {outcome.m_result, outcome.m_message})
1092       .getValue();
1093 }
1094 
1095 const char *ValueObject::GetObjectDescription() {
1096 
1097   if (!UpdateValueIfNeeded(true))
1098     return NULL;
1099 
1100   if (!m_object_desc_str.empty())
1101     return m_object_desc_str.c_str();
1102 
1103   ExecutionContext exe_ctx(GetExecutionContextRef());
1104   Process *process = exe_ctx.GetProcessPtr();
1105   if (process == NULL)
1106     return NULL;
1107 
1108   StreamString s;
1109 
1110   LanguageType language = GetObjectRuntimeLanguage();
1111   LanguageRuntime *runtime = process->GetLanguageRuntime(language);
1112 
1113   if (runtime == NULL) {
1114     // Aw, hell, if the things a pointer, or even just an integer, let's try
1115     // ObjC anyway...
1116     CompilerType compiler_type = GetCompilerType();
1117     if (compiler_type) {
1118       bool is_signed;
1119       if (compiler_type.IsIntegerType(is_signed) ||
1120           compiler_type.IsPointerType()) {
1121         runtime = process->GetLanguageRuntime(eLanguageTypeObjC);
1122       }
1123     }
1124   }
1125 
1126   if (runtime && runtime->GetObjectDescription(s, *this)) {
1127     m_object_desc_str.append(s.GetString());
1128   }
1129 
1130   if (m_object_desc_str.empty())
1131     return NULL;
1132   else
1133     return m_object_desc_str.c_str();
1134 }
1135 
1136 bool ValueObject::GetValueAsCString(const lldb_private::TypeFormatImpl &format,
1137                                     std::string &destination) {
1138   if (UpdateValueIfNeeded(false))
1139     return format.FormatObject(this, destination);
1140   else
1141     return false;
1142 }
1143 
1144 bool ValueObject::GetValueAsCString(lldb::Format format,
1145                                     std::string &destination) {
1146   return GetValueAsCString(TypeFormatImpl_Format(format), destination);
1147 }
1148 
1149 const char *ValueObject::GetValueAsCString() {
1150   if (UpdateValueIfNeeded(true)) {
1151     lldb::TypeFormatImplSP format_sp;
1152     lldb::Format my_format = GetFormat();
1153     if (my_format == lldb::eFormatDefault) {
1154       if (m_type_format_sp)
1155         format_sp = m_type_format_sp;
1156       else {
1157         if (m_is_bitfield_for_scalar)
1158           my_format = eFormatUnsigned;
1159         else {
1160           if (m_value.GetContextType() == Value::eContextTypeRegisterInfo) {
1161             const RegisterInfo *reg_info = m_value.GetRegisterInfo();
1162             if (reg_info)
1163               my_format = reg_info->format;
1164           } else {
1165             my_format = GetValue().GetCompilerType().GetFormat();
1166           }
1167         }
1168       }
1169     }
1170     if (my_format != m_last_format || m_value_str.empty()) {
1171       m_last_format = my_format;
1172       if (!format_sp)
1173         format_sp.reset(new TypeFormatImpl_Format(my_format));
1174       if (GetValueAsCString(*format_sp.get(), m_value_str)) {
1175         if (!m_value_did_change && m_old_value_valid) {
1176           // The value was gotten successfully, so we consider the value as
1177           // changed if the value string differs
1178           SetValueDidChange(m_old_value_str != m_value_str);
1179         }
1180       }
1181     }
1182   }
1183   if (m_value_str.empty())
1184     return NULL;
1185   return m_value_str.c_str();
1186 }
1187 
1188 // if > 8bytes, 0 is returned. this method should mostly be used to read
1189 // address values out of pointers
1190 uint64_t ValueObject::GetValueAsUnsigned(uint64_t fail_value, bool *success) {
1191   // If our byte size is zero this is an aggregate type that has children
1192   if (CanProvideValue()) {
1193     Scalar scalar;
1194     if (ResolveValue(scalar)) {
1195       if (success)
1196         *success = true;
1197       return scalar.ULongLong(fail_value);
1198     }
1199     // fallthrough, otherwise...
1200   }
1201 
1202   if (success)
1203     *success = false;
1204   return fail_value;
1205 }
1206 
1207 int64_t ValueObject::GetValueAsSigned(int64_t fail_value, bool *success) {
1208   // If our byte size is zero this is an aggregate type that has children
1209   if (CanProvideValue()) {
1210     Scalar scalar;
1211     if (ResolveValue(scalar)) {
1212       if (success)
1213         *success = true;
1214       return scalar.SLongLong(fail_value);
1215     }
1216     // fallthrough, otherwise...
1217   }
1218 
1219   if (success)
1220     *success = false;
1221   return fail_value;
1222 }
1223 
1224 // if any more "special cases" are added to
1225 // ValueObject::DumpPrintableRepresentation() please keep this call up to date
1226 // by returning true for your new special cases. We will eventually move to
1227 // checking this call result before trying to display special cases
1228 bool ValueObject::HasSpecialPrintableRepresentation(
1229     ValueObjectRepresentationStyle val_obj_display, Format custom_format) {
1230   Flags flags(GetTypeInfo());
1231   if (flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
1232       val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) {
1233     if (IsCStringContainer(true) &&
1234         (custom_format == eFormatCString || custom_format == eFormatCharArray ||
1235          custom_format == eFormatChar || custom_format == eFormatVectorOfChar))
1236       return true;
1237 
1238     if (flags.Test(eTypeIsArray)) {
1239       if ((custom_format == eFormatBytes) ||
1240           (custom_format == eFormatBytesWithASCII))
1241         return true;
1242 
1243       if ((custom_format == eFormatVectorOfChar) ||
1244           (custom_format == eFormatVectorOfFloat32) ||
1245           (custom_format == eFormatVectorOfFloat64) ||
1246           (custom_format == eFormatVectorOfSInt16) ||
1247           (custom_format == eFormatVectorOfSInt32) ||
1248           (custom_format == eFormatVectorOfSInt64) ||
1249           (custom_format == eFormatVectorOfSInt8) ||
1250           (custom_format == eFormatVectorOfUInt128) ||
1251           (custom_format == eFormatVectorOfUInt16) ||
1252           (custom_format == eFormatVectorOfUInt32) ||
1253           (custom_format == eFormatVectorOfUInt64) ||
1254           (custom_format == eFormatVectorOfUInt8))
1255         return true;
1256     }
1257   }
1258   return false;
1259 }
1260 
1261 bool ValueObject::DumpPrintableRepresentation(
1262     Stream &s, ValueObjectRepresentationStyle val_obj_display,
1263     Format custom_format, PrintableRepresentationSpecialCases special,
1264     bool do_dump_error) {
1265 
1266   Flags flags(GetTypeInfo());
1267 
1268   bool allow_special =
1269       (special == ValueObject::PrintableRepresentationSpecialCases::eAllow);
1270   const bool only_special = false;
1271 
1272   if (allow_special) {
1273     if (flags.AnySet(eTypeIsArray | eTypeIsPointer) &&
1274         val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) {
1275       // when being asked to get a printable display an array or pointer type
1276       // directly, try to "do the right thing"
1277 
1278       if (IsCStringContainer(true) &&
1279           (custom_format == eFormatCString ||
1280            custom_format == eFormatCharArray || custom_format == eFormatChar ||
1281            custom_format ==
1282                eFormatVectorOfChar)) // print char[] & char* directly
1283       {
1284         Status error;
1285         lldb::DataBufferSP buffer_sp;
1286         std::pair<size_t, bool> read_string = ReadPointedString(
1287             buffer_sp, error, 0, (custom_format == eFormatVectorOfChar) ||
1288                                      (custom_format == eFormatCharArray));
1289         lldb_private::formatters::StringPrinter::
1290             ReadBufferAndDumpToStreamOptions options(*this);
1291         options.SetData(DataExtractor(
1292             buffer_sp, lldb::eByteOrderInvalid,
1293             8)); // none of this matters for a string - pass some defaults
1294         options.SetStream(&s);
1295         options.SetPrefixToken(0);
1296         options.SetQuote('"');
1297         options.SetSourceSize(buffer_sp->GetByteSize());
1298         options.SetIsTruncated(read_string.second);
1299         formatters::StringPrinter::ReadBufferAndDumpToStream<
1300             lldb_private::formatters::StringPrinter::StringElementType::ASCII>(
1301             options);
1302         return !error.Fail();
1303       }
1304 
1305       if (custom_format == eFormatEnum)
1306         return false;
1307 
1308       // this only works for arrays, because I have no way to know when the
1309       // pointed memory ends, and no special \0 end of data marker
1310       if (flags.Test(eTypeIsArray)) {
1311         if ((custom_format == eFormatBytes) ||
1312             (custom_format == eFormatBytesWithASCII)) {
1313           const size_t count = GetNumChildren();
1314 
1315           s << '[';
1316           for (size_t low = 0; low < count; low++) {
1317 
1318             if (low)
1319               s << ',';
1320 
1321             ValueObjectSP child = GetChildAtIndex(low, true);
1322             if (!child.get()) {
1323               s << "<invalid child>";
1324               continue;
1325             }
1326             child->DumpPrintableRepresentation(
1327                 s, ValueObject::eValueObjectRepresentationStyleValue,
1328                 custom_format);
1329           }
1330 
1331           s << ']';
1332 
1333           return true;
1334         }
1335 
1336         if ((custom_format == eFormatVectorOfChar) ||
1337             (custom_format == eFormatVectorOfFloat32) ||
1338             (custom_format == eFormatVectorOfFloat64) ||
1339             (custom_format == eFormatVectorOfSInt16) ||
1340             (custom_format == eFormatVectorOfSInt32) ||
1341             (custom_format == eFormatVectorOfSInt64) ||
1342             (custom_format == eFormatVectorOfSInt8) ||
1343             (custom_format == eFormatVectorOfUInt128) ||
1344             (custom_format == eFormatVectorOfUInt16) ||
1345             (custom_format == eFormatVectorOfUInt32) ||
1346             (custom_format == eFormatVectorOfUInt64) ||
1347             (custom_format == eFormatVectorOfUInt8)) // arrays of bytes, bytes
1348                                                      // with ASCII or any vector
1349                                                      // format should be printed
1350                                                      // directly
1351         {
1352           const size_t count = GetNumChildren();
1353 
1354           Format format = FormatManager::GetSingleItemFormat(custom_format);
1355 
1356           s << '[';
1357           for (size_t low = 0; low < count; low++) {
1358 
1359             if (low)
1360               s << ',';
1361 
1362             ValueObjectSP child = GetChildAtIndex(low, true);
1363             if (!child.get()) {
1364               s << "<invalid child>";
1365               continue;
1366             }
1367             child->DumpPrintableRepresentation(
1368                 s, ValueObject::eValueObjectRepresentationStyleValue, format);
1369           }
1370 
1371           s << ']';
1372 
1373           return true;
1374         }
1375       }
1376 
1377       if ((custom_format == eFormatBoolean) ||
1378           (custom_format == eFormatBinary) || (custom_format == eFormatChar) ||
1379           (custom_format == eFormatCharPrintable) ||
1380           (custom_format == eFormatComplexFloat) ||
1381           (custom_format == eFormatDecimal) || (custom_format == eFormatHex) ||
1382           (custom_format == eFormatHexUppercase) ||
1383           (custom_format == eFormatFloat) || (custom_format == eFormatOctal) ||
1384           (custom_format == eFormatOSType) ||
1385           (custom_format == eFormatUnicode16) ||
1386           (custom_format == eFormatUnicode32) ||
1387           (custom_format == eFormatUnsigned) ||
1388           (custom_format == eFormatPointer) ||
1389           (custom_format == eFormatComplexInteger) ||
1390           (custom_format == eFormatComplex) ||
1391           (custom_format == eFormatDefault)) // use the [] operator
1392         return false;
1393     }
1394   }
1395 
1396   if (only_special)
1397     return false;
1398 
1399   bool var_success = false;
1400 
1401   {
1402     llvm::StringRef str;
1403 
1404     // this is a local stream that we are using to ensure that the data pointed
1405     // to by cstr survives long enough for us to copy it to its destination -
1406     // it is necessary to have this temporary storage area for cases where our
1407     // desired output is not backed by some other longer-term storage
1408     StreamString strm;
1409 
1410     if (custom_format != eFormatInvalid)
1411       SetFormat(custom_format);
1412 
1413     switch (val_obj_display) {
1414     case eValueObjectRepresentationStyleValue:
1415       str = GetValueAsCString();
1416       break;
1417 
1418     case eValueObjectRepresentationStyleSummary:
1419       str = GetSummaryAsCString();
1420       break;
1421 
1422     case eValueObjectRepresentationStyleLanguageSpecific:
1423       str = GetObjectDescription();
1424       break;
1425 
1426     case eValueObjectRepresentationStyleLocation:
1427       str = GetLocationAsCString();
1428       break;
1429 
1430     case eValueObjectRepresentationStyleChildrenCount:
1431       strm.Printf("%" PRIu64 "", (uint64_t)GetNumChildren());
1432       str = strm.GetString();
1433       break;
1434 
1435     case eValueObjectRepresentationStyleType:
1436       str = GetTypeName().GetStringRef();
1437       break;
1438 
1439     case eValueObjectRepresentationStyleName:
1440       str = GetName().GetStringRef();
1441       break;
1442 
1443     case eValueObjectRepresentationStyleExpressionPath:
1444       GetExpressionPath(strm, false);
1445       str = strm.GetString();
1446       break;
1447     }
1448 
1449     if (str.empty()) {
1450       if (val_obj_display == eValueObjectRepresentationStyleValue)
1451         str = GetSummaryAsCString();
1452       else if (val_obj_display == eValueObjectRepresentationStyleSummary) {
1453         if (!CanProvideValue()) {
1454           strm.Printf("%s @ %s", GetTypeName().AsCString(),
1455                       GetLocationAsCString());
1456           str = strm.GetString();
1457         } else
1458           str = GetValueAsCString();
1459       }
1460     }
1461 
1462     if (!str.empty())
1463       s << str;
1464     else {
1465       if (m_error.Fail()) {
1466         if (do_dump_error)
1467           s.Printf("<%s>", m_error.AsCString());
1468         else
1469           return false;
1470       } else if (val_obj_display == eValueObjectRepresentationStyleSummary)
1471         s.PutCString("<no summary available>");
1472       else if (val_obj_display == eValueObjectRepresentationStyleValue)
1473         s.PutCString("<no value available>");
1474       else if (val_obj_display ==
1475                eValueObjectRepresentationStyleLanguageSpecific)
1476         s.PutCString("<not a valid Objective-C object>"); // edit this if we
1477                                                           // have other runtimes
1478                                                           // that support a
1479                                                           // description
1480       else
1481         s.PutCString("<no printable representation>");
1482     }
1483 
1484     // we should only return false here if we could not do *anything* even if
1485     // we have an error message as output, that's a success from our callers'
1486     // perspective, so return true
1487     var_success = true;
1488 
1489     if (custom_format != eFormatInvalid)
1490       SetFormat(eFormatDefault);
1491   }
1492 
1493   return var_success;
1494 }
1495 
1496 addr_t ValueObject::GetAddressOf(bool scalar_is_load_address,
1497                                  AddressType *address_type) {
1498   // Can't take address of a bitfield
1499   if (IsBitfield())
1500     return LLDB_INVALID_ADDRESS;
1501 
1502   if (!UpdateValueIfNeeded(false))
1503     return LLDB_INVALID_ADDRESS;
1504 
1505   switch (m_value.GetValueType()) {
1506   case Value::eValueTypeScalar:
1507   case Value::eValueTypeVector:
1508     if (scalar_is_load_address) {
1509       if (address_type)
1510         *address_type = eAddressTypeLoad;
1511       return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1512     }
1513     break;
1514 
1515   case Value::eValueTypeLoadAddress:
1516   case Value::eValueTypeFileAddress: {
1517     if (address_type)
1518       *address_type = m_value.GetValueAddressType();
1519     return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1520   } break;
1521   case Value::eValueTypeHostAddress: {
1522     if (address_type)
1523       *address_type = m_value.GetValueAddressType();
1524     return LLDB_INVALID_ADDRESS;
1525   } break;
1526   }
1527   if (address_type)
1528     *address_type = eAddressTypeInvalid;
1529   return LLDB_INVALID_ADDRESS;
1530 }
1531 
1532 addr_t ValueObject::GetPointerValue(AddressType *address_type) {
1533   addr_t address = LLDB_INVALID_ADDRESS;
1534   if (address_type)
1535     *address_type = eAddressTypeInvalid;
1536 
1537   if (!UpdateValueIfNeeded(false))
1538     return address;
1539 
1540   switch (m_value.GetValueType()) {
1541   case Value::eValueTypeScalar:
1542   case Value::eValueTypeVector:
1543     address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1544     break;
1545 
1546   case Value::eValueTypeHostAddress:
1547   case Value::eValueTypeLoadAddress:
1548   case Value::eValueTypeFileAddress: {
1549     lldb::offset_t data_offset = 0;
1550     address = m_data.GetPointer(&data_offset);
1551   } break;
1552   }
1553 
1554   if (address_type)
1555     *address_type = GetAddressTypeOfChildren();
1556 
1557   return address;
1558 }
1559 
1560 bool ValueObject::SetValueFromCString(const char *value_str, Status &error) {
1561   error.Clear();
1562   // Make sure our value is up to date first so that our location and location
1563   // type is valid.
1564   if (!UpdateValueIfNeeded(false)) {
1565     error.SetErrorString("unable to read value");
1566     return false;
1567   }
1568 
1569   uint64_t count = 0;
1570   const Encoding encoding = GetCompilerType().GetEncoding(count);
1571 
1572   const size_t byte_size = GetByteSize();
1573 
1574   Value::ValueType value_type = m_value.GetValueType();
1575 
1576   if (value_type == Value::eValueTypeScalar) {
1577     // If the value is already a scalar, then let the scalar change itself:
1578     m_value.GetScalar().SetValueFromCString(value_str, encoding, byte_size);
1579   } else if (byte_size <= 16) {
1580     // If the value fits in a scalar, then make a new scalar and again let the
1581     // scalar code do the conversion, then figure out where to put the new
1582     // value.
1583     Scalar new_scalar;
1584     error = new_scalar.SetValueFromCString(value_str, encoding, byte_size);
1585     if (error.Success()) {
1586       switch (value_type) {
1587       case Value::eValueTypeLoadAddress: {
1588         // If it is a load address, then the scalar value is the storage
1589         // location of the data, and we have to shove this value down to that
1590         // load location.
1591         ExecutionContext exe_ctx(GetExecutionContextRef());
1592         Process *process = exe_ctx.GetProcessPtr();
1593         if (process) {
1594           addr_t target_addr =
1595               m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1596           size_t bytes_written = process->WriteScalarToMemory(
1597               target_addr, new_scalar, byte_size, error);
1598           if (!error.Success())
1599             return false;
1600           if (bytes_written != byte_size) {
1601             error.SetErrorString("unable to write value to memory");
1602             return false;
1603           }
1604         }
1605       } break;
1606       case Value::eValueTypeHostAddress: {
1607         // If it is a host address, then we stuff the scalar as a DataBuffer
1608         // into the Value's data.
1609         DataExtractor new_data;
1610         new_data.SetByteOrder(m_data.GetByteOrder());
1611 
1612         DataBufferSP buffer_sp(new DataBufferHeap(byte_size, 0));
1613         m_data.SetData(buffer_sp, 0);
1614         bool success = new_scalar.GetData(new_data);
1615         if (success) {
1616           new_data.CopyByteOrderedData(
1617               0, byte_size, const_cast<uint8_t *>(m_data.GetDataStart()),
1618               byte_size, m_data.GetByteOrder());
1619         }
1620         m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
1621 
1622       } break;
1623       case Value::eValueTypeFileAddress:
1624       case Value::eValueTypeScalar:
1625       case Value::eValueTypeVector:
1626         break;
1627       }
1628     } else {
1629       return false;
1630     }
1631   } else {
1632     // We don't support setting things bigger than a scalar at present.
1633     error.SetErrorString("unable to write aggregate data type");
1634     return false;
1635   }
1636 
1637   // If we have reached this point, then we have successfully changed the
1638   // value.
1639   SetNeedsUpdate();
1640   return true;
1641 }
1642 
1643 bool ValueObject::GetDeclaration(Declaration &decl) {
1644   decl.Clear();
1645   return false;
1646 }
1647 
1648 ConstString ValueObject::GetTypeName() {
1649   return GetCompilerType().GetConstTypeName();
1650 }
1651 
1652 ConstString ValueObject::GetDisplayTypeName() { return GetTypeName(); }
1653 
1654 ConstString ValueObject::GetQualifiedTypeName() {
1655   return GetCompilerType().GetConstQualifiedTypeName();
1656 }
1657 
1658 LanguageType ValueObject::GetObjectRuntimeLanguage() {
1659   return GetCompilerType().GetMinimumLanguage();
1660 }
1661 
1662 void ValueObject::AddSyntheticChild(const ConstString &key,
1663                                     ValueObject *valobj) {
1664   m_synthetic_children[key] = valobj;
1665 }
1666 
1667 ValueObjectSP ValueObject::GetSyntheticChild(const ConstString &key) const {
1668   ValueObjectSP synthetic_child_sp;
1669   std::map<ConstString, ValueObject *>::const_iterator pos =
1670       m_synthetic_children.find(key);
1671   if (pos != m_synthetic_children.end())
1672     synthetic_child_sp = pos->second->GetSP();
1673   return synthetic_child_sp;
1674 }
1675 
1676 uint32_t
1677 ValueObject::GetTypeInfo(CompilerType *pointee_or_element_compiler_type) {
1678   return GetCompilerType().GetTypeInfo(pointee_or_element_compiler_type);
1679 }
1680 
1681 bool ValueObject::IsPointerType() { return GetCompilerType().IsPointerType(); }
1682 
1683 bool ValueObject::IsArrayType() {
1684   return GetCompilerType().IsArrayType(NULL, NULL, NULL);
1685 }
1686 
1687 bool ValueObject::IsScalarType() { return GetCompilerType().IsScalarType(); }
1688 
1689 bool ValueObject::IsIntegerType(bool &is_signed) {
1690   return GetCompilerType().IsIntegerType(is_signed);
1691 }
1692 
1693 bool ValueObject::IsPointerOrReferenceType() {
1694   return GetCompilerType().IsPointerOrReferenceType();
1695 }
1696 
1697 bool ValueObject::IsPossibleDynamicType() {
1698   ExecutionContext exe_ctx(GetExecutionContextRef());
1699   Process *process = exe_ctx.GetProcessPtr();
1700   if (process)
1701     return process->IsPossibleDynamicValue(*this);
1702   else
1703     return GetCompilerType().IsPossibleDynamicType(NULL, true, true);
1704 }
1705 
1706 bool ValueObject::IsRuntimeSupportValue() {
1707   Process *process(GetProcessSP().get());
1708   if (process) {
1709     LanguageRuntime *runtime =
1710         process->GetLanguageRuntime(GetObjectRuntimeLanguage());
1711     if (!runtime)
1712       runtime = process->GetObjCLanguageRuntime();
1713     if (runtime)
1714       return runtime->IsRuntimeSupportValue(*this);
1715   }
1716   return false;
1717 }
1718 
1719 bool ValueObject::IsNilReference() {
1720   if (Language *language = Language::FindPlugin(GetObjectRuntimeLanguage())) {
1721     return language->IsNilReference(*this);
1722   }
1723   return false;
1724 }
1725 
1726 bool ValueObject::IsUninitializedReference() {
1727   if (Language *language = Language::FindPlugin(GetObjectRuntimeLanguage())) {
1728     return language->IsUninitializedReference(*this);
1729   }
1730   return false;
1731 }
1732 
1733 // This allows you to create an array member using and index that doesn't not
1734 // fall in the normal bounds of the array. Many times structure can be defined
1735 // as: struct Collection {
1736 //     uint32_t item_count;
1737 //     Item item_array[0];
1738 // };
1739 // The size of the "item_array" is 1, but many times in practice there are more
1740 // items in "item_array".
1741 
1742 ValueObjectSP ValueObject::GetSyntheticArrayMember(size_t index,
1743                                                    bool can_create) {
1744   ValueObjectSP synthetic_child_sp;
1745   if (IsPointerType() || IsArrayType()) {
1746     char index_str[64];
1747     snprintf(index_str, sizeof(index_str), "[%" PRIu64 "]", (uint64_t)index);
1748     ConstString index_const_str(index_str);
1749     // Check if we have already created a synthetic array member in this valid
1750     // object. If we have we will re-use it.
1751     synthetic_child_sp = GetSyntheticChild(index_const_str);
1752     if (!synthetic_child_sp) {
1753       ValueObject *synthetic_child;
1754       // We haven't made a synthetic array member for INDEX yet, so lets make
1755       // one and cache it for any future reference.
1756       synthetic_child = CreateChildAtIndex(0, true, index);
1757 
1758       // Cache the value if we got one back...
1759       if (synthetic_child) {
1760         AddSyntheticChild(index_const_str, synthetic_child);
1761         synthetic_child_sp = synthetic_child->GetSP();
1762         synthetic_child_sp->SetName(ConstString(index_str));
1763         synthetic_child_sp->m_is_array_item_for_pointer = true;
1764       }
1765     }
1766   }
1767   return synthetic_child_sp;
1768 }
1769 
1770 ValueObjectSP ValueObject::GetSyntheticBitFieldChild(uint32_t from, uint32_t to,
1771                                                      bool can_create) {
1772   ValueObjectSP synthetic_child_sp;
1773   if (IsScalarType()) {
1774     char index_str[64];
1775     snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
1776     ConstString index_const_str(index_str);
1777     // Check if we have already created a synthetic array member in this valid
1778     // object. If we have we will re-use it.
1779     synthetic_child_sp = GetSyntheticChild(index_const_str);
1780     if (!synthetic_child_sp) {
1781       uint32_t bit_field_size = to - from + 1;
1782       uint32_t bit_field_offset = from;
1783       if (GetDataExtractor().GetByteOrder() == eByteOrderBig)
1784         bit_field_offset =
1785             GetByteSize() * 8 - bit_field_size - bit_field_offset;
1786       // We haven't made a synthetic array member for INDEX yet, so lets make
1787       // one and cache it for any future reference.
1788       ValueObjectChild *synthetic_child = new ValueObjectChild(
1789           *this, GetCompilerType(), index_const_str, GetByteSize(), 0,
1790           bit_field_size, bit_field_offset, false, false, eAddressTypeInvalid,
1791           0);
1792 
1793       // Cache the value if we got one back...
1794       if (synthetic_child) {
1795         AddSyntheticChild(index_const_str, synthetic_child);
1796         synthetic_child_sp = synthetic_child->GetSP();
1797         synthetic_child_sp->SetName(ConstString(index_str));
1798         synthetic_child_sp->m_is_bitfield_for_scalar = true;
1799       }
1800     }
1801   }
1802   return synthetic_child_sp;
1803 }
1804 
1805 ValueObjectSP ValueObject::GetSyntheticChildAtOffset(
1806     uint32_t offset, const CompilerType &type, bool can_create,
1807     ConstString name_const_str) {
1808 
1809   ValueObjectSP synthetic_child_sp;
1810 
1811   if (name_const_str.IsEmpty()) {
1812     char name_str[64];
1813     snprintf(name_str, sizeof(name_str), "@%i", offset);
1814     name_const_str.SetCString(name_str);
1815   }
1816 
1817   // Check if we have already created a synthetic array member in this valid
1818   // object. If we have we will re-use it.
1819   synthetic_child_sp = GetSyntheticChild(name_const_str);
1820 
1821   if (synthetic_child_sp.get())
1822     return synthetic_child_sp;
1823 
1824   if (!can_create)
1825     return ValueObjectSP();
1826 
1827   ExecutionContext exe_ctx(GetExecutionContextRef());
1828 
1829   ValueObjectChild *synthetic_child = new ValueObjectChild(
1830       *this, type, name_const_str,
1831       type.GetByteSize(exe_ctx.GetBestExecutionContextScope()), offset, 0, 0,
1832       false, false, eAddressTypeInvalid, 0);
1833   if (synthetic_child) {
1834     AddSyntheticChild(name_const_str, synthetic_child);
1835     synthetic_child_sp = synthetic_child->GetSP();
1836     synthetic_child_sp->SetName(name_const_str);
1837     synthetic_child_sp->m_is_child_at_offset = true;
1838   }
1839   return synthetic_child_sp;
1840 }
1841 
1842 ValueObjectSP ValueObject::GetSyntheticBase(uint32_t offset,
1843                                             const CompilerType &type,
1844                                             bool can_create,
1845                                             ConstString name_const_str) {
1846   ValueObjectSP synthetic_child_sp;
1847 
1848   if (name_const_str.IsEmpty()) {
1849     char name_str[128];
1850     snprintf(name_str, sizeof(name_str), "base%s@%i",
1851              type.GetTypeName().AsCString("<unknown>"), offset);
1852     name_const_str.SetCString(name_str);
1853   }
1854 
1855   // Check if we have already created a synthetic array member in this valid
1856   // object. If we have we will re-use it.
1857   synthetic_child_sp = GetSyntheticChild(name_const_str);
1858 
1859   if (synthetic_child_sp.get())
1860     return synthetic_child_sp;
1861 
1862   if (!can_create)
1863     return ValueObjectSP();
1864 
1865   const bool is_base_class = true;
1866 
1867   ExecutionContext exe_ctx(GetExecutionContextRef());
1868 
1869   ValueObjectChild *synthetic_child = new ValueObjectChild(
1870       *this, type, name_const_str,
1871       type.GetByteSize(exe_ctx.GetBestExecutionContextScope()), offset, 0, 0,
1872       is_base_class, false, eAddressTypeInvalid, 0);
1873   if (synthetic_child) {
1874     AddSyntheticChild(name_const_str, synthetic_child);
1875     synthetic_child_sp = synthetic_child->GetSP();
1876     synthetic_child_sp->SetName(name_const_str);
1877   }
1878   return synthetic_child_sp;
1879 }
1880 
1881 // your expression path needs to have a leading . or -> (unless it somehow
1882 // "looks like" an array, in which case it has a leading [ symbol). while the [
1883 // is meaningful and should be shown to the user, . and -> are just parser
1884 // design, but by no means added information for the user.. strip them off
1885 static const char *SkipLeadingExpressionPathSeparators(const char *expression) {
1886   if (!expression || !expression[0])
1887     return expression;
1888   if (expression[0] == '.')
1889     return expression + 1;
1890   if (expression[0] == '-' && expression[1] == '>')
1891     return expression + 2;
1892   return expression;
1893 }
1894 
1895 ValueObjectSP
1896 ValueObject::GetSyntheticExpressionPathChild(const char *expression,
1897                                              bool can_create) {
1898   ValueObjectSP synthetic_child_sp;
1899   ConstString name_const_string(expression);
1900   // Check if we have already created a synthetic array member in this valid
1901   // object. If we have we will re-use it.
1902   synthetic_child_sp = GetSyntheticChild(name_const_string);
1903   if (!synthetic_child_sp) {
1904     // We haven't made a synthetic array member for expression yet, so lets
1905     // make one and cache it for any future reference.
1906     synthetic_child_sp = GetValueForExpressionPath(
1907         expression, NULL, NULL,
1908         GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal(
1909             GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
1910                 None));
1911 
1912     // Cache the value if we got one back...
1913     if (synthetic_child_sp.get()) {
1914       // FIXME: this causes a "real" child to end up with its name changed to
1915       // the contents of expression
1916       AddSyntheticChild(name_const_string, synthetic_child_sp.get());
1917       synthetic_child_sp->SetName(
1918           ConstString(SkipLeadingExpressionPathSeparators(expression)));
1919     }
1920   }
1921   return synthetic_child_sp;
1922 }
1923 
1924 void ValueObject::CalculateSyntheticValue(bool use_synthetic) {
1925   if (use_synthetic == false)
1926     return;
1927 
1928   TargetSP target_sp(GetTargetSP());
1929   if (target_sp && target_sp->GetEnableSyntheticValue() == false) {
1930     m_synthetic_value = NULL;
1931     return;
1932   }
1933 
1934   lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp);
1935 
1936   if (!UpdateFormatsIfNeeded() && m_synthetic_value)
1937     return;
1938 
1939   if (m_synthetic_children_sp.get() == NULL)
1940     return;
1941 
1942   if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value)
1943     return;
1944 
1945   m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp);
1946 }
1947 
1948 void ValueObject::CalculateDynamicValue(DynamicValueType use_dynamic) {
1949   if (use_dynamic == eNoDynamicValues)
1950     return;
1951 
1952   if (!m_dynamic_value && !IsDynamic()) {
1953     ExecutionContext exe_ctx(GetExecutionContextRef());
1954     Process *process = exe_ctx.GetProcessPtr();
1955     if (process && process->IsPossibleDynamicValue(*this)) {
1956       ClearDynamicTypeInformation();
1957       m_dynamic_value = new ValueObjectDynamicValue(*this, use_dynamic);
1958     }
1959   }
1960 }
1961 
1962 ValueObjectSP ValueObject::GetDynamicValue(DynamicValueType use_dynamic) {
1963   if (use_dynamic == eNoDynamicValues)
1964     return ValueObjectSP();
1965 
1966   if (!IsDynamic() && m_dynamic_value == NULL) {
1967     CalculateDynamicValue(use_dynamic);
1968   }
1969   if (m_dynamic_value)
1970     return m_dynamic_value->GetSP();
1971   else
1972     return ValueObjectSP();
1973 }
1974 
1975 ValueObjectSP ValueObject::GetStaticValue() { return GetSP(); }
1976 
1977 lldb::ValueObjectSP ValueObject::GetNonSyntheticValue() { return GetSP(); }
1978 
1979 ValueObjectSP ValueObject::GetSyntheticValue(bool use_synthetic) {
1980   if (use_synthetic == false)
1981     return ValueObjectSP();
1982 
1983   CalculateSyntheticValue(use_synthetic);
1984 
1985   if (m_synthetic_value)
1986     return m_synthetic_value->GetSP();
1987   else
1988     return ValueObjectSP();
1989 }
1990 
1991 bool ValueObject::HasSyntheticValue() {
1992   UpdateFormatsIfNeeded();
1993 
1994   if (m_synthetic_children_sp.get() == NULL)
1995     return false;
1996 
1997   CalculateSyntheticValue(true);
1998 
1999   if (m_synthetic_value)
2000     return true;
2001   else
2002     return false;
2003 }
2004 
2005 bool ValueObject::GetBaseClassPath(Stream &s) {
2006   if (IsBaseClass()) {
2007     bool parent_had_base_class =
2008         GetParent() && GetParent()->GetBaseClassPath(s);
2009     CompilerType compiler_type = GetCompilerType();
2010     std::string cxx_class_name;
2011     bool this_had_base_class =
2012         ClangASTContext::GetCXXClassName(compiler_type, cxx_class_name);
2013     if (this_had_base_class) {
2014       if (parent_had_base_class)
2015         s.PutCString("::");
2016       s.PutCString(cxx_class_name);
2017     }
2018     return parent_had_base_class || this_had_base_class;
2019   }
2020   return false;
2021 }
2022 
2023 ValueObject *ValueObject::GetNonBaseClassParent() {
2024   if (GetParent()) {
2025     if (GetParent()->IsBaseClass())
2026       return GetParent()->GetNonBaseClassParent();
2027     else
2028       return GetParent();
2029   }
2030   return NULL;
2031 }
2032 
2033 bool ValueObject::IsBaseClass(uint32_t &depth) {
2034   if (!IsBaseClass()) {
2035     depth = 0;
2036     return false;
2037   }
2038   if (GetParent()) {
2039     GetParent()->IsBaseClass(depth);
2040     depth = depth + 1;
2041     return true;
2042   }
2043   // TODO: a base of no parent? weird..
2044   depth = 1;
2045   return true;
2046 }
2047 
2048 void ValueObject::GetExpressionPath(Stream &s, bool qualify_cxx_base_classes,
2049                                     GetExpressionPathFormat epformat) {
2050   // synthetic children do not actually "exist" as part of the hierarchy, and
2051   // sometimes they are consed up in ways that don't make sense from an
2052   // underlying language/API standpoint. So, use a special code path here to
2053   // return something that can hopefully be used in expression
2054   if (m_is_synthetic_children_generated) {
2055     UpdateValueIfNeeded();
2056 
2057     if (m_value.GetValueType() == Value::eValueTypeLoadAddress) {
2058       if (IsPointerOrReferenceType()) {
2059         s.Printf("((%s)0x%" PRIx64 ")", GetTypeName().AsCString("void"),
2060                  GetValueAsUnsigned(0));
2061         return;
2062       } else {
2063         uint64_t load_addr =
2064             m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
2065         if (load_addr != LLDB_INVALID_ADDRESS) {
2066           s.Printf("(*( (%s *)0x%" PRIx64 "))", GetTypeName().AsCString("void"),
2067                    load_addr);
2068           return;
2069         }
2070       }
2071     }
2072 
2073     if (CanProvideValue()) {
2074       s.Printf("((%s)%s)", GetTypeName().AsCString("void"),
2075                GetValueAsCString());
2076       return;
2077     }
2078 
2079     return;
2080   }
2081 
2082   const bool is_deref_of_parent = IsDereferenceOfParent();
2083 
2084   if (is_deref_of_parent &&
2085       epformat == eGetExpressionPathFormatDereferencePointers) {
2086     // this is the original format of GetExpressionPath() producing code like
2087     // *(a_ptr).memberName, which is entirely fine, until you put this into
2088     // StackFrame::GetValueForVariableExpressionPath() which prefers to see
2089     // a_ptr->memberName. the eHonorPointers mode is meant to produce strings
2090     // in this latter format
2091     s.PutCString("*(");
2092   }
2093 
2094   ValueObject *parent = GetParent();
2095 
2096   if (parent)
2097     parent->GetExpressionPath(s, qualify_cxx_base_classes, epformat);
2098 
2099   // if we are a deref_of_parent just because we are synthetic array members
2100   // made up to allow ptr[%d] syntax to work in variable printing, then add our
2101   // name ([%d]) to the expression path
2102   if (m_is_array_item_for_pointer &&
2103       epformat == eGetExpressionPathFormatHonorPointers)
2104     s.PutCString(m_name.AsCString());
2105 
2106   if (!IsBaseClass()) {
2107     if (!is_deref_of_parent) {
2108       ValueObject *non_base_class_parent = GetNonBaseClassParent();
2109       if (non_base_class_parent &&
2110           !non_base_class_parent->GetName().IsEmpty()) {
2111         CompilerType non_base_class_parent_compiler_type =
2112             non_base_class_parent->GetCompilerType();
2113         if (non_base_class_parent_compiler_type) {
2114           if (parent && parent->IsDereferenceOfParent() &&
2115               epformat == eGetExpressionPathFormatHonorPointers) {
2116             s.PutCString("->");
2117           } else {
2118             const uint32_t non_base_class_parent_type_info =
2119                 non_base_class_parent_compiler_type.GetTypeInfo();
2120 
2121             if (non_base_class_parent_type_info & eTypeIsPointer) {
2122               s.PutCString("->");
2123             } else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2124                        !(non_base_class_parent_type_info & eTypeIsArray)) {
2125               s.PutChar('.');
2126             }
2127           }
2128         }
2129       }
2130 
2131       const char *name = GetName().GetCString();
2132       if (name) {
2133         if (qualify_cxx_base_classes) {
2134           if (GetBaseClassPath(s))
2135             s.PutCString("::");
2136         }
2137         s.PutCString(name);
2138       }
2139     }
2140   }
2141 
2142   if (is_deref_of_parent &&
2143       epformat == eGetExpressionPathFormatDereferencePointers) {
2144     s.PutChar(')');
2145   }
2146 }
2147 
2148 ValueObjectSP ValueObject::GetValueForExpressionPath(
2149     llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop,
2150     ExpressionPathEndResultType *final_value_type,
2151     const GetValueForExpressionPathOptions &options,
2152     ExpressionPathAftermath *final_task_on_target) {
2153 
2154   ExpressionPathScanEndReason dummy_reason_to_stop =
2155       ValueObject::eExpressionPathScanEndReasonUnknown;
2156   ExpressionPathEndResultType dummy_final_value_type =
2157       ValueObject::eExpressionPathEndResultTypeInvalid;
2158   ExpressionPathAftermath dummy_final_task_on_target =
2159       ValueObject::eExpressionPathAftermathNothing;
2160 
2161   ValueObjectSP ret_val = GetValueForExpressionPath_Impl(
2162       expression, reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2163       final_value_type ? final_value_type : &dummy_final_value_type, options,
2164       final_task_on_target ? final_task_on_target
2165                            : &dummy_final_task_on_target);
2166 
2167   if (!final_task_on_target ||
2168       *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2169     return ret_val;
2170 
2171   if (ret_val.get() &&
2172       ((final_value_type ? *final_value_type : dummy_final_value_type) ==
2173        eExpressionPathEndResultTypePlain)) // I can only deref and takeaddress
2174                                            // of plain objects
2175   {
2176     if ((final_task_on_target ? *final_task_on_target
2177                               : dummy_final_task_on_target) ==
2178         ValueObject::eExpressionPathAftermathDereference) {
2179       Status error;
2180       ValueObjectSP final_value = ret_val->Dereference(error);
2181       if (error.Fail() || !final_value.get()) {
2182         if (reason_to_stop)
2183           *reason_to_stop =
2184               ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2185         if (final_value_type)
2186           *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2187         return ValueObjectSP();
2188       } else {
2189         if (final_task_on_target)
2190           *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2191         return final_value;
2192       }
2193     }
2194     if (*final_task_on_target ==
2195         ValueObject::eExpressionPathAftermathTakeAddress) {
2196       Status error;
2197       ValueObjectSP final_value = ret_val->AddressOf(error);
2198       if (error.Fail() || !final_value.get()) {
2199         if (reason_to_stop)
2200           *reason_to_stop =
2201               ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2202         if (final_value_type)
2203           *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2204         return ValueObjectSP();
2205       } else {
2206         if (final_task_on_target)
2207           *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2208         return final_value;
2209       }
2210     }
2211   }
2212   return ret_val; // final_task_on_target will still have its original value, so
2213                   // you know I did not do it
2214 }
2215 
2216 ValueObjectSP ValueObject::GetValueForExpressionPath_Impl(
2217     llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop,
2218     ExpressionPathEndResultType *final_result,
2219     const GetValueForExpressionPathOptions &options,
2220     ExpressionPathAftermath *what_next) {
2221   ValueObjectSP root = GetSP();
2222 
2223   if (!root)
2224     return nullptr;
2225 
2226   llvm::StringRef remainder = expression;
2227 
2228   while (true) {
2229     llvm::StringRef temp_expression = remainder;
2230 
2231     CompilerType root_compiler_type = root->GetCompilerType();
2232     CompilerType pointee_compiler_type;
2233     Flags pointee_compiler_type_info;
2234 
2235     Flags root_compiler_type_info(
2236         root_compiler_type.GetTypeInfo(&pointee_compiler_type));
2237     if (pointee_compiler_type)
2238       pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
2239 
2240     if (temp_expression.empty()) {
2241       *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2242       return root;
2243     }
2244 
2245     switch (temp_expression.front()) {
2246     case '-': {
2247       temp_expression = temp_expression.drop_front();
2248       if (options.m_check_dot_vs_arrow_syntax &&
2249           root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to
2250                                                         // use -> on a
2251                                                         // non-pointer and I
2252                                                         // must catch the error
2253       {
2254         *reason_to_stop =
2255             ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot;
2256         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2257         return ValueObjectSP();
2258       }
2259       if (root_compiler_type_info.Test(eTypeIsObjC) && // if yo are trying to
2260                                                        // extract an ObjC IVar
2261                                                        // when this is forbidden
2262           root_compiler_type_info.Test(eTypeIsPointer) &&
2263           options.m_no_fragile_ivar) {
2264         *reason_to_stop =
2265             ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed;
2266         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2267         return ValueObjectSP();
2268       }
2269       if (!temp_expression.startswith(">")) {
2270         *reason_to_stop =
2271             ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2272         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2273         return ValueObjectSP();
2274       }
2275     }
2276       LLVM_FALLTHROUGH;
2277     case '.': // or fallthrough from ->
2278     {
2279       if (options.m_check_dot_vs_arrow_syntax &&
2280           temp_expression.front() == '.' &&
2281           root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to
2282                                                         // use . on a pointer
2283                                                         // and I must catch the
2284                                                         // error
2285       {
2286         *reason_to_stop =
2287             ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow;
2288         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2289         return nullptr;
2290       }
2291       temp_expression = temp_expression.drop_front(); // skip . or >
2292 
2293       size_t next_sep_pos = temp_expression.find_first_of("-.[", 1);
2294       ConstString child_name;
2295       if (next_sep_pos == llvm::StringRef::npos) // if no other separator just
2296                                                  // expand this last layer
2297       {
2298         child_name.SetString(temp_expression);
2299         ValueObjectSP child_valobj_sp =
2300             root->GetChildMemberWithName(child_name, true);
2301 
2302         if (child_valobj_sp.get()) // we know we are done, so just return
2303         {
2304           *reason_to_stop =
2305               ValueObject::eExpressionPathScanEndReasonEndOfString;
2306           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2307           return child_valobj_sp;
2308         } else {
2309           switch (options.m_synthetic_children_traversal) {
2310           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2311               None:
2312             break;
2313           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2314               FromSynthetic:
2315             if (root->IsSynthetic()) {
2316               child_valobj_sp = root->GetNonSyntheticValue();
2317               if (child_valobj_sp.get())
2318                 child_valobj_sp =
2319                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2320             }
2321             break;
2322           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2323               ToSynthetic:
2324             if (!root->IsSynthetic()) {
2325               child_valobj_sp = root->GetSyntheticValue();
2326               if (child_valobj_sp.get())
2327                 child_valobj_sp =
2328                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2329             }
2330             break;
2331           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2332               Both:
2333             if (root->IsSynthetic()) {
2334               child_valobj_sp = root->GetNonSyntheticValue();
2335               if (child_valobj_sp.get())
2336                 child_valobj_sp =
2337                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2338             } else {
2339               child_valobj_sp = root->GetSyntheticValue();
2340               if (child_valobj_sp.get())
2341                 child_valobj_sp =
2342                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2343             }
2344             break;
2345           }
2346         }
2347 
2348         // if we are here and options.m_no_synthetic_children is true,
2349         // child_valobj_sp is going to be a NULL SP, so we hit the "else"
2350         // branch, and return an error
2351         if (child_valobj_sp.get()) // if it worked, just return
2352         {
2353           *reason_to_stop =
2354               ValueObject::eExpressionPathScanEndReasonEndOfString;
2355           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2356           return child_valobj_sp;
2357         } else {
2358           *reason_to_stop =
2359               ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2360           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2361           return nullptr;
2362         }
2363       } else // other layers do expand
2364       {
2365         llvm::StringRef next_separator = temp_expression.substr(next_sep_pos);
2366 
2367         child_name.SetString(temp_expression.slice(0, next_sep_pos));
2368 
2369         ValueObjectSP child_valobj_sp =
2370             root->GetChildMemberWithName(child_name, true);
2371         if (child_valobj_sp.get()) // store the new root and move on
2372         {
2373           root = child_valobj_sp;
2374           remainder = next_separator;
2375           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2376           continue;
2377         } else {
2378           switch (options.m_synthetic_children_traversal) {
2379           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2380               None:
2381             break;
2382           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2383               FromSynthetic:
2384             if (root->IsSynthetic()) {
2385               child_valobj_sp = root->GetNonSyntheticValue();
2386               if (child_valobj_sp.get())
2387                 child_valobj_sp =
2388                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2389             }
2390             break;
2391           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2392               ToSynthetic:
2393             if (!root->IsSynthetic()) {
2394               child_valobj_sp = root->GetSyntheticValue();
2395               if (child_valobj_sp.get())
2396                 child_valobj_sp =
2397                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2398             }
2399             break;
2400           case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2401               Both:
2402             if (root->IsSynthetic()) {
2403               child_valobj_sp = root->GetNonSyntheticValue();
2404               if (child_valobj_sp.get())
2405                 child_valobj_sp =
2406                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2407             } else {
2408               child_valobj_sp = root->GetSyntheticValue();
2409               if (child_valobj_sp.get())
2410                 child_valobj_sp =
2411                     child_valobj_sp->GetChildMemberWithName(child_name, true);
2412             }
2413             break;
2414           }
2415         }
2416 
2417         // if we are here and options.m_no_synthetic_children is true,
2418         // child_valobj_sp is going to be a NULL SP, so we hit the "else"
2419         // branch, and return an error
2420         if (child_valobj_sp.get()) // if it worked, move on
2421         {
2422           root = child_valobj_sp;
2423           remainder = next_separator;
2424           *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2425           continue;
2426         } else {
2427           *reason_to_stop =
2428               ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2429           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2430           return nullptr;
2431         }
2432       }
2433       break;
2434     }
2435     case '[': {
2436       if (!root_compiler_type_info.Test(eTypeIsArray) &&
2437           !root_compiler_type_info.Test(eTypeIsPointer) &&
2438           !root_compiler_type_info.Test(
2439               eTypeIsVector)) // if this is not a T[] nor a T*
2440       {
2441         if (!root_compiler_type_info.Test(
2442                 eTypeIsScalar)) // if this is not even a scalar...
2443         {
2444           if (options.m_synthetic_children_traversal ==
2445               GetValueForExpressionPathOptions::SyntheticChildrenTraversal::
2446                   None) // ...only chance left is synthetic
2447           {
2448             *reason_to_stop =
2449                 ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
2450             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2451             return ValueObjectSP();
2452           }
2453         } else if (!options.m_allow_bitfields_syntax) // if this is a scalar,
2454                                                       // check that we can
2455                                                       // expand bitfields
2456         {
2457           *reason_to_stop =
2458               ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
2459           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2460           return ValueObjectSP();
2461         }
2462       }
2463       if (temp_expression[1] ==
2464           ']') // if this is an unbounded range it only works for arrays
2465       {
2466         if (!root_compiler_type_info.Test(eTypeIsArray)) {
2467           *reason_to_stop =
2468               ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2469           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2470           return nullptr;
2471         } else // even if something follows, we cannot expand unbounded ranges,
2472                // just let the caller do it
2473         {
2474           *reason_to_stop =
2475               ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2476           *final_result =
2477               ValueObject::eExpressionPathEndResultTypeUnboundedRange;
2478           return root;
2479         }
2480       }
2481 
2482       size_t close_bracket_position = temp_expression.find(']', 1);
2483       if (close_bracket_position ==
2484           llvm::StringRef::npos) // if there is no ], this is a syntax error
2485       {
2486         *reason_to_stop =
2487             ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2488         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2489         return nullptr;
2490       }
2491 
2492       llvm::StringRef bracket_expr =
2493           temp_expression.slice(1, close_bracket_position);
2494 
2495       // If this was an empty expression it would have been caught by the if
2496       // above.
2497       assert(!bracket_expr.empty());
2498 
2499       if (!bracket_expr.contains('-')) {
2500         // if no separator, this is of the form [N].  Note that this cannot be
2501         // an unbounded range of the form [], because that case was handled
2502         // above with an unconditional return.
2503         unsigned long index = 0;
2504         if (bracket_expr.getAsInteger(0, index)) {
2505           *reason_to_stop =
2506               ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2507           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2508           return nullptr;
2509         }
2510 
2511         // from here on we do have a valid index
2512         if (root_compiler_type_info.Test(eTypeIsArray)) {
2513           ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
2514           if (!child_valobj_sp)
2515             child_valobj_sp = root->GetSyntheticArrayMember(index, true);
2516           if (!child_valobj_sp)
2517             if (root->HasSyntheticValue() &&
2518                 root->GetSyntheticValue()->GetNumChildren() > index)
2519               child_valobj_sp =
2520                   root->GetSyntheticValue()->GetChildAtIndex(index, true);
2521           if (child_valobj_sp) {
2522             root = child_valobj_sp;
2523             remainder =
2524                 temp_expression.substr(close_bracket_position + 1); // skip ]
2525             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2526             continue;
2527           } else {
2528             *reason_to_stop =
2529                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2530             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2531             return nullptr;
2532           }
2533         } else if (root_compiler_type_info.Test(eTypeIsPointer)) {
2534           if (*what_next ==
2535                   ValueObject::
2536                       eExpressionPathAftermathDereference && // if this is a
2537                                                              // ptr-to-scalar, I
2538                                                              // am accessing it
2539                                                              // by index and I
2540                                                              // would have
2541                                                              // deref'ed anyway,
2542                                                              // then do it now
2543                                                              // and use this as
2544                                                              // a bitfield
2545               pointee_compiler_type_info.Test(eTypeIsScalar)) {
2546             Status error;
2547             root = root->Dereference(error);
2548             if (error.Fail() || !root) {
2549               *reason_to_stop =
2550                   ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2551               *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2552               return nullptr;
2553             } else {
2554               *what_next = eExpressionPathAftermathNothing;
2555               continue;
2556             }
2557           } else {
2558             if (root->GetCompilerType().GetMinimumLanguage() ==
2559                     eLanguageTypeObjC &&
2560                 pointee_compiler_type_info.AllClear(eTypeIsPointer) &&
2561                 root->HasSyntheticValue() &&
2562                 (options.m_synthetic_children_traversal ==
2563                      GetValueForExpressionPathOptions::
2564                          SyntheticChildrenTraversal::ToSynthetic ||
2565                  options.m_synthetic_children_traversal ==
2566                      GetValueForExpressionPathOptions::
2567                          SyntheticChildrenTraversal::Both)) {
2568               root = root->GetSyntheticValue()->GetChildAtIndex(index, true);
2569             } else
2570               root = root->GetSyntheticArrayMember(index, true);
2571             if (!root) {
2572               *reason_to_stop =
2573                   ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2574               *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2575               return nullptr;
2576             } else {
2577               remainder =
2578                   temp_expression.substr(close_bracket_position + 1); // skip ]
2579               *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2580               continue;
2581             }
2582           }
2583         } else if (root_compiler_type_info.Test(eTypeIsScalar)) {
2584           root = root->GetSyntheticBitFieldChild(index, index, true);
2585           if (!root) {
2586             *reason_to_stop =
2587                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2588             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2589             return nullptr;
2590           } else // we do not know how to expand members of bitfields, so we
2591                  // just return and let the caller do any further processing
2592           {
2593             *reason_to_stop = ValueObject::
2594                 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2595             *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
2596             return root;
2597           }
2598         } else if (root_compiler_type_info.Test(eTypeIsVector)) {
2599           root = root->GetChildAtIndex(index, true);
2600           if (!root) {
2601             *reason_to_stop =
2602                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2603             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2604             return ValueObjectSP();
2605           } else {
2606             remainder =
2607                 temp_expression.substr(close_bracket_position + 1); // skip ]
2608             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2609             continue;
2610           }
2611         } else if (options.m_synthetic_children_traversal ==
2612                        GetValueForExpressionPathOptions::
2613                            SyntheticChildrenTraversal::ToSynthetic ||
2614                    options.m_synthetic_children_traversal ==
2615                        GetValueForExpressionPathOptions::
2616                            SyntheticChildrenTraversal::Both) {
2617           if (root->HasSyntheticValue())
2618             root = root->GetSyntheticValue();
2619           else if (!root->IsSynthetic()) {
2620             *reason_to_stop =
2621                 ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
2622             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2623             return nullptr;
2624           }
2625           // if we are here, then root itself is a synthetic VO.. should be
2626           // good to go
2627 
2628           if (!root) {
2629             *reason_to_stop =
2630                 ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
2631             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2632             return nullptr;
2633           }
2634           root = root->GetChildAtIndex(index, true);
2635           if (!root) {
2636             *reason_to_stop =
2637                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2638             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2639             return nullptr;
2640           } else {
2641             remainder =
2642                 temp_expression.substr(close_bracket_position + 1); // skip ]
2643             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2644             continue;
2645           }
2646         } else {
2647           *reason_to_stop =
2648               ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2649           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2650           return nullptr;
2651         }
2652       } else {
2653         // we have a low and a high index
2654         llvm::StringRef sleft, sright;
2655         unsigned long low_index, high_index;
2656         std::tie(sleft, sright) = bracket_expr.split('-');
2657         if (sleft.getAsInteger(0, low_index) ||
2658             sright.getAsInteger(0, high_index)) {
2659           *reason_to_stop =
2660               ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2661           *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2662           return nullptr;
2663         }
2664 
2665         if (low_index > high_index) // swap indices if required
2666           std::swap(low_index, high_index);
2667 
2668         if (root_compiler_type_info.Test(
2669                 eTypeIsScalar)) // expansion only works for scalars
2670         {
2671           root = root->GetSyntheticBitFieldChild(low_index, high_index, true);
2672           if (!root) {
2673             *reason_to_stop =
2674                 ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2675             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2676             return nullptr;
2677           } else {
2678             *reason_to_stop = ValueObject::
2679                 eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2680             *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
2681             return root;
2682           }
2683         } else if (root_compiler_type_info.Test(
2684                        eTypeIsPointer) && // if this is a ptr-to-scalar, I am
2685                                           // accessing it by index and I would
2686                                           // have deref'ed anyway, then do it
2687                                           // now and use this as a bitfield
2688                    *what_next ==
2689                        ValueObject::eExpressionPathAftermathDereference &&
2690                    pointee_compiler_type_info.Test(eTypeIsScalar)) {
2691           Status error;
2692           root = root->Dereference(error);
2693           if (error.Fail() || !root) {
2694             *reason_to_stop =
2695                 ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2696             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2697             return nullptr;
2698           } else {
2699             *what_next = ValueObject::eExpressionPathAftermathNothing;
2700             continue;
2701           }
2702         } else {
2703           *reason_to_stop =
2704               ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2705           *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange;
2706           return root;
2707         }
2708       }
2709       break;
2710     }
2711     default: // some non-separator is in the way
2712     {
2713       *reason_to_stop =
2714           ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2715       *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2716       return nullptr;
2717     }
2718     }
2719   }
2720 }
2721 
2722 void ValueObject::LogValueObject(Log *log) {
2723   if (log)
2724     return LogValueObject(log, DumpValueObjectOptions(*this));
2725 }
2726 
2727 void ValueObject::LogValueObject(Log *log,
2728                                  const DumpValueObjectOptions &options) {
2729   if (log) {
2730     StreamString s;
2731     Dump(s, options);
2732     if (s.GetSize())
2733       log->PutCString(s.GetData());
2734   }
2735 }
2736 
2737 void ValueObject::Dump(Stream &s) { Dump(s, DumpValueObjectOptions(*this)); }
2738 
2739 void ValueObject::Dump(Stream &s, const DumpValueObjectOptions &options) {
2740   ValueObjectPrinter printer(this, &s, options);
2741   printer.PrintValueObject();
2742 }
2743 
2744 ValueObjectSP ValueObject::CreateConstantValue(const ConstString &name) {
2745   ValueObjectSP valobj_sp;
2746 
2747   if (UpdateValueIfNeeded(false) && m_error.Success()) {
2748     ExecutionContext exe_ctx(GetExecutionContextRef());
2749 
2750     DataExtractor data;
2751     data.SetByteOrder(m_data.GetByteOrder());
2752     data.SetAddressByteSize(m_data.GetAddressByteSize());
2753 
2754     if (IsBitfield()) {
2755       Value v(Scalar(GetValueAsUnsigned(UINT64_MAX)));
2756       m_error = v.GetValueAsData(&exe_ctx, data, 0, GetModule().get());
2757     } else
2758       m_error = m_value.GetValueAsData(&exe_ctx, data, 0, GetModule().get());
2759 
2760     valobj_sp = ValueObjectConstResult::Create(
2761         exe_ctx.GetBestExecutionContextScope(), GetCompilerType(), name, data,
2762         GetAddressOf());
2763   }
2764 
2765   if (!valobj_sp) {
2766     ExecutionContext exe_ctx(GetExecutionContextRef());
2767     valobj_sp = ValueObjectConstResult::Create(
2768         exe_ctx.GetBestExecutionContextScope(), m_error);
2769   }
2770   return valobj_sp;
2771 }
2772 
2773 ValueObjectSP ValueObject::GetQualifiedRepresentationIfAvailable(
2774     lldb::DynamicValueType dynValue, bool synthValue) {
2775   ValueObjectSP result_sp(GetSP());
2776 
2777   switch (dynValue) {
2778   case lldb::eDynamicCanRunTarget:
2779   case lldb::eDynamicDontRunTarget: {
2780     if (!result_sp->IsDynamic()) {
2781       if (result_sp->GetDynamicValue(dynValue))
2782         result_sp = result_sp->GetDynamicValue(dynValue);
2783     }
2784   } break;
2785   case lldb::eNoDynamicValues: {
2786     if (result_sp->IsDynamic()) {
2787       if (result_sp->GetStaticValue())
2788         result_sp = result_sp->GetStaticValue();
2789     }
2790   } break;
2791   }
2792 
2793   if (synthValue) {
2794     if (!result_sp->IsSynthetic()) {
2795       if (result_sp->GetSyntheticValue())
2796         result_sp = result_sp->GetSyntheticValue();
2797     }
2798   } else {
2799     if (result_sp->IsSynthetic()) {
2800       if (result_sp->GetNonSyntheticValue())
2801         result_sp = result_sp->GetNonSyntheticValue();
2802     }
2803   }
2804 
2805   return result_sp;
2806 }
2807 
2808 lldb::addr_t ValueObject::GetCPPVTableAddress(AddressType &address_type) {
2809   CompilerType pointee_type;
2810   CompilerType this_type(GetCompilerType());
2811   uint32_t type_info = this_type.GetTypeInfo(&pointee_type);
2812   if (type_info) {
2813     bool ptr_or_ref = false;
2814     if (type_info & (eTypeIsPointer | eTypeIsReference)) {
2815       ptr_or_ref = true;
2816       type_info = pointee_type.GetTypeInfo();
2817     }
2818 
2819     const uint32_t cpp_class = eTypeIsClass | eTypeIsCPlusPlus;
2820     if ((type_info & cpp_class) == cpp_class) {
2821       if (ptr_or_ref) {
2822         address_type = GetAddressTypeOfChildren();
2823         return GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
2824       } else
2825         return GetAddressOf(false, &address_type);
2826     }
2827   }
2828 
2829   address_type = eAddressTypeInvalid;
2830   return LLDB_INVALID_ADDRESS;
2831 }
2832 
2833 ValueObjectSP ValueObject::Dereference(Status &error) {
2834   if (m_deref_valobj)
2835     return m_deref_valobj->GetSP();
2836 
2837   const bool is_pointer_or_reference_type = IsPointerOrReferenceType();
2838   if (is_pointer_or_reference_type) {
2839     bool omit_empty_base_classes = true;
2840     bool ignore_array_bounds = false;
2841 
2842     std::string child_name_str;
2843     uint32_t child_byte_size = 0;
2844     int32_t child_byte_offset = 0;
2845     uint32_t child_bitfield_bit_size = 0;
2846     uint32_t child_bitfield_bit_offset = 0;
2847     bool child_is_base_class = false;
2848     bool child_is_deref_of_parent = false;
2849     const bool transparent_pointers = false;
2850     CompilerType compiler_type = GetCompilerType();
2851     CompilerType child_compiler_type;
2852     uint64_t language_flags;
2853 
2854     ExecutionContext exe_ctx(GetExecutionContextRef());
2855 
2856     child_compiler_type = compiler_type.GetChildCompilerTypeAtIndex(
2857         &exe_ctx, 0, transparent_pointers, omit_empty_base_classes,
2858         ignore_array_bounds, child_name_str, child_byte_size, child_byte_offset,
2859         child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
2860         child_is_deref_of_parent, this, language_flags);
2861     if (child_compiler_type && child_byte_size) {
2862       ConstString child_name;
2863       if (!child_name_str.empty())
2864         child_name.SetCString(child_name_str.c_str());
2865 
2866       m_deref_valobj = new ValueObjectChild(
2867           *this, child_compiler_type, child_name, child_byte_size,
2868           child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
2869           child_is_base_class, child_is_deref_of_parent, eAddressTypeInvalid,
2870           language_flags);
2871     }
2872   } else if (HasSyntheticValue()) {
2873     m_deref_valobj =
2874         GetSyntheticValue()
2875             ->GetChildMemberWithName(ConstString("$$dereference$$"), true)
2876             .get();
2877   }
2878 
2879   if (m_deref_valobj) {
2880     error.Clear();
2881     return m_deref_valobj->GetSP();
2882   } else {
2883     StreamString strm;
2884     GetExpressionPath(strm, true);
2885 
2886     if (is_pointer_or_reference_type)
2887       error.SetErrorStringWithFormat("dereference failed: (%s) %s",
2888                                      GetTypeName().AsCString("<invalid type>"),
2889                                      strm.GetData());
2890     else
2891       error.SetErrorStringWithFormat("not a pointer or reference type: (%s) %s",
2892                                      GetTypeName().AsCString("<invalid type>"),
2893                                      strm.GetData());
2894     return ValueObjectSP();
2895   }
2896 }
2897 
2898 ValueObjectSP ValueObject::AddressOf(Status &error) {
2899   if (m_addr_of_valobj_sp)
2900     return m_addr_of_valobj_sp;
2901 
2902   AddressType address_type = eAddressTypeInvalid;
2903   const bool scalar_is_load_address = false;
2904   addr_t addr = GetAddressOf(scalar_is_load_address, &address_type);
2905   error.Clear();
2906   if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost) {
2907     switch (address_type) {
2908     case eAddressTypeInvalid: {
2909       StreamString expr_path_strm;
2910       GetExpressionPath(expr_path_strm, true);
2911       error.SetErrorStringWithFormat("'%s' is not in memory",
2912                                      expr_path_strm.GetData());
2913     } break;
2914 
2915     case eAddressTypeFile:
2916     case eAddressTypeLoad: {
2917       CompilerType compiler_type = GetCompilerType();
2918       if (compiler_type) {
2919         std::string name(1, '&');
2920         name.append(m_name.AsCString(""));
2921         ExecutionContext exe_ctx(GetExecutionContextRef());
2922         m_addr_of_valobj_sp = ValueObjectConstResult::Create(
2923             exe_ctx.GetBestExecutionContextScope(),
2924             compiler_type.GetPointerType(), ConstString(name.c_str()), addr,
2925             eAddressTypeInvalid, m_data.GetAddressByteSize());
2926       }
2927     } break;
2928     default:
2929       break;
2930     }
2931   } else {
2932     StreamString expr_path_strm;
2933     GetExpressionPath(expr_path_strm, true);
2934     error.SetErrorStringWithFormat("'%s' doesn't have a valid address",
2935                                    expr_path_strm.GetData());
2936   }
2937 
2938   return m_addr_of_valobj_sp;
2939 }
2940 
2941 ValueObjectSP ValueObject::Cast(const CompilerType &compiler_type) {
2942   return ValueObjectCast::Create(*this, GetName(), compiler_type);
2943 }
2944 
2945 lldb::ValueObjectSP ValueObject::Clone(const ConstString &new_name) {
2946   return ValueObjectCast::Create(*this, new_name, GetCompilerType());
2947 }
2948 
2949 ValueObjectSP ValueObject::CastPointerType(const char *name,
2950                                            CompilerType &compiler_type) {
2951   ValueObjectSP valobj_sp;
2952   AddressType address_type;
2953   addr_t ptr_value = GetPointerValue(&address_type);
2954 
2955   if (ptr_value != LLDB_INVALID_ADDRESS) {
2956     Address ptr_addr(ptr_value);
2957     ExecutionContext exe_ctx(GetExecutionContextRef());
2958     valobj_sp = ValueObjectMemory::Create(
2959         exe_ctx.GetBestExecutionContextScope(), name, ptr_addr, compiler_type);
2960   }
2961   return valobj_sp;
2962 }
2963 
2964 ValueObjectSP ValueObject::CastPointerType(const char *name, TypeSP &type_sp) {
2965   ValueObjectSP valobj_sp;
2966   AddressType address_type;
2967   addr_t ptr_value = GetPointerValue(&address_type);
2968 
2969   if (ptr_value != LLDB_INVALID_ADDRESS) {
2970     Address ptr_addr(ptr_value);
2971     ExecutionContext exe_ctx(GetExecutionContextRef());
2972     valobj_sp = ValueObjectMemory::Create(
2973         exe_ctx.GetBestExecutionContextScope(), name, ptr_addr, type_sp);
2974   }
2975   return valobj_sp;
2976 }
2977 
2978 ValueObject::EvaluationPoint::EvaluationPoint()
2979     : m_mod_id(), m_exe_ctx_ref(), m_needs_update(true) {}
2980 
2981 ValueObject::EvaluationPoint::EvaluationPoint(ExecutionContextScope *exe_scope,
2982                                               bool use_selected)
2983     : m_mod_id(), m_exe_ctx_ref(), m_needs_update(true) {
2984   ExecutionContext exe_ctx(exe_scope);
2985   TargetSP target_sp(exe_ctx.GetTargetSP());
2986   if (target_sp) {
2987     m_exe_ctx_ref.SetTargetSP(target_sp);
2988     ProcessSP process_sp(exe_ctx.GetProcessSP());
2989     if (!process_sp)
2990       process_sp = target_sp->GetProcessSP();
2991 
2992     if (process_sp) {
2993       m_mod_id = process_sp->GetModID();
2994       m_exe_ctx_ref.SetProcessSP(process_sp);
2995 
2996       ThreadSP thread_sp(exe_ctx.GetThreadSP());
2997 
2998       if (!thread_sp) {
2999         if (use_selected)
3000           thread_sp = process_sp->GetThreadList().GetSelectedThread();
3001       }
3002 
3003       if (thread_sp) {
3004         m_exe_ctx_ref.SetThreadSP(thread_sp);
3005 
3006         StackFrameSP frame_sp(exe_ctx.GetFrameSP());
3007         if (!frame_sp) {
3008           if (use_selected)
3009             frame_sp = thread_sp->GetSelectedFrame();
3010         }
3011         if (frame_sp)
3012           m_exe_ctx_ref.SetFrameSP(frame_sp);
3013       }
3014     }
3015   }
3016 }
3017 
3018 ValueObject::EvaluationPoint::EvaluationPoint(
3019     const ValueObject::EvaluationPoint &rhs)
3020     : m_mod_id(), m_exe_ctx_ref(rhs.m_exe_ctx_ref), m_needs_update(true) {}
3021 
3022 ValueObject::EvaluationPoint::~EvaluationPoint() {}
3023 
3024 // This function checks the EvaluationPoint against the current process state.
3025 // If the current state matches the evaluation point, or the evaluation point
3026 // is already invalid, then we return false, meaning "no change".  If the
3027 // current state is different, we update our state, and return true meaning
3028 // "yes, change".  If we did see a change, we also set m_needs_update to true,
3029 // so future calls to NeedsUpdate will return true. exe_scope will be set to
3030 // the current execution context scope.
3031 
3032 bool ValueObject::EvaluationPoint::SyncWithProcessState(
3033     bool accept_invalid_exe_ctx) {
3034   // Start with the target, if it is NULL, then we're obviously not going to
3035   // get any further:
3036   const bool thread_and_frame_only_if_stopped = true;
3037   ExecutionContext exe_ctx(
3038       m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped));
3039 
3040   if (exe_ctx.GetTargetPtr() == NULL)
3041     return false;
3042 
3043   // If we don't have a process nothing can change.
3044   Process *process = exe_ctx.GetProcessPtr();
3045   if (process == NULL)
3046     return false;
3047 
3048   // If our stop id is the current stop ID, nothing has changed:
3049   ProcessModID current_mod_id = process->GetModID();
3050 
3051   // If the current stop id is 0, either we haven't run yet, or the process
3052   // state has been cleared. In either case, we aren't going to be able to sync
3053   // with the process state.
3054   if (current_mod_id.GetStopID() == 0)
3055     return false;
3056 
3057   bool changed = false;
3058   const bool was_valid = m_mod_id.IsValid();
3059   if (was_valid) {
3060     if (m_mod_id == current_mod_id) {
3061       // Everything is already up to date in this object, no need to update the
3062       // execution context scope.
3063       changed = false;
3064     } else {
3065       m_mod_id = current_mod_id;
3066       m_needs_update = true;
3067       changed = true;
3068     }
3069   }
3070 
3071   // Now re-look up the thread and frame in case the underlying objects have
3072   // gone away & been recreated. That way we'll be sure to return a valid
3073   // exe_scope. If we used to have a thread or a frame but can't find it
3074   // anymore, then mark ourselves as invalid.
3075 
3076   if (!accept_invalid_exe_ctx) {
3077     if (m_exe_ctx_ref.HasThreadRef()) {
3078       ThreadSP thread_sp(m_exe_ctx_ref.GetThreadSP());
3079       if (thread_sp) {
3080         if (m_exe_ctx_ref.HasFrameRef()) {
3081           StackFrameSP frame_sp(m_exe_ctx_ref.GetFrameSP());
3082           if (!frame_sp) {
3083             // We used to have a frame, but now it is gone
3084             SetInvalid();
3085             changed = was_valid;
3086           }
3087         }
3088       } else {
3089         // We used to have a thread, but now it is gone
3090         SetInvalid();
3091         changed = was_valid;
3092       }
3093     }
3094   }
3095 
3096   return changed;
3097 }
3098 
3099 void ValueObject::EvaluationPoint::SetUpdated() {
3100   ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
3101   if (process_sp)
3102     m_mod_id = process_sp->GetModID();
3103   m_needs_update = false;
3104 }
3105 
3106 void ValueObject::ClearUserVisibleData(uint32_t clear_mask) {
3107   if ((clear_mask & eClearUserVisibleDataItemsValue) ==
3108       eClearUserVisibleDataItemsValue)
3109     m_value_str.clear();
3110 
3111   if ((clear_mask & eClearUserVisibleDataItemsLocation) ==
3112       eClearUserVisibleDataItemsLocation)
3113     m_location_str.clear();
3114 
3115   if ((clear_mask & eClearUserVisibleDataItemsSummary) ==
3116       eClearUserVisibleDataItemsSummary)
3117     m_summary_str.clear();
3118 
3119   if ((clear_mask & eClearUserVisibleDataItemsDescription) ==
3120       eClearUserVisibleDataItemsDescription)
3121     m_object_desc_str.clear();
3122 
3123   if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) ==
3124       eClearUserVisibleDataItemsSyntheticChildren) {
3125     if (m_synthetic_value)
3126       m_synthetic_value = NULL;
3127   }
3128 
3129   if ((clear_mask & eClearUserVisibleDataItemsValidator) ==
3130       eClearUserVisibleDataItemsValidator)
3131     m_validation_result.reset();
3132 }
3133 
3134 SymbolContextScope *ValueObject::GetSymbolContextScope() {
3135   if (m_parent) {
3136     if (!m_parent->IsPointerOrReferenceType())
3137       return m_parent->GetSymbolContextScope();
3138   }
3139   return NULL;
3140 }
3141 
3142 lldb::ValueObjectSP
3143 ValueObject::CreateValueObjectFromExpression(llvm::StringRef name,
3144                                              llvm::StringRef expression,
3145                                              const ExecutionContext &exe_ctx) {
3146   return CreateValueObjectFromExpression(name, expression, exe_ctx,
3147                                          EvaluateExpressionOptions());
3148 }
3149 
3150 lldb::ValueObjectSP ValueObject::CreateValueObjectFromExpression(
3151     llvm::StringRef name, llvm::StringRef expression,
3152     const ExecutionContext &exe_ctx, const EvaluateExpressionOptions &options) {
3153   lldb::ValueObjectSP retval_sp;
3154   lldb::TargetSP target_sp(exe_ctx.GetTargetSP());
3155   if (!target_sp)
3156     return retval_sp;
3157   if (expression.empty())
3158     return retval_sp;
3159   target_sp->EvaluateExpression(expression, exe_ctx.GetFrameSP().get(),
3160                                 retval_sp, options);
3161   if (retval_sp && !name.empty())
3162     retval_sp->SetName(ConstString(name));
3163   return retval_sp;
3164 }
3165 
3166 lldb::ValueObjectSP ValueObject::CreateValueObjectFromAddress(
3167     llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx,
3168     CompilerType type) {
3169   if (type) {
3170     CompilerType pointer_type(type.GetPointerType());
3171     if (pointer_type) {
3172       lldb::DataBufferSP buffer(
3173           new lldb_private::DataBufferHeap(&address, sizeof(lldb::addr_t)));
3174       lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create(
3175           exe_ctx.GetBestExecutionContextScope(), pointer_type,
3176           ConstString(name), buffer, exe_ctx.GetByteOrder(),
3177           exe_ctx.GetAddressByteSize()));
3178       if (ptr_result_valobj_sp) {
3179         ptr_result_valobj_sp->GetValue().SetValueType(
3180             Value::eValueTypeLoadAddress);
3181         Status err;
3182         ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
3183         if (ptr_result_valobj_sp && !name.empty())
3184           ptr_result_valobj_sp->SetName(ConstString(name));
3185       }
3186       return ptr_result_valobj_sp;
3187     }
3188   }
3189   return lldb::ValueObjectSP();
3190 }
3191 
3192 lldb::ValueObjectSP ValueObject::CreateValueObjectFromData(
3193     llvm::StringRef name, const DataExtractor &data,
3194     const ExecutionContext &exe_ctx, CompilerType type) {
3195   lldb::ValueObjectSP new_value_sp;
3196   new_value_sp = ValueObjectConstResult::Create(
3197       exe_ctx.GetBestExecutionContextScope(), type, ConstString(name), data,
3198       LLDB_INVALID_ADDRESS);
3199   new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
3200   if (new_value_sp && !name.empty())
3201     new_value_sp->SetName(ConstString(name));
3202   return new_value_sp;
3203 }
3204 
3205 ModuleSP ValueObject::GetModule() {
3206   ValueObject *root(GetRoot());
3207   if (root != this)
3208     return root->GetModule();
3209   return lldb::ModuleSP();
3210 }
3211 
3212 ValueObject *ValueObject::GetRoot() {
3213   if (m_root)
3214     return m_root;
3215   return (m_root = FollowParentChain([](ValueObject *vo) -> bool {
3216             return (vo->m_parent != nullptr);
3217           }));
3218 }
3219 
3220 ValueObject *
3221 ValueObject::FollowParentChain(std::function<bool(ValueObject *)> f) {
3222   ValueObject *vo = this;
3223   while (vo) {
3224     if (f(vo) == false)
3225       break;
3226     vo = vo->m_parent;
3227   }
3228   return vo;
3229 }
3230 
3231 AddressType ValueObject::GetAddressTypeOfChildren() {
3232   if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid) {
3233     ValueObject *root(GetRoot());
3234     if (root != this)
3235       return root->GetAddressTypeOfChildren();
3236   }
3237   return m_address_type_of_ptr_or_ref_children;
3238 }
3239 
3240 lldb::DynamicValueType ValueObject::GetDynamicValueType() {
3241   ValueObject *with_dv_info = this;
3242   while (with_dv_info) {
3243     if (with_dv_info->HasDynamicValueTypeInfo())
3244       return with_dv_info->GetDynamicValueTypeImpl();
3245     with_dv_info = with_dv_info->m_parent;
3246   }
3247   return lldb::eNoDynamicValues;
3248 }
3249 
3250 lldb::Format ValueObject::GetFormat() const {
3251   const ValueObject *with_fmt_info = this;
3252   while (with_fmt_info) {
3253     if (with_fmt_info->m_format != lldb::eFormatDefault)
3254       return with_fmt_info->m_format;
3255     with_fmt_info = with_fmt_info->m_parent;
3256   }
3257   return m_format;
3258 }
3259 
3260 lldb::LanguageType ValueObject::GetPreferredDisplayLanguage() {
3261   lldb::LanguageType type = m_preferred_display_language;
3262   if (m_preferred_display_language == lldb::eLanguageTypeUnknown) {
3263     if (GetRoot()) {
3264       if (GetRoot() == this) {
3265         if (StackFrameSP frame_sp = GetFrameSP()) {
3266           const SymbolContext &sc(
3267               frame_sp->GetSymbolContext(eSymbolContextCompUnit));
3268           if (CompileUnit *cu = sc.comp_unit)
3269             type = cu->GetLanguage();
3270         }
3271       } else {
3272         type = GetRoot()->GetPreferredDisplayLanguage();
3273       }
3274     }
3275   }
3276   return (m_preferred_display_language = type); // only compute it once
3277 }
3278 
3279 void ValueObject::SetPreferredDisplayLanguage(lldb::LanguageType lt) {
3280   m_preferred_display_language = lt;
3281 }
3282 
3283 void ValueObject::SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType lt) {
3284   if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
3285     SetPreferredDisplayLanguage(lt);
3286 }
3287 
3288 bool ValueObject::CanProvideValue() {
3289   // we need to support invalid types as providers of values because some bare-
3290   // board debugging scenarios have no notion of types, but still manage to
3291   // have raw numeric values for things like registers. sigh.
3292   const CompilerType &type(GetCompilerType());
3293   return (false == type.IsValid()) ||
3294          (0 != (type.GetTypeInfo() & eTypeHasValue));
3295 }
3296 
3297 bool ValueObject::IsChecksumEmpty() { return m_value_checksum.empty(); }
3298 
3299 ValueObjectSP ValueObject::Persist() {
3300   if (!UpdateValueIfNeeded())
3301     return nullptr;
3302 
3303   TargetSP target_sp(GetTargetSP());
3304   if (!target_sp)
3305     return nullptr;
3306 
3307   PersistentExpressionState *persistent_state =
3308       target_sp->GetPersistentExpressionStateForLanguage(
3309           GetPreferredDisplayLanguage());
3310 
3311   if (!persistent_state)
3312     return nullptr;
3313 
3314   auto prefix = persistent_state->GetPersistentVariablePrefix();
3315   ConstString name =
3316       persistent_state->GetNextPersistentVariableName(*target_sp, prefix);
3317 
3318   ValueObjectSP const_result_sp =
3319       ValueObjectConstResult::Create(target_sp.get(), GetValue(), name);
3320 
3321   ExpressionVariableSP clang_var_sp =
3322       persistent_state->CreatePersistentVariable(const_result_sp);
3323   clang_var_sp->m_live_sp = clang_var_sp->m_frozen_sp;
3324   clang_var_sp->m_flags |= ExpressionVariable::EVIsProgramReference;
3325 
3326   return clang_var_sp->GetValueObject();
3327 }
3328 
3329 bool ValueObject::IsSyntheticChildrenGenerated() {
3330   return m_is_synthetic_children_generated;
3331 }
3332 
3333 void ValueObject::SetSyntheticChildrenGenerated(bool b) {
3334   m_is_synthetic_children_generated = b;
3335 }
3336 
3337 uint64_t ValueObject::GetLanguageFlags() { return m_language_flags; }
3338 
3339 void ValueObject::SetLanguageFlags(uint64_t flags) { m_language_flags = flags; }
3340 
3341 ValueObjectManager::ValueObjectManager(lldb::ValueObjectSP in_valobj_sp,
3342                                        lldb::DynamicValueType use_dynamic,
3343                                        bool use_synthetic) : m_root_valobj_sp(),
3344     m_user_valobj_sp(), m_use_dynamic(use_dynamic), m_stop_id(UINT32_MAX),
3345     m_use_synthetic(use_synthetic) {
3346   if (!in_valobj_sp)
3347     return;
3348   // If the user passes in a value object that is dynamic or synthetic, then
3349   // water it down to the static type.
3350   m_root_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(lldb::eNoDynamicValues, false);
3351 }
3352 
3353 bool ValueObjectManager::IsValid() const {
3354   if (!m_root_valobj_sp)
3355     return false;
3356   lldb::TargetSP target_sp = GetTargetSP();
3357   if (target_sp)
3358     return target_sp->IsValid();
3359   return false;
3360 }
3361 
3362 lldb::ValueObjectSP ValueObjectManager::GetSP() {
3363   lldb::ProcessSP process_sp = GetProcessSP();
3364   if (!process_sp)
3365     return lldb::ValueObjectSP();
3366 
3367   const uint32_t current_stop_id = process_sp->GetLastNaturalStopID();
3368   if (current_stop_id == m_stop_id)
3369     return m_user_valobj_sp;
3370 
3371   m_stop_id = current_stop_id;
3372 
3373   if (!m_root_valobj_sp) {
3374     m_user_valobj_sp.reset();
3375     return m_root_valobj_sp;
3376   }
3377 
3378   m_user_valobj_sp = m_root_valobj_sp;
3379 
3380   if (m_use_dynamic != lldb::eNoDynamicValues) {
3381     lldb::ValueObjectSP dynamic_sp = m_user_valobj_sp->GetDynamicValue(m_use_dynamic);
3382     if (dynamic_sp)
3383       m_user_valobj_sp = dynamic_sp;
3384   }
3385 
3386   if (m_use_synthetic) {
3387     lldb::ValueObjectSP synthetic_sp = m_user_valobj_sp->GetSyntheticValue(m_use_synthetic);
3388     if (synthetic_sp)
3389       m_user_valobj_sp = synthetic_sp;
3390   }
3391 
3392   return m_user_valobj_sp;
3393 }
3394 
3395 void ValueObjectManager::SetUseDynamic(lldb::DynamicValueType use_dynamic) {
3396   if (use_dynamic != m_use_dynamic) {
3397     m_use_dynamic = use_dynamic;
3398     m_user_valobj_sp.reset();
3399     m_stop_id = UINT32_MAX;
3400   }
3401 }
3402 
3403 void ValueObjectManager::SetUseSynthetic(bool use_synthetic) {
3404   if (m_use_synthetic != use_synthetic) {
3405     m_use_synthetic = use_synthetic;
3406     m_user_valobj_sp.reset();
3407     m_stop_id = UINT32_MAX;
3408   }
3409 }
3410 
3411 lldb::TargetSP ValueObjectManager::GetTargetSP() const {
3412   if (!m_root_valobj_sp)
3413     return m_root_valobj_sp->GetTargetSP();
3414   return lldb::TargetSP();
3415 }
3416 
3417 lldb::ProcessSP ValueObjectManager::GetProcessSP() const {
3418   if (m_root_valobj_sp)
3419     return m_root_valobj_sp->GetProcessSP();
3420   return lldb::ProcessSP();
3421 }
3422 
3423 lldb::ThreadSP ValueObjectManager::GetThreadSP() const {
3424   if (m_root_valobj_sp)
3425     return m_root_valobj_sp->GetThreadSP();
3426   return lldb::ThreadSP();
3427 }
3428 
3429 lldb::StackFrameSP ValueObjectManager::GetFrameSP() const {
3430   if (m_root_valobj_sp)
3431     return m_root_valobj_sp->GetFrameSP();
3432   return lldb::StackFrameSP();
3433 }
3434 
3435