32 tm *tm_date = localtime(&epoch);
35 std::string buffer(1024, 0);
36 if (strftime(&buffer[0], 1023,
"%Z", tm_date) == 0)
38 stream.
Printf(
"%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year + 1900,
39 tm_date->tm_mon + 1, tm_date->tm_mday, tm_date->tm_hour,
40 tm_date->tm_min, tm_date->tm_sec, buffer.c_str());
46 static constexpr llvm::StringLiteral g_TypeHint(
"CFBag");
60 if (!descriptor.get() || !descriptor->IsValid())
63 uint32_t ptr_size = process_sp->GetAddressByteSize();
72 bool is_type_ok =
false;
73 if (descriptor->IsCFType()) {
76 static constexpr llvm::StringLiteral g_CFBag(
"__CFBag");
77 static constexpr llvm::StringLiteral g_conststruct__CFBag(
78 "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()) {
135 static constexpr llvm::StringLiteral g_CFMutableBitVector(
136 "__CFMutableBitVector");
137 static constexpr llvm::StringLiteral g_CFBitVector(
"__CFBitVector");
138 static constexpr llvm::StringLiteral g_CFMutableBitVectorRef(
139 "CFMutableBitVectorRef");
140 static constexpr llvm::StringLiteral g_CFBitVectorRef(
"CFBitVectorRef");
142 if (type_name == g_CFMutableBitVector || type_name == g_CFBitVector ||
143 type_name == g_CFMutableBitVectorRef || type_name == g_CFBitVectorRef) {
153 count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size,
157 uint64_t num_bytes = count / 8 + ((count & 7) ? 1 : 0);
158 addr_t data_ptr = process_sp->ReadPointerFromMemory(
159 valobj_addr + 2 * ptr_size + 2 * ptr_size,
error);
163 if (num_bytes > 1024)
167 process_sp->ReadMemory(data_ptr, buffer_sp->GetBytes(), num_bytes,
error);
168 if (
error.Fail() || num_bytes == 0)
170 uint8_t *bytes = buffer_sp->GetBytes();
171 for (uint64_t byte_idx = 0; byte_idx < num_bytes - 1; byte_idx++) {
172 uint8_t
byte = bytes[byte_idx];
173 bool bit0 = (
byte & 1) == 1;
174 bool bit1 = (
byte & 2) == 2;
175 bool bit2 = (
byte & 4) == 4;
176 bool bit3 = (
byte & 8) == 8;
177 bool bit4 = (
byte & 16) == 16;
178 bool bit5 = (
byte & 32) == 32;
179 bool bit6 = (
byte & 64) == 64;
180 bool bit7 = (
byte & 128) == 128;
181 stream.
Printf(
"%c%c%c%c %c%c%c%c ", (bit7 ?
'1' :
'0'), (bit6 ?
'1' :
'0'),
182 (bit5 ?
'1' :
'0'), (bit4 ?
'1' :
'0'), (bit3 ?
'1' :
'0'),
183 (bit2 ?
'1' :
'0'), (bit1 ?
'1' :
'0'), (bit0 ?
'1' :
'0'));
188 uint8_t
byte = bytes[num_bytes - 1];
189 bool bit0 = (
byte & 1) == 1;
190 bool bit1 = (
byte & 2) == 2;
191 bool bit2 = (
byte & 4) == 4;
192 bool bit3 = (
byte & 8) == 8;
193 bool bit4 = (
byte & 16) == 16;
194 bool bit5 = (
byte & 32) == 32;
195 bool bit6 = (
byte & 64) == 64;
196 bool bit7 = (
byte & 128) == 128;
198 stream.
Printf(
"%c", bit7 ?
'1' :
'0');
202 stream.
Printf(
"%c", bit6 ?
'1' :
'0');
206 stream.
Printf(
"%c", bit5 ?
'1' :
'0');
210 stream.
Printf(
"%c", bit4 ?
'1' :
'0');
214 stream.
Printf(
"%c", bit3 ?
'1' :
'0');
218 stream.
Printf(
"%c", bit2 ?
'1' :
'0');
222 stream.
Printf(
"%c", bit1 ?
'1' :
'0');
226 stream.
Printf(
"%c", bit0 ?
'1' :
'0');
233 static constexpr llvm::StringLiteral g_TypeHint(
"CFBinaryHeap");
247 if (!descriptor.get() || !descriptor->IsValid())
250 uint32_t ptr_size = process_sp->GetAddressByteSize();
261 if (descriptor->IsCFType()) {
264 static constexpr llvm::StringRef g_CFBinaryHeap(
"__CFBinaryHeap");
265 static constexpr llvm::StringRef g_conststruct__CFBinaryHeap(
266 "const struct __CFBinaryHeap");
267 static constexpr llvm::StringRef g_CFBinaryHeapRef(
"CFBinaryHeapRef");
269 if (type_name == g_CFBinaryHeap ||
270 type_name == g_conststruct__CFBinaryHeap ||
271 type_name == g_CFBinaryHeapRef) {
280 count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0,
error);
286 llvm::StringRef prefix, suffix;
288 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
291 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