1 //===-- FormattersHelpers.h --------------------------------------*- C++
4 // The LLVM Compiler Infrastructure
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 #ifndef lldb_FormattersHelpers_h_
12 #define lldb_FormattersHelpers_h_
16 // Other libraries and framework includes
18 #include "lldb/lldb-enumerations.h"
19 #include "lldb/lldb-forward.h"
21 #include "lldb/DataFormatters/TypeCategory.h"
22 #include "lldb/DataFormatters/TypeFormat.h"
23 #include "lldb/DataFormatters/TypeSummary.h"
24 #include "lldb/DataFormatters/TypeSynthetic.h"
26 namespace lldb_private {
27 namespace formatters {
28 void AddFormat(TypeCategoryImpl::SharedPointer category_sp, lldb::Format format,
29 ConstString type_name, TypeFormatImpl::Flags flags,
32 void AddSummary(TypeCategoryImpl::SharedPointer category_sp,
33 lldb::TypeSummaryImplSP summary_sp, ConstString type_name,
36 void AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,
37 const char *string, ConstString type_name,
38 TypeSummaryImpl::Flags flags, bool regex = false);
40 void AddOneLineSummary(TypeCategoryImpl::SharedPointer category_sp,
41 ConstString type_name, TypeSummaryImpl::Flags flags,
44 #ifndef LLDB_DISABLE_PYTHON
45 void AddCXXSummary(TypeCategoryImpl::SharedPointer category_sp,
46 CXXFunctionSummaryFormat::Callback funct,
47 const char *description, ConstString type_name,
48 TypeSummaryImpl::Flags flags, bool regex = false);
50 void AddCXXSynthetic(TypeCategoryImpl::SharedPointer category_sp,
51 CXXSyntheticChildren::CreateFrontEndCallback generator,
52 const char *description, ConstString type_name,
53 ScriptedSyntheticChildren::Flags flags,
56 void AddFilter(TypeCategoryImpl::SharedPointer category_sp,
57 std::vector<std::string> children, const char *description,
58 ConstString type_name, ScriptedSyntheticChildren::Flags flags,
62 size_t ExtractIndexFromString(const char *item_name);
64 lldb::addr_t GetArrayAddressOrPointerValue(ValueObject &valobj);
68 struct InferiorSizedWord {
70 InferiorSizedWord(const InferiorSizedWord &word) : ptr_size(word.ptr_size) {
72 thirty_two = word.thirty_two;
74 sixty_four = word.sixty_four;
77 InferiorSizedWord operator=(const InferiorSizedWord &word) {
78 ptr_size = word.ptr_size;
80 thirty_two = word.thirty_two;
82 sixty_four = word.sixty_four;
86 InferiorSizedWord(uint64_t val, Process &process)
87 : ptr_size(process.GetAddressByteSize()) {
89 thirty_two = (uint32_t)val;
90 else if (ptr_size == 8)
93 assert(false && "new pointer size is unknown");
96 bool IsNegative() const {
98 return ((int32_t)thirty_two) < 0;
100 return ((int64_t)sixty_four) < 0;
103 bool IsZero() const {
105 return thirty_two == 0;
107 return sixty_four == 0;
110 static InferiorSizedWord GetMaximum(Process &process) {
111 if (process.GetAddressByteSize() == 4)
112 return InferiorSizedWord(UINT32_MAX, 4);
114 return InferiorSizedWord(UINT64_MAX, 8);
117 InferiorSizedWord operator>>(int rhs) const {
119 return InferiorSizedWord(thirty_two >> rhs, 4);
120 return InferiorSizedWord(sixty_four >> rhs, 8);
123 InferiorSizedWord operator<<(int rhs) const {
125 return InferiorSizedWord(thirty_two << rhs, 4);
126 return InferiorSizedWord(sixty_four << rhs, 8);
129 InferiorSizedWord operator&(const InferiorSizedWord &word) const {
130 if (ptr_size != word.ptr_size)
131 return InferiorSizedWord(0, ptr_size);
133 return InferiorSizedWord(thirty_two & word.thirty_two, 4);
134 return InferiorSizedWord(sixty_four & word.sixty_four, 8);
137 InferiorSizedWord operator&(int x) const {
139 return InferiorSizedWord(thirty_two & x, 4);
140 return InferiorSizedWord(sixty_four & x, 8);
143 size_t GetBitSize() const { return ptr_size << 3; }
145 size_t GetByteSize() const { return ptr_size; }
147 uint64_t GetValue() const {
149 return (uint64_t)thirty_two;
153 InferiorSizedWord SignExtend() const {
155 return InferiorSizedWord((int32_t)thirty_two, 4);
156 return InferiorSizedWord((int64_t)sixty_four, 8);
159 uint8_t *CopyToBuffer(uint8_t *buffer) const {
161 memcpy(buffer, &thirty_two, 4);
164 memcpy(buffer, &sixty_four, 8);
170 GetAsData(lldb::ByteOrder byte_order = lldb::eByteOrderInvalid) const {
172 return DataExtractor(&thirty_two, 4, byte_order, 4);
174 return DataExtractor(&sixty_four, 8, byte_order, 8);
178 InferiorSizedWord(uint64_t val, size_t psz) : ptr_size(psz) {
180 thirty_two = (uint32_t)val;
191 } // namespace formatters
192 } // namespace lldb_private
194 #endif // lldb_FormattersHelpers_h_