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
16#include "lldb/Target/Target.h"
18#include "lldb/Utility/Endian.h"
19#include "lldb/Utility/Status.h"
20#include "lldb/Utility/Stream.h"
23
24using namespace lldb;
25using namespace lldb_private;
26using namespace lldb_private::formatters;
27
28std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
30 static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map;
31 return g_map;
32}
33
34std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
36 static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>
37 g_map;
38 return g_map;
39}
40
41namespace lldb_private {
42namespace formatters {
44public:
46
47 ~NSSetISyntheticFrontEnd() override;
48
49 llvm::Expected<uint32_t> CalculateNumChildren() override;
50
51 lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override;
52
54
55private:
57 uint32_t _used : 26;
58 uint32_t _szidx : 6;
59 };
60
62 uint64_t _used : 58;
63 uint32_t _szidx : 6;
64 };
65
70
72 uint8_t m_ptr_size = 8;
76 std::vector<SetItemDescriptor> m_children;
77};
78
104
105template <typename D32, typename D64>
131
132namespace Foundation1300 {
134 uint32_t _used : 26;
135 uint32_t _size;
136 uint32_t _mutations;
137 uint32_t _objs_addr;
138 };
139
141 uint64_t _used : 58;
142 uint64_t _size;
143 uint64_t _mutations;
144 uint64_t _objs_addr;
145 };
146
149}
150
151namespace Foundation1428 {
152 struct DataDescriptor_32 {
153 uint32_t _used : 26;
154 uint32_t _size;
155 uint32_t _objs_addr;
156 uint32_t _mutations;
157 };
158
159 struct DataDescriptor_64 {
160 uint64_t _used : 58;
161 uint64_t _size;
162 uint64_t _objs_addr;
163 uint64_t _mutations;
164 };
165
168}
169
170namespace Foundation1437 {
171 struct DataDescriptor_32 {
172 uint32_t _cow;
173 // __table storage
174 uint32_t _objs_addr;
175 uint32_t _muts;
176 uint32_t _used : 26;
177 uint32_t _szidx : 6;
178 };
179
180 struct DataDescriptor_64 {
181 uint64_t _cow;
182 // __Table storage
183 uint64_t _objs_addr;
184 uint32_t _muts;
185 uint32_t _used : 26;
186 uint32_t _szidx : 6;
187 };
188
191
192 template <typename DD>
193 uint64_t
195 Status &error) {
196 const lldb::addr_t start_of_descriptor =
197 valobj_addr + process.GetAddressByteSize();
198 DD descriptor = DD();
199 process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor),
200 error);
201 if (error.Fail()) {
202 return 0;
203 }
204 return descriptor._used;
205 }
206
207 uint64_t
209 Status &error) {
210 if (process.GetAddressByteSize() == 4) {
211 return __NSSetMSize_Impl<DataDescriptor_32>(process, valobj_addr, error);
212 } else {
213 return __NSSetMSize_Impl<DataDescriptor_64>(process, valobj_addr, error);
214 }
215 }
216 } // namespace Foundation1437
217} // namespace formatters
218} // namespace lldb_private
219
220template <bool cf_style>
222 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
223 static constexpr llvm::StringLiteral g_TypeHint("NSSet");
224
225 ProcessSP process_sp = valobj.GetProcessSP();
226 if (!process_sp)
227 return false;
228
229 ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
230
231 if (!runtime)
232 return false;
233
235 runtime->GetClassDescriptor(valobj));
236
237 if (!descriptor || !descriptor->IsValid())
238 return false;
239
240 uint32_t ptr_size = process_sp->GetAddressByteSize();
241 bool is_64bit = (ptr_size == 8);
242
243 lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
244
245 if (!valobj_addr)
246 return false;
247
248 uint64_t value = 0;
249
250 ConstString class_name(descriptor->GetClassName());
251
252 static const ConstString g_SetI("__NSSetI");
253 static const ConstString g_OrderedSetI("__NSOrderedSetI");
254 static const ConstString g_SetM("__NSSetM");
255 static const ConstString g_SetCF("__NSCFSet");
256 static const ConstString g_SetCFRef("CFSetRef");
257
258 if (class_name.IsEmpty())
259 return false;
260
261 if (class_name == g_SetI || class_name == g_OrderedSetI) {
263 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
264 ptr_size, 0, error);
265 if (error.Fail())
266 return false;
267 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
268 } else if (class_name == g_SetM) {
269 AppleObjCRuntime *apple_runtime =
270 llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
272 if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
273 value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error);
274 } else {
275 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
276 ptr_size, 0, error);
277 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
278 }
279 if (error.Fail())
280 return false;
281 } else if (class_name == g_SetCF || class_name == g_SetCFRef) {
282 ExecutionContext exe_ctx(process_sp);
283 CFBasicHash cfbh;
284 if (!cfbh.Update(valobj_addr, exe_ctx))
285 return false;
286 value = cfbh.GetCount();
287 } else {
289 auto iter = map.find(class_name), end = map.end();
290 if (iter != end)
291 return iter->second(valobj, stream, options);
292 else
293 return false;
294 }
295
296 llvm::StringRef prefix, suffix;
297 if (Language *language = Language::FindPlugin(options.GetLanguage()))
298 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
299
300 stream << prefix;
301 stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? "" : "s");
302 stream << suffix;
303 return true;
304}
305
308 CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) {
309 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
310 if (!process_sp)
311 return nullptr;
312 ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
313 if (!runtime)
314 return nullptr;
315
316 CompilerType valobj_type(valobj_sp->GetCompilerType());
317 Flags flags(valobj_type.GetTypeInfo());
318
319 if (flags.IsClear(eTypeIsPointer)) {
321 valobj_sp = valobj_sp->AddressOf(error);
322 if (error.Fail() || !valobj_sp)
323 return nullptr;
324 }
325
327 runtime->GetClassDescriptor(*valobj_sp));
328
329 if (!descriptor || !descriptor->IsValid())
330 return nullptr;
331
332 ConstString class_name = descriptor->GetClassName();
333
334 static const ConstString g_SetI("__NSSetI");
335 static const ConstString g_OrderedSetI("__NSOrderedSetI");
336 static const ConstString g_SetM("__NSSetM");
337 static const ConstString g_SetCF("__NSCFSet");
338 static const ConstString g_SetCFRef("CFSetRef");
339
340 if (class_name.IsEmpty())
341 return nullptr;
342
343 if (class_name == g_SetI || class_name == g_OrderedSetI) {
344 return (new NSSetISyntheticFrontEnd(valobj_sp));
345 } else if (class_name == g_SetM) {
346 AppleObjCRuntime *apple_runtime =
347 llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
348 if (apple_runtime) {
349 if (apple_runtime->GetFoundationVersion() >= 1437)
350 return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp));
351 else if (apple_runtime->GetFoundationVersion() >= 1428)
352 return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp));
353 else
354 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
355 } else {
356 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
357 }
358 } else if (class_name == g_SetCF || class_name == g_SetCFRef) {
359 return (new NSCFSetSyntheticFrontEnd(valobj_sp));
360 } else {
362 auto iter = map.find(class_name), end = map.end();
363 if (iter != end)
364 return iter->second(synth, valobj_sp);
365 return nullptr;
366 }
367}
368
375
382
383llvm::Expected<uint32_t>
389
392 m_children.clear();
393 delete m_data_32;
394 m_data_32 = nullptr;
395 delete m_data_64;
396 m_data_64 = nullptr;
397 m_ptr_size = 0;
398 ValueObjectSP valobj_sp = m_backend.GetSP();
399 if (!valobj_sp)
401 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
402 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
403 if (!process_sp)
405 m_ptr_size = process_sp->GetAddressByteSize();
406 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
408 if (m_ptr_size == 4) {
410 process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32),
411 error);
412 } else {
414 process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64),
415 error);
416 }
417 if (error.Fail())
419 m_data_ptr = data_location + m_ptr_size;
421}
422
425 uint32_t idx) {
426 uint32_t num_children = CalculateNumChildrenIgnoringErrors();
427
428 if (idx >= num_children)
429 return lldb::ValueObjectSP();
430
431 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
432 if (!process_sp)
433 return lldb::ValueObjectSP();
434
435 if (m_children.empty()) {
436 // do the scan phase
437 lldb::addr_t obj_at_idx = 0;
438
439 uint32_t tries = 0;
440 uint32_t test_idx = 0;
441
442 while (tries < num_children) {
443 obj_at_idx = m_data_ptr + (test_idx * m_ptr_size);
444 if (!process_sp)
445 return lldb::ValueObjectSP();
447 obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
448 if (error.Fail())
449 return lldb::ValueObjectSP();
450
451 test_idx++;
452
453 if (!obj_at_idx)
454 continue;
455 tries++;
456
457 SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
458
459 m_children.push_back(descriptor);
460 }
461 }
462
463 if (idx >= m_children.size()) // should never happen
464 return lldb::ValueObjectSP();
465
466 SetItemDescriptor &set_item = m_children[idx];
467 if (!set_item.valobj_sp) {
468 auto ptr_size = process_sp->GetAddressByteSize();
469 DataBufferHeap buffer(ptr_size, 0);
470 switch (ptr_size) {
471 case 0: // architecture has no clue - fail
472 return lldb::ValueObjectSP();
473 case 4:
474 *reinterpret_cast<uint32_t *>(buffer.GetBytes()) =
475 static_cast<uint32_t>(set_item.item_ptr);
476 break;
477 case 8:
478 *reinterpret_cast<uint64_t *>(buffer.GetBytes()) =
479 static_cast<uint64_t>(set_item.item_ptr);
480 break;
481 default:
482 lldbassert(false && "pointer size is not 4 nor 8");
483 }
484 StreamString idx_name;
485 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
486
487 DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
488 process_sp->GetByteOrder(),
489 process_sp->GetAddressByteSize());
490
492 idx_name.GetString(), data, m_exe_ctx_ref,
493 m_backend.GetCompilerType().GetBasicTypeFromAST(
495 }
496 return set_item.valobj_sp;
497}
498
503
504llvm::Expected<uint32_t>
506 if (!m_hashtable.IsValid())
507 return 0;
508 return m_hashtable.GetCount();
509}
510
513 m_children.clear();
514 ValueObjectSP valobj_sp = m_backend.GetSP();
515 m_ptr_size = 0;
516 if (!valobj_sp)
518 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
519
520 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
521 if (!process_sp)
523 m_ptr_size = process_sp->GetAddressByteSize();
524 m_order = process_sp->GetByteOrder();
525 return m_hashtable.Update(valobj_sp->GetValueAsUnsigned(0), m_exe_ctx_ref)
528}
529
532 uint32_t idx) {
533 lldb::addr_t m_values_ptr = m_hashtable.GetValuePointer();
534
535 const uint32_t num_children = CalculateNumChildrenIgnoringErrors();
536
537 if (idx >= num_children)
538 return lldb::ValueObjectSP();
539
540 if (m_children.empty()) {
541 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
542 if (!process_sp)
543 return lldb::ValueObjectSP();
544
546 lldb::addr_t val_at_idx = 0;
547
548 uint32_t tries = 0;
549 uint32_t test_idx = 0;
550
551 // Iterate over inferior memory, reading value pointers by shifting the
552 // cursor by test_index * m_ptr_size. Returns an empty ValueObject if a read
553 // fails, otherwise, continue until the number of tries matches the number
554 // of childen.
555 while (tries < num_children) {
556 val_at_idx = m_values_ptr + (test_idx * m_ptr_size);
557
558 val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
559 if (error.Fail())
560 return lldb::ValueObjectSP();
561
562 test_idx++;
563
564 if (!val_at_idx)
565 continue;
566 tries++;
567
568 SetItemDescriptor descriptor = {val_at_idx, lldb::ValueObjectSP()};
569
570 m_children.push_back(descriptor);
571 }
572 }
573
574 if (idx >= m_children.size()) // should never happen
575 return lldb::ValueObjectSP();
576
577 SetItemDescriptor &set_item = m_children[idx];
578 if (!set_item.valobj_sp) {
579
581
582 switch (m_ptr_size) {
583 case 0: // architecture has no clue - fail
584 return lldb::ValueObjectSP();
585 case 4:
586 *reinterpret_cast<uint32_t *>(buffer_sp->GetBytes()) =
587 static_cast<uint32_t>(set_item.item_ptr);
588 break;
589 case 8:
590 *reinterpret_cast<uint64_t *>(buffer_sp->GetBytes()) =
591 static_cast<uint64_t>(set_item.item_ptr);
592 break;
593 default:
594 lldbassert(false && "pointer size is not 4 nor 8");
595 }
596 StreamString idx_name;
597 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
598
599 DataExtractor data(buffer_sp, m_order, m_ptr_size);
600
602 idx_name.GetString(), data, m_exe_ctx_ref,
603 m_backend.GetCompilerType().GetBasicTypeFromAST(
605 }
606
607 return set_item.valobj_sp;
608}
609
610template <typename D32, typename D64>
614 m_data_32(nullptr), m_data_64(nullptr) {
615 if (valobj_sp)
616 Update();
617}
618
619template <typename D32, typename D64>
622 delete m_data_32;
623 m_data_32 = nullptr;
624 delete m_data_64;
625 m_data_64 = nullptr;
626}
627
628template <typename D32, typename D64>
629llvm::Expected<uint32_t>
632 if (!m_data_32 && !m_data_64)
633 return 0;
634 return (m_data_32 ? (uint32_t)m_data_32->_used : (uint32_t)m_data_64->_used);
635}
636
637template <typename D32, typename D64>
640 m_children.clear();
641 ValueObjectSP valobj_sp = m_backend.GetSP();
642 m_ptr_size = 0;
643 delete m_data_32;
644 m_data_32 = nullptr;
645 delete m_data_64;
646 m_data_64 = nullptr;
647 if (!valobj_sp)
649 if (!valobj_sp)
651 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
652 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
653 if (!process_sp)
655 m_ptr_size = process_sp->GetAddressByteSize();
656 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
658 if (m_ptr_size == 4) {
659 m_data_32 = new D32();
660 process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
661 error);
662 } else {
663 m_data_64 = new D64();
664 process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
665 error);
666 }
667 return error.Success() ? lldb::ChildCacheState::eReuse
669}
670
671template <typename D32, typename D64>
675 lldb::addr_t m_objs_addr =
676 (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
677
678 uint32_t num_children = CalculateNumChildrenIgnoringErrors();
679
680 if (idx >= num_children)
681 return lldb::ValueObjectSP();
682
683 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
684 if (!process_sp)
685 return lldb::ValueObjectSP();
686
687 if (m_children.empty()) {
688 // do the scan phase
689 lldb::addr_t obj_at_idx = 0;
690
691 uint32_t tries = 0;
692 uint32_t test_idx = 0;
693
694 while (tries < num_children) {
695 obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
696 if (!process_sp)
697 return lldb::ValueObjectSP();
699 obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error);
700 if (error.Fail())
701 return lldb::ValueObjectSP();
702
703 test_idx++;
704
705 if (!obj_at_idx)
706 continue;
707 tries++;
708
709 SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
710
711 m_children.push_back(descriptor);
712 }
713 }
714
715 if (idx >= m_children.size()) // should never happen
716 return lldb::ValueObjectSP();
717
718 SetItemDescriptor &set_item = m_children[idx];
719 if (!set_item.valobj_sp) {
720 auto ptr_size = process_sp->GetAddressByteSize();
721 DataBufferHeap buffer(ptr_size, 0);
722 switch (ptr_size) {
723 case 0: // architecture has no clue?? - fail
724 return lldb::ValueObjectSP();
725 case 4:
726 *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
727 break;
728 case 8:
729 *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
730 break;
731 default:
732 assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
733 }
734 StreamString idx_name;
735 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
736
737 DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
738 process_sp->GetByteOrder(),
739 process_sp->GetAddressByteSize());
740
742 idx_name.GetString(), data, m_exe_ctx_ref,
743 m_backend.GetCompilerType().GetBasicTypeFromAST(
745 }
746 return set_item.valobj_sp;
747}
748
750 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options);
751
753 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:354
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:1907
uint32_t GetAddressByteSize() const
Definition Process.cpp:3725
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)
lldb::ValueObjectSP CreateValueObjectFromData(llvm::StringRef name, const DataExtractor &data, const ExecutionContext &exe_ctx, CompilerType type)
SyntheticChildrenFrontEnd(ValueObject &backend)
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:674
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:639
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:631
GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:612
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:531
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:512
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:505
NSCFSetSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:499
std::vector< SetItemDescriptor > m_children
Definition NSSet.cpp:102
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:424
NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:369
std::vector< SetItemDescriptor > m_children
Definition NSSet.cpp:76
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:391
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:384
static std::map< ConstString, CXXFunctionSummaryFormat::Callback > & GetAdditionalSummaries()
Definition NSSet.cpp:29
static std::map< ConstString, CXXSyntheticChildren::CreateFrontEndCallback > & GetAdditionalSynthetics()
Definition NSSet.cpp:35
#define LLDB_INVALID_ADDRESS
GenericNSSetMSyntheticFrontEnd< DataDescriptor_32, DataDescriptor_64 > NSSetMSyntheticFrontEnd
Definition NSSet.cpp:147
GenericNSSetMSyntheticFrontEnd< DataDescriptor_32, DataDescriptor_64 > NSSetMSyntheticFrontEnd
Definition NSSet.cpp:166
GenericNSSetMSyntheticFrontEnd< DataDescriptor_32, DataDescriptor_64 > NSSetMSyntheticFrontEnd
Definition NSSet.cpp:189
uint64_t __NSSetMSize(lldb_private::Process &process, lldb::addr_t valobj_addr, Status &error)
Definition NSSet.cpp:208
uint64_t __NSSetMSize_Impl(lldb_private::Process &process, lldb::addr_t valobj_addr, Status &error)
Definition NSSet.cpp:194
bool NSSetSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition NSSet.cpp:221
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