blob: 65b175392dacadab9e3bae871a1832a866618575 [file] [log] [blame]
Greg Clayton4a33d312011-06-23 17:59:56 +00001//===-- FormatManager.cpp -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Enrico Granata5548cb52013-01-28 23:47:25 +000010#include "lldb/DataFormatters/FormatManager.h"
Greg Clayton4a33d312011-06-23 17:59:56 +000011
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16
Enrico Granataf2bbf712011-07-15 02:26:42 +000017#include "lldb/Core/Debugger.h"
Enrico Granata419d7912015-09-04 00:33:51 +000018#include "lldb/DataFormatters/CF.h"
19#include "lldb/DataFormatters/Cocoa.h"
20#include "lldb/DataFormatters/CoreMedia.h"
21#include "lldb/DataFormatters/CXXFunctionPointer.h"
Enrico Granata419d7912015-09-04 00:33:51 +000022#include "lldb/DataFormatters/VectorType.h"
Enrico Granatadf7e79e2015-09-02 01:21:31 +000023#include "lldb/DataFormatters/FormattersHelpers.h"
Enrico Granata980c0482015-09-01 18:22:39 +000024#include "lldb/DataFormatters/LanguageCategory.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000025#include "lldb/Target/ExecutionContext.h"
Enrico Granata33e97e62015-09-04 21:01:18 +000026#include "lldb/Target/Language.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000027#include "lldb/Target/Platform.h"
Saleem Abdulrasool28606952014-06-27 05:17:41 +000028#include "llvm/ADT/STLExtras.h"
Enrico Granataf2bbf712011-07-15 02:26:42 +000029
Enrico Granata980c0482015-09-01 18:22:39 +000030#include <initializer_list>
31
Greg Clayton4a33d312011-06-23 17:59:56 +000032using namespace lldb;
33using namespace lldb_private;
Enrico Granatadf7e79e2015-09-02 01:21:31 +000034using namespace lldb_private::formatters;
Greg Claytonbb7f31f2011-06-23 21:22:24 +000035
36struct FormatInfo
37{
38 Format format;
39 const char format_char; // One or more format characters that can be used for this format.
40 const char *format_name; // Long format name that can be used to specify the current format
41};
42
43static FormatInfo
44g_format_infos[] =
45{
46 { eFormatDefault , '\0' , "default" },
47 { eFormatBoolean , 'B' , "boolean" },
48 { eFormatBinary , 'b' , "binary" },
49 { eFormatBytes , 'y' , "bytes" },
50 { eFormatBytesWithASCII , 'Y' , "bytes with ASCII" },
51 { eFormatChar , 'c' , "character" },
52 { eFormatCharPrintable , 'C' , "printable character" },
53 { eFormatComplexFloat , 'F' , "complex float" },
54 { eFormatCString , 's' , "c-string" },
Greg Clayton5009f9d2011-10-27 17:55:14 +000055 { eFormatDecimal , 'd' , "decimal" },
Greg Claytonbb7f31f2011-06-23 21:22:24 +000056 { eFormatEnum , 'E' , "enumeration" },
57 { eFormatHex , 'x' , "hex" },
Enrico Granata7ec18e32012-08-09 19:33:34 +000058 { eFormatHexUppercase , 'X' , "uppercase hex" },
Greg Claytonbb7f31f2011-06-23 21:22:24 +000059 { eFormatFloat , 'f' , "float" },
60 { eFormatOctal , 'o' , "octal" },
61 { eFormatOSType , 'O' , "OSType" },
62 { eFormatUnicode16 , 'U' , "unicode16" },
63 { eFormatUnicode32 , '\0' , "unicode32" },
64 { eFormatUnsigned , 'u' , "unsigned decimal" },
65 { eFormatPointer , 'p' , "pointer" },
66 { eFormatVectorOfChar , '\0' , "char[]" },
67 { eFormatVectorOfSInt8 , '\0' , "int8_t[]" },
68 { eFormatVectorOfUInt8 , '\0' , "uint8_t[]" },
69 { eFormatVectorOfSInt16 , '\0' , "int16_t[]" },
70 { eFormatVectorOfUInt16 , '\0' , "uint16_t[]" },
Enrico Granatae443ba72011-07-06 15:56:06 +000071 { eFormatVectorOfSInt32 , '\0' , "int32_t[]" },
72 { eFormatVectorOfUInt32 , '\0' , "uint32_t[]" },
73 { eFormatVectorOfSInt64 , '\0' , "int64_t[]" },
74 { eFormatVectorOfUInt64 , '\0' , "uint64_t[]" },
Greg Claytonbb7f31f2011-06-23 21:22:24 +000075 { eFormatVectorOfFloat32, '\0' , "float32[]" },
76 { eFormatVectorOfFloat64, '\0' , "float64[]" },
77 { eFormatVectorOfUInt128, '\0' , "uint128_t[]" },
78 { eFormatComplexInteger , 'I' , "complex integer" },
Greg Clayton5009f9d2011-10-27 17:55:14 +000079 { eFormatCharArray , 'a' , "character array" },
80 { eFormatAddressInfo , 'A' , "address" },
Enrico Granata7ec18e32012-08-09 19:33:34 +000081 { eFormatHexFloat , '\0' , "hex float" },
Sean Callananbf154da2012-08-08 17:35:10 +000082 { eFormatInstruction , 'i' , "instruction" },
83 { eFormatVoid , 'v' , "void" }
Greg Claytonbb7f31f2011-06-23 21:22:24 +000084};
85
Saleem Abdulrasool28606952014-06-27 05:17:41 +000086static uint32_t g_num_format_infos = llvm::array_lengthof(g_format_infos);
Greg Claytonbb7f31f2011-06-23 21:22:24 +000087
88static bool
89GetFormatFromFormatChar (char format_char, Format &format)
90{
91 for (uint32_t i=0; i<g_num_format_infos; ++i)
92 {
93 if (g_format_infos[i].format_char == format_char)
94 {
95 format = g_format_infos[i].format;
96 return true;
97 }
98 }
99 format = eFormatInvalid;
100 return false;
101}
102
103static bool
104GetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format &format)
105{
106 uint32_t i;
107 for (i=0; i<g_num_format_infos; ++i)
108 {
109 if (strcasecmp (g_format_infos[i].format_name, format_name) == 0)
110 {
111 format = g_format_infos[i].format;
112 return true;
113 }
114 }
115
116 if (partial_match_ok)
117 {
118 for (i=0; i<g_num_format_infos; ++i)
119 {
120 if (strcasestr (g_format_infos[i].format_name, format_name) == g_format_infos[i].format_name)
121 {
122 format = g_format_infos[i].format;
123 return true;
124 }
125 }
126 }
127 format = eFormatInvalid;
128 return false;
129}
130
131bool
132FormatManager::GetFormatFromCString (const char *format_cstr,
133 bool partial_match_ok,
134 lldb::Format &format)
135{
136 bool success = false;
137 if (format_cstr && format_cstr[0])
138 {
139 if (format_cstr[1] == '\0')
140 {
141 success = GetFormatFromFormatChar (format_cstr[0], format);
142 if (success)
143 return true;
144 }
145
146 success = GetFormatFromFormatName (format_cstr, partial_match_ok, format);
147 }
148 if (!success)
149 format = eFormatInvalid;
150 return success;
151}
152
153char
154FormatManager::GetFormatAsFormatChar (lldb::Format format)
155{
156 for (uint32_t i=0; i<g_num_format_infos; ++i)
157 {
158 if (g_format_infos[i].format == format)
159 return g_format_infos[i].format_char;
160 }
161 return '\0';
162}
Greg Claytonbb7f31f2011-06-23 21:22:24 +0000163
164const char *
165FormatManager::GetFormatAsCString (Format format)
166{
167 if (format >= eFormatDefault && format < kNumFormats)
168 return g_format_infos[format].format_name;
169 return NULL;
170}
Enrico Granata0a3958e2011-07-02 00:25:22 +0000171
Enrico Granatade61cec2013-11-22 00:02:13 +0000172void
Enrico Granata33e97e62015-09-04 21:01:18 +0000173FormatManager::EnableAllCategories ()
174{
175 m_categories_map.EnableAllCategories ();
176 Mutex::Locker lang_locker(m_language_categories_mutex);
177 for (auto& iter : m_language_categories_map)
178 {
179 if (iter.second)
180 iter.second->Enable();
181 }
182}
183
184void
185FormatManager::DisableAllCategories ()
186{
187 m_categories_map.DisableAllCategories ();
188 Mutex::Locker lang_locker(m_language_categories_mutex);
189 for (auto& iter : m_language_categories_map)
190 {
191 if (iter.second)
192 iter.second->Disable();
193 }
194}
195
196void
Enrico Granatade61cec2013-11-22 00:02:13 +0000197FormatManager::GetPossibleMatches (ValueObject& valobj,
Greg Claytona1e5dc82015-08-11 22:53:00 +0000198 CompilerType clang_type,
Enrico Granatade61cec2013-11-22 00:02:13 +0000199 uint32_t reason,
200 lldb::DynamicValueType use_dynamic,
201 FormattersMatchVector& entries,
202 bool did_strip_ptr,
203 bool did_strip_ref,
204 bool did_strip_typedef,
205 bool root_level)
206{
Greg Claytond8d4a572015-08-11 21:38:15 +0000207 clang_type = ClangASTContext::RemoveFastQualifiers(clang_type);
Enrico Granatade61cec2013-11-22 00:02:13 +0000208 ConstString type_name(clang_type.GetConstTypeName());
209 if (valobj.GetBitfieldBitSize() > 0)
210 {
211 StreamString sstring;
212 sstring.Printf("%s:%d",type_name.AsCString(),valobj.GetBitfieldBitSize());
213 ConstString bitfieldname = ConstString(sstring.GetData());
214 entries.push_back({bitfieldname,0,did_strip_ptr,did_strip_ref,did_strip_typedef});
215 reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField;
216 }
217 entries.push_back({type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef});
Enrico Granatae8daa2f2014-05-17 19:14:17 +0000218
219 ConstString display_type_name(clang_type.GetDisplayTypeName());
220 if (display_type_name != type_name)
221 entries.push_back({display_type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef});
222
Enrico Granata1ac62962014-04-10 00:14:07 +0000223 for (bool is_rvalue_ref = true, j = true; j && clang_type.IsReferenceType(nullptr, &is_rvalue_ref); j = false)
Enrico Granatade61cec2013-11-22 00:02:13 +0000224 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000225 CompilerType non_ref_type = clang_type.GetNonReferenceType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000226 GetPossibleMatches(valobj,
227 non_ref_type,
228 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference,
229 use_dynamic,
230 entries,
231 did_strip_ptr,
232 true,
233 did_strip_typedef);
Enrico Granata1ac62962014-04-10 00:14:07 +0000234 if (non_ref_type.IsTypedefType())
235 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000236 CompilerType deffed_referenced_type = non_ref_type.GetTypedefedType();
Greg Claytond8d4a572015-08-11 21:38:15 +0000237 deffed_referenced_type = is_rvalue_ref ? ClangASTContext::GetRValueReferenceType(deffed_referenced_type) : ClangASTContext::GetLValueReferenceType(deffed_referenced_type);
Enrico Granata1ac62962014-04-10 00:14:07 +0000238 GetPossibleMatches(valobj,
239 deffed_referenced_type,
240 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
241 use_dynamic,
242 entries,
243 did_strip_ptr,
244 did_strip_ref,
245 true); // this is not exactly the usual meaning of stripping typedefs
246 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000247 }
Enrico Granata1ac62962014-04-10 00:14:07 +0000248
249 if (clang_type.IsPointerType())
Enrico Granatade61cec2013-11-22 00:02:13 +0000250 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000251 CompilerType non_ptr_type = clang_type.GetPointeeType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000252 GetPossibleMatches(valobj,
253 non_ptr_type,
254 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference,
255 use_dynamic,
256 entries,
257 true,
258 did_strip_ref,
259 did_strip_typedef);
Enrico Granata1ac62962014-04-10 00:14:07 +0000260 if (non_ptr_type.IsTypedefType())
261 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000262 CompilerType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType();
Enrico Granata1ac62962014-04-10 00:14:07 +0000263 GetPossibleMatches(valobj,
264 deffed_pointed_type,
265 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
266 use_dynamic,
267 entries,
268 did_strip_ptr,
269 did_strip_ref,
270 true); // this is not exactly the usual meaning of stripping typedefs
271 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000272 }
273 bool canBeObjCDynamic = clang_type.IsPossibleDynamicType (NULL,
274 false, // no C
275 true); // yes ObjC
276
277 if (canBeObjCDynamic)
278 {
279 if (use_dynamic != lldb::eNoDynamicValues)
280 {
281 do
282 {
283 lldb::ProcessSP process_sp = valobj.GetProcessSP();
Enrico Granata2265acf2015-01-28 19:23:51 +0000284 if (!process_sp)
285 break;
Enrico Granatade61cec2013-11-22 00:02:13 +0000286 ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime();
287 if (runtime == nullptr)
288 break;
289 ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj));
290 if (!objc_class_sp)
291 break;
292 ConstString name (objc_class_sp->GetClassName());
293 entries.push_back({name,reason | lldb_private::eFormatterChoiceCriterionDynamicObjCDiscovery,did_strip_ptr,did_strip_ref,did_strip_typedef});
294 } while (false);
295 }
296
Greg Claytona1e5dc82015-08-11 22:53:00 +0000297 CompilerType non_ptr_type = clang_type.GetPointeeType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000298 GetPossibleMatches(valobj,
299 non_ptr_type,
300 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference,
301 use_dynamic,
302 entries,
303 true,
304 did_strip_ref,
305 did_strip_typedef);
306 }
307
308 // try to strip typedef chains
309 if (clang_type.IsTypedefType())
310 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000311 CompilerType deffed_type = clang_type.GetTypedefedType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000312 GetPossibleMatches(valobj,
313 deffed_type,
314 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
315 use_dynamic,
316 entries,
317 did_strip_ptr,
318 did_strip_ref,
319 true);
320 }
321
322 if (root_level)
323 {
324 do {
325 if (!clang_type.IsValid())
326 break;
327
Greg Claytona1e5dc82015-08-11 22:53:00 +0000328 CompilerType unqual_clang_ast_type = clang_type.GetFullyUnqualifiedType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000329 if (!unqual_clang_ast_type.IsValid())
330 break;
331 if (unqual_clang_ast_type.GetOpaqueQualType() != clang_type.GetOpaqueQualType())
332 GetPossibleMatches (valobj,
333 unqual_clang_ast_type,
334 reason,
335 use_dynamic,
336 entries,
337 did_strip_ptr,
338 did_strip_ref,
339 did_strip_typedef);
340 } while(false);
341
342
343 // if all else fails, go to static type
344 if (valobj.IsDynamic())
345 {
346 lldb::ValueObjectSP static_value_sp(valobj.GetStaticValue());
347 if (static_value_sp)
348 GetPossibleMatches(*static_value_sp.get(),
Greg Clayton99558cc42015-08-24 23:46:31 +0000349 static_value_sp->GetCompilerType(),
Enrico Granatade61cec2013-11-22 00:02:13 +0000350 reason | lldb_private::eFormatterChoiceCriterionWentToStaticValue,
351 use_dynamic,
352 entries,
353 did_strip_ptr,
354 did_strip_ref,
355 did_strip_typedef,
356 true);
357 }
358 }
359}
360
Enrico Granata852cc952013-10-08 19:03:22 +0000361lldb::TypeFormatImplSP
362FormatManager::GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp)
363{
364 if (!type_sp)
365 return lldb::TypeFormatImplSP();
366 lldb::TypeFormatImplSP format_chosen_sp;
367 uint32_t num_categories = m_categories_map.GetCount();
368 lldb::TypeCategoryImplSP category_sp;
369 uint32_t prio_category = UINT32_MAX;
370 for (uint32_t category_id = 0;
371 category_id < num_categories;
372 category_id++)
373 {
374 category_sp = GetCategoryAtIndex(category_id);
375 if (category_sp->IsEnabled() == false)
376 continue;
377 lldb::TypeFormatImplSP format_current_sp = category_sp->GetFormatForType(type_sp);
378 if (format_current_sp && (format_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
379 {
380 prio_category = category_sp->GetEnabledPosition();
381 format_chosen_sp = format_current_sp;
382 }
383 }
384 return format_chosen_sp;
385}
386
Enrico Granataa777dc22012-05-08 21:49:57 +0000387lldb::TypeSummaryImplSP
388FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
389{
390 if (!type_sp)
391 return lldb::TypeSummaryImplSP();
392 lldb::TypeSummaryImplSP summary_chosen_sp;
393 uint32_t num_categories = m_categories_map.GetCount();
394 lldb::TypeCategoryImplSP category_sp;
395 uint32_t prio_category = UINT32_MAX;
396 for (uint32_t category_id = 0;
397 category_id < num_categories;
398 category_id++)
399 {
400 category_sp = GetCategoryAtIndex(category_id);
401 if (category_sp->IsEnabled() == false)
402 continue;
403 lldb::TypeSummaryImplSP summary_current_sp = category_sp->GetSummaryForType(type_sp);
404 if (summary_current_sp && (summary_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
405 {
406 prio_category = category_sp->GetEnabledPosition();
407 summary_chosen_sp = summary_current_sp;
408 }
409 }
410 return summary_chosen_sp;
411}
412
413lldb::TypeFilterImplSP
414FormatManager::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
415{
416 if (!type_sp)
417 return lldb::TypeFilterImplSP();
418 lldb::TypeFilterImplSP filter_chosen_sp;
419 uint32_t num_categories = m_categories_map.GetCount();
420 lldb::TypeCategoryImplSP category_sp;
421 uint32_t prio_category = UINT32_MAX;
422 for (uint32_t category_id = 0;
423 category_id < num_categories;
424 category_id++)
425 {
426 category_sp = GetCategoryAtIndex(category_id);
427 if (category_sp->IsEnabled() == false)
428 continue;
429 lldb::TypeFilterImplSP filter_current_sp((TypeFilterImpl*)category_sp->GetFilterForType(type_sp).get());
430 if (filter_current_sp && (filter_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
431 {
432 prio_category = category_sp->GetEnabledPosition();
433 filter_chosen_sp = filter_current_sp;
434 }
435 }
436 return filter_chosen_sp;
437}
438
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000439#ifndef LLDB_DISABLE_PYTHON
Enrico Granata5548cb52013-01-28 23:47:25 +0000440lldb::ScriptedSyntheticChildrenSP
Enrico Granataa777dc22012-05-08 21:49:57 +0000441FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
442{
443 if (!type_sp)
Enrico Granata5548cb52013-01-28 23:47:25 +0000444 return lldb::ScriptedSyntheticChildrenSP();
445 lldb::ScriptedSyntheticChildrenSP synth_chosen_sp;
Enrico Granataa777dc22012-05-08 21:49:57 +0000446 uint32_t num_categories = m_categories_map.GetCount();
447 lldb::TypeCategoryImplSP category_sp;
448 uint32_t prio_category = UINT32_MAX;
449 for (uint32_t category_id = 0;
450 category_id < num_categories;
451 category_id++)
452 {
453 category_sp = GetCategoryAtIndex(category_id);
454 if (category_sp->IsEnabled() == false)
455 continue;
Enrico Granata5548cb52013-01-28 23:47:25 +0000456 lldb::ScriptedSyntheticChildrenSP synth_current_sp((ScriptedSyntheticChildren*)category_sp->GetSyntheticForType(type_sp).get());
Enrico Granataa777dc22012-05-08 21:49:57 +0000457 if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
458 {
459 prio_category = category_sp->GetEnabledPosition();
460 synth_chosen_sp = synth_current_sp;
461 }
462 }
463 return synth_chosen_sp;
464}
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000465#endif
Enrico Granataa777dc22012-05-08 21:49:57 +0000466
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000467#ifndef LLDB_DISABLE_PYTHON
Enrico Granataa777dc22012-05-08 21:49:57 +0000468lldb::SyntheticChildrenSP
469FormatManager::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp)
470{
471 if (!type_sp)
472 return lldb::SyntheticChildrenSP();
473 lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp);
Enrico Granata5548cb52013-01-28 23:47:25 +0000474 lldb::ScriptedSyntheticChildrenSP synth_sp = GetSyntheticForType(type_sp);
Enrico Granataa777dc22012-05-08 21:49:57 +0000475 if (filter_sp->GetRevision() > synth_sp->GetRevision())
476 return lldb::SyntheticChildrenSP(filter_sp.get());
477 else
478 return lldb::SyntheticChildrenSP(synth_sp.get());
479}
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000480#endif
Enrico Granataa777dc22012-05-08 21:49:57 +0000481
Enrico Granatac5827132014-09-05 20:45:07 +0000482lldb::TypeValidatorImplSP
483FormatManager::GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp)
484{
485 if (!type_sp)
486 return lldb::TypeValidatorImplSP();
487 lldb::TypeValidatorImplSP validator_chosen_sp;
488 uint32_t num_categories = m_categories_map.GetCount();
489 lldb::TypeCategoryImplSP category_sp;
490 uint32_t prio_category = UINT32_MAX;
491 for (uint32_t category_id = 0;
492 category_id < num_categories;
493 category_id++)
494 {
495 category_sp = GetCategoryAtIndex(category_id);
496 if (category_sp->IsEnabled() == false)
497 continue;
498 lldb::TypeValidatorImplSP validator_current_sp(category_sp->GetValidatorForType(type_sp).get());
499 if (validator_current_sp && (validator_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
500 {
501 prio_category = category_sp->GetEnabledPosition();
502 validator_chosen_sp = validator_current_sp;
503 }
504 }
505 return validator_chosen_sp;
506}
507
Enrico Granata980c0482015-09-01 18:22:39 +0000508void
509FormatManager::LoopThroughCategories (CategoryCallback callback, void* param)
510{
511 m_categories_map.LoopThrough(callback, param);
512 Mutex::Locker locker(m_language_categories_mutex);
513 for (const auto& entry : m_language_categories_map)
514 {
515 if (auto category_sp = entry.second->GetCategory())
516 {
517 if (!callback(param, category_sp))
518 break;
519 }
520 }
521}
522
Enrico Granata061858c2012-02-15 02:34:21 +0000523lldb::TypeCategoryImplSP
Enrico Granata9128ee22011-09-06 19:20:51 +0000524FormatManager::GetCategory (const ConstString& category_name,
Enrico Granatadb595cd2015-03-06 19:37:57 +0000525 bool can_create)
Enrico Granatadc940732011-08-23 00:32:52 +0000526{
527 if (!category_name)
Enrico Granata9128ee22011-09-06 19:20:51 +0000528 return GetCategory(m_default_category_name);
Enrico Granata061858c2012-02-15 02:34:21 +0000529 lldb::TypeCategoryImplSP category;
Enrico Granatadc940732011-08-23 00:32:52 +0000530 if (m_categories_map.Get(category_name, category))
531 return category;
532
533 if (!can_create)
Enrico Granata061858c2012-02-15 02:34:21 +0000534 return lldb::TypeCategoryImplSP();
Enrico Granatadc940732011-08-23 00:32:52 +0000535
Enrico Granata061858c2012-02-15 02:34:21 +0000536 m_categories_map.Add(category_name,lldb::TypeCategoryImplSP(new TypeCategoryImpl(this, category_name)));
Enrico Granata9128ee22011-09-06 19:20:51 +0000537 return GetCategory(category_name);
Enrico Granatadc940732011-08-23 00:32:52 +0000538}
539
Enrico Granataf4efecd2011-07-12 22:56:10 +0000540lldb::Format
541FormatManager::GetSingleItemFormat(lldb::Format vector_format)
542{
543 switch(vector_format)
544 {
545 case eFormatVectorOfChar:
546 return eFormatCharArray;
547
548 case eFormatVectorOfSInt8:
549 case eFormatVectorOfSInt16:
550 case eFormatVectorOfSInt32:
551 case eFormatVectorOfSInt64:
552 return eFormatDecimal;
553
554 case eFormatVectorOfUInt8:
555 case eFormatVectorOfUInt16:
556 case eFormatVectorOfUInt32:
557 case eFormatVectorOfUInt64:
558 case eFormatVectorOfUInt128:
559 return eFormatHex;
560
561 case eFormatVectorOfFloat32:
562 case eFormatVectorOfFloat64:
563 return eFormatFloat;
564
565 default:
566 return lldb::eFormatInvalid;
567 }
Greg Clayton3418c852011-08-10 02:10:13 +0000568}
Enrico Granatac482a192011-08-17 22:13:59 +0000569
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000570bool
571FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj)
572{
Enrico Granata553fad52013-10-25 23:09:40 +0000573 // if settings say no oneline whatsoever
Enrico Granata90a8db32013-10-31 21:01:07 +0000574 if (valobj.GetTargetSP().get() && valobj.GetTargetSP()->GetDebugger().GetAutoOneLineSummaries() == false)
Enrico Granata553fad52013-10-25 23:09:40 +0000575 return false; // then don't oneline
576
Enrico Granata42fa4af2014-09-11 23:00:27 +0000577 // if this object has a summary, then ask the summary
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000578 if (valobj.GetSummaryFormat().get() != nullptr)
Enrico Granata42fa4af2014-09-11 23:00:27 +0000579 return valobj.GetSummaryFormat()->IsOneLiner();
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000580
581 // no children, no party
582 if (valobj.GetNumChildren() == 0)
583 return false;
584
585 size_t total_children_name_len = 0;
586
587 for (size_t idx = 0;
588 idx < valobj.GetNumChildren();
589 idx++)
590 {
Enrico Granataddac7612014-10-09 18:47:36 +0000591 bool is_synth_val = false;
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000592 ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true));
593 // something is wrong here - bail out
594 if (!child_sp)
595 return false;
596 // if we decided to define synthetic children for a type, we probably care enough
597 // to show them, but avoid nesting children in children
598 if (child_sp->GetSyntheticChildren().get() != nullptr)
Enrico Granataddac7612014-10-09 18:47:36 +0000599 {
600 ValueObjectSP synth_sp(child_sp->GetSyntheticValue());
601 // wait.. wat? just get out of here..
602 if (!synth_sp)
603 return false;
604 // but if we only have them to provide a value, keep going
605 if (synth_sp->MightHaveChildren() == false && synth_sp->DoesProvideSyntheticValue())
606 is_synth_val = true;
607 else
608 return false;
609 }
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000610
611 total_children_name_len += child_sp->GetName().GetLength();
612
613 // 50 itself is a "randomly" chosen number - the idea is that
614 // overly long structs should not get this treatment
615 // FIXME: maybe make this a user-tweakable setting?
616 if (total_children_name_len > 50)
617 return false;
618
619 // if a summary is there..
620 if (child_sp->GetSummaryFormat())
621 {
622 // and it wants children, then bail out
Enrico Granata8a068e62014-04-23 23:16:25 +0000623 if (child_sp->GetSummaryFormat()->DoesPrintChildren(child_sp.get()))
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000624 return false;
625 }
626
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000627 // if this child has children..
628 if (child_sp->GetNumChildren())
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000629 {
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000630 // ...and no summary...
631 // (if it had a summary and the summary wanted children, we would have bailed out anyway
632 // so this only makes us bail out if this has no summary and we would then print children)
Enrico Granataddac7612014-10-09 18:47:36 +0000633 if (!child_sp->GetSummaryFormat() && !is_synth_val) // but again only do that if not a synthetic valued child
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000634 return false; // then bail out
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000635 }
636 }
637 return true;
638}
639
Enrico Granata02b66762011-08-19 01:14:49 +0000640ConstString
641FormatManager::GetValidTypeName (const ConstString& type)
642{
643 return ::GetValidTypeName_Impl(type);
644}
645
Enrico Granata5548cb52013-01-28 23:47:25 +0000646ConstString
Enrico Granata980c0482015-09-01 18:22:39 +0000647FormatManager::GetTypeForCache (ValueObject& valobj,
648 lldb::DynamicValueType use_dynamic)
Enrico Granata5548cb52013-01-28 23:47:25 +0000649{
650 if (use_dynamic == lldb::eNoDynamicValues)
651 {
652 if (valobj.IsDynamic())
653 {
654 if (valobj.GetStaticValue())
655 return valobj.GetStaticValue()->GetQualifiedTypeName();
656 else
657 return ConstString();
658 }
659 else
660 return valobj.GetQualifiedTypeName();
661 }
662 if (valobj.IsDynamic())
663 return valobj.GetQualifiedTypeName();
664 if (valobj.GetDynamicValue(use_dynamic))
665 return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName();
666 return ConstString();
667}
668
Enrico Granatab6f8ca12015-09-01 22:24:35 +0000669static std::vector<lldb::LanguageType>
Enrico Granata980c0482015-09-01 18:22:39 +0000670GetCandidateLanguages (ValueObject& valobj)
671{
672 lldb::LanguageType lang_type = valobj.GetObjectRuntimeLanguage();
673 switch (lang_type)
674 {
Enrico Granata33e97e62015-09-04 21:01:18 +0000675 case lldb::eLanguageTypeC:
676 case lldb::eLanguageTypeC89:
677 case lldb::eLanguageTypeC99:
678 case lldb::eLanguageTypeC11:
679 case lldb::eLanguageTypeC_plus_plus:
680 case lldb::eLanguageTypeC_plus_plus_03:
681 case lldb::eLanguageTypeC_plus_plus_11:
682 case lldb::eLanguageTypeC_plus_plus_14:
683 return {lldb::eLanguageTypeC_plus_plus};
Enrico Granata980c0482015-09-01 18:22:39 +0000684 default:
685 return {lang_type};
686 }
687}
688
689LanguageCategory*
690FormatManager::GetCategoryForLanguage (lldb::LanguageType lang_type)
691{
692 Mutex::Locker locker(m_language_categories_mutex);
693 auto iter = m_language_categories_map.find(lang_type), end = m_language_categories_map.end();
694 if (iter != end)
695 return iter->second.get();
696 LanguageCategory* lang_category = new LanguageCategory(lang_type);
697 m_language_categories_map[lang_type] = LanguageCategory::UniquePointer(lang_category);
698 return lang_category;
699}
700
Enrico Granataecd02bc2014-08-19 18:47:58 +0000701lldb::TypeFormatImplSP
702FormatManager::GetHardcodedFormat (ValueObject& valobj,
703 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000704{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000705 for (const auto& candidate: m_hardcoded_formats)
706 {
707 auto result = candidate(valobj,use_dynamic,*this);
708 if (result)
709 return result;
710 }
711 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000712}
713
Enrico Granata852cc952013-10-08 19:03:22 +0000714lldb::TypeFormatImplSP
715FormatManager::GetFormat (ValueObject& valobj,
716 lldb::DynamicValueType use_dynamic)
717{
718 TypeFormatImplSP retval;
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000719 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
720 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
721 if (valobj_type)
722 {
723 if (log)
724 log->Printf("\n\n[FormatManager::GetFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
725 if (m_format_cache.GetFormat(valobj_type,retval))
726 {
727 if (log)
728 {
729 log->Printf("[FormatManager::GetFormat] Cache search success. Returning.");
730 if (log->GetDebug())
731 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
732 }
733 return retval;
734 }
735 if (log)
736 log->Printf("[FormatManager::GetFormat] Cache search failed. Going normal route");
737 }
Enrico Granata980c0482015-09-01 18:22:39 +0000738
739 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
740
741 retval = m_categories_map.GetFormat(valobj, use_dynamic, matches);
742 if (!retval)
743 {
744 if (log)
745 log->Printf("[FormatManager::GetFormat] Search failed. Giving language a chance.");
746 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
747 {
748 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
749 {
750 if (lang_category->Get(valobj, use_dynamic, matches, retval))
751 break;
752 }
753 }
754 if (retval)
755 {
756 if (log)
757 log->Printf("[FormatManager::GetFormat] Language search success. Returning.");
758 return retval;
759 }
760 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000761 if (!retval)
762 {
763 if (log)
764 log->Printf("[FormatManager::GetFormat] Search failed. Giving hardcoded a chance.");
765 retval = GetHardcodedFormat(valobj, use_dynamic);
766 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000767
768 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000769 {
770 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000771 log->Printf("[FormatManager::GetFormat] Caching %p for type %s",
772 static_cast<void*>(retval.get()),
773 valobj_type.AsCString("<invalid>"));
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000774 m_format_cache.SetFormat(valobj_type,retval);
775 }
776 if (log && log->GetDebug())
777 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata852cc952013-10-08 19:03:22 +0000778 return retval;
779}
780
Enrico Granataecd02bc2014-08-19 18:47:58 +0000781lldb::TypeSummaryImplSP
782FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj,
783 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000784{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000785 for (const auto& candidate: m_hardcoded_summaries)
786 {
787 auto result = candidate(valobj,use_dynamic,*this);
788 if (result)
789 return result;
790 }
791 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000792}
793
Enrico Granata5548cb52013-01-28 23:47:25 +0000794lldb::TypeSummaryImplSP
795FormatManager::GetSummaryFormat (ValueObject& valobj,
796 lldb::DynamicValueType use_dynamic)
797{
798 TypeSummaryImplSP retval;
Greg Clayton5160ce52013-03-27 23:08:40 +0000799 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
Enrico Granata5548cb52013-01-28 23:47:25 +0000800 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
801 if (valobj_type)
802 {
803 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000804 log->Printf("\n\n[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000805 if (m_format_cache.GetSummary(valobj_type,retval))
Enrico Granata68ae4112013-06-18 18:23:07 +0000806 {
807 if (log)
808 {
809 log->Printf("[FormatManager::GetSummaryFormat] Cache search success. Returning.");
Enrico Granatac2a96402013-06-26 01:03:38 +0000810 if (log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000811 log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata68ae4112013-06-18 18:23:07 +0000812 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000813 return retval;
Enrico Granata68ae4112013-06-18 18:23:07 +0000814 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000815 if (log)
816 log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route");
817 }
Enrico Granata980c0482015-09-01 18:22:39 +0000818
819 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
820
821 retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic, matches);
822 if (!retval)
823 {
824 if (log)
825 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving language a chance.");
826 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
827 {
828 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
829 {
830 if (lang_category->Get(valobj, use_dynamic, matches, retval))
831 break;
832 }
833 }
834 if (retval)
835 {
836 if (log)
837 log->Printf("[FormatManager::GetSummaryFormat] Language search success. Returning.");
838 return retval;
839 }
840 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000841 if (!retval)
842 {
843 if (log)
844 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving hardcoded a chance.");
845 retval = GetHardcodedSummaryFormat(valobj, use_dynamic);
846 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000847
848 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata5548cb52013-01-28 23:47:25 +0000849 {
850 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000851 log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s",
852 static_cast<void*>(retval.get()),
853 valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000854 m_format_cache.SetSummary(valobj_type,retval);
855 }
Enrico Granatac2a96402013-06-26 01:03:38 +0000856 if (log && log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000857 log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata5548cb52013-01-28 23:47:25 +0000858 return retval;
859}
860
861#ifndef LLDB_DISABLE_PYTHON
Enrico Granataecd02bc2014-08-19 18:47:58 +0000862lldb::SyntheticChildrenSP
863FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj,
864 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000865{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000866 for (const auto& candidate: m_hardcoded_synthetics)
867 {
868 auto result = candidate(valobj,use_dynamic,*this);
869 if (result)
870 return result;
871 }
872 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000873}
874
Enrico Granata5548cb52013-01-28 23:47:25 +0000875lldb::SyntheticChildrenSP
876FormatManager::GetSyntheticChildren (ValueObject& valobj,
Enrico Granatac2a96402013-06-26 01:03:38 +0000877 lldb::DynamicValueType use_dynamic)
Enrico Granata5548cb52013-01-28 23:47:25 +0000878{
879 SyntheticChildrenSP retval;
Greg Clayton5160ce52013-03-27 23:08:40 +0000880 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
Enrico Granata5548cb52013-01-28 23:47:25 +0000881 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
882 if (valobj_type)
883 {
884 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000885 log->Printf("\n\n[FormatManager::GetSyntheticChildren] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000886 if (m_format_cache.GetSynthetic(valobj_type,retval))
Enrico Granata68ae4112013-06-18 18:23:07 +0000887 {
888 if (log)
889 {
890 log->Printf("[FormatManager::GetSyntheticChildren] Cache search success. Returning.");
Enrico Granatac2a96402013-06-26 01:03:38 +0000891 if (log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000892 log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata68ae4112013-06-18 18:23:07 +0000893 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000894 return retval;
Enrico Granata68ae4112013-06-18 18:23:07 +0000895 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000896 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000897 log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route");
Enrico Granata5548cb52013-01-28 23:47:25 +0000898 }
Enrico Granata980c0482015-09-01 18:22:39 +0000899
900 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
901
902 retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic, matches);
903 if (!retval)
904 {
905 if (log)
906 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving language a chance.");
907 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
908 {
909 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
910 {
911 if (lang_category->Get(valobj, use_dynamic, matches, retval))
912 break;
913 }
914 }
915 if (retval)
916 {
917 if (log)
918 log->Printf("[FormatManager::GetSyntheticChildren] Language search success. Returning.");
919 return retval;
920 }
921 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000922 if (!retval)
923 {
924 if (log)
925 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving hardcoded a chance.");
926 retval = GetHardcodedSyntheticChildren(valobj, use_dynamic);
927 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000928
929 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata5548cb52013-01-28 23:47:25 +0000930 {
931 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000932 log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s",
933 static_cast<void*>(retval.get()),
934 valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000935 m_format_cache.SetSynthetic(valobj_type,retval);
936 }
Enrico Granatac2a96402013-06-26 01:03:38 +0000937 if (log && log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000938 log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
Enrico Granata5548cb52013-01-28 23:47:25 +0000939 return retval;
940}
941#endif
Enrico Granata5548cb52013-01-28 23:47:25 +0000942
Enrico Granatac5827132014-09-05 20:45:07 +0000943lldb::TypeValidatorImplSP
944FormatManager::GetValidator (ValueObject& valobj,
945 lldb::DynamicValueType use_dynamic)
946{
947 TypeValidatorImplSP retval;
948 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
949 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
950 if (valobj_type)
951 {
952 if (log)
953 log->Printf("\n\n[FormatManager::GetValidator] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
954 if (m_format_cache.GetValidator(valobj_type,retval))
955 {
956 if (log)
957 {
958 log->Printf("[FormatManager::GetValidator] Cache search success. Returning.");
959 if (log->GetDebug())
960 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
961 }
962 return retval;
963 }
964 if (log)
965 log->Printf("[FormatManager::GetValidator] Cache search failed. Going normal route");
966 }
Enrico Granata980c0482015-09-01 18:22:39 +0000967
968 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
969
970 retval = m_categories_map.GetValidator(valobj, use_dynamic, matches);
971 if (!retval)
972 {
973 if (log)
974 log->Printf("[FormatManager::GetValidator] Search failed. Giving language a chance.");
975 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
976 {
977 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
978 {
979 if (lang_category->Get(valobj, use_dynamic, matches, retval))
980 break;
981 }
982 }
983 if (retval)
984 {
985 if (log)
986 log->Printf("[FormatManager::GetValidator] Language search success. Returning.");
987 return retval;
988 }
989 }
Enrico Granatac5827132014-09-05 20:45:07 +0000990 if (!retval)
991 {
992 if (log)
993 log->Printf("[FormatManager::GetValidator] Search failed. Giving hardcoded a chance.");
994 retval = GetHardcodedValidator(valobj, use_dynamic);
995 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000996
997 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granatac5827132014-09-05 20:45:07 +0000998 {
999 if (log)
1000 log->Printf("[FormatManager::GetValidator] Caching %p for type %s",
1001 static_cast<void*>(retval.get()),
1002 valobj_type.AsCString("<invalid>"));
1003 m_format_cache.SetValidator(valobj_type,retval);
1004 }
1005 if (log && log->GetDebug())
1006 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
1007 return retval;
1008}
1009
1010lldb::TypeValidatorImplSP
1011FormatManager::GetHardcodedValidator (ValueObject& valobj,
1012 lldb::DynamicValueType use_dynamic)
1013{
1014 for (const auto& candidate: m_hardcoded_validators)
1015 {
1016 auto result = candidate(valobj,use_dynamic,*this);
1017 if (result)
1018 return result;
1019 }
1020 return nullptr;
1021}
1022
Enrico Granata5548cb52013-01-28 23:47:25 +00001023FormatManager::FormatManager() :
1024 m_format_cache(),
Enrico Granatac482a192011-08-17 22:13:59 +00001025 m_named_summaries_map(this),
1026 m_last_revision(0),
1027 m_categories_map(this),
Enrico Granata980c0482015-09-01 18:22:39 +00001028 m_language_categories_map(),
1029 m_language_categories_mutex(Mutex::eMutexTypeRecursive),
Enrico Granata1d887492011-08-22 18:36:52 +00001030 m_default_category_name(ConstString("default")),
1031 m_system_category_name(ConstString("system")),
Enrico Granata864e3e82012-02-17 03:18:30 +00001032 m_objc_category_name(ConstString("objc")),
1033 m_corefoundation_category_name(ConstString("CoreFoundation")),
1034 m_coregraphics_category_name(ConstString("CoreGraphics")),
1035 m_coreservices_category_name(ConstString("CoreServices")),
Enrico Granatad3d444f2012-02-23 23:10:03 +00001036 m_vectortypes_category_name(ConstString("VectorTypes")),
Enrico Granataecd02bc2014-08-19 18:47:58 +00001037 m_appkit_category_name(ConstString("AppKit")),
Enrico Granatabb557062015-02-10 23:02:25 +00001038 m_coremedia_category_name(ConstString("CoreMedia")),
Enrico Granataecd02bc2014-08-19 18:47:58 +00001039 m_hardcoded_formats(),
1040 m_hardcoded_summaries(),
Enrico Granatac5827132014-09-05 20:45:07 +00001041 m_hardcoded_synthetics(),
1042 m_hardcoded_validators()
Enrico Granataecd02bc2014-08-19 18:47:58 +00001043
Enrico Granatac482a192011-08-17 22:13:59 +00001044{
Enrico Granata864e3e82012-02-17 03:18:30 +00001045 LoadSystemFormatters();
Enrico Granata864e3e82012-02-17 03:18:30 +00001046 LoadObjCFormatters();
Enrico Granatabb557062015-02-10 23:02:25 +00001047 LoadCoreMediaFormatters();
Enrico Granataecd02bc2014-08-19 18:47:58 +00001048 LoadHardcodedFormatters();
Enrico Granata864e3e82012-02-17 03:18:30 +00001049
Enrico Granata5548cb52013-01-28 23:47:25 +00001050 EnableCategory(m_objc_category_name,TypeCategoryMap::Last);
1051 EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last);
1052 EnableCategory(m_appkit_category_name,TypeCategoryMap::Last);
1053 EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last);
1054 EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last);
Enrico Granata67391b62015-02-10 23:17:07 +00001055 EnableCategory(m_coremedia_category_name,TypeCategoryMap::Last);
Enrico Granata5548cb52013-01-28 23:47:25 +00001056 EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last);
1057 EnableCategory(m_system_category_name,TypeCategoryMap::Last);
Enrico Granata864e3e82012-02-17 03:18:30 +00001058}
1059
1060void
Enrico Granata864e3e82012-02-17 03:18:30 +00001061FormatManager::LoadSystemFormatters()
1062{
Enrico Granataf68df122013-01-10 22:08:35 +00001063
1064 TypeSummaryImpl::Flags string_flags;
Enrico Granata0337c272013-02-22 00:37:31 +00001065 string_flags.SetCascades(true)
Enrico Granataf68df122013-01-10 22:08:35 +00001066 .SetSkipPointers(true)
1067 .SetSkipReferences(false)
1068 .SetDontShowChildren(true)
1069 .SetDontShowValue(false)
1070 .SetShowMembersOneLiner(false)
1071 .SetHideItemNames(false);
1072
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001073 TypeSummaryImpl::Flags string_array_flags;
Enrico Granatad2911632015-07-28 02:13:03 +00001074 string_array_flags.SetCascades(true)
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001075 .SetSkipPointers(true)
1076 .SetSkipReferences(false)
1077 .SetDontShowChildren(true)
1078 .SetDontShowValue(true)
1079 .SetShowMembersOneLiner(false)
1080 .SetHideItemNames(false);
1081
Enrico Granataf68df122013-01-10 22:08:35 +00001082 lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(string_flags, "${var%s}"));
Enrico Granatac482a192011-08-17 22:13:59 +00001083
1084
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001085 lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(string_array_flags,
Enrico Granata061858c2012-02-15 02:34:21 +00001086 "${var%s}"));
Enrico Granatac482a192011-08-17 22:13:59 +00001087
1088 lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001089 lldb::RegularExpressionSP any_size_wchar_arr(new RegularExpression("wchar_t \\[[0-9]+\\]"));
Enrico Granatac482a192011-08-17 22:13:59 +00001090
Enrico Granata061858c2012-02-15 02:34:21 +00001091 TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
Enrico Granatac482a192011-08-17 22:13:59 +00001092
Enrico Granatab72a5012013-12-20 09:38:13 +00001093 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("char *"), string_format);
1094 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("unsigned char *"), string_format);
1095 sys_category_sp->GetRegexTypeSummariesContainer()->Add(any_size_char_arr, string_array_format);
Enrico Granataaff65652013-10-21 17:29:51 +00001096
Enrico Granata4ed7ef12012-07-13 18:54:40 +00001097 lldb::TypeSummaryImplSP ostype_summary(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
1098 .SetSkipPointers(true)
1099 .SetSkipReferences(true)
1100 .SetDontShowChildren(true)
1101 .SetDontShowValue(false)
1102 .SetShowMembersOneLiner(false)
1103 .SetHideItemNames(false),
1104 "${var%O}"));
1105
Enrico Granatab72a5012013-12-20 09:38:13 +00001106 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("OSType"), ostype_summary);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001107
Jason Molenda1a100cd2013-01-12 04:24:50 +00001108#ifndef LLDB_DISABLE_PYTHON
Enrico Granata4cc21772013-10-08 20:59:02 +00001109 TypeFormatImpl::Flags fourchar_flags;
1110 fourchar_flags.SetCascades(true).SetSkipPointers(true).SetSkipReferences(true);
1111
1112 AddFormat(sys_category_sp, lldb::eFormatOSType, ConstString("FourCharCode"), fourchar_flags);
Jason Molenda1a100cd2013-01-12 04:24:50 +00001113#endif
Enrico Granatad3d444f2012-02-23 23:10:03 +00001114}
Enrico Granatab2698cd2012-09-13 18:27:09 +00001115
Enrico Granata864e3e82012-02-17 03:18:30 +00001116void
1117FormatManager::LoadObjCFormatters()
1118{
1119 TypeSummaryImpl::Flags objc_flags;
1120 objc_flags.SetCascades(false)
Enrico Granata4b7b5aa2012-07-13 18:55:41 +00001121 .SetSkipPointers(true)
1122 .SetSkipReferences(true)
Enrico Granata864e3e82012-02-17 03:18:30 +00001123 .SetDontShowChildren(true)
1124 .SetDontShowValue(true)
1125 .SetShowMembersOneLiner(false)
1126 .SetHideItemNames(false);
Enrico Granata13643112012-09-04 22:04:50 +00001127
1128 TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001129 TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name);
1130 TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name);
1131 TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name);
1132 TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name);
Enrico Granata864e3e82012-02-17 03:18:30 +00001133
Enrico Granatab5887262012-10-29 21:18:03 +00001134 lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,""));
Enrico Granatab72a5012013-12-20 09:38:13 +00001135 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"),
Enrico Granatabac45f62012-01-31 17:01:51 +00001136 ObjC_BOOL_summary);
Enrico Granatab72a5012013-12-20 09:38:13 +00001137 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"),
Enrico Granatab5887262012-10-29 21:18:03 +00001138 ObjC_BOOL_summary);
Enrico Granatab72a5012013-12-20 09:38:13 +00001139 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"),
Enrico Granatab5887262012-10-29 21:18:03 +00001140 ObjC_BOOL_summary);
Enrico Granata4b7b5aa2012-07-13 18:55:41 +00001141
Jason Molendacc57a382012-11-01 23:35:19 +00001142#ifndef LLDB_DISABLE_PYTHON
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001143 // we need to skip pointers here since we are special casing a SEL* when retrieving its value
1144 objc_flags.SetSkipPointers(true);
Enrico Granataf68df122013-01-10 22:08:35 +00001145 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags);
1146 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
1147 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags);
1148 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags);
Enrico Granata75dfb432013-02-15 00:06:04 +00001149 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags);
Enrico Granatab5887262012-10-29 21:18:03 +00001150
Enrico Granata55900862013-03-15 18:55:30 +00001151 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags);
Enrico Granatac76b97b2013-04-26 00:59:02 +00001152
1153 SyntheticChildren::Flags class_synth_flags;
1154 class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
1155
1156 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001157#endif // LLDB_DISABLE_PYTHON
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001158
Enrico Granatab5887262012-10-29 21:18:03 +00001159 objc_flags.SetSkipPointers(false);
Enrico Granatae602fe12013-07-10 18:25:45 +00001160 objc_flags.SetCascades(true);
1161 objc_flags.SetSkipReferences(false);
1162
1163 AddStringSummary (objc_category_sp,
1164 "${var.__FuncPtr%A}",
1165 ConstString("__block_literal_generic"),
1166 objc_flags);
Enrico Granatab5887262012-10-29 21:18:03 +00001167
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001168 AddStringSummary(corefoundation_category_sp,
1169 "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
1170 ConstString("CFGregorianUnits"),
1171 objc_flags);
1172 AddStringSummary(corefoundation_category_sp,
1173 "location=${var.location} length=${var.length}",
1174 ConstString("CFRange"),
1175 objc_flags);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001176
1177 AddStringSummary(appkit_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001178 "location=${var.location}, length=${var.length}",
1179 ConstString("NSRange"),
1180 objc_flags);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001181 AddStringSummary(appkit_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001182 "(${var.origin}, ${var.size}), ...",
1183 ConstString("NSRectArray"),
1184 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001185
Enrico Granata944547d2014-11-11 19:52:12 +00001186 AddOneLineSummary (appkit_category_sp,
1187 ConstString("NSPoint"),
1188 objc_flags);
1189 AddOneLineSummary (appkit_category_sp,
1190 ConstString("NSSize"),
1191 objc_flags);
1192 AddOneLineSummary (appkit_category_sp,
1193 ConstString("NSRect"),
1194 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001195
Enrico Granata944547d2014-11-11 19:52:12 +00001196 AddOneLineSummary (coregraphics_category_sp,
1197 ConstString("CGSize"),
1198 objc_flags);
1199 AddOneLineSummary (coregraphics_category_sp,
1200 ConstString("CGPoint"),
1201 objc_flags);
1202 AddOneLineSummary (coregraphics_category_sp,
1203 ConstString("CGRect"),
1204 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001205
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001206 AddStringSummary(coreservices_category_sp,
1207 "red=${var.red} green=${var.green} blue=${var.blue}",
1208 ConstString("RGBColor"),
1209 objc_flags);
1210 AddStringSummary(coreservices_category_sp,
1211 "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
1212 ConstString("Rect"),
1213 objc_flags);
1214 AddStringSummary(coreservices_category_sp,
1215 "(v=${var.v}, h=${var.h})",
1216 ConstString("Point"),
1217 objc_flags);
1218 AddStringSummary(coreservices_category_sp,
1219 "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
1220 ConstString("DateTimeRect *"),
1221 objc_flags);
1222 AddStringSummary(coreservices_category_sp,
1223 "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
1224 ConstString("LongDateRect"),
1225 objc_flags);
1226 AddStringSummary(coreservices_category_sp,
1227 "(x=${var.x}, y=${var.y})",
1228 ConstString("HIPoint"),
1229 objc_flags);
1230 AddStringSummary(coreservices_category_sp,
1231 "origin=${var.origin} size=${var.size}",
1232 ConstString("HIRect"),
1233 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001234
Enrico Granatad3d444f2012-02-23 23:10:03 +00001235 TypeSummaryImpl::Flags appkit_flags;
1236 appkit_flags.SetCascades(true)
1237 .SetSkipPointers(false)
1238 .SetSkipReferences(false)
1239 .SetDontShowChildren(true)
1240 .SetDontShowValue(false)
1241 .SetShowMembersOneLiner(false)
1242 .SetHideItemNames(false);
1243
Enrico Granatab2698cd2012-09-13 18:27:09 +00001244 appkit_flags.SetDontShowChildren(false);
1245
Jason Molenda38f8bbe2012-09-15 01:59:02 +00001246
Jason Molenda5c4210be2012-09-20 06:06:59 +00001247#ifndef LLDB_DISABLE_PYTHON
Enrico Granatab2698cd2012-09-13 18:27:09 +00001248 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags);
1249 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
1250 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
1251 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
1252 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001253 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
1254 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags);
Enrico Granatab2698cd2012-09-13 18:27:09 +00001255
Enrico Granata97fca502012-09-18 17:43:16 +00001256 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags);
1257 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags);
1258 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags);
1259 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags);
1260 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001261 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags);
1262 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags);
Enrico Granata97fca502012-09-18 17:43:16 +00001263
Enrico Granata9f02e092013-02-18 23:16:23 +00001264 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags);
Enrico Granatacd67f972013-04-27 00:27:20 +00001265 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001266 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags);
1267 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags);
1268 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags);
Enrico Granata9f02e092013-02-18 23:16:23 +00001269 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags);
1270 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags);
1271 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags);
Enrico Granatacd67f972013-04-27 00:27:20 +00001272 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
1273 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags);
1274 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags);
1275 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags);
1276
Enrico Granata97fca502012-09-18 17:43:16 +00001277 // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags);
1278
Enrico Granatab2698cd2012-09-13 18:27:09 +00001279 appkit_flags.SetDontShowChildren(true);
1280
Enrico Granata5548cb52013-01-28 23:47:25 +00001281 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags());
1282 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags());
1283 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags());
1284 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags());
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001285 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags());
1286 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags());
1287 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags());
Enrico Granatad3d444f2012-02-23 23:10:03 +00001288
Enrico Granata5548cb52013-01-28 23:47:25 +00001289 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags());
1290 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags());
Enrico Granata4419d532014-08-27 01:10:27 +00001291 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags());
Enrico Granata5548cb52013-01-28 23:47:25 +00001292 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags());
1293 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags());
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001294 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags());
1295 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags());
Enrico Granata97fca502012-09-18 17:43:16 +00001296
Enrico Granata9f02e092013-02-18 23:16:23 +00001297 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags());
Enrico Granatacd67f972013-04-27 00:27:20 +00001298 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags());
1299 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags());
1300 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags());
1301 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags());
1302 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags());
1303 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags());
Enrico Granata5510a572014-10-15 21:38:32 +00001304
1305 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags());
Enrico Granatacd67f972013-04-27 00:27:20 +00001306
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001307 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
1308 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
1309 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags);
1310 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001311
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001312 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags);
1313 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001314
Enrico Granatab2698cd2012-09-13 18:27:09 +00001315 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001316 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
Enrico Granata6b6ea7a2014-01-08 02:34:42 +00001317 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001318 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags);
Enrico Granata5bfce362013-02-08 01:55:46 +00001319 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001320 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags);
1321 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
1322 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags);
1323 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags);
Enrico Granatab2698cd2012-09-13 18:27:09 +00001324 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
Enrico Granata3467d802012-09-04 18:47:54 +00001325
Enrico Granata5bfce362013-02-08 01:55:46 +00001326 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags);
1327 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags);
1328 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags);
1329
Enrico Granataf68f7322013-03-15 18:44:08 +00001330 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001331
Enrico Granatab2698cd2012-09-13 18:27:09 +00001332 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags);
1333 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
1334 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags);
Enrico Granatafcd974a2014-03-20 01:15:44 +00001335 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001336 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
1337 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
1338 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001339
Enrico Granata50b5ee52013-03-16 00:50:25 +00001340 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags);
1341
1342 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags);
1343 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001344
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001345 AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
Enrico Granata5548cb52013-01-28 23:47:25 +00001346 AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
1347
Enrico Granatab2698cd2012-09-13 18:27:09 +00001348 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
Enrico Granatad8e45842014-02-03 19:46:31 +00001349 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001350 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
1351 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
1352 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
1353 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
Enrico Granataf175ad12012-10-03 23:53:45 +00001354
1355 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags);
1356 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags);
1357 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
1358 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
Enrico Granataf615b802013-02-15 23:38:37 +00001359
Enrico Granatae214a022013-02-08 19:28:04 +00001360 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001361 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001362
Enrico Granata6d37cc62013-03-19 00:27:22 +00001363 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags);
1364 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags);
1365 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags);
1366 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001367
Enrico Granata9f71ad42013-03-16 01:50:07 +00001368 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags);
Enrico Granatad8e45842014-02-03 19:46:31 +00001369 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags);
Enrico Granata9f71ad42013-03-16 01:50:07 +00001370 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001371
Enrico Granata896cd1d2012-03-01 19:32:33 +00001372 // CFAbsoluteTime is actually a double rather than a pointer to an object
1373 // we do not care about the numeric value, since it is probably meaningless to users
1374 appkit_flags.SetDontShowValue(true);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001375 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags);
Enrico Granata896cd1d2012-03-01 19:32:33 +00001376 appkit_flags.SetDontShowValue(false);
1377
Enrico Granata6a925112013-03-16 01:18:00 +00001378 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags);
1379 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags);
Enrico Granata896cd1d2012-03-01 19:32:33 +00001380
Enrico Granatad8e45842014-02-03 19:46:31 +00001381 AddStringSummary(corefoundation_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001382 "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"",
1383 ConstString("CFGregorianDate"),
1384 appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001385
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001386 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags);
1387 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags);
1388 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags);
1389 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001390#endif // LLDB_DISABLE_PYTHON
1391
Enrico Granata864e3e82012-02-17 03:18:30 +00001392 TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
1393
1394 TypeSummaryImpl::Flags vector_flags;
1395 vector_flags.SetCascades(true)
1396 .SetSkipPointers(true)
1397 .SetSkipReferences(false)
1398 .SetDontShowChildren(true)
1399 .SetDontShowValue(false)
1400 .SetShowMembersOneLiner(true)
1401 .SetHideItemNames(true);
1402
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001403 AddStringSummary(vectors_category_sp,
1404 "${var.uint128}",
1405 ConstString("builtin_type_vec128"),
1406 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001407
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001408 AddStringSummary(vectors_category_sp,
1409 "",
1410 ConstString("float [4]"),
1411 vector_flags);
1412 AddStringSummary(vectors_category_sp,
1413 "",
1414 ConstString("int32_t [4]"),
1415 vector_flags);
1416 AddStringSummary(vectors_category_sp,
1417 "",
1418 ConstString("int16_t [8]"),
1419 vector_flags);
1420 AddStringSummary(vectors_category_sp,
1421 "",
1422 ConstString("vDouble"),
1423 vector_flags);
1424 AddStringSummary(vectors_category_sp,
1425 "",
1426 ConstString("vFloat"),
1427 vector_flags);
1428 AddStringSummary(vectors_category_sp,
1429 "",
1430 ConstString("vSInt8"),
1431 vector_flags);
1432 AddStringSummary(vectors_category_sp,
1433 "",
1434 ConstString("vSInt16"),
1435 vector_flags);
1436 AddStringSummary(vectors_category_sp,
1437 "",
1438 ConstString("vSInt32"),
1439 vector_flags);
1440 AddStringSummary(vectors_category_sp,
1441 "",
1442 ConstString("vUInt16"),
1443 vector_flags);
1444 AddStringSummary(vectors_category_sp,
1445 "",
1446 ConstString("vUInt8"),
1447 vector_flags);
1448 AddStringSummary(vectors_category_sp,
1449 "",
1450 ConstString("vUInt16"),
1451 vector_flags);
1452 AddStringSummary(vectors_category_sp,
1453 "",
1454 ConstString("vUInt32"),
1455 vector_flags);
1456 AddStringSummary(vectors_category_sp,
1457 "",
1458 ConstString("vBool32"),
1459 vector_flags);
Greg Claytond4e25522011-10-12 00:53:29 +00001460}
Enrico Granataecd02bc2014-08-19 18:47:58 +00001461
1462void
Enrico Granatabb557062015-02-10 23:02:25 +00001463FormatManager::LoadCoreMediaFormatters()
1464{
1465 TypeSummaryImpl::Flags cm_flags;
1466 cm_flags.SetCascades(true)
1467 .SetDontShowChildren(false)
1468 .SetDontShowValue(false)
1469 .SetHideItemNames(false)
1470 .SetShowMembersOneLiner(false)
1471 .SetSkipPointers(false)
1472 .SetSkipReferences(false);
1473
1474 TypeCategoryImpl::SharedPointer cm_category_sp = GetCategory(m_coremedia_category_name);
1475
Tamas Berghammerdd403fb2015-02-11 17:51:49 +00001476#ifndef LLDB_DISABLE_PYTHON
Enrico Granatabb557062015-02-10 23:02:25 +00001477 AddCXXSummary(cm_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags);
Tamas Berghammerdd403fb2015-02-11 17:51:49 +00001478#endif // LLDB_DISABLE_PYTHON
Enrico Granatabb557062015-02-10 23:02:25 +00001479}
1480
1481void
Enrico Granataecd02bc2014-08-19 18:47:58 +00001482FormatManager::LoadHardcodedFormatters()
1483{
1484 {
1485 // insert code to load formats here
1486 }
1487 {
1488 // insert code to load summaries here
Enrico Granataff0f23d2014-12-10 02:00:45 +00001489 m_hardcoded_summaries.push_back(
1490 [](lldb_private::ValueObject& valobj,
1491 lldb::DynamicValueType,
1492 FormatManager&) -> TypeSummaryImpl::SharedPointer {
Enrico Granata419d7912015-09-04 00:33:51 +00001493 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider"));
Greg Clayton99558cc42015-08-24 23:46:31 +00001494 if (valobj.GetCompilerType().IsFunctionPointerType())
Enrico Granataff0f23d2014-12-10 02:00:45 +00001495 {
1496 return formatter_sp;
1497 }
1498 return nullptr;
1499 });
Enrico Granatad529d042015-07-07 00:20:57 +00001500 m_hardcoded_summaries.push_back(
1501 [](lldb_private::ValueObject& valobj,
1502 lldb::DynamicValueType,
1503 FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1504 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags()
1505 .SetCascades(true)
1506 .SetDontShowChildren(true)
1507 .SetHideItemNames(true)
1508 .SetShowMembersOneLiner(true)
1509 .SetSkipPointers(true)
1510 .SetSkipReferences(false),
1511 lldb_private::formatters::VectorTypeSummaryProvider,
1512 "vector_type pointer summary provider"));
Greg Clayton99558cc42015-08-24 23:46:31 +00001513 if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
Enrico Granatad529d042015-07-07 00:20:57 +00001514 {
1515 if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled())
1516 return formatter_sp;
1517 }
1518 return nullptr;
1519 });
Enrico Granataecd02bc2014-08-19 18:47:58 +00001520 }
1521 {
1522 // insert code to load synthetics here
Enrico Granatadb595cd2015-03-06 19:37:57 +00001523 m_hardcoded_synthetics.push_back(
1524 [](lldb_private::ValueObject& valobj,
1525 lldb::DynamicValueType,
1526 FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer {
Enrico Granatad4cb1dd2015-07-01 20:06:40 +00001527 static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true),
Enrico Granatadb595cd2015-03-06 19:37:57 +00001528 "vector_type synthetic children",
1529 lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
Greg Clayton99558cc42015-08-24 23:46:31 +00001530 if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
Enrico Granatadb595cd2015-03-06 19:37:57 +00001531 {
1532 if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled())
1533 return formatter_sp;
1534 }
1535 return nullptr;
1536 });
Enrico Granataecd02bc2014-08-19 18:47:58 +00001537 }
Enrico Granatac5827132014-09-05 20:45:07 +00001538 {
1539 // insert code to load validators here
1540 }
Enrico Granataecd02bc2014-08-19 18:47:58 +00001541}