xref: /freebsd/contrib/llvm-project/lldb/include/lldb/Core/ValueObject.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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/SmallVector.h"
30  #include "llvm/ADT/StringRef.h"
31  
32  #include <functional>
33  #include <initializer_list>
34  #include <map>
35  #include <mutex>
36  #include <optional>
37  #include <string>
38  #include <utility>
39  
40  #include <cstddef>
41  #include <cstdint>
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 {
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      /// Out of data to parse.
125      eExpressionPathScanEndReasonEndOfString = 1,
126      /// Child element not found.
127      eExpressionPathScanEndReasonNoSuchChild,
128      /// (Synthetic) child  element not found.
129      eExpressionPathScanEndReasonNoSuchSyntheticChild,
130      /// [] only allowed for arrays.
131      eExpressionPathScanEndReasonEmptyRangeNotAllowed,
132      /// . used when -> should be used.
133      eExpressionPathScanEndReasonDotInsteadOfArrow,
134      /// -> used when . should be used.
135      eExpressionPathScanEndReasonArrowInsteadOfDot,
136      /// ObjC ivar expansion not allowed.
137      eExpressionPathScanEndReasonFragileIVarNotAllowed,
138      /// [] not allowed by options.
139      eExpressionPathScanEndReasonRangeOperatorNotAllowed,
140      /// [] not valid on objects  other than scalars, pointers or arrays.
141      eExpressionPathScanEndReasonRangeOperatorInvalid,
142      /// [] is good for arrays,  but I cannot parse it.
143      eExpressionPathScanEndReasonArrayRangeOperatorMet,
144      /// [] is good for bitfields, but I cannot parse after it.
145      eExpressionPathScanEndReasonBitfieldRangeOperatorMet,
146      /// Something is malformed in he expression.
147      eExpressionPathScanEndReasonUnexpectedSymbol,
148      /// Impossible to apply &  operator.
149      eExpressionPathScanEndReasonTakingAddressFailed,
150      /// Impossible to apply *  operator.
151      eExpressionPathScanEndReasonDereferencingFailed,
152      /// [] was expanded into a  VOList.
153      eExpressionPathScanEndReasonRangeOperatorExpanded,
154      /// getting the synthetic children failed.
155      eExpressionPathScanEndReasonSyntheticValueMissing,
156      eExpressionPathScanEndReasonUnknown = 0xFFFF
157    };
158  
159    enum ExpressionPathEndResultType {
160      /// Anything but...
161      eExpressionPathEndResultTypePlain = 1,
162      /// A bitfield.
163      eExpressionPathEndResultTypeBitfield,
164      /// A range [low-high].
165      eExpressionPathEndResultTypeBoundedRange,
166      /// A range [].
167      eExpressionPathEndResultTypeUnboundedRange,
168      /// Several items in a VOList.
169      eExpressionPathEndResultTypeValueObjectList,
170      eExpressionPathEndResultTypeInvalid = 0xFFFF
171    };
172  
173    enum ExpressionPathAftermath {
174      /// Just return it.
175      eExpressionPathAftermathNothing = 1,
176      /// Dereference the target.
177      eExpressionPathAftermathDereference,
178      /// Take target's address.
179      eExpressionPathAftermathTakeAddress
180    };
181  
182    enum ClearUserVisibleDataItems {
183      eClearUserVisibleDataItemsNothing = 1u << 0,
184      eClearUserVisibleDataItemsValue = 1u << 1,
185      eClearUserVisibleDataItemsSummary = 1u << 2,
186      eClearUserVisibleDataItemsLocation = 1u << 3,
187      eClearUserVisibleDataItemsDescription = 1u << 4,
188      eClearUserVisibleDataItemsSyntheticChildren = 1u << 5,
189      eClearUserVisibleDataItemsAllStrings =
190          eClearUserVisibleDataItemsValue | eClearUserVisibleDataItemsSummary |
191          eClearUserVisibleDataItemsLocation |
192          eClearUserVisibleDataItemsDescription,
193      eClearUserVisibleDataItemsAll = 0xFFFF
194    };
195  
196    struct GetValueForExpressionPathOptions {
197      enum class SyntheticChildrenTraversal {
198        None,
199        ToSynthetic,
200        FromSynthetic,
201        Both
202      };
203  
204      bool m_check_dot_vs_arrow_syntax;
205      bool m_no_fragile_ivar;
206      bool m_allow_bitfields_syntax;
207      SyntheticChildrenTraversal m_synthetic_children_traversal;
208  
209      GetValueForExpressionPathOptions(
210          bool dot = false, bool no_ivar = false, bool bitfield = true,
211          SyntheticChildrenTraversal synth_traverse =
212              SyntheticChildrenTraversal::ToSynthetic)
m_check_dot_vs_arrow_syntaxGetValueForExpressionPathOptions213          : m_check_dot_vs_arrow_syntax(dot), m_no_fragile_ivar(no_ivar),
214            m_allow_bitfields_syntax(bitfield),
215            m_synthetic_children_traversal(synth_traverse) {}
216  
DoCheckDotVsArrowSyntaxGetValueForExpressionPathOptions217      GetValueForExpressionPathOptions &DoCheckDotVsArrowSyntax() {
218        m_check_dot_vs_arrow_syntax = true;
219        return *this;
220      }
221  
DontCheckDotVsArrowSyntaxGetValueForExpressionPathOptions222      GetValueForExpressionPathOptions &DontCheckDotVsArrowSyntax() {
223        m_check_dot_vs_arrow_syntax = false;
224        return *this;
225      }
226  
DoAllowFragileIVarGetValueForExpressionPathOptions227      GetValueForExpressionPathOptions &DoAllowFragileIVar() {
228        m_no_fragile_ivar = false;
229        return *this;
230      }
231  
DontAllowFragileIVarGetValueForExpressionPathOptions232      GetValueForExpressionPathOptions &DontAllowFragileIVar() {
233        m_no_fragile_ivar = true;
234        return *this;
235      }
236  
DoAllowBitfieldSyntaxGetValueForExpressionPathOptions237      GetValueForExpressionPathOptions &DoAllowBitfieldSyntax() {
238        m_allow_bitfields_syntax = true;
239        return *this;
240      }
241  
DontAllowBitfieldSyntaxGetValueForExpressionPathOptions242      GetValueForExpressionPathOptions &DontAllowBitfieldSyntax() {
243        m_allow_bitfields_syntax = false;
244        return *this;
245      }
246  
247      GetValueForExpressionPathOptions &
SetSyntheticChildrenTraversalGetValueForExpressionPathOptions248      SetSyntheticChildrenTraversal(SyntheticChildrenTraversal traverse) {
249        m_synthetic_children_traversal = traverse;
250        return *this;
251      }
252  
DefaultOptionsGetValueForExpressionPathOptions253      static const GetValueForExpressionPathOptions DefaultOptions() {
254        static GetValueForExpressionPathOptions g_default_options;
255  
256        return g_default_options;
257      }
258    };
259  
260    class EvaluationPoint {
261    public:
262      EvaluationPoint();
263  
264      EvaluationPoint(ExecutionContextScope *exe_scope,
265                      bool use_selected = false);
266  
267      EvaluationPoint(const EvaluationPoint &rhs);
268  
269      ~EvaluationPoint();
270  
GetExecutionContextRef()271      const ExecutionContextRef &GetExecutionContextRef() const {
272        return m_exe_ctx_ref;
273      }
274  
SetIsConstant()275      void SetIsConstant() {
276        SetUpdated();
277        m_mod_id.SetInvalid();
278      }
279  
IsConstant()280      bool IsConstant() const { return !m_mod_id.IsValid(); }
281  
GetModID()282      ProcessModID GetModID() const { return m_mod_id; }
283  
SetUpdateID(ProcessModID new_id)284      void SetUpdateID(ProcessModID new_id) { m_mod_id = new_id; }
285  
SetNeedsUpdate()286      void SetNeedsUpdate() { m_needs_update = true; }
287  
288      void SetUpdated();
289  
NeedsUpdating(bool accept_invalid_exe_ctx)290      bool NeedsUpdating(bool accept_invalid_exe_ctx) {
291        SyncWithProcessState(accept_invalid_exe_ctx);
292        return m_needs_update;
293      }
294  
IsValid()295      bool IsValid() {
296        const bool accept_invalid_exe_ctx = false;
297        if (!m_mod_id.IsValid())
298          return false;
299        else if (SyncWithProcessState(accept_invalid_exe_ctx)) {
300          if (!m_mod_id.IsValid())
301            return false;
302        }
303        return true;
304      }
305  
SetInvalid()306      void SetInvalid() {
307        // Use the stop id to mark us as invalid, leave the thread id and the
308        // stack id around for logging and history purposes.
309        m_mod_id.SetInvalid();
310  
311        // Can't update an invalid state.
312        m_needs_update = false;
313      }
314  
315    private:
316      bool SyncWithProcessState(bool accept_invalid_exe_ctx);
317  
318      ProcessModID m_mod_id; // This is the stop id when this ValueObject was last
319                             // evaluated.
320      ExecutionContextRef m_exe_ctx_ref;
321      bool m_needs_update = true;
322    };
323  
324    virtual ~ValueObject();
325  
GetUpdatePoint()326    const EvaluationPoint &GetUpdatePoint() const { return m_update_point; }
327  
GetUpdatePoint()328    EvaluationPoint &GetUpdatePoint() { return m_update_point; }
329  
GetExecutionContextRef()330    const ExecutionContextRef &GetExecutionContextRef() const {
331      return m_update_point.GetExecutionContextRef();
332    }
333  
GetTargetSP()334    lldb::TargetSP GetTargetSP() const {
335      return m_update_point.GetExecutionContextRef().GetTargetSP();
336    }
337  
GetProcessSP()338    lldb::ProcessSP GetProcessSP() const {
339      return m_update_point.GetExecutionContextRef().GetProcessSP();
340    }
341  
GetThreadSP()342    lldb::ThreadSP GetThreadSP() const {
343      return m_update_point.GetExecutionContextRef().GetThreadSP();
344    }
345  
GetFrameSP()346    lldb::StackFrameSP GetFrameSP() const {
347      return m_update_point.GetExecutionContextRef().GetFrameSP();
348    }
349  
350    void SetNeedsUpdate();
351  
GetCompilerType()352    CompilerType GetCompilerType() { return MaybeCalculateCompleteType(); }
353  
354    // this vends a TypeImpl that is useful at the SB API layer
GetTypeImpl()355    virtual TypeImpl GetTypeImpl() { return TypeImpl(GetCompilerType()); }
356  
357    virtual bool CanProvideValue();
358  
359    // Subclasses must implement the functions below.
360    virtual std::optional<uint64_t> GetByteSize() = 0;
361  
362    virtual lldb::ValueType GetValueType() const = 0;
363  
364    // Subclasses can implement the functions below.
GetTypeName()365    virtual ConstString GetTypeName() { return GetCompilerType().GetTypeName(); }
366  
GetDisplayTypeName()367    virtual ConstString GetDisplayTypeName() { return GetTypeName(); }
368  
GetQualifiedTypeName()369    virtual ConstString GetQualifiedTypeName() {
370      return GetCompilerType().GetTypeName();
371    }
372  
GetObjectRuntimeLanguage()373    lldb::LanguageType GetObjectRuntimeLanguage() {
374      return GetCompilerType().GetMinimumLanguage();
375    }
376  
377    uint32_t
378    GetTypeInfo(CompilerType *pointee_or_element_compiler_type = nullptr) {
379      return GetCompilerType().GetTypeInfo(pointee_or_element_compiler_type);
380    }
381  
IsPointerType()382    bool IsPointerType() { return GetCompilerType().IsPointerType(); }
383  
IsArrayType()384    bool IsArrayType() { return GetCompilerType().IsArrayType(); }
385  
IsScalarType()386    bool IsScalarType() { return GetCompilerType().IsScalarType(); }
387  
IsPointerOrReferenceType()388    bool IsPointerOrReferenceType() {
389      return GetCompilerType().IsPointerOrReferenceType();
390    }
391  
392    bool IsPossibleDynamicType();
393  
394    bool IsNilReference();
395  
396    bool IsUninitializedReference();
397  
IsBaseClass()398    virtual bool IsBaseClass() { return false; }
399  
400    bool IsBaseClass(uint32_t &depth);
401  
IsDereferenceOfParent()402    virtual bool IsDereferenceOfParent() { return false; }
403  
IsIntegerType(bool & is_signed)404    bool IsIntegerType(bool &is_signed) {
405      return GetCompilerType().IsIntegerType(is_signed);
406    }
407  
408    virtual void GetExpressionPath(
409        Stream &s,
410        GetExpressionPathFormat = eGetExpressionPathFormatDereferencePointers);
411  
412    lldb::ValueObjectSP GetValueForExpressionPath(
413        llvm::StringRef expression,
414        ExpressionPathScanEndReason *reason_to_stop = nullptr,
415        ExpressionPathEndResultType *final_value_type = nullptr,
416        const GetValueForExpressionPathOptions &options =
417            GetValueForExpressionPathOptions::DefaultOptions(),
418        ExpressionPathAftermath *final_task_on_target = nullptr);
419  
IsInScope()420    virtual bool IsInScope() { return true; }
421  
GetByteOffset()422    virtual lldb::offset_t GetByteOffset() { return 0; }
423  
GetBitfieldBitSize()424    virtual uint32_t GetBitfieldBitSize() { return 0; }
425  
GetBitfieldBitOffset()426    virtual uint32_t GetBitfieldBitOffset() { return 0; }
427  
IsBitfield()428    bool IsBitfield() {
429      return (GetBitfieldBitSize() != 0) || (GetBitfieldBitOffset() != 0);
430    }
431  
432    virtual const char *GetValueAsCString();
433  
434    virtual bool GetValueAsCString(const lldb_private::TypeFormatImpl &format,
435                                   std::string &destination);
436  
437    bool GetValueAsCString(lldb::Format format, std::string &destination);
438  
439    virtual uint64_t GetValueAsUnsigned(uint64_t fail_value,
440                                        bool *success = nullptr);
441  
442    virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success = nullptr);
443  
444    /// If the current ValueObject is of an appropriate type, convert the
445    /// value to an APSInt and return that. Otherwise return an error.
446    llvm::Expected<llvm::APSInt> GetValueAsAPSInt();
447  
448    /// If the current ValueObject is of an appropriate type, convert the
449    /// value to an APFloat and return that. Otherwise return an error.
450    llvm::Expected<llvm::APFloat> GetValueAsAPFloat();
451  
452    /// If the current ValueObject is of an appropriate type, convert the
453    /// value to a boolean and return that. Otherwise return an error.
454    llvm::Expected<bool> GetValueAsBool();
455  
456    /// Update an existing integer ValueObject with a new integer value. This
457    /// is only intended to be used with 'temporary' ValueObjects, i.e. ones that
458    /// are not associated with program variables. It does not update program
459    /// memory, registers, stack, etc.
460    void SetValueFromInteger(const llvm::APInt &value, Status &error);
461  
462    /// Update an existing integer ValueObject with an integer value created
463    /// frome 'new_val_sp'.  This is only intended to be used with 'temporary'
464    /// ValueObjects, i.e. ones that are not associated with program variables.
465    /// It does not update program  memory, registers, stack, etc.
466    void SetValueFromInteger(lldb::ValueObjectSP new_val_sp, Status &error);
467  
468    virtual bool SetValueFromCString(const char *value_str, Status &error);
469  
470    /// Return the module associated with this value object in case the value is
471    /// from an executable file and might have its data in sections of the file.
472    /// This can be used for variables.
473    virtual lldb::ModuleSP GetModule();
474  
475    ValueObject *GetRoot();
476  
477    /// Given a ValueObject, loop over itself and its parent, and its parent's
478    /// parent, .. until either the given callback returns false, or you end up at
479    /// a null pointer
480    ValueObject *FollowParentChain(std::function<bool(ValueObject *)>);
481  
482    virtual bool GetDeclaration(Declaration &decl);
483  
484    // The functions below should NOT be modified by subclasses
485    const Status &GetError();
486  
GetName()487    ConstString GetName() const { return m_name; }
488  
489    /// Returns a unique id for this ValueObject.
GetID()490    lldb::user_id_t GetID() const { return m_id.GetID(); }
491  
492    virtual lldb::ValueObjectSP GetChildAtIndex(uint32_t idx,
493                                                bool can_create = true);
494  
495    // The method always creates missing children in the path, if necessary.
496    lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef<llvm::StringRef> names);
497  
498    virtual lldb::ValueObjectSP GetChildMemberWithName(llvm::StringRef name,
499                                                       bool can_create = true);
500  
501    virtual size_t GetIndexOfChildWithName(llvm::StringRef name);
502  
503    llvm::Expected<uint32_t> GetNumChildren(uint32_t max = UINT32_MAX);
504    /// Like \c GetNumChildren but returns 0 on error.  You probably
505    /// shouldn't be using this function. It exists primarily to ease the
506    /// transition to more pervasive error handling while not all APIs
507    /// have been updated.
508    uint32_t GetNumChildrenIgnoringErrors(uint32_t max = UINT32_MAX);
HasChildren()509    bool HasChildren() { return GetNumChildrenIgnoringErrors() > 0; }
510  
GetValue()511    const Value &GetValue() const { return m_value; }
512  
GetValue()513    Value &GetValue() { return m_value; }
514  
515    virtual bool ResolveValue(Scalar &scalar);
516  
517    // return 'false' whenever you set the error, otherwise callers may assume
518    // true means everything is OK - this will break breakpoint conditions among
519    // potentially a few others
520    virtual bool IsLogicalTrue(Status &error);
521  
GetLocationAsCString()522    virtual const char *GetLocationAsCString() {
523      return GetLocationAsCStringImpl(m_value, m_data);
524    }
525  
526    const char *
527    GetSummaryAsCString(lldb::LanguageType lang = lldb::eLanguageTypeUnknown);
528  
529    bool
530    GetSummaryAsCString(TypeSummaryImpl *summary_ptr, std::string &destination,
531                        lldb::LanguageType lang = lldb::eLanguageTypeUnknown);
532  
533    bool GetSummaryAsCString(std::string &destination,
534                             const TypeSummaryOptions &options);
535  
536    bool GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
537                             std::string &destination,
538                             const TypeSummaryOptions &options);
539  
540    llvm::Expected<std::string> GetObjectDescription();
541  
542    bool HasSpecialPrintableRepresentation(
543        ValueObjectRepresentationStyle val_obj_display,
544        lldb::Format custom_format);
545  
546    enum class PrintableRepresentationSpecialCases : bool {
547      eDisable = false,
548      eAllow = true
549    };
550  
551    bool
552    DumpPrintableRepresentation(Stream &s,
553                                ValueObjectRepresentationStyle val_obj_display =
554                                    eValueObjectRepresentationStyleSummary,
555                                lldb::Format custom_format = lldb::eFormatInvalid,
556                                PrintableRepresentationSpecialCases special =
557                                    PrintableRepresentationSpecialCases::eAllow,
558                                bool do_dump_error = true);
GetValueIsValid()559    bool GetValueIsValid() const { return m_flags.m_value_is_valid; }
560  
561    // If you call this on a newly created ValueObject, it will always return
562    // false.
GetValueDidChange()563    bool GetValueDidChange() { return m_flags.m_value_did_change; }
564  
565    bool UpdateValueIfNeeded(bool update_format = true);
566  
567    bool UpdateFormatsIfNeeded();
568  
GetSP()569    lldb::ValueObjectSP GetSP() { return m_manager->GetSharedPointer(this); }
570  
571    /// Change the name of the current ValueObject. Should *not* be used from a
572    /// synthetic child provider as it would change the name of the non synthetic
573    /// child as well.
SetName(ConstString name)574    void SetName(ConstString name) { m_name = name; }
575  
576    virtual lldb::addr_t GetAddressOf(bool scalar_is_load_address = true,
577                                      AddressType *address_type = nullptr);
578  
579    lldb::addr_t GetPointerValue(AddressType *address_type = nullptr);
580  
581    lldb::ValueObjectSP GetSyntheticChild(ConstString key) const;
582  
583    lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create);
584  
585    lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to,
586                                                  bool can_create);
587  
588    lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression,
589                                                        bool can_create);
590  
591    virtual lldb::ValueObjectSP
592    GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type,
593                              bool can_create,
594                              ConstString name_const_str = ConstString());
595  
596    virtual lldb::ValueObjectSP
597    GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create,
598                     ConstString name_const_str = ConstString());
599  
600    virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType);
601  
602    lldb::DynamicValueType GetDynamicValueType();
603  
GetStaticValue()604    virtual lldb::ValueObjectSP GetStaticValue() { return GetSP(); }
605  
GetNonSyntheticValue()606    virtual lldb::ValueObjectSP GetNonSyntheticValue() { return GetSP(); }
607  
608    lldb::ValueObjectSP GetSyntheticValue();
609  
610    virtual bool HasSyntheticValue();
611  
IsSynthetic()612    virtual bool IsSynthetic() { return false; }
613  
614    lldb::ValueObjectSP
615    GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue,
616                                          bool synthValue);
617  
618    virtual lldb::ValueObjectSP CreateConstantValue(ConstString name);
619  
620    virtual lldb::ValueObjectSP Dereference(Status &error);
621  
622    /// Creates a copy of the ValueObject with a new name and setting the current
623    /// ValueObject as its parent. It should be used when we want to change the
624    /// name of a ValueObject without modifying the actual ValueObject itself
625    /// (e.g. sythetic child provider).
626    virtual lldb::ValueObjectSP Clone(ConstString new_name);
627  
628    virtual lldb::ValueObjectSP AddressOf(Status &error);
629  
GetLiveAddress()630    virtual lldb::addr_t GetLiveAddress() { return LLDB_INVALID_ADDRESS; }
631  
632    virtual void SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS,
633                                AddressType address_type = eAddressTypeLoad) {}
634  
635    lldb::ValueObjectSP Cast(const CompilerType &compiler_type);
636  
637    virtual lldb::ValueObjectSP DoCast(const CompilerType &compiler_type);
638  
639    virtual lldb::ValueObjectSP CastPointerType(const char *name,
640                                                CompilerType &ast_type);
641  
642    virtual lldb::ValueObjectSP CastPointerType(const char *name,
643                                                lldb::TypeSP &type_sp);
644  
645    /// Return the target load address associated with this value object.
646    lldb::addr_t GetLoadAddress();
647  
648    /// Take a ValueObject whose type is an inherited class, and cast it to
649    /// 'type', which should be one of its base classes. 'base_type_indices'
650    /// contains the indices of direct base classes on the path from the
651    /// ValueObject's current type to 'type'
652    llvm::Expected<lldb::ValueObjectSP>
653    CastDerivedToBaseType(CompilerType type,
654                          const llvm::ArrayRef<uint32_t> &base_type_indices);
655  
656    /// Take a ValueObject whose type is a base class, and cast it to 'type',
657    /// which should be one of its derived classes. 'base_type_indices'
658    /// contains the indices of direct base classes on the path from the
659    /// ValueObject's current type to 'type'
660    llvm::Expected<lldb::ValueObjectSP> CastBaseToDerivedType(CompilerType type,
661                                                              uint64_t offset);
662  
663    // Take a ValueObject that contains a scalar, enum or pointer type, and
664    // cast it to a "basic" type (integer, float or boolean).
665    lldb::ValueObjectSP CastToBasicType(CompilerType type);
666  
667    // Take a ValueObject that contain an integer, float or enum, and cast it
668    // to an enum.
669    lldb::ValueObjectSP CastToEnumType(CompilerType type);
670  
671    /// If this object represents a C++ class with a vtable, return an object
672    /// that represents the virtual function table. If the object isn't a class
673    /// with a vtable, return a valid ValueObject with the error set correctly.
674    lldb::ValueObjectSP GetVTable();
675    // The backing bits of this value object were updated, clear any descriptive
676    // string, so we know we have to refetch them.
ValueUpdated()677    void ValueUpdated() {
678      ClearUserVisibleData(eClearUserVisibleDataItemsValue |
679                           eClearUserVisibleDataItemsSummary |
680                           eClearUserVisibleDataItemsDescription);
681    }
682  
IsDynamic()683    virtual bool IsDynamic() { return false; }
684  
DoesProvideSyntheticValue()685    virtual bool DoesProvideSyntheticValue() { return false; }
686  
IsSyntheticChildrenGenerated()687    virtual bool IsSyntheticChildrenGenerated() {
688      return m_flags.m_is_synthetic_children_generated;
689    }
690  
SetSyntheticChildrenGenerated(bool b)691    virtual void SetSyntheticChildrenGenerated(bool b) {
692      m_flags.m_is_synthetic_children_generated = b;
693    }
694  
695    virtual SymbolContextScope *GetSymbolContextScope();
696  
697    llvm::Error Dump(Stream &s);
698  
699    llvm::Error Dump(Stream &s, const DumpValueObjectOptions &options);
700  
701    static lldb::ValueObjectSP
702    CreateValueObjectFromExpression(llvm::StringRef name,
703                                    llvm::StringRef expression,
704                                    const ExecutionContext &exe_ctx);
705  
706    static lldb::ValueObjectSP
707    CreateValueObjectFromExpression(llvm::StringRef name,
708                                    llvm::StringRef expression,
709                                    const ExecutionContext &exe_ctx,
710                                    const EvaluateExpressionOptions &options);
711  
712    /// Given an address either create a value object containing the value at
713    /// that address, or create a value object containing the address itself
714    /// (pointer value), depending on whether the parameter 'do_deref' is true or
715    /// false.
716    static lldb::ValueObjectSP
717    CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address,
718                                 const ExecutionContext &exe_ctx,
719                                 CompilerType type, bool do_deref = true);
720  
721    static lldb::ValueObjectSP
722    CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data,
723                              const ExecutionContext &exe_ctx, CompilerType type);
724  
725    /// Create a value object containing the given APInt value.
726    static lldb::ValueObjectSP CreateValueObjectFromAPInt(lldb::TargetSP target,
727                                                          const llvm::APInt &v,
728                                                          CompilerType type,
729                                                          llvm::StringRef name);
730  
731    /// Create a value object containing the given APFloat value.
732    static lldb::ValueObjectSP
733    CreateValueObjectFromAPFloat(lldb::TargetSP target, const llvm::APFloat &v,
734                                 CompilerType type, llvm::StringRef name);
735  
736    /// Create a value object containing the given boolean value.
737    static lldb::ValueObjectSP CreateValueObjectFromBool(lldb::TargetSP target,
738                                                         bool value,
739                                                         llvm::StringRef name);
740  
741    /// Create a nullptr value object with the specified type (must be a
742    /// nullptr type).
743    static lldb::ValueObjectSP CreateValueObjectFromNullptr(lldb::TargetSP target,
744                                                            CompilerType type,
745                                                            llvm::StringRef name);
746  
747    lldb::ValueObjectSP Persist();
748  
749    /// Returns true if this is a char* or a char[] if it is a char* and
750    /// check_pointer is true, it also checks that the pointer is valid.
751    bool IsCStringContainer(bool check_pointer = false);
752  
753    std::pair<size_t, bool>
754    ReadPointedString(lldb::WritableDataBufferSP &buffer_sp, Status &error,
755                      bool honor_array);
756  
757    virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx = 0,
758                                  uint32_t item_count = 1);
759  
760    virtual uint64_t GetData(DataExtractor &data, Status &error);
761  
762    virtual bool SetData(DataExtractor &data, Status &error);
763  
GetIsConstant()764    virtual bool GetIsConstant() const { return m_update_point.IsConstant(); }
765  
NeedsUpdating()766    bool NeedsUpdating() {
767      const bool accept_invalid_exe_ctx =
768          (CanUpdateWithInvalidExecutionContext() == eLazyBoolYes);
769      return m_update_point.NeedsUpdating(accept_invalid_exe_ctx);
770    }
771  
SetIsConstant()772    void SetIsConstant() { m_update_point.SetIsConstant(); }
773  
774    lldb::Format GetFormat() const;
775  
SetFormat(lldb::Format format)776    virtual void SetFormat(lldb::Format format) {
777      if (format != m_format)
778        ClearUserVisibleData(eClearUserVisibleDataItemsValue);
779      m_format = format;
780    }
781  
782    virtual lldb::LanguageType GetPreferredDisplayLanguage();
783  
SetPreferredDisplayLanguage(lldb::LanguageType lt)784    void SetPreferredDisplayLanguage(lldb::LanguageType lt) {
785      m_preferred_display_language = lt;
786    }
787  
GetSummaryFormat()788    lldb::TypeSummaryImplSP GetSummaryFormat() {
789      UpdateFormatsIfNeeded();
790      return m_type_summary_sp;
791    }
792  
SetSummaryFormat(lldb::TypeSummaryImplSP format)793    void SetSummaryFormat(lldb::TypeSummaryImplSP format) {
794      m_type_summary_sp = std::move(format);
795      ClearUserVisibleData(eClearUserVisibleDataItemsSummary);
796    }
797  
SetDerefValobj(ValueObject * deref)798    void SetDerefValobj(ValueObject *deref) { m_deref_valobj = deref; }
799  
GetDerefValobj()800    ValueObject *GetDerefValobj() { return m_deref_valobj; }
801  
SetValueFormat(lldb::TypeFormatImplSP format)802    void SetValueFormat(lldb::TypeFormatImplSP format) {
803      m_type_format_sp = std::move(format);
804      ClearUserVisibleData(eClearUserVisibleDataItemsValue);
805    }
806  
GetValueFormat()807    lldb::TypeFormatImplSP GetValueFormat() {
808      UpdateFormatsIfNeeded();
809      return m_type_format_sp;
810    }
811  
SetSyntheticChildren(const lldb::SyntheticChildrenSP & synth_sp)812    void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp) {
813      if (synth_sp.get() == m_synthetic_children_sp.get())
814        return;
815      ClearUserVisibleData(eClearUserVisibleDataItemsSyntheticChildren);
816      m_synthetic_children_sp = synth_sp;
817    }
818  
GetSyntheticChildren()819    lldb::SyntheticChildrenSP GetSyntheticChildren() {
820      UpdateFormatsIfNeeded();
821      return m_synthetic_children_sp;
822    }
823  
824    // Use GetParent for display purposes, but if you want to tell the parent to
825    // update itself then use m_parent.  The ValueObjectDynamicValue's parent is
826    // not the correct parent for displaying, they are really siblings, so for
827    // display it needs to route through to its grandparent.
GetParent()828    virtual ValueObject *GetParent() { return m_parent; }
829  
GetParent()830    virtual const ValueObject *GetParent() const { return m_parent; }
831  
832    ValueObject *GetNonBaseClassParent();
833  
SetAddressTypeOfChildren(AddressType at)834    void SetAddressTypeOfChildren(AddressType at) {
835      m_address_type_of_ptr_or_ref_children = at;
836    }
837  
838    AddressType GetAddressTypeOfChildren();
839  
SetHasCompleteType()840    void SetHasCompleteType() {
841      m_flags.m_did_calculate_complete_objc_class_type = true;
842    }
843  
844    /// Find out if a ValueObject might have children.
845    ///
846    /// This call is much more efficient than CalculateNumChildren() as
847    /// it doesn't need to complete the underlying type. This is designed
848    /// to be used in a UI environment in order to detect if the
849    /// disclosure triangle should be displayed or not.
850    ///
851    /// This function returns true for class, union, structure,
852    /// pointers, references, arrays and more. Again, it does so without
853    /// doing any expensive type completion.
854    ///
855    /// \return
856    ///     Returns \b true if the ValueObject might have children, or \b
857    ///     false otherwise.
858    virtual bool MightHaveChildren();
859  
GetVariable()860    virtual lldb::VariableSP GetVariable() { return nullptr; }
861  
862    virtual bool IsRuntimeSupportValue();
863  
GetLanguageFlags()864    virtual uint64_t GetLanguageFlags() { return m_language_flags; }
865  
SetLanguageFlags(uint64_t flags)866    virtual void SetLanguageFlags(uint64_t flags) { m_language_flags = flags; }
867  
868  protected:
869    typedef ClusterManager<ValueObject> ValueObjectManager;
870  
871    class ChildrenManager {
872    public:
873      ChildrenManager() = default;
874  
HasChildAtIndex(size_t idx)875      bool HasChildAtIndex(size_t idx) {
876        std::lock_guard<std::recursive_mutex> guard(m_mutex);
877        return (m_children.find(idx) != m_children.end());
878      }
879  
GetChildAtIndex(uint32_t idx)880      ValueObject *GetChildAtIndex(uint32_t idx) {
881        std::lock_guard<std::recursive_mutex> guard(m_mutex);
882        const auto iter = m_children.find(idx);
883        return ((iter == m_children.end()) ? nullptr : iter->second);
884      }
885  
SetChildAtIndex(size_t idx,ValueObject * valobj)886      void SetChildAtIndex(size_t idx, ValueObject *valobj) {
887        // we do not need to be mutex-protected to make a pair
888        ChildrenPair pair(idx, valobj);
889        std::lock_guard<std::recursive_mutex> guard(m_mutex);
890        m_children.insert(pair);
891      }
892  
SetChildrenCount(size_t count)893      void SetChildrenCount(size_t count) { Clear(count); }
894  
GetChildrenCount()895      size_t GetChildrenCount() { return m_children_count; }
896  
897      void Clear(size_t new_count = 0) {
898        std::lock_guard<std::recursive_mutex> guard(m_mutex);
899        m_children_count = new_count;
900        m_children.clear();
901      }
902  
903    private:
904      typedef std::map<size_t, ValueObject *> ChildrenMap;
905      typedef ChildrenMap::iterator ChildrenIterator;
906      typedef ChildrenMap::value_type ChildrenPair;
907      std::recursive_mutex m_mutex;
908      ChildrenMap m_children;
909      size_t m_children_count = 0;
910    };
911  
912    // Classes that inherit from ValueObject can see and modify these
913  
914    /// The parent value object, or nullptr if this has no parent.
915    ValueObject *m_parent = nullptr;
916    /// The root of the hierarchy for this ValueObject (or nullptr if never
917    /// calculated).
918    ValueObject *m_root = nullptr;
919    /// Stores both the stop id and the full context at which this value was last
920    /// updated.  When we are asked to update the value object, we check whether
921    /// the context & stop id are the same before updating.
922    EvaluationPoint m_update_point;
923    /// The name of this object.
924    ConstString m_name;
925    /// A data extractor that can be used to extract the value.
926    DataExtractor m_data;
927    Value m_value;
928    /// An error object that can describe any errors that occur when updating
929    /// values.
930    Status m_error;
931    /// Cached value string that will get cleared if/when the value is updated.
932    std::string m_value_str;
933    /// Cached old value string from the last time the value was gotten
934    std::string m_old_value_str;
935    /// Cached location string that will get cleared if/when the value is updated.
936    std::string m_location_str;
937    /// Cached summary string that will get cleared if/when the value is updated.
938    std::string m_summary_str;
939    /// Cached result of the "object printer". This differs from the summary
940    /// in that the summary is consed up by us, the object_desc_string is builtin.
941    std::string m_object_desc_str;
942    /// If the type of the value object should be overridden, the type to impose.
943    CompilerType m_override_type;
944  
945    /// This object is managed by the root object (any ValueObject that gets
946    /// created without a parent.) The manager gets passed through all the
947    /// generations of dependent objects, and will keep the whole cluster of
948    /// objects alive as long as a shared pointer to any of them has been handed
949    /// out. Shared pointers to value objects must always be made with the GetSP
950    /// method.
951    ValueObjectManager *m_manager = nullptr;
952  
953    ChildrenManager m_children;
954    std::map<ConstString, ValueObject *> m_synthetic_children;
955  
956    ValueObject *m_dynamic_value = nullptr;
957    ValueObject *m_synthetic_value = nullptr;
958    ValueObject *m_deref_valobj = nullptr;
959  
960    /// We have to hold onto a shared  pointer to this one because it is created
961    /// as an independent ValueObjectConstResult, which isn't managed by us.
962    lldb::ValueObjectSP m_addr_of_valobj_sp;
963  
964    lldb::Format m_format = lldb::eFormatDefault;
965    lldb::Format m_last_format = lldb::eFormatDefault;
966    uint32_t m_last_format_mgr_revision = 0;
967    lldb::TypeSummaryImplSP m_type_summary_sp;
968    lldb::TypeFormatImplSP m_type_format_sp;
969    lldb::SyntheticChildrenSP m_synthetic_children_sp;
970    ProcessModID m_user_id_of_forced_summary;
971    AddressType m_address_type_of_ptr_or_ref_children = eAddressTypeInvalid;
972  
973    llvm::SmallVector<uint8_t, 16> m_value_checksum;
974  
975    lldb::LanguageType m_preferred_display_language = lldb::eLanguageTypeUnknown;
976  
977    uint64_t m_language_flags = 0;
978  
979    /// Unique identifier for every value object.
980    UserID m_id;
981  
982    // Utility class for initializing all bitfields in ValueObject's constructors.
983    // FIXME: This could be done via default initializers once we have C++20.
984    struct Bitflags {
985      bool m_value_is_valid : 1, m_value_did_change : 1,
986          m_children_count_valid : 1, m_old_value_valid : 1,
987          m_is_deref_of_parent : 1, m_is_array_item_for_pointer : 1,
988          m_is_bitfield_for_scalar : 1, m_is_child_at_offset : 1,
989          m_is_getting_summary : 1, m_did_calculate_complete_objc_class_type : 1,
990          m_is_synthetic_children_generated : 1;
BitflagsBitflags991      Bitflags() {
992        m_value_is_valid = false;
993        m_value_did_change = false;
994        m_children_count_valid = false;
995        m_old_value_valid = false;
996        m_is_deref_of_parent = false;
997        m_is_array_item_for_pointer = false;
998        m_is_bitfield_for_scalar = false;
999        m_is_child_at_offset = false;
1000        m_is_getting_summary = false;
1001        m_did_calculate_complete_objc_class_type = false;
1002        m_is_synthetic_children_generated = false;
1003      }
1004    } m_flags;
1005  
1006    friend class ValueObjectChild;
1007    friend class ExpressionVariable;     // For SetName
1008    friend class Target;                 // For SetName
1009    friend class ValueObjectConstResultImpl;
1010    friend class ValueObjectSynthetic; // For ClearUserVisibleData
1011  
1012    /// Use this constructor to create a "root variable object".  The ValueObject
1013    /// will be locked to this context through-out its lifespan.
1014    ValueObject(ExecutionContextScope *exe_scope, ValueObjectManager &manager,
1015                AddressType child_ptr_or_ref_addr_type = eAddressTypeLoad);
1016  
1017    /// Use this constructor to create a ValueObject owned by another ValueObject.
1018    /// It will inherit the ExecutionContext of its parent.
1019    ValueObject(ValueObject &parent);
1020  
GetManager()1021    ValueObjectManager *GetManager() { return m_manager; }
1022  
1023    virtual bool UpdateValue() = 0;
1024  
CanUpdateWithInvalidExecutionContext()1025    virtual LazyBool CanUpdateWithInvalidExecutionContext() {
1026      return eLazyBoolCalculate;
1027    }
1028  
1029    virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic);
1030  
GetDynamicValueTypeImpl()1031    virtual lldb::DynamicValueType GetDynamicValueTypeImpl() {
1032      return lldb::eNoDynamicValues;
1033    }
1034  
HasDynamicValueTypeInfo()1035    virtual bool HasDynamicValueTypeInfo() { return false; }
1036  
1037    virtual void CalculateSyntheticValue();
1038  
1039    /// Should only be called by ValueObject::GetChildAtIndex().
1040    ///
1041    /// \return A ValueObject managed by this ValueObject's manager.
1042    virtual ValueObject *CreateChildAtIndex(size_t idx);
1043  
1044    /// Should only be called by ValueObject::GetSyntheticArrayMember().
1045    ///
1046    /// \return A ValueObject managed by this ValueObject's manager.
1047    virtual ValueObject *CreateSyntheticArrayMember(size_t idx);
1048  
1049    /// Should only be called by ValueObject::GetNumChildren().
1050    virtual llvm::Expected<uint32_t>
1051    CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;
1052  
1053    void SetNumChildren(uint32_t num_children);
1054  
SetValueDidChange(bool value_changed)1055    void SetValueDidChange(bool value_changed) {
1056      m_flags.m_value_did_change = value_changed;
1057    }
1058  
SetValueIsValid(bool valid)1059    void SetValueIsValid(bool valid) { m_flags.m_value_is_valid = valid; }
1060  
1061    void ClearUserVisibleData(
1062        uint32_t items = ValueObject::eClearUserVisibleDataItemsAllStrings);
1063  
1064    void AddSyntheticChild(ConstString key, ValueObject *valobj);
1065  
1066    DataExtractor &GetDataExtractor();
1067  
1068    void ClearDynamicTypeInformation();
1069  
1070    // Subclasses must implement the functions below.
1071  
1072    virtual CompilerType GetCompilerTypeImpl() = 0;
1073  
1074    const char *GetLocationAsCStringImpl(const Value &value,
1075                                         const DataExtractor &data);
1076  
IsChecksumEmpty()1077    bool IsChecksumEmpty() { return m_value_checksum.empty(); }
1078  
1079    void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType);
1080  
1081  protected:
DoUpdateChildrenAddressType(ValueObject & valobj)1082    virtual void DoUpdateChildrenAddressType(ValueObject &valobj){};
1083  
1084  private:
1085    virtual CompilerType MaybeCalculateCompleteType();
UpdateChildrenAddressType()1086    void UpdateChildrenAddressType() {
1087      GetRoot()->DoUpdateChildrenAddressType(*this);
1088    }
1089  
1090    lldb::ValueObjectSP GetValueForExpressionPath_Impl(
1091        llvm::StringRef expression_cstr,
1092        ExpressionPathScanEndReason *reason_to_stop,
1093        ExpressionPathEndResultType *final_value_type,
1094        const GetValueForExpressionPathOptions &options,
1095        ExpressionPathAftermath *final_task_on_target);
1096  
1097    ValueObject(const ValueObject &) = delete;
1098    const ValueObject &operator=(const ValueObject &) = delete;
1099  };
1100  
1101  } // namespace lldb_private
1102  
1103  #endif // LLDB_CORE_VALUEOBJECT_H
1104