/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- ObjCLanguage.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 <mutex> |
10 | | |
11 | | #include "ObjCLanguage.h" |
12 | | |
13 | | #include "Plugins/ExpressionParser/Clang/ClangUtil.h" |
14 | | #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" |
15 | | #include "lldb/Core/Debugger.h" |
16 | | #include "lldb/Core/PluginManager.h" |
17 | | #include "lldb/Core/ValueObject.h" |
18 | | #include "lldb/DataFormatters/DataVisualization.h" |
19 | | #include "lldb/DataFormatters/FormattersHelpers.h" |
20 | | #include "lldb/Symbol/CompilerType.h" |
21 | | #include "lldb/Target/Target.h" |
22 | | #include "lldb/Utility/ConstString.h" |
23 | | #include "lldb/Utility/StreamString.h" |
24 | | |
25 | | #include "llvm/Support/Threading.h" |
26 | | |
27 | | #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h" |
28 | | #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h" |
29 | | |
30 | | #include "CF.h" |
31 | | #include "Cocoa.h" |
32 | | #include "CoreMedia.h" |
33 | | #include "NSDictionary.h" |
34 | | #include "NSSet.h" |
35 | | #include "NSString.h" |
36 | | |
37 | | using namespace lldb; |
38 | | using namespace lldb_private; |
39 | | using namespace lldb_private::formatters; |
40 | | |
41 | | LLDB_PLUGIN_DEFINE(ObjCLanguage) |
42 | | |
43 | 3.95k | void ObjCLanguage::Initialize() { |
44 | 3.95k | PluginManager::RegisterPlugin(GetPluginNameStatic(), "Objective-C Language", |
45 | 3.95k | CreateInstance); |
46 | 3.95k | } |
47 | | |
48 | 3.95k | void ObjCLanguage::Terminate() { |
49 | 3.95k | PluginManager::UnregisterPlugin(CreateInstance); |
50 | 3.95k | } |
51 | | |
52 | | // Static Functions |
53 | | |
54 | 164k | Language *ObjCLanguage::CreateInstance(lldb::LanguageType language) { |
55 | 164k | switch (language) { |
56 | 1.13k | case lldb::eLanguageTypeObjC: |
57 | 1.13k | return new ObjCLanguage(); |
58 | 163k | default: |
59 | 163k | return nullptr; |
60 | 164k | } |
61 | 164k | } |
62 | | |
63 | | std::optional<const ObjCLanguage::MethodName> |
64 | 92.0M | ObjCLanguage::MethodName::Create(llvm::StringRef name, bool strict) { |
65 | 92.0M | if (name.empty()) |
66 | 0 | return std::nullopt; |
67 | | |
68 | | // Objective-C method minimum requirements: |
69 | | // - If `strict` is true, must start with '-' or '+' (1 char) |
70 | | // - Must be followed by '[' (1 char) |
71 | | // - Must have at least one character for class name (1 char) |
72 | | // - Must have a space between class name and method name (1 char) |
73 | | // - Must have at least one character for method name (1 char) |
74 | | // - Must be end with ']' (1 char) |
75 | | // This means that the minimum size is 5 characters (6 if `strict`) |
76 | | // e.g. [a a] (-[a a] or +[a a] if `strict`) |
77 | | |
78 | | // We can check length and ending invariants first |
79 | 92.0M | if (name.size() < (5 + (strict ? 150.6k : 091.9M )) || name.back() != ']'91.4M ) |
80 | 85.5M | return std::nullopt; |
81 | | |
82 | | // Figure out type |
83 | 6.49M | Type type = eTypeUnspecified; |
84 | 6.49M | if (name.startswith("+[")) |
85 | 906k | type = eTypeClassMethod; |
86 | 5.58M | else if (name.startswith("-[")) |
87 | 5.58M | type = eTypeInstanceMethod; |
88 | | |
89 | | // If there's no type and it's strict, this is invalid |
90 | 6.49M | if (strict && type == eTypeUnspecified881 ) |
91 | 350 | return std::nullopt; |
92 | | |
93 | | // If not strict and type unspecified, make sure we start with '[' |
94 | 6.49M | if (type == eTypeUnspecified && name.front() != '['10 ) |
95 | 4 | return std::nullopt; |
96 | | |
97 | | // If we've gotten here, we're confident that this looks enough like an |
98 | | // Objective-C method to treat it like one. |
99 | 6.49M | ObjCLanguage::MethodName method_name(name, type); |
100 | 6.49M | return method_name; |
101 | 6.49M | } |
102 | | |
103 | 666k | llvm::StringRef ObjCLanguage::MethodName::GetClassName() const { |
104 | 666k | llvm::StringRef full = m_full; |
105 | 666k | const size_t class_start_pos = (full.front() == '[' ? 13 : 2666k ); |
106 | 666k | const size_t paren_pos = full.find('(', class_start_pos); |
107 | | // If there's a category we want to stop there |
108 | 666k | if (paren_pos != llvm::StringRef::npos) |
109 | 666k | return full.substr(class_start_pos, paren_pos - class_start_pos); |
110 | | |
111 | | // Otherwise we find the space separating the class and method |
112 | 524 | const size_t space_pos = full.find(' ', class_start_pos); |
113 | 524 | return full.substr(class_start_pos, space_pos - class_start_pos); |
114 | 666k | } |
115 | | |
116 | 12 | llvm::StringRef ObjCLanguage::MethodName::GetClassNameWithCategory() const { |
117 | 12 | llvm::StringRef full = m_full; |
118 | 12 | const size_t class_start_pos = (full.front() == '[' ? 12 : 210 ); |
119 | 12 | const size_t space_pos = full.find(' ', class_start_pos); |
120 | 12 | return full.substr(class_start_pos, space_pos - class_start_pos); |
121 | 12 | } |
122 | | |
123 | 7.15M | llvm::StringRef ObjCLanguage::MethodName::GetSelector() const { |
124 | 7.15M | llvm::StringRef full = m_full; |
125 | 7.15M | const size_t space_pos = full.find(' '); |
126 | 7.15M | if (space_pos == llvm::StringRef::npos) |
127 | 0 | return llvm::StringRef(); |
128 | 7.15M | const size_t closing_bracket = full.find(']', space_pos); |
129 | 7.15M | return full.substr(space_pos + 1, closing_bracket - space_pos - 1); |
130 | 7.15M | } |
131 | | |
132 | 10 | llvm::StringRef ObjCLanguage::MethodName::GetCategory() const { |
133 | 10 | llvm::StringRef full = m_full; |
134 | 10 | const size_t open_paren_pos = full.find('('); |
135 | 10 | const size_t close_paren_pos = full.find(')'); |
136 | | |
137 | 10 | if (open_paren_pos == llvm::StringRef::npos || |
138 | 10 | close_paren_pos == llvm::StringRef::npos5 ) |
139 | 5 | return llvm::StringRef(); |
140 | | |
141 | 5 | return full.substr(open_paren_pos + 1, |
142 | 5 | close_paren_pos - (open_paren_pos + 1)); |
143 | 10 | } |
144 | | |
145 | 6.48M | std::string ObjCLanguage::MethodName::GetFullNameWithoutCategory() const { |
146 | 6.48M | llvm::StringRef full = m_full; |
147 | 6.48M | const size_t open_paren_pos = full.find('('); |
148 | 6.48M | const size_t close_paren_pos = full.find(')'); |
149 | 6.48M | if (open_paren_pos == llvm::StringRef::npos || |
150 | 6.48M | close_paren_pos == llvm::StringRef::npos666k ) |
151 | 5.82M | return std::string(); |
152 | | |
153 | 666k | llvm::StringRef class_name = GetClassName(); |
154 | 666k | llvm::StringRef selector_name = GetSelector(); |
155 | | |
156 | | // Compute the total size to avoid reallocations |
157 | | // class name + selector name + '[' + ' ' + ']' |
158 | 666k | size_t total_size = class_name.size() + selector_name.size() + 3; |
159 | 666k | if (m_type != eTypeUnspecified) |
160 | 666k | total_size++; // For + or - |
161 | | |
162 | 666k | std::string name_sans_category; |
163 | 666k | name_sans_category.reserve(total_size); |
164 | | |
165 | 666k | if (m_type == eTypeClassMethod) |
166 | 146k | name_sans_category += '+'; |
167 | 520k | else if (m_type == eTypeInstanceMethod) |
168 | 520k | name_sans_category += '-'; |
169 | | |
170 | 666k | name_sans_category += '['; |
171 | 666k | name_sans_category.append(class_name.data(), class_name.size()); |
172 | 666k | name_sans_category += ' '; |
173 | 666k | name_sans_category.append(selector_name.data(), selector_name.size()); |
174 | 666k | name_sans_category += ']'; |
175 | | |
176 | 666k | return name_sans_category; |
177 | 6.48M | } |
178 | | |
179 | | std::vector<Language::MethodNameVariant> |
180 | 91.9M | ObjCLanguage::GetMethodNameVariants(ConstString method_name) const { |
181 | 91.9M | std::vector<Language::MethodNameVariant> variant_names; |
182 | 91.9M | std::optional<const ObjCLanguage::MethodName> objc_method = |
183 | 91.9M | ObjCLanguage::MethodName::Create(method_name.GetStringRef(), false); |
184 | 91.9M | if (!objc_method) |
185 | 85.5M | return variant_names; |
186 | | |
187 | 6.48M | variant_names.emplace_back(ConstString(objc_method->GetSelector()), |
188 | 6.48M | lldb::eFunctionNameTypeSelector); |
189 | | |
190 | 6.48M | const std::string name_sans_category = |
191 | 6.48M | objc_method->GetFullNameWithoutCategory(); |
192 | | |
193 | 6.48M | if (objc_method->IsClassMethod() || objc_method->IsInstanceMethod()5.58M ) { |
194 | 6.48M | if (!name_sans_category.empty()) |
195 | 666k | variant_names.emplace_back(ConstString(name_sans_category.c_str()), |
196 | 666k | lldb::eFunctionNameTypeFull); |
197 | 6.48M | } else { |
198 | 4 | StreamString strm; |
199 | | |
200 | 4 | strm.Printf("+%s", objc_method->GetFullName().c_str()); |
201 | 4 | variant_names.emplace_back(ConstString(strm.GetString()), |
202 | 4 | lldb::eFunctionNameTypeFull); |
203 | 4 | strm.Clear(); |
204 | | |
205 | 4 | strm.Printf("-%s", objc_method->GetFullName().c_str()); |
206 | 4 | variant_names.emplace_back(ConstString(strm.GetString()), |
207 | 4 | lldb::eFunctionNameTypeFull); |
208 | 4 | strm.Clear(); |
209 | | |
210 | 4 | if (!name_sans_category.empty()) { |
211 | 0 | strm.Printf("+%s", name_sans_category.c_str()); |
212 | 0 | variant_names.emplace_back(ConstString(strm.GetString()), |
213 | 0 | lldb::eFunctionNameTypeFull); |
214 | 0 | strm.Clear(); |
215 | |
|
216 | 0 | strm.Printf("-%s", name_sans_category.c_str()); |
217 | 0 | variant_names.emplace_back(ConstString(strm.GetString()), |
218 | 0 | lldb::eFunctionNameTypeFull); |
219 | 0 | } |
220 | 4 | } |
221 | | |
222 | 6.48M | return variant_names; |
223 | 91.9M | } |
224 | | |
225 | 160k | bool ObjCLanguage::SymbolNameFitsToLanguage(Mangled mangled) const { |
226 | 160k | ConstString demangled_name = mangled.GetDemangledName(); |
227 | 160k | if (!demangled_name) |
228 | 20 | return false; |
229 | 160k | return ObjCLanguage::IsPossibleObjCMethodName(demangled_name.GetCString()); |
230 | 160k | } |
231 | | |
232 | 702 | static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) { |
233 | 702 | if (!objc_category_sp) |
234 | 0 | return; |
235 | | |
236 | 702 | TypeSummaryImpl::Flags objc_flags; |
237 | 702 | objc_flags.SetCascades(false) |
238 | 702 | .SetSkipPointers(true) |
239 | 702 | .SetSkipReferences(true) |
240 | 702 | .SetDontShowChildren(true) |
241 | 702 | .SetDontShowValue(true) |
242 | 702 | .SetShowMembersOneLiner(false) |
243 | 702 | .SetHideItemNames(false); |
244 | | |
245 | 702 | lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat( |
246 | 702 | objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider, "")); |
247 | 702 | objc_category_sp->AddTypeSummary("BOOL", eFormatterMatchExact, |
248 | 702 | ObjC_BOOL_summary); |
249 | 702 | objc_category_sp->AddTypeSummary("BOOL &", eFormatterMatchExact, |
250 | 702 | ObjC_BOOL_summary); |
251 | 702 | objc_category_sp->AddTypeSummary("BOOL *", eFormatterMatchExact, |
252 | 702 | ObjC_BOOL_summary); |
253 | | |
254 | | // we need to skip pointers here since we are special casing a SEL* when |
255 | | // retrieving its value |
256 | 702 | objc_flags.SetSkipPointers(true); |
257 | 702 | AddCXXSummary(objc_category_sp, |
258 | 702 | lldb_private::formatters::ObjCSELSummaryProvider<false>, |
259 | 702 | "SEL summary provider", "SEL", objc_flags); |
260 | 702 | AddCXXSummary(objc_category_sp, |
261 | 702 | lldb_private::formatters::ObjCSELSummaryProvider<false>, |
262 | 702 | "SEL summary provider", "struct objc_selector", objc_flags); |
263 | 702 | AddCXXSummary(objc_category_sp, |
264 | 702 | lldb_private::formatters::ObjCSELSummaryProvider<false>, |
265 | 702 | "SEL summary provider", "objc_selector", objc_flags); |
266 | 702 | AddCXXSummary(objc_category_sp, |
267 | 702 | lldb_private::formatters::ObjCSELSummaryProvider<true>, |
268 | 702 | "SEL summary provider", "objc_selector *", objc_flags); |
269 | 702 | AddCXXSummary(objc_category_sp, |
270 | 702 | lldb_private::formatters::ObjCSELSummaryProvider<true>, |
271 | 702 | "SEL summary provider", "SEL *", objc_flags); |
272 | | |
273 | 702 | AddCXXSummary(objc_category_sp, |
274 | 702 | lldb_private::formatters::ObjCClassSummaryProvider, |
275 | 702 | "Class summary provider", "Class", objc_flags); |
276 | | |
277 | 702 | SyntheticChildren::Flags class_synth_flags; |
278 | 702 | class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( |
279 | 702 | false); |
280 | | |
281 | 702 | AddCXXSynthetic(objc_category_sp, |
282 | 702 | lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, |
283 | 702 | "Class synthetic children", "Class", class_synth_flags); |
284 | | |
285 | 702 | objc_flags.SetSkipPointers(false); |
286 | 702 | objc_flags.SetCascades(true); |
287 | 702 | objc_flags.SetSkipReferences(false); |
288 | | |
289 | 702 | AddStringSummary(objc_category_sp, "${var.__FuncPtr%A}", |
290 | 702 | "__block_literal_generic", objc_flags); |
291 | | |
292 | 702 | AddStringSummary(objc_category_sp, |
293 | 702 | "${var.years} years, ${var.months} " |
294 | 702 | "months, ${var.days} days, ${var.hours} " |
295 | 702 | "hours, ${var.minutes} minutes " |
296 | 702 | "${var.seconds} seconds", |
297 | 702 | "CFGregorianUnits", objc_flags); |
298 | 702 | AddStringSummary(objc_category_sp, |
299 | 702 | "location=${var.location} length=${var.length}", "CFRange", |
300 | 702 | objc_flags); |
301 | | |
302 | 702 | AddStringSummary(objc_category_sp, |
303 | 702 | "location=${var.location}, length=${var.length}", "NSRange", |
304 | 702 | objc_flags); |
305 | 702 | AddStringSummary(objc_category_sp, "(${var.origin}, ${var.size}), ...", |
306 | 702 | "NSRectArray", objc_flags); |
307 | | |
308 | 702 | AddOneLineSummary(objc_category_sp, "NSPoint", objc_flags); |
309 | 702 | AddOneLineSummary(objc_category_sp, "NSSize", objc_flags); |
310 | 702 | AddOneLineSummary(objc_category_sp, "NSRect", objc_flags); |
311 | | |
312 | 702 | AddOneLineSummary(objc_category_sp, "CGSize", objc_flags); |
313 | 702 | AddOneLineSummary(objc_category_sp, "CGPoint", objc_flags); |
314 | 702 | AddOneLineSummary(objc_category_sp, "CGRect", objc_flags); |
315 | | |
316 | 702 | AddStringSummary(objc_category_sp, |
317 | 702 | "red=${var.red} green=${var.green} blue=${var.blue}", |
318 | 702 | "RGBColor", objc_flags); |
319 | 702 | AddStringSummary( |
320 | 702 | objc_category_sp, |
321 | 702 | "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})", "Rect", |
322 | 702 | objc_flags); |
323 | 702 | AddStringSummary(objc_category_sp, "{(v=${var.v}, h=${var.h})}", "Point", |
324 | 702 | objc_flags); |
325 | 702 | AddStringSummary(objc_category_sp, |
326 | 702 | "${var.month}/${var.day}/${var.year} ${var.hour} " |
327 | 702 | ":${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}", |
328 | 702 | "DateTimeRect *", objc_flags); |
329 | 702 | AddStringSummary(objc_category_sp, |
330 | 702 | "${var.ld.month}/${var.ld.day}/" |
331 | 702 | "${var.ld.year} ${var.ld.hour} " |
332 | 702 | ":${var.ld.minute} :${var.ld.second} " |
333 | 702 | "dayOfWeek:${var.ld.dayOfWeek}", |
334 | 702 | "LongDateRect", objc_flags); |
335 | 702 | AddStringSummary(objc_category_sp, "(x=${var.x}, y=${var.y})", "HIPoint", |
336 | 702 | objc_flags); |
337 | 702 | AddStringSummary(objc_category_sp, "origin=${var.origin} size=${var.size}", |
338 | 702 | "HIRect", objc_flags); |
339 | | |
340 | 702 | TypeSummaryImpl::Flags appkit_flags; |
341 | 702 | appkit_flags.SetCascades(true) |
342 | 702 | .SetSkipPointers(false) |
343 | 702 | .SetSkipReferences(false) |
344 | 702 | .SetDontShowChildren(true) |
345 | 702 | .SetDontShowValue(false) |
346 | 702 | .SetShowMembersOneLiner(false) |
347 | 702 | .SetHideItemNames(false); |
348 | | |
349 | 702 | appkit_flags.SetDontShowChildren(false); |
350 | | |
351 | 702 | AddCXXSummary(objc_category_sp, |
352 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
353 | 702 | "NSArray summary provider", "NSArray", appkit_flags); |
354 | 702 | AddCXXSummary(objc_category_sp, |
355 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
356 | 702 | "NSArray summary provider", "NSConstantArray", appkit_flags); |
357 | 702 | AddCXXSummary(objc_category_sp, |
358 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
359 | 702 | "NSArray summary provider", "NSMutableArray", appkit_flags); |
360 | 702 | AddCXXSummary(objc_category_sp, |
361 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
362 | 702 | "NSArray summary provider", "__NSArrayI", appkit_flags); |
363 | 702 | AddCXXSummary(objc_category_sp, |
364 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
365 | 702 | "NSArray summary provider", "__NSArray0", appkit_flags); |
366 | 702 | AddCXXSummary( |
367 | 702 | objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, |
368 | 702 | "NSArray summary provider", "__NSSingleObjectArrayI", appkit_flags); |
369 | 702 | AddCXXSummary(objc_category_sp, |
370 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
371 | 702 | "NSArray summary provider", "__NSArrayM", appkit_flags); |
372 | 702 | AddCXXSummary(objc_category_sp, |
373 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
374 | 702 | "NSArray summary provider", "__NSCFArray", appkit_flags); |
375 | 702 | AddCXXSummary(objc_category_sp, |
376 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
377 | 702 | "NSArray summary provider", "_NSCallStackArray", appkit_flags); |
378 | 702 | AddCXXSummary(objc_category_sp, |
379 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
380 | 702 | "NSArray summary provider", "CFArrayRef", appkit_flags); |
381 | 702 | AddCXXSummary(objc_category_sp, |
382 | 702 | lldb_private::formatters::NSArraySummaryProvider, |
383 | 702 | "NSArray summary provider", "CFMutableArrayRef", appkit_flags); |
384 | | |
385 | 702 | AddCXXSummary(objc_category_sp, |
386 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
387 | 702 | "NSDictionary summary provider", "NSDictionary", appkit_flags); |
388 | 702 | AddCXXSummary(objc_category_sp, |
389 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
390 | 702 | "NSDictionary summary provider", "NSConstantDictionary", |
391 | 702 | appkit_flags); |
392 | 702 | AddCXXSummary(objc_category_sp, |
393 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
394 | 702 | "NSDictionary summary provider", "NSMutableDictionary", |
395 | 702 | appkit_flags); |
396 | 702 | AddCXXSummary(objc_category_sp, |
397 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
398 | 702 | "NSDictionary summary provider", "__NSCFDictionary", |
399 | 702 | appkit_flags); |
400 | 702 | AddCXXSummary(objc_category_sp, |
401 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
402 | 702 | "NSDictionary summary provider", "__NSDictionaryI", |
403 | 702 | appkit_flags); |
404 | 702 | AddCXXSummary(objc_category_sp, |
405 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
406 | 702 | "NSDictionary summary provider", "__NSSingleEntryDictionaryI", |
407 | 702 | appkit_flags); |
408 | 702 | AddCXXSummary(objc_category_sp, |
409 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<false>, |
410 | 702 | "NSDictionary summary provider", "__NSDictionaryM", |
411 | 702 | appkit_flags); |
412 | 702 | AddCXXSummary(objc_category_sp, |
413 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<true>, |
414 | 702 | "NSDictionary summary provider", "CFDictionaryRef", |
415 | 702 | appkit_flags); |
416 | 702 | AddCXXSummary(objc_category_sp, |
417 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<true>, |
418 | 702 | "NSDictionary summary provider", "__CFDictionary", |
419 | 702 | appkit_flags); |
420 | 702 | AddCXXSummary(objc_category_sp, |
421 | 702 | lldb_private::formatters::NSDictionarySummaryProvider<true>, |
422 | 702 | "NSDictionary summary provider", "CFMutableDictionaryRef", |
423 | 702 | appkit_flags); |
424 | | |
425 | 702 | AddCXXSummary(objc_category_sp, |
426 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
427 | 702 | "NSSet summary", "NSSet", appkit_flags); |
428 | 702 | AddCXXSummary(objc_category_sp, |
429 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
430 | 702 | "NSMutableSet summary", "NSMutableSet", appkit_flags); |
431 | 702 | AddCXXSummary(objc_category_sp, |
432 | 702 | lldb_private::formatters::NSSetSummaryProvider<true>, |
433 | 702 | "CFSetRef summary", "CFSetRef", appkit_flags); |
434 | 702 | AddCXXSummary(objc_category_sp, |
435 | 702 | lldb_private::formatters::NSSetSummaryProvider<true>, |
436 | 702 | "CFMutableSetRef summary", "CFMutableSetRef", appkit_flags); |
437 | 702 | AddCXXSummary(objc_category_sp, |
438 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
439 | 702 | "__NSCFSet summary", "__NSCFSet", appkit_flags); |
440 | 702 | AddCXXSummary(objc_category_sp, |
441 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
442 | 702 | "__CFSet summary", "__CFSet", appkit_flags); |
443 | 702 | AddCXXSummary(objc_category_sp, |
444 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
445 | 702 | "__NSSetI summary", "__NSSetI", appkit_flags); |
446 | 702 | AddCXXSummary(objc_category_sp, |
447 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
448 | 702 | "__NSSetM summary", "__NSSetM", appkit_flags); |
449 | 702 | AddCXXSummary(objc_category_sp, |
450 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
451 | 702 | "NSCountedSet summary", "NSCountedSet", appkit_flags); |
452 | 702 | AddCXXSummary(objc_category_sp, |
453 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
454 | 702 | "NSMutableSet summary", "NSMutableSet", appkit_flags); |
455 | 702 | AddCXXSummary(objc_category_sp, |
456 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
457 | 702 | "NSOrderedSet summary", "NSOrderedSet", appkit_flags); |
458 | 702 | AddCXXSummary(objc_category_sp, |
459 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
460 | 702 | "__NSOrderedSetI summary", "__NSOrderedSetI", appkit_flags); |
461 | 702 | AddCXXSummary(objc_category_sp, |
462 | 702 | lldb_private::formatters::NSSetSummaryProvider<false>, |
463 | 702 | "__NSOrderedSetM summary", "__NSOrderedSetM", appkit_flags); |
464 | | |
465 | 702 | AddCXXSummary(objc_category_sp, |
466 | 702 | lldb_private::formatters::NSError_SummaryProvider, |
467 | 702 | "NSError summary provider", "NSError", appkit_flags); |
468 | 702 | AddCXXSummary(objc_category_sp, |
469 | 702 | lldb_private::formatters::NSException_SummaryProvider, |
470 | 702 | "NSException summary provider", "NSException", appkit_flags); |
471 | | |
472 | | // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", |
473 | | // ConstString("$_lldb_typegen_nspair"), appkit_flags); |
474 | | |
475 | 702 | appkit_flags.SetDontShowChildren(true); |
476 | | |
477 | 702 | AddCXXSynthetic(objc_category_sp, |
478 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
479 | 702 | "NSArray synthetic children", "__NSArrayM", |
480 | 702 | ScriptedSyntheticChildren::Flags()); |
481 | 702 | AddCXXSynthetic(objc_category_sp, |
482 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
483 | 702 | "NSArray synthetic children", "__NSArrayI", |
484 | 702 | ScriptedSyntheticChildren::Flags()); |
485 | 702 | AddCXXSynthetic(objc_category_sp, |
486 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
487 | 702 | "NSArray synthetic children", "__NSArray0", |
488 | 702 | ScriptedSyntheticChildren::Flags()); |
489 | 702 | AddCXXSynthetic(objc_category_sp, |
490 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
491 | 702 | "NSArray synthetic children", "__NSSingleObjectArrayI", |
492 | 702 | ScriptedSyntheticChildren::Flags()); |
493 | 702 | AddCXXSynthetic(objc_category_sp, |
494 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
495 | 702 | "NSArray synthetic children", "NSArray", |
496 | 702 | ScriptedSyntheticChildren::Flags()); |
497 | 702 | AddCXXSynthetic(objc_category_sp, |
498 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
499 | 702 | "NSArray synthetic children", "NSConstantArray", |
500 | 702 | ScriptedSyntheticChildren::Flags()); |
501 | 702 | AddCXXSynthetic(objc_category_sp, |
502 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
503 | 702 | "NSArray synthetic children", "NSMutableArray", |
504 | 702 | ScriptedSyntheticChildren::Flags()); |
505 | 702 | AddCXXSynthetic(objc_category_sp, |
506 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
507 | 702 | "NSArray synthetic children", "__NSCFArray", |
508 | 702 | ScriptedSyntheticChildren::Flags()); |
509 | 702 | AddCXXSynthetic(objc_category_sp, |
510 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
511 | 702 | "NSArray synthetic children", "_NSCallStackArray", |
512 | 702 | ScriptedSyntheticChildren::Flags()); |
513 | 702 | AddCXXSynthetic(objc_category_sp, |
514 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
515 | 702 | "NSArray synthetic children", "CFMutableArrayRef", |
516 | 702 | ScriptedSyntheticChildren::Flags()); |
517 | 702 | AddCXXSynthetic(objc_category_sp, |
518 | 702 | lldb_private::formatters::NSArraySyntheticFrontEndCreator, |
519 | 702 | "NSArray synthetic children", "CFArrayRef", |
520 | 702 | ScriptedSyntheticChildren::Flags()); |
521 | | |
522 | 702 | AddCXXSynthetic( |
523 | 702 | objc_category_sp, |
524 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
525 | 702 | "NSDictionary synthetic children", "__NSDictionaryM", |
526 | 702 | ScriptedSyntheticChildren::Flags()); |
527 | 702 | AddCXXSynthetic( |
528 | 702 | objc_category_sp, |
529 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
530 | 702 | "NSDictionary synthetic children", "NSConstantDictionary", |
531 | 702 | ScriptedSyntheticChildren::Flags()); |
532 | 702 | AddCXXSynthetic( |
533 | 702 | objc_category_sp, |
534 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
535 | 702 | "NSDictionary synthetic children", "__NSDictionaryI", |
536 | 702 | ScriptedSyntheticChildren::Flags()); |
537 | 702 | AddCXXSynthetic( |
538 | 702 | objc_category_sp, |
539 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
540 | 702 | "NSDictionary synthetic children", "__NSSingleEntryDictionaryI", |
541 | 702 | ScriptedSyntheticChildren::Flags()); |
542 | 702 | AddCXXSynthetic( |
543 | 702 | objc_category_sp, |
544 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
545 | 702 | "NSDictionary synthetic children", "__NSCFDictionary", |
546 | 702 | ScriptedSyntheticChildren::Flags()); |
547 | 702 | AddCXXSynthetic( |
548 | 702 | objc_category_sp, |
549 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
550 | 702 | "NSDictionary synthetic children", "NSDictionary", |
551 | 702 | ScriptedSyntheticChildren::Flags()); |
552 | 702 | AddCXXSynthetic( |
553 | 702 | objc_category_sp, |
554 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
555 | 702 | "NSDictionary synthetic children", "NSMutableDictionary", |
556 | 702 | ScriptedSyntheticChildren::Flags()); |
557 | 702 | AddCXXSynthetic( |
558 | 702 | objc_category_sp, |
559 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
560 | 702 | "NSDictionary synthetic children", "CFDictionaryRef", |
561 | 702 | ScriptedSyntheticChildren::Flags()); |
562 | 702 | AddCXXSynthetic( |
563 | 702 | objc_category_sp, |
564 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
565 | 702 | "NSDictionary synthetic children", "CFMutableDictionaryRef", |
566 | 702 | ScriptedSyntheticChildren::Flags()); |
567 | 702 | AddCXXSynthetic( |
568 | 702 | objc_category_sp, |
569 | 702 | lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, |
570 | 702 | "NSDictionary synthetic children", "__CFDictionary", |
571 | 702 | ScriptedSyntheticChildren::Flags()); |
572 | | |
573 | 702 | AddCXXSynthetic(objc_category_sp, |
574 | 702 | lldb_private::formatters::NSErrorSyntheticFrontEndCreator, |
575 | 702 | "NSError synthetic children", "NSError", |
576 | 702 | ScriptedSyntheticChildren::Flags()); |
577 | 702 | AddCXXSynthetic(objc_category_sp, |
578 | 702 | lldb_private::formatters::NSExceptionSyntheticFrontEndCreator, |
579 | 702 | "NSException synthetic children", "NSException", |
580 | 702 | ScriptedSyntheticChildren::Flags()); |
581 | | |
582 | 702 | AddCXXSynthetic( |
583 | 702 | objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
584 | 702 | "NSSet synthetic children", "NSSet", ScriptedSyntheticChildren::Flags()); |
585 | 702 | AddCXXSynthetic(objc_category_sp, |
586 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
587 | 702 | "__NSSetI synthetic children", "__NSSetI", |
588 | 702 | ScriptedSyntheticChildren::Flags()); |
589 | 702 | AddCXXSynthetic(objc_category_sp, |
590 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
591 | 702 | "__NSSetM synthetic children", "__NSSetM", |
592 | 702 | ScriptedSyntheticChildren::Flags()); |
593 | 702 | AddCXXSynthetic(objc_category_sp, |
594 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
595 | 702 | "__NSCFSet synthetic children", "__NSCFSet", |
596 | 702 | ScriptedSyntheticChildren::Flags()); |
597 | 702 | AddCXXSynthetic(objc_category_sp, |
598 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
599 | 702 | "CFSetRef synthetic children", "CFSetRef", |
600 | 702 | ScriptedSyntheticChildren::Flags()); |
601 | | |
602 | 702 | AddCXXSynthetic(objc_category_sp, |
603 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
604 | 702 | "NSMutableSet synthetic children", "NSMutableSet", |
605 | 702 | ScriptedSyntheticChildren::Flags()); |
606 | 702 | AddCXXSynthetic(objc_category_sp, |
607 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
608 | 702 | "NSOrderedSet synthetic children", "NSOrderedSet", |
609 | 702 | ScriptedSyntheticChildren::Flags()); |
610 | 702 | AddCXXSynthetic(objc_category_sp, |
611 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
612 | 702 | "__NSOrderedSetI synthetic children", "__NSOrderedSetI", |
613 | 702 | ScriptedSyntheticChildren::Flags()); |
614 | 702 | AddCXXSynthetic(objc_category_sp, |
615 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
616 | 702 | "__NSOrderedSetM synthetic children", "__NSOrderedSetM", |
617 | 702 | ScriptedSyntheticChildren::Flags()); |
618 | 702 | AddCXXSynthetic(objc_category_sp, |
619 | 702 | lldb_private::formatters::NSSetSyntheticFrontEndCreator, |
620 | 702 | "__CFSet synthetic children", "__CFSet", |
621 | 702 | ScriptedSyntheticChildren::Flags()); |
622 | | |
623 | 702 | AddCXXSynthetic(objc_category_sp, |
624 | 702 | lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, |
625 | 702 | "NSIndexPath synthetic children", "NSIndexPath", |
626 | 702 | ScriptedSyntheticChildren::Flags()); |
627 | | |
628 | 702 | AddCXXSummary(objc_category_sp, |
629 | 702 | lldb_private::formatters::CFBagSummaryProvider, |
630 | 702 | "CFBag summary provider", "CFBagRef", appkit_flags); |
631 | 702 | AddCXXSummary(objc_category_sp, |
632 | 702 | lldb_private::formatters::CFBagSummaryProvider, |
633 | 702 | "CFBag summary provider", "__CFBag", appkit_flags); |
634 | 702 | AddCXXSummary(objc_category_sp, |
635 | 702 | lldb_private::formatters::CFBagSummaryProvider, |
636 | 702 | "CFBag summary provider", "const struct __CFBag", appkit_flags); |
637 | 702 | AddCXXSummary(objc_category_sp, |
638 | 702 | lldb_private::formatters::CFBagSummaryProvider, |
639 | 702 | "CFBag summary provider", "CFMutableBagRef", appkit_flags); |
640 | | |
641 | 702 | AddCXXSummary( |
642 | 702 | objc_category_sp, lldb_private::formatters::CFBinaryHeapSummaryProvider, |
643 | 702 | "CFBinaryHeap summary provider", "CFBinaryHeapRef", appkit_flags); |
644 | 702 | AddCXXSummary( |
645 | 702 | objc_category_sp, lldb_private::formatters::CFBinaryHeapSummaryProvider, |
646 | 702 | "CFBinaryHeap summary provider", "__CFBinaryHeap", appkit_flags); |
647 | | |
648 | 702 | AddCXXSummary(objc_category_sp, |
649 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
650 | 702 | "NSString summary provider", "NSString", appkit_flags); |
651 | 702 | AddCXXSummary(objc_category_sp, |
652 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
653 | 702 | "NSString summary provider", "CFStringRef", appkit_flags); |
654 | 702 | AddCXXSummary(objc_category_sp, |
655 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
656 | 702 | "NSString summary provider", "__CFString", appkit_flags); |
657 | 702 | AddCXXSummary( |
658 | 702 | objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, |
659 | 702 | "NSString summary provider", "CFMutableStringRef", appkit_flags); |
660 | 702 | AddCXXSummary(objc_category_sp, |
661 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
662 | 702 | "NSString summary provider", "NSMutableString", appkit_flags); |
663 | 702 | AddCXXSummary( |
664 | 702 | objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, |
665 | 702 | "NSString summary provider", "__NSCFConstantString", appkit_flags); |
666 | 702 | AddCXXSummary(objc_category_sp, |
667 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
668 | 702 | "NSString summary provider", "__NSCFString", appkit_flags); |
669 | 702 | AddCXXSummary( |
670 | 702 | objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, |
671 | 702 | "NSString summary provider", "NSCFConstantString", appkit_flags); |
672 | 702 | AddCXXSummary(objc_category_sp, |
673 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
674 | 702 | "NSString summary provider", "NSCFString", appkit_flags); |
675 | 702 | AddCXXSummary(objc_category_sp, |
676 | 702 | lldb_private::formatters::NSStringSummaryProvider, |
677 | 702 | "NSString summary provider", "NSPathStore2", appkit_flags); |
678 | 702 | AddCXXSummary( |
679 | 702 | objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, |
680 | 702 | "NSString summary provider", "NSTaggedPointerString", appkit_flags); |
681 | | |
682 | 702 | AddCXXSummary(objc_category_sp, |
683 | 702 | lldb_private::formatters::NSAttributedStringSummaryProvider, |
684 | 702 | "NSAttributedString summary provider", "NSAttributedString", |
685 | 702 | appkit_flags); |
686 | 702 | AddCXXSummary( |
687 | 702 | objc_category_sp, |
688 | 702 | lldb_private::formatters::NSMutableAttributedStringSummaryProvider, |
689 | 702 | "NSMutableAttributedString summary provider", "NSMutableAttributedString", |
690 | 702 | appkit_flags); |
691 | 702 | AddCXXSummary( |
692 | 702 | objc_category_sp, |
693 | 702 | lldb_private::formatters::NSMutableAttributedStringSummaryProvider, |
694 | 702 | "NSMutableAttributedString summary provider", |
695 | 702 | "NSConcreteMutableAttributedString", appkit_flags); |
696 | | |
697 | 702 | AddCXXSummary(objc_category_sp, |
698 | 702 | lldb_private::formatters::NSBundleSummaryProvider, |
699 | 702 | "NSBundle summary provider", "NSBundle", appkit_flags); |
700 | | |
701 | 702 | AddCXXSummary(objc_category_sp, |
702 | 702 | lldb_private::formatters::NSDataSummaryProvider<false>, |
703 | 702 | "NSData summary provider", "NSData", appkit_flags); |
704 | 702 | AddCXXSummary(objc_category_sp, |
705 | 702 | lldb_private::formatters::NSDataSummaryProvider<false>, |
706 | 702 | "NSData summary provider", "_NSInlineData", appkit_flags); |
707 | 702 | AddCXXSummary(objc_category_sp, |
708 | 702 | lldb_private::formatters::NSDataSummaryProvider<false>, |
709 | 702 | "NSData summary provider", "NSConcreteData", appkit_flags); |
710 | 702 | AddCXXSummary( |
711 | 702 | objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, |
712 | 702 | "NSData summary provider", "NSConcreteMutableData", appkit_flags); |
713 | 702 | AddCXXSummary(objc_category_sp, |
714 | 702 | lldb_private::formatters::NSDataSummaryProvider<false>, |
715 | 702 | "NSData summary provider", "NSMutableData", appkit_flags); |
716 | 702 | AddCXXSummary(objc_category_sp, |
717 | 702 | lldb_private::formatters::NSDataSummaryProvider<false>, |
718 | 702 | "NSData summary provider", "__NSCFData", appkit_flags); |
719 | 702 | AddCXXSummary(objc_category_sp, |
720 | 702 | lldb_private::formatters::NSDataSummaryProvider<true>, |
721 | 702 | "NSData summary provider", "CFDataRef", appkit_flags); |
722 | 702 | AddCXXSummary(objc_category_sp, |
723 | 702 | lldb_private::formatters::NSDataSummaryProvider<true>, |
724 | 702 | "NSData summary provider", "CFMutableDataRef", appkit_flags); |
725 | | |
726 | 702 | AddCXXSummary(objc_category_sp, |
727 | 702 | lldb_private::formatters::NSMachPortSummaryProvider, |
728 | 702 | "NSMachPort summary provider", "NSMachPort", appkit_flags); |
729 | | |
730 | 702 | AddCXXSummary( |
731 | 702 | objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, |
732 | 702 | "NSNotification summary provider", "NSNotification", appkit_flags); |
733 | 702 | AddCXXSummary(objc_category_sp, |
734 | 702 | lldb_private::formatters::NSNotificationSummaryProvider, |
735 | 702 | "NSNotification summary provider", "NSConcreteNotification", |
736 | 702 | appkit_flags); |
737 | | |
738 | 702 | AddCXXSummary(objc_category_sp, |
739 | 702 | lldb_private::formatters::NSNumberSummaryProvider, |
740 | 702 | "NSNumber summary provider", "NSNumber", appkit_flags); |
741 | 702 | AddCXXSummary( |
742 | 702 | objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, |
743 | 702 | "NSNumber summary provider", "NSConstantIntegerNumber", appkit_flags); |
744 | 702 | AddCXXSummary( |
745 | 702 | objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, |
746 | 702 | "NSNumber summary provider", "NSConstantDoubleNumber", appkit_flags); |
747 | 702 | AddCXXSummary( |
748 | 702 | objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, |
749 | 702 | "NSNumber summary provider", "NSConstantFloatNumber", appkit_flags); |
750 | 702 | AddCXXSummary(objc_category_sp, |
751 | 702 | lldb_private::formatters::NSNumberSummaryProvider, |
752 | 702 | "CFNumberRef summary provider", "CFNumberRef", appkit_flags); |
753 | 702 | AddCXXSummary(objc_category_sp, |
754 | 702 | lldb_private::formatters::NSNumberSummaryProvider, |
755 | 702 | "NSNumber summary provider", "__NSCFBoolean", appkit_flags); |
756 | 702 | AddCXXSummary(objc_category_sp, |
757 | 702 | lldb_private::formatters::NSNumberSummaryProvider, |
758 | 702 | "NSNumber summary provider", "__NSCFNumber", appkit_flags); |
759 | 702 | AddCXXSummary(objc_category_sp, |
760 | 702 | lldb_private::formatters::NSNumberSummaryProvider, |
761 | 702 | "NSNumber summary provider", "NSCFBoolean", appkit_flags); |
762 | 702 | AddCXXSummary(objc_category_sp, |
763 | 702 | lldb_private::formatters::NSNumberSummaryProvider, |
764 | 702 | "NSNumber summary provider", "NSCFNumber", appkit_flags); |
765 | 702 | AddCXXSummary( |
766 | 702 | objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, |
767 | 702 | "NSDecimalNumber summary provider", "NSDecimalNumber", appkit_flags); |
768 | | |
769 | 702 | AddCXXSummary(objc_category_sp, |
770 | 702 | lldb_private::formatters::NSURLSummaryProvider, |
771 | 702 | "NSURL summary provider", "NSURL", appkit_flags); |
772 | 702 | AddCXXSummary(objc_category_sp, |
773 | 702 | lldb_private::formatters::NSURLSummaryProvider, |
774 | 702 | "NSURL summary provider", "CFURLRef", appkit_flags); |
775 | | |
776 | 702 | AddCXXSummary(objc_category_sp, |
777 | 702 | lldb_private::formatters::NSDateSummaryProvider, |
778 | 702 | "NSDate summary provider", "NSDate", appkit_flags); |
779 | 702 | AddCXXSummary(objc_category_sp, |
780 | 702 | lldb_private::formatters::NSDateSummaryProvider, |
781 | 702 | "NSDate summary provider", "__NSDate", appkit_flags); |
782 | 702 | AddCXXSummary(objc_category_sp, |
783 | 702 | lldb_private::formatters::NSDateSummaryProvider, |
784 | 702 | "NSDate summary provider", "__NSTaggedDate", appkit_flags); |
785 | 702 | AddCXXSummary(objc_category_sp, |
786 | 702 | lldb_private::formatters::NSDateSummaryProvider, |
787 | 702 | "NSDate summary provider", "NSCalendarDate", appkit_flags); |
788 | | |
789 | 702 | AddCXXSummary(objc_category_sp, |
790 | 702 | lldb_private::formatters::NSTimeZoneSummaryProvider, |
791 | 702 | "NSTimeZone summary provider", "NSTimeZone", appkit_flags); |
792 | 702 | AddCXXSummary(objc_category_sp, |
793 | 702 | lldb_private::formatters::NSTimeZoneSummaryProvider, |
794 | 702 | "NSTimeZone summary provider", "CFTimeZoneRef", appkit_flags); |
795 | 702 | AddCXXSummary(objc_category_sp, |
796 | 702 | lldb_private::formatters::NSTimeZoneSummaryProvider, |
797 | 702 | "NSTimeZone summary provider", "__NSTimeZone", appkit_flags); |
798 | | |
799 | | // CFAbsoluteTime is actually a double rather than a pointer to an object we |
800 | | // do not care about the numeric value, since it is probably meaningless to |
801 | | // users |
802 | 702 | appkit_flags.SetDontShowValue(true); |
803 | 702 | AddCXXSummary( |
804 | 702 | objc_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, |
805 | 702 | "CFAbsoluteTime summary provider", "CFAbsoluteTime", appkit_flags); |
806 | 702 | appkit_flags.SetDontShowValue(false); |
807 | | |
808 | 702 | AddCXXSummary(objc_category_sp, |
809 | 702 | lldb_private::formatters::NSIndexSetSummaryProvider, |
810 | 702 | "NSIndexSet summary provider", "NSIndexSet", appkit_flags); |
811 | 702 | AddCXXSummary( |
812 | 702 | objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, |
813 | 702 | "NSIndexSet summary provider", "NSMutableIndexSet", appkit_flags); |
814 | | |
815 | 702 | AddStringSummary(objc_category_sp, |
816 | 702 | "@\"${var.month%d}/${var.day%d}/${var.year%d} " |
817 | 702 | "${var.hour%d}:${var.minute%d}:${var.second}\"", |
818 | 702 | "CFGregorianDate", appkit_flags); |
819 | | |
820 | 702 | AddCXXSummary(objc_category_sp, |
821 | 702 | lldb_private::formatters::CFBitVectorSummaryProvider, |
822 | 702 | "CFBitVector summary provider", "CFBitVectorRef", appkit_flags); |
823 | 702 | AddCXXSummary( |
824 | 702 | objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, |
825 | 702 | "CFBitVector summary provider", "CFMutableBitVectorRef", appkit_flags); |
826 | 702 | AddCXXSummary(objc_category_sp, |
827 | 702 | lldb_private::formatters::CFBitVectorSummaryProvider, |
828 | 702 | "CFBitVector summary provider", "__CFBitVector", appkit_flags); |
829 | 702 | AddCXXSummary( |
830 | 702 | objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, |
831 | 702 | "CFBitVector summary provider", "__CFMutableBitVector", appkit_flags); |
832 | 702 | } |
833 | | |
834 | 702 | static void LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp) { |
835 | 702 | if (!objc_category_sp) |
836 | 0 | return; |
837 | | |
838 | 702 | TypeSummaryImpl::Flags cm_flags; |
839 | 702 | cm_flags.SetCascades(true) |
840 | 702 | .SetDontShowChildren(false) |
841 | 702 | .SetDontShowValue(false) |
842 | 702 | .SetHideItemNames(false) |
843 | 702 | .SetShowMembersOneLiner(false) |
844 | 702 | .SetSkipPointers(false) |
845 | 702 | .SetSkipReferences(false); |
846 | | |
847 | 702 | AddCXXSummary(objc_category_sp, |
848 | 702 | lldb_private::formatters::CMTimeSummaryProvider, |
849 | 702 | "CMTime summary provider", "CMTime", cm_flags); |
850 | 702 | } |
851 | | |
852 | 702 | lldb::TypeCategoryImplSP ObjCLanguage::GetFormatters() { |
853 | 702 | static llvm::once_flag g_initialize; |
854 | 702 | static TypeCategoryImplSP g_category; |
855 | | |
856 | 702 | llvm::call_once(g_initialize, [this]() -> void { |
857 | 702 | DataVisualization::Categories::GetCategory(ConstString(GetPluginName()), |
858 | 702 | g_category); |
859 | 702 | if (g_category) { |
860 | 702 | LoadCoreMediaFormatters(g_category); |
861 | 702 | LoadObjCFormatters(g_category); |
862 | 702 | } |
863 | 702 | }); |
864 | 702 | return g_category; |
865 | 702 | } |
866 | | |
867 | | std::vector<FormattersMatchCandidate> |
868 | | ObjCLanguage::GetPossibleFormattersMatches(ValueObject &valobj, |
869 | 34.4k | lldb::DynamicValueType use_dynamic) { |
870 | 34.4k | std::vector<FormattersMatchCandidate> result; |
871 | | |
872 | 34.4k | if (use_dynamic == lldb::eNoDynamicValues) |
873 | 31.7k | return result; |
874 | | |
875 | 2.63k | CompilerType compiler_type(valobj.GetCompilerType()); |
876 | | |
877 | 2.63k | const bool check_cpp = false; |
878 | 2.63k | const bool check_objc = true; |
879 | 2.63k | bool canBeObjCDynamic = |
880 | 2.63k | compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc); |
881 | | |
882 | 2.63k | if (canBeObjCDynamic && ClangUtil::IsClangType(compiler_type)2.28k ) { |
883 | 2.28k | do { |
884 | 2.28k | lldb::ProcessSP process_sp = valobj.GetProcessSP(); |
885 | 2.28k | if (!process_sp) |
886 | 12 | break; |
887 | 2.27k | ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp); |
888 | 2.27k | if (runtime == nullptr) |
889 | 0 | break; |
890 | 2.27k | ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp( |
891 | 2.27k | runtime->GetClassDescriptor(valobj)); |
892 | 2.27k | if (!objc_class_sp) |
893 | 40 | break; |
894 | 2.23k | if (ConstString name = objc_class_sp->GetClassName()) |
895 | 2.23k | result.push_back( |
896 | 2.23k | {name, valobj.GetTargetSP()->GetDebugger().GetScriptInterpreter(), |
897 | 2.23k | TypeImpl(objc_class_sp->GetType()), |
898 | 2.23k | FormattersMatchCandidate::Flags{}}); |
899 | 2.23k | } while (false); |
900 | 2.28k | } |
901 | | |
902 | 0 | return result; |
903 | 34.4k | } |
904 | | |
905 | 17 | std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() { |
906 | 17 | class ObjCScavengerResult : public Language::TypeScavenger::Result { |
907 | 17 | public: |
908 | 17 | ObjCScavengerResult(CompilerType type) |
909 | 17 | : Language::TypeScavenger::Result()8 , m_compiler_type(type)8 {}8 |
910 | | |
911 | 17 | bool IsValid() override { return m_compiler_type.IsValid(); }16 |
912 | | |
913 | 17 | bool DumpToStream(Stream &stream, bool print_help_if_available) override { |
914 | 8 | if (IsValid()) { |
915 | 8 | m_compiler_type.DumpTypeDescription(&stream); |
916 | 8 | stream.EOL(); |
917 | 8 | return true; |
918 | 8 | } |
919 | 0 | return false; |
920 | 8 | } |
921 | | |
922 | 17 | private: |
923 | 17 | CompilerType m_compiler_type; |
924 | 17 | }; |
925 | | |
926 | 17 | class ObjCRuntimeScavenger : public Language::TypeScavenger { |
927 | 17 | protected: |
928 | 17 | bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, |
929 | 17 | ResultSet &results) override { |
930 | 15 | bool result = false; |
931 | | |
932 | 15 | if (auto *process = exe_scope->CalculateProcess().get()) { |
933 | 12 | if (auto *objc_runtime = ObjCLanguageRuntime::Get(*process)) { |
934 | 12 | if (auto *decl_vendor = objc_runtime->GetDeclVendor()) { |
935 | 12 | ConstString name(key); |
936 | 12 | for (const CompilerType &type : |
937 | 12 | decl_vendor->FindTypes(name, /*max_matches*/ UINT32_MAX)) { |
938 | 6 | result = true; |
939 | 6 | std::unique_ptr<Language::TypeScavenger::Result> result( |
940 | 6 | new ObjCScavengerResult(type)); |
941 | 6 | results.insert(std::move(result)); |
942 | 6 | } |
943 | 12 | } |
944 | 12 | } |
945 | 12 | } |
946 | | |
947 | 15 | return result; |
948 | 15 | } |
949 | | |
950 | 17 | friend class lldb_private::ObjCLanguage; |
951 | 17 | }; |
952 | | |
953 | 17 | class ObjCModulesScavenger : public Language::TypeScavenger { |
954 | 17 | protected: |
955 | 17 | bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, |
956 | 17 | ResultSet &results) override { |
957 | 17 | bool result = false; |
958 | | |
959 | 17 | if (auto *target = exe_scope->CalculateTarget().get()) { |
960 | 17 | auto *persistent_vars = llvm::cast<ClangPersistentVariables>( |
961 | 17 | target->GetPersistentExpressionStateForLanguage( |
962 | 17 | lldb::eLanguageTypeC)); |
963 | 17 | if (std::shared_ptr<ClangModulesDeclVendor> clang_modules_decl_vendor = |
964 | 17 | persistent_vars->GetClangModulesDeclVendor()) { |
965 | 14 | ConstString key_cs(key); |
966 | 14 | auto types = clang_modules_decl_vendor->FindTypes( |
967 | 14 | key_cs, /*max_matches*/ UINT32_MAX); |
968 | 14 | if (!types.empty()) { |
969 | 2 | result = true; |
970 | 2 | std::unique_ptr<Language::TypeScavenger::Result> result( |
971 | 2 | new ObjCScavengerResult(types.front())); |
972 | 2 | results.insert(std::move(result)); |
973 | 2 | } |
974 | 14 | } |
975 | 17 | } |
976 | | |
977 | 17 | return result; |
978 | 17 | } |
979 | | |
980 | 17 | friend class lldb_private::ObjCLanguage; |
981 | 17 | }; |
982 | | |
983 | 17 | class ObjCDebugInfoScavenger : public Language::ImageListTypeScavenger { |
984 | 17 | public: |
985 | 17 | CompilerType AdjustForInclusion(CompilerType &candidate) override { |
986 | 2 | LanguageType lang_type(candidate.GetMinimumLanguage()); |
987 | 2 | if (!Language::LanguageIsObjC(lang_type)) |
988 | 0 | return CompilerType(); |
989 | 2 | if (candidate.IsTypedefType()) |
990 | 0 | return candidate.GetTypedefedType(); |
991 | 2 | return candidate; |
992 | 2 | } |
993 | 17 | }; |
994 | | |
995 | 17 | return std::unique_ptr<TypeScavenger>( |
996 | 17 | new Language::EitherTypeScavenger<ObjCModulesScavenger, |
997 | 17 | ObjCRuntimeScavenger, |
998 | 17 | ObjCDebugInfoScavenger>()); |
999 | 17 | } |
1000 | | |
1001 | | std::pair<llvm::StringRef, llvm::StringRef> |
1002 | 1.61k | ObjCLanguage::GetFormatterPrefixSuffix(llvm::StringRef type_hint) { |
1003 | 1.61k | static constexpr llvm::StringRef empty; |
1004 | 1.61k | static const llvm::StringMap< |
1005 | 1.61k | std::pair<const llvm::StringRef, const llvm::StringRef>> |
1006 | 1.61k | g_affix_map = { |
1007 | 1.61k | {"CFBag", {"@", empty}}, |
1008 | 1.61k | {"CFBinaryHeap", {"@", empty}}, |
1009 | 1.61k | {"NSString", {"@", empty}}, |
1010 | 1.61k | {"NSString*", {"@", empty}}, |
1011 | 1.61k | {"NSNumber:char", {"(char)", empty}}, |
1012 | 1.61k | {"NSNumber:short", {"(short)", empty}}, |
1013 | 1.61k | {"NSNumber:int", {"(int)", empty}}, |
1014 | 1.61k | {"NSNumber:long", {"(long)", empty}}, |
1015 | 1.61k | {"NSNumber:int128_t", {"(int128_t)", empty}}, |
1016 | 1.61k | {"NSNumber:float", {"(float)", empty}}, |
1017 | 1.61k | {"NSNumber:double", {"(double)", empty}}, |
1018 | 1.61k | {"NSData", {"@\"", "\""}}, |
1019 | 1.61k | {"NSArray", {"@\"", "\""}}, |
1020 | 1.61k | }; |
1021 | 1.61k | return g_affix_map.lookup(type_hint); |
1022 | 1.61k | } |
1023 | | |
1024 | 2.58k | bool ObjCLanguage::IsNilReference(ValueObject &valobj) { |
1025 | 2.58k | const uint32_t mask = eTypeIsObjC | eTypeIsPointer; |
1026 | 2.58k | bool isObjCpointer = |
1027 | 2.58k | (((valobj.GetCompilerType().GetTypeInfo(nullptr)) & mask) == mask); |
1028 | 2.58k | if (!isObjCpointer) |
1029 | 381 | return false; |
1030 | 2.20k | bool canReadValue = true; |
1031 | 2.20k | bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0; |
1032 | 2.20k | return canReadValue && isZero2.18k ; |
1033 | 2.58k | } |
1034 | | |
1035 | 855 | bool ObjCLanguage::IsSourceFile(llvm::StringRef file_path) const { |
1036 | 855 | const auto suffixes = {".h", ".m", ".M"}; |
1037 | 1.79k | for (auto suffix : suffixes) { |
1038 | 1.79k | if (file_path.ends_with_insensitive(suffix)) |
1039 | 771 | return true; |
1040 | 1.79k | } |
1041 | 84 | return false; |
1042 | 855 | } |