blob: 3fdb9b8d103a97b4737ac06419734fbe98216bf8 [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 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000273
Enrico Granatad3233c12015-09-09 01:10:46 +0000274 for (lldb::LanguageType language_type : GetCandidateLanguages(valobj))
Enrico Granatade61cec2013-11-22 00:02:13 +0000275 {
Enrico Granatad3233c12015-09-09 01:10:46 +0000276 if (Language* language = Language::FindPlugin(language_type))
Enrico Granatade61cec2013-11-22 00:02:13 +0000277 {
Enrico Granatad3233c12015-09-09 01:10:46 +0000278 for (ConstString candidate : language->GetPossibleFormattersMatches(valobj, use_dynamic))
Enrico Granatade61cec2013-11-22 00:02:13 +0000279 {
Enrico Granatad3233c12015-09-09 01:10:46 +0000280 entries.push_back({candidate,
281 reason | lldb_private::eFormatterChoiceCriterionLanguagePlugin,
282 did_strip_ptr,
283 did_strip_ref,
284 did_strip_typedef});
285 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000286 }
Enrico Granatade61cec2013-11-22 00:02:13 +0000287 }
Enrico Granatad3233c12015-09-09 01:10:46 +0000288
Enrico Granatade61cec2013-11-22 00:02:13 +0000289 // try to strip typedef chains
290 if (clang_type.IsTypedefType())
291 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000292 CompilerType deffed_type = clang_type.GetTypedefedType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000293 GetPossibleMatches(valobj,
294 deffed_type,
295 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs,
296 use_dynamic,
297 entries,
298 did_strip_ptr,
299 did_strip_ref,
300 true);
301 }
302
303 if (root_level)
304 {
305 do {
306 if (!clang_type.IsValid())
307 break;
308
Greg Claytona1e5dc82015-08-11 22:53:00 +0000309 CompilerType unqual_clang_ast_type = clang_type.GetFullyUnqualifiedType();
Enrico Granatade61cec2013-11-22 00:02:13 +0000310 if (!unqual_clang_ast_type.IsValid())
311 break;
312 if (unqual_clang_ast_type.GetOpaqueQualType() != clang_type.GetOpaqueQualType())
313 GetPossibleMatches (valobj,
314 unqual_clang_ast_type,
315 reason,
316 use_dynamic,
317 entries,
318 did_strip_ptr,
319 did_strip_ref,
320 did_strip_typedef);
321 } while(false);
322
323
324 // if all else fails, go to static type
325 if (valobj.IsDynamic())
326 {
327 lldb::ValueObjectSP static_value_sp(valobj.GetStaticValue());
328 if (static_value_sp)
329 GetPossibleMatches(*static_value_sp.get(),
Greg Clayton99558cc42015-08-24 23:46:31 +0000330 static_value_sp->GetCompilerType(),
Enrico Granatade61cec2013-11-22 00:02:13 +0000331 reason | lldb_private::eFormatterChoiceCriterionWentToStaticValue,
332 use_dynamic,
333 entries,
334 did_strip_ptr,
335 did_strip_ref,
336 did_strip_typedef,
337 true);
338 }
339 }
340}
341
Enrico Granata852cc952013-10-08 19:03:22 +0000342lldb::TypeFormatImplSP
343FormatManager::GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp)
344{
345 if (!type_sp)
346 return lldb::TypeFormatImplSP();
347 lldb::TypeFormatImplSP format_chosen_sp;
348 uint32_t num_categories = m_categories_map.GetCount();
349 lldb::TypeCategoryImplSP category_sp;
350 uint32_t prio_category = UINT32_MAX;
351 for (uint32_t category_id = 0;
352 category_id < num_categories;
353 category_id++)
354 {
355 category_sp = GetCategoryAtIndex(category_id);
356 if (category_sp->IsEnabled() == false)
357 continue;
358 lldb::TypeFormatImplSP format_current_sp = category_sp->GetFormatForType(type_sp);
359 if (format_current_sp && (format_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
360 {
361 prio_category = category_sp->GetEnabledPosition();
362 format_chosen_sp = format_current_sp;
363 }
364 }
365 return format_chosen_sp;
366}
367
Enrico Granataa777dc22012-05-08 21:49:57 +0000368lldb::TypeSummaryImplSP
369FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
370{
371 if (!type_sp)
372 return lldb::TypeSummaryImplSP();
373 lldb::TypeSummaryImplSP summary_chosen_sp;
374 uint32_t num_categories = m_categories_map.GetCount();
375 lldb::TypeCategoryImplSP category_sp;
376 uint32_t prio_category = UINT32_MAX;
377 for (uint32_t category_id = 0;
378 category_id < num_categories;
379 category_id++)
380 {
381 category_sp = GetCategoryAtIndex(category_id);
382 if (category_sp->IsEnabled() == false)
383 continue;
384 lldb::TypeSummaryImplSP summary_current_sp = category_sp->GetSummaryForType(type_sp);
385 if (summary_current_sp && (summary_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
386 {
387 prio_category = category_sp->GetEnabledPosition();
388 summary_chosen_sp = summary_current_sp;
389 }
390 }
391 return summary_chosen_sp;
392}
393
394lldb::TypeFilterImplSP
395FormatManager::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
396{
397 if (!type_sp)
398 return lldb::TypeFilterImplSP();
399 lldb::TypeFilterImplSP filter_chosen_sp;
400 uint32_t num_categories = m_categories_map.GetCount();
401 lldb::TypeCategoryImplSP category_sp;
402 uint32_t prio_category = UINT32_MAX;
403 for (uint32_t category_id = 0;
404 category_id < num_categories;
405 category_id++)
406 {
407 category_sp = GetCategoryAtIndex(category_id);
408 if (category_sp->IsEnabled() == false)
409 continue;
410 lldb::TypeFilterImplSP filter_current_sp((TypeFilterImpl*)category_sp->GetFilterForType(type_sp).get());
411 if (filter_current_sp && (filter_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
412 {
413 prio_category = category_sp->GetEnabledPosition();
414 filter_chosen_sp = filter_current_sp;
415 }
416 }
417 return filter_chosen_sp;
418}
419
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000420#ifndef LLDB_DISABLE_PYTHON
Enrico Granata5548cb52013-01-28 23:47:25 +0000421lldb::ScriptedSyntheticChildrenSP
Enrico Granataa777dc22012-05-08 21:49:57 +0000422FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
423{
424 if (!type_sp)
Enrico Granata5548cb52013-01-28 23:47:25 +0000425 return lldb::ScriptedSyntheticChildrenSP();
426 lldb::ScriptedSyntheticChildrenSP synth_chosen_sp;
Enrico Granataa777dc22012-05-08 21:49:57 +0000427 uint32_t num_categories = m_categories_map.GetCount();
428 lldb::TypeCategoryImplSP category_sp;
429 uint32_t prio_category = UINT32_MAX;
430 for (uint32_t category_id = 0;
431 category_id < num_categories;
432 category_id++)
433 {
434 category_sp = GetCategoryAtIndex(category_id);
435 if (category_sp->IsEnabled() == false)
436 continue;
Enrico Granata5548cb52013-01-28 23:47:25 +0000437 lldb::ScriptedSyntheticChildrenSP synth_current_sp((ScriptedSyntheticChildren*)category_sp->GetSyntheticForType(type_sp).get());
Enrico Granataa777dc22012-05-08 21:49:57 +0000438 if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
439 {
440 prio_category = category_sp->GetEnabledPosition();
441 synth_chosen_sp = synth_current_sp;
442 }
443 }
444 return synth_chosen_sp;
445}
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000446#endif
Enrico Granataa777dc22012-05-08 21:49:57 +0000447
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000448#ifndef LLDB_DISABLE_PYTHON
Enrico Granataa777dc22012-05-08 21:49:57 +0000449lldb::SyntheticChildrenSP
450FormatManager::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp)
451{
452 if (!type_sp)
453 return lldb::SyntheticChildrenSP();
454 lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp);
Enrico Granata5548cb52013-01-28 23:47:25 +0000455 lldb::ScriptedSyntheticChildrenSP synth_sp = GetSyntheticForType(type_sp);
Enrico Granataa777dc22012-05-08 21:49:57 +0000456 if (filter_sp->GetRevision() > synth_sp->GetRevision())
457 return lldb::SyntheticChildrenSP(filter_sp.get());
458 else
459 return lldb::SyntheticChildrenSP(synth_sp.get());
460}
Jason Molenda7a9a72b2012-05-16 00:38:08 +0000461#endif
Enrico Granataa777dc22012-05-08 21:49:57 +0000462
Enrico Granatac5827132014-09-05 20:45:07 +0000463lldb::TypeValidatorImplSP
464FormatManager::GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp)
465{
466 if (!type_sp)
467 return lldb::TypeValidatorImplSP();
468 lldb::TypeValidatorImplSP validator_chosen_sp;
469 uint32_t num_categories = m_categories_map.GetCount();
470 lldb::TypeCategoryImplSP category_sp;
471 uint32_t prio_category = UINT32_MAX;
472 for (uint32_t category_id = 0;
473 category_id < num_categories;
474 category_id++)
475 {
476 category_sp = GetCategoryAtIndex(category_id);
477 if (category_sp->IsEnabled() == false)
478 continue;
479 lldb::TypeValidatorImplSP validator_current_sp(category_sp->GetValidatorForType(type_sp).get());
480 if (validator_current_sp && (validator_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
481 {
482 prio_category = category_sp->GetEnabledPosition();
483 validator_chosen_sp = validator_current_sp;
484 }
485 }
486 return validator_chosen_sp;
487}
488
Enrico Granata980c0482015-09-01 18:22:39 +0000489void
490FormatManager::LoopThroughCategories (CategoryCallback callback, void* param)
491{
492 m_categories_map.LoopThrough(callback, param);
493 Mutex::Locker locker(m_language_categories_mutex);
494 for (const auto& entry : m_language_categories_map)
495 {
496 if (auto category_sp = entry.second->GetCategory())
497 {
498 if (!callback(param, category_sp))
499 break;
500 }
501 }
502}
503
Enrico Granata061858c2012-02-15 02:34:21 +0000504lldb::TypeCategoryImplSP
Enrico Granata9128ee22011-09-06 19:20:51 +0000505FormatManager::GetCategory (const ConstString& category_name,
Enrico Granatadb595cd2015-03-06 19:37:57 +0000506 bool can_create)
Enrico Granatadc940732011-08-23 00:32:52 +0000507{
508 if (!category_name)
Enrico Granata9128ee22011-09-06 19:20:51 +0000509 return GetCategory(m_default_category_name);
Enrico Granata061858c2012-02-15 02:34:21 +0000510 lldb::TypeCategoryImplSP category;
Enrico Granatadc940732011-08-23 00:32:52 +0000511 if (m_categories_map.Get(category_name, category))
512 return category;
513
514 if (!can_create)
Enrico Granata061858c2012-02-15 02:34:21 +0000515 return lldb::TypeCategoryImplSP();
Enrico Granatadc940732011-08-23 00:32:52 +0000516
Enrico Granata061858c2012-02-15 02:34:21 +0000517 m_categories_map.Add(category_name,lldb::TypeCategoryImplSP(new TypeCategoryImpl(this, category_name)));
Enrico Granata9128ee22011-09-06 19:20:51 +0000518 return GetCategory(category_name);
Enrico Granatadc940732011-08-23 00:32:52 +0000519}
520
Enrico Granataf4efecd2011-07-12 22:56:10 +0000521lldb::Format
522FormatManager::GetSingleItemFormat(lldb::Format vector_format)
523{
524 switch(vector_format)
525 {
526 case eFormatVectorOfChar:
527 return eFormatCharArray;
528
529 case eFormatVectorOfSInt8:
530 case eFormatVectorOfSInt16:
531 case eFormatVectorOfSInt32:
532 case eFormatVectorOfSInt64:
533 return eFormatDecimal;
534
535 case eFormatVectorOfUInt8:
536 case eFormatVectorOfUInt16:
537 case eFormatVectorOfUInt32:
538 case eFormatVectorOfUInt64:
539 case eFormatVectorOfUInt128:
540 return eFormatHex;
541
542 case eFormatVectorOfFloat32:
543 case eFormatVectorOfFloat64:
544 return eFormatFloat;
545
546 default:
547 return lldb::eFormatInvalid;
548 }
Greg Clayton3418c852011-08-10 02:10:13 +0000549}
Enrico Granatac482a192011-08-17 22:13:59 +0000550
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000551bool
552FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj)
553{
Enrico Granata553fad52013-10-25 23:09:40 +0000554 // if settings say no oneline whatsoever
Enrico Granata90a8db32013-10-31 21:01:07 +0000555 if (valobj.GetTargetSP().get() && valobj.GetTargetSP()->GetDebugger().GetAutoOneLineSummaries() == false)
Enrico Granata553fad52013-10-25 23:09:40 +0000556 return false; // then don't oneline
557
Enrico Granata42fa4af2014-09-11 23:00:27 +0000558 // if this object has a summary, then ask the summary
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000559 if (valobj.GetSummaryFormat().get() != nullptr)
Enrico Granata42fa4af2014-09-11 23:00:27 +0000560 return valobj.GetSummaryFormat()->IsOneLiner();
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000561
562 // no children, no party
563 if (valobj.GetNumChildren() == 0)
564 return false;
565
566 size_t total_children_name_len = 0;
567
568 for (size_t idx = 0;
569 idx < valobj.GetNumChildren();
570 idx++)
571 {
Enrico Granataddac7612014-10-09 18:47:36 +0000572 bool is_synth_val = false;
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000573 ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true));
574 // something is wrong here - bail out
575 if (!child_sp)
576 return false;
577 // if we decided to define synthetic children for a type, we probably care enough
578 // to show them, but avoid nesting children in children
579 if (child_sp->GetSyntheticChildren().get() != nullptr)
Enrico Granataddac7612014-10-09 18:47:36 +0000580 {
581 ValueObjectSP synth_sp(child_sp->GetSyntheticValue());
582 // wait.. wat? just get out of here..
583 if (!synth_sp)
584 return false;
585 // but if we only have them to provide a value, keep going
586 if (synth_sp->MightHaveChildren() == false && synth_sp->DoesProvideSyntheticValue())
587 is_synth_val = true;
588 else
589 return false;
590 }
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000591
592 total_children_name_len += child_sp->GetName().GetLength();
593
594 // 50 itself is a "randomly" chosen number - the idea is that
595 // overly long structs should not get this treatment
596 // FIXME: maybe make this a user-tweakable setting?
597 if (total_children_name_len > 50)
598 return false;
599
600 // if a summary is there..
601 if (child_sp->GetSummaryFormat())
602 {
603 // and it wants children, then bail out
Enrico Granata8a068e62014-04-23 23:16:25 +0000604 if (child_sp->GetSummaryFormat()->DoesPrintChildren(child_sp.get()))
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000605 return false;
606 }
607
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000608 // if this child has children..
609 if (child_sp->GetNumChildren())
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000610 {
Enrico Granatac89e4ca2013-10-23 01:34:31 +0000611 // ...and no summary...
612 // (if it had a summary and the summary wanted children, we would have bailed out anyway
613 // 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 +0000614 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 +0000615 return false; // then bail out
Enrico Granataa29cb0b2013-10-04 23:14:13 +0000616 }
617 }
618 return true;
619}
620
Enrico Granata02b66762011-08-19 01:14:49 +0000621ConstString
622FormatManager::GetValidTypeName (const ConstString& type)
623{
624 return ::GetValidTypeName_Impl(type);
625}
626
Enrico Granata5548cb52013-01-28 23:47:25 +0000627ConstString
Enrico Granata980c0482015-09-01 18:22:39 +0000628FormatManager::GetTypeForCache (ValueObject& valobj,
629 lldb::DynamicValueType use_dynamic)
Enrico Granata5548cb52013-01-28 23:47:25 +0000630{
631 if (use_dynamic == lldb::eNoDynamicValues)
632 {
633 if (valobj.IsDynamic())
634 {
635 if (valobj.GetStaticValue())
636 return valobj.GetStaticValue()->GetQualifiedTypeName();
637 else
638 return ConstString();
639 }
640 else
641 return valobj.GetQualifiedTypeName();
642 }
643 if (valobj.IsDynamic())
644 return valobj.GetQualifiedTypeName();
645 if (valobj.GetDynamicValue(use_dynamic))
646 return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName();
647 return ConstString();
648}
649
Enrico Granatad3233c12015-09-09 01:10:46 +0000650std::vector<lldb::LanguageType>
651FormatManager::GetCandidateLanguages (ValueObject& valobj)
Enrico Granata980c0482015-09-01 18:22:39 +0000652{
653 lldb::LanguageType lang_type = valobj.GetObjectRuntimeLanguage();
Enrico Granataac494532015-09-09 22:30:24 +0000654 return GetCandidateLanguages(lang_type);
655}
656
657std::vector<lldb::LanguageType>
658FormatManager::GetCandidateLanguages (lldb::LanguageType lang_type)
659{
Enrico Granata980c0482015-09-01 18:22:39 +0000660 switch (lang_type)
661 {
Enrico Granata33e97e62015-09-04 21:01:18 +0000662 case lldb::eLanguageTypeC:
663 case lldb::eLanguageTypeC89:
664 case lldb::eLanguageTypeC99:
665 case lldb::eLanguageTypeC11:
666 case lldb::eLanguageTypeC_plus_plus:
667 case lldb::eLanguageTypeC_plus_plus_03:
668 case lldb::eLanguageTypeC_plus_plus_11:
669 case lldb::eLanguageTypeC_plus_plus_14:
670 return {lldb::eLanguageTypeC_plus_plus};
Enrico Granata980c0482015-09-01 18:22:39 +0000671 default:
672 return {lang_type};
673 }
674}
675
676LanguageCategory*
677FormatManager::GetCategoryForLanguage (lldb::LanguageType lang_type)
678{
679 Mutex::Locker locker(m_language_categories_mutex);
680 auto iter = m_language_categories_map.find(lang_type), end = m_language_categories_map.end();
681 if (iter != end)
682 return iter->second.get();
683 LanguageCategory* lang_category = new LanguageCategory(lang_type);
684 m_language_categories_map[lang_type] = LanguageCategory::UniquePointer(lang_category);
685 return lang_category;
686}
687
Enrico Granataecd02bc2014-08-19 18:47:58 +0000688lldb::TypeFormatImplSP
689FormatManager::GetHardcodedFormat (ValueObject& valobj,
690 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000691{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000692 for (const auto& candidate: m_hardcoded_formats)
693 {
694 auto result = candidate(valobj,use_dynamic,*this);
695 if (result)
696 return result;
697 }
698 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000699}
700
Enrico Granata852cc952013-10-08 19:03:22 +0000701lldb::TypeFormatImplSP
702FormatManager::GetFormat (ValueObject& valobj,
703 lldb::DynamicValueType use_dynamic)
704{
705 TypeFormatImplSP retval;
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000706 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
707 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
708 if (valobj_type)
709 {
710 if (log)
711 log->Printf("\n\n[FormatManager::GetFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
712 if (m_format_cache.GetFormat(valobj_type,retval))
713 {
714 if (log)
715 {
716 log->Printf("[FormatManager::GetFormat] Cache search success. Returning.");
717 if (log->GetDebug())
718 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
719 }
720 return retval;
721 }
722 if (log)
723 log->Printf("[FormatManager::GetFormat] Cache search failed. Going normal route");
724 }
Enrico Granata980c0482015-09-01 18:22:39 +0000725
726 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
727
728 retval = m_categories_map.GetFormat(valobj, use_dynamic, matches);
729 if (!retval)
730 {
731 if (log)
732 log->Printf("[FormatManager::GetFormat] Search failed. Giving language a chance.");
733 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
734 {
735 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
736 {
737 if (lang_category->Get(valobj, use_dynamic, matches, retval))
738 break;
739 }
740 }
741 if (retval)
742 {
743 if (log)
744 log->Printf("[FormatManager::GetFormat] Language search success. Returning.");
745 return retval;
746 }
747 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000748 if (!retval)
749 {
750 if (log)
751 log->Printf("[FormatManager::GetFormat] Search failed. Giving hardcoded a chance.");
752 retval = GetHardcodedFormat(valobj, use_dynamic);
753 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000754
755 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000756 {
757 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000758 log->Printf("[FormatManager::GetFormat] Caching %p for type %s",
759 static_cast<void*>(retval.get()),
760 valobj_type.AsCString("<invalid>"));
Enrico Granata52b4b6c2013-10-17 22:27:19 +0000761 m_format_cache.SetFormat(valobj_type,retval);
762 }
763 if (log && log->GetDebug())
764 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 +0000765 return retval;
766}
767
Enrico Granataecd02bc2014-08-19 18:47:58 +0000768lldb::TypeSummaryImplSP
769FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj,
770 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000771{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000772 for (const auto& candidate: m_hardcoded_summaries)
773 {
774 auto result = candidate(valobj,use_dynamic,*this);
775 if (result)
776 return result;
777 }
778 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000779}
780
Enrico Granata5548cb52013-01-28 23:47:25 +0000781lldb::TypeSummaryImplSP
782FormatManager::GetSummaryFormat (ValueObject& valobj,
783 lldb::DynamicValueType use_dynamic)
784{
785 TypeSummaryImplSP retval;
Greg Clayton5160ce52013-03-27 23:08:40 +0000786 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
Enrico Granata5548cb52013-01-28 23:47:25 +0000787 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
788 if (valobj_type)
789 {
790 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000791 log->Printf("\n\n[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000792 if (m_format_cache.GetSummary(valobj_type,retval))
Enrico Granata68ae4112013-06-18 18:23:07 +0000793 {
794 if (log)
795 {
796 log->Printf("[FormatManager::GetSummaryFormat] Cache search success. Returning.");
Enrico Granatac2a96402013-06-26 01:03:38 +0000797 if (log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000798 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 +0000799 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000800 return retval;
Enrico Granata68ae4112013-06-18 18:23:07 +0000801 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000802 if (log)
803 log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route");
804 }
Enrico Granata980c0482015-09-01 18:22:39 +0000805
806 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
807
808 retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic, matches);
809 if (!retval)
810 {
811 if (log)
812 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving language a chance.");
813 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
814 {
815 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
816 {
817 if (lang_category->Get(valobj, use_dynamic, matches, retval))
818 break;
819 }
820 }
821 if (retval)
822 {
823 if (log)
824 log->Printf("[FormatManager::GetSummaryFormat] Language search success. Returning.");
825 return retval;
826 }
827 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000828 if (!retval)
829 {
830 if (log)
831 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving hardcoded a chance.");
832 retval = GetHardcodedSummaryFormat(valobj, use_dynamic);
833 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000834
835 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata5548cb52013-01-28 23:47:25 +0000836 {
837 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000838 log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s",
839 static_cast<void*>(retval.get()),
840 valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000841 m_format_cache.SetSummary(valobj_type,retval);
842 }
Enrico Granatac2a96402013-06-26 01:03:38 +0000843 if (log && log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000844 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 +0000845 return retval;
846}
847
848#ifndef LLDB_DISABLE_PYTHON
Enrico Granataecd02bc2014-08-19 18:47:58 +0000849lldb::SyntheticChildrenSP
850FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj,
851 lldb::DynamicValueType use_dynamic)
Enrico Granata686f3de2013-10-30 23:46:27 +0000852{
Enrico Granataecd02bc2014-08-19 18:47:58 +0000853 for (const auto& candidate: m_hardcoded_synthetics)
854 {
855 auto result = candidate(valobj,use_dynamic,*this);
856 if (result)
857 return result;
858 }
859 return nullptr;
Enrico Granata686f3de2013-10-30 23:46:27 +0000860}
861
Enrico Granata5548cb52013-01-28 23:47:25 +0000862lldb::SyntheticChildrenSP
863FormatManager::GetSyntheticChildren (ValueObject& valobj,
Enrico Granatac2a96402013-06-26 01:03:38 +0000864 lldb::DynamicValueType use_dynamic)
Enrico Granata5548cb52013-01-28 23:47:25 +0000865{
866 SyntheticChildrenSP retval;
Greg Clayton5160ce52013-03-27 23:08:40 +0000867 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
Enrico Granata5548cb52013-01-28 23:47:25 +0000868 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
869 if (valobj_type)
870 {
871 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000872 log->Printf("\n\n[FormatManager::GetSyntheticChildren] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000873 if (m_format_cache.GetSynthetic(valobj_type,retval))
Enrico Granata68ae4112013-06-18 18:23:07 +0000874 {
875 if (log)
876 {
877 log->Printf("[FormatManager::GetSyntheticChildren] Cache search success. Returning.");
Enrico Granatac2a96402013-06-26 01:03:38 +0000878 if (log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000879 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 +0000880 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000881 return retval;
Enrico Granata68ae4112013-06-18 18:23:07 +0000882 }
Enrico Granata5548cb52013-01-28 23:47:25 +0000883 if (log)
Enrico Granata68ae4112013-06-18 18:23:07 +0000884 log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route");
Enrico Granata5548cb52013-01-28 23:47:25 +0000885 }
Enrico Granata980c0482015-09-01 18:22:39 +0000886
887 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
888
889 retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic, matches);
890 if (!retval)
891 {
892 if (log)
893 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving language a chance.");
894 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
895 {
896 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
897 {
898 if (lang_category->Get(valobj, use_dynamic, matches, retval))
899 break;
900 }
901 }
902 if (retval)
903 {
904 if (log)
905 log->Printf("[FormatManager::GetSyntheticChildren] Language search success. Returning.");
906 return retval;
907 }
908 }
Enrico Granata686f3de2013-10-30 23:46:27 +0000909 if (!retval)
910 {
911 if (log)
912 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving hardcoded a chance.");
913 retval = GetHardcodedSyntheticChildren(valobj, use_dynamic);
914 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000915
916 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granata5548cb52013-01-28 23:47:25 +0000917 {
918 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000919 log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s",
920 static_cast<void*>(retval.get()),
921 valobj_type.AsCString("<invalid>"));
Enrico Granata5548cb52013-01-28 23:47:25 +0000922 m_format_cache.SetSynthetic(valobj_type,retval);
923 }
Enrico Granatac2a96402013-06-26 01:03:38 +0000924 if (log && log->GetDebug())
Michael Sartain89c862f2013-08-07 19:05:15 +0000925 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 +0000926 return retval;
927}
928#endif
Enrico Granata5548cb52013-01-28 23:47:25 +0000929
Enrico Granatac5827132014-09-05 20:45:07 +0000930lldb::TypeValidatorImplSP
931FormatManager::GetValidator (ValueObject& valobj,
932 lldb::DynamicValueType use_dynamic)
933{
934 TypeValidatorImplSP retval;
935 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
936 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
937 if (valobj_type)
938 {
939 if (log)
940 log->Printf("\n\n[FormatManager::GetValidator] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
941 if (m_format_cache.GetValidator(valobj_type,retval))
942 {
943 if (log)
944 {
945 log->Printf("[FormatManager::GetValidator] Cache search success. Returning.");
946 if (log->GetDebug())
947 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
948 }
949 return retval;
950 }
951 if (log)
952 log->Printf("[FormatManager::GetValidator] Cache search failed. Going normal route");
953 }
Enrico Granata980c0482015-09-01 18:22:39 +0000954
955 FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic);
956
957 retval = m_categories_map.GetValidator(valobj, use_dynamic, matches);
958 if (!retval)
959 {
960 if (log)
961 log->Printf("[FormatManager::GetValidator] Search failed. Giving language a chance.");
962 for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj))
963 {
964 if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type))
965 {
966 if (lang_category->Get(valobj, use_dynamic, matches, retval))
967 break;
968 }
969 }
970 if (retval)
971 {
972 if (log)
973 log->Printf("[FormatManager::GetValidator] Language search success. Returning.");
974 return retval;
975 }
976 }
Enrico Granatac5827132014-09-05 20:45:07 +0000977 if (!retval)
978 {
979 if (log)
980 log->Printf("[FormatManager::GetValidator] Search failed. Giving hardcoded a chance.");
981 retval = GetHardcodedValidator(valobj, use_dynamic);
982 }
Enrico Granatad4cb1dd2015-07-01 20:06:40 +0000983
984 if (valobj_type && (!retval || !retval->NonCacheable()))
Enrico Granatac5827132014-09-05 20:45:07 +0000985 {
986 if (log)
987 log->Printf("[FormatManager::GetValidator] Caching %p for type %s",
988 static_cast<void*>(retval.get()),
989 valobj_type.AsCString("<invalid>"));
990 m_format_cache.SetValidator(valobj_type,retval);
991 }
992 if (log && log->GetDebug())
993 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
994 return retval;
995}
996
997lldb::TypeValidatorImplSP
998FormatManager::GetHardcodedValidator (ValueObject& valobj,
999 lldb::DynamicValueType use_dynamic)
1000{
1001 for (const auto& candidate: m_hardcoded_validators)
1002 {
1003 auto result = candidate(valobj,use_dynamic,*this);
1004 if (result)
1005 return result;
1006 }
1007 return nullptr;
1008}
1009
Enrico Granata5548cb52013-01-28 23:47:25 +00001010FormatManager::FormatManager() :
1011 m_format_cache(),
Enrico Granatac482a192011-08-17 22:13:59 +00001012 m_named_summaries_map(this),
1013 m_last_revision(0),
1014 m_categories_map(this),
Enrico Granata980c0482015-09-01 18:22:39 +00001015 m_language_categories_map(),
1016 m_language_categories_mutex(Mutex::eMutexTypeRecursive),
Enrico Granata1d887492011-08-22 18:36:52 +00001017 m_default_category_name(ConstString("default")),
1018 m_system_category_name(ConstString("system")),
Enrico Granata864e3e82012-02-17 03:18:30 +00001019 m_objc_category_name(ConstString("objc")),
1020 m_corefoundation_category_name(ConstString("CoreFoundation")),
1021 m_coregraphics_category_name(ConstString("CoreGraphics")),
1022 m_coreservices_category_name(ConstString("CoreServices")),
Enrico Granatad3d444f2012-02-23 23:10:03 +00001023 m_vectortypes_category_name(ConstString("VectorTypes")),
Enrico Granataecd02bc2014-08-19 18:47:58 +00001024 m_appkit_category_name(ConstString("AppKit")),
Enrico Granatabb557062015-02-10 23:02:25 +00001025 m_coremedia_category_name(ConstString("CoreMedia")),
Enrico Granataecd02bc2014-08-19 18:47:58 +00001026 m_hardcoded_formats(),
1027 m_hardcoded_summaries(),
Enrico Granatac5827132014-09-05 20:45:07 +00001028 m_hardcoded_synthetics(),
1029 m_hardcoded_validators()
Enrico Granataecd02bc2014-08-19 18:47:58 +00001030
Enrico Granatac482a192011-08-17 22:13:59 +00001031{
Enrico Granata864e3e82012-02-17 03:18:30 +00001032 LoadSystemFormatters();
Enrico Granata864e3e82012-02-17 03:18:30 +00001033 LoadObjCFormatters();
Enrico Granatabb557062015-02-10 23:02:25 +00001034 LoadCoreMediaFormatters();
Enrico Granataecd02bc2014-08-19 18:47:58 +00001035 LoadHardcodedFormatters();
Enrico Granata864e3e82012-02-17 03:18:30 +00001036
Enrico Granata5548cb52013-01-28 23:47:25 +00001037 EnableCategory(m_objc_category_name,TypeCategoryMap::Last);
1038 EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last);
1039 EnableCategory(m_appkit_category_name,TypeCategoryMap::Last);
1040 EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last);
1041 EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last);
Enrico Granata67391b62015-02-10 23:17:07 +00001042 EnableCategory(m_coremedia_category_name,TypeCategoryMap::Last);
Enrico Granata5548cb52013-01-28 23:47:25 +00001043 EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last);
1044 EnableCategory(m_system_category_name,TypeCategoryMap::Last);
Enrico Granata864e3e82012-02-17 03:18:30 +00001045}
1046
1047void
Enrico Granata864e3e82012-02-17 03:18:30 +00001048FormatManager::LoadSystemFormatters()
1049{
Enrico Granataf68df122013-01-10 22:08:35 +00001050
1051 TypeSummaryImpl::Flags string_flags;
Enrico Granata0337c272013-02-22 00:37:31 +00001052 string_flags.SetCascades(true)
Enrico Granataf68df122013-01-10 22:08:35 +00001053 .SetSkipPointers(true)
1054 .SetSkipReferences(false)
1055 .SetDontShowChildren(true)
1056 .SetDontShowValue(false)
1057 .SetShowMembersOneLiner(false)
1058 .SetHideItemNames(false);
1059
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001060 TypeSummaryImpl::Flags string_array_flags;
Enrico Granatad2911632015-07-28 02:13:03 +00001061 string_array_flags.SetCascades(true)
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001062 .SetSkipPointers(true)
1063 .SetSkipReferences(false)
1064 .SetDontShowChildren(true)
1065 .SetDontShowValue(true)
1066 .SetShowMembersOneLiner(false)
1067 .SetHideItemNames(false);
1068
Enrico Granataf68df122013-01-10 22:08:35 +00001069 lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(string_flags, "${var%s}"));
Enrico Granatac482a192011-08-17 22:13:59 +00001070
1071
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001072 lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(string_array_flags,
Enrico Granata061858c2012-02-15 02:34:21 +00001073 "${var%s}"));
Enrico Granatac482a192011-08-17 22:13:59 +00001074
1075 lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
Enrico Granatabc2c2b02015-06-15 23:01:47 +00001076 lldb::RegularExpressionSP any_size_wchar_arr(new RegularExpression("wchar_t \\[[0-9]+\\]"));
Enrico Granatac482a192011-08-17 22:13:59 +00001077
Enrico Granata061858c2012-02-15 02:34:21 +00001078 TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
Enrico Granatac482a192011-08-17 22:13:59 +00001079
Enrico Granatab72a5012013-12-20 09:38:13 +00001080 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("char *"), string_format);
1081 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("unsigned char *"), string_format);
1082 sys_category_sp->GetRegexTypeSummariesContainer()->Add(any_size_char_arr, string_array_format);
Enrico Granataaff65652013-10-21 17:29:51 +00001083
Enrico Granata4ed7ef12012-07-13 18:54:40 +00001084 lldb::TypeSummaryImplSP ostype_summary(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
1085 .SetSkipPointers(true)
1086 .SetSkipReferences(true)
1087 .SetDontShowChildren(true)
1088 .SetDontShowValue(false)
1089 .SetShowMembersOneLiner(false)
1090 .SetHideItemNames(false),
1091 "${var%O}"));
1092
Enrico Granatab72a5012013-12-20 09:38:13 +00001093 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("OSType"), ostype_summary);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001094
Jason Molenda1a100cd2013-01-12 04:24:50 +00001095#ifndef LLDB_DISABLE_PYTHON
Enrico Granata4cc21772013-10-08 20:59:02 +00001096 TypeFormatImpl::Flags fourchar_flags;
1097 fourchar_flags.SetCascades(true).SetSkipPointers(true).SetSkipReferences(true);
1098
1099 AddFormat(sys_category_sp, lldb::eFormatOSType, ConstString("FourCharCode"), fourchar_flags);
Jason Molenda1a100cd2013-01-12 04:24:50 +00001100#endif
Enrico Granatad3d444f2012-02-23 23:10:03 +00001101}
Enrico Granatab2698cd2012-09-13 18:27:09 +00001102
Enrico Granata864e3e82012-02-17 03:18:30 +00001103void
1104FormatManager::LoadObjCFormatters()
1105{
1106 TypeSummaryImpl::Flags objc_flags;
1107 objc_flags.SetCascades(false)
Enrico Granata4b7b5aa2012-07-13 18:55:41 +00001108 .SetSkipPointers(true)
1109 .SetSkipReferences(true)
Enrico Granata864e3e82012-02-17 03:18:30 +00001110 .SetDontShowChildren(true)
1111 .SetDontShowValue(true)
1112 .SetShowMembersOneLiner(false)
1113 .SetHideItemNames(false);
Enrico Granata13643112012-09-04 22:04:50 +00001114
1115 TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001116 TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name);
1117 TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name);
1118 TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name);
1119 TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name);
Enrico Granata864e3e82012-02-17 03:18:30 +00001120
Enrico Granatab5887262012-10-29 21:18:03 +00001121 lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,""));
Enrico Granatab72a5012013-12-20 09:38:13 +00001122 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"),
Enrico Granatabac45f62012-01-31 17:01:51 +00001123 ObjC_BOOL_summary);
Enrico Granatab72a5012013-12-20 09:38:13 +00001124 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"),
Enrico Granatab5887262012-10-29 21:18:03 +00001125 ObjC_BOOL_summary);
Enrico Granatab72a5012013-12-20 09:38:13 +00001126 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"),
Enrico Granatab5887262012-10-29 21:18:03 +00001127 ObjC_BOOL_summary);
Enrico Granata4b7b5aa2012-07-13 18:55:41 +00001128
Jason Molendacc57a382012-11-01 23:35:19 +00001129#ifndef LLDB_DISABLE_PYTHON
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001130 // we need to skip pointers here since we are special casing a SEL* when retrieving its value
1131 objc_flags.SetSkipPointers(true);
Enrico Granataf68df122013-01-10 22:08:35 +00001132 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags);
1133 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
1134 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags);
1135 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags);
Enrico Granata75dfb432013-02-15 00:06:04 +00001136 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags);
Enrico Granatab5887262012-10-29 21:18:03 +00001137
Enrico Granata55900862013-03-15 18:55:30 +00001138 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags);
Enrico Granatac76b97b2013-04-26 00:59:02 +00001139
1140 SyntheticChildren::Flags class_synth_flags;
1141 class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
1142
1143 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001144#endif // LLDB_DISABLE_PYTHON
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001145
Enrico Granatab5887262012-10-29 21:18:03 +00001146 objc_flags.SetSkipPointers(false);
Enrico Granatae602fe12013-07-10 18:25:45 +00001147 objc_flags.SetCascades(true);
1148 objc_flags.SetSkipReferences(false);
1149
1150 AddStringSummary (objc_category_sp,
1151 "${var.__FuncPtr%A}",
1152 ConstString("__block_literal_generic"),
1153 objc_flags);
Enrico Granatab5887262012-10-29 21:18:03 +00001154
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001155 AddStringSummary(corefoundation_category_sp,
1156 "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
1157 ConstString("CFGregorianUnits"),
1158 objc_flags);
1159 AddStringSummary(corefoundation_category_sp,
1160 "location=${var.location} length=${var.length}",
1161 ConstString("CFRange"),
1162 objc_flags);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001163
1164 AddStringSummary(appkit_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001165 "location=${var.location}, length=${var.length}",
1166 ConstString("NSRange"),
1167 objc_flags);
Enrico Granatab6d7cba2014-10-29 01:03:09 +00001168 AddStringSummary(appkit_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001169 "(${var.origin}, ${var.size}), ...",
1170 ConstString("NSRectArray"),
1171 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001172
Enrico Granata944547d2014-11-11 19:52:12 +00001173 AddOneLineSummary (appkit_category_sp,
1174 ConstString("NSPoint"),
1175 objc_flags);
1176 AddOneLineSummary (appkit_category_sp,
1177 ConstString("NSSize"),
1178 objc_flags);
1179 AddOneLineSummary (appkit_category_sp,
1180 ConstString("NSRect"),
1181 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001182
Enrico Granata944547d2014-11-11 19:52:12 +00001183 AddOneLineSummary (coregraphics_category_sp,
1184 ConstString("CGSize"),
1185 objc_flags);
1186 AddOneLineSummary (coregraphics_category_sp,
1187 ConstString("CGPoint"),
1188 objc_flags);
1189 AddOneLineSummary (coregraphics_category_sp,
1190 ConstString("CGRect"),
1191 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001192
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001193 AddStringSummary(coreservices_category_sp,
1194 "red=${var.red} green=${var.green} blue=${var.blue}",
1195 ConstString("RGBColor"),
1196 objc_flags);
1197 AddStringSummary(coreservices_category_sp,
1198 "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
1199 ConstString("Rect"),
1200 objc_flags);
1201 AddStringSummary(coreservices_category_sp,
1202 "(v=${var.v}, h=${var.h})",
1203 ConstString("Point"),
1204 objc_flags);
1205 AddStringSummary(coreservices_category_sp,
1206 "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
1207 ConstString("DateTimeRect *"),
1208 objc_flags);
1209 AddStringSummary(coreservices_category_sp,
1210 "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
1211 ConstString("LongDateRect"),
1212 objc_flags);
1213 AddStringSummary(coreservices_category_sp,
1214 "(x=${var.x}, y=${var.y})",
1215 ConstString("HIPoint"),
1216 objc_flags);
1217 AddStringSummary(coreservices_category_sp,
1218 "origin=${var.origin} size=${var.size}",
1219 ConstString("HIRect"),
1220 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001221
Enrico Granatad3d444f2012-02-23 23:10:03 +00001222 TypeSummaryImpl::Flags appkit_flags;
1223 appkit_flags.SetCascades(true)
1224 .SetSkipPointers(false)
1225 .SetSkipReferences(false)
1226 .SetDontShowChildren(true)
1227 .SetDontShowValue(false)
1228 .SetShowMembersOneLiner(false)
1229 .SetHideItemNames(false);
1230
Enrico Granatab2698cd2012-09-13 18:27:09 +00001231 appkit_flags.SetDontShowChildren(false);
1232
Jason Molenda38f8bbe2012-09-15 01:59:02 +00001233
Jason Molenda5c4210be2012-09-20 06:06:59 +00001234#ifndef LLDB_DISABLE_PYTHON
Enrico Granatab2698cd2012-09-13 18:27:09 +00001235 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags);
1236 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
1237 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
1238 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
1239 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001240 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
1241 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags);
Enrico Granatab2698cd2012-09-13 18:27:09 +00001242
Enrico Granata97fca502012-09-18 17:43:16 +00001243 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags);
1244 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags);
1245 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags);
1246 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags);
1247 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001248 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags);
1249 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags);
Enrico Granata97fca502012-09-18 17:43:16 +00001250
Enrico Granata9f02e092013-02-18 23:16:23 +00001251 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags);
Enrico Granatacd67f972013-04-27 00:27:20 +00001252 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001253 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags);
1254 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags);
1255 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags);
Enrico Granata9f02e092013-02-18 23:16:23 +00001256 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags);
1257 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags);
1258 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags);
Enrico Granatacd67f972013-04-27 00:27:20 +00001259 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags);
1260 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags);
1261 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags);
1262 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags);
1263
Enrico Granata97fca502012-09-18 17:43:16 +00001264 // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags);
1265
Enrico Granatab2698cd2012-09-13 18:27:09 +00001266 appkit_flags.SetDontShowChildren(true);
1267
Enrico Granata5548cb52013-01-28 23:47:25 +00001268 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags());
1269 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags());
1270 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags());
1271 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags());
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001272 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags());
1273 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags());
1274 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags());
Enrico Granatad3d444f2012-02-23 23:10:03 +00001275
Enrico Granata5548cb52013-01-28 23:47:25 +00001276 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags());
1277 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags());
Enrico Granata4419d532014-08-27 01:10:27 +00001278 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags());
Enrico Granata5548cb52013-01-28 23:47:25 +00001279 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags());
1280 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags());
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001281 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags());
1282 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags());
Enrico Granata97fca502012-09-18 17:43:16 +00001283
Enrico Granata9f02e092013-02-18 23:16:23 +00001284 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags());
Enrico Granatacd67f972013-04-27 00:27:20 +00001285 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags());
1286 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags());
1287 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags());
1288 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags());
1289 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags());
1290 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags());
Enrico Granata5510a572014-10-15 21:38:32 +00001291
1292 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags());
Enrico Granatacd67f972013-04-27 00:27:20 +00001293
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001294 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
1295 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
1296 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags);
1297 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001298
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001299 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags);
1300 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001301
Enrico Granatab2698cd2012-09-13 18:27:09 +00001302 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001303 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
Enrico Granata6b6ea7a2014-01-08 02:34:42 +00001304 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001305 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags);
Enrico Granata5bfce362013-02-08 01:55:46 +00001306 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001307 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags);
1308 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
1309 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags);
1310 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags);
Enrico Granatab2698cd2012-09-13 18:27:09 +00001311 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
Enrico Granata3467d802012-09-04 18:47:54 +00001312
Enrico Granata5bfce362013-02-08 01:55:46 +00001313 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags);
1314 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags);
1315 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags);
1316
Enrico Granataf68f7322013-03-15 18:44:08 +00001317 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001318
Enrico Granatab2698cd2012-09-13 18:27:09 +00001319 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags);
1320 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
1321 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags);
Enrico Granatafcd974a2014-03-20 01:15:44 +00001322 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001323 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
1324 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
1325 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001326
Enrico Granata50b5ee52013-03-16 00:50:25 +00001327 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags);
1328
1329 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags);
1330 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags);
Enrico Granata4a3274a2012-03-22 19:55:55 +00001331
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001332 AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
Enrico Granata5548cb52013-01-28 23:47:25 +00001333 AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
1334
Enrico Granatab2698cd2012-09-13 18:27:09 +00001335 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
Enrico Granatad8e45842014-02-03 19:46:31 +00001336 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001337 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
1338 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
1339 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
1340 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
Enrico Granataf175ad12012-10-03 23:53:45 +00001341
1342 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags);
1343 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags);
1344 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
1345 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
Enrico Granataf615b802013-02-15 23:38:37 +00001346
Enrico Granatae214a022013-02-08 19:28:04 +00001347 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001348 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags);
Enrico Granatad3d444f2012-02-23 23:10:03 +00001349
Enrico Granata6d37cc62013-03-19 00:27:22 +00001350 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags);
1351 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags);
1352 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags);
1353 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001354
Enrico Granata9f71ad42013-03-16 01:50:07 +00001355 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags);
Enrico Granatad8e45842014-02-03 19:46:31 +00001356 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags);
Enrico Granata9f71ad42013-03-16 01:50:07 +00001357 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001358
Enrico Granata896cd1d2012-03-01 19:32:33 +00001359 // CFAbsoluteTime is actually a double rather than a pointer to an object
1360 // we do not care about the numeric value, since it is probably meaningless to users
1361 appkit_flags.SetDontShowValue(true);
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001362 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags);
Enrico Granata896cd1d2012-03-01 19:32:33 +00001363 appkit_flags.SetDontShowValue(false);
1364
Enrico Granata6a925112013-03-16 01:18:00 +00001365 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags);
1366 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags);
Enrico Granata896cd1d2012-03-01 19:32:33 +00001367
Enrico Granatad8e45842014-02-03 19:46:31 +00001368 AddStringSummary(corefoundation_category_sp,
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001369 "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"",
1370 ConstString("CFGregorianDate"),
1371 appkit_flags);
Enrico Granata8d5c83f2012-03-02 00:55:53 +00001372
Enrico Granata1c127dfb2013-10-05 00:03:07 +00001373 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags);
1374 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags);
1375 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags);
1376 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags);
Enrico Granata13643112012-09-04 22:04:50 +00001377#endif // LLDB_DISABLE_PYTHON
1378
Enrico Granata864e3e82012-02-17 03:18:30 +00001379 TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
1380
1381 TypeSummaryImpl::Flags vector_flags;
1382 vector_flags.SetCascades(true)
1383 .SetSkipPointers(true)
1384 .SetSkipReferences(false)
1385 .SetDontShowChildren(true)
1386 .SetDontShowValue(false)
1387 .SetShowMembersOneLiner(true)
1388 .SetHideItemNames(true);
1389
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001390 AddStringSummary(vectors_category_sp,
1391 "${var.uint128}",
1392 ConstString("builtin_type_vec128"),
1393 objc_flags);
Enrico Granata864e3e82012-02-17 03:18:30 +00001394
Enrico Granatae6a6d9a2012-12-10 23:30:25 +00001395 AddStringSummary(vectors_category_sp,
1396 "",
1397 ConstString("float [4]"),
1398 vector_flags);
1399 AddStringSummary(vectors_category_sp,
1400 "",
1401 ConstString("int32_t [4]"),
1402 vector_flags);
1403 AddStringSummary(vectors_category_sp,
1404 "",
1405 ConstString("int16_t [8]"),
1406 vector_flags);
1407 AddStringSummary(vectors_category_sp,
1408 "",
1409 ConstString("vDouble"),
1410 vector_flags);
1411 AddStringSummary(vectors_category_sp,
1412 "",
1413 ConstString("vFloat"),
1414 vector_flags);
1415 AddStringSummary(vectors_category_sp,
1416 "",
1417 ConstString("vSInt8"),
1418 vector_flags);
1419 AddStringSummary(vectors_category_sp,
1420 "",
1421 ConstString("vSInt16"),
1422 vector_flags);
1423 AddStringSummary(vectors_category_sp,
1424 "",
1425 ConstString("vSInt32"),
1426 vector_flags);
1427 AddStringSummary(vectors_category_sp,
1428 "",
1429 ConstString("vUInt16"),
1430 vector_flags);
1431 AddStringSummary(vectors_category_sp,
1432 "",
1433 ConstString("vUInt8"),
1434 vector_flags);
1435 AddStringSummary(vectors_category_sp,
1436 "",
1437 ConstString("vUInt16"),
1438 vector_flags);
1439 AddStringSummary(vectors_category_sp,
1440 "",
1441 ConstString("vUInt32"),
1442 vector_flags);
1443 AddStringSummary(vectors_category_sp,
1444 "",
1445 ConstString("vBool32"),
1446 vector_flags);
Greg Claytond4e25522011-10-12 00:53:29 +00001447}
Enrico Granataecd02bc2014-08-19 18:47:58 +00001448
1449void
Enrico Granatabb557062015-02-10 23:02:25 +00001450FormatManager::LoadCoreMediaFormatters()
1451{
1452 TypeSummaryImpl::Flags cm_flags;
1453 cm_flags.SetCascades(true)
1454 .SetDontShowChildren(false)
1455 .SetDontShowValue(false)
1456 .SetHideItemNames(false)
1457 .SetShowMembersOneLiner(false)
1458 .SetSkipPointers(false)
1459 .SetSkipReferences(false);
1460
1461 TypeCategoryImpl::SharedPointer cm_category_sp = GetCategory(m_coremedia_category_name);
1462
Tamas Berghammerdd403fb2015-02-11 17:51:49 +00001463#ifndef LLDB_DISABLE_PYTHON
Enrico Granatabb557062015-02-10 23:02:25 +00001464 AddCXXSummary(cm_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags);
Tamas Berghammerdd403fb2015-02-11 17:51:49 +00001465#endif // LLDB_DISABLE_PYTHON
Enrico Granatabb557062015-02-10 23:02:25 +00001466}
1467
1468void
Enrico Granataecd02bc2014-08-19 18:47:58 +00001469FormatManager::LoadHardcodedFormatters()
1470{
1471 {
1472 // insert code to load formats here
1473 }
1474 {
1475 // insert code to load summaries here
Enrico Granataff0f23d2014-12-10 02:00:45 +00001476 m_hardcoded_summaries.push_back(
1477 [](lldb_private::ValueObject& valobj,
1478 lldb::DynamicValueType,
1479 FormatManager&) -> TypeSummaryImpl::SharedPointer {
Enrico Granata419d7912015-09-04 00:33:51 +00001480 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider"));
Greg Clayton99558cc42015-08-24 23:46:31 +00001481 if (valobj.GetCompilerType().IsFunctionPointerType())
Enrico Granataff0f23d2014-12-10 02:00:45 +00001482 {
1483 return formatter_sp;
1484 }
1485 return nullptr;
1486 });
Enrico Granatad529d042015-07-07 00:20:57 +00001487 m_hardcoded_summaries.push_back(
1488 [](lldb_private::ValueObject& valobj,
1489 lldb::DynamicValueType,
1490 FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1491 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags()
1492 .SetCascades(true)
1493 .SetDontShowChildren(true)
1494 .SetHideItemNames(true)
1495 .SetShowMembersOneLiner(true)
1496 .SetSkipPointers(true)
1497 .SetSkipReferences(false),
1498 lldb_private::formatters::VectorTypeSummaryProvider,
1499 "vector_type pointer summary provider"));
Greg Clayton99558cc42015-08-24 23:46:31 +00001500 if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
Enrico Granatad529d042015-07-07 00:20:57 +00001501 {
1502 if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled())
1503 return formatter_sp;
1504 }
1505 return nullptr;
1506 });
Enrico Granataecd02bc2014-08-19 18:47:58 +00001507 }
1508 {
1509 // insert code to load synthetics here
Enrico Granatadb595cd2015-03-06 19:37:57 +00001510 m_hardcoded_synthetics.push_back(
1511 [](lldb_private::ValueObject& valobj,
1512 lldb::DynamicValueType,
1513 FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer {
Enrico Granatad4cb1dd2015-07-01 20:06:40 +00001514 static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true),
Enrico Granatadb595cd2015-03-06 19:37:57 +00001515 "vector_type synthetic children",
1516 lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
Greg Clayton99558cc42015-08-24 23:46:31 +00001517 if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
Enrico Granatadb595cd2015-03-06 19:37:57 +00001518 {
1519 if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled())
1520 return formatter_sp;
1521 }
1522 return nullptr;
1523 });
Enrico Granataecd02bc2014-08-19 18:47:58 +00001524 }
Enrico Granatac5827132014-09-05 20:45:07 +00001525 {
1526 // insert code to load validators here
1527 }
Enrico Granataecd02bc2014-08-19 18:47:58 +00001528}