1 //===-- FormattersHelpers.h --------------------------------------*- C++
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
8 //===----------------------------------------------------------------------===//
10 #ifndef lldb_FormattersHelpers_h_
11 #define lldb_FormattersHelpers_h_
13 #include "lldb/lldb-enumerations.h"
14 #include "lldb/lldb-forward.h"
16 #include "lldb/DataFormatters/TypeCategory.h"
17 #include "lldb/DataFormatters/TypeFormat.h"
18 #include "lldb/DataFormatters/TypeSummary.h"
19 #include "lldb/DataFormatters/TypeSynthetic.h"
21 namespace lldb_private {
22 namespace formatters {
23 void AddFormat(TypeCategoryImpl::SharedPointer category_sp, lldb::Format format,
24 ConstString type_name, TypeFormatImpl::Flags flags,
27 void AddSummary(TypeCategoryImpl::SharedPointer category_sp,
28 lldb::TypeSummaryImplSP summary_sp, ConstString type_name,
31 void AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,
32 const char *string, ConstString type_name,
33 TypeSummaryImpl::Flags flags, bool regex = false);
35 void AddOneLineSummary(TypeCategoryImpl::SharedPointer category_sp,
36 ConstString type_name, TypeSummaryImpl::Flags flags,
39 void AddCXXSummary(TypeCategoryImpl::SharedPointer category_sp,
40 CXXFunctionSummaryFormat::Callback funct,
41 const char *description, ConstString type_name,
42 TypeSummaryImpl::Flags flags, bool regex = false);
44 void AddCXXSynthetic(TypeCategoryImpl::SharedPointer category_sp,
45 CXXSyntheticChildren::CreateFrontEndCallback generator,
46 const char *description, ConstString type_name,
47 ScriptedSyntheticChildren::Flags flags,
50 void AddFilter(TypeCategoryImpl::SharedPointer category_sp,
51 std::vector<std::string> children, const char *description,
52 ConstString type_name, ScriptedSyntheticChildren::Flags flags,
55 size_t ExtractIndexFromString(const char *item_name);
57 lldb::addr_t GetArrayAddressOrPointerValue(ValueObject &valobj);
61 struct InferiorSizedWord {
63 InferiorSizedWord(const InferiorSizedWord &word) : ptr_size(word.ptr_size) {
65 thirty_two = word.thirty_two;
67 sixty_four = word.sixty_four;
70 InferiorSizedWord operator=(const InferiorSizedWord &word) {
71 ptr_size = word.ptr_size;
73 thirty_two = word.thirty_two;
75 sixty_four = word.sixty_four;
79 InferiorSizedWord(uint64_t val, Process &process)
80 : ptr_size(process.GetAddressByteSize()) {
82 thirty_two = (uint32_t)val;
83 else if (ptr_size == 8)
86 assert(false && "new pointer size is unknown");
89 bool IsNegative() const {
91 return ((int32_t)thirty_two) < 0;
93 return ((int64_t)sixty_four) < 0;
98 return thirty_two == 0;
100 return sixty_four == 0;
103 static InferiorSizedWord GetMaximum(Process &process) {
104 if (process.GetAddressByteSize() == 4)
105 return InferiorSizedWord(UINT32_MAX, 4);
107 return InferiorSizedWord(UINT64_MAX, 8);
110 InferiorSizedWord operator>>(int rhs) const {
112 return InferiorSizedWord(thirty_two >> rhs, 4);
113 return InferiorSizedWord(sixty_four >> rhs, 8);
116 InferiorSizedWord operator<<(int rhs) const {
118 return InferiorSizedWord(thirty_two << rhs, 4);
119 return InferiorSizedWord(sixty_four << rhs, 8);
122 InferiorSizedWord operator&(const InferiorSizedWord &word) const {
123 if (ptr_size != word.ptr_size)
124 return InferiorSizedWord(0, ptr_size);
126 return InferiorSizedWord(thirty_two & word.thirty_two, 4);
127 return InferiorSizedWord(sixty_four & word.sixty_four, 8);
130 InferiorSizedWord operator&(int x) const {
132 return InferiorSizedWord(thirty_two & x, 4);
133 return InferiorSizedWord(sixty_four & x, 8);
136 size_t GetBitSize() const { return ptr_size << 3; }
138 size_t GetByteSize() const { return ptr_size; }
140 uint64_t GetValue() const {
142 return (uint64_t)thirty_two;
146 InferiorSizedWord SignExtend() const {
148 return InferiorSizedWord((int32_t)thirty_two, 4);
149 return InferiorSizedWord((int64_t)sixty_four, 8);
152 uint8_t *CopyToBuffer(uint8_t *buffer) const {
154 memcpy(buffer, &thirty_two, 4);
157 memcpy(buffer, &sixty_four, 8);
163 GetAsData(lldb::ByteOrder byte_order = lldb::eByteOrderInvalid) const {
165 return DataExtractor(&thirty_two, 4, byte_order, 4);
167 return DataExtractor(&sixty_four, 8, byte_order, 8);
171 InferiorSizedWord(uint64_t val, size_t psz) : ptr_size(psz) {
173 thirty_two = (uint32_t)val;
184 } // namespace formatters
185 } // namespace lldb_private
187 #endif // lldb_FormattersHelpers_h_