33 tm *tm_date = localtime(&epoch);
36 std::string buffer(1024, 0);
37 if (strftime(&buffer[0], 1023,
"%Z", tm_date) == 0)
39 stream.
Printf(
"%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year + 1900,
40 tm_date->tm_mon + 1, tm_date->tm_mday, tm_date->tm_hour,
41 tm_date->tm_min, tm_date->tm_sec, buffer.c_str());
47 static constexpr llvm::StringLiteral g_TypeHint(
"CFBag");
61 if (!descriptor.get() || !descriptor->IsValid())
64 uint32_t ptr_size = process_sp->GetAddressByteSize();
73 bool is_type_ok =
false;
74 if (descriptor->IsCFType()) {
78 static ConstString g_conststruct__CFBag(
"const struct __CFBag");
80 if (type_name == g_CFBag || type_name == g_conststruct__CFBag) {
89 count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0,
error);
95 llvm::StringRef prefix, suffix;
97 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
100 stream.
Printf(
"\"%u value%s\"", count, (count == 1 ?
"" :
"s"));
119 if (!descriptor.get() || !descriptor->IsValid())
122 uint32_t ptr_size = process_sp->GetAddressByteSize();
131 bool is_type_ok =
false;
132 if (descriptor->IsCFType()) {
134 if (type_name ==
"__CFMutableBitVector" || type_name ==
"__CFBitVector" ||
135 type_name ==
"CFMutableBitVectorRef" || type_name ==
"CFBitVectorRef") {
145 count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size,
149 uint64_t num_bytes = count / 8 + ((count & 7) ? 1 : 0);
150 addr_t data_ptr = process_sp->ReadPointerFromMemory(
151 valobj_addr + 2 * ptr_size + 2 * ptr_size,
error);
155 if (num_bytes > 1024)
159 process_sp->ReadMemory(data_ptr, buffer_sp->GetBytes(), num_bytes,
error);
160 if (
error.Fail() || num_bytes == 0)
162 uint8_t *bytes = buffer_sp->GetBytes();
163 for (uint64_t byte_idx = 0; byte_idx < num_bytes - 1; byte_idx++) {
164 uint8_t
byte = bytes[byte_idx];
165 bool bit0 = (
byte & 1) == 1;
166 bool bit1 = (
byte & 2) == 2;
167 bool bit2 = (
byte & 4) == 4;
168 bool bit3 = (
byte & 8) == 8;
169 bool bit4 = (
byte & 16) == 16;
170 bool bit5 = (
byte & 32) == 32;
171 bool bit6 = (
byte & 64) == 64;
172 bool bit7 = (
byte & 128) == 128;
173 stream.
Printf(
"%c%c%c%c %c%c%c%c ", (bit7 ?
'1' :
'0'), (bit6 ?
'1' :
'0'),
174 (bit5 ?
'1' :
'0'), (bit4 ?
'1' :
'0'), (bit3 ?
'1' :
'0'),
175 (bit2 ?
'1' :
'0'), (bit1 ?
'1' :
'0'), (bit0 ?
'1' :
'0'));
180 uint8_t
byte = bytes[num_bytes - 1];
181 bool bit0 = (
byte & 1) == 1;
182 bool bit1 = (
byte & 2) == 2;
183 bool bit2 = (
byte & 4) == 4;
184 bool bit3 = (
byte & 8) == 8;
185 bool bit4 = (
byte & 16) == 16;
186 bool bit5 = (
byte & 32) == 32;
187 bool bit6 = (
byte & 64) == 64;
188 bool bit7 = (
byte & 128) == 128;
190 stream.
Printf(
"%c", bit7 ?
'1' :
'0');
194 stream.
Printf(
"%c", bit6 ?
'1' :
'0');
198 stream.
Printf(
"%c", bit5 ?
'1' :
'0');
202 stream.
Printf(
"%c", bit4 ?
'1' :
'0');
206 stream.
Printf(
"%c", bit3 ?
'1' :
'0');
210 stream.
Printf(
"%c", bit2 ?
'1' :
'0');
214 stream.
Printf(
"%c", bit1 ?
'1' :
'0');
218 stream.
Printf(
"%c", bit0 ?
'1' :
'0');
225 static constexpr llvm::StringLiteral g_TypeHint(
"CFBinaryHeap");
239 if (!descriptor.get() || !descriptor->IsValid())
242 uint32_t ptr_size = process_sp->GetAddressByteSize();
253 if (descriptor->IsCFType()) {
256 static ConstString g_CFBinaryHeap(
"__CFBinaryHeap");
258 "const struct __CFBinaryHeap");
259 static ConstString g_CFBinaryHeapRef(
"CFBinaryHeapRef");
261 if (type_name == g_CFBinaryHeap ||
262 type_name == g_conststruct__CFBinaryHeap ||
263 type_name == g_CFBinaryHeapRef) {
272 count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0,
error);
278 llvm::StringRef prefix, suffix;
280 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
283 stream.
Printf(
"\"%u item%s\"", count, (count == 1 ?
"" :
"s"));
static llvm::raw_ostream & error(Stream &strm)
A uniqued constant string class.
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