22#include "llvm/Support/Error.h"
34 tm *tm_date = localtime(&epoch);
37 std::string buffer(1024, 0);
38 if (strftime(&buffer[0], 1023,
"%Z", tm_date) == 0)
40 stream.
Printf(
"%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year + 1900,
41 tm_date->tm_mon + 1, tm_date->tm_mday, tm_date->tm_hour,
42 tm_date->tm_min, tm_date->tm_sec, buffer.c_str());
48 static constexpr llvm::StringLiteral g_TypeHint(
"CFBag");
62 if (!descriptor.get() || !descriptor->IsValid())
65 uint32_t ptr_size = process_sp->GetAddressByteSize();
74 bool is_type_ok =
false;
75 if (descriptor->IsCFType()) {
78 static constexpr llvm::StringLiteral g_CFBag(
"__CFBag");
79 static constexpr llvm::StringLiteral g_conststruct__CFBag(
80 "const struct __CFBag");
82 if (type_name == g_CFBag || type_name == g_conststruct__CFBag) {
91 count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0,
error);
97 llvm::StringRef prefix, suffix;
99 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
102 stream.
Printf(
"\"%u value%s\"", count, (count == 1 ?
"" :
"s"));
121 if (!descriptor.get() || !descriptor->IsValid())
124 uint32_t ptr_size = process_sp->GetAddressByteSize();
133 bool is_type_ok =
false;
134 if (descriptor->IsCFType()) {
137 static constexpr llvm::StringLiteral g_CFMutableBitVector(
138 "__CFMutableBitVector");
139 static constexpr llvm::StringLiteral g_CFBitVector(
"__CFBitVector");
140 static constexpr llvm::StringLiteral g_CFMutableBitVectorRef(
141 "CFMutableBitVectorRef");
142 static constexpr llvm::StringLiteral g_CFBitVectorRef(
"CFBitVectorRef");
144 if (type_name == g_CFMutableBitVector || type_name == g_CFBitVector ||
145 type_name == g_CFMutableBitVectorRef || type_name == g_CFBitVectorRef) {
155 count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size,
159 uint64_t num_bytes = count / 8 + ((count & 7) ? 1 : 0);
160 llvm::Expected<addr_t> data_ptr = process_sp->ReadPointerFromMemory(
161 valobj_addr + 2 * ptr_size + 2 * ptr_size);
163 llvm::consumeError(data_ptr.takeError());
167 if (num_bytes > 1024)
170 num_bytes = process_sp->ReadMemory(*data_ptr, buffer_sp->GetBytes(),
172 if (
error.Fail() || num_bytes == 0)
174 uint8_t *bytes = buffer_sp->GetBytes();
175 for (uint64_t byte_idx = 0; byte_idx < num_bytes - 1; byte_idx++) {
176 uint8_t
byte = bytes[byte_idx];
177 bool bit0 = (
byte & 1) == 1;
178 bool bit1 = (
byte & 2) == 2;
179 bool bit2 = (
byte & 4) == 4;
180 bool bit3 = (
byte & 8) == 8;
181 bool bit4 = (
byte & 16) == 16;
182 bool bit5 = (
byte & 32) == 32;
183 bool bit6 = (
byte & 64) == 64;
184 bool bit7 = (
byte & 128) == 128;
185 stream.
Printf(
"%c%c%c%c %c%c%c%c ", (bit7 ?
'1' :
'0'), (bit6 ?
'1' :
'0'),
186 (bit5 ?
'1' :
'0'), (bit4 ?
'1' :
'0'), (bit3 ?
'1' :
'0'),
187 (bit2 ?
'1' :
'0'), (bit1 ?
'1' :
'0'), (bit0 ?
'1' :
'0'));
192 uint8_t
byte = bytes[num_bytes - 1];
193 bool bit0 = (
byte & 1) == 1;
194 bool bit1 = (
byte & 2) == 2;
195 bool bit2 = (
byte & 4) == 4;
196 bool bit3 = (
byte & 8) == 8;
197 bool bit4 = (
byte & 16) == 16;
198 bool bit5 = (
byte & 32) == 32;
199 bool bit6 = (
byte & 64) == 64;
200 bool bit7 = (
byte & 128) == 128;
202 stream.
Printf(
"%c", bit7 ?
'1' :
'0');
206 stream.
Printf(
"%c", bit6 ?
'1' :
'0');
210 stream.
Printf(
"%c", bit5 ?
'1' :
'0');
214 stream.
Printf(
"%c", bit4 ?
'1' :
'0');
218 stream.
Printf(
"%c", bit3 ?
'1' :
'0');
222 stream.
Printf(
"%c", bit2 ?
'1' :
'0');
226 stream.
Printf(
"%c", bit1 ?
'1' :
'0');
230 stream.
Printf(
"%c", bit0 ?
'1' :
'0');
237 static constexpr llvm::StringLiteral g_TypeHint(
"CFBinaryHeap");
251 if (!descriptor.get() || !descriptor->IsValid())
254 uint32_t ptr_size = process_sp->GetAddressByteSize();
265 if (descriptor->IsCFType()) {
268 static constexpr llvm::StringRef g_CFBinaryHeap(
"__CFBinaryHeap");
269 static constexpr llvm::StringRef g_conststruct__CFBinaryHeap(
270 "const struct __CFBinaryHeap");
271 static constexpr llvm::StringRef g_CFBinaryHeapRef(
"CFBinaryHeapRef");
273 if (type_name == g_CFBinaryHeap ||
274 type_name == g_conststruct__CFBinaryHeap ||
275 type_name == g_CFBinaryHeapRef) {
284 count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0,
error);
290 llvm::StringRef prefix, suffix;
292 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
295 stream.
Printf(
"\"%u item%s\"", count, (count == 1 ?
"" :
"s"));
static llvm::raw_ostream & error(Stream &strm)
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
A subclass of DataBuffer that stores a data buffer on the heap.
static Language * FindPlugin(lldb::LanguageType language)
std::shared_ptr< ClassDescriptor > ClassDescriptorSP
static ObjCLanguageRuntime * Get(Process &process)
virtual ClassDescriptorSP GetClassDescriptor(ValueObject &in_value)
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
lldb::LanguageType GetLanguage() const
lldb::ProcessSP GetProcessSP() const
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
virtual ConstString GetTypeName()
virtual int64_t GetValueAsSigned(int64_t fail_value, bool *success=nullptr)
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP