1 //===-- ValueObjectPrinter.h ---------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
11 #define LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
12 
13 #include "lldb/lldb-private.h"
14 #include "lldb/lldb-public.h"
15 
16 #include "lldb/Utility/Flags.h"
17 
18 #include "lldb/DataFormatters/DumpValueObjectOptions.h"
19 #include "lldb/Symbol/CompilerType.h"
20 
21 namespace lldb_private {
22 
23 class ValueObjectPrinter {
24 public:
25   ValueObjectPrinter(ValueObject *valobj, Stream *s);
26 
27   ValueObjectPrinter(ValueObject *valobj, Stream *s,
28                      const DumpValueObjectOptions &options);
29 
30   ~ValueObjectPrinter() = default;
31 
32   bool PrintValueObject();
33 
34 protected:
35   typedef std::set<uint64_t> InstancePointersSet;
36   typedef std::shared_ptr<InstancePointersSet> InstancePointersSetSP;
37 
38   InstancePointersSetSP m_printed_instance_pointers;
39 
40   // only this class (and subclasses, if any) should ever be concerned with the
41   // depth mechanism
42   ValueObjectPrinter(ValueObject *valobj, Stream *s,
43                      const DumpValueObjectOptions &options,
44                      const DumpValueObjectOptions::PointerDepth &ptr_depth,
45                      uint32_t curr_depth,
46                      InstancePointersSetSP printed_instance_pointers);
47 
48   // we should actually be using delegating constructors here but some versions
49   // of GCC still have trouble with those
50   void Init(ValueObject *valobj, Stream *s,
51             const DumpValueObjectOptions &options,
52             const DumpValueObjectOptions::PointerDepth &ptr_depth,
53             uint32_t curr_depth,
54             InstancePointersSetSP printed_instance_pointers);
55 
56   bool GetMostSpecializedValue();
57 
58   const char *GetDescriptionForDisplay();
59 
60   const char *GetRootNameForDisplay();
61 
62   bool ShouldPrintValueObject();
63 
64   bool IsNil();
65 
66   bool IsUninitialized();
67 
68   bool IsPtr();
69 
70   bool IsRef();
71 
72   bool IsInstancePointer();
73 
74   bool IsAggregate();
75 
76   bool PrintLocationIfNeeded();
77 
78   void PrintDecl();
79 
80   bool CheckScopeIfNeeded();
81 
82   bool ShouldPrintEmptyBrackets(bool value_printed, bool summary_printed);
83 
84   TypeSummaryImpl *GetSummaryFormatter(bool null_if_omitted = true);
85 
86   void GetValueSummaryError(std::string &value, std::string &summary,
87                             std::string &error);
88 
89   bool PrintValueAndSummaryIfNeeded(bool &value_printed, bool &summary_printed);
90 
91   bool PrintObjectDescriptionIfNeeded(bool value_printed, bool summary_printed);
92 
93   bool
94   ShouldPrintChildren(DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
95 
96   bool ShouldExpandEmptyAggregates();
97 
98   ValueObject *GetValueObjectForChildrenGeneration();
99 
100   void PrintChildrenPreamble(bool value_printed, bool summary_printed);
101 
102   void PrintChildrenPostamble(bool print_dotdotdot);
103 
104   lldb::ValueObjectSP GenerateChild(ValueObject *synth_valobj, size_t idx);
105 
106   void PrintChild(lldb::ValueObjectSP child_sp,
107                   const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
108 
109   uint32_t GetMaxNumChildrenToPrint(bool &print_dotdotdot);
110 
111   void
112   PrintChildren(bool value_printed, bool summary_printed,
113                 const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
114 
115   void PrintChildrenIfNeeded(bool value_printed, bool summary_printed);
116 
117   bool PrintChildrenOneLiner(bool hide_names);
118 
119   bool HasReachedMaximumDepth();
120 
121 private:
122   bool ShouldShowName() const;
123 
124   ValueObject *m_orig_valobj;
125   ValueObject *m_valobj;
126   Stream *m_stream;
127   DumpValueObjectOptions m_options;
128   Flags m_type_flags;
129   CompilerType m_compiler_type;
130   DumpValueObjectOptions::PointerDepth m_ptr_depth;
131   uint32_t m_curr_depth;
132   LazyBool m_should_print;
133   LazyBool m_is_nil;
134   LazyBool m_is_uninit;
135   LazyBool m_is_ptr;
136   LazyBool m_is_ref;
137   LazyBool m_is_aggregate;
138   LazyBool m_is_instance_ptr;
139   std::pair<TypeSummaryImpl *, bool> m_summary_formatter;
140   std::string m_value;
141   std::string m_summary;
142   std::string m_error;
143   bool m_val_summary_ok;
144 
145   friend struct StringSummaryFormat;
146 
147   ValueObjectPrinter(const ValueObjectPrinter &) = delete;
148   const ValueObjectPrinter &operator=(const ValueObjectPrinter &) = delete;
149 };
150 
151 } // namespace lldb_private
152 
153 #endif // LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
154