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