1 //===-- NSSet.cpp ---------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
10 #include "CFBasicHash.h"
12 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h"
13 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
14 #include "lldb/Core/ValueObject.h"
15 #include "lldb/Core/ValueObjectConstResult.h"
16 #include "lldb/DataFormatters/FormattersHelpers.h"
17 #include "lldb/Target/Language.h"
18 #include "lldb/Target/Target.h"
19 #include "lldb/Utility/DataBufferHeap.h"
20 #include "lldb/Utility/Endian.h"
21 #include "lldb/Utility/Status.h"
22 #include "lldb/Utility/Stream.h"
25 using namespace lldb_private
;
26 using namespace lldb_private::formatters
;
28 std::map
<ConstString
, CXXFunctionSummaryFormat::Callback
> &
29 NSSet_Additionals::GetAdditionalSummaries() {
30 static std::map
<ConstString
, CXXFunctionSummaryFormat::Callback
> g_map
;
34 std::map
<ConstString
, CXXSyntheticChildren::CreateFrontEndCallback
> &
35 NSSet_Additionals::GetAdditionalSynthetics() {
36 static std::map
<ConstString
, CXXSyntheticChildren::CreateFrontEndCallback
>
41 namespace lldb_private
{
42 namespace formatters
{
43 class NSSetISyntheticFrontEnd
: public SyntheticChildrenFrontEnd
{
45 NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp
);
47 ~NSSetISyntheticFrontEnd() override
;
49 size_t CalculateNumChildren() override
;
51 lldb::ValueObjectSP
GetChildAtIndex(size_t idx
) override
;
53 bool Update() override
;
55 bool MightHaveChildren() override
;
57 size_t GetIndexOfChildWithName(ConstString name
) override
;
60 struct DataDescriptor_32
{
65 struct DataDescriptor_64
{
70 struct SetItemDescriptor
{
71 lldb::addr_t item_ptr
;
72 lldb::ValueObjectSP valobj_sp
;
75 ExecutionContextRef m_exe_ctx_ref
;
76 uint8_t m_ptr_size
= 8;
77 DataDescriptor_32
*m_data_32
= nullptr;
78 DataDescriptor_64
*m_data_64
= nullptr;
79 lldb::addr_t m_data_ptr
= LLDB_INVALID_ADDRESS
;
80 std::vector
<SetItemDescriptor
> m_children
;
83 class NSCFSetSyntheticFrontEnd
: public SyntheticChildrenFrontEnd
{
85 NSCFSetSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp
);
87 size_t CalculateNumChildren() override
;
89 lldb::ValueObjectSP
GetChildAtIndex(size_t idx
) override
;
91 bool Update() override
;
93 bool MightHaveChildren() override
;
95 size_t GetIndexOfChildWithName(ConstString name
) override
;
98 struct SetItemDescriptor
{
99 lldb::addr_t item_ptr
;
100 lldb::ValueObjectSP valobj_sp
;
103 ExecutionContextRef m_exe_ctx_ref
;
104 uint8_t m_ptr_size
= 8;
105 lldb::ByteOrder m_order
= lldb::eByteOrderInvalid
;
107 CFBasicHash m_hashtable
;
109 CompilerType m_pair_type
;
110 std::vector
<SetItemDescriptor
> m_children
;
113 template <typename D32
, typename D64
>
114 class GenericNSSetMSyntheticFrontEnd
: public SyntheticChildrenFrontEnd
{
116 GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp
);
118 ~GenericNSSetMSyntheticFrontEnd() override
;
120 size_t CalculateNumChildren() override
;
122 lldb::ValueObjectSP
GetChildAtIndex(size_t idx
) override
;
124 bool Update() override
;
126 bool MightHaveChildren() override
;
128 size_t GetIndexOfChildWithName(ConstString name
) override
;
132 struct SetItemDescriptor
{
133 lldb::addr_t item_ptr
;
134 lldb::ValueObjectSP valobj_sp
;
137 ExecutionContextRef m_exe_ctx_ref
;
138 uint8_t m_ptr_size
= 8;
141 std::vector
<SetItemDescriptor
> m_children
;
144 namespace Foundation1300
{
145 struct DataDescriptor_32
{
152 struct DataDescriptor_64
{
159 using NSSetMSyntheticFrontEnd
=
160 GenericNSSetMSyntheticFrontEnd
<DataDescriptor_32
, DataDescriptor_64
>;
163 namespace Foundation1428
{
164 struct DataDescriptor_32
{
171 struct DataDescriptor_64
{
178 using NSSetMSyntheticFrontEnd
=
179 GenericNSSetMSyntheticFrontEnd
<DataDescriptor_32
, DataDescriptor_64
>;
182 namespace Foundation1437
{
183 struct DataDescriptor_32
{
192 struct DataDescriptor_64
{
201 using NSSetMSyntheticFrontEnd
=
202 GenericNSSetMSyntheticFrontEnd
<DataDescriptor_32
, DataDescriptor_64
>;
204 template <typename DD
>
206 __NSSetMSize_Impl(lldb_private::Process
&process
, lldb::addr_t valobj_addr
,
208 const lldb::addr_t start_of_descriptor
=
209 valobj_addr
+ process
.GetAddressByteSize();
210 DD descriptor
= DD();
211 process
.ReadMemory(start_of_descriptor
, &descriptor
, sizeof(descriptor
),
216 return descriptor
._used
;
220 __NSSetMSize(lldb_private::Process
&process
, lldb::addr_t valobj_addr
,
222 if (process
.GetAddressByteSize() == 4) {
223 return __NSSetMSize_Impl
<DataDescriptor_32
>(process
, valobj_addr
, error
);
225 return __NSSetMSize_Impl
<DataDescriptor_64
>(process
, valobj_addr
, error
);
230 class NSSetCodeRunningSyntheticFrontEnd
: public SyntheticChildrenFrontEnd
{
232 NSSetCodeRunningSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp
);
234 ~NSSetCodeRunningSyntheticFrontEnd() override
;
236 size_t CalculateNumChildren() override
;
238 lldb::ValueObjectSP
GetChildAtIndex(size_t idx
) override
;
240 bool Update() override
;
242 bool MightHaveChildren() override
;
244 size_t GetIndexOfChildWithName(ConstString name
) override
;
246 } // namespace formatters
247 } // namespace lldb_private
249 template <bool cf_style
>
250 bool lldb_private::formatters::NSSetSummaryProvider(
251 ValueObject
&valobj
, Stream
&stream
, const TypeSummaryOptions
&options
) {
252 static constexpr llvm::StringLiteral
g_TypeHint("NSSet");
254 ProcessSP process_sp
= valobj
.GetProcessSP();
258 ObjCLanguageRuntime
*runtime
= ObjCLanguageRuntime::Get(*process_sp
);
263 ObjCLanguageRuntime::ClassDescriptorSP
descriptor(
264 runtime
->GetClassDescriptor(valobj
));
266 if (!descriptor
|| !descriptor
->IsValid())
269 uint32_t ptr_size
= process_sp
->GetAddressByteSize();
270 bool is_64bit
= (ptr_size
== 8);
272 lldb::addr_t valobj_addr
= valobj
.GetValueAsUnsigned(0);
279 ConstString
class_name(descriptor
->GetClassName());
281 static const ConstString
g_SetI("__NSSetI");
282 static const ConstString
g_OrderedSetI("__NSOrderedSetI");
283 static const ConstString
g_SetM("__NSSetM");
284 static const ConstString
g_SetCF("__NSCFSet");
285 static const ConstString
g_SetCFRef("CFSetRef");
287 if (class_name
.IsEmpty())
290 if (class_name
== g_SetI
|| class_name
== g_OrderedSetI
) {
292 value
= process_sp
->ReadUnsignedIntegerFromMemory(valobj_addr
+ ptr_size
,
296 value
&= (is_64bit
? ~0xFC00000000000000UL
: ~0xFC000000U
);
297 } else if (class_name
== g_SetM
) {
298 AppleObjCRuntime
*apple_runtime
=
299 llvm::dyn_cast_or_null
<AppleObjCRuntime
>(runtime
);
301 if (apple_runtime
&& apple_runtime
->GetFoundationVersion() >= 1437) {
302 value
= Foundation1437::__NSSetMSize(*process_sp
, valobj_addr
, error
);
304 value
= process_sp
->ReadUnsignedIntegerFromMemory(valobj_addr
+ ptr_size
,
306 value
&= (is_64bit
? ~0xFC00000000000000UL
: ~0xFC000000U
);
310 } else if (class_name
== g_SetCF
|| class_name
== g_SetCFRef
) {
311 ExecutionContext
exe_ctx(process_sp
);
313 if (!cfbh
.Update(valobj_addr
, exe_ctx
))
315 value
= cfbh
.GetCount();
317 auto &map(NSSet_Additionals::GetAdditionalSummaries());
318 auto iter
= map
.find(class_name
), end
= map
.end();
320 return iter
->second(valobj
, stream
, options
);
325 llvm::StringRef prefix
, suffix
;
326 if (Language
*language
= Language::FindPlugin(options
.GetLanguage()))
327 std::tie(prefix
, suffix
) = language
->GetFormatterPrefixSuffix(g_TypeHint
);
330 stream
.Printf("%" PRIu64
" %s%s", value
, "element", value
== 1 ? "" : "s");
335 SyntheticChildrenFrontEnd
*
336 lldb_private::formatters::NSSetSyntheticFrontEndCreator(
337 CXXSyntheticChildren
*synth
, lldb::ValueObjectSP valobj_sp
) {
338 lldb::ProcessSP
process_sp(valobj_sp
->GetProcessSP());
341 ObjCLanguageRuntime
*runtime
= ObjCLanguageRuntime::Get(*process_sp
);
345 CompilerType
valobj_type(valobj_sp
->GetCompilerType());
346 Flags
flags(valobj_type
.GetTypeInfo());
348 if (flags
.IsClear(eTypeIsPointer
)) {
350 valobj_sp
= valobj_sp
->AddressOf(error
);
351 if (error
.Fail() || !valobj_sp
)
355 ObjCLanguageRuntime::ClassDescriptorSP
descriptor(
356 runtime
->GetClassDescriptor(*valobj_sp
));
358 if (!descriptor
|| !descriptor
->IsValid())
361 ConstString class_name
= descriptor
->GetClassName();
363 static const ConstString
g_SetI("__NSSetI");
364 static const ConstString
g_OrderedSetI("__NSOrderedSetI");
365 static const ConstString
g_SetM("__NSSetM");
366 static const ConstString
g_SetCF("__NSCFSet");
367 static const ConstString
g_SetCFRef("CFSetRef");
369 if (class_name
.IsEmpty())
372 if (class_name
== g_SetI
|| class_name
== g_OrderedSetI
) {
373 return (new NSSetISyntheticFrontEnd(valobj_sp
));
374 } else if (class_name
== g_SetM
) {
375 AppleObjCRuntime
*apple_runtime
=
376 llvm::dyn_cast_or_null
<AppleObjCRuntime
>(runtime
);
378 if (apple_runtime
->GetFoundationVersion() >= 1437)
379 return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp
));
380 else if (apple_runtime
->GetFoundationVersion() >= 1428)
381 return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp
));
383 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp
));
385 return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp
));
387 } else if (class_name
== g_SetCF
|| class_name
== g_SetCFRef
) {
388 return (new NSCFSetSyntheticFrontEnd(valobj_sp
));
390 auto &map(NSSet_Additionals::GetAdditionalSynthetics());
391 auto iter
= map
.find(class_name
), end
= map
.end();
393 return iter
->second(synth
, valobj_sp
);
398 lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd(
399 lldb::ValueObjectSP valobj_sp
)
400 : SyntheticChildrenFrontEnd(*valobj_sp
), m_exe_ctx_ref() {
405 lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd() {
413 lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName(
415 const char *item_name
= name
.GetCString();
416 uint32_t idx
= ExtractIndexFromString(item_name
);
417 if (idx
< UINT32_MAX
&& idx
>= CalculateNumChildren())
423 lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren() {
424 if (!m_data_32
&& !m_data_64
)
426 return (m_data_32
? m_data_32
->_used
: m_data_64
->_used
);
429 bool lldb_private::formatters::NSSetISyntheticFrontEnd::Update() {
436 ValueObjectSP valobj_sp
= m_backend
.GetSP();
441 m_exe_ctx_ref
= valobj_sp
->GetExecutionContextRef();
442 lldb::ProcessSP
process_sp(valobj_sp
->GetProcessSP());
445 m_ptr_size
= process_sp
->GetAddressByteSize();
446 uint64_t data_location
= valobj_sp
->GetValueAsUnsigned(0) + m_ptr_size
;
448 if (m_ptr_size
== 4) {
449 m_data_32
= new DataDescriptor_32();
450 process_sp
->ReadMemory(data_location
, m_data_32
, sizeof(DataDescriptor_32
),
453 m_data_64
= new DataDescriptor_64();
454 process_sp
->ReadMemory(data_location
, m_data_64
, sizeof(DataDescriptor_64
),
459 m_data_ptr
= data_location
+ m_ptr_size
;
463 bool lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren() {
468 lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex(size_t idx
) {
469 uint32_t num_children
= CalculateNumChildren();
471 if (idx
>= num_children
)
472 return lldb::ValueObjectSP();
474 ProcessSP process_sp
= m_exe_ctx_ref
.GetProcessSP();
476 return lldb::ValueObjectSP();
478 if (m_children
.empty()) {
480 lldb::addr_t obj_at_idx
= 0;
483 uint32_t test_idx
= 0;
485 while (tries
< num_children
) {
486 obj_at_idx
= m_data_ptr
+ (test_idx
* m_ptr_size
);
488 return lldb::ValueObjectSP();
490 obj_at_idx
= process_sp
->ReadPointerFromMemory(obj_at_idx
, error
);
492 return lldb::ValueObjectSP();
500 SetItemDescriptor descriptor
= {obj_at_idx
, lldb::ValueObjectSP()};
502 m_children
.push_back(descriptor
);
506 if (idx
>= m_children
.size()) // should never happen
507 return lldb::ValueObjectSP();
509 SetItemDescriptor
&set_item
= m_children
[idx
];
510 if (!set_item
.valobj_sp
) {
511 auto ptr_size
= process_sp
->GetAddressByteSize();
512 DataBufferHeap
buffer(ptr_size
, 0);
514 case 0: // architecture has no clue - fail
515 return lldb::ValueObjectSP();
517 *reinterpret_cast<uint32_t *>(buffer
.GetBytes()) =
518 static_cast<uint32_t>(set_item
.item_ptr
);
521 *reinterpret_cast<uint64_t *>(buffer
.GetBytes()) =
522 static_cast<uint64_t>(set_item
.item_ptr
);
525 lldbassert(false && "pointer size is not 4 nor 8");
527 StreamString idx_name
;
528 idx_name
.Printf("[%" PRIu64
"]", (uint64_t)idx
);
530 DataExtractor
data(buffer
.GetBytes(), buffer
.GetByteSize(),
531 process_sp
->GetByteOrder(),
532 process_sp
->GetAddressByteSize());
534 set_item
.valobj_sp
= CreateValueObjectFromData(
535 idx_name
.GetString(), data
, m_exe_ctx_ref
,
536 m_backend
.GetCompilerType().GetBasicTypeFromAST(
537 lldb::eBasicTypeObjCID
));
539 return set_item
.valobj_sp
;
542 lldb_private::formatters::NSCFSetSyntheticFrontEnd::NSCFSetSyntheticFrontEnd(
543 lldb::ValueObjectSP valobj_sp
)
544 : SyntheticChildrenFrontEnd(*valobj_sp
), m_exe_ctx_ref(), m_hashtable(),
548 lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetIndexOfChildWithName(
550 const char *item_name
= name
.GetCString();
551 const uint32_t idx
= ExtractIndexFromString(item_name
);
552 if (idx
< UINT32_MAX
&& idx
>= CalculateNumChildren())
558 lldb_private::formatters::NSCFSetSyntheticFrontEnd::CalculateNumChildren() {
559 if (!m_hashtable
.IsValid())
561 return m_hashtable
.GetCount();
564 bool lldb_private::formatters::NSCFSetSyntheticFrontEnd::Update() {
566 ValueObjectSP valobj_sp
= m_backend
.GetSP();
570 m_exe_ctx_ref
= valobj_sp
->GetExecutionContextRef();
572 lldb::ProcessSP
process_sp(valobj_sp
->GetProcessSP());
575 m_ptr_size
= process_sp
->GetAddressByteSize();
576 m_order
= process_sp
->GetByteOrder();
577 return m_hashtable
.Update(valobj_sp
->GetValueAsUnsigned(0), m_exe_ctx_ref
);
580 bool lldb_private::formatters::NSCFSetSyntheticFrontEnd::MightHaveChildren() {
585 lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetChildAtIndex(
587 lldb::addr_t m_values_ptr
= m_hashtable
.GetValuePointer();
589 const uint32_t num_children
= CalculateNumChildren();
591 if (idx
>= num_children
)
592 return lldb::ValueObjectSP();
594 if (m_children
.empty()) {
595 ProcessSP process_sp
= m_exe_ctx_ref
.GetProcessSP();
597 return lldb::ValueObjectSP();
600 lldb::addr_t val_at_idx
= 0;
603 uint32_t test_idx
= 0;
605 // Iterate over inferior memory, reading value pointers by shifting the
606 // cursor by test_index * m_ptr_size. Returns an empty ValueObject if a read
607 // fails, otherwise, continue until the number of tries matches the number
609 while (tries
< num_children
) {
610 val_at_idx
= m_values_ptr
+ (test_idx
* m_ptr_size
);
612 val_at_idx
= process_sp
->ReadPointerFromMemory(val_at_idx
, error
);
614 return lldb::ValueObjectSP();
622 SetItemDescriptor descriptor
= {val_at_idx
, lldb::ValueObjectSP()};
624 m_children
.push_back(descriptor
);
628 if (idx
>= m_children
.size()) // should never happen
629 return lldb::ValueObjectSP();
631 SetItemDescriptor
&set_item
= m_children
[idx
];
632 if (!set_item
.valobj_sp
) {
634 WritableDataBufferSP
buffer_sp(new DataBufferHeap(m_ptr_size
, 0));
636 switch (m_ptr_size
) {
637 case 0: // architecture has no clue - fail
638 return lldb::ValueObjectSP();
640 *reinterpret_cast<uint32_t *>(buffer_sp
->GetBytes()) =
641 static_cast<uint32_t>(set_item
.item_ptr
);
644 *reinterpret_cast<uint64_t *>(buffer_sp
->GetBytes()) =
645 static_cast<uint64_t>(set_item
.item_ptr
);
648 lldbassert(false && "pointer size is not 4 nor 8");
650 StreamString idx_name
;
651 idx_name
.Printf("[%" PRIu64
"]", (uint64_t)idx
);
653 DataExtractor
data(buffer_sp
, m_order
, m_ptr_size
);
655 set_item
.valobj_sp
= CreateValueObjectFromData(
656 idx_name
.GetString(), data
, m_exe_ctx_ref
,
657 m_backend
.GetCompilerType().GetBasicTypeFromAST(
658 lldb::eBasicTypeObjCID
));
661 return set_item
.valobj_sp
;
664 template <typename D32
, typename D64
>
665 lldb_private::formatters::GenericNSSetMSyntheticFrontEnd
<
666 D32
, D64
>::GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp
)
667 : SyntheticChildrenFrontEnd(*valobj_sp
), m_exe_ctx_ref(),
668 m_data_32(nullptr), m_data_64(nullptr) {
673 template <typename D32
, typename D64
>
674 lldb_private::formatters::
675 GenericNSSetMSyntheticFrontEnd
<D32
, D64
>::~GenericNSSetMSyntheticFrontEnd
<D32
, D64
>() {
682 template <typename D32
, typename D64
>
684 lldb_private::formatters::
685 GenericNSSetMSyntheticFrontEnd
<D32
, D64
>::GetIndexOfChildWithName(
687 const char *item_name
= name
.GetCString();
688 uint32_t idx
= ExtractIndexFromString(item_name
);
689 if (idx
< UINT32_MAX
&& idx
>= CalculateNumChildren())
694 template <typename D32
, typename D64
>
696 lldb_private::formatters::
697 GenericNSSetMSyntheticFrontEnd
<D32
, D64
>::CalculateNumChildren() {
698 if (!m_data_32
&& !m_data_64
)
700 return (m_data_32
? m_data_32
->_used
: m_data_64
->_used
);
703 template <typename D32
, typename D64
>
705 lldb_private::formatters::
706 GenericNSSetMSyntheticFrontEnd
<D32
, D64
>::Update() {
708 ValueObjectSP valobj_sp
= m_backend
.GetSP();
718 m_exe_ctx_ref
= valobj_sp
->GetExecutionContextRef();
719 lldb::ProcessSP
process_sp(valobj_sp
->GetProcessSP());
722 m_ptr_size
= process_sp
->GetAddressByteSize();
723 uint64_t data_location
= valobj_sp
->GetValueAsUnsigned(0) + m_ptr_size
;
725 if (m_ptr_size
== 4) {
726 m_data_32
= new D32();
727 process_sp
->ReadMemory(data_location
, m_data_32
, sizeof(D32
),
730 m_data_64
= new D64();
731 process_sp
->ReadMemory(data_location
, m_data_64
, sizeof(D64
),
734 return error
.Success();
737 template <typename D32
, typename D64
>
739 lldb_private::formatters::
740 GenericNSSetMSyntheticFrontEnd
<D32
, D64
>::MightHaveChildren() {
744 template <typename D32
, typename D64
>
746 lldb_private::formatters::
747 GenericNSSetMSyntheticFrontEnd
<D32
, D64
>::GetChildAtIndex(size_t idx
) {
748 lldb::addr_t m_objs_addr
=
749 (m_data_32
? m_data_32
->_objs_addr
: m_data_64
->_objs_addr
);
751 uint32_t num_children
= CalculateNumChildren();
753 if (idx
>= num_children
)
754 return lldb::ValueObjectSP();
756 ProcessSP process_sp
= m_exe_ctx_ref
.GetProcessSP();
758 return lldb::ValueObjectSP();
760 if (m_children
.empty()) {
762 lldb::addr_t obj_at_idx
= 0;
765 uint32_t test_idx
= 0;
767 while (tries
< num_children
) {
768 obj_at_idx
= m_objs_addr
+ (test_idx
* m_ptr_size
);
770 return lldb::ValueObjectSP();
772 obj_at_idx
= process_sp
->ReadPointerFromMemory(obj_at_idx
, error
);
774 return lldb::ValueObjectSP();
782 SetItemDescriptor descriptor
= {obj_at_idx
, lldb::ValueObjectSP()};
784 m_children
.push_back(descriptor
);
788 if (idx
>= m_children
.size()) // should never happen
789 return lldb::ValueObjectSP();
791 SetItemDescriptor
&set_item
= m_children
[idx
];
792 if (!set_item
.valobj_sp
) {
793 auto ptr_size
= process_sp
->GetAddressByteSize();
794 DataBufferHeap
buffer(ptr_size
, 0);
796 case 0: // architecture has no clue?? - fail
797 return lldb::ValueObjectSP();
799 *((uint32_t *)buffer
.GetBytes()) = (uint32_t)set_item
.item_ptr
;
802 *((uint64_t *)buffer
.GetBytes()) = (uint64_t)set_item
.item_ptr
;
805 assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
807 StreamString idx_name
;
808 idx_name
.Printf("[%" PRIu64
"]", (uint64_t)idx
);
810 DataExtractor
data(buffer
.GetBytes(), buffer
.GetByteSize(),
811 process_sp
->GetByteOrder(),
812 process_sp
->GetAddressByteSize());
814 set_item
.valobj_sp
= CreateValueObjectFromData(
815 idx_name
.GetString(), data
, m_exe_ctx_ref
,
816 m_backend
.GetCompilerType().GetBasicTypeFromAST(
817 lldb::eBasicTypeObjCID
));
819 return set_item
.valobj_sp
;
822 template bool lldb_private::formatters::NSSetSummaryProvider
<true>(
823 ValueObject
&valobj
, Stream
&stream
, const TypeSummaryOptions
&options
);
825 template bool lldb_private::formatters::NSSetSummaryProvider
<false>(
826 ValueObject
&valobj
, Stream
&stream
, const TypeSummaryOptions
&options
);