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_
14 #include "lldb/lldb-enumerations.h"
15 #include "lldb/lldb-forward.h"
17 #include "lldb/DataFormatters/TypeCategory.h"
18 #include "lldb/DataFormatters/TypeFormat.h"
19 #include "lldb/DataFormatters/TypeSummary.h"
20 #include "lldb/DataFormatters/TypeSynthetic.h"
22 namespace lldb_private {
23 namespace formatters {
24 void AddFormat(TypeCategoryImpl::SharedPointer category_sp, lldb::Format format,
25 ConstString type_name, TypeFormatImpl::Flags flags,
28 void AddSummary(TypeCategoryImpl::SharedPointer category_sp,
29 lldb::TypeSummaryImplSP summary_sp, ConstString type_name,
32 void AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,
33 const char *string, ConstString type_name,
34 TypeSummaryImpl::Flags flags, bool regex = false);
36 void AddOneLineSummary(TypeCategoryImpl::SharedPointer category_sp,
37 ConstString type_name, TypeSummaryImpl::Flags flags,
40 #ifndef LLDB_DISABLE_PYTHON
41 void AddCXXSummary(TypeCategoryImpl::SharedPointer category_sp,
42 CXXFunctionSummaryFormat::Callback funct,
43 const char *description, ConstString type_name,
44 TypeSummaryImpl::Flags flags, bool regex = false);
46 void AddCXXSynthetic(TypeCategoryImpl::SharedPointer category_sp,
47 CXXSyntheticChildren::CreateFrontEndCallback generator,
48 const char *description, ConstString type_name,
49 ScriptedSyntheticChildren::Flags flags,
52 void AddFilter(TypeCategoryImpl::SharedPointer category_sp,
53 std::vector<std::string> children, const char *description,
54 ConstString type_name, ScriptedSyntheticChildren::Flags flags,
58 size_t ExtractIndexFromString(const char *item_name);
60 lldb::addr_t GetArrayAddressOrPointerValue(ValueObject &valobj);
64 struct InferiorSizedWord {
66 InferiorSizedWord(const InferiorSizedWord &word) : ptr_size(word.ptr_size) {
68 thirty_two = word.thirty_two;
70 sixty_four = word.sixty_four;
73 InferiorSizedWord operator=(const InferiorSizedWord &word) {
74 ptr_size = word.ptr_size;
76 thirty_two = word.thirty_two;
78 sixty_four = word.sixty_four;
82 InferiorSizedWord(uint64_t val, Process &process)
83 : ptr_size(process.GetAddressByteSize()) {
85 thirty_two = (uint32_t)val;
86 else if (ptr_size == 8)
89 assert(false && "new pointer size is unknown");
92 bool IsNegative() const {
94 return ((int32_t)thirty_two) < 0;
96 return ((int64_t)sixty_four) < 0;
101 return thirty_two == 0;
103 return sixty_four == 0;
106 static InferiorSizedWord GetMaximum(Process &process) {
107 if (process.GetAddressByteSize() == 4)
108 return InferiorSizedWord(UINT32_MAX, 4);
110 return InferiorSizedWord(UINT64_MAX, 8);
113 InferiorSizedWord operator>>(int rhs) const {
115 return InferiorSizedWord(thirty_two >> rhs, 4);
116 return InferiorSizedWord(sixty_four >> rhs, 8);
119 InferiorSizedWord operator<<(int rhs) const {
121 return InferiorSizedWord(thirty_two << rhs, 4);
122 return InferiorSizedWord(sixty_four << rhs, 8);
125 InferiorSizedWord operator&(const InferiorSizedWord &word) const {
126 if (ptr_size != word.ptr_size)
127 return InferiorSizedWord(0, ptr_size);
129 return InferiorSizedWord(thirty_two & word.thirty_two, 4);
130 return InferiorSizedWord(sixty_four & word.sixty_four, 8);
133 InferiorSizedWord operator&(int x) const {
135 return InferiorSizedWord(thirty_two & x, 4);
136 return InferiorSizedWord(sixty_four & x, 8);
139 size_t GetBitSize() const { return ptr_size << 3; }
141 size_t GetByteSize() const { return ptr_size; }
143 uint64_t GetValue() const {
145 return (uint64_t)thirty_two;
149 InferiorSizedWord SignExtend() const {
151 return InferiorSizedWord((int32_t)thirty_two, 4);
152 return InferiorSizedWord((int64_t)sixty_four, 8);
155 uint8_t *CopyToBuffer(uint8_t *buffer) const {
157 memcpy(buffer, &thirty_two, 4);
160 memcpy(buffer, &sixty_four, 8);
166 GetAsData(lldb::ByteOrder byte_order = lldb::eByteOrderInvalid) const {
168 return DataExtractor(&thirty_two, 4, byte_order, 4);
170 return DataExtractor(&sixty_four, 8, byte_order, 8);
174 InferiorSizedWord(uint64_t val, size_t psz) : ptr_size(psz) {
176 thirty_two = (uint32_t)val;
187 } // namespace formatters
188 } // namespace lldb_private
190 #endif // lldb_FormattersHelpers_h_