LLDB mainline
ValueObject.h
Go to the documentation of this file.
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"
14#include "lldb/Symbol/Type.h"
16#include "lldb/Target/Process.h"
20#include "lldb/Utility/Status.h"
21#include "lldb/Utility/UserID.h"
22#include "lldb/lldb-defines.h"
24#include "lldb/lldb-forward.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
43namespace lldb_private {
44class Declaration;
45class DumpValueObjectOptions;
46class EvaluateExpressionOptions;
47class ExecutionContextScope;
48class Log;
49class Scalar;
50class Stream;
51class SymbolContextScope;
52class TypeFormatImpl;
53class TypeSummaryImpl;
54class 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
106public:
110 };
111
121 };
122
124 /// Out of data to parse.
126 /// Child element not found.
128 /// (Synthetic) child element not found.
130 /// [] only allowed for arrays.
132 /// . used when -> should be used.
134 /// -> used when . should be used.
136 /// ObjC ivar expansion not allowed.
138 /// [] not allowed by options.
140 /// [] not valid on objects other than scalars, pointers or arrays.
142 /// [] is good for arrays, but I cannot parse it.
144 /// [] is good for bitfields, but I cannot parse after it.
146 /// Something is malformed in he expression.
148 /// Impossible to apply & operator.
150 /// Impossible to apply * operator.
152 /// [] was expanded into a VOList.
154 /// getting the synthetic children failed.
157 };
158
160 /// Anything but...
162 /// A bitfield.
164 /// A range [low-high].
166 /// A range [].
168 /// Several items in a VOList.
171 };
172
174 /// Just return it.
176 /// Dereference the target.
178 /// Take target's address.
180 };
181
194 };
195
198 None,
201 Both
202 };
203
208
210 bool dot = false, bool no_ivar = false, bool bitfield = true,
211 SyntheticChildrenTraversal synth_traverse =
214 m_allow_bitfields_syntax(bitfield),
215 m_synthetic_children_traversal(synth_traverse) {}
216
219 return *this;
220 }
221
224 return *this;
225 }
226
228 m_no_fragile_ivar = false;
229 return *this;
230 }
231
233 m_no_fragile_ivar = true;
234 return *this;
235 }
236
239 return *this;
240 }
241
244 return *this;
245 }
246
250 return *this;
251 }
252
254 static GetValueForExpressionPathOptions g_default_options;
255
256 return g_default_options;
257 }
258 };
259
261 public:
263
265 bool use_selected = false);
266
268
270
272 return m_exe_ctx_ref;
273 }
274
276 SetUpdated();
278 }
279
280 bool IsConstant() const { return !m_mod_id.IsValid(); }
281
282 ProcessModID GetModID() const { return m_mod_id; }
283
284 void SetUpdateID(ProcessModID new_id) { m_mod_id = new_id; }
285
287
288 void SetUpdated();
289
290 bool NeedsUpdating(bool accept_invalid_exe_ctx) {
291 SyncWithProcessState(accept_invalid_exe_ctx);
292 return m_needs_update;
293 }
294
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
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.
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.
321 bool m_needs_update = true;
322 };
323
324 virtual ~ValueObject();
325
327
329
332 }
333
334 lldb::TargetSP GetTargetSP() const {
336 }
337
338 lldb::ProcessSP GetProcessSP() const {
340 }
341
342 lldb::ThreadSP GetThreadSP() const {
344 }
345
346 lldb::StackFrameSP GetFrameSP() const {
348 }
349
350 void SetNeedsUpdate();
351
353
354 // this vends a TypeImpl that is useful at the SB API layer
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.
366
368
370 return GetCompilerType().GetTypeName();
371 }
372
375 }
376
377 virtual uint32_t
378 GetTypeInfo(CompilerType *pointee_or_element_compiler_type = nullptr) {
379 return GetCompilerType().GetTypeInfo(pointee_or_element_compiler_type);
380 }
381
382 virtual bool IsPointerType() { return GetCompilerType().IsPointerType(); }
383
384 virtual bool IsArrayType() { return GetCompilerType().IsArrayType(); }
385
386 virtual bool IsScalarType() { return GetCompilerType().IsScalarType(); }
387
390 }
391
392 virtual bool IsPossibleDynamicType();
393
394 bool IsNilReference();
395
397
398 virtual bool IsBaseClass() { return false; }
399
400 bool IsBaseClass(uint32_t &depth);
401
402 virtual bool IsDereferenceOfParent() { return false; }
403
404 bool IsIntegerType(bool &is_signed) {
405 return GetCompilerType().IsIntegerType(is_signed);
406 }
407
408 virtual void GetExpressionPath(
409 Stream &s,
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 =
418 ExpressionPathAftermath *final_task_on_target = nullptr);
419
420 virtual bool IsInScope() { return true; }
421
422 virtual lldb::offset_t GetByteOffset() { return 0; }
423
424 virtual uint32_t GetBitfieldBitSize() { return 0; }
425
426 virtual uint32_t GetBitfieldBitOffset() { return 0; }
427
428 bool IsBitfield() {
429 return (GetBitfieldBitSize() != 0) || (GetBitfieldBitOffset() != 0);
430 }
431
432 virtual bool IsArrayItemForPointer() {
434 }
435
436 virtual const char *GetValueAsCString();
437
438 virtual bool GetValueAsCString(const lldb_private::TypeFormatImpl &format,
439 std::string &destination);
440
441 bool GetValueAsCString(lldb::Format format, std::string &destination);
442
443 virtual uint64_t GetValueAsUnsigned(uint64_t fail_value,
444 bool *success = nullptr);
445
446 virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success = nullptr);
447
448 virtual bool SetValueFromCString(const char *value_str, Status &error);
449
450 /// Return the module associated with this value object in case the value is
451 /// from an executable file and might have its data in sections of the file.
452 /// This can be used for variables.
453 virtual lldb::ModuleSP GetModule();
454
456
457 /// Given a ValueObject, loop over itself and its parent, and its parent's
458 /// parent, .. until either the given callback returns false, or you end up at
459 /// a null pointer
460 ValueObject *FollowParentChain(std::function<bool(ValueObject *)>);
461
462 virtual bool GetDeclaration(Declaration &decl);
463
464 // The functions below should NOT be modified by subclasses
465 const Status &GetError();
466
467 ConstString GetName() const { return m_name; }
468
469 /// Returns a unique id for this ValueObject.
470 lldb::user_id_t GetID() const { return m_id.GetID(); }
471
472 virtual lldb::ValueObjectSP GetChildAtIndex(size_t idx, bool can_create);
473
474 // this will always create the children if necessary
475 lldb::ValueObjectSP GetChildAtIndexPath(llvm::ArrayRef<size_t> idxs,
476 size_t *index_of_error = nullptr);
477
478 lldb::ValueObjectSP
479 GetChildAtIndexPath(llvm::ArrayRef<std::pair<size_t, bool>> idxs,
480 size_t *index_of_error = nullptr);
481
482 // this will always create the children if necessary
483 lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef<ConstString> names,
484 ConstString *name_of_error = nullptr);
485
486 lldb::ValueObjectSP
487 GetChildAtNamePath(llvm::ArrayRef<std::pair<ConstString, bool>> names,
488 ConstString *name_of_error = nullptr);
489
490 virtual lldb::ValueObjectSP GetChildMemberWithName(ConstString name,
491 bool can_create);
492
493 virtual size_t GetIndexOfChildWithName(ConstString name);
494
495 size_t GetNumChildren(uint32_t max = UINT32_MAX);
496
497 const Value &GetValue() const { return m_value; }
498
499 Value &GetValue() { return m_value; }
500
501 virtual bool ResolveValue(Scalar &scalar);
502
503 // return 'false' whenever you set the error, otherwise callers may assume
504 // true means everything is OK - this will break breakpoint conditions among
505 // potentially a few others
506 virtual bool IsLogicalTrue(Status &error);
507
508 virtual const char *GetLocationAsCString() {
510 }
511
512 const char *
514
515 bool
516 GetSummaryAsCString(TypeSummaryImpl *summary_ptr, std::string &destination,
518
519 bool GetSummaryAsCString(std::string &destination,
520 const TypeSummaryOptions &options);
521
522 bool GetSummaryAsCString(TypeSummaryImpl *summary_ptr,
523 std::string &destination,
524 const TypeSummaryOptions &options);
525
526 const char *GetObjectDescription();
527
529 ValueObjectRepresentationStyle val_obj_display,
530 lldb::Format custom_format);
531
533 eDisable = false,
534 eAllow = true
535 };
536
537 bool
539 ValueObjectRepresentationStyle val_obj_display =
541 lldb::Format custom_format = lldb::eFormatInvalid,
544 bool do_dump_error = true);
545 bool GetValueIsValid() const { return m_flags.m_value_is_valid; }
546
547 // If you call this on a newly created ValueObject, it will always return
548 // false.
550
551 bool UpdateValueIfNeeded(bool update_format = true);
552
554
555 lldb::ValueObjectSP GetSP() { return m_manager->GetSharedPointer(this); }
556
557 /// Change the name of the current ValueObject. Should *not* be used from a
558 /// synthetic child provider as it would change the name of the non synthetic
559 /// child as well.
560 void SetName(ConstString name) { m_name = name; }
561
562 virtual lldb::addr_t GetAddressOf(bool scalar_is_load_address = true,
563 AddressType *address_type = nullptr);
564
565 lldb::addr_t GetPointerValue(AddressType *address_type = nullptr);
566
567 lldb::ValueObjectSP GetSyntheticChild(ConstString key) const;
568
569 lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create);
570
571 lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to,
572 bool can_create);
573
574 lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression,
575 bool can_create);
576
577 virtual lldb::ValueObjectSP
579 bool can_create,
580 ConstString name_const_str = ConstString());
581
582 virtual lldb::ValueObjectSP
583 GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create,
584 ConstString name_const_str = ConstString());
585
586 virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType);
587
589
590 virtual lldb::ValueObjectSP GetStaticValue() { return GetSP(); }
591
592 virtual lldb::ValueObjectSP GetNonSyntheticValue() { return GetSP(); }
593
594 lldb::ValueObjectSP GetSyntheticValue();
595
596 virtual bool HasSyntheticValue();
597
598 virtual bool IsSynthetic() { return false; }
599
600 lldb::ValueObjectSP
602 bool synthValue);
603
604 virtual lldb::ValueObjectSP CreateConstantValue(ConstString name);
605
606 virtual lldb::ValueObjectSP Dereference(Status &error);
607
608 /// Creates a copy of the ValueObject with a new name and setting the current
609 /// ValueObject as its parent. It should be used when we want to change the
610 /// name of a ValueObject without modifying the actual ValueObject itself
611 /// (e.g. sythetic child provider).
612 virtual lldb::ValueObjectSP Clone(ConstString new_name);
613
614 virtual lldb::ValueObjectSP AddressOf(Status &error);
615
617
619 AddressType address_type = eAddressTypeLoad) {}
620
621 virtual lldb::ValueObjectSP Cast(const CompilerType &compiler_type);
622
623 virtual lldb::ValueObjectSP CastPointerType(const char *name,
624 CompilerType &ast_type);
625
626 virtual lldb::ValueObjectSP CastPointerType(const char *name,
627 lldb::TypeSP &type_sp);
628
629 // The backing bits of this value object were updated, clear any descriptive
630 // string, so we know we have to refetch them.
631 virtual void ValueUpdated() {
635 }
636
637 virtual bool IsDynamic() { return false; }
638
639 virtual bool DoesProvideSyntheticValue() { return false; }
640
643 }
644
645 virtual void SetSyntheticChildrenGenerated(bool b) {
647 }
648
650
651 void Dump(Stream &s);
652
653 void Dump(Stream &s, const DumpValueObjectOptions &options);
654
655 static lldb::ValueObjectSP
656 CreateValueObjectFromExpression(llvm::StringRef name,
657 llvm::StringRef expression,
658 const ExecutionContext &exe_ctx);
659
660 static lldb::ValueObjectSP
661 CreateValueObjectFromExpression(llvm::StringRef name,
662 llvm::StringRef expression,
663 const ExecutionContext &exe_ctx,
664 const EvaluateExpressionOptions &options);
665
666 static lldb::ValueObjectSP
667 CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address,
668 const ExecutionContext &exe_ctx,
669 CompilerType type);
670
671 static lldb::ValueObjectSP
672 CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data,
673 const ExecutionContext &exe_ctx, CompilerType type);
674
675 lldb::ValueObjectSP Persist();
676
677 /// Returns true if this is a char* or a char[] if it is a char* and
678 /// check_pointer is true, it also checks that the pointer is valid.
679 bool IsCStringContainer(bool check_pointer = false);
680
681 std::pair<size_t, bool>
682 ReadPointedString(lldb::WritableDataBufferSP &buffer_sp, Status &error,
683 uint32_t max_length = 0, bool honor_array = true,
685
686 virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx = 0,
687 uint32_t item_count = 1);
688
689 virtual uint64_t GetData(DataExtractor &data, Status &error);
690
691 virtual bool SetData(DataExtractor &data, Status &error);
692
693 virtual bool GetIsConstant() const { return m_update_point.IsConstant(); }
694
696 const bool accept_invalid_exe_ctx =
698 return m_update_point.NeedsUpdating(accept_invalid_exe_ctx);
699 }
700
702
703 lldb::Format GetFormat() const;
704
705 virtual void SetFormat(lldb::Format format) {
706 if (format != m_format)
708 m_format = format;
709 }
710
712
715 }
716
717 lldb::TypeSummaryImplSP GetSummaryFormat() {
719 return m_type_summary_sp;
720 }
721
722 void SetSummaryFormat(lldb::TypeSummaryImplSP format) {
723 m_type_summary_sp = std::move(format);
725 }
726
727 void SetValueFormat(lldb::TypeFormatImplSP format) {
728 m_type_format_sp = std::move(format);
730 }
731
732 lldb::TypeFormatImplSP GetValueFormat() {
734 return m_type_format_sp;
735 }
736
737 void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp) {
738 if (synth_sp.get() == m_synthetic_children_sp.get())
739 return;
741 m_synthetic_children_sp = synth_sp;
742 }
743
744 lldb::SyntheticChildrenSP GetSyntheticChildren() {
747 }
748
749 // Use GetParent for display purposes, but if you want to tell the parent to
750 // update itself then use m_parent. The ValueObjectDynamicValue's parent is
751 // not the correct parent for displaying, they are really siblings, so for
752 // display it needs to route through to its grandparent.
753 virtual ValueObject *GetParent() { return m_parent; }
754
755 virtual const ValueObject *GetParent() const { return m_parent; }
756
758
761 }
762
764
767 }
768
769 /// Find out if a ValueObject might have children.
770 ///
771 /// This call is much more efficient than CalculateNumChildren() as
772 /// it doesn't need to complete the underlying type. This is designed
773 /// to be used in a UI environment in order to detect if the
774 /// disclosure triangle should be displayed or not.
775 ///
776 /// This function returns true for class, union, structure,
777 /// pointers, references, arrays and more. Again, it does so without
778 /// doing any expensive type completion.
779 ///
780 /// \return
781 /// Returns \b true if the ValueObject might have children, or \b
782 /// false otherwise.
783 virtual bool MightHaveChildren();
784
785 virtual lldb::VariableSP GetVariable() { return nullptr; }
786
787 virtual bool IsRuntimeSupportValue();
788
789 virtual uint64_t GetLanguageFlags() { return m_language_flags; }
790
791 virtual void SetLanguageFlags(uint64_t flags) { m_language_flags = flags; }
792
793protected:
795
797 public:
798 ChildrenManager() = default;
799
800 bool HasChildAtIndex(size_t idx) {
801 std::lock_guard<std::recursive_mutex> guard(m_mutex);
802 return (m_children.find(idx) != m_children.end());
803 }
804
806 std::lock_guard<std::recursive_mutex> guard(m_mutex);
807 const auto iter = m_children.find(idx);
808 return ((iter == m_children.end()) ? nullptr : iter->second);
809 }
810
811 void SetChildAtIndex(size_t idx, ValueObject *valobj) {
812 // we do not need to be mutex-protected to make a pair
813 ChildrenPair pair(idx, valobj);
814 std::lock_guard<std::recursive_mutex> guard(m_mutex);
815 m_children.insert(pair);
816 }
817
818 void SetChildrenCount(size_t count) { Clear(count); }
819
821
822 void Clear(size_t new_count = 0) {
823 std::lock_guard<std::recursive_mutex> guard(m_mutex);
824 m_children_count = new_count;
825 m_children.clear();
826 }
827
828 private:
829 typedef std::map<size_t, ValueObject *> ChildrenMap;
830 typedef ChildrenMap::iterator ChildrenIterator;
831 typedef ChildrenMap::value_type ChildrenPair;
832 std::recursive_mutex m_mutex;
835 };
836
837 // Classes that inherit from ValueObject can see and modify these
838
839 /// The parent value object, or nullptr if this has no parent.
841 /// The root of the hierarchy for this ValueObject (or nullptr if never
842 /// calculated).
843 ValueObject *m_root = nullptr;
844 /// Stores both the stop id and the full context at which this value was last
845 /// updated. When we are asked to update the value object, we check whether
846 /// the context & stop id are the same before updating.
848 /// The name of this object.
850 /// A data extractor that can be used to extract the value.
853 /// An error object that can describe any errors that occur when updating
854 /// values.
856 /// Cached value string that will get cleared if/when the value is updated.
857 std::string m_value_str;
858 /// Cached old value string from the last time the value was gotten
859 std::string m_old_value_str;
860 /// Cached location string that will get cleared if/when the value is updated.
861 std::string m_location_str;
862 /// Cached summary string that will get cleared if/when the value is updated.
863 std::string m_summary_str;
864 /// Cached result of the "object printer". This differs from the summary
865 /// in that the summary is consed up by us, the object_desc_string is builtin.
866 std::string m_object_desc_str;
867 /// If the type of the value object should be overridden, the type to impose.
869
870 /// This object is managed by the root object (any ValueObject that gets
871 /// created without a parent.) The manager gets passed through all the
872 /// generations of dependent objects, and will keep the whole cluster of
873 /// objects alive as long as a shared pointer to any of them has been handed
874 /// out. Shared pointers to value objects must always be made with the GetSP
875 /// method.
877
879 std::map<ConstString, ValueObject *> m_synthetic_children;
880
884
885 /// We have to hold onto a shared pointer to this one because it is created
886 /// as an independent ValueObjectConstResult, which isn't managed by us.
887 lldb::ValueObjectSP m_addr_of_valobj_sp;
888
892 lldb::TypeSummaryImplSP m_type_summary_sp;
893 lldb::TypeFormatImplSP m_type_format_sp;
894 lldb::SyntheticChildrenSP m_synthetic_children_sp;
897
898 llvm::SmallVector<uint8_t, 16> m_value_checksum;
899
901
902 uint64_t m_language_flags = 0;
903
904 /// Unique identifier for every value object.
906
907 // Utility class for initializing all bitfields in ValueObject's constructors.
908 // FIXME: This could be done via default initializers once we have C++20.
909 struct Bitflags {
917 m_value_is_valid = false;
918 m_value_did_change = false;
920 m_old_value_valid = false;
921 m_is_deref_of_parent = false;
924 m_is_child_at_offset = false;
925 m_is_getting_summary = false;
928 }
930
931 friend class ValueObjectChild;
932 friend class ExpressionVariable; // For SetName
933 friend class Target; // For SetName
935 friend class ValueObjectSynthetic; // For ClearUserVisibleData
936
937 /// Use this constructor to create a "root variable object". The ValueObject
938 /// will be locked to this context through-out its lifespan.
940 AddressType child_ptr_or_ref_addr_type = eAddressTypeLoad);
941
942 /// Use this constructor to create a ValueObject owned by another ValueObject.
943 /// It will inherit the ExecutionContext of its parent.
944 ValueObject(ValueObject &parent);
945
947
948 virtual bool UpdateValue() = 0;
949
951 return eLazyBoolCalculate;
952 }
953
954 virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic);
955
958 }
959
960 virtual bool HasDynamicValueTypeInfo() { return false; }
961
962 virtual void CalculateSyntheticValue();
963
964 /// Should only be called by ValueObject::GetChildAtIndex().
965 ///
966 /// \return A ValueObject managed by this ValueObject's manager.
967 virtual ValueObject *CreateChildAtIndex(size_t idx,
968 bool synthetic_array_member,
969 int32_t synthetic_index);
970
971 /// Should only be called by ValueObject::GetNumChildren().
972 virtual size_t CalculateNumChildren(uint32_t max = UINT32_MAX) = 0;
973
974 void SetNumChildren(size_t num_children);
975
976 void SetValueDidChange(bool value_changed) {
977 m_flags.m_value_did_change = value_changed;
978 }
979
980 void SetValueIsValid(bool valid) { m_flags.m_value_is_valid = valid; }
981
984
985 void AddSyntheticChild(ConstString key, ValueObject *valobj);
986
988
990
991 // Subclasses must implement the functions below.
992
994
995 const char *GetLocationAsCStringImpl(const Value &value,
996 const DataExtractor &data);
997
998 bool IsChecksumEmpty() { return m_value_checksum.empty(); }
999
1001
1002protected:
1004
1005private:
1009 }
1010
1011 lldb::ValueObjectSP GetValueForExpressionPath_Impl(
1012 llvm::StringRef expression_cstr,
1013 ExpressionPathScanEndReason *reason_to_stop,
1014 ExpressionPathEndResultType *final_value_type,
1015 const GetValueForExpressionPathOptions &options,
1016 ExpressionPathAftermath *final_task_on_target);
1017
1018 ValueObject(const ValueObject &) = delete;
1019 const ValueObject &operator=(const ValueObject &) = delete;
1020};
1021
1022} // namespace lldb_private
1023
1024#endif // LLDB_CORE_VALUEOBJECT_H
static llvm::raw_ostream & error(Stream &strm)
std::shared_ptr< T > GetSharedPointer(T *desired_object)
Definition: SharedCluster.h:40
Generic representation of a type in a programming language.
Definition: CompilerType.h:36
lldb::LanguageType GetMinimumLanguage()
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
ConstString GetTypeName(bool BaseOnly=false) const
bool IsIntegerType(bool &is_signed) const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
bool IsPointerOrReferenceType(CompilerType *pointee_type=nullptr) const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
Definition: ConstString.h:39
An data extractor class.
Definition: DataExtractor.h:48
A class that describes the declaration location of a lldb object.
Definition: Declaration.h:24
Execution context objects refer to objects in the execution of the program that is being debugged.
lldb::StackFrameSP GetFrameSP() const
Get accessor that creates a strong reference from the weak frame reference contained in this object.
lldb::ThreadSP GetThreadSP() const
Get accessor that creates a strong reference from the weak thread reference contained in this object.
lldb::TargetSP GetTargetSP() const
Get accessor that creates a strong reference from the weak target reference contained in this object.
lldb::ProcessSP GetProcessSP() const
Get accessor that creates a strong reference from the weak process reference contained in this object...
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
bool IsValid() const
Definition: Process.h:259
An error handling class.
Definition: Status.h:44
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
A child of another ValueObject.
A class wrapping common implementation details for operations in ValueObjectConstResult ( & Child ) t...
A ValueObject that obtains its children from some source other than real information.
ValueObject * GetChildAtIndex(size_t idx)
Definition: ValueObject.h:805
void SetChildAtIndex(size_t idx, ValueObject *valobj)
Definition: ValueObject.h:811
std::map< size_t, ValueObject * > ChildrenMap
Definition: ValueObject.h:829
bool SyncWithProcessState(bool accept_invalid_exe_ctx)
void SetUpdateID(ProcessModID new_id)
Definition: ValueObject.h:284
const ExecutionContextRef & GetExecutionContextRef() const
Definition: ValueObject.h:271
bool NeedsUpdating(bool accept_invalid_exe_ctx)
Definition: ValueObject.h:290
AddressType m_address_type_of_ptr_or_ref_children
Definition: ValueObject.h:896
void SetValueIsValid(bool valid)
Definition: ValueObject.h:980
lldb::TypeFormatImplSP GetValueFormat()
Definition: ValueObject.h:732
EvaluationPoint m_update_point
Stores both the stop id and the full context at which this value was last updated.
Definition: ValueObject.h:847
lldb::TypeSummaryImplSP GetSummaryFormat()
Definition: ValueObject.h:717
llvm::SmallVector< uint8_t, 16 > m_value_checksum
Definition: ValueObject.h:898
virtual uint32_t GetBitfieldBitSize()
Definition: ValueObject.h:424
virtual lldb::ValueObjectSP GetChildAtIndex(size_t idx, bool can_create)
void ClearUserVisibleData(uint32_t items=ValueObject::eClearUserVisibleDataItemsAllStrings)
virtual bool IsArrayItemForPointer()
Definition: ValueObject.h:432
ValueObject * FollowParentChain(std::function< bool(ValueObject *)>)
Given a ValueObject, loop over itself and its parent, and its parent's parent, .
CompilerType m_override_type
If the type of the value object should be overridden, the type to impose.
Definition: ValueObject.h:868
virtual bool IsInScope()
Definition: ValueObject.h:420
virtual lldb::ValueObjectSP Cast(const CompilerType &compiler_type)
const EvaluationPoint & GetUpdatePoint() const
Definition: ValueObject.h:326
void AddSyntheticChild(ConstString key, ValueObject *valobj)
virtual uint64_t GetData(DataExtractor &data, Status &error)
uint32_t m_last_format_mgr_revision
Definition: ValueObject.h:891
EvaluationPoint & GetUpdatePoint()
Definition: ValueObject.h:328
bool DumpPrintableRepresentation(Stream &s, ValueObjectRepresentationStyle val_obj_display=eValueObjectRepresentationStyleSummary, lldb::Format custom_format=lldb::eFormatInvalid, PrintableRepresentationSpecialCases special=PrintableRepresentationSpecialCases::eAllow, bool do_dump_error=true)
ValueObject * m_deref_valobj
Definition: ValueObject.h:883
virtual lldb::DynamicValueType GetDynamicValueTypeImpl()
Definition: ValueObject.h:956
const ValueObject & operator=(const ValueObject &)=delete
lldb::addr_t GetPointerValue(AddressType *address_type=nullptr)
virtual bool GetIsConstant() const
Definition: ValueObject.h:693
size_t GetNumChildren(uint32_t max=UINT32_MAX)
virtual bool MightHaveChildren()
Find out if a ValueObject might have children.
static lldb::ValueObjectSP CreateValueObjectFromExpression(llvm::StringRef name, llvm::StringRef expression, const ExecutionContext &exe_ctx)
virtual bool IsDereferenceOfParent()
Definition: ValueObject.h:402
CompilerType GetCompilerType()
Definition: ValueObject.h:352
virtual const ValueObject * GetParent() const
Definition: ValueObject.h:755
void SetValueFormat(lldb::TypeFormatImplSP format)
Definition: ValueObject.h:727
virtual lldb::addr_t GetLiveAddress()
Definition: ValueObject.h:616
virtual void CalculateSyntheticValue()
void SetPreferredDisplayLanguage(lldb::LanguageType lt)
Definition: ValueObject.h:713
struct lldb_private::ValueObject::Bitflags m_flags
ClusterManager< ValueObject > ValueObjectManager
Definition: ValueObject.h:794
virtual size_t CalculateNumChildren(uint32_t max=UINT32_MAX)=0
Should only be called by ValueObject::GetNumChildren().
std::string m_summary_str
Cached summary string that will get cleared if/when the value is updated.
Definition: ValueObject.h:863
lldb::TypeSummaryImplSP m_type_summary_sp
Definition: ValueObject.h:892
lldb::ValueObjectSP GetSP()
Definition: ValueObject.h:555
ChildrenManager m_children
Definition: ValueObject.h:878
virtual void SetLanguageFlags(uint64_t flags)
Definition: ValueObject.h:791
virtual lldb::ValueObjectSP CastPointerType(const char *name, CompilerType &ast_type)
Status m_error
An error object that can describe any errors that occur when updating values.
Definition: ValueObject.h:855
virtual size_t GetPointeeData(DataExtractor &data, uint32_t item_idx=0, uint32_t item_count=1)
lldb::ValueObjectSP GetSyntheticValue()
ValueObjectManager * m_manager
This object is managed by the root object (any ValueObject that gets created without a parent....
Definition: ValueObject.h:876
lldb::ValueObjectSP GetSyntheticBitFieldChild(uint32_t from, uint32_t to, bool can_create)
lldb::ProcessSP GetProcessSP() const
Definition: ValueObject.h:338
lldb::ValueObjectSP GetSyntheticChild(ConstString key) const
@ eExpressionPathScanEndReasonArrowInsteadOfDot
-> used when . should be used.
Definition: ValueObject.h:135
@ eExpressionPathScanEndReasonDereferencingFailed
Impossible to apply * operator.
Definition: ValueObject.h:151
@ eExpressionPathScanEndReasonNoSuchSyntheticChild
(Synthetic) child element not found.
Definition: ValueObject.h:129
@ eExpressionPathScanEndReasonNoSuchChild
Child element not found.
Definition: ValueObject.h:127
@ eExpressionPathScanEndReasonDotInsteadOfArrow
. used when -> should be used.
Definition: ValueObject.h:133
@ eExpressionPathScanEndReasonEndOfString
Out of data to parse.
Definition: ValueObject.h:125
@ eExpressionPathScanEndReasonBitfieldRangeOperatorMet
[] is good for bitfields, but I cannot parse after it.
Definition: ValueObject.h:145
@ eExpressionPathScanEndReasonRangeOperatorNotAllowed
[] not allowed by options.
Definition: ValueObject.h:139
@ eExpressionPathScanEndReasonEmptyRangeNotAllowed
[] only allowed for arrays.
Definition: ValueObject.h:131
@ eExpressionPathScanEndReasonRangeOperatorExpanded
[] was expanded into a VOList.
Definition: ValueObject.h:153
@ eExpressionPathScanEndReasonRangeOperatorInvalid
[] not valid on objects other than scalars, pointers or arrays.
Definition: ValueObject.h:141
@ eExpressionPathScanEndReasonUnexpectedSymbol
Something is malformed in he expression.
Definition: ValueObject.h:147
@ eExpressionPathScanEndReasonArrayRangeOperatorMet
[] is good for arrays, but I cannot parse it.
Definition: ValueObject.h:143
@ eExpressionPathScanEndReasonSyntheticValueMissing
getting the synthetic children failed.
Definition: ValueObject.h:155
@ eExpressionPathScanEndReasonTakingAddressFailed
Impossible to apply & operator.
Definition: ValueObject.h:149
@ eExpressionPathScanEndReasonFragileIVarNotAllowed
ObjC ivar expansion not allowed.
Definition: ValueObject.h:137
virtual bool UpdateValue()=0
lldb::Format GetFormat() const
virtual uint64_t GetLanguageFlags()
Definition: ValueObject.h:789
virtual lldb::VariableSP GetVariable()
Definition: ValueObject.h:785
@ eExpressionPathAftermathNothing
Just return it.
Definition: ValueObject.h:175
@ eExpressionPathAftermathDereference
Dereference the target.
Definition: ValueObject.h:177
@ eExpressionPathAftermathTakeAddress
Take target's address.
Definition: ValueObject.h:179
virtual void SetSyntheticChildrenGenerated(bool b)
Definition: ValueObject.h:645
virtual std::optional< uint64_t > GetByteSize()=0
lldb::user_id_t GetID() const
Returns a unique id for this ValueObject.
Definition: ValueObject.h:470
virtual void DoUpdateChildrenAddressType(ValueObject &valobj)
Definition: ValueObject.h:1003
ValueObject * GetNonBaseClassParent()
virtual bool IsArrayType()
Definition: ValueObject.h:384
lldb::ValueObjectSP GetValueForExpressionPath(llvm::StringRef expression, ExpressionPathScanEndReason *reason_to_stop=nullptr, ExpressionPathEndResultType *final_value_type=nullptr, const GetValueForExpressionPathOptions &options=GetValueForExpressionPathOptions::DefaultOptions(), ExpressionPathAftermath *final_task_on_target=nullptr)
virtual lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual void CalculateDynamicValue(lldb::DynamicValueType use_dynamic)
virtual bool IsPossibleDynamicType()
DataExtractor m_data
A data extractor that can be used to extract the value.
Definition: ValueObject.h:851
virtual CompilerType GetCompilerTypeImpl()=0
virtual lldb::ValueObjectSP GetSyntheticBase(uint32_t offset, const CompilerType &type, bool can_create, ConstString name_const_str=ConstString())
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
virtual bool IsDynamic()
Definition: ValueObject.h:637
virtual size_t GetIndexOfChildWithName(ConstString name)
virtual lldb::ValueType GetValueType() const =0
virtual void GetExpressionPath(Stream &s, GetExpressionPathFormat=eGetExpressionPathFormatDereferencePointers)
virtual bool HasSyntheticValue()
lldb::StackFrameSP GetFrameSP() const
Definition: ValueObject.h:346
void SetSummaryFormat(lldb::TypeSummaryImplSP format)
Definition: ValueObject.h:722
virtual bool IsRuntimeSupportValue()
virtual ConstString GetTypeName()
Definition: ValueObject.h:365
DataExtractor & GetDataExtractor()
virtual LazyBool CanUpdateWithInvalidExecutionContext()
Definition: ValueObject.h:950
static lldb::ValueObjectSP CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type)
void SetValueDidChange(bool value_changed)
Definition: ValueObject.h:976
lldb::ThreadSP GetThreadSP() const
Definition: ValueObject.h:342
void SetNumChildren(size_t num_children)
ValueObjectManager * GetManager()
Definition: ValueObject.h:946
ValueObject * m_root
The root of the hierarchy for this ValueObject (or nullptr if never calculated).
Definition: ValueObject.h:843
bool GetValueIsValid() const
Definition: ValueObject.h:545
virtual lldb::ModuleSP GetModule()
Return the module associated with this value object in case the value is from an executable file and ...
virtual lldb::ValueObjectSP GetDynamicValue(lldb::DynamicValueType valueType)
virtual ConstString GetDisplayTypeName()
Definition: ValueObject.h:367
virtual lldb::ValueObjectSP AddressOf(Status &error)
lldb::DynamicValueType GetDynamicValueType()
lldb::SyntheticChildrenSP GetSyntheticChildren()
Definition: ValueObject.h:744
lldb::LanguageType m_preferred_display_language
Definition: ValueObject.h:900
virtual lldb::ValueObjectSP CreateConstantValue(ConstString name)
virtual lldb::addr_t GetAddressOf(bool scalar_is_load_address=true, AddressType *address_type=nullptr)
virtual bool IsLogicalTrue(Status &error)
lldb::Format m_last_format
Definition: ValueObject.h:890
virtual SymbolContextScope * GetSymbolContextScope()
virtual bool HasDynamicValueTypeInfo()
Definition: ValueObject.h:960
ValueObject * m_synthetic_value
Definition: ValueObject.h:882
ValueObject * m_parent
The parent value object, or nullptr if this has no parent.
Definition: ValueObject.h:840
virtual bool IsBaseClass()
Definition: ValueObject.h:398
virtual bool GetDeclaration(Declaration &decl)
virtual lldb::ValueObjectSP Clone(ConstString new_name)
Creates a copy of the ValueObject with a new name and setting the current ValueObject as its parent.
lldb::ValueObjectSP GetChildAtIndexPath(llvm::ArrayRef< size_t > idxs, size_t *index_of_error=nullptr)
lldb::ValueObjectSP GetQualifiedRepresentationIfAvailable(lldb::DynamicValueType dynValue, bool synthValue)
virtual bool IsSyntheticChildrenGenerated()
Definition: ValueObject.h:641
virtual ValueObject * CreateChildAtIndex(size_t idx, bool synthetic_array_member, int32_t synthetic_index)
Should only be called by ValueObject::GetChildAtIndex().
lldb::ValueObjectSP m_addr_of_valobj_sp
We have to hold onto a shared pointer to this one because it is created as an independent ValueObject...
Definition: ValueObject.h:887
ValueObject(const ValueObject &)=delete
bool UpdateValueIfNeeded(bool update_format=true)
void SetName(ConstString name)
Change the name of the current ValueObject.
Definition: ValueObject.h:560
AddressType GetAddressTypeOfChildren()
const Status & GetError()
lldb::TypeFormatImplSP m_type_format_sp
Definition: ValueObject.h:893
lldb::TargetSP GetTargetSP() const
Definition: ValueObject.h:334
@ eExpressionPathEndResultTypePlain
Anything but...
Definition: ValueObject.h:161
@ eExpressionPathEndResultTypeBoundedRange
A range [low-high].
Definition: ValueObject.h:165
@ eExpressionPathEndResultTypeBitfield
A bitfield.
Definition: ValueObject.h:163
@ eExpressionPathEndResultTypeValueObjectList
Several items in a VOList.
Definition: ValueObject.h:169
@ eExpressionPathEndResultTypeUnboundedRange
A range [].
Definition: ValueObject.h:167
virtual lldb::ValueObjectSP Dereference(Status &error)
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type)
void SetPreferredDisplayLanguageIfNeeded(lldb::LanguageType)
virtual const char * GetValueAsCString()
bool HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display, lldb::Format custom_format)
virtual const char * GetLocationAsCString()
Definition: ValueObject.h:508
virtual uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr)
Definition: ValueObject.h:378
ConstString GetName() const
Definition: ValueObject.h:467
std::string m_location_str
Cached location string that will get cleared if/when the value is updated.
Definition: ValueObject.h:861
virtual bool SetValueFromCString(const char *value_str, Status &error)
virtual lldb::ValueObjectSP GetStaticValue()
Definition: ValueObject.h:590
lldb::ValueObjectSP Persist()
std::string m_object_desc_str
Cached result of the "object printer".
Definition: ValueObject.h:866
virtual bool IsPointerType()
Definition: ValueObject.h:382
virtual ValueObject * GetParent()
Definition: ValueObject.h:753
virtual ConstString GetQualifiedTypeName()
Definition: ValueObject.h:369
virtual bool DoesProvideSyntheticValue()
Definition: ValueObject.h:639
std::pair< size_t, bool > ReadPointedString(lldb::WritableDataBufferSP &buffer_sp, Status &error, uint32_t max_length=0, bool honor_array=true, lldb::Format item_format=lldb::eFormatCharArray)
virtual CompilerType MaybeCalculateCompleteType()
lldb::SyntheticChildrenSP m_synthetic_children_sp
Definition: ValueObject.h:894
const char * GetObjectDescription()
virtual uint32_t GetBitfieldBitOffset()
Definition: ValueObject.h:426
virtual lldb::ValueObjectSP GetChildMemberWithName(ConstString name, bool can_create)
virtual bool IsPointerOrReferenceType()
Definition: ValueObject.h:388
std::string m_old_value_str
Cached old value string from the last time the value was gotten.
Definition: ValueObject.h:859
virtual lldb::ValueObjectSP GetNonSyntheticValue()
Definition: ValueObject.h:592
lldb::ValueObjectSP GetSyntheticExpressionPathChild(const char *expression, bool can_create)
virtual bool SetData(DataExtractor &data, Status &error)
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
const char * GetSummaryAsCString(lldb::LanguageType lang=lldb::eLanguageTypeUnknown)
@ eValueObjectRepresentationStyleLanguageSpecific
Definition: ValueObject.h:115
std::string m_value_str
Cached value string that will get cleared if/when the value is updated.
Definition: ValueObject.h:857
bool IsIntegerType(bool &is_signed)
Definition: ValueObject.h:404
lldb::ValueObjectSP GetSyntheticArrayMember(size_t index, bool can_create)
virtual bool ResolveValue(Scalar &scalar)
void SetSyntheticChildren(const lldb::SyntheticChildrenSP &synth_sp)
Definition: ValueObject.h:737
ConstString m_name
The name of this object.
Definition: ValueObject.h:849
const char * GetLocationAsCStringImpl(const Value &value, const DataExtractor &data)
virtual bool IsScalarType()
Definition: ValueObject.h:386
virtual void SetFormat(lldb::Format format)
Definition: ValueObject.h:705
ValueObject * m_dynamic_value
Definition: ValueObject.h:881
ProcessModID m_user_id_of_forced_summary
Definition: ValueObject.h:895
virtual lldb::ValueObjectSP CastPointerType(const char *name, lldb::TypeSP &type_sp)
virtual TypeImpl GetTypeImpl()
Definition: ValueObject.h:355
bool IsCStringContainer(bool check_pointer=false)
Returns true if this is a char* or a char[] if it is a char* and check_pointer is true,...
virtual bool IsSynthetic()
Definition: ValueObject.h:598
std::map< ConstString, ValueObject * > m_synthetic_children
Definition: ValueObject.h:879
lldb::ValueObjectSP GetChildAtNamePath(llvm::ArrayRef< ConstString > names, ConstString *name_of_error=nullptr)
const ExecutionContextRef & GetExecutionContextRef() const
Definition: ValueObject.h:330
virtual lldb::LanguageType GetObjectRuntimeLanguage()
Definition: ValueObject.h:373
virtual bool CanProvideValue()
UserID m_id
Unique identifier for every value object.
Definition: ValueObject.h:905
const Value & GetValue() const
Definition: ValueObject.h:497
virtual lldb::LanguageType GetPreferredDisplayLanguage()
virtual void SetLiveAddress(lldb::addr_t addr=LLDB_INVALID_ADDRESS, AddressType address_type=eAddressTypeLoad)
Definition: ValueObject.h:618
void SetAddressTypeOfChildren(AddressType at)
Definition: ValueObject.h:759
virtual lldb::offset_t GetByteOffset()
Definition: ValueObject.h:422
lldb::ValueObjectSP GetValueForExpressionPath_Impl(llvm::StringRef expression_cstr, ExpressionPathScanEndReason *reason_to_stop, ExpressionPathEndResultType *final_value_type, const GetValueForExpressionPathOptions &options, ExpressionPathAftermath *final_task_on_target)
virtual void ValueUpdated()
Definition: ValueObject.h:631
#define LLDB_INVALID_ADDRESS
Definition: lldb-defines.h:74
#define UINT32_MAX
Definition: lldb-defines.h:19
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
@ eAddressTypeLoad
Address is an address as in the current target inferior process.
Format
Display format definitions.
@ eFormatCharArray
Print characters with no single quotes, used for character arrays that can contain non printable char...
uint64_t offset_t
Definition: lldb-types.h:83
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
uint64_t user_id_t
Definition: lldb-types.h:80
uint64_t addr_t
Definition: lldb-types.h:79
@ eNoDynamicValues
A mix in class that contains a generic user ID.
Definition: UserID.h:31
lldb::user_id_t GetID() const
Get accessor for the user ID.
Definition: UserID.h:47
GetValueForExpressionPathOptions & DontAllowFragileIVar()
Definition: ValueObject.h:232
GetValueForExpressionPathOptions & SetSyntheticChildrenTraversal(SyntheticChildrenTraversal traverse)
Definition: ValueObject.h:248
GetValueForExpressionPathOptions & DoAllowFragileIVar()
Definition: ValueObject.h:227
GetValueForExpressionPathOptions(bool dot=false, bool no_ivar=false, bool bitfield=true, SyntheticChildrenTraversal synth_traverse=SyntheticChildrenTraversal::ToSynthetic)
Definition: ValueObject.h:209
static const GetValueForExpressionPathOptions DefaultOptions()
Definition: ValueObject.h:253
GetValueForExpressionPathOptions & DontCheckDotVsArrowSyntax()
Definition: ValueObject.h:222
GetValueForExpressionPathOptions & DontAllowBitfieldSyntax()
Definition: ValueObject.h:242
GetValueForExpressionPathOptions & DoCheckDotVsArrowSyntax()
Definition: ValueObject.h:217
GetValueForExpressionPathOptions & DoAllowBitfieldSyntax()
Definition: ValueObject.h:237