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             uint32_t bit_field_size = to - from + 1;
2150             uint32_t bit_field_offset = from;
2151             if (GetDataExtractor().GetByteOrder() == eByteOrderBig)
2152                 bit_field_offset = GetByteSize() * 8 - bit_field_size - bit_field_offset;
2153             // We haven't made a synthetic array member for INDEX yet, so
2154             // lets make one and cache it for any future reference.
2155             ValueObjectChild *synthetic_child = new ValueObjectChild (*this,
2156                                                                       GetCompilerType(),
2157                                                                       index_const_str,
2158                                                                       GetByteSize(),
2159                                                                       0,
2160                                                                       bit_field_size,
2161                                                                       bit_field_offset,
2162                                                                       false,
2163                                                                       false,
2164                                                                       eAddressTypeInvalid,
2165                                                                       0);
2166 
2167             // Cache the value if we got one back...
2168             if (synthetic_child)
2169             {
2170                 AddSyntheticChild(index_const_str, synthetic_child);
2171                 synthetic_child_sp = synthetic_child->GetSP();
2172                 synthetic_child_sp->SetName(ConstString(index_str));
2173                 synthetic_child_sp->m_is_bitfield_for_scalar = true;
2174             }
2175         }
2176     }
2177     return synthetic_child_sp;
2178 }
2179 
2180 ValueObjectSP
2181 ValueObject::GetSyntheticChildAtOffset(uint32_t offset,
2182                                        const CompilerType& type,
2183                                        bool can_create,
2184                                        ConstString name_const_str)
2185 {
2186 
2187     ValueObjectSP synthetic_child_sp;
2188 
2189     if (name_const_str.IsEmpty())
2190     {
2191         char name_str[64];
2192         snprintf(name_str, sizeof(name_str), "@%i", offset);
2193         name_const_str.SetCString(name_str);
2194     }
2195 
2196     // Check if we have already created a synthetic array member in this
2197     // valid object. If we have we will re-use it.
2198     synthetic_child_sp = GetSyntheticChild (name_const_str);
2199 
2200     if (synthetic_child_sp.get())
2201         return synthetic_child_sp;
2202 
2203     if (!can_create)
2204         return ValueObjectSP();
2205 
2206     ExecutionContext exe_ctx (GetExecutionContextRef());
2207 
2208     ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
2209                                                              type,
2210                                                              name_const_str,
2211                                                              type.GetByteSize(exe_ctx.GetBestExecutionContextScope()),
2212                                                              offset,
2213                                                              0,
2214                                                              0,
2215                                                              false,
2216                                                              false,
2217                                                              eAddressTypeInvalid,
2218                                                              0);
2219     if (synthetic_child)
2220     {
2221         AddSyntheticChild(name_const_str, synthetic_child);
2222         synthetic_child_sp = synthetic_child->GetSP();
2223         synthetic_child_sp->SetName(name_const_str);
2224         synthetic_child_sp->m_is_child_at_offset = true;
2225     }
2226     return synthetic_child_sp;
2227 }
2228 
2229 ValueObjectSP
2230 ValueObject::GetSyntheticBase (uint32_t offset, const CompilerType& type, bool can_create)
2231 {
2232     ValueObjectSP synthetic_child_sp;
2233 
2234     char name_str[64];
2235     snprintf(name_str, sizeof(name_str), "%s", type.GetTypeName().AsCString("<unknown>"));
2236     ConstString name_const_str(name_str);
2237 
2238     // Check if we have already created a synthetic array member in this
2239     // valid object. If we have we will re-use it.
2240     synthetic_child_sp = GetSyntheticChild (name_const_str);
2241 
2242     if (synthetic_child_sp.get())
2243         return synthetic_child_sp;
2244 
2245     if (!can_create)
2246         return ValueObjectSP();
2247 
2248     const bool is_base_class = true;
2249 
2250     ExecutionContext exe_ctx (GetExecutionContextRef());
2251 
2252     ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
2253                                                              type,
2254                                                              name_const_str,
2255                                                              type.GetByteSize(exe_ctx.GetBestExecutionContextScope()),
2256                                                              offset,
2257                                                              0,
2258                                                              0,
2259                                                              is_base_class,
2260                                                              false,
2261                                                              eAddressTypeInvalid,
2262                                                              0);
2263     if (synthetic_child)
2264     {
2265         AddSyntheticChild(name_const_str, synthetic_child);
2266         synthetic_child_sp = synthetic_child->GetSP();
2267         synthetic_child_sp->SetName(name_const_str);
2268     }
2269     return synthetic_child_sp;
2270 }
2271 
2272 
2273 // your expression path needs to have a leading . or ->
2274 // (unless it somehow "looks like" an array, in which case it has
2275 // a leading [ symbol). while the [ is meaningful and should be shown
2276 // to the user, . and -> are just parser design, but by no means
2277 // added information for the user.. strip them off
2278 static const char*
2279 SkipLeadingExpressionPathSeparators(const char* expression)
2280 {
2281     if (!expression || !expression[0])
2282         return expression;
2283     if (expression[0] == '.')
2284         return expression+1;
2285     if (expression[0] == '-' && expression[1] == '>')
2286         return expression+2;
2287     return expression;
2288 }
2289 
2290 ValueObjectSP
2291 ValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
2292 {
2293     ValueObjectSP synthetic_child_sp;
2294     ConstString name_const_string(expression);
2295     // Check if we have already created a synthetic array member in this
2296     // valid object. If we have we will re-use it.
2297     synthetic_child_sp = GetSyntheticChild (name_const_string);
2298     if (!synthetic_child_sp)
2299     {
2300         // We haven't made a synthetic array member for expression yet, so
2301         // lets make one and cache it for any future reference.
2302         synthetic_child_sp = GetValueForExpressionPath(expression,
2303                                                        NULL, NULL, NULL,
2304                                                        GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal(GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None));
2305 
2306         // Cache the value if we got one back...
2307         if (synthetic_child_sp.get())
2308         {
2309             // FIXME: this causes a "real" child to end up with its name changed to the contents of expression
2310             AddSyntheticChild(name_const_string, synthetic_child_sp.get());
2311             synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression)));
2312         }
2313     }
2314     return synthetic_child_sp;
2315 }
2316 
2317 void
2318 ValueObject::CalculateSyntheticValue (bool use_synthetic)
2319 {
2320     if (use_synthetic == false)
2321         return;
2322 
2323     TargetSP target_sp(GetTargetSP());
2324     if (target_sp && target_sp->GetEnableSyntheticValue() == false)
2325     {
2326         m_synthetic_value = NULL;
2327         return;
2328     }
2329 
2330     lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp);
2331 
2332     if (!UpdateFormatsIfNeeded() && m_synthetic_value)
2333         return;
2334 
2335     if (m_synthetic_children_sp.get() == NULL)
2336         return;
2337 
2338     if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value)
2339         return;
2340 
2341     m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp);
2342 }
2343 
2344 void
2345 ValueObject::CalculateDynamicValue (DynamicValueType use_dynamic)
2346 {
2347     if (use_dynamic == eNoDynamicValues)
2348         return;
2349 
2350     if (!m_dynamic_value && !IsDynamic())
2351     {
2352         ExecutionContext exe_ctx (GetExecutionContextRef());
2353         Process *process = exe_ctx.GetProcessPtr();
2354         if (process && process->IsPossibleDynamicValue(*this))
2355         {
2356             ClearDynamicTypeInformation ();
2357             m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
2358         }
2359     }
2360 }
2361 
2362 ValueObjectSP
2363 ValueObject::GetDynamicValue (DynamicValueType use_dynamic)
2364 {
2365     if (use_dynamic == eNoDynamicValues)
2366         return ValueObjectSP();
2367 
2368     if (!IsDynamic() && m_dynamic_value == NULL)
2369     {
2370         CalculateDynamicValue(use_dynamic);
2371     }
2372     if (m_dynamic_value)
2373         return m_dynamic_value->GetSP();
2374     else
2375         return ValueObjectSP();
2376 }
2377 
2378 ValueObjectSP
2379 ValueObject::GetStaticValue()
2380 {
2381     return GetSP();
2382 }
2383 
2384 lldb::ValueObjectSP
2385 ValueObject::GetNonSyntheticValue ()
2386 {
2387     return GetSP();
2388 }
2389 
2390 ValueObjectSP
2391 ValueObject::GetSyntheticValue (bool use_synthetic)
2392 {
2393     if (use_synthetic == false)
2394         return ValueObjectSP();
2395 
2396     CalculateSyntheticValue(use_synthetic);
2397 
2398     if (m_synthetic_value)
2399         return m_synthetic_value->GetSP();
2400     else
2401         return ValueObjectSP();
2402 }
2403 
2404 bool
2405 ValueObject::HasSyntheticValue()
2406 {
2407     UpdateFormatsIfNeeded();
2408 
2409     if (m_synthetic_children_sp.get() == NULL)
2410         return false;
2411 
2412     CalculateSyntheticValue(true);
2413 
2414     if (m_synthetic_value)
2415         return true;
2416     else
2417         return false;
2418 }
2419 
2420 bool
2421 ValueObject::GetBaseClassPath (Stream &s)
2422 {
2423     if (IsBaseClass())
2424     {
2425         bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
2426         CompilerType compiler_type = GetCompilerType();
2427         std::string cxx_class_name;
2428         bool this_had_base_class = ClangASTContext::GetCXXClassName (compiler_type, cxx_class_name);
2429         if (this_had_base_class)
2430         {
2431             if (parent_had_base_class)
2432                 s.PutCString("::");
2433             s.PutCString(cxx_class_name.c_str());
2434         }
2435         return parent_had_base_class || this_had_base_class;
2436     }
2437     return false;
2438 }
2439 
2440 
2441 ValueObject *
2442 ValueObject::GetNonBaseClassParent()
2443 {
2444     if (GetParent())
2445     {
2446         if (GetParent()->IsBaseClass())
2447             return GetParent()->GetNonBaseClassParent();
2448         else
2449             return GetParent();
2450     }
2451     return NULL;
2452 }
2453 
2454 
2455 bool
2456 ValueObject::IsBaseClass (uint32_t& depth)
2457 {
2458     if (!IsBaseClass())
2459     {
2460         depth = 0;
2461         return false;
2462     }
2463     if (GetParent())
2464     {
2465         GetParent()->IsBaseClass(depth);
2466         depth = depth + 1;
2467         return true;
2468     }
2469     // TODO: a base of no parent? weird..
2470     depth = 1;
2471     return true;
2472 }
2473 
2474 void
2475 ValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
2476 {
2477     // synthetic children do not actually "exist" as part of the hierarchy, and sometimes they are consed up in ways
2478     // that don't make sense from an underlying language/API standpoint. So, use a special code path here to return
2479     // something that can hopefully be used in expression
2480     if (m_is_synthetic_children_generated)
2481     {
2482         UpdateValueIfNeeded();
2483 
2484         if (m_value.GetValueType() == Value::eValueTypeLoadAddress)
2485         {
2486             if (IsPointerOrReferenceType())
2487             {
2488                 s.Printf("((%s)0x%" PRIx64 ")",
2489                          GetTypeName().AsCString("void"),
2490                          GetValueAsUnsigned(0));
2491                 return;
2492             }
2493             else
2494             {
2495                 uint64_t load_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
2496                 if (load_addr != LLDB_INVALID_ADDRESS)
2497                 {
2498                     s.Printf("(*( (%s *)0x%" PRIx64 "))",
2499                              GetTypeName().AsCString("void"),
2500                              load_addr);
2501                     return;
2502                 }
2503             }
2504         }
2505 
2506         if (CanProvideValue())
2507         {
2508             s.Printf("((%s)%s)",
2509                      GetTypeName().AsCString("void"),
2510                      GetValueAsCString());
2511             return;
2512         }
2513 
2514         return;
2515     }
2516 
2517     const bool is_deref_of_parent = IsDereferenceOfParent ();
2518 
2519     if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers)
2520     {
2521         // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
2522         // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
2523         // the eHonorPointers mode is meant to produce strings in this latter format
2524         s.PutCString("*(");
2525     }
2526 
2527     ValueObject* parent = GetParent();
2528 
2529     if (parent)
2530         parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
2531 
2532     // if we are a deref_of_parent just because we are synthetic array
2533     // members made up to allow ptr[%d] syntax to work in variable
2534     // printing, then add our name ([%d]) to the expression path
2535     if (m_is_array_item_for_pointer && epformat == eGetExpressionPathFormatHonorPointers)
2536         s.PutCString(m_name.AsCString());
2537 
2538     if (!IsBaseClass())
2539     {
2540         if (!is_deref_of_parent)
2541         {
2542             ValueObject *non_base_class_parent = GetNonBaseClassParent();
2543             if (non_base_class_parent && !non_base_class_parent->GetName().IsEmpty())
2544             {
2545                 CompilerType non_base_class_parent_compiler_type = non_base_class_parent->GetCompilerType();
2546                 if (non_base_class_parent_compiler_type)
2547                 {
2548                     if (parent && parent->IsDereferenceOfParent() && epformat == eGetExpressionPathFormatHonorPointers)
2549                     {
2550                         s.PutCString("->");
2551                     }
2552                     else
2553                     {
2554                         const uint32_t non_base_class_parent_type_info = non_base_class_parent_compiler_type.GetTypeInfo();
2555 
2556                         if (non_base_class_parent_type_info & eTypeIsPointer)
2557                         {
2558                             s.PutCString("->");
2559                         }
2560                         else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2561                                  !(non_base_class_parent_type_info & eTypeIsArray))
2562                         {
2563                             s.PutChar('.');
2564                         }
2565                     }
2566                 }
2567             }
2568 
2569             const char *name = GetName().GetCString();
2570             if (name)
2571             {
2572                 if (qualify_cxx_base_classes)
2573                 {
2574                     if (GetBaseClassPath (s))
2575                         s.PutCString("::");
2576                 }
2577                 s.PutCString(name);
2578             }
2579         }
2580     }
2581 
2582     if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers)
2583     {
2584         s.PutChar(')');
2585     }
2586 }
2587 
2588 ValueObjectSP
2589 ValueObject::GetValueForExpressionPath(const char* expression,
2590                                        const char** first_unparsed,
2591                                        ExpressionPathScanEndReason* reason_to_stop,
2592                                        ExpressionPathEndResultType* final_value_type,
2593                                        const GetValueForExpressionPathOptions& options,
2594                                        ExpressionPathAftermath* final_task_on_target)
2595 {
2596 
2597     const char* dummy_first_unparsed;
2598     ExpressionPathScanEndReason dummy_reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnknown;
2599     ExpressionPathEndResultType dummy_final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2600     ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2601 
2602     ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
2603                                                            first_unparsed ? first_unparsed : &dummy_first_unparsed,
2604                                                            reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2605                                                            final_value_type ? final_value_type : &dummy_final_value_type,
2606                                                            options,
2607                                                            final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2608 
2609     if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2610         return ret_val;
2611 
2612     if (ret_val.get() && ((final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain)) // I can only deref and takeaddress of plain objects
2613     {
2614         if ( (final_task_on_target ? *final_task_on_target : dummy_final_task_on_target) == ValueObject::eExpressionPathAftermathDereference)
2615         {
2616             Error error;
2617             ValueObjectSP final_value = ret_val->Dereference(error);
2618             if (error.Fail() || !final_value.get())
2619             {
2620                 if (reason_to_stop)
2621                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2622                 if (final_value_type)
2623                     *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2624                 return ValueObjectSP();
2625             }
2626             else
2627             {
2628                 if (final_task_on_target)
2629                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2630                 return final_value;
2631             }
2632         }
2633         if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress)
2634         {
2635             Error error;
2636             ValueObjectSP final_value = ret_val->AddressOf(error);
2637             if (error.Fail() || !final_value.get())
2638             {
2639                 if (reason_to_stop)
2640                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2641                 if (final_value_type)
2642                     *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2643                 return ValueObjectSP();
2644             }
2645             else
2646             {
2647                 if (final_task_on_target)
2648                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2649                 return final_value;
2650             }
2651         }
2652     }
2653     return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
2654 }
2655 
2656 int
2657 ValueObject::GetValuesForExpressionPath(const char* expression,
2658                                         ValueObjectListSP& list,
2659                                         const char** first_unparsed,
2660                                         ExpressionPathScanEndReason* reason_to_stop,
2661                                         ExpressionPathEndResultType* final_value_type,
2662                                         const GetValueForExpressionPathOptions& options,
2663                                         ExpressionPathAftermath* final_task_on_target)
2664 {
2665     const char* dummy_first_unparsed;
2666     ExpressionPathScanEndReason dummy_reason_to_stop;
2667     ExpressionPathEndResultType dummy_final_value_type;
2668     ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2669 
2670     ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
2671                                                            first_unparsed ? first_unparsed : &dummy_first_unparsed,
2672                                                            reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2673                                                            final_value_type ? final_value_type : &dummy_final_value_type,
2674                                                            options,
2675                                                            final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2676 
2677     if (!ret_val.get()) // if there are errors, I add nothing to the list
2678         return 0;
2679 
2680     if ( (reason_to_stop ? *reason_to_stop : dummy_reason_to_stop) != eExpressionPathScanEndReasonArrayRangeOperatorMet)
2681     {
2682         // I need not expand a range, just post-process the final value and return
2683         if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2684         {
2685             list->Append(ret_val);
2686             return 1;
2687         }
2688         if (ret_val.get() && (final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain) // I can only deref and takeaddress of plain objects
2689         {
2690             if (*final_task_on_target == ValueObject::eExpressionPathAftermathDereference)
2691             {
2692                 Error error;
2693                 ValueObjectSP final_value = ret_val->Dereference(error);
2694                 if (error.Fail() || !final_value.get())
2695                 {
2696                     if (reason_to_stop)
2697                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2698                     if (final_value_type)
2699                         *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2700                     return 0;
2701                 }
2702                 else
2703                 {
2704                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2705                     list->Append(final_value);
2706                     return 1;
2707                 }
2708             }
2709             if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress)
2710             {
2711                 Error error;
2712                 ValueObjectSP final_value = ret_val->AddressOf(error);
2713                 if (error.Fail() || !final_value.get())
2714                 {
2715                     if (reason_to_stop)
2716                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2717                     if (final_value_type)
2718                         *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2719                     return 0;
2720                 }
2721                 else
2722                 {
2723                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2724                     list->Append(final_value);
2725                     return 1;
2726                 }
2727             }
2728         }
2729     }
2730     else
2731     {
2732         return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
2733                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
2734                                           ret_val,
2735                                           list,
2736                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2737                                           final_value_type ? final_value_type : &dummy_final_value_type,
2738                                           options,
2739                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2740     }
2741     // in any non-covered case, just do the obviously right thing
2742     list->Append(ret_val);
2743     return 1;
2744 }
2745 
2746 ValueObjectSP
2747 ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
2748                                             const char** first_unparsed,
2749                                             ExpressionPathScanEndReason* reason_to_stop,
2750                                             ExpressionPathEndResultType* final_result,
2751                                             const GetValueForExpressionPathOptions& options,
2752                                             ExpressionPathAftermath* what_next)
2753 {
2754     ValueObjectSP root = GetSP();
2755 
2756     if (!root.get())
2757         return ValueObjectSP();
2758 
2759     *first_unparsed = expression_cstr;
2760 
2761     while (true)
2762     {
2763 
2764         const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
2765 
2766         CompilerType root_compiler_type = root->GetCompilerType();
2767         CompilerType pointee_compiler_type;
2768         Flags pointee_compiler_type_info;
2769 
2770         Flags root_compiler_type_info(root_compiler_type.GetTypeInfo(&pointee_compiler_type));
2771         if (pointee_compiler_type)
2772             pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
2773 
2774         if (!expression_cstr || *expression_cstr == '\0')
2775         {
2776             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2777             return root;
2778         }
2779 
2780         switch (*expression_cstr)
2781         {
2782             case '-':
2783             {
2784                 if (options.m_check_dot_vs_arrow_syntax &&
2785                     root_compiler_type_info.Test(eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
2786                 {
2787                     *first_unparsed = expression_cstr;
2788                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot;
2789                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2790                     return ValueObjectSP();
2791                 }
2792                 if (root_compiler_type_info.Test(eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
2793                     root_compiler_type_info.Test(eTypeIsPointer) &&
2794                     options.m_no_fragile_ivar)
2795                 {
2796                     *first_unparsed = expression_cstr;
2797                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed;
2798                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2799                     return ValueObjectSP();
2800                 }
2801                 if (expression_cstr[1] != '>')
2802                 {
2803                     *first_unparsed = expression_cstr;
2804                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2805                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2806                     return ValueObjectSP();
2807                 }
2808                 expression_cstr++; // skip the -
2809             }
2810             LLVM_FALLTHROUGH;
2811             case '.': // or fallthrough from ->
2812             {
2813                 if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
2814                     root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
2815                 {
2816                     *first_unparsed = expression_cstr;
2817                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow;
2818                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2819                     return ValueObjectSP();
2820                 }
2821                 expression_cstr++; // skip .
2822                 const char *next_separator = strpbrk(expression_cstr+1,"-.[");
2823                 ConstString child_name;
2824                 if (!next_separator) // if no other separator just expand this last layer
2825                 {
2826                     child_name.SetCString (expression_cstr);
2827                     ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
2828 
2829                     if (child_valobj_sp.get()) // we know we are done, so just return
2830                     {
2831                         *first_unparsed = "";
2832                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2833                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2834                         return child_valobj_sp;
2835                     }
2836                     else
2837                     {
2838                         switch (options.m_synthetic_children_traversal)
2839                         {
2840                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None:
2841                                 break;
2842                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::FromSynthetic:
2843                                 if (root->IsSynthetic())
2844                                 {
2845                                     child_valobj_sp = root->GetNonSyntheticValue();
2846                                     if (child_valobj_sp.get())
2847                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2848                                 }
2849                                 break;
2850                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic:
2851                                 if (!root->IsSynthetic())
2852                                 {
2853                                     child_valobj_sp = root->GetSyntheticValue();
2854                                     if (child_valobj_sp.get())
2855                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2856                                 }
2857                                 break;
2858                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both:
2859                                 if (root->IsSynthetic())
2860                                 {
2861                                     child_valobj_sp = root->GetNonSyntheticValue();
2862                                     if (child_valobj_sp.get())
2863                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2864                                 }
2865                                 else
2866                                 {
2867                                     child_valobj_sp = root->GetSyntheticValue();
2868                                     if (child_valobj_sp.get())
2869                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2870                                 }
2871                                 break;
2872                         }
2873                     }
2874 
2875                     // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
2876                     // so we hit the "else" branch, and return an error
2877                     if(child_valobj_sp.get()) // if it worked, just return
2878                     {
2879                         *first_unparsed = "";
2880                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2881                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2882                         return child_valobj_sp;
2883                     }
2884                     else
2885                     {
2886                         *first_unparsed = expression_cstr;
2887                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2888                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2889                         return ValueObjectSP();
2890                     }
2891                 }
2892                 else // other layers do expand
2893                 {
2894                     child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
2895                     ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
2896                     if (child_valobj_sp.get()) // store the new root and move on
2897                     {
2898                         root = child_valobj_sp;
2899                         *first_unparsed = next_separator;
2900                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2901                         continue;
2902                     }
2903                     else
2904                     {
2905                         switch (options.m_synthetic_children_traversal)
2906                         {
2907                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None:
2908                                 break;
2909                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::FromSynthetic:
2910                                 if (root->IsSynthetic())
2911                                 {
2912                                     child_valobj_sp = root->GetNonSyntheticValue();
2913                                     if (child_valobj_sp.get())
2914                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2915                                 }
2916                                 break;
2917                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic:
2918                                 if (!root->IsSynthetic())
2919                                 {
2920                                     child_valobj_sp = root->GetSyntheticValue();
2921                                     if (child_valobj_sp.get())
2922                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2923                                 }
2924                                 break;
2925                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both:
2926                                 if (root->IsSynthetic())
2927                                 {
2928                                     child_valobj_sp = root->GetNonSyntheticValue();
2929                                     if (child_valobj_sp.get())
2930                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2931                                 }
2932                                 else
2933                                 {
2934                                     child_valobj_sp = root->GetSyntheticValue();
2935                                     if (child_valobj_sp.get())
2936                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2937                                 }
2938                                 break;
2939                         }
2940                     }
2941 
2942                     // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
2943                     // so we hit the "else" branch, and return an error
2944                     if(child_valobj_sp.get()) // if it worked, move on
2945                     {
2946                         root = child_valobj_sp;
2947                         *first_unparsed = next_separator;
2948                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2949                         continue;
2950                     }
2951                     else
2952                     {
2953                         *first_unparsed = expression_cstr;
2954                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2955                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2956                         return ValueObjectSP();
2957                     }
2958                 }
2959                 break;
2960             }
2961             case '[':
2962             {
2963                 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*
2964                 {
2965                     if (!root_compiler_type_info.Test(eTypeIsScalar)) // if this is not even a scalar...
2966                     {
2967                         if (options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None) // ...only chance left is synthetic
2968                         {
2969                             *first_unparsed = expression_cstr;
2970                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
2971                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2972                             return ValueObjectSP();
2973                         }
2974                     }
2975                     else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2976                     {
2977                         *first_unparsed = expression_cstr;
2978                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
2979                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2980                         return ValueObjectSP();
2981                     }
2982                 }
2983                 if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2984                 {
2985                     if (!root_compiler_type_info.Test(eTypeIsArray))
2986                     {
2987                         *first_unparsed = expression_cstr;
2988                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2989                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2990                         return ValueObjectSP();
2991                     }
2992                     else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
2993                     {
2994                         *first_unparsed = expression_cstr+2;
2995                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2996                         *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange;
2997                         return root;
2998                     }
2999                 }
3000                 const char *separator_position = ::strchr(expression_cstr+1,'-');
3001                 const char *close_bracket_position = ::strchr(expression_cstr+1,']');
3002                 if (!close_bracket_position) // if there is no ], this is a syntax error
3003                 {
3004                     *first_unparsed = expression_cstr;
3005                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3006                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3007                     return ValueObjectSP();
3008                 }
3009                 if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
3010                 {
3011                     char *end = NULL;
3012                     unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
3013                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3014                     {
3015                         *first_unparsed = expression_cstr;
3016                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3017                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3018                         return ValueObjectSP();
3019                     }
3020                     if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
3021                     {
3022                         if (root_compiler_type_info.Test(eTypeIsArray))
3023                         {
3024                             *first_unparsed = expression_cstr+2;
3025                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
3026                             *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange;
3027                             return root;
3028                         }
3029                         else
3030                         {
3031                             *first_unparsed = expression_cstr;
3032                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
3033                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3034                             return ValueObjectSP();
3035                         }
3036                     }
3037                     // from here on we do have a valid index
3038                     if (root_compiler_type_info.Test(eTypeIsArray))
3039                     {
3040                         ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
3041                         if (!child_valobj_sp)
3042                             child_valobj_sp = root->GetSyntheticArrayMember(index, true);
3043                         if (!child_valobj_sp)
3044                             if (root->HasSyntheticValue() && root->GetSyntheticValue()->GetNumChildren() > index)
3045                                 child_valobj_sp = root->GetSyntheticValue()->GetChildAtIndex(index, true);
3046                         if (child_valobj_sp)
3047                         {
3048                             root = child_valobj_sp;
3049                             *first_unparsed = end+1; // skip ]
3050                             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3051                             continue;
3052                         }
3053                         else
3054                         {
3055                             *first_unparsed = expression_cstr;
3056                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3057                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3058                             return ValueObjectSP();
3059                         }
3060                     }
3061                     else if (root_compiler_type_info.Test(eTypeIsPointer))
3062                     {
3063                         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
3064                             pointee_compiler_type_info.Test(eTypeIsScalar))
3065                         {
3066                             Error error;
3067                             root = root->Dereference(error);
3068                             if (error.Fail() || !root.get())
3069                             {
3070                                 *first_unparsed = expression_cstr;
3071                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3072                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3073                                 return ValueObjectSP();
3074                             }
3075                             else
3076                             {
3077                                 *what_next = eExpressionPathAftermathNothing;
3078                                 continue;
3079                             }
3080                         }
3081                         else
3082                         {
3083                             if (root->GetCompilerType().GetMinimumLanguage() == eLanguageTypeObjC
3084                                 && pointee_compiler_type_info.AllClear(eTypeIsPointer)
3085                                 && root->HasSyntheticValue()
3086                                 && (options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic ||
3087                                     options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both))
3088                             {
3089                                 root = root->GetSyntheticValue()->GetChildAtIndex(index, true);
3090                             }
3091                             else
3092                                 root = root->GetSyntheticArrayMember(index, true);
3093                             if (!root.get())
3094                             {
3095                                 *first_unparsed = expression_cstr;
3096                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3097                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3098                                 return ValueObjectSP();
3099                             }
3100                             else
3101                             {
3102                                 *first_unparsed = end+1; // skip ]
3103                                 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3104                                 continue;
3105                             }
3106                         }
3107                     }
3108                     else if (root_compiler_type_info.Test(eTypeIsScalar))
3109                     {
3110                         root = root->GetSyntheticBitFieldChild(index, index, true);
3111                         if (!root.get())
3112                         {
3113                             *first_unparsed = expression_cstr;
3114                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3115                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3116                             return ValueObjectSP();
3117                         }
3118                         else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
3119                         {
3120                             *first_unparsed = end+1; // skip ]
3121                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
3122                             *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
3123                             return root;
3124                         }
3125                     }
3126                     else if (root_compiler_type_info.Test(eTypeIsVector))
3127                     {
3128                         root = root->GetChildAtIndex(index, true);
3129                         if (!root.get())
3130                         {
3131                             *first_unparsed = expression_cstr;
3132                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3133                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3134                             return ValueObjectSP();
3135                         }
3136                         else
3137                         {
3138                             *first_unparsed = end+1; // skip ]
3139                             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3140                             continue;
3141                         }
3142                     }
3143                     else if (options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic ||
3144                              options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both)
3145                     {
3146                         if (root->HasSyntheticValue())
3147                             root = root->GetSyntheticValue();
3148                         else if (!root->IsSynthetic())
3149                         {
3150                             *first_unparsed = expression_cstr;
3151                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
3152                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3153                             return ValueObjectSP();
3154                         }
3155                         // if we are here, then root itself is a synthetic VO.. should be good to go
3156 
3157                         if (!root.get())
3158                         {
3159                             *first_unparsed = expression_cstr;
3160                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
3161                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3162                             return ValueObjectSP();
3163                         }
3164                         root = root->GetChildAtIndex(index, true);
3165                         if (!root.get())
3166                         {
3167                             *first_unparsed = expression_cstr;
3168                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3169                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3170                             return ValueObjectSP();
3171                         }
3172                         else
3173                         {
3174                             *first_unparsed = end+1; // skip ]
3175                             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3176                             continue;
3177                         }
3178                     }
3179                     else
3180                     {
3181                         *first_unparsed = expression_cstr;
3182                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3183                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3184                         return ValueObjectSP();
3185                     }
3186                 }
3187                 else // we have a low and a high index
3188                 {
3189                     char *end = NULL;
3190                     unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
3191                     if (!end || end != separator_position) // if something weird is in our way return an error
3192                     {
3193                         *first_unparsed = expression_cstr;
3194                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3195                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3196                         return ValueObjectSP();
3197                     }
3198                     unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
3199                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3200                     {
3201                         *first_unparsed = expression_cstr;
3202                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3203                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3204                         return ValueObjectSP();
3205                     }
3206                     if (index_lower > index_higher) // swap indices if required
3207                     {
3208                         unsigned long temp = index_lower;
3209                         index_lower = index_higher;
3210                         index_higher = temp;
3211                     }
3212                     if (root_compiler_type_info.Test(eTypeIsScalar)) // expansion only works for scalars
3213                     {
3214                         root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
3215                         if (!root.get())
3216                         {
3217                             *first_unparsed = expression_cstr;
3218                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3219                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3220                             return ValueObjectSP();
3221                         }
3222                         else
3223                         {
3224                             *first_unparsed = end+1; // skip ]
3225                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
3226                             *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
3227                             return root;
3228                         }
3229                     }
3230                     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
3231                              *what_next == ValueObject::eExpressionPathAftermathDereference &&
3232                              pointee_compiler_type_info.Test(eTypeIsScalar))
3233                     {
3234                         Error error;
3235                         root = root->Dereference(error);
3236                         if (error.Fail() || !root.get())
3237                         {
3238                             *first_unparsed = expression_cstr;
3239                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3240                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3241                             return ValueObjectSP();
3242                         }
3243                         else
3244                         {
3245                             *what_next = ValueObject::eExpressionPathAftermathNothing;
3246                             continue;
3247                         }
3248                     }
3249                     else
3250                     {
3251                         *first_unparsed = expression_cstr;
3252                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
3253                         *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange;
3254                         return root;
3255                     }
3256                 }
3257                 break;
3258             }
3259             default: // some non-separator is in the way
3260             {
3261                 *first_unparsed = expression_cstr;
3262                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3263                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3264                 return ValueObjectSP();
3265                 break;
3266             }
3267         }
3268     }
3269 }
3270 
3271 int
3272 ValueObject::ExpandArraySliceExpression(const char* expression_cstr,
3273                                         const char** first_unparsed,
3274                                         ValueObjectSP root,
3275                                         ValueObjectListSP& list,
3276                                         ExpressionPathScanEndReason* reason_to_stop,
3277                                         ExpressionPathEndResultType* final_result,
3278                                         const GetValueForExpressionPathOptions& options,
3279                                         ExpressionPathAftermath* what_next)
3280 {
3281     if (!root.get())
3282         return 0;
3283 
3284     *first_unparsed = expression_cstr;
3285 
3286     while (true)
3287     {
3288 
3289         const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
3290 
3291         CompilerType root_compiler_type = root->GetCompilerType();
3292         CompilerType pointee_compiler_type;
3293         Flags pointee_compiler_type_info;
3294         Flags root_compiler_type_info(root_compiler_type.GetTypeInfo(&pointee_compiler_type));
3295         if (pointee_compiler_type)
3296             pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
3297 
3298         if (!expression_cstr || *expression_cstr == '\0')
3299         {
3300             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
3301             list->Append(root);
3302             return 1;
3303         }
3304 
3305         switch (*expression_cstr)
3306         {
3307             case '[':
3308             {
3309                 if (!root_compiler_type_info.Test(eTypeIsArray) && !root_compiler_type_info.Test(eTypeIsPointer)) // if this is not a T[] nor a T*
3310                 {
3311                     if (!root_compiler_type_info.Test(eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
3312                     {
3313                         *first_unparsed = expression_cstr;
3314                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
3315                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3316                         return 0;
3317                     }
3318                     else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
3319                     {
3320                         *first_unparsed = expression_cstr;
3321                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
3322                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3323                         return 0;
3324                     }
3325                 }
3326                 if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
3327                 {
3328                     if (!root_compiler_type_info.Test(eTypeIsArray))
3329                     {
3330                         *first_unparsed = expression_cstr;
3331                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
3332                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3333                         return 0;
3334                     }
3335                     else // expand this into list
3336                     {
3337                         const size_t max_index = root->GetNumChildren() - 1;
3338                         for (size_t index = 0; index < max_index; index++)
3339                         {
3340                             ValueObjectSP child =
3341                                 root->GetChildAtIndex(index, true);
3342                             list->Append(child);
3343                         }
3344                         *first_unparsed = expression_cstr+2;
3345                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3346                         *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3347                         return max_index; // tell me number of items I added to the VOList
3348                     }
3349                 }
3350                 const char *separator_position = ::strchr(expression_cstr+1,'-');
3351                 const char *close_bracket_position = ::strchr(expression_cstr+1,']');
3352                 if (!close_bracket_position) // if there is no ], this is a syntax error
3353                 {
3354                     *first_unparsed = expression_cstr;
3355                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3356                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3357                     return 0;
3358                 }
3359                 if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
3360                 {
3361                     char *end = NULL;
3362                     unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
3363                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3364                     {
3365                         *first_unparsed = expression_cstr;
3366                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3367                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3368                         return 0;
3369                     }
3370                     if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
3371                     {
3372                         if (root_compiler_type_info.Test(eTypeIsArray))
3373                         {
3374                             const size_t max_index = root->GetNumChildren() - 1;
3375                             for (size_t index = 0; index < max_index; index++)
3376                             {
3377                                 ValueObjectSP child =
3378                                 root->GetChildAtIndex(index, true);
3379                                 list->Append(child);
3380                             }
3381                             *first_unparsed = expression_cstr+2;
3382                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3383                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3384                             return max_index; // tell me number of items I added to the VOList
3385                         }
3386                         else
3387                         {
3388                             *first_unparsed = expression_cstr;
3389                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
3390                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3391                             return 0;
3392                         }
3393                     }
3394                     // from here on we do have a valid index
3395                     if (root_compiler_type_info.Test(eTypeIsArray))
3396                     {
3397                         root = root->GetChildAtIndex(index, true);
3398                         if (!root.get())
3399                         {
3400                             *first_unparsed = expression_cstr;
3401                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3402                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3403                             return 0;
3404                         }
3405                         else
3406                         {
3407                             list->Append(root);
3408                             *first_unparsed = end+1; // skip ]
3409                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3410                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3411                             return 1;
3412                         }
3413                     }
3414                     else if (root_compiler_type_info.Test(eTypeIsPointer))
3415                     {
3416                         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
3417                             pointee_compiler_type_info.Test(eTypeIsScalar))
3418                         {
3419                             Error error;
3420                             root = root->Dereference(error);
3421                             if (error.Fail() || !root.get())
3422                             {
3423                                 *first_unparsed = expression_cstr;
3424                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3425                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3426                                 return 0;
3427                             }
3428                             else
3429                             {
3430                                 *what_next = eExpressionPathAftermathNothing;
3431                                 continue;
3432                             }
3433                         }
3434                         else
3435                         {
3436                             root = root->GetSyntheticArrayMember(index, true);
3437                             if (!root.get())
3438                             {
3439                                 *first_unparsed = expression_cstr;
3440                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3441                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3442                                 return 0;
3443                             }
3444                             else
3445                             {
3446                                 list->Append(root);
3447                                 *first_unparsed = end+1; // skip ]
3448                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3449                                 *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3450                                 return 1;
3451                             }
3452                         }
3453                     }
3454                     else /*if (ClangASTContext::IsScalarType(root_compiler_type))*/
3455                     {
3456                         root = root->GetSyntheticBitFieldChild(index, index, true);
3457                         if (!root.get())
3458                         {
3459                             *first_unparsed = expression_cstr;
3460                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3461                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3462                             return 0;
3463                         }
3464                         else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
3465                         {
3466                             list->Append(root);
3467                             *first_unparsed = end+1; // skip ]
3468                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3469                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3470                             return 1;
3471                         }
3472                     }
3473                 }
3474                 else // we have a low and a high index
3475                 {
3476                     char *end = NULL;
3477                     unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
3478                     if (!end || end != separator_position) // if something weird is in our way return an error
3479                     {
3480                         *first_unparsed = expression_cstr;
3481                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3482                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3483                         return 0;
3484                     }
3485                     unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
3486                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3487                     {
3488                         *first_unparsed = expression_cstr;
3489                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3490                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3491                         return 0;
3492                     }
3493                     if (index_lower > index_higher) // swap indices if required
3494                     {
3495                         unsigned long temp = index_lower;
3496                         index_lower = index_higher;
3497                         index_higher = temp;
3498                     }
3499                     if (root_compiler_type_info.Test(eTypeIsScalar)) // expansion only works for scalars
3500                     {
3501                         root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
3502                         if (!root.get())
3503                         {
3504                             *first_unparsed = expression_cstr;
3505                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3506                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3507                             return 0;
3508                         }
3509                         else
3510                         {
3511                             list->Append(root);
3512                             *first_unparsed = end+1; // skip ]
3513                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3514                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3515                             return 1;
3516                         }
3517                     }
3518                     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
3519                              *what_next == ValueObject::eExpressionPathAftermathDereference &&
3520                              pointee_compiler_type_info.Test(eTypeIsScalar))
3521                     {
3522                         Error error;
3523                         root = root->Dereference(error);
3524                         if (error.Fail() || !root.get())
3525                         {
3526                             *first_unparsed = expression_cstr;
3527                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3528                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3529                             return 0;
3530                         }
3531                         else
3532                         {
3533                             *what_next = ValueObject::eExpressionPathAftermathNothing;
3534                             continue;
3535                         }
3536                     }
3537                     else
3538                     {
3539                         for (unsigned long index = index_lower;
3540                              index <= index_higher; index++)
3541                         {
3542                             ValueObjectSP child =
3543                                 root->GetChildAtIndex(index, true);
3544                             list->Append(child);
3545                         }
3546                         *first_unparsed = end+1;
3547                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3548                         *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3549                         return index_higher-index_lower+1; // tell me number of items I added to the VOList
3550                     }
3551                 }
3552                 break;
3553             }
3554             default: // some non-[ separator, or something entirely wrong, is in the way
3555             {
3556                 *first_unparsed = expression_cstr;
3557                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3558                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3559                 return 0;
3560                 break;
3561             }
3562         }
3563     }
3564 }
3565 
3566 void
3567 ValueObject::LogValueObject (Log *log)
3568 {
3569     if (log)
3570         return LogValueObject (log, DumpValueObjectOptions(*this));
3571 }
3572 
3573 void
3574 ValueObject::LogValueObject (Log *log, const DumpValueObjectOptions& options)
3575 {
3576     if (log)
3577     {
3578         StreamString s;
3579         Dump (s, options);
3580         if (s.GetSize())
3581             log->PutCString(s.GetData());
3582     }
3583 }
3584 
3585 void
3586 ValueObject::Dump (Stream &s)
3587 {
3588     Dump (s, DumpValueObjectOptions(*this));
3589 }
3590 
3591 void
3592 ValueObject::Dump (Stream &s,
3593                    const DumpValueObjectOptions& options)
3594 {
3595     ValueObjectPrinter printer(this,&s,options);
3596     printer.PrintValueObject();
3597 }
3598 
3599 ValueObjectSP
3600 ValueObject::CreateConstantValue (const ConstString &name)
3601 {
3602     ValueObjectSP valobj_sp;
3603 
3604     if (UpdateValueIfNeeded(false) && m_error.Success())
3605     {
3606         ExecutionContext exe_ctx (GetExecutionContextRef());
3607 
3608         DataExtractor data;
3609         data.SetByteOrder (m_data.GetByteOrder());
3610         data.SetAddressByteSize(m_data.GetAddressByteSize());
3611 
3612         if (IsBitfield())
3613         {
3614             Value v(Scalar(GetValueAsUnsigned(UINT64_MAX)));
3615             m_error = v.GetValueAsData (&exe_ctx, data, 0, GetModule().get());
3616         }
3617         else
3618             m_error = m_value.GetValueAsData (&exe_ctx, data, 0, GetModule().get());
3619 
3620         valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
3621                                                     GetCompilerType(),
3622                                                     name,
3623                                                     data,
3624                                                     GetAddressOf());
3625     }
3626 
3627     if (!valobj_sp)
3628     {
3629         ExecutionContext exe_ctx (GetExecutionContextRef());
3630         valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), m_error);
3631     }
3632     return valobj_sp;
3633 }
3634 
3635 ValueObjectSP
3636 ValueObject::GetQualifiedRepresentationIfAvailable (lldb::DynamicValueType dynValue,
3637                                                     bool synthValue)
3638 {
3639     ValueObjectSP result_sp(GetSP());
3640 
3641     switch (dynValue)
3642     {
3643         case lldb::eDynamicCanRunTarget:
3644         case lldb::eDynamicDontRunTarget:
3645         {
3646             if (!result_sp->IsDynamic())
3647             {
3648                 if (result_sp->GetDynamicValue(dynValue))
3649                     result_sp = result_sp->GetDynamicValue(dynValue);
3650             }
3651         }
3652             break;
3653         case lldb::eNoDynamicValues:
3654         {
3655             if (result_sp->IsDynamic())
3656             {
3657                 if (result_sp->GetStaticValue())
3658                     result_sp = result_sp->GetStaticValue();
3659             }
3660         }
3661             break;
3662     }
3663 
3664     if (synthValue)
3665     {
3666         if (!result_sp->IsSynthetic())
3667         {
3668             if (result_sp->GetSyntheticValue())
3669                 result_sp = result_sp->GetSyntheticValue();
3670         }
3671     }
3672     else
3673     {
3674         if (result_sp->IsSynthetic())
3675         {
3676             if (result_sp->GetNonSyntheticValue())
3677                 result_sp = result_sp->GetNonSyntheticValue();
3678         }
3679     }
3680 
3681     return result_sp;
3682 }
3683 
3684 lldb::addr_t
3685 ValueObject::GetCPPVTableAddress (AddressType &address_type)
3686 {
3687     CompilerType pointee_type;
3688     CompilerType this_type(GetCompilerType());
3689     uint32_t type_info = this_type.GetTypeInfo(&pointee_type);
3690     if (type_info)
3691     {
3692         bool ptr_or_ref = false;
3693         if (type_info & (eTypeIsPointer | eTypeIsReference))
3694         {
3695             ptr_or_ref = true;
3696             type_info = pointee_type.GetTypeInfo();
3697         }
3698 
3699         const uint32_t cpp_class = eTypeIsClass | eTypeIsCPlusPlus;
3700         if ((type_info & cpp_class) == cpp_class)
3701         {
3702             if (ptr_or_ref)
3703             {
3704                 address_type = GetAddressTypeOfChildren();
3705                 return GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
3706             }
3707             else
3708                 return GetAddressOf (false, &address_type);
3709         }
3710     }
3711 
3712     address_type = eAddressTypeInvalid;
3713     return LLDB_INVALID_ADDRESS;
3714 }
3715 
3716 ValueObjectSP
3717 ValueObject::Dereference (Error &error)
3718 {
3719     if (m_deref_valobj)
3720         return m_deref_valobj->GetSP();
3721 
3722     const bool is_pointer_or_reference_type = IsPointerOrReferenceType();
3723     if (is_pointer_or_reference_type)
3724     {
3725         bool omit_empty_base_classes = true;
3726         bool ignore_array_bounds = false;
3727 
3728         std::string child_name_str;
3729         uint32_t child_byte_size = 0;
3730         int32_t child_byte_offset = 0;
3731         uint32_t child_bitfield_bit_size = 0;
3732         uint32_t child_bitfield_bit_offset = 0;
3733         bool child_is_base_class = false;
3734         bool child_is_deref_of_parent = false;
3735         const bool transparent_pointers = false;
3736         CompilerType compiler_type = GetCompilerType();
3737         CompilerType child_compiler_type;
3738         uint64_t language_flags;
3739 
3740         ExecutionContext exe_ctx (GetExecutionContextRef());
3741 
3742         child_compiler_type = compiler_type.GetChildCompilerTypeAtIndex (&exe_ctx,
3743                                                                          0,
3744                                                                          transparent_pointers,
3745                                                                          omit_empty_base_classes,
3746                                                                          ignore_array_bounds,
3747                                                                          child_name_str,
3748                                                                          child_byte_size,
3749                                                                          child_byte_offset,
3750                                                                          child_bitfield_bit_size,
3751                                                                          child_bitfield_bit_offset,
3752                                                                          child_is_base_class,
3753                                                                          child_is_deref_of_parent,
3754                                                                          this,
3755                                                                          language_flags);
3756         if (child_compiler_type && child_byte_size)
3757         {
3758             ConstString child_name;
3759             if (!child_name_str.empty())
3760                 child_name.SetCString (child_name_str.c_str());
3761 
3762             m_deref_valobj = new ValueObjectChild (*this,
3763                                                    child_compiler_type,
3764                                                    child_name,
3765                                                    child_byte_size,
3766                                                    child_byte_offset,
3767                                                    child_bitfield_bit_size,
3768                                                    child_bitfield_bit_offset,
3769                                                    child_is_base_class,
3770                                                    child_is_deref_of_parent,
3771                                                    eAddressTypeInvalid,
3772                                                    language_flags);
3773         }
3774     }
3775 
3776     if (m_deref_valobj)
3777     {
3778         error.Clear();
3779         return m_deref_valobj->GetSP();
3780     }
3781     else
3782     {
3783         StreamString strm;
3784         GetExpressionPath(strm, true);
3785 
3786         if (is_pointer_or_reference_type)
3787             error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3788         else
3789             error.SetErrorStringWithFormat("not a pointer or reference type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3790         return ValueObjectSP();
3791     }
3792 }
3793 
3794 ValueObjectSP
3795 ValueObject::AddressOf (Error &error)
3796 {
3797     if (m_addr_of_valobj_sp)
3798         return m_addr_of_valobj_sp;
3799 
3800     AddressType address_type = eAddressTypeInvalid;
3801     const bool scalar_is_load_address = false;
3802     addr_t addr = GetAddressOf (scalar_is_load_address, &address_type);
3803     error.Clear();
3804     if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost)
3805     {
3806         switch (address_type)
3807         {
3808         case eAddressTypeInvalid:
3809             {
3810                 StreamString expr_path_strm;
3811                 GetExpressionPath(expr_path_strm, true);
3812                 error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
3813             }
3814             break;
3815 
3816         case eAddressTypeFile:
3817         case eAddressTypeLoad:
3818             {
3819                 CompilerType compiler_type = GetCompilerType();
3820                 if (compiler_type)
3821                 {
3822                     std::string name (1, '&');
3823                     name.append (m_name.AsCString(""));
3824                     ExecutionContext exe_ctx (GetExecutionContextRef());
3825                     m_addr_of_valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
3826                                                                           compiler_type.GetPointerType(),
3827                                                                           ConstString (name.c_str()),
3828                                                                           addr,
3829                                                                           eAddressTypeInvalid,
3830                                                                           m_data.GetAddressByteSize());
3831                 }
3832             }
3833             break;
3834         default:
3835             break;
3836         }
3837     }
3838     else
3839     {
3840         StreamString expr_path_strm;
3841         GetExpressionPath(expr_path_strm, true);
3842         error.SetErrorStringWithFormat("'%s' doesn't have a valid address", expr_path_strm.GetString().c_str());
3843     }
3844 
3845     return m_addr_of_valobj_sp;
3846 }
3847 
3848 ValueObjectSP
3849 ValueObject::Cast (const CompilerType &compiler_type)
3850 {
3851     return ValueObjectCast::Create (*this, GetName(), compiler_type);
3852 }
3853 
3854 ValueObjectSP
3855 ValueObject::CastPointerType (const char *name, CompilerType &compiler_type)
3856 {
3857     ValueObjectSP valobj_sp;
3858     AddressType address_type;
3859     addr_t ptr_value = GetPointerValue (&address_type);
3860 
3861     if (ptr_value != LLDB_INVALID_ADDRESS)
3862     {
3863         Address ptr_addr (ptr_value);
3864         ExecutionContext exe_ctx (GetExecutionContextRef());
3865         valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(),
3866                                                name,
3867                                                ptr_addr,
3868                                                compiler_type);
3869     }
3870     return valobj_sp;
3871 }
3872 
3873 ValueObjectSP
3874 ValueObject::CastPointerType (const char *name, TypeSP &type_sp)
3875 {
3876     ValueObjectSP valobj_sp;
3877     AddressType address_type;
3878     addr_t ptr_value = GetPointerValue (&address_type);
3879 
3880     if (ptr_value != LLDB_INVALID_ADDRESS)
3881     {
3882         Address ptr_addr (ptr_value);
3883         ExecutionContext exe_ctx (GetExecutionContextRef());
3884         valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(),
3885                                                name,
3886                                                ptr_addr,
3887                                                type_sp);
3888     }
3889     return valobj_sp;
3890 }
3891 
3892 ValueObject::EvaluationPoint::EvaluationPoint () :
3893     m_mod_id(),
3894     m_exe_ctx_ref(),
3895     m_needs_update (true)
3896 {
3897 }
3898 
3899 ValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
3900     m_mod_id(),
3901     m_exe_ctx_ref(),
3902     m_needs_update (true)
3903 {
3904     ExecutionContext exe_ctx(exe_scope);
3905     TargetSP target_sp (exe_ctx.GetTargetSP());
3906     if (target_sp)
3907     {
3908         m_exe_ctx_ref.SetTargetSP (target_sp);
3909         ProcessSP process_sp (exe_ctx.GetProcessSP());
3910         if (!process_sp)
3911             process_sp = target_sp->GetProcessSP();
3912 
3913         if (process_sp)
3914         {
3915             m_mod_id = process_sp->GetModID();
3916             m_exe_ctx_ref.SetProcessSP (process_sp);
3917 
3918             ThreadSP thread_sp (exe_ctx.GetThreadSP());
3919 
3920             if (!thread_sp)
3921             {
3922                 if (use_selected)
3923                     thread_sp = process_sp->GetThreadList().GetSelectedThread();
3924             }
3925 
3926             if (thread_sp)
3927             {
3928                 m_exe_ctx_ref.SetThreadSP(thread_sp);
3929 
3930                 StackFrameSP frame_sp (exe_ctx.GetFrameSP());
3931                 if (!frame_sp)
3932                 {
3933                     if (use_selected)
3934                         frame_sp = thread_sp->GetSelectedFrame();
3935                 }
3936                 if (frame_sp)
3937                     m_exe_ctx_ref.SetFrameSP(frame_sp);
3938             }
3939         }
3940     }
3941 }
3942 
3943 ValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
3944     m_mod_id(),
3945     m_exe_ctx_ref(rhs.m_exe_ctx_ref),
3946     m_needs_update (true)
3947 {
3948 }
3949 
3950 ValueObject::EvaluationPoint::~EvaluationPoint ()
3951 {
3952 }
3953 
3954 // This function checks the EvaluationPoint against the current process state.  If the current
3955 // state matches the evaluation point, or the evaluation point is already invalid, then we return
3956 // false, meaning "no change".  If the current state is different, we update our state, and return
3957 // true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3958 // future calls to NeedsUpdate will return true.
3959 // exe_scope will be set to the current execution context scope.
3960 
3961 bool
3962 ValueObject::EvaluationPoint::SyncWithProcessState(bool accept_invalid_exe_ctx)
3963 {
3964     // Start with the target, if it is NULL, then we're obviously not going to get any further:
3965     const bool thread_and_frame_only_if_stopped = true;
3966     ExecutionContext exe_ctx(m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped));
3967 
3968     if (exe_ctx.GetTargetPtr() == NULL)
3969         return false;
3970 
3971     // If we don't have a process nothing can change.
3972     Process *process = exe_ctx.GetProcessPtr();
3973     if (process == NULL)
3974         return false;
3975 
3976     // If our stop id is the current stop ID, nothing has changed:
3977     ProcessModID current_mod_id = process->GetModID();
3978 
3979     // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3980     // In either case, we aren't going to be able to sync with the process state.
3981     if (current_mod_id.GetStopID() == 0)
3982         return false;
3983 
3984     bool changed = false;
3985     const bool was_valid = m_mod_id.IsValid();
3986     if (was_valid)
3987     {
3988         if (m_mod_id == current_mod_id)
3989         {
3990             // Everything is already up to date in this object, no need to
3991             // update the execution context scope.
3992             changed = false;
3993         }
3994         else
3995         {
3996             m_mod_id = current_mod_id;
3997             m_needs_update = true;
3998             changed = true;
3999         }
4000     }
4001 
4002     // Now re-look up the thread and frame in case the underlying objects have gone away & been recreated.
4003     // That way we'll be sure to return a valid exe_scope.
4004     // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid.
4005 
4006     if (!accept_invalid_exe_ctx)
4007     {
4008         if (m_exe_ctx_ref.HasThreadRef())
4009         {
4010             ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP());
4011             if (thread_sp)
4012             {
4013                 if (m_exe_ctx_ref.HasFrameRef())
4014                 {
4015                     StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP());
4016                     if (!frame_sp)
4017                     {
4018                         // We used to have a frame, but now it is gone
4019                         SetInvalid();
4020                         changed = was_valid;
4021                     }
4022                 }
4023             }
4024             else
4025             {
4026                 // We used to have a thread, but now it is gone
4027                 SetInvalid();
4028                 changed = was_valid;
4029             }
4030         }
4031     }
4032 
4033     return changed;
4034 }
4035 
4036 void
4037 ValueObject::EvaluationPoint::SetUpdated ()
4038 {
4039     ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
4040     if (process_sp)
4041         m_mod_id = process_sp->GetModID();
4042     m_needs_update = false;
4043 }
4044 
4045 
4046 
4047 void
4048 ValueObject::ClearUserVisibleData(uint32_t clear_mask)
4049 {
4050     if ((clear_mask & eClearUserVisibleDataItemsValue) == eClearUserVisibleDataItemsValue)
4051         m_value_str.clear();
4052 
4053     if ((clear_mask & eClearUserVisibleDataItemsLocation) == eClearUserVisibleDataItemsLocation)
4054         m_location_str.clear();
4055 
4056     if ((clear_mask & eClearUserVisibleDataItemsSummary) == eClearUserVisibleDataItemsSummary)
4057         m_summary_str.clear();
4058 
4059     if ((clear_mask & eClearUserVisibleDataItemsDescription) == eClearUserVisibleDataItemsDescription)
4060         m_object_desc_str.clear();
4061 
4062     if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) == eClearUserVisibleDataItemsSyntheticChildren)
4063     {
4064             if (m_synthetic_value)
4065                 m_synthetic_value = NULL;
4066     }
4067 
4068     if ((clear_mask & eClearUserVisibleDataItemsValidator) == eClearUserVisibleDataItemsValidator)
4069         m_validation_result.reset();
4070 }
4071 
4072 SymbolContextScope *
4073 ValueObject::GetSymbolContextScope()
4074 {
4075     if (m_parent)
4076     {
4077         if (!m_parent->IsPointerOrReferenceType())
4078             return m_parent->GetSymbolContextScope();
4079     }
4080     return NULL;
4081 }
4082 
4083 lldb::ValueObjectSP
4084 ValueObject::CreateValueObjectFromExpression (const char* name,
4085                                               const char* expression,
4086                                               const ExecutionContext& exe_ctx)
4087 {
4088     return CreateValueObjectFromExpression(name, expression, exe_ctx, EvaluateExpressionOptions());
4089 }
4090 
4091 
4092 lldb::ValueObjectSP
4093 ValueObject::CreateValueObjectFromExpression (const char* name,
4094                                               const char* expression,
4095                                               const ExecutionContext& exe_ctx,
4096                                               const EvaluateExpressionOptions& options)
4097 {
4098     lldb::ValueObjectSP retval_sp;
4099     lldb::TargetSP target_sp(exe_ctx.GetTargetSP());
4100     if (!target_sp)
4101         return retval_sp;
4102     if (!expression || !*expression)
4103         return retval_sp;
4104     target_sp->EvaluateExpression (expression,
4105                                    exe_ctx.GetFrameSP().get(),
4106                                    retval_sp,
4107                                    options);
4108     if (retval_sp && name && *name)
4109         retval_sp->SetName(ConstString(name));
4110     return retval_sp;
4111 }
4112 
4113 lldb::ValueObjectSP
4114 ValueObject::CreateValueObjectFromAddress (const char* name,
4115                                            uint64_t address,
4116                                            const ExecutionContext& exe_ctx,
4117                                            CompilerType type)
4118 {
4119     if (type)
4120     {
4121         CompilerType pointer_type(type.GetPointerType());
4122         if (pointer_type)
4123         {
4124             lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
4125             lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
4126                                                                                      pointer_type,
4127                                                                                      ConstString(name),
4128                                                                                      buffer,
4129                                                                                      exe_ctx.GetByteOrder(),
4130                                                                                      exe_ctx.GetAddressByteSize()));
4131             if (ptr_result_valobj_sp)
4132             {
4133                 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
4134                 Error err;
4135                 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
4136                 if (ptr_result_valobj_sp && name && *name)
4137                     ptr_result_valobj_sp->SetName(ConstString(name));
4138             }
4139             return ptr_result_valobj_sp;
4140         }
4141     }
4142     return lldb::ValueObjectSP();
4143 }
4144 
4145 lldb::ValueObjectSP
4146 ValueObject::CreateValueObjectFromData (const char* name,
4147                                         const DataExtractor& data,
4148                                         const ExecutionContext& exe_ctx,
4149                                         CompilerType type)
4150 {
4151     lldb::ValueObjectSP new_value_sp;
4152     new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
4153                                                    type,
4154                                                    ConstString(name),
4155                                                    data,
4156                                                    LLDB_INVALID_ADDRESS);
4157     new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
4158     if (new_value_sp && name && *name)
4159         new_value_sp->SetName(ConstString(name));
4160     return new_value_sp;
4161 }
4162 
4163 ModuleSP
4164 ValueObject::GetModule ()
4165 {
4166     ValueObject* root(GetRoot());
4167     if (root != this)
4168         return root->GetModule();
4169     return lldb::ModuleSP();
4170 }
4171 
4172 ValueObject*
4173 ValueObject::GetRoot ()
4174 {
4175     if (m_root)
4176         return m_root;
4177     return (m_root = FollowParentChain( [] (ValueObject* vo) -> bool {
4178         return (vo->m_parent != nullptr);
4179     }));
4180 }
4181 
4182 ValueObject*
4183 ValueObject::FollowParentChain (std::function<bool(ValueObject*)> f)
4184 {
4185     ValueObject* vo = this;
4186     while (vo)
4187     {
4188         if (f(vo) == false)
4189             break;
4190         vo = vo->m_parent;
4191     }
4192     return vo;
4193 }
4194 
4195 AddressType
4196 ValueObject::GetAddressTypeOfChildren()
4197 {
4198     if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid)
4199     {
4200         ValueObject* root(GetRoot());
4201         if (root != this)
4202             return root->GetAddressTypeOfChildren();
4203     }
4204     return m_address_type_of_ptr_or_ref_children;
4205 }
4206 
4207 lldb::DynamicValueType
4208 ValueObject::GetDynamicValueType ()
4209 {
4210     ValueObject* with_dv_info = this;
4211     while (with_dv_info)
4212     {
4213         if (with_dv_info->HasDynamicValueTypeInfo())
4214             return with_dv_info->GetDynamicValueTypeImpl();
4215         with_dv_info = with_dv_info->m_parent;
4216     }
4217     return lldb::eNoDynamicValues;
4218 }
4219 
4220 lldb::Format
4221 ValueObject::GetFormat () const
4222 {
4223     const ValueObject* with_fmt_info = this;
4224     while (with_fmt_info)
4225     {
4226         if (with_fmt_info->m_format != lldb::eFormatDefault)
4227             return with_fmt_info->m_format;
4228         with_fmt_info = with_fmt_info->m_parent;
4229     }
4230     return m_format;
4231 }
4232 
4233 lldb::LanguageType
4234 ValueObject::GetPreferredDisplayLanguage ()
4235 {
4236     lldb::LanguageType type = m_preferred_display_language;
4237     if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
4238     {
4239         if (GetRoot())
4240         {
4241             if (GetRoot() == this)
4242             {
4243                 if (StackFrameSP frame_sp = GetFrameSP())
4244                 {
4245                     const SymbolContext& sc(frame_sp->GetSymbolContext(eSymbolContextCompUnit));
4246                     if (CompileUnit* cu = sc.comp_unit)
4247                         type = cu->GetLanguage();
4248                 }
4249             }
4250             else
4251             {
4252                 type = GetRoot()->GetPreferredDisplayLanguage();
4253             }
4254         }
4255     }
4256     return (m_preferred_display_language = type); // only compute it once
4257 }
4258 
4259 void
4260 ValueObject::SetPreferredDisplayLanguage (lldb::LanguageType lt)
4261 {
4262     m_preferred_display_language = lt;
4263 }
4264 
4265 void
4266 ValueObject::SetPreferredDisplayLanguageIfNeeded (lldb::LanguageType lt)
4267 {
4268     if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
4269         SetPreferredDisplayLanguage(lt);
4270 }
4271 
4272 bool
4273 ValueObject::CanProvideValue ()
4274 {
4275     // we need to support invalid types as providers of values because some bare-board
4276     // debugging scenarios have no notion of types, but still manage to have raw numeric
4277     // values for things like registers. sigh.
4278     const CompilerType &type(GetCompilerType());
4279     return (false == type.IsValid()) || (0 != (type.GetTypeInfo() & eTypeHasValue));
4280 }
4281 
4282 bool
4283 ValueObject::IsChecksumEmpty ()
4284 {
4285     return m_value_checksum.empty();
4286 }
4287 
4288 ValueObjectSP
4289 ValueObject::Persist ()
4290 {
4291     if (!UpdateValueIfNeeded())
4292         return nullptr;
4293 
4294     TargetSP target_sp(GetTargetSP());
4295     if (!target_sp)
4296         return nullptr;
4297 
4298     PersistentExpressionState *persistent_state = target_sp->GetPersistentExpressionStateForLanguage(GetPreferredDisplayLanguage());
4299 
4300     if (!persistent_state)
4301         return nullptr;
4302 
4303     ConstString name(persistent_state->GetNextPersistentVariableName());
4304 
4305     ValueObjectSP const_result_sp = ValueObjectConstResult::Create (target_sp.get(), GetValue(), name);
4306 
4307     ExpressionVariableSP clang_var_sp = persistent_state->CreatePersistentVariable(const_result_sp);
4308     clang_var_sp->m_live_sp = clang_var_sp->m_frozen_sp;
4309     clang_var_sp->m_flags |= ExpressionVariable::EVIsProgramReference;
4310 
4311     return clang_var_sp->GetValueObject();
4312 }
4313 
4314 bool
4315 ValueObject::IsSyntheticChildrenGenerated ()
4316 {
4317     return m_is_synthetic_children_generated;
4318 }
4319 
4320 void
4321 ValueObject::SetSyntheticChildrenGenerated (bool b)
4322 {
4323     m_is_synthetic_children_generated = b;
4324 }
4325 
4326 uint64_t
4327 ValueObject::GetLanguageFlags ()
4328 {
4329     return m_language_flags;
4330 }
4331 
4332 void
4333 ValueObject::SetLanguageFlags (uint64_t flags)
4334 {
4335     m_language_flags = flags;
4336 }
4337