LLDB mainline
NSSet.cpp
Go to the documentation of this file.
1//===-- NSSet.cpp ---------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "NSSet.h"
10#include "CFBasicHash.h"
11
15#include "lldb/Target/Target.h"
17#include "lldb/Utility/Endian.h"
18#include "lldb/Utility/Status.h"
19#include "lldb/Utility/Stream.h"
22
23using namespace lldb;
24using namespace lldb_private;
25using namespace lldb_private::formatters;
26
27std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
29 static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map;
30 return g_map;
31}
32
33std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
35 static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>
36 g_map;
37 return g_map;
38}
39
40namespace lldb_private {
41namespace formatters {
43public:
45
46 ~NSSetISyntheticFrontEnd() override;
47
48 llvm::Expected<uint32_t> CalculateNumChildren() override;
49
50 lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
51
53
54private:
56 uint32_t _used : 26;
57 uint32_t _szidx : 6;
58 };
59
61 uint64_t _used : 58;
62 uint32_t _szidx : 6;
63 };
64
69
71 uint8_t m_ptr_size = 8;
75 std::vector<SetItemDescriptor> m_children;
76};
77
103
104template <typename D32, typename D64>
130
131namespace Foundation1300 {
133 uint32_t _used : 26;
134 uint32_t _size;
135 uint32_t _mutations;
136 uint32_t _objs_addr;
137 };
138
140 uint64_t _used : 58;
141 uint64_t _size;
142 uint64_t _mutations;
143 uint64_t _objs_addr;
144 };
145
148}
149
150namespace Foundation1428 {
151 struct DataDescriptor_32 {
152 uint32_t _used : 26;
153 uint32_t _size;
154 uint32_t _objs_addr;
155 uint32_t _mutations;
156 };
157
158 struct DataDescriptor_64 {
159 uint64_t _used : 58;
160 uint64_t _size;
161 uint64_t _objs_addr;
162 uint64_t _mutations;
163 };
164
167}
168
169namespace Foundation1437 {
170 struct DataDescriptor_32 {
171 uint32_t _cow;
172 // __table storage
173 uint32_t _objs_addr;
174 uint32_t _muts;
175 uint32_t _used : 26;
176 uint32_t _szidx : 6;
177 };
178
179 struct DataDescriptor_64 {
180 uint64_t _cow;
181 // __Table storage
182 uint64_t _objs_addr;
183 uint32_t _muts;
184 uint32_t _used : 26;
185 uint32_t _szidx : 6;
186 };
187
190
191 template <typename DD>
192 uint64_t
194 Status &error) {
195 const lldb::addr_t start_of_descriptor =
196 valobj_addr + process.GetAddressByteSize();
197 DD descriptor = DD();
198 process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor),
199 error);
200 if (error.Fail()) {
201 return 0;
202 }
203 return descriptor._used;
204 }
205
206 uint64_t
208 Status &error) {
209 if (process.GetAddressByteSize() == 4) {
210 return __NSSetMSize_Impl<DataDescriptor_32>(process, valobj_addr, error);
211 } else {
212 return __NSSetMSize_Impl<DataDescriptor_64>(process, valobj_addr, error);
213 }
214 }
215 } // namespace Foundation1437
216} // namespace formatters
217} // namespace lldb_private
218
219template <bool cf_style>
221 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
222 static constexpr llvm::StringLiteral g_TypeHint("NSSet");
223
224 ProcessSP process_sp = valobj.GetProcessSP();
225 if (!process_sp)
226 return false;
227
228 ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
229
230 if (!runtime)
231 return false;
232
234 runtime->GetClassDescriptor(valobj));
235
236 if (!descriptor || !descriptor->IsValid())
237 return false;
238
239 uint32_t ptr_size = process_sp->GetAddressByteSize();
240 bool is_64bit = (ptr_size == 8);
241
242 lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
243
244 if (!valobj_addr)
245 return false;
246
247 uint64_t value = 0;
248
249 ConstString class_name(descriptor->GetClassName());
250
251 static const ConstString g_SetI("__NSSetI");
252 static const ConstString g_OrderedSetI("__NSOrderedSetI");
253 static const ConstString g_SetM("__NSSetM");
254 static const ConstString g_SetCF("__NSCFSet");
255 static const ConstString g_SetCFRef("CFSetRef");
256
257 if (class_name.IsEmpty())
258 return false;
259
260 if (class_name == g_SetI || class_name == g_OrderedSetI) {
262 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
263 ptr_size, 0, error);
264 if (error.Fail())
265 return false;
266 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
267 } else if (class_name == g_SetM) {
268 AppleObjCRuntime *apple_runtime =
269 llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
271 if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
272 value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error);
273 } else {
274 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
275 ptr_size, 0, error);
276 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
277 }
278 if (error.Fail())
279 return false;
280 } else if (class_name == g_SetCF || class_name == g_SetCFRef) {
281 ExecutionContext exe_ctx(process_sp);
282 CFBasicHash cfbh;
283 if (!cfbh.Update(valobj_addr, exe_ctx))
284 return false;
285 value = cfbh.GetCount();
286 } else {
288 auto iter = map.find(class_name), end = map.end();
289 if (iter != end)
290 return iter->second(valobj, stream, options);
291 else
292 return false;
293 }
294
295 llvm::StringRef prefix, suffix;
296 if (Language *language = Language::FindPlugin(options.GetLanguage()))
297 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
298
299 stream << prefix;
300 stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? "" : "s");
301 stream << suffix;
302 return true;
303}
304
307 CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) {
308 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
309 if (!process_sp)
310 return nullptr;
311 ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
312 if (!runtime)
313 return nullptr;
314
315 CompilerType valobj_type(valobj_sp->GetCompilerType());
316 Flags flags(valobj_type.GetTypeInfo());
317
318 if (flags.IsClear(eTypeIsPointer)) {
320 valobj_sp = valobj_sp->AddressOf(error);
321 if (error.Fail() || !valobj_sp)
322 return nullptr;
323 }
324
326 runtime->GetClassDescriptor(*valobj_sp));
327
328 if (!descriptor || !descriptor->IsValid())
329 return nullptr;
330
331 ConstString class_name = descriptor->GetClassName();
332
333 static const ConstString g_SetI("__NSSetI");
334 static const ConstString g_OrderedSetI("__NSOrderedSetI");
335 static const ConstString g_SetM("__NSSetM");
336 static const ConstString g_SetCF("__NSCFSet");
337 static const ConstString g_SetCFRef("CFSetRef");
338
339 if (class_name.IsEmpty())
340 return nullptr;
341
342 if (class_name == g_SetI || class_name == g_OrderedSetI) {
343 return (new NSSetISyntheticFrontEnd(valobj_sp));
344 } else if (class_name == g_SetM) {
345 AppleObjCRuntime *apple_runtime =
346 llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
347 if (apple_runtime) {
348 if (apple_runtime->GetFoundationVersion() >= 1437)
349 return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp));
350 else if (apple_runtime->GetFoundationVersion() >= 1428)
351 return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp));
352 else
353 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
354 } else {
355 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
356 }
357 } else if (class_name == g_SetCF || class_name == g_SetCFRef) {
358 return (new NSCFSetSyntheticFrontEnd(valobj_sp));
359 } else {
361 auto iter = map.find(class_name), end = map.end();
362 if (iter != end)
363 return iter->second(synth, valobj_sp);
364 return nullptr;
365 }
366}
367
374
381
382llvm::Expected<uint32_t>
388
391 m_children.clear();
392 delete m_data_32;
393 m_data_32 = nullptr;
394 delete m_data_64;
395 m_data_64 = nullptr;
396 m_ptr_size = 0;
397 ValueObjectSP valobj_sp = m_backend.GetSP();
398 if (!valobj_sp)
400 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
401 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
402 if (!process_sp)
404 m_ptr_size = process_sp->GetAddressByteSize();
405 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
407 if (m_ptr_size == 4) {
409 process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32),
410 error);
411 } else {
413 process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64),
414 error);
415 }
416 if (error.Fail())
418 m_data_ptr = data_location + m_ptr_size;
420}
421
424 uint32_t idx) {
425 uint32_t num_children = CalculateNumChildrenIgnoringErrors();
426
427 if (idx >= num_children)
428 return lldb::ValueObjectSP();
429
430 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
431 if (!process_sp)
432 return lldb::ValueObjectSP();
433
434 if (m_children.empty()) {
435 // do the scan phase
436 lldb::addr_t obj_at_idx = 0;
437
438 uint32_t tries = 0;
439 uint32_t test_idx = 0;
440
441 while (tries < num_children) {
442 obj_at_idx = m_data_ptr + (test_idx * m_ptr_size);
443 if (!process_sp)
444 return lldb::ValueObjectSP();
446 obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
447 if (error.Fail())
448 return lldb::ValueObjectSP();
449
450 test_idx++;
451
452 if (!obj_at_idx)
453 continue;
454 tries++;
455
456 SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
457
458 m_children.push_back(descriptor);
459 }
460 }
461
462 if (idx >= m_children.size()) // should never happen
463 return lldb::ValueObjectSP();
464
465 SetItemDescriptor &set_item = m_children[idx];
466 if (!set_item.valobj_sp) {
467 auto ptr_size = process_sp->GetAddressByteSize();
468 DataBufferHeap buffer(ptr_size, 0);
469 switch (ptr_size) {
470 case 0: // architecture has no clue - fail
471 return lldb::ValueObjectSP();
472 case 4:
473 *reinterpret_cast<uint32_t *>(buffer.GetBytes()) =
474 static_cast<uint32_t>(set_item.item_ptr);
475 break;
476 case 8:
477 *reinterpret_cast<uint64_t *>(buffer.GetBytes()) =
478 static_cast<uint64_t>(set_item.item_ptr);
479 break;
480 default:
481 lldbassert(false && "pointer size is not 4 nor 8");
482 }
483 StreamString idx_name;
484 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
485
486 DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
487 process_sp->GetByteOrder(),
488 process_sp->GetAddressByteSize());
489
491 idx_name.GetString(), data, m_exe_ctx_ref,
492 m_backend.GetCompilerType().GetBasicTypeFromAST(
494 }
495 return set_item.valobj_sp;
496}
497
502
503llvm::Expected<uint32_t>
505 if (!m_hashtable.IsValid())
506 return 0;
507 return m_hashtable.GetCount();
508}
509
512 m_children.clear();
513 ValueObjectSP valobj_sp = m_backend.GetSP();
514 m_ptr_size = 0;
515 if (!valobj_sp)
517 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
518
519 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
520 if (!process_sp)
522 m_ptr_size = process_sp->GetAddressByteSize();
523 m_order = process_sp->GetByteOrder();
524 return m_hashtable.Update(valobj_sp->GetValueAsUnsigned(0), m_exe_ctx_ref)
527}
528
531 uint32_t idx) {
532 lldb::addr_t m_values_ptr = m_hashtable.GetValuePointer();
533
534 const uint32_t num_children = CalculateNumChildrenIgnoringErrors();
535
536 if (idx >= num_children)
537 return lldb::ValueObjectSP();
538
539 if (m_children.empty()) {
540 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
541 if (!process_sp)
542 return lldb::ValueObjectSP();
543
545 lldb::addr_t val_at_idx = 0;
546
547 uint32_t tries = 0;
548 uint32_t test_idx = 0;
549
550 // Iterate over inferior memory, reading value pointers by shifting the
551 // cursor by test_index * m_ptr_size. Returns an empty ValueObject if a read
552 // fails, otherwise, continue until the number of tries matches the number
553 // of childen.
554 while (tries < num_children) {
555 val_at_idx = m_values_ptr + (test_idx * m_ptr_size);
556
557 val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
558 if (error.Fail())
559 return lldb::ValueObjectSP();
560
561 test_idx++;
562
563 if (!val_at_idx)
564 continue;
565 tries++;
566
567 SetItemDescriptor descriptor = {val_at_idx, lldb::ValueObjectSP()};
568
569 m_children.push_back(descriptor);
570 }
571 }
572
573 if (idx >= m_children.size()) // should never happen
574 return lldb::ValueObjectSP();
575
576 SetItemDescriptor &set_item = m_children[idx];
577 if (!set_item.valobj_sp) {
578
580
581 switch (m_ptr_size) {
582 case 0: // architecture has no clue - fail
583 return lldb::ValueObjectSP();
584 case 4:
585 *reinterpret_cast<uint32_t *>(buffer_sp->GetBytes()) =
586 static_cast<uint32_t>(set_item.item_ptr);
587 break;
588 case 8:
589 *reinterpret_cast<uint64_t *>(buffer_sp->GetBytes()) =
590 static_cast<uint64_t>(set_item.item_ptr);
591 break;
592 default:
593 lldbassert(false && "pointer size is not 4 nor 8");
594 }
595 StreamString idx_name;
596 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
597
598 DataExtractor data(buffer_sp, m_order, m_ptr_size);
599
601 idx_name.GetString(), data, m_exe_ctx_ref,
602 m_backend.GetCompilerType().GetBasicTypeFromAST(
604 }
605
606 return set_item.valobj_sp;
607}
608
609template <typename D32, typename D64>
613 m_data_32(nullptr), m_data_64(nullptr) {
614 if (valobj_sp)
615 Update();
616}
617
618template <typename D32, typename D64>
621 delete m_data_32;
622 m_data_32 = nullptr;
623 delete m_data_64;
624 m_data_64 = nullptr;
625}
626
627template <typename D32, typename D64>
628llvm::Expected<uint32_t>
631 if (!m_data_32 && !m_data_64)
632 return 0;
633 return (m_data_32 ? (uint32_t)m_data_32->_used : (uint32_t)m_data_64->_used);
634}
635
636template <typename D32, typename D64>
639 m_children.clear();
640 ValueObjectSP valobj_sp = m_backend.GetSP();
641 m_ptr_size = 0;
642 delete m_data_32;
643 m_data_32 = nullptr;
644 delete m_data_64;
645 m_data_64 = nullptr;
646 if (!valobj_sp)
648 if (!valobj_sp)
650 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
651 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
652 if (!process_sp)
654 m_ptr_size = process_sp->GetAddressByteSize();
655 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
657 if (m_ptr_size == 4) {
658 m_data_32 = new D32();
659 process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
660 error);
661 } else {
662 m_data_64 = new D64();
663 process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
664 error);
665 }
666 return error.Success() ? lldb::ChildCacheState::eReuse
668}
669
670template <typename D32, typename D64>
674 lldb::addr_t m_objs_addr =
675 (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
676
677 uint32_t num_children = CalculateNumChildrenIgnoringErrors();
678
679 if (idx >= num_children)
680 return lldb::ValueObjectSP();
681
682 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
683 if (!process_sp)
684 return lldb::ValueObjectSP();
685
686 if (m_children.empty()) {
687 // do the scan phase
688 lldb::addr_t obj_at_idx = 0;
689
690 uint32_t tries = 0;
691 uint32_t test_idx = 0;
692
693 while (tries < num_children) {
694 obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
695 if (!process_sp)
696 return lldb::ValueObjectSP();
698 obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
699 if (error.Fail())
700 return lldb::ValueObjectSP();
701
702 test_idx++;
703
704 if (!obj_at_idx)
705 continue;
706 tries++;
707
708 SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
709
710 m_children.push_back(descriptor);
711 }
712 }
713
714 if (idx >= m_children.size()) // should never happen
715 return lldb::ValueObjectSP();
716
717 SetItemDescriptor &set_item = m_children[idx];
718 if (!set_item.valobj_sp) {
719 auto ptr_size = process_sp->GetAddressByteSize();
720 DataBufferHeap buffer(ptr_size, 0);
721 switch (ptr_size) {
722 case 0: // architecture has no clue?? - fail
723 return lldb::ValueObjectSP();
724 case 4:
725 *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
726 break;
727 case 8:
728 *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
729 break;
730 default:
731 assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
732 }
733 StreamString idx_name;
734 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
735
736 DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
737 process_sp->GetByteOrder(),
738 process_sp->GetAddressByteSize());
739
741 idx_name.GetString(), data, m_exe_ctx_ref,
742 m_backend.GetCompilerType().GetBasicTypeFromAST(
744 }
745 return set_item.valobj_sp;
746}
747
749 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options);
750
752 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options);
static llvm::raw_ostream & error(Stream &strm)
#define lldbassert(x)
Definition LLDBAssert.h:16
static std::optional< size_t > CalculateNumChildren(CompilerType container_elem_type, uint64_t num_elements, CompilerType element_type)
Calculates the number of elements stored in a container (with element type 'container_elem_type') as ...
bool Update(lldb::addr_t addr, ExecutionContextRef exe_ctx_rf)
Generic representation of a type in a programming language.
A uniqued constant string class.
Definition ConstString.h:40
bool IsEmpty() const
Test for empty string.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t GetByteSize() const override
Get the number of bytes in the data buffer.
An data extractor class.
Execution context objects refer to objects in the execution of the program that is being debugged.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A class to manage flags.
Definition Flags.h:22
static Language * FindPlugin(lldb::LanguageType language)
Definition Language.cpp:84
std::shared_ptr< ClassDescriptor > ClassDescriptorSP
static ObjCLanguageRuntime * Get(Process &process)
virtual ClassDescriptorSP GetClassDescriptor(ValueObject &in_value)
A plug-in interface definition class for debugging a process.
Definition Process.h:357
virtual size_t ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
Definition Process.cpp:2029
uint32_t GetAddressByteSize() const
Definition Process.cpp:3916
An error handling class.
Definition Status.h:118
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition Stream.cpp:134
uint32_t CalculateNumChildrenIgnoringErrors(uint32_t max=UINT32_MAX)
SyntheticChildrenFrontEnd(ValueObject &backend)
lldb::ValueObjectSP CreateChildValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type)
lldb::LanguageType GetLanguage() const
lldb::ProcessSP GetProcessSP() const
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
uint8_t * GetBytes()
Get a pointer to the data.
Definition DataBuffer.h:108
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:673
lldb::ChildCacheState Update() override
This function is assumed to always succeed and if it fails, the front-end should know to deal with it...
Definition NSSet.cpp:638
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:630
GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:611
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:530
lldb::ChildCacheState Update() override
This function is assumed to always succeed and if it fails, the front-end should know to deal with it...
Definition NSSet.cpp:511
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:504
NSCFSetSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:498
std::vector< SetItemDescriptor > m_children
Definition NSSet.cpp:101
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:423
NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:368
std::vector< SetItemDescriptor > m_children
Definition NSSet.cpp:75
lldb::ChildCacheState Update() override
This function is assumed to always succeed and if it fails, the front-end should know to deal with it...
Definition NSSet.cpp:390
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:383
static std::map< ConstString, CXXFunctionSummaryFormat::Callback > & GetAdditionalSummaries()
Definition NSSet.cpp:28
static std::map< ConstString, CXXSyntheticChildren::CreateFrontEndCallback > & GetAdditionalSynthetics()
Definition NSSet.cpp:34
#define LLDB_INVALID_ADDRESS
GenericNSSetMSyntheticFrontEnd< DataDescriptor_32, DataDescriptor_64 > NSSetMSyntheticFrontEnd
Definition NSSet.cpp:146
GenericNSSetMSyntheticFrontEnd< DataDescriptor_32, DataDescriptor_64 > NSSetMSyntheticFrontEnd
Definition NSSet.cpp:165
GenericNSSetMSyntheticFrontEnd< DataDescriptor_32, DataDescriptor_64 > NSSetMSyntheticFrontEnd
Definition NSSet.cpp:188
uint64_t __NSSetMSize(lldb_private::Process &process, lldb::addr_t valobj_addr, Status &error)
Definition NSSet.cpp:207
uint64_t __NSSetMSize_Impl(lldb_private::Process &process, lldb::addr_t valobj_addr, Status &error)
Definition NSSet.cpp:193
bool NSSetSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition NSSet.cpp:220
SyntheticChildrenFrontEnd * NSSetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
A class that represents a running process on the host machine.
ChildCacheState
Specifies if children need to be re-computed after a call to SyntheticChildrenFrontEnd::Update.
@ eRefetch
Children need to be recomputed dynamically.
@ eReuse
Children did not change and don't need to be recomputed; re-use what we computed the last time we cal...
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::Process > ProcessSP
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
uint64_t addr_t
Definition lldb-types.h:80