• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- ValueObject.h -------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_CORE_VALUEOBJECT_H
10 #define LLDB_CORE_VALUEOBJECT_H
11 
12 #include "lldb/Core/Value.h"
13 #include "lldb/Symbol/CompilerType.h"
14 #include "lldb/Symbol/Type.h"
15 #include "lldb/Target/ExecutionContext.h"
16 #include "lldb/Target/Process.h"
17 #include "lldb/Utility/ConstString.h"
18 #include "lldb/Utility/DataExtractor.h"
19 #include "lldb/Utility/SharedCluster.h"
20 #include "lldb/Utility/Status.h"
21 #include "lldb/Utility/UserID.h"
22 #include "lldb/lldb-defines.h"
23 #include "lldb/lldb-enumerations.h"
24 #include "lldb/lldb-forward.h"
25 #include "lldb/lldb-private-enumerations.h"
26 #include "lldb/lldb-types.h"
27 
28 #include "llvm/ADT/ArrayRef.h"
29 #include "llvm/ADT/Optional.h"
30 #include "llvm/ADT/SmallVector.h"
31 #include "llvm/ADT/StringRef.h"
32 
33 #include <functional>
34 #include <initializer_list>
35 #include <map>
36 #include <mutex>
37 #include <string>
38 #include <utility>
39 
40 #include <stddef.h>
41 #include <stdint.h>
42 
43 namespace lldb_private {
44 class Declaration;
45 class DumpValueObjectOptions;
46 class EvaluateExpressionOptions;
47 class ExecutionContextScope;
48 class Log;
49 class Scalar;
50 class Stream;
51 class SymbolContextScope;
52 class TypeFormatImpl;
53 class TypeSummaryImpl;
54 class TypeSummaryOptions;
55 
56 /// ValueObject:
57 ///
58 /// This abstract class provides an interface to a particular value, be it a
59 /// register, a local or global variable,
60 /// that is evaluated in some particular scope.  The ValueObject also has the
61 /// capability of being the "child" of
62 /// some other variable object, and in turn of having children.
63 /// If a ValueObject is a root variable object - having no parent - then it must
64 /// be constructed with respect to some
65 /// particular ExecutionContextScope.  If it is a child, it inherits the
66 /// ExecutionContextScope from its parent.
67 /// The ValueObject will update itself if necessary before fetching its value,
68 /// summary, object description, etc.
69 /// But it will always update itself in the ExecutionContextScope with which it
70 /// was originally created.
71 
72 /// A brief note on life cycle management for ValueObjects.  This is a little
73 /// tricky because a ValueObject can contain
74 /// various other ValueObjects - the Dynamic Value, its children, the
75 /// dereference value, etc.  Any one of these can be
76 /// handed out as a shared pointer, but for that contained value object to be
77 /// valid, the root object and potentially other
78 /// of the value objects need to stay around.
79 /// We solve this problem by handing out shared pointers to the Value Object and
80 /// any of its dependents using a shared
81 /// ClusterManager.  This treats each shared pointer handed out for the entire
82 /// cluster as a reference to the whole
83 /// cluster.  The whole cluster will stay around until the last reference is
84 /// released.
85 ///
86 /// The ValueObject mostly handle this automatically, if a value object is made
87 /// with a Parent ValueObject, then it adds
88 /// itself to the ClusterManager of the parent.
89 
90 /// It does mean that external to the ValueObjects we should only ever make
91 /// available ValueObjectSP's, never ValueObjects
92 /// or pointers to them.  So all the "Root level" ValueObject derived
93 /// constructors should be private, and
94 /// should implement a Create function that new's up object and returns a Shared
95 /// Pointer that it gets from the GetSP() method.
96 ///
97 /// However, if you are making an derived ValueObject that will be contained in
98 /// a parent value object, you should just
99 /// hold onto a pointer to it internally, and by virtue of passing the parent
100 /// ValueObject into its constructor, it will
101 /// be added to the ClusterManager for the parent.  Then if you ever hand out a
102 /// Shared Pointer to the contained ValueObject,
103 /// just do so by calling GetSP() on the contained object.
104 
105 class ValueObject : public UserID {
106 public:
107   enum GetExpressionPathFormat {
108     eGetExpressionPathFormatDereferencePointers = 1,
109     eGetExpressionPathFormatHonorPointers
110   };
111 
112   enum ValueObjectRepresentationStyle {
113     eValueObjectRepresentationStyleValue = 1,
114     eValueObjectRepresentationStyleSummary,
115     eValueObjectRepresentationStyleLanguageSpecific,
116     eValueObjectRepresentationStyleLocation,
117     eValueObjectRepresentationStyleChildrenCount,
118     eValueObjectRepresentationStyleType,
119     eValueObjectRepresentationStyleName,
120     eValueObjectRepresentationStyleExpressionPath
121   };
122 
123   enum ExpressionPathScanEndReason {
124     eExpressionPathScanEndReasonEndOfString = 1,      // out of data to parse
125     eExpressionPathScanEndReasonNoSuchChild,          // child element not found
126     eExpressionPathScanEndReasonNoSuchSyntheticChild, // (synthetic) child
127                                                       // element not found
128     eExpressionPathScanEndReasonEmptyRangeNotAllowed, // [] only allowed for
129                                                       // arrays
130     eExpressionPathScanEndReasonDotInsteadOfArrow, // . used when -> should be
131                                                    // used
132     eExpressionPathScanEndReasonArrowInsteadOfDot, // -> used when . should be
133                                                    // used
134     eExpressionPathScanEndReasonFragileIVarNotAllowed,   // ObjC ivar expansion
135                                                          // not allowed
136     eExpressionPathScanEndReasonRangeOperatorNotAllowed, // [] not allowed by
137                                                          // options
138     eExpressionPathScanEndReasonRangeOperatorInvalid, // [] not valid on objects
139                                                       // other than scalars,
140                                                       // pointers or arrays
141     eExpressionPathScanEndReasonArrayRangeOperatorMet, // [] is good for arrays,
142                                                        // but I cannot parse it
143     eExpressionPathScanEndReasonBitfieldRangeOperatorMet, // [] is good for
144                                                           // bitfields, but I
145                                                           // cannot parse after
146                                                           // it
147     eExpressionPathScanEndReasonUnexpectedSymbol, // something is malformed in
148                                                   // the expression
149     eExpressionPathScanEndReasonTakingAddressFailed,   // impossible to apply &
150                                                        // operator
151     eExpressionPathScanEndReasonDereferencingFailed,   // impossible to apply *
152                                                        // operator
153     eExpressionPathScanEndReasonRangeOperatorExpanded, // [] was expanded into a
154                                                        // VOList
155     eExpressionPathScanEndReasonSyntheticValueMissing, // getting the synthetic
156                                                        // children failed
157     eExpressionPathScanEndReasonUnknown = 0xFFFF
158   };
159 
160   enum ExpressionPathEndResultType {
161     eExpressionPathEndResultTypePlain = 1,       // anything but...
162     eExpressionPathEndResultTypeBitfield,        // a bitfield
163     eExpressionPathEndResultTypeBoundedRange,    // a range [low-high]
164     eExpressionPathEndResultTypeUnboundedRange,  // a range []
165     eExpressionPathEndResultTypeValueObjectList, // several items in a VOList
166     eExpressionPathEndResultTypeInvalid = 0xFFFF
167   };
168 
169   enum ExpressionPathAftermath {
170     eExpressionPathAftermathNothing = 1, // just return it
171     eExpressionPathAftermathDereference, // dereference the target
172     eExpressionPathAftermathTakeAddress  // take target's address
173   };
174 
175   enum ClearUserVisibleDataItems {
176     eClearUserVisibleDataItemsNothing = 1u << 0,
177     eClearUserVisibleDataItemsValue = 1u << 1,
178     eClearUserVisibleDataItemsSummary = 1u << 2,
179     eClearUserVisibleDataItemsLocation = 1u << 3,
180     eClearUserVisibleDataItemsDescription = 1u << 4,
181     eClearUserVisibleDataItemsSyntheticChildren = 1u << 5,
182     eClearUserVisibleDataItemsAllStrings =
183         eClearUserVisibleDataItemsValue | eClearUserVisibleDataItemsSummary |
184         eClearUserVisibleDataItemsLocation |
185         eClearUserVisibleDataItemsDescription,
186     eClearUserVisibleDataItemsAll = 0xFFFF
187   };
188 
189   struct GetValueForExpressionPathOptions {
190     enum class SyntheticChildrenTraversal {
191       None,
192       ToSynthetic,
193       FromSynthetic,
194       Both
195     };
196 
197     bool m_check_dot_vs_arrow_syntax;
198     bool m_no_fragile_ivar;
199     bool m_allow_bitfields_syntax;
200     SyntheticChildrenTraversal m_synthetic_children_traversal;
201 
202     GetValueForExpressionPathOptions(
203         bool dot = false, bool no_ivar = false, bool bitfield = true,
204         SyntheticChildrenTraversal synth_traverse =
205             SyntheticChildrenTraversal::ToSynthetic)
m_check_dot_vs_arrow_syntaxGetValueForExpressionPathOptions206         : m_check_dot_vs_arrow_syntax(dot), m_no_fragile_ivar(no_ivar),
207           m_allow_bitfields_syntax(bitfield),
208           m_synthetic_children_traversal(synth_traverse) {}
209 
DoCheckDotVsArrowSyntaxGetValueForExpressionPathOptions210     GetValueForExpressionPathOptions &DoCheckDotVsArrowSyntax() {
211       m_check_dot_vs_arrow_syntax = true;
212       return *this;
213     }
214 
DontCheckDotVsArrowSyntaxGetValueForExpressionPathOptions215     GetValueForExpressionPathOptions &DontCheckDotVsArrowSyntax() {
216       m_check_dot_vs_arrow_syntax = false;
217       return *this;
218     }
219 
DoAllowFragileIVarGetValueForExpressionPathOptions220     GetValueForExpressionPathOptions &DoAllowFragileIVar() {
221       m_no_fragile_ivar = false;
222       return *this;
223     }
224 
DontAllowFragileIVarGetValueForExpressionPathOptions225     GetValueForExpressionPathOptions &DontAllowFragileIVar() {
226       m_no_fragile_ivar = true;
227       return *this;
228     }
229 
DoAllowBitfieldSyntaxGetValueForExpressionPathOptions230     GetValueForExpressionPathOptions &DoAllowBitfieldSyntax() {
231       m_allow_bitfields_syntax = true;
232       return *this;
233     }
234 
DontAllowBitfieldSyntaxGetValueForExpressionPathOptions235     GetValueForExpressionPathOptions &DontAllowBitfieldSyntax() {
236       m_allow_bitfields_syntax = false;
237       return *this;
238     }
239 
240     GetValueForExpressionPathOptions &
SetSyntheticChildrenTraversalGetValueForExpressionPathOptions241     SetSyntheticChildrenTraversal(SyntheticChildrenTraversal traverse) {
242       m_synthetic_children_traversal = traverse;
243       return *this;
244     }
245 
DefaultOptionsGetValueForExpressionPathOptions246     static const GetValueForExpressionPathOptions DefaultOptions() {
247       static GetValueForExpressionPathOptions g_default_options;
248 
249       return g_default_options;
250     }
251   };
252 
253   class EvaluationPoint {
254   public:
255     EvaluationPoint();
256 
257     EvaluationPoint(ExecutionContextScope *exe_scope,
258                     bool use_selected = false);
259 
260     EvaluationPoint(const EvaluationPoint &rhs);
261 
262     ~EvaluationPoint();
263 
GetExecutionContextRef()264     const ExecutionContextRef &GetExecutionContextRef() const {
265       return m_exe_ctx_ref;
266     }
267 
268     // Set the EvaluationPoint to the values in exe_scope, Return true if the
269     // Evaluation Point changed. Since the ExecutionContextScope is always
270     // going to be valid currently, the Updated Context will also always be
271     // valid.
272 
273     //        bool
274     //        SetContext (ExecutionContextScope *exe_scope);
275 
SetIsConstant()276     void SetIsConstant() {
277       SetUpdated();
278       m_mod_id.SetInvalid();
279     }
280 
IsConstant()281     bool IsConstant() const { return !m_mod_id.IsValid(); }
282 
GetModID()283     ProcessModID GetModID() const { return m_mod_id; }
284 
SetUpdateID(ProcessModID new_id)285     void SetUpdateID(ProcessModID new_id) { m_mod_id = new_id; }
286 
SetNeedsUpdate()287     void SetNeedsUpdate() { m_needs_update = true; }
288 
289     void SetUpdated();
290 
NeedsUpdating(bool accept_invalid_exe_ctx)291     bool NeedsUpdating(bool accept_invalid_exe_ctx) {
292       SyncWithProcessState(accept_invalid_exe_ctx);
293       return m_needs_update;
294     }
295 
IsValid()296     bool IsValid() {
297       const bool accept_invalid_exe_ctx = false;
298       if (!m_mod_id.IsValid())
299         return false;
300       else if (SyncWithProcessState(accept_invalid_exe_ctx)) {
301         if (!m_mod_id.IsValid())
302           return false;
303       }
304       return true;
305     }
306 
SetInvalid()307     void SetInvalid() {
308       // Use the stop id to mark us as invalid, leave the thread id and the
309       // stack id around for logging and history purposes.
310       m_mod_id.SetInvalid();
311 
312       // Can't update an invalid state.
313       m_needs_update = false;
314     }
315 
316   private:
317     bool SyncWithProcessState(bool accept_invalid_exe_ctx);
318 
319     ProcessModID m_mod_id; // This is the stop id when this ValueObject was last
320                            // evaluated.
321     ExecutionContextRef m_exe_ctx_ref;
322     bool m_needs_update;
323   };
324 
325   virtual ~ValueObject();
326 
GetUpdatePoint()327   const EvaluationPoint &GetUpdatePoint() const { return m_update_point; }
328 
GetUpdatePoint()329   EvaluationPoint &GetUpdatePoint() { return m_update_point; }
330 
GetExecutionContextRef()331   const ExecutionContextRef &GetExecutionContextRef() const {
332     return m_update_point.GetExecutionContextRef();
333   }
334 
GetTargetSP()335   lldb::TargetSP GetTargetSP() const {
336     return m_update_point.GetExecutionContextRef().GetTargetSP();
337   }
338 
GetProcessSP()339   lldb::ProcessSP GetProcessSP() const {
340     return m_update_point.GetExecutionContextRef().GetProcessSP();
341   }
342 
GetThreadSP()343   lldb::ThreadSP GetThreadSP() const {
344     return m_update_point.GetExecutionContextRef().GetThreadSP();
345   }
346 
GetFrameSP()347   lldb::StackFrameSP GetFrameSP() const {
348     return m_update_point.GetExecutionContextRef().GetFrameSP();
349   }
350 
351   void SetNeedsUpdate();
352 
353   CompilerType GetCompilerType();
354 
355   // this vends a TypeImpl that is useful at the SB API layer
356   virtual TypeImpl GetTypeImpl();
357 
358   virtual bool CanProvideValue();
359 
360   // Subclasses must implement the functions below.
361   virtual llvm::Optional<uint64_t> GetByteSize() = 0;
362 
363   virtual lldb::ValueType GetValueType() const = 0;
364 
365   // Subclasses can implement the functions below.
366   virtual ConstString GetTypeName();
367 
368   virtual ConstString GetDisplayTypeName();
369 
370   virtual ConstString GetQualifiedTypeName();
371 
372   virtual lldb::LanguageType GetObjectRuntimeLanguage();
373 
374   virtual uint32_t
375   GetTypeInfo(CompilerType *pointee_or_element_compiler_type = nullptr);
376 
377   virtual bool IsPointerType();
378 
379   virtual bool IsArrayType();
380 
381   virtual bool IsScalarType();
382 
383   virtual bool IsPointerOrReferenceType();
384 
385   virtual bool IsPossibleDynamicType();
386 
387   bool IsNilReference();
388 
389   bool IsUninitializedReference();
390 
IsBaseClass()391   virtual bool IsBaseClass() { return false; }
392 
393   bool IsBaseClass(uint32_t &depth);
394 
IsDereferenceOfParent()395   virtual bool IsDereferenceOfParent() { return false; }
396 
397   bool IsIntegerType(bool &is_signed);
398 
399   virtual void GetExpressionPath(
400       Stream &s,
401       GetExpressionPathFormat = eGetExpressionPathFormatDereferencePointers);
402 
403   lldb::ValueObjectSP GetValueForExpressionPath(
404       llvm::StringRef expression,
405       ExpressionPathScanEndReason *reason_to_stop = nullptr,
406       ExpressionPathEndResultType *final_value_type = nullptr,
407       const GetValueForExpressionPathOptions &options =
408           GetValueForExpressionPathOptions::DefaultOptions(),
409       ExpressionPathAftermath *final_task_on_target = nullptr);
410 
IsInScope()411   virtual bool IsInScope() { return true; }
412 
GetByteOffset()413   virtual lldb::offset_t GetByteOffset() { return 0; }
414 
GetBitfieldBitSize()415   virtual uint32_t GetBitfieldBitSize() { return 0; }
416 
GetBitfieldBitOffset()417   virtual uint32_t GetBitfieldBitOffset() { return 0; }
418 
IsBitfield()419   bool IsBitfield() {
420     return (GetBitfieldBitSize() != 0) || (GetBitfieldBitOffset() != 0);
421   }
422 
IsArrayItemForPointer()423   virtual bool IsArrayItemForPointer() { return m_is_array_item_for_pointer; }
424 
425   virtual const char *GetValueAsCString();
426 
427   virtual bool GetValueAsCString(const lldb_private::TypeFormatImpl &format,
428                                  std::string &destination);
429 
430   bool GetValueAsCString(lldb::Format format, std::string &destination);
431 
432   virtual uint64_t GetValueAsUnsigned(uint64_t fail_value,
433                                       bool *success = nullptr);
434 
435   virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success = nullptr);
436 
437   virtual bool SetValueFromCString(const char *value_str, Status &error);
438 
439   // Return the module associated with this value object in case the value is
440   // from an executable file and might have its data in sections of the file.
441   // This can be used for variables.
442   virtual lldb::ModuleSP GetModule();
443 
444   ValueObject *GetRoot();
445 
446   // Given a ValueObject, loop over itself and its parent, and its parent's
447   // parent, .. until either the given callback returns false, or you end up at
448   // a null pointer
449   ValueObject *FollowParentChain(std::function<bool(ValueObject *)>);
450 
451   virtual bool GetDeclaration(Declaration &decl);
452 
453   // The functions below should NOT be modified by subclasses
454   const Status &GetError();
455 
456   ConstString GetName() const;
457 
458   virtual lldb::ValueObjectSP GetChildAtIndex(size_t idx, bool can_create);
459 
460   // this will always create the children if necessary
461   lldb::ValueObjectSP GetChildAtIndexPath(llvm::ArrayRef<size_t> idxs,
462                                           size_t *index_of_error = nullptr);
463 
464   lldb::ValueObjectSP
465   GetChildAtIndexPath(llvm::ArrayRef<std::pair<size_t, bool>> idxs,
466                       size_t *index_of_error = nullptr);
467 
468   // this will always create the children if necessary
469   lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef<ConstString> names,
470                                          ConstString *name_of_error = nullptr);
471 
472   lldb::ValueObjectSP
473   GetChildAtNamePath(llvm::ArrayRef<std::pair<ConstString, bool>> names,
474                      ConstString *name_of_error = nullptr);
475 
476   virtual lldb::ValueObjectSP GetChildMemberWithName(ConstString name,
477                                                      bool can_create);
478 
479   virtual size_t GetIndexOfChildWithName(ConstString name);
480 
481   size_t GetNumChildren(uint32_t max = UINT32_MAX);
482 
483   const Value &GetValue() const;
484 
485   Value &GetValue();
486 
487   virtual bool ResolveValue(Scalar &scalar);
488 
489   // return 'false' whenever you set the error, otherwise callers may assume
490   // true means everything is OK - this will break breakpoint conditions among
491   // potentially a few others
492   virtual bool IsLogicalTrue(Status &error);
493 
494   virtual const char *GetLocationAsCString();
495 
496   const char *
497   GetSummaryAsCString(lldb::LanguageType lang = lldb::eLanguageTypeUnknown);
498 
499   bool
500   GetSummaryAsCString(TypeSummaryImpl *summary_ptr, std::string &destination,
501                       lldb::LanguageType lang = lldb::eLanguageTypeUnknown);
502 
503   bool GetSummaryAsCString(std::string &destination,
504                            const TypeSummaryOptions &options);
505 
506   bool GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
507                            std::string &destination,
508                            const TypeSummaryOptions &options);
509 
510   const char *GetObjectDescription();
511 
512   bool HasSpecialPrintableRepresentation(
513       ValueObjectRepresentationStyle val_obj_display,
514       lldb::Format custom_format);
515 
516   enum class PrintableRepresentationSpecialCases : bool {
517     eDisable = false,
518     eAllow = true
519   };
520 
521   bool
522   DumpPrintableRepresentation(Stream &s,
523                               ValueObjectRepresentationStyle val_obj_display =
524                                   eValueObjectRepresentationStyleSummary,
525                               lldb::Format custom_format = lldb::eFormatInvalid,
526                               PrintableRepresentationSpecialCases special =
527                                   PrintableRepresentationSpecialCases::eAllow,
528                               bool do_dump_error = true);
529   bool GetValueIsValid() const;
530 
531   // If you call this on a newly created ValueObject, it will always return
532   // false.
533   bool GetValueDidChange();
534 
535   bool UpdateValueIfNeeded(bool update_format = true);
536 
537   bool UpdateFormatsIfNeeded();
538 
GetSP()539   lldb::ValueObjectSP GetSP() { return m_manager->GetSharedPointer(this); }
540 
541   // Change the name of the current ValueObject. Should *not* be used from a
542   // synthetic child provider as it would change the name of the non synthetic
543   // child as well.
544   void SetName(ConstString name);
545 
546   virtual lldb::addr_t GetAddressOf(bool scalar_is_load_address = true,
547                                     AddressType *address_type = nullptr);
548 
549   lldb::addr_t GetPointerValue(AddressType *address_type = nullptr);
550 
551   lldb::ValueObjectSP GetSyntheticChild(ConstString key) const;
552 
553   lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create);
554 
555   lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to,
556                                                 bool can_create);
557 
558   lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression,
559                                                       bool can_create);
560 
561   virtual lldb::ValueObjectSP
562   GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type,
563                             bool can_create,
564                             ConstString name_const_str = ConstString());
565 
566   virtual lldb::ValueObjectSP
567   GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create,
568                    ConstString name_const_str = ConstString());
569 
570   virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType);
571 
572   lldb::DynamicValueType GetDynamicValueType();
573 
574   virtual lldb::ValueObjectSP GetStaticValue();
575 
576   virtual lldb::ValueObjectSP GetNonSyntheticValue();
577 
578   lldb::ValueObjectSP GetSyntheticValue();
579 
580   virtual bool HasSyntheticValue();
581 
IsSynthetic()582   virtual bool IsSynthetic() { return false; }
583 
584   lldb::ValueObjectSP
585   GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue,
586                                         bool synthValue);
587 
588   virtual lldb::ValueObjectSP CreateConstantValue(ConstString name);
589 
590   virtual lldb::ValueObjectSP Dereference(Status &error);
591 
592   // Creates a copy of the ValueObject with a new name and setting the current
593   // ValueObject as its parent. It should be used when we want to change the
594   // name of a ValueObject without modifying the actual ValueObject itself
595   // (e.g. sythetic child provider).
596   virtual lldb::ValueObjectSP Clone(ConstString new_name);
597 
598   virtual lldb::ValueObjectSP AddressOf(Status &error);
599 
GetLiveAddress()600   virtual lldb::addr_t GetLiveAddress() { return LLDB_INVALID_ADDRESS; }
601 
602   virtual void SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS,
603                               AddressType address_type = eAddressTypeLoad) {}
604 
605   virtual lldb::ValueObjectSP Cast(const CompilerType &compiler_type);
606 
607   virtual lldb::ValueObjectSP CastPointerType(const char *name,
608                                               CompilerType &ast_type);
609 
610   virtual lldb::ValueObjectSP CastPointerType(const char *name,
611                                               lldb::TypeSP &type_sp);
612 
613   // The backing bits of this value object were updated, clear any descriptive
614   // string, so we know we have to refetch them
ValueUpdated()615   virtual void ValueUpdated() {
616     ClearUserVisibleData(eClearUserVisibleDataItemsValue |
617                          eClearUserVisibleDataItemsSummary |
618                          eClearUserVisibleDataItemsDescription);
619   }
620 
IsDynamic()621   virtual bool IsDynamic() { return false; }
622 
DoesProvideSyntheticValue()623   virtual bool DoesProvideSyntheticValue() { return false; }
624 
625   virtual bool IsSyntheticChildrenGenerated();
626 
627   virtual void SetSyntheticChildrenGenerated(bool b);
628 
629   virtual SymbolContextScope *GetSymbolContextScope();
630 
631   void Dump(Stream &s);
632 
633   void Dump(Stream &s, const DumpValueObjectOptions &options);
634 
635   static lldb::ValueObjectSP
636   CreateValueObjectFromExpression(llvm::StringRef name,
637                                   llvm::StringRef expression,
638                                   const ExecutionContext &exe_ctx);
639 
640   static lldb::ValueObjectSP
641   CreateValueObjectFromExpression(llvm::StringRef name,
642                                   llvm::StringRef expression,
643                                   const ExecutionContext &exe_ctx,
644                                   const EvaluateExpressionOptions &options);
645 
646   static lldb::ValueObjectSP
647   CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address,
648                                const ExecutionContext &exe_ctx,
649                                CompilerType type);
650 
651   static lldb::ValueObjectSP
652   CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data,
653                             const ExecutionContext &exe_ctx, CompilerType type);
654 
655   void LogValueObject(Log *log);
656 
657   void LogValueObject(Log *log, const DumpValueObjectOptions &options);
658 
659   lldb::ValueObjectSP Persist();
660 
661   // returns true if this is a char* or a char[] if it is a char* and
662   // check_pointer is true, it also checks that the pointer is valid
663   bool IsCStringContainer(bool check_pointer = false);
664 
665   std::pair<size_t, bool>
666   ReadPointedString(lldb::DataBufferSP &buffer_sp, Status &error,
667                     uint32_t max_length = 0, bool honor_array = true,
668                     lldb::Format item_format = lldb::eFormatCharArray);
669 
670   virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx = 0,
671                                 uint32_t item_count = 1);
672 
673   virtual uint64_t GetData(DataExtractor &data, Status &error);
674 
675   virtual bool SetData(DataExtractor &data, Status &error);
676 
GetIsConstant()677   virtual bool GetIsConstant() const { return m_update_point.IsConstant(); }
678 
NeedsUpdating()679   bool NeedsUpdating() {
680     const bool accept_invalid_exe_ctx =
681         (CanUpdateWithInvalidExecutionContext() == eLazyBoolYes);
682     return m_update_point.NeedsUpdating(accept_invalid_exe_ctx);
683   }
684 
SetIsConstant()685   void SetIsConstant() { m_update_point.SetIsConstant(); }
686 
687   lldb::Format GetFormat() const;
688 
SetFormat(lldb::Format format)689   virtual void SetFormat(lldb::Format format) {
690     if (format != m_format)
691       ClearUserVisibleData(eClearUserVisibleDataItemsValue);
692     m_format = format;
693   }
694 
695   virtual lldb::LanguageType GetPreferredDisplayLanguage();
696 
697   void SetPreferredDisplayLanguage(lldb::LanguageType);
698 
GetSummaryFormat()699   lldb::TypeSummaryImplSP GetSummaryFormat() {
700     UpdateFormatsIfNeeded();
701     return m_type_summary_sp;
702   }
703 
SetSummaryFormat(lldb::TypeSummaryImplSP format)704   void SetSummaryFormat(lldb::TypeSummaryImplSP format) {
705     m_type_summary_sp = std::move(format);
706     ClearUserVisibleData(eClearUserVisibleDataItemsSummary);
707   }
708 
SetValueFormat(lldb::TypeFormatImplSP format)709   void SetValueFormat(lldb::TypeFormatImplSP format) {
710     m_type_format_sp = std::move(format);
711     ClearUserVisibleData(eClearUserVisibleDataItemsValue);
712   }
713 
GetValueFormat()714   lldb::TypeFormatImplSP GetValueFormat() {
715     UpdateFormatsIfNeeded();
716     return m_type_format_sp;
717   }
718 
SetSyntheticChildren(const lldb::SyntheticChildrenSP & synth_sp)719   void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp) {
720     if (synth_sp.get() == m_synthetic_children_sp.get())
721       return;
722     ClearUserVisibleData(eClearUserVisibleDataItemsSyntheticChildren);
723     m_synthetic_children_sp = synth_sp;
724   }
725 
GetSyntheticChildren()726   lldb::SyntheticChildrenSP GetSyntheticChildren() {
727     UpdateFormatsIfNeeded();
728     return m_synthetic_children_sp;
729   }
730 
731   // Use GetParent for display purposes, but if you want to tell the parent to
732   // update itself then use m_parent.  The ValueObjectDynamicValue's parent is
733   // not the correct parent for displaying, they are really siblings, so for
734   // display it needs to route through to its grandparent.
GetParent()735   virtual ValueObject *GetParent() { return m_parent; }
736 
GetParent()737   virtual const ValueObject *GetParent() const { return m_parent; }
738 
739   ValueObject *GetNonBaseClassParent();
740 
SetAddressTypeOfChildren(AddressType at)741   void SetAddressTypeOfChildren(AddressType at) {
742     m_address_type_of_ptr_or_ref_children = at;
743   }
744 
745   AddressType GetAddressTypeOfChildren();
746 
SetHasCompleteType()747   void SetHasCompleteType() { m_did_calculate_complete_objc_class_type = true; }
748 
749   /// Find out if a ValueObject might have children.
750   ///
751   /// This call is much more efficient than CalculateNumChildren() as
752   /// it doesn't need to complete the underlying type. This is designed
753   /// to be used in a UI environment in order to detect if the
754   /// disclosure triangle should be displayed or not.
755   ///
756   /// This function returns true for class, union, structure,
757   /// pointers, references, arrays and more. Again, it does so without
758   /// doing any expensive type completion.
759   ///
760   /// \return
761   ///     Returns \b true if the ValueObject might have children, or \b
762   ///     false otherwise.
763   virtual bool MightHaveChildren();
764 
GetVariable()765   virtual lldb::VariableSP GetVariable() { return nullptr; }
766 
767   virtual bool IsRuntimeSupportValue();
768 
769   virtual uint64_t GetLanguageFlags();
770 
771   virtual void SetLanguageFlags(uint64_t flags);
772 
773 protected:
774   typedef ClusterManager<ValueObject> ValueObjectManager;
775 
776   class ChildrenManager {
777   public:
ChildrenManager()778     ChildrenManager() : m_mutex(), m_children(), m_children_count(0) {}
779 
HasChildAtIndex(size_t idx)780     bool HasChildAtIndex(size_t idx) {
781       std::lock_guard<std::recursive_mutex> guard(m_mutex);
782       return (m_children.find(idx) != m_children.end());
783     }
784 
GetChildAtIndex(size_t idx)785     ValueObject *GetChildAtIndex(size_t idx) {
786       std::lock_guard<std::recursive_mutex> guard(m_mutex);
787       const auto iter = m_children.find(idx);
788       return ((iter == m_children.end()) ? nullptr : iter->second);
789     }
790 
SetChildAtIndex(size_t idx,ValueObject * valobj)791     void SetChildAtIndex(size_t idx, ValueObject *valobj) {
792       // we do not need to be mutex-protected to make a pair
793       ChildrenPair pair(idx, valobj);
794       std::lock_guard<std::recursive_mutex> guard(m_mutex);
795       m_children.insert(pair);
796     }
797 
SetChildrenCount(size_t count)798     void SetChildrenCount(size_t count) { Clear(count); }
799 
GetChildrenCount()800     size_t GetChildrenCount() { return m_children_count; }
801 
802     void Clear(size_t new_count = 0) {
803       std::lock_guard<std::recursive_mutex> guard(m_mutex);
804       m_children_count = new_count;
805       m_children.clear();
806     }
807 
808   private:
809     typedef std::map<size_t, ValueObject *> ChildrenMap;
810     typedef ChildrenMap::iterator ChildrenIterator;
811     typedef ChildrenMap::value_type ChildrenPair;
812     std::recursive_mutex m_mutex;
813     ChildrenMap m_children;
814     size_t m_children_count;
815   };
816 
817   // Classes that inherit from ValueObject can see and modify these
818   ValueObject
819       *m_parent; // The parent value object, or nullptr if this has no parent
820   ValueObject *m_root; // The root of the hierarchy for this ValueObject (or
821                        // nullptr if never calculated)
822   EvaluationPoint m_update_point; // Stores both the stop id and the full
823                                   // context at which this value was last
824   // updated.  When we are asked to update the value object, we check whether
825   // the context & stop id are the same before updating.
826   ConstString m_name; // The name of this object
827   DataExtractor
828       m_data; // A data extractor that can be used to extract the value.
829   Value m_value;
830   Status
831       m_error; // An error object that can describe any errors that occur when
832                // updating values.
833   std::string m_value_str; // Cached value string that will get cleared if/when
834                            // the value is updated.
835   std::string m_old_value_str; // Cached old value string from the last time the
836                                // value was gotten
837   std::string m_location_str;  // Cached location string that will get cleared
838                                // if/when the value is updated.
839   std::string m_summary_str;   // Cached summary string that will get cleared
840                                // if/when the value is updated.
841   std::string m_object_desc_str; // Cached result of the "object printer".  This
842                                  // differs from the summary
843   // in that the summary is consed up by us, the object_desc_string is builtin.
844 
845   CompilerType m_override_type; // If the type of the value object should be
846                                 // overridden, the type to impose.
847 
848   ValueObjectManager *m_manager; // This object is managed by the root object
849                                  // (any ValueObject that gets created
850   // without a parent.)  The manager gets passed through all the generations of
851   // dependent objects, and will keep the whole cluster of objects alive as
852   // long as a shared pointer to any of them has been handed out.  Shared
853   // pointers to value objects must always be made with the GetSP method.
854 
855   ChildrenManager m_children;
856   std::map<ConstString, ValueObject *> m_synthetic_children;
857 
858   ValueObject *m_dynamic_value;
859   ValueObject *m_synthetic_value;
860   ValueObject *m_deref_valobj;
861 
862   lldb::ValueObjectSP m_addr_of_valobj_sp; // We have to hold onto a shared
863                                            // pointer to this one because it is
864                                            // created
865   // as an independent ValueObjectConstResult, which isn't managed by us.
866 
867   lldb::Format m_format;
868   lldb::Format m_last_format;
869   uint32_t m_last_format_mgr_revision;
870   lldb::TypeSummaryImplSP m_type_summary_sp;
871   lldb::TypeFormatImplSP m_type_format_sp;
872   lldb::SyntheticChildrenSP m_synthetic_children_sp;
873   ProcessModID m_user_id_of_forced_summary;
874   AddressType m_address_type_of_ptr_or_ref_children;
875 
876   llvm::SmallVector<uint8_t, 16> m_value_checksum;
877 
878   lldb::LanguageType m_preferred_display_language;
879 
880   uint64_t m_language_flags;
881 
882   bool m_value_is_valid : 1, m_value_did_change : 1, m_children_count_valid : 1,
883       m_old_value_valid : 1, m_is_deref_of_parent : 1,
884       m_is_array_item_for_pointer : 1, m_is_bitfield_for_scalar : 1,
885       m_is_child_at_offset : 1, m_is_getting_summary : 1,
886       m_did_calculate_complete_objc_class_type : 1,
887       m_is_synthetic_children_generated : 1;
888 
889   friend class ValueObjectChild;
890   friend class ExpressionVariable;     // For SetName
891   friend class Target;                 // For SetName
892   friend class ValueObjectConstResultImpl;
893   friend class ValueObjectSynthetic; // For ClearUserVisibleData
894 
895   // Constructors and Destructors
896 
897   // Use the no-argument constructor to make a constant variable object (with
898   // no ExecutionContextScope.)
899 
900   ValueObject();
901 
902   // Use this constructor to create a "root variable object".  The ValueObject
903   // will be locked to this context through-out its lifespan.
904 
905   ValueObject(ExecutionContextScope *exe_scope, ValueObjectManager &manager,
906               AddressType child_ptr_or_ref_addr_type = eAddressTypeLoad);
907 
908   // Use this constructor to create a ValueObject owned by another ValueObject.
909   // It will inherit the ExecutionContext of its parent.
910 
911   ValueObject(ValueObject &parent);
912 
GetManager()913   ValueObjectManager *GetManager() { return m_manager; }
914 
915   virtual bool UpdateValue() = 0;
916 
CanUpdateWithInvalidExecutionContext()917   virtual LazyBool CanUpdateWithInvalidExecutionContext() {
918     return eLazyBoolCalculate;
919   }
920 
921   virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic);
922 
GetDynamicValueTypeImpl()923   virtual lldb::DynamicValueType GetDynamicValueTypeImpl() {
924     return lldb::eNoDynamicValues;
925   }
926 
HasDynamicValueTypeInfo()927   virtual bool HasDynamicValueTypeInfo() { return false; }
928 
929   virtual void CalculateSyntheticValue();
930 
931   // Should only be called by ValueObject::GetChildAtIndex() Returns a
932   // ValueObject managed by this ValueObject's manager.
933   virtual ValueObject *CreateChildAtIndex(size_t idx,
934                                           bool synthetic_array_member,
935                                           int32_t synthetic_index);
936 
937   // Should only be called by ValueObject::GetNumChildren()
938   virtual size_t CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;
939 
940   void SetNumChildren(size_t num_children);
941 
942   void SetValueDidChange(bool value_changed);
943 
944   void SetValueIsValid(bool valid);
945 
946   void ClearUserVisibleData(
947       uint32_t items = ValueObject::eClearUserVisibleDataItemsAllStrings);
948 
949   void AddSyntheticChild(ConstString key, ValueObject *valobj);
950 
951   DataExtractor &GetDataExtractor();
952 
953   void ClearDynamicTypeInformation();
954 
955   // Subclasses must implement the functions below.
956 
957   virtual CompilerType GetCompilerTypeImpl() = 0;
958 
959   const char *GetLocationAsCStringImpl(const Value &value,
960                                        const DataExtractor &data);
961 
962   bool IsChecksumEmpty();
963 
964   void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType);
965 
966 protected:
DoUpdateChildrenAddressType(ValueObject & valobj)967   virtual void DoUpdateChildrenAddressType(ValueObject &valobj) { return; };
968 
969 private:
970   virtual CompilerType MaybeCalculateCompleteType();
UpdateChildrenAddressType()971   void UpdateChildrenAddressType() {
972     GetRoot()->DoUpdateChildrenAddressType(*this);
973   }
974 
975   lldb::ValueObjectSP GetValueForExpressionPath_Impl(
976       llvm::StringRef expression_cstr,
977       ExpressionPathScanEndReason *reason_to_stop,
978       ExpressionPathEndResultType *final_value_type,
979       const GetValueForExpressionPathOptions &options,
980       ExpressionPathAftermath *final_task_on_target);
981 
982   ValueObject(const ValueObject &) = delete;
983   const ValueObject &operator=(const ValueObject &) = delete;
984 };
985 
986 // A value object manager class that is seeded with the static variable value
987 // and it vends the user facing value object. If the type is dynamic it can
988 // vend the dynamic type. If this user type also has a synthetic type
989 // associated with it, it will vend the synthetic type. The class watches the
990 // process' stop
991 // ID and will update the user type when needed.
992 class ValueObjectManager {
993   // The root value object is the static typed variable object.
994   lldb::ValueObjectSP m_root_valobj_sp;
995   // The user value object is the value object the user wants to see.
996   lldb::ValueObjectSP m_user_valobj_sp;
997   lldb::DynamicValueType m_use_dynamic;
998   uint32_t m_stop_id; // The stop ID that m_user_valobj_sp is valid for.
999   bool m_use_synthetic;
1000 
1001 public:
ValueObjectManager()1002   ValueObjectManager() {}
1003 
1004   ValueObjectManager(lldb::ValueObjectSP in_valobj_sp,
1005                      lldb::DynamicValueType use_dynamic, bool use_synthetic);
1006 
1007   bool IsValid() const;
1008 
GetRootSP()1009   lldb::ValueObjectSP GetRootSP() const { return m_root_valobj_sp; }
1010 
1011   // Gets the correct value object from the root object for a given process
1012   // stop ID. If dynamic values are enabled, or if synthetic children are
1013   // enabled, the value object that the user wants to see might change while
1014   // debugging.
1015   lldb::ValueObjectSP GetSP();
1016 
1017   void SetUseDynamic(lldb::DynamicValueType use_dynamic);
1018   void SetUseSynthetic(bool use_synthetic);
GetUseDynamic()1019   lldb::DynamicValueType GetUseDynamic() const { return m_use_dynamic; }
GetUseSynthetic()1020   bool GetUseSynthetic() const { return m_use_synthetic; }
1021   lldb::TargetSP GetTargetSP() const;
1022   lldb::ProcessSP GetProcessSP() const;
1023   lldb::ThreadSP GetThreadSP() const;
1024   lldb::StackFrameSP GetFrameSP() const;
1025 };
1026 
1027 } // namespace lldb_private
1028 
1029 #endif // LLDB_CORE_VALUEOBJECT_H
1030