/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Language/ObjC/NSSet.cpp
Line | Count | Source (jump to first uncovered line) |
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 | | |
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" |
23 | | |
24 | | using namespace lldb; |
25 | | using namespace lldb_private; |
26 | | using namespace lldb_private::formatters; |
27 | | |
28 | | std::map<ConstString, CXXFunctionSummaryFormat::Callback> & |
29 | 0 | NSSet_Additionals::GetAdditionalSummaries() { |
30 | 0 | static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; |
31 | 0 | return g_map; |
32 | 0 | } |
33 | | |
34 | | std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & |
35 | 0 | NSSet_Additionals::GetAdditionalSynthetics() { |
36 | 0 | static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> |
37 | 0 | g_map; |
38 | 0 | return g_map; |
39 | 0 | } |
40 | | |
41 | | namespace lldb_private { |
42 | | namespace formatters { |
43 | | class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd { |
44 | | public: |
45 | | NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); |
46 | | |
47 | | ~NSSetISyntheticFrontEnd() override; |
48 | | |
49 | | size_t CalculateNumChildren() override; |
50 | | |
51 | | lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; |
52 | | |
53 | | bool Update() override; |
54 | | |
55 | | bool MightHaveChildren() override; |
56 | | |
57 | | size_t GetIndexOfChildWithName(ConstString name) override; |
58 | | |
59 | | private: |
60 | | struct DataDescriptor_32 { |
61 | | uint32_t _used : 26; |
62 | | uint32_t _szidx : 6; |
63 | | }; |
64 | | |
65 | | struct DataDescriptor_64 { |
66 | | uint64_t _used : 58; |
67 | | uint32_t _szidx : 6; |
68 | | }; |
69 | | |
70 | | struct SetItemDescriptor { |
71 | | lldb::addr_t item_ptr; |
72 | | lldb::ValueObjectSP valobj_sp; |
73 | | }; |
74 | | |
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; |
81 | | }; |
82 | | |
83 | | class NSCFSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd { |
84 | | public: |
85 | | NSCFSetSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); |
86 | | |
87 | | size_t CalculateNumChildren() override; |
88 | | |
89 | | lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; |
90 | | |
91 | | bool Update() override; |
92 | | |
93 | | bool MightHaveChildren() override; |
94 | | |
95 | | size_t GetIndexOfChildWithName(ConstString name) override; |
96 | | |
97 | | private: |
98 | | struct SetItemDescriptor { |
99 | | lldb::addr_t item_ptr; |
100 | | lldb::ValueObjectSP valobj_sp; |
101 | | }; |
102 | | |
103 | | ExecutionContextRef m_exe_ctx_ref; |
104 | | uint8_t m_ptr_size = 8; |
105 | | lldb::ByteOrder m_order = lldb::eByteOrderInvalid; |
106 | | |
107 | | CFBasicHash m_hashtable; |
108 | | |
109 | | CompilerType m_pair_type; |
110 | | std::vector<SetItemDescriptor> m_children; |
111 | | }; |
112 | | |
113 | | template <typename D32, typename D64> |
114 | | class GenericNSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { |
115 | | public: |
116 | | GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); |
117 | | |
118 | | ~GenericNSSetMSyntheticFrontEnd() override; |
119 | | |
120 | | size_t CalculateNumChildren() override; |
121 | | |
122 | | lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; |
123 | | |
124 | | bool Update() override; |
125 | | |
126 | | bool MightHaveChildren() override; |
127 | | |
128 | | size_t GetIndexOfChildWithName(ConstString name) override; |
129 | | |
130 | | private: |
131 | | |
132 | | struct SetItemDescriptor { |
133 | | lldb::addr_t item_ptr; |
134 | | lldb::ValueObjectSP valobj_sp; |
135 | | }; |
136 | | |
137 | | ExecutionContextRef m_exe_ctx_ref; |
138 | | uint8_t m_ptr_size = 8; |
139 | | D32 *m_data_32; |
140 | | D64 *m_data_64; |
141 | | std::vector<SetItemDescriptor> m_children; |
142 | | }; |
143 | | |
144 | | namespace Foundation1300 { |
145 | | struct DataDescriptor_32 { |
146 | | uint32_t _used : 26; |
147 | | uint32_t _size; |
148 | | uint32_t _mutations; |
149 | | uint32_t _objs_addr; |
150 | | }; |
151 | | |
152 | | struct DataDescriptor_64 { |
153 | | uint64_t _used : 58; |
154 | | uint64_t _size; |
155 | | uint64_t _mutations; |
156 | | uint64_t _objs_addr; |
157 | | }; |
158 | | |
159 | | using NSSetMSyntheticFrontEnd = |
160 | | GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; |
161 | | } |
162 | | |
163 | | namespace Foundation1428 { |
164 | | struct DataDescriptor_32 { |
165 | | uint32_t _used : 26; |
166 | | uint32_t _size; |
167 | | uint32_t _objs_addr; |
168 | | uint32_t _mutations; |
169 | | }; |
170 | | |
171 | | struct DataDescriptor_64 { |
172 | | uint64_t _used : 58; |
173 | | uint64_t _size; |
174 | | uint64_t _objs_addr; |
175 | | uint64_t _mutations; |
176 | | }; |
177 | | |
178 | | using NSSetMSyntheticFrontEnd = |
179 | | GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; |
180 | | } |
181 | | |
182 | | namespace Foundation1437 { |
183 | | struct DataDescriptor_32 { |
184 | | uint32_t _cow; |
185 | | // __table storage |
186 | | uint32_t _objs_addr; |
187 | | uint32_t _muts; |
188 | | uint32_t _used : 26; |
189 | | uint32_t _szidx : 6; |
190 | | }; |
191 | | |
192 | | struct DataDescriptor_64 { |
193 | | uint64_t _cow; |
194 | | // __Table storage |
195 | | uint64_t _objs_addr; |
196 | | uint32_t _muts; |
197 | | uint32_t _used : 26; |
198 | | uint32_t _szidx : 6; |
199 | | }; |
200 | | |
201 | | using NSSetMSyntheticFrontEnd = |
202 | | GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; |
203 | | |
204 | | template <typename DD> |
205 | | uint64_t |
206 | | __NSSetMSize_Impl(lldb_private::Process &process, lldb::addr_t valobj_addr, |
207 | 32 | Status &error) { |
208 | 32 | const lldb::addr_t start_of_descriptor = |
209 | 32 | valobj_addr + process.GetAddressByteSize(); |
210 | 32 | DD descriptor = DD(); |
211 | 32 | process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor), |
212 | 32 | error); |
213 | 32 | if (error.Fail()) { |
214 | 0 | return 0; |
215 | 0 | } |
216 | 32 | return descriptor._used; |
217 | 32 | } Unexecuted instantiation: unsigned long long lldb_private::formatters::Foundation1437::__NSSetMSize_Impl<lldb_private::formatters::Foundation1437::DataDescriptor_32>(lldb_private::Process&, unsigned long long, lldb_private::Status&) unsigned long long lldb_private::formatters::Foundation1437::__NSSetMSize_Impl<lldb_private::formatters::Foundation1437::DataDescriptor_64>(lldb_private::Process&, unsigned long long, lldb_private::Status&) Line | Count | Source | 207 | 32 | Status &error) { | 208 | 32 | const lldb::addr_t start_of_descriptor = | 209 | 32 | valobj_addr + process.GetAddressByteSize(); | 210 | 32 | DD descriptor = DD(); | 211 | 32 | process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor), | 212 | 32 | error); | 213 | 32 | if (error.Fail()) { | 214 | 0 | return 0; | 215 | 0 | } | 216 | 32 | return descriptor._used; | 217 | 32 | } |
|
218 | | |
219 | | uint64_t |
220 | | __NSSetMSize(lldb_private::Process &process, lldb::addr_t valobj_addr, |
221 | 32 | Status &error) { |
222 | 32 | if (process.GetAddressByteSize() == 4) { |
223 | 0 | return __NSSetMSize_Impl<DataDescriptor_32>(process, valobj_addr, error); |
224 | 32 | } else { |
225 | 32 | return __NSSetMSize_Impl<DataDescriptor_64>(process, valobj_addr, error); |
226 | 32 | } |
227 | 32 | } |
228 | | } |
229 | | |
230 | | class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd { |
231 | | public: |
232 | | NSSetCodeRunningSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); |
233 | | |
234 | | ~NSSetCodeRunningSyntheticFrontEnd() override; |
235 | | |
236 | | size_t CalculateNumChildren() override; |
237 | | |
238 | | lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; |
239 | | |
240 | | bool Update() override; |
241 | | |
242 | | bool MightHaveChildren() override; |
243 | | |
244 | | size_t GetIndexOfChildWithName(ConstString name) override; |
245 | | }; |
246 | | } // namespace formatters |
247 | | } // namespace lldb_private |
248 | | |
249 | | template <bool cf_style> |
250 | | bool lldb_private::formatters::NSSetSummaryProvider( |
251 | 68 | ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { |
252 | 68 | static constexpr llvm::StringLiteral g_TypeHint("NSSet"); |
253 | | |
254 | 68 | ProcessSP process_sp = valobj.GetProcessSP(); |
255 | 68 | if (!process_sp) |
256 | 0 | return false; |
257 | | |
258 | 68 | ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp); |
259 | | |
260 | 68 | if (!runtime) |
261 | 0 | return false; |
262 | | |
263 | 68 | ObjCLanguageRuntime::ClassDescriptorSP descriptor( |
264 | 68 | runtime->GetClassDescriptor(valobj)); |
265 | | |
266 | 68 | if (!descriptor || !descriptor->IsValid()62 ) |
267 | 6 | return false; |
268 | | |
269 | 62 | uint32_t ptr_size = process_sp->GetAddressByteSize(); |
270 | 62 | bool is_64bit = (ptr_size == 8); |
271 | | |
272 | 62 | lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); |
273 | | |
274 | 62 | if (!valobj_addr) |
275 | 2 | return false; |
276 | | |
277 | 60 | uint64_t value = 0; |
278 | | |
279 | 60 | ConstString class_name(descriptor->GetClassName()); |
280 | | |
281 | 60 | static const ConstString g_SetI("__NSSetI"); |
282 | 60 | static const ConstString g_OrderedSetI("__NSOrderedSetI"); |
283 | 60 | static const ConstString g_SetM("__NSSetM"); |
284 | 60 | static const ConstString g_SetCF("__NSCFSet"); |
285 | 60 | static const ConstString g_SetCFRef("CFSetRef"); |
286 | | |
287 | 60 | if (class_name.IsEmpty()) |
288 | 0 | return false; |
289 | | |
290 | 60 | if (class_name == g_SetI || class_name == g_OrderedSetI48 ) { |
291 | 16 | Status error; |
292 | 16 | value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, |
293 | 16 | ptr_size, 0, error); |
294 | 16 | if (error.Fail()) |
295 | 0 | return false; |
296 | 16 | value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U0 ); |
297 | 44 | } else if (class_name == g_SetM) { |
298 | 32 | AppleObjCRuntime *apple_runtime = |
299 | 32 | llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime); |
300 | 32 | Status error; |
301 | 32 | if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) { |
302 | 32 | value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error); |
303 | 32 | } else { |
304 | 0 | value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, |
305 | 0 | ptr_size, 0, error); |
306 | 0 | value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); |
307 | 0 | } |
308 | 32 | if (error.Fail()) |
309 | 0 | return false; |
310 | 32 | } else if (12 class_name == g_SetCF12 || class_name == g_SetCFRef0 ) { |
311 | 12 | ExecutionContext exe_ctx(process_sp); |
312 | 12 | CFBasicHash cfbh; |
313 | 12 | if (!cfbh.Update(valobj_addr, exe_ctx)) |
314 | 0 | return false; |
315 | 12 | value = cfbh.GetCount(); |
316 | 12 | } else { |
317 | 0 | auto &map(NSSet_Additionals::GetAdditionalSummaries()); |
318 | 0 | auto iter = map.find(class_name), end = map.end(); |
319 | 0 | if (iter != end) |
320 | 0 | return iter->second(valobj, stream, options); |
321 | 0 | else |
322 | 0 | return false; |
323 | 0 | } |
324 | | |
325 | 60 | llvm::StringRef prefix, suffix; |
326 | 60 | if (Language *language = Language::FindPlugin(options.GetLanguage())) |
327 | 60 | std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint); |
328 | | |
329 | 60 | stream << prefix; |
330 | 60 | stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? ""0 : "s"); |
331 | 60 | stream << suffix; |
332 | 60 | return true; |
333 | 60 | } bool lldb_private::formatters::NSSetSummaryProvider<true>(lldb_private::ValueObject&, lldb_private::Stream&, lldb_private::TypeSummaryOptions const&) Line | Count | Source | 251 | 6 | ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { | 252 | 6 | static constexpr llvm::StringLiteral g_TypeHint("NSSet"); | 253 | | | 254 | 6 | ProcessSP process_sp = valobj.GetProcessSP(); | 255 | 6 | if (!process_sp) | 256 | 0 | return false; | 257 | | | 258 | 6 | ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp); | 259 | | | 260 | 6 | if (!runtime) | 261 | 0 | return false; | 262 | | | 263 | 6 | ObjCLanguageRuntime::ClassDescriptorSP descriptor( | 264 | 6 | runtime->GetClassDescriptor(valobj)); | 265 | | | 266 | 6 | if (!descriptor || !descriptor->IsValid()) | 267 | 0 | return false; | 268 | | | 269 | 6 | uint32_t ptr_size = process_sp->GetAddressByteSize(); | 270 | 6 | bool is_64bit = (ptr_size == 8); | 271 | | | 272 | 6 | lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); | 273 | | | 274 | 6 | if (!valobj_addr) | 275 | 0 | return false; | 276 | | | 277 | 6 | uint64_t value = 0; | 278 | | | 279 | 6 | ConstString class_name(descriptor->GetClassName()); | 280 | | | 281 | 6 | static const ConstString g_SetI("__NSSetI"); | 282 | 6 | static const ConstString g_OrderedSetI("__NSOrderedSetI"); | 283 | 6 | static const ConstString g_SetM("__NSSetM"); | 284 | 6 | static const ConstString g_SetCF("__NSCFSet"); | 285 | 6 | static const ConstString g_SetCFRef("CFSetRef"); | 286 | | | 287 | 6 | if (class_name.IsEmpty()) | 288 | 0 | return false; | 289 | | | 290 | 6 | if (class_name == g_SetI || class_name == g_OrderedSetI) { | 291 | 0 | Status error; | 292 | 0 | value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, | 293 | 0 | ptr_size, 0, error); | 294 | 0 | if (error.Fail()) | 295 | 0 | return false; | 296 | 0 | value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); | 297 | 6 | } else if (class_name == g_SetM) { | 298 | 0 | AppleObjCRuntime *apple_runtime = | 299 | 0 | llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime); | 300 | 0 | Status error; | 301 | 0 | if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) { | 302 | 0 | value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error); | 303 | 0 | } else { | 304 | 0 | value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, | 305 | 0 | ptr_size, 0, error); | 306 | 0 | value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); | 307 | 0 | } | 308 | 0 | if (error.Fail()) | 309 | 0 | return false; | 310 | 6 | } else if (class_name == g_SetCF || class_name == g_SetCFRef0 ) { | 311 | 6 | ExecutionContext exe_ctx(process_sp); | 312 | 6 | CFBasicHash cfbh; | 313 | 6 | if (!cfbh.Update(valobj_addr, exe_ctx)) | 314 | 0 | return false; | 315 | 6 | value = cfbh.GetCount(); | 316 | 6 | } else { | 317 | 0 | auto &map(NSSet_Additionals::GetAdditionalSummaries()); | 318 | 0 | auto iter = map.find(class_name), end = map.end(); | 319 | 0 | if (iter != end) | 320 | 0 | return iter->second(valobj, stream, options); | 321 | 0 | else | 322 | 0 | return false; | 323 | 0 | } | 324 | | | 325 | 6 | llvm::StringRef prefix, suffix; | 326 | 6 | if (Language *language = Language::FindPlugin(options.GetLanguage())) | 327 | 6 | std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint); | 328 | | | 329 | 6 | stream << prefix; | 330 | 6 | stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? ""0 : "s"); | 331 | 6 | stream << suffix; | 332 | 6 | return true; | 333 | 6 | } |
bool lldb_private::formatters::NSSetSummaryProvider<false>(lldb_private::ValueObject&, lldb_private::Stream&, lldb_private::TypeSummaryOptions const&) Line | Count | Source | 251 | 62 | ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { | 252 | 62 | static constexpr llvm::StringLiteral g_TypeHint("NSSet"); | 253 | | | 254 | 62 | ProcessSP process_sp = valobj.GetProcessSP(); | 255 | 62 | if (!process_sp) | 256 | 0 | return false; | 257 | | | 258 | 62 | ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp); | 259 | | | 260 | 62 | if (!runtime) | 261 | 0 | return false; | 262 | | | 263 | 62 | ObjCLanguageRuntime::ClassDescriptorSP descriptor( | 264 | 62 | runtime->GetClassDescriptor(valobj)); | 265 | | | 266 | 62 | if (!descriptor || !descriptor->IsValid()56 ) | 267 | 6 | return false; | 268 | | | 269 | 56 | uint32_t ptr_size = process_sp->GetAddressByteSize(); | 270 | 56 | bool is_64bit = (ptr_size == 8); | 271 | | | 272 | 56 | lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); | 273 | | | 274 | 56 | if (!valobj_addr) | 275 | 2 | return false; | 276 | | | 277 | 54 | uint64_t value = 0; | 278 | | | 279 | 54 | ConstString class_name(descriptor->GetClassName()); | 280 | | | 281 | 54 | static const ConstString g_SetI("__NSSetI"); | 282 | 54 | static const ConstString g_OrderedSetI("__NSOrderedSetI"); | 283 | 54 | static const ConstString g_SetM("__NSSetM"); | 284 | 54 | static const ConstString g_SetCF("__NSCFSet"); | 285 | 54 | static const ConstString g_SetCFRef("CFSetRef"); | 286 | | | 287 | 54 | if (class_name.IsEmpty()) | 288 | 0 | return false; | 289 | | | 290 | 54 | if (class_name == g_SetI || class_name == g_OrderedSetI42 ) { | 291 | 16 | Status error; | 292 | 16 | value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, | 293 | 16 | ptr_size, 0, error); | 294 | 16 | if (error.Fail()) | 295 | 0 | return false; | 296 | 16 | value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U0 ); | 297 | 38 | } else if (class_name == g_SetM) { | 298 | 32 | AppleObjCRuntime *apple_runtime = | 299 | 32 | llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime); | 300 | 32 | Status error; | 301 | 32 | if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) { | 302 | 32 | value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error); | 303 | 32 | } else { | 304 | 0 | value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, | 305 | 0 | ptr_size, 0, error); | 306 | 0 | value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); | 307 | 0 | } | 308 | 32 | if (error.Fail()) | 309 | 0 | return false; | 310 | 32 | } else if (6 class_name == g_SetCF6 || class_name == g_SetCFRef0 ) { | 311 | 6 | ExecutionContext exe_ctx(process_sp); | 312 | 6 | CFBasicHash cfbh; | 313 | 6 | if (!cfbh.Update(valobj_addr, exe_ctx)) | 314 | 0 | return false; | 315 | 6 | value = cfbh.GetCount(); | 316 | 6 | } else { | 317 | 0 | auto &map(NSSet_Additionals::GetAdditionalSummaries()); | 318 | 0 | auto iter = map.find(class_name), end = map.end(); | 319 | 0 | if (iter != end) | 320 | 0 | return iter->second(valobj, stream, options); | 321 | 0 | else | 322 | 0 | return false; | 323 | 0 | } | 324 | | | 325 | 54 | llvm::StringRef prefix, suffix; | 326 | 54 | if (Language *language = Language::FindPlugin(options.GetLanguage())) | 327 | 54 | std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint); | 328 | | | 329 | 54 | stream << prefix; | 330 | 54 | stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? ""0 : "s"); | 331 | 54 | stream << suffix; | 332 | 54 | return true; | 333 | 54 | } |
|
334 | | |
335 | | SyntheticChildrenFrontEnd * |
336 | | lldb_private::formatters::NSSetSyntheticFrontEndCreator( |
337 | 84 | CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) { |
338 | 84 | lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); |
339 | 84 | if (!process_sp) |
340 | 0 | return nullptr; |
341 | 84 | ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp); |
342 | 84 | if (!runtime) |
343 | 0 | return nullptr; |
344 | | |
345 | 84 | CompilerType valobj_type(valobj_sp->GetCompilerType()); |
346 | 84 | Flags flags(valobj_type.GetTypeInfo()); |
347 | | |
348 | 84 | if (flags.IsClear(eTypeIsPointer)) { |
349 | 8 | Status error; |
350 | 8 | valobj_sp = valobj_sp->AddressOf(error); |
351 | 8 | if (error.Fail() || !valobj_sp) |
352 | 0 | return nullptr; |
353 | 8 | } |
354 | | |
355 | 84 | ObjCLanguageRuntime::ClassDescriptorSP descriptor( |
356 | 84 | runtime->GetClassDescriptor(*valobj_sp)); |
357 | | |
358 | 84 | if (!descriptor || !descriptor->IsValid()) |
359 | 0 | return nullptr; |
360 | | |
361 | 84 | ConstString class_name = descriptor->GetClassName(); |
362 | | |
363 | 84 | static const ConstString g_SetI("__NSSetI"); |
364 | 84 | static const ConstString g_OrderedSetI("__NSOrderedSetI"); |
365 | 84 | static const ConstString g_SetM("__NSSetM"); |
366 | 84 | static const ConstString g_SetCF("__NSCFSet"); |
367 | 84 | static const ConstString g_SetCFRef("CFSetRef"); |
368 | | |
369 | 84 | if (class_name.IsEmpty()) |
370 | 0 | return nullptr; |
371 | | |
372 | 84 | if (class_name == g_SetI || class_name == g_OrderedSetI64 ) { |
373 | 32 | return (new NSSetISyntheticFrontEnd(valobj_sp)); |
374 | 52 | } else if (class_name == g_SetM) { |
375 | 36 | AppleObjCRuntime *apple_runtime = |
376 | 36 | llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime); |
377 | 36 | if (apple_runtime) { |
378 | 36 | if (apple_runtime->GetFoundationVersion() >= 1437) |
379 | 36 | return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp)); |
380 | 0 | else if (apple_runtime->GetFoundationVersion() >= 1428) |
381 | 0 | return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp)); |
382 | 0 | else |
383 | 0 | return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp)); |
384 | 36 | } else { |
385 | 0 | return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp)); |
386 | 0 | } |
387 | 36 | } else if (16 class_name == g_SetCF16 || class_name == g_SetCFRef0 ) { |
388 | 16 | return (new NSCFSetSyntheticFrontEnd(valobj_sp)); |
389 | 16 | } else { |
390 | 0 | auto &map(NSSet_Additionals::GetAdditionalSynthetics()); |
391 | 0 | auto iter = map.find(class_name), end = map.end(); |
392 | 0 | if (iter != end) |
393 | 0 | return iter->second(synth, valobj_sp); |
394 | 0 | return nullptr; |
395 | 0 | } |
396 | 84 | } |
397 | | |
398 | | lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd( |
399 | | lldb::ValueObjectSP valobj_sp) |
400 | 32 | : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref() { |
401 | 32 | if (valobj_sp) |
402 | 32 | Update(); |
403 | 32 | } |
404 | | |
405 | 32 | lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd() { |
406 | 32 | delete m_data_32; |
407 | 32 | m_data_32 = nullptr; |
408 | 32 | delete m_data_64; |
409 | 32 | m_data_64 = nullptr; |
410 | 32 | } |
411 | | |
412 | | size_t |
413 | | lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName( |
414 | 0 | ConstString name) { |
415 | 0 | const char *item_name = name.GetCString(); |
416 | 0 | uint32_t idx = ExtractIndexFromString(item_name); |
417 | 0 | if (idx < UINT32_MAX && idx >= CalculateNumChildren()) |
418 | 0 | return UINT32_MAX; |
419 | 0 | return idx; |
420 | 0 | } |
421 | | |
422 | | size_t |
423 | 36 | lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren() { |
424 | 36 | if (!m_data_32 && !m_data_64) |
425 | 0 | return 0; |
426 | 36 | return (m_data_32 ? m_data_32->_used0 : m_data_64->_used); |
427 | 36 | } |
428 | | |
429 | 52 | bool lldb_private::formatters::NSSetISyntheticFrontEnd::Update() { |
430 | 52 | m_children.clear(); |
431 | 52 | delete m_data_32; |
432 | 52 | m_data_32 = nullptr; |
433 | 52 | delete m_data_64; |
434 | 52 | m_data_64 = nullptr; |
435 | 52 | m_ptr_size = 0; |
436 | 52 | ValueObjectSP valobj_sp = m_backend.GetSP(); |
437 | 52 | if (!valobj_sp) |
438 | 0 | return false; |
439 | 52 | if (!valobj_sp) |
440 | 0 | return false; |
441 | 52 | m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); |
442 | 52 | lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); |
443 | 52 | if (!process_sp) |
444 | 0 | return false; |
445 | 52 | m_ptr_size = process_sp->GetAddressByteSize(); |
446 | 52 | uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; |
447 | 52 | Status error; |
448 | 52 | if (m_ptr_size == 4) { |
449 | 0 | m_data_32 = new DataDescriptor_32(); |
450 | 0 | process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), |
451 | 0 | error); |
452 | 52 | } else { |
453 | 52 | m_data_64 = new DataDescriptor_64(); |
454 | 52 | process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), |
455 | 52 | error); |
456 | 52 | } |
457 | 52 | if (error.Fail()) |
458 | 0 | return false; |
459 | 52 | m_data_ptr = data_location + m_ptr_size; |
460 | 52 | return true; |
461 | 52 | } |
462 | | |
463 | 0 | bool lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren() { |
464 | 0 | return true; |
465 | 0 | } |
466 | | |
467 | | lldb::ValueObjectSP |
468 | 28 | lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex(size_t idx) { |
469 | 28 | uint32_t num_children = CalculateNumChildren(); |
470 | | |
471 | 28 | if (idx >= num_children) |
472 | 0 | return lldb::ValueObjectSP(); |
473 | | |
474 | 28 | ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); |
475 | 28 | if (!process_sp) |
476 | 0 | return lldb::ValueObjectSP(); |
477 | | |
478 | 28 | if (m_children.empty()) { |
479 | | // do the scan phase |
480 | 8 | lldb::addr_t obj_at_idx = 0; |
481 | | |
482 | 8 | uint32_t tries = 0; |
483 | 8 | uint32_t test_idx = 0; |
484 | | |
485 | 48 | while (tries < num_children) { |
486 | 40 | obj_at_idx = m_data_ptr + (test_idx * m_ptr_size); |
487 | 40 | if (!process_sp) |
488 | 0 | return lldb::ValueObjectSP(); |
489 | 40 | Status error; |
490 | 40 | obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); |
491 | 40 | if (error.Fail()) |
492 | 0 | return lldb::ValueObjectSP(); |
493 | | |
494 | 40 | test_idx++; |
495 | | |
496 | 40 | if (!obj_at_idx) |
497 | 12 | continue; |
498 | 28 | tries++; |
499 | | |
500 | 28 | SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()}; |
501 | | |
502 | 28 | m_children.push_back(descriptor); |
503 | 28 | } |
504 | 8 | } |
505 | | |
506 | 28 | if (idx >= m_children.size()) // should never happen |
507 | 0 | return lldb::ValueObjectSP(); |
508 | | |
509 | 28 | SetItemDescriptor &set_item = m_children[idx]; |
510 | 28 | if (!set_item.valobj_sp) { |
511 | 28 | auto ptr_size = process_sp->GetAddressByteSize(); |
512 | 28 | DataBufferHeap buffer(ptr_size, 0); |
513 | 28 | switch (ptr_size) { |
514 | 0 | case 0: // architecture has no clue - fail |
515 | 0 | return lldb::ValueObjectSP(); |
516 | 0 | case 4: |
517 | 0 | *reinterpret_cast<uint32_t *>(buffer.GetBytes()) = |
518 | 0 | static_cast<uint32_t>(set_item.item_ptr); |
519 | 0 | break; |
520 | 28 | case 8: |
521 | 28 | *reinterpret_cast<uint64_t *>(buffer.GetBytes()) = |
522 | 28 | static_cast<uint64_t>(set_item.item_ptr); |
523 | 28 | break; |
524 | 0 | default: |
525 | 0 | lldbassert(false && "pointer size is not 4 nor 8"); |
526 | 28 | } |
527 | 28 | StreamString idx_name; |
528 | 28 | idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); |
529 | | |
530 | 28 | DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), |
531 | 28 | process_sp->GetByteOrder(), |
532 | 28 | process_sp->GetAddressByteSize()); |
533 | | |
534 | 28 | set_item.valobj_sp = CreateValueObjectFromData( |
535 | 28 | idx_name.GetString(), data, m_exe_ctx_ref, |
536 | 28 | m_backend.GetCompilerType().GetBasicTypeFromAST( |
537 | 28 | lldb::eBasicTypeObjCID)); |
538 | 28 | } |
539 | 28 | return set_item.valobj_sp; |
540 | 28 | } |
541 | | |
542 | | lldb_private::formatters::NSCFSetSyntheticFrontEnd::NSCFSetSyntheticFrontEnd( |
543 | | lldb::ValueObjectSP valobj_sp) |
544 | 16 | : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_hashtable(), |
545 | 16 | m_pair_type() {} |
546 | | |
547 | | size_t |
548 | | lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetIndexOfChildWithName( |
549 | 0 | ConstString name) { |
550 | 0 | const char *item_name = name.GetCString(); |
551 | 0 | const uint32_t idx = ExtractIndexFromString(item_name); |
552 | 0 | if (idx < UINT32_MAX && idx >= CalculateNumChildren()) |
553 | 0 | return UINT32_MAX; |
554 | 0 | return idx; |
555 | 0 | } |
556 | | |
557 | | size_t |
558 | 12 | lldb_private::formatters::NSCFSetSyntheticFrontEnd::CalculateNumChildren() { |
559 | 12 | if (!m_hashtable.IsValid()) |
560 | 0 | return 0; |
561 | 12 | return m_hashtable.GetCount(); |
562 | 12 | } |
563 | | |
564 | 16 | bool lldb_private::formatters::NSCFSetSyntheticFrontEnd::Update() { |
565 | 16 | m_children.clear(); |
566 | 16 | ValueObjectSP valobj_sp = m_backend.GetSP(); |
567 | 16 | m_ptr_size = 0; |
568 | 16 | if (!valobj_sp) |
569 | 0 | return false; |
570 | 16 | m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); |
571 | | |
572 | 16 | lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); |
573 | 16 | if (!process_sp) |
574 | 0 | return false; |
575 | 16 | m_ptr_size = process_sp->GetAddressByteSize(); |
576 | 16 | m_order = process_sp->GetByteOrder(); |
577 | 16 | return m_hashtable.Update(valobj_sp->GetValueAsUnsigned(0), m_exe_ctx_ref); |
578 | 16 | } |
579 | | |
580 | 0 | bool lldb_private::formatters::NSCFSetSyntheticFrontEnd::MightHaveChildren() { |
581 | 0 | return true; |
582 | 0 | } |
583 | | |
584 | | lldb::ValueObjectSP |
585 | | lldb_private::formatters::NSCFSetSyntheticFrontEnd::GetChildAtIndex( |
586 | 8 | size_t idx) { |
587 | 8 | lldb::addr_t m_values_ptr = m_hashtable.GetValuePointer(); |
588 | | |
589 | 8 | const uint32_t num_children = CalculateNumChildren(); |
590 | | |
591 | 8 | if (idx >= num_children) |
592 | 0 | return lldb::ValueObjectSP(); |
593 | | |
594 | 8 | if (m_children.empty()) { |
595 | 4 | ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); |
596 | 4 | if (!process_sp) |
597 | 0 | return lldb::ValueObjectSP(); |
598 | | |
599 | 4 | Status error; |
600 | 4 | lldb::addr_t val_at_idx = 0; |
601 | | |
602 | 4 | uint32_t tries = 0; |
603 | 4 | uint32_t test_idx = 0; |
604 | | |
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 |
608 | | // of childen. |
609 | 12 | while (tries < num_children) { |
610 | 8 | val_at_idx = m_values_ptr + (test_idx * m_ptr_size); |
611 | | |
612 | 8 | val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); |
613 | 8 | if (error.Fail()) |
614 | 0 | return lldb::ValueObjectSP(); |
615 | | |
616 | 8 | test_idx++; |
617 | | |
618 | 8 | if (!val_at_idx) |
619 | 0 | continue; |
620 | 8 | tries++; |
621 | | |
622 | 8 | SetItemDescriptor descriptor = {val_at_idx, lldb::ValueObjectSP()}; |
623 | | |
624 | 8 | m_children.push_back(descriptor); |
625 | 8 | } |
626 | 4 | } |
627 | | |
628 | 8 | if (idx >= m_children.size()) // should never happen |
629 | 0 | return lldb::ValueObjectSP(); |
630 | | |
631 | 8 | SetItemDescriptor &set_item = m_children[idx]; |
632 | 8 | if (!set_item.valobj_sp) { |
633 | | |
634 | 8 | WritableDataBufferSP buffer_sp(new DataBufferHeap(m_ptr_size, 0)); |
635 | | |
636 | 8 | switch (m_ptr_size) { |
637 | 0 | case 0: // architecture has no clue - fail |
638 | 0 | return lldb::ValueObjectSP(); |
639 | 0 | case 4: |
640 | 0 | *reinterpret_cast<uint32_t *>(buffer_sp->GetBytes()) = |
641 | 0 | static_cast<uint32_t>(set_item.item_ptr); |
642 | 0 | break; |
643 | 8 | case 8: |
644 | 8 | *reinterpret_cast<uint64_t *>(buffer_sp->GetBytes()) = |
645 | 8 | static_cast<uint64_t>(set_item.item_ptr); |
646 | 8 | break; |
647 | 0 | default: |
648 | 0 | lldbassert(false && "pointer size is not 4 nor 8"); |
649 | 8 | } |
650 | 8 | StreamString idx_name; |
651 | 8 | idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); |
652 | | |
653 | 8 | DataExtractor data(buffer_sp, m_order, m_ptr_size); |
654 | | |
655 | 8 | set_item.valobj_sp = CreateValueObjectFromData( |
656 | 8 | idx_name.GetString(), data, m_exe_ctx_ref, |
657 | 8 | m_backend.GetCompilerType().GetBasicTypeFromAST( |
658 | 8 | lldb::eBasicTypeObjCID)); |
659 | 8 | } |
660 | | |
661 | 8 | return set_item.valobj_sp; |
662 | 8 | } |
663 | | |
664 | | template <typename D32, typename D64> |
665 | | lldb_private::formatters::GenericNSSetMSyntheticFrontEnd< |
666 | | D32, D64>::GenericNSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) |
667 | 36 | : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), |
668 | 36 | m_data_32(nullptr), m_data_64(nullptr) { |
669 | 36 | if (valobj_sp) |
670 | 36 | Update(); |
671 | 36 | } lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::GenericNSSetMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>) Line | Count | Source | 667 | 36 | : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), | 668 | 36 | m_data_32(nullptr), m_data_64(nullptr) { | 669 | 36 | if (valobj_sp) | 670 | 36 | Update(); | 671 | 36 | } |
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::GenericNSSetMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>) Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::GenericNSSetMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>) |
672 | | |
673 | | template <typename D32, typename D64> |
674 | | lldb_private::formatters:: |
675 | 36 | GenericNSSetMSyntheticFrontEnd<D32, D64>::~GenericNSSetMSyntheticFrontEnd<D32, D64>() { |
676 | 36 | delete m_data_32; |
677 | 36 | m_data_32 = nullptr; |
678 | 36 | delete m_data_64; |
679 | 36 | m_data_64 = nullptr; |
680 | 36 | } lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::~GenericNSSetMSyntheticFrontEnd() Line | Count | Source | 675 | 36 | GenericNSSetMSyntheticFrontEnd<D32, D64>::~GenericNSSetMSyntheticFrontEnd<D32, D64>() { | 676 | 36 | delete m_data_32; | 677 | 36 | m_data_32 = nullptr; | 678 | 36 | delete m_data_64; | 679 | 36 | m_data_64 = nullptr; | 680 | 36 | } |
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::~GenericNSSetMSyntheticFrontEnd() Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::~GenericNSSetMSyntheticFrontEnd() |
681 | | |
682 | | template <typename D32, typename D64> |
683 | | size_t |
684 | | lldb_private::formatters:: |
685 | | GenericNSSetMSyntheticFrontEnd<D32, D64>::GetIndexOfChildWithName( |
686 | 0 | ConstString name) { |
687 | 0 | const char *item_name = name.GetCString(); |
688 | 0 | uint32_t idx = ExtractIndexFromString(item_name); |
689 | 0 | if (idx < UINT32_MAX && idx >= CalculateNumChildren()) |
690 | 0 | return UINT32_MAX; |
691 | 0 | return idx; |
692 | 0 | } Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::GetIndexOfChildWithName(lldb_private::ConstString) Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::GetIndexOfChildWithName(lldb_private::ConstString) Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::GetIndexOfChildWithName(lldb_private::ConstString) |
693 | | |
694 | | template <typename D32, typename D64> |
695 | | size_t |
696 | | lldb_private::formatters:: |
697 | 80 | GenericNSSetMSyntheticFrontEnd<D32, D64>::CalculateNumChildren() { |
698 | 80 | if (!m_data_32 && !m_data_64) |
699 | 0 | return 0; |
700 | 80 | return (m_data_32 ? m_data_32->_used0 : m_data_64->_used); |
701 | 80 | } lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::CalculateNumChildren() Line | Count | Source | 697 | 80 | GenericNSSetMSyntheticFrontEnd<D32, D64>::CalculateNumChildren() { | 698 | 80 | if (!m_data_32 && !m_data_64) | 699 | 0 | return 0; | 700 | 80 | return (m_data_32 ? m_data_32->_used0 : m_data_64->_used); | 701 | 80 | } |
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::CalculateNumChildren() Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::CalculateNumChildren() |
702 | | |
703 | | template <typename D32, typename D64> |
704 | | bool |
705 | | lldb_private::formatters:: |
706 | 56 | GenericNSSetMSyntheticFrontEnd<D32, D64>::Update() { |
707 | 56 | m_children.clear(); |
708 | 56 | ValueObjectSP valobj_sp = m_backend.GetSP(); |
709 | 56 | m_ptr_size = 0; |
710 | 56 | delete m_data_32; |
711 | 56 | m_data_32 = nullptr; |
712 | 56 | delete m_data_64; |
713 | 56 | m_data_64 = nullptr; |
714 | 56 | if (!valobj_sp) |
715 | 0 | return false; |
716 | 56 | if (!valobj_sp) |
717 | 0 | return false; |
718 | 56 | m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); |
719 | 56 | lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); |
720 | 56 | if (!process_sp) |
721 | 0 | return false; |
722 | 56 | m_ptr_size = process_sp->GetAddressByteSize(); |
723 | 56 | uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; |
724 | 56 | Status error; |
725 | 56 | if (m_ptr_size == 4) { |
726 | 0 | m_data_32 = new D32(); |
727 | 0 | process_sp->ReadMemory(data_location, m_data_32, sizeof(D32), |
728 | 0 | error); |
729 | 56 | } else { |
730 | 56 | m_data_64 = new D64(); |
731 | 56 | process_sp->ReadMemory(data_location, m_data_64, sizeof(D64), |
732 | 56 | error); |
733 | 56 | } |
734 | 56 | return error.Success(); |
735 | 56 | } lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::Update() Line | Count | Source | 706 | 56 | GenericNSSetMSyntheticFrontEnd<D32, D64>::Update() { | 707 | 56 | m_children.clear(); | 708 | 56 | ValueObjectSP valobj_sp = m_backend.GetSP(); | 709 | 56 | m_ptr_size = 0; | 710 | 56 | delete m_data_32; | 711 | 56 | m_data_32 = nullptr; | 712 | 56 | delete m_data_64; | 713 | 56 | m_data_64 = nullptr; | 714 | 56 | if (!valobj_sp) | 715 | 0 | return false; | 716 | 56 | if (!valobj_sp) | 717 | 0 | return false; | 718 | 56 | m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); | 719 | 56 | lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); | 720 | 56 | if (!process_sp) | 721 | 0 | return false; | 722 | 56 | m_ptr_size = process_sp->GetAddressByteSize(); | 723 | 56 | uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; | 724 | 56 | Status error; | 725 | 56 | if (m_ptr_size == 4) { | 726 | 0 | m_data_32 = new D32(); | 727 | 0 | process_sp->ReadMemory(data_location, m_data_32, sizeof(D32), | 728 | 0 | error); | 729 | 56 | } else { | 730 | 56 | m_data_64 = new D64(); | 731 | 56 | process_sp->ReadMemory(data_location, m_data_64, sizeof(D64), | 732 | 56 | error); | 733 | 56 | } | 734 | 56 | return error.Success(); | 735 | 56 | } |
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::Update() Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::Update() |
736 | | |
737 | | template <typename D32, typename D64> |
738 | | bool |
739 | | lldb_private::formatters:: |
740 | 0 | GenericNSSetMSyntheticFrontEnd<D32, D64>::MightHaveChildren() { |
741 | 0 | return true; |
742 | 0 | } Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::MightHaveChildren() Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::MightHaveChildren() Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::MightHaveChildren() |
743 | | |
744 | | template <typename D32, typename D64> |
745 | | lldb::ValueObjectSP |
746 | | lldb_private::formatters:: |
747 | 68 | GenericNSSetMSyntheticFrontEnd<D32, D64>::GetChildAtIndex(size_t idx) { |
748 | 68 | lldb::addr_t m_objs_addr = |
749 | 68 | (m_data_32 ? m_data_32->_objs_addr0 : m_data_64->_objs_addr); |
750 | | |
751 | 68 | uint32_t num_children = CalculateNumChildren(); |
752 | | |
753 | 68 | if (idx >= num_children) |
754 | 0 | return lldb::ValueObjectSP(); |
755 | | |
756 | 68 | ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); |
757 | 68 | if (!process_sp) |
758 | 0 | return lldb::ValueObjectSP(); |
759 | | |
760 | 68 | if (m_children.empty()) { |
761 | | // do the scan phase |
762 | 12 | lldb::addr_t obj_at_idx = 0; |
763 | | |
764 | 12 | uint32_t tries = 0; |
765 | 12 | uint32_t test_idx = 0; |
766 | | |
767 | 160 | while (tries < num_children) { |
768 | 148 | obj_at_idx = m_objs_addr + (test_idx * m_ptr_size); |
769 | 148 | if (!process_sp) |
770 | 0 | return lldb::ValueObjectSP(); |
771 | 148 | Status error; |
772 | 148 | obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); |
773 | 148 | if (error.Fail()) |
774 | 0 | return lldb::ValueObjectSP(); |
775 | | |
776 | 148 | test_idx++; |
777 | | |
778 | 148 | if (!obj_at_idx) |
779 | 80 | continue; |
780 | 68 | tries++; |
781 | | |
782 | 68 | SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()}; |
783 | | |
784 | 68 | m_children.push_back(descriptor); |
785 | 68 | } |
786 | 12 | } |
787 | | |
788 | 68 | if (idx >= m_children.size()) // should never happen |
789 | 0 | return lldb::ValueObjectSP(); |
790 | | |
791 | 68 | SetItemDescriptor &set_item = m_children[idx]; |
792 | 68 | if (!set_item.valobj_sp) { |
793 | 68 | auto ptr_size = process_sp->GetAddressByteSize(); |
794 | 68 | DataBufferHeap buffer(ptr_size, 0); |
795 | 68 | switch (ptr_size) { |
796 | 0 | case 0: // architecture has no clue?? - fail |
797 | 0 | return lldb::ValueObjectSP(); |
798 | 0 | case 4: |
799 | 0 | *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; |
800 | 0 | break; |
801 | 68 | case 8: |
802 | 68 | *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; |
803 | 68 | break; |
804 | 0 | default: |
805 | 0 | assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); |
806 | 68 | } |
807 | 68 | StreamString idx_name; |
808 | 68 | idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); |
809 | | |
810 | 68 | DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), |
811 | 68 | process_sp->GetByteOrder(), |
812 | 68 | process_sp->GetAddressByteSize()); |
813 | | |
814 | 68 | set_item.valobj_sp = CreateValueObjectFromData( |
815 | 68 | idx_name.GetString(), data, m_exe_ctx_ref, |
816 | 68 | m_backend.GetCompilerType().GetBasicTypeFromAST( |
817 | 68 | lldb::eBasicTypeObjCID)); |
818 | 68 | } |
819 | 68 | return set_item.valobj_sp; |
820 | 68 | } lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor_32, lldb_private::formatters::Foundation1437::DataDescriptor_64>::GetChildAtIndex(unsigned long) Line | Count | Source | 747 | 68 | GenericNSSetMSyntheticFrontEnd<D32, D64>::GetChildAtIndex(size_t idx) { | 748 | 68 | lldb::addr_t m_objs_addr = | 749 | 68 | (m_data_32 ? m_data_32->_objs_addr0 : m_data_64->_objs_addr); | 750 | | | 751 | 68 | uint32_t num_children = CalculateNumChildren(); | 752 | | | 753 | 68 | if (idx >= num_children) | 754 | 0 | return lldb::ValueObjectSP(); | 755 | | | 756 | 68 | ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); | 757 | 68 | if (!process_sp) | 758 | 0 | return lldb::ValueObjectSP(); | 759 | | | 760 | 68 | if (m_children.empty()) { | 761 | | // do the scan phase | 762 | 12 | lldb::addr_t obj_at_idx = 0; | 763 | | | 764 | 12 | uint32_t tries = 0; | 765 | 12 | uint32_t test_idx = 0; | 766 | | | 767 | 160 | while (tries < num_children) { | 768 | 148 | obj_at_idx = m_objs_addr + (test_idx * m_ptr_size); | 769 | 148 | if (!process_sp) | 770 | 0 | return lldb::ValueObjectSP(); | 771 | 148 | Status error; | 772 | 148 | obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); | 773 | 148 | if (error.Fail()) | 774 | 0 | return lldb::ValueObjectSP(); | 775 | | | 776 | 148 | test_idx++; | 777 | | | 778 | 148 | if (!obj_at_idx) | 779 | 80 | continue; | 780 | 68 | tries++; | 781 | | | 782 | 68 | SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()}; | 783 | | | 784 | 68 | m_children.push_back(descriptor); | 785 | 68 | } | 786 | 12 | } | 787 | | | 788 | 68 | if (idx >= m_children.size()) // should never happen | 789 | 0 | return lldb::ValueObjectSP(); | 790 | | | 791 | 68 | SetItemDescriptor &set_item = m_children[idx]; | 792 | 68 | if (!set_item.valobj_sp) { | 793 | 68 | auto ptr_size = process_sp->GetAddressByteSize(); | 794 | 68 | DataBufferHeap buffer(ptr_size, 0); | 795 | 68 | switch (ptr_size) { | 796 | 0 | case 0: // architecture has no clue?? - fail | 797 | 0 | return lldb::ValueObjectSP(); | 798 | 0 | case 4: | 799 | 0 | *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; | 800 | 0 | break; | 801 | 68 | case 8: | 802 | 68 | *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; | 803 | 68 | break; | 804 | 0 | default: | 805 | 0 | assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); | 806 | 68 | } | 807 | 68 | StreamString idx_name; | 808 | 68 | idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); | 809 | | | 810 | 68 | DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), | 811 | 68 | process_sp->GetByteOrder(), | 812 | 68 | process_sp->GetAddressByteSize()); | 813 | | | 814 | 68 | set_item.valobj_sp = CreateValueObjectFromData( | 815 | 68 | idx_name.GetString(), data, m_exe_ctx_ref, | 816 | 68 | m_backend.GetCompilerType().GetBasicTypeFromAST( | 817 | 68 | lldb::eBasicTypeObjCID)); | 818 | 68 | } | 819 | 68 | return set_item.valobj_sp; | 820 | 68 | } |
Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::DataDescriptor_32, lldb_private::formatters::Foundation1428::DataDescriptor_64>::GetChildAtIndex(unsigned long) Unexecuted instantiation: lldb_private::formatters::GenericNSSetMSyntheticFrontEnd<lldb_private::formatters::Foundation1300::DataDescriptor_32, lldb_private::formatters::Foundation1300::DataDescriptor_64>::GetChildAtIndex(unsigned long) |
821 | | |
822 | | template bool lldb_private::formatters::NSSetSummaryProvider<true>( |
823 | | ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); |
824 | | |
825 | | template bool lldb_private::formatters::NSSetSummaryProvider<false>( |
826 | | ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); |