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

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp