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(bool is_failed_description,
95                       DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
96 
97   bool ShouldExpandEmptyAggregates();
98 
99   ValueObject *GetValueObjectForChildrenGeneration();
100 
101   void PrintChildrenPreamble();
102 
103   void PrintChildrenPostamble(bool print_dotdotdot);
104 
105   lldb::ValueObjectSP GenerateChild(ValueObject *synth_valobj, size_t idx);
106 
107   void PrintChild(lldb::ValueObjectSP child_sp,
108                   const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
109 
110   uint32_t GetMaxNumChildrenToPrint(bool &print_dotdotdot);
111 
112   void
113   PrintChildren(bool value_printed, bool summary_printed,
114                 const DumpValueObjectOptions::PointerDepth &curr_ptr_depth);
115 
116   void PrintChildrenIfNeeded(bool value_printed, bool summary_printed);
117 
118   bool PrintChildrenOneLiner(bool hide_names);
119 
120   bool HasReachedMaximumDepth();
121 
122 private:
123   ValueObject *m_orig_valobj;
124   ValueObject *m_valobj;
125   Stream *m_stream;
126   DumpValueObjectOptions m_options;
127   Flags m_type_flags;
128   CompilerType m_compiler_type;
129   DumpValueObjectOptions::PointerDepth m_ptr_depth;
130   uint32_t m_curr_depth;
131   LazyBool m_should_print;
132   LazyBool m_is_nil;
133   LazyBool m_is_uninit;
134   LazyBool m_is_ptr;
135   LazyBool m_is_ref;
136   LazyBool m_is_aggregate;
137   LazyBool m_is_instance_ptr;
138   std::pair<TypeSummaryImpl *, bool> m_summary_formatter;
139   std::string m_value;
140   std::string m_summary;
141   std::string m_error;
142   bool m_val_summary_ok;
143 
144   friend struct StringSummaryFormat;
145 
146   ValueObjectPrinter(const ValueObjectPrinter &) = delete;
147   const ValueObjectPrinter &operator=(const ValueObjectPrinter &) = delete;
148 };
149 
150 } // namespace lldb_private
151 
152 #endif // LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H
153