Coverage Report

Created: 2023-09-21 18:56

/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
}