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() {} |
31 | |
32 | bool PrintValueObject(); |
33 | |
34 | protected: |
35 | typedef std::set<uint64_t> ; |
36 | typedef std::shared_ptr<InstancePointersSet> ; |
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 | private: |
121 | ValueObject *m_orig_valobj; |
122 | ValueObject *m_valobj; |
123 | Stream *m_stream; |
124 | DumpValueObjectOptions m_options; |
125 | Flags m_type_flags; |
126 | CompilerType m_compiler_type; |
127 | DumpValueObjectOptions::PointerDepth m_ptr_depth; |
128 | uint32_t m_curr_depth; |
129 | LazyBool m_should_print; |
130 | LazyBool m_is_nil; |
131 | LazyBool m_is_uninit; |
132 | LazyBool m_is_ptr; |
133 | LazyBool m_is_ref; |
134 | LazyBool m_is_aggregate; |
135 | LazyBool m_is_instance_ptr; |
136 | std::pair<TypeSummaryImpl *, bool> m_summary_formatter; |
137 | std::string m_value; |
138 | std::string m_summary; |
139 | std::string m_error; |
140 | bool m_val_summary_ok; |
141 | |
142 | friend struct StringSummaryFormat; |
143 | |
144 | ValueObjectPrinter(const ValueObjectPrinter &) = delete; |
145 | const ValueObjectPrinter &operator=(const ValueObjectPrinter &) = delete; |
146 | }; |
147 | |
148 | } // namespace lldb_private |
149 | |
150 | #endif // LLDB_DATAFORMATTERS_VALUEOBJECTPRINTER_H |
151 | |