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