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/Support/Error.h"
24
25using namespace lldb;
26using namespace lldb_private;
27using namespace lldb_private::formatters;
28
29std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
31 static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map;
32 return g_map;
33}
34
35std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
37 static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>
38 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 ConstString class_name(descriptor->GetClassName());
252 llvm::StringRef class_name_ref(class_name.GetStringRef());
253
254 static constexpr llvm::StringLiteral g_SetI("__NSSetI");
255 static constexpr llvm::StringLiteral g_OrderedSetI("__NSOrderedSetI");
256 static constexpr llvm::StringLiteral g_SetM("__NSSetM");
257 static constexpr llvm::StringLiteral g_SetCF("__NSCFSet");
258 static constexpr llvm::StringLiteral g_SetCFRef("CFSetRef");
259
260 if (class_name_ref.empty())
261 return false;
262
263 if (class_name_ref == g_SetI || class_name_ref == g_OrderedSetI) {
265 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
266 ptr_size, 0, error);
267 if (error.Fail())
268 return false;
269 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
270 } else if (class_name_ref == g_SetM) {
271 AppleObjCRuntime *apple_runtime =
272 llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
274 if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
275 value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error);
276 } else {
277 value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
278 ptr_size, 0, error);
279 value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
280 }
281 if (error.Fail())
282 return false;
283 } else if (class_name_ref == g_SetCF || class_name_ref == g_SetCFRef) {
284 ExecutionContext exe_ctx(process_sp);
285 CFBasicHash cfbh;
286 if (!cfbh.Update(valobj_addr, exe_ctx))
287 return false;
288 value = cfbh.GetCount();
289 } else {
291 auto iter = map.find(class_name), end = map.end();
292 if (iter != end)
293 return iter->second(valobj, stream, options);
294 else
295 return false;
296 }
297
298 llvm::StringRef prefix, suffix;
299 if (Language *language = Language::FindPlugin(options.GetLanguage()))
300 std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
301
302 stream << prefix;
303 stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? "" : "s");
304 stream << suffix;
305 return true;
306}
307
310 CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) {
311 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
312 if (!process_sp)
313 return nullptr;
314 ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
315 if (!runtime)
316 return nullptr;
317
318 CompilerType valobj_type(valobj_sp->GetCompilerType());
319 Flags flags(valobj_type.GetTypeInfo());
320
321 if (flags.IsClear(eTypeIsPointer)) {
323 valobj_sp = valobj_sp->AddressOf(error);
324 if (error.Fail() || !valobj_sp)
325 return nullptr;
326 }
327
329 runtime->GetClassDescriptor(*valobj_sp));
330
331 if (!descriptor || !descriptor->IsValid())
332 return nullptr;
333
334 ConstString class_name = descriptor->GetClassName();
335 llvm::StringRef class_name_ref(class_name.GetStringRef());
336
337 static constexpr llvm::StringLiteral g_SetI("__NSSetI");
338 static constexpr llvm::StringLiteral g_OrderedSetI("__NSOrderedSetI");
339 static constexpr llvm::StringLiteral g_SetM("__NSSetM");
340 static constexpr llvm::StringLiteral g_SetCF("__NSCFSet");
341 static constexpr llvm::StringLiteral g_SetCFRef("CFSetRef");
342
343 if (class_name_ref.empty())
344 return nullptr;
345
346 if (class_name_ref == g_SetI || class_name_ref == g_OrderedSetI) {
347 return (new NSSetISyntheticFrontEnd(valobj_sp));
348 } else if (class_name_ref == g_SetM) {
349 AppleObjCRuntime *apple_runtime =
350 llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
351 if (apple_runtime) {
352 if (apple_runtime->GetFoundationVersion() >= 1437)
353 return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp));
354 else if (apple_runtime->GetFoundationVersion() >= 1428)
355 return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp));
356 else
357 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
358 } else {
359 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp));
360 }
361 } else if (class_name_ref == g_SetCF || class_name_ref == g_SetCFRef) {
362 return (new NSCFSetSyntheticFrontEnd(valobj_sp));
363 } else {
365 auto iter = map.find(class_name), end = map.end();
366 if (iter != end)
367 return iter->second(synth, valobj_sp);
368 return nullptr;
369 }
370}
371
378
385
386llvm::Expected<uint32_t>
392
395 m_children.clear();
396 delete m_data_32;
397 m_data_32 = nullptr;
398 delete m_data_64;
399 m_data_64 = nullptr;
400 m_ptr_size = 0;
401 ValueObjectSP valobj_sp = m_backend.GetSP();
402 if (!valobj_sp)
404 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
405 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
406 if (!process_sp)
408 m_ptr_size = process_sp->GetAddressByteSize();
409 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
411 if (m_ptr_size == 4) {
413 process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32),
414 error);
415 } else {
417 process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64),
418 error);
419 }
420 if (error.Fail())
422 m_data_ptr = data_location + m_ptr_size;
424}
425
428 uint32_t idx) {
429 uint32_t num_children = CalculateNumChildrenIgnoringErrors();
430
431 if (idx >= num_children)
432 return lldb::ValueObjectSP();
433
434 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
435 if (!process_sp)
436 return lldb::ValueObjectSP();
437
438 if (m_children.empty()) {
439 // do the scan phase
440 lldb::addr_t obj_at_idx = 0;
441
442 uint32_t tries = 0;
443 uint32_t test_idx = 0;
444
445 while (tries < num_children) {
446 obj_at_idx = m_data_ptr + (test_idx * m_ptr_size);
447 if (!process_sp)
448 return lldb::ValueObjectSP();
449 llvm::Expected<lldb::addr_t> obj_at_idx_or_err =
450 process_sp->ReadPointerFromMemory(obj_at_idx);
451 if (!obj_at_idx_or_err) {
452 llvm::consumeError(obj_at_idx_or_err.takeError());
453 return lldb::ValueObjectSP();
454 }
455 obj_at_idx = *obj_at_idx_or_err;
456
457 test_idx++;
458
459 if (!obj_at_idx)
460 continue;
461 tries++;
462
463 SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
464
465 m_children.push_back(descriptor);
466 }
467 }
468
469 if (idx >= m_children.size()) // should never happen
470 return lldb::ValueObjectSP();
471
472 SetItemDescriptor &set_item = m_children[idx];
473 if (!set_item.valobj_sp) {
474 auto ptr_size = process_sp->GetAddressByteSize();
475 DataBufferHeap buffer(ptr_size, 0);
476 switch (ptr_size) {
477 case 0: // architecture has no clue - fail
478 return lldb::ValueObjectSP();
479 case 4:
480 *reinterpret_cast<uint32_t *>(buffer.GetBytes()) =
481 static_cast<uint32_t>(set_item.item_ptr);
482 break;
483 case 8:
484 *reinterpret_cast<uint64_t *>(buffer.GetBytes()) =
485 static_cast<uint64_t>(set_item.item_ptr);
486 break;
487 default:
488 lldbassert(false && "pointer size is not 4 nor 8");
489 }
490 StreamString idx_name;
491 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
492
493 DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
494 process_sp->GetByteOrder(),
495 process_sp->GetAddressByteSize());
496
498 idx_name.GetString(), data, m_exe_ctx_ref,
499 m_backend.GetCompilerType().GetBasicTypeFromAST(
501 }
502 return set_item.valobj_sp;
503}
504
509
510llvm::Expected<uint32_t>
512 if (!m_hashtable.IsValid())
513 return 0;
514 return m_hashtable.GetCount();
515}
516
519 m_children.clear();
520 ValueObjectSP valobj_sp = m_backend.GetSP();
521 m_ptr_size = 0;
522 if (!valobj_sp)
524 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
525
526 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
527 if (!process_sp)
529 m_ptr_size = process_sp->GetAddressByteSize();
530 m_order = process_sp->GetByteOrder();
531 return m_hashtable.Update(valobj_sp->GetValueAsUnsigned(0), m_exe_ctx_ref)
534}
535
538 uint32_t idx) {
539 lldb::addr_t m_values_ptr = m_hashtable.GetValuePointer();
540
541 const uint32_t num_children = CalculateNumChildrenIgnoringErrors();
542
543 if (idx >= num_children)
544 return lldb::ValueObjectSP();
545
546 if (m_children.empty()) {
547 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
548 if (!process_sp)
549 return lldb::ValueObjectSP();
550
551 lldb::addr_t val_at_idx = 0;
552
553 uint32_t tries = 0;
554 uint32_t test_idx = 0;
555
556 // Iterate over inferior memory, reading value pointers by shifting the
557 // cursor by test_index * m_ptr_size. Returns an empty ValueObject if a read
558 // fails, otherwise, continue until the number of tries matches the number
559 // of childen.
560 while (tries < num_children) {
561 val_at_idx = m_values_ptr + (test_idx * m_ptr_size);
562
563 llvm::Expected<lldb::addr_t> val_at_idx_or_err =
564 process_sp->ReadPointerFromMemory(val_at_idx);
565 if (!val_at_idx_or_err) {
566 llvm::consumeError(val_at_idx_or_err.takeError());
567 return lldb::ValueObjectSP();
568 }
569 val_at_idx = *val_at_idx_or_err;
570
571 test_idx++;
572
573 if (!val_at_idx)
574 continue;
575 tries++;
576
577 SetItemDescriptor descriptor = {val_at_idx, lldb::ValueObjectSP()};
578
579 m_children.push_back(descriptor);
580 }
581 }
582
583 if (idx >= m_children.size()) // should never happen
584 return lldb::ValueObjectSP();
585
586 SetItemDescriptor &set_item = m_children[idx];
587 if (!set_item.valobj_sp) {
588
590
591 switch (m_ptr_size) {
592 case 0: // architecture has no clue - fail
593 return lldb::ValueObjectSP();
594 case 4:
595 *reinterpret_cast<uint32_t *>(buffer_sp->GetBytes()) =
596 static_cast<uint32_t>(set_item.item_ptr);
597 break;
598 case 8:
599 *reinterpret_cast<uint64_t *>(buffer_sp->GetBytes()) =
600 static_cast<uint64_t>(set_item.item_ptr);
601 break;
602 default:
603 lldbassert(false && "pointer size is not 4 nor 8");
604 }
605 StreamString idx_name;
606 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
607
608 DataExtractor data(buffer_sp, m_order, m_ptr_size);
609
611 idx_name.GetString(), data, m_exe_ctx_ref,
612 m_backend.GetCompilerType().GetBasicTypeFromAST(
614 }
615
616 return set_item.valobj_sp;
617}
618
619template <typename D32, typename D64>
623 m_data_32(nullptr), m_data_64(nullptr) {
624 if (valobj_sp)
625 Update();
626}
627
628template <typename D32, typename D64>
631 delete m_data_32;
632 m_data_32 = nullptr;
633 delete m_data_64;
634 m_data_64 = nullptr;
635}
636
637template <typename D32, typename D64>
638llvm::Expected<uint32_t>
641 if (!m_data_32 && !m_data_64)
642 return 0;
643 return (m_data_32 ? (uint32_t)m_data_32->_used : (uint32_t)m_data_64->_used);
644}
645
646template <typename D32, typename D64>
649 m_children.clear();
650 ValueObjectSP valobj_sp = m_backend.GetSP();
651 m_ptr_size = 0;
652 delete m_data_32;
653 m_data_32 = nullptr;
654 delete m_data_64;
655 m_data_64 = nullptr;
656 if (!valobj_sp)
658 if (!valobj_sp)
660 m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
661 lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
662 if (!process_sp)
664 m_ptr_size = process_sp->GetAddressByteSize();
665 uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
667 if (m_ptr_size == 4) {
668 m_data_32 = new D32();
669 process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
670 error);
671 } else {
672 m_data_64 = new D64();
673 process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
674 error);
675 }
676 return error.Success() ? lldb::ChildCacheState::eReuse
678}
679
680template <typename D32, typename D64>
684 lldb::addr_t m_objs_addr =
685 (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
686
687 uint32_t num_children = CalculateNumChildrenIgnoringErrors();
688
689 if (idx >= num_children)
690 return lldb::ValueObjectSP();
691
692 ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
693 if (!process_sp)
694 return lldb::ValueObjectSP();
695
696 if (m_children.empty()) {
697 // do the scan phase
698 lldb::addr_t obj_at_idx = 0;
699
700 uint32_t tries = 0;
701 uint32_t test_idx = 0;
702
703 while (tries < num_children) {
704 obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
705 if (!process_sp)
706 return lldb::ValueObjectSP();
707 llvm::Expected<lldb::addr_t> obj_at_idx_or_err =
708 process_sp->ReadPointerFromMemory(obj_at_idx);
709 if (!obj_at_idx_or_err) {
710 llvm::consumeError(obj_at_idx_or_err.takeError());
711 return lldb::ValueObjectSP();
712 }
713 obj_at_idx = *obj_at_idx_or_err;
714
715 test_idx++;
716
717 if (!obj_at_idx)
718 continue;
719 tries++;
720
721 SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()};
722
723 m_children.push_back(descriptor);
724 }
725 }
726
727 if (idx >= m_children.size()) // should never happen
728 return lldb::ValueObjectSP();
729
730 SetItemDescriptor &set_item = m_children[idx];
731 if (!set_item.valobj_sp) {
732 auto ptr_size = process_sp->GetAddressByteSize();
733 DataBufferHeap buffer(ptr_size, 0);
734 switch (ptr_size) {
735 case 0: // architecture has no clue?? - fail
736 return lldb::ValueObjectSP();
737 case 4:
738 *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
739 break;
740 case 8:
741 *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
742 break;
743 default:
744 assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
745 }
746 StreamString idx_name;
747 idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
748
749 DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(),
750 process_sp->GetByteOrder(),
751 process_sp->GetAddressByteSize());
752
754 idx_name.GetString(), data, m_exe_ctx_ref,
755 m_backend.GetCompilerType().GetBasicTypeFromAST(
757 }
758 return set_item.valobj_sp;
759}
760
762 ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options);
763
765 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
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
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:367
virtual size_t ReadMemory(const ProcessAddress &process_addr, void *buf, size_t size, Status &error)
Read of memory from a process.
Definition Process.cpp:2081
uint32_t GetAddressByteSize() const
Definition Process.cpp:3977
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:683
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:648
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:640
GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:621
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:537
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:518
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:511
NSCFSetSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:505
std::vector< SetItemDescriptor > m_children
Definition NSSet.cpp:103
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override
Definition NSSet.cpp:427
NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
Definition NSSet.cpp:372
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:394
llvm::Expected< uint32_t > CalculateNumChildren() override
Definition NSSet.cpp:387
static std::map< ConstString, CXXFunctionSummaryFormat::Callback > & GetAdditionalSummaries()
Definition NSSet.cpp:30
static std::map< ConstString, CXXSyntheticChildren::CreateFrontEndCallback > & GetAdditionalSynthetics()
Definition NSSet.cpp:36
#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