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 ~ValueObjectPrinter()30 ~ValueObjectPrinter() {} 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 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