1*5548cb50SEnrico Granata //===-- FormatManager.cpp -------------------------------------------*- C++ -*-===//
2*5548cb50SEnrico Granata //
3*5548cb50SEnrico Granata //                     The LLVM Compiler Infrastructure
4*5548cb50SEnrico Granata //
5*5548cb50SEnrico Granata // This file is distributed under the University of Illinois Open Source
6*5548cb50SEnrico Granata // License. See LICENSE.TXT for details.
7*5548cb50SEnrico Granata //
8*5548cb50SEnrico Granata //===----------------------------------------------------------------------===//
9*5548cb50SEnrico Granata 
10*5548cb50SEnrico Granata #include "lldb/lldb-python.h"
11*5548cb50SEnrico Granata 
12*5548cb50SEnrico Granata #include "lldb/DataFormatters/FormatManager.h"
13*5548cb50SEnrico Granata 
14*5548cb50SEnrico Granata // C Includes
15*5548cb50SEnrico Granata // C++ Includes
16*5548cb50SEnrico Granata // Other libraries and framework includes
17*5548cb50SEnrico Granata // Project includes
18*5548cb50SEnrico Granata 
19*5548cb50SEnrico Granata #include "lldb/Core/Debugger.h"
20*5548cb50SEnrico Granata #include "lldb/DataFormatters/CXXFormatterFunctions.h"
21*5548cb50SEnrico Granata #include "lldb/Interpreter/ScriptInterpreterPython.h"
22*5548cb50SEnrico Granata #include "lldb/Target/ExecutionContext.h"
23*5548cb50SEnrico Granata #include "lldb/Target/Platform.h"
24*5548cb50SEnrico Granata 
25*5548cb50SEnrico Granata using namespace lldb;
26*5548cb50SEnrico Granata using namespace lldb_private;
27*5548cb50SEnrico Granata 
28*5548cb50SEnrico Granata 
29*5548cb50SEnrico Granata struct FormatInfo
30*5548cb50SEnrico Granata {
31*5548cb50SEnrico Granata     Format format;
32*5548cb50SEnrico Granata     const char format_char; // One or more format characters that can be used for this format.
33*5548cb50SEnrico Granata     const char *format_name;    // Long format name that can be used to specify the current format
34*5548cb50SEnrico Granata };
35*5548cb50SEnrico Granata 
36*5548cb50SEnrico Granata static FormatInfo
37*5548cb50SEnrico Granata g_format_infos[] =
38*5548cb50SEnrico Granata {
39*5548cb50SEnrico Granata     { eFormatDefault        , '\0'  , "default"             },
40*5548cb50SEnrico Granata     { eFormatBoolean        , 'B'   , "boolean"             },
41*5548cb50SEnrico Granata     { eFormatBinary         , 'b'   , "binary"              },
42*5548cb50SEnrico Granata     { eFormatBytes          , 'y'   , "bytes"               },
43*5548cb50SEnrico Granata     { eFormatBytesWithASCII , 'Y'   , "bytes with ASCII"    },
44*5548cb50SEnrico Granata     { eFormatChar           , 'c'   , "character"           },
45*5548cb50SEnrico Granata     { eFormatCharPrintable  , 'C'   , "printable character" },
46*5548cb50SEnrico Granata     { eFormatComplexFloat   , 'F'   , "complex float"       },
47*5548cb50SEnrico Granata     { eFormatCString        , 's'   , "c-string"            },
48*5548cb50SEnrico Granata     { eFormatDecimal        , 'd'   , "decimal"             },
49*5548cb50SEnrico Granata     { eFormatEnum           , 'E'   , "enumeration"         },
50*5548cb50SEnrico Granata     { eFormatHex            , 'x'   , "hex"                 },
51*5548cb50SEnrico Granata     { eFormatHexUppercase   , 'X'   , "uppercase hex"       },
52*5548cb50SEnrico Granata     { eFormatFloat          , 'f'   , "float"               },
53*5548cb50SEnrico Granata     { eFormatOctal          , 'o'   , "octal"               },
54*5548cb50SEnrico Granata     { eFormatOSType         , 'O'   , "OSType"              },
55*5548cb50SEnrico Granata     { eFormatUnicode16      , 'U'   , "unicode16"           },
56*5548cb50SEnrico Granata     { eFormatUnicode32      , '\0'  , "unicode32"           },
57*5548cb50SEnrico Granata     { eFormatUnsigned       , 'u'   , "unsigned decimal"    },
58*5548cb50SEnrico Granata     { eFormatPointer        , 'p'   , "pointer"             },
59*5548cb50SEnrico Granata     { eFormatVectorOfChar   , '\0'  , "char[]"              },
60*5548cb50SEnrico Granata     { eFormatVectorOfSInt8  , '\0'  , "int8_t[]"            },
61*5548cb50SEnrico Granata     { eFormatVectorOfUInt8  , '\0'  , "uint8_t[]"           },
62*5548cb50SEnrico Granata     { eFormatVectorOfSInt16 , '\0'  , "int16_t[]"           },
63*5548cb50SEnrico Granata     { eFormatVectorOfUInt16 , '\0'  , "uint16_t[]"          },
64*5548cb50SEnrico Granata     { eFormatVectorOfSInt32 , '\0'  , "int32_t[]"           },
65*5548cb50SEnrico Granata     { eFormatVectorOfUInt32 , '\0'  , "uint32_t[]"          },
66*5548cb50SEnrico Granata     { eFormatVectorOfSInt64 , '\0'  , "int64_t[]"           },
67*5548cb50SEnrico Granata     { eFormatVectorOfUInt64 , '\0'  , "uint64_t[]"          },
68*5548cb50SEnrico Granata     { eFormatVectorOfFloat32, '\0'  , "float32[]"           },
69*5548cb50SEnrico Granata     { eFormatVectorOfFloat64, '\0'  , "float64[]"           },
70*5548cb50SEnrico Granata     { eFormatVectorOfUInt128, '\0'  , "uint128_t[]"         },
71*5548cb50SEnrico Granata     { eFormatComplexInteger , 'I'   , "complex integer"     },
72*5548cb50SEnrico Granata     { eFormatCharArray      , 'a'   , "character array"     },
73*5548cb50SEnrico Granata     { eFormatAddressInfo    , 'A'   , "address"             },
74*5548cb50SEnrico Granata     { eFormatHexFloat       , '\0'  , "hex float"           },
75*5548cb50SEnrico Granata     { eFormatInstruction    , 'i'   , "instruction"         },
76*5548cb50SEnrico Granata     { eFormatVoid           , 'v'   , "void"                }
77*5548cb50SEnrico Granata };
78*5548cb50SEnrico Granata 
79*5548cb50SEnrico Granata static uint32_t
80*5548cb50SEnrico Granata g_num_format_infos = sizeof(g_format_infos)/sizeof(FormatInfo);
81*5548cb50SEnrico Granata 
82*5548cb50SEnrico Granata static bool
83*5548cb50SEnrico Granata GetFormatFromFormatChar (char format_char, Format &format)
84*5548cb50SEnrico Granata {
85*5548cb50SEnrico Granata     for (uint32_t i=0; i<g_num_format_infos; ++i)
86*5548cb50SEnrico Granata     {
87*5548cb50SEnrico Granata         if (g_format_infos[i].format_char == format_char)
88*5548cb50SEnrico Granata         {
89*5548cb50SEnrico Granata             format = g_format_infos[i].format;
90*5548cb50SEnrico Granata             return true;
91*5548cb50SEnrico Granata         }
92*5548cb50SEnrico Granata     }
93*5548cb50SEnrico Granata     format = eFormatInvalid;
94*5548cb50SEnrico Granata     return false;
95*5548cb50SEnrico Granata }
96*5548cb50SEnrico Granata 
97*5548cb50SEnrico Granata static bool
98*5548cb50SEnrico Granata GetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format &format)
99*5548cb50SEnrico Granata {
100*5548cb50SEnrico Granata     uint32_t i;
101*5548cb50SEnrico Granata     for (i=0; i<g_num_format_infos; ++i)
102*5548cb50SEnrico Granata     {
103*5548cb50SEnrico Granata         if (strcasecmp (g_format_infos[i].format_name, format_name) == 0)
104*5548cb50SEnrico Granata         {
105*5548cb50SEnrico Granata             format = g_format_infos[i].format;
106*5548cb50SEnrico Granata             return true;
107*5548cb50SEnrico Granata         }
108*5548cb50SEnrico Granata     }
109*5548cb50SEnrico Granata 
110*5548cb50SEnrico Granata     if (partial_match_ok)
111*5548cb50SEnrico Granata     {
112*5548cb50SEnrico Granata         for (i=0; i<g_num_format_infos; ++i)
113*5548cb50SEnrico Granata         {
114*5548cb50SEnrico Granata             if (strcasestr (g_format_infos[i].format_name, format_name) == g_format_infos[i].format_name)
115*5548cb50SEnrico Granata             {
116*5548cb50SEnrico Granata                 format = g_format_infos[i].format;
117*5548cb50SEnrico Granata                 return true;
118*5548cb50SEnrico Granata             }
119*5548cb50SEnrico Granata         }
120*5548cb50SEnrico Granata     }
121*5548cb50SEnrico Granata     format = eFormatInvalid;
122*5548cb50SEnrico Granata     return false;
123*5548cb50SEnrico Granata }
124*5548cb50SEnrico Granata 
125*5548cb50SEnrico Granata bool
126*5548cb50SEnrico Granata FormatManager::GetFormatFromCString (const char *format_cstr,
127*5548cb50SEnrico Granata                                      bool partial_match_ok,
128*5548cb50SEnrico Granata                                      lldb::Format &format)
129*5548cb50SEnrico Granata {
130*5548cb50SEnrico Granata     bool success = false;
131*5548cb50SEnrico Granata     if (format_cstr && format_cstr[0])
132*5548cb50SEnrico Granata     {
133*5548cb50SEnrico Granata         if (format_cstr[1] == '\0')
134*5548cb50SEnrico Granata         {
135*5548cb50SEnrico Granata             success = GetFormatFromFormatChar (format_cstr[0], format);
136*5548cb50SEnrico Granata             if (success)
137*5548cb50SEnrico Granata                 return true;
138*5548cb50SEnrico Granata         }
139*5548cb50SEnrico Granata 
140*5548cb50SEnrico Granata         success = GetFormatFromFormatName (format_cstr, partial_match_ok, format);
141*5548cb50SEnrico Granata     }
142*5548cb50SEnrico Granata     if (!success)
143*5548cb50SEnrico Granata         format = eFormatInvalid;
144*5548cb50SEnrico Granata     return success;
145*5548cb50SEnrico Granata }
146*5548cb50SEnrico Granata 
147*5548cb50SEnrico Granata char
148*5548cb50SEnrico Granata FormatManager::GetFormatAsFormatChar (lldb::Format format)
149*5548cb50SEnrico Granata {
150*5548cb50SEnrico Granata     for (uint32_t i=0; i<g_num_format_infos; ++i)
151*5548cb50SEnrico Granata     {
152*5548cb50SEnrico Granata         if (g_format_infos[i].format == format)
153*5548cb50SEnrico Granata             return g_format_infos[i].format_char;
154*5548cb50SEnrico Granata     }
155*5548cb50SEnrico Granata     return '\0';
156*5548cb50SEnrico Granata }
157*5548cb50SEnrico Granata 
158*5548cb50SEnrico Granata const char *
159*5548cb50SEnrico Granata FormatManager::GetFormatAsCString (Format format)
160*5548cb50SEnrico Granata {
161*5548cb50SEnrico Granata     if (format >= eFormatDefault && format < kNumFormats)
162*5548cb50SEnrico Granata         return g_format_infos[format].format_name;
163*5548cb50SEnrico Granata     return NULL;
164*5548cb50SEnrico Granata }
165*5548cb50SEnrico Granata 
166*5548cb50SEnrico Granata lldb::TypeSummaryImplSP
167*5548cb50SEnrico Granata FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
168*5548cb50SEnrico Granata {
169*5548cb50SEnrico Granata     if (!type_sp)
170*5548cb50SEnrico Granata         return lldb::TypeSummaryImplSP();
171*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP summary_chosen_sp;
172*5548cb50SEnrico Granata     uint32_t num_categories = m_categories_map.GetCount();
173*5548cb50SEnrico Granata     lldb::TypeCategoryImplSP category_sp;
174*5548cb50SEnrico Granata     uint32_t prio_category = UINT32_MAX;
175*5548cb50SEnrico Granata     for (uint32_t category_id = 0;
176*5548cb50SEnrico Granata          category_id < num_categories;
177*5548cb50SEnrico Granata          category_id++)
178*5548cb50SEnrico Granata     {
179*5548cb50SEnrico Granata         category_sp = GetCategoryAtIndex(category_id);
180*5548cb50SEnrico Granata         if (category_sp->IsEnabled() == false)
181*5548cb50SEnrico Granata             continue;
182*5548cb50SEnrico Granata         lldb::TypeSummaryImplSP summary_current_sp = category_sp->GetSummaryForType(type_sp);
183*5548cb50SEnrico Granata         if (summary_current_sp && (summary_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
184*5548cb50SEnrico Granata         {
185*5548cb50SEnrico Granata             prio_category = category_sp->GetEnabledPosition();
186*5548cb50SEnrico Granata             summary_chosen_sp = summary_current_sp;
187*5548cb50SEnrico Granata         }
188*5548cb50SEnrico Granata     }
189*5548cb50SEnrico Granata     return summary_chosen_sp;
190*5548cb50SEnrico Granata }
191*5548cb50SEnrico Granata 
192*5548cb50SEnrico Granata lldb::TypeFilterImplSP
193*5548cb50SEnrico Granata FormatManager::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
194*5548cb50SEnrico Granata {
195*5548cb50SEnrico Granata     if (!type_sp)
196*5548cb50SEnrico Granata         return lldb::TypeFilterImplSP();
197*5548cb50SEnrico Granata     lldb::TypeFilterImplSP filter_chosen_sp;
198*5548cb50SEnrico Granata     uint32_t num_categories = m_categories_map.GetCount();
199*5548cb50SEnrico Granata     lldb::TypeCategoryImplSP category_sp;
200*5548cb50SEnrico Granata     uint32_t prio_category = UINT32_MAX;
201*5548cb50SEnrico Granata     for (uint32_t category_id = 0;
202*5548cb50SEnrico Granata          category_id < num_categories;
203*5548cb50SEnrico Granata          category_id++)
204*5548cb50SEnrico Granata     {
205*5548cb50SEnrico Granata         category_sp = GetCategoryAtIndex(category_id);
206*5548cb50SEnrico Granata         if (category_sp->IsEnabled() == false)
207*5548cb50SEnrico Granata             continue;
208*5548cb50SEnrico Granata         lldb::TypeFilterImplSP filter_current_sp((TypeFilterImpl*)category_sp->GetFilterForType(type_sp).get());
209*5548cb50SEnrico Granata         if (filter_current_sp && (filter_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
210*5548cb50SEnrico Granata         {
211*5548cb50SEnrico Granata             prio_category = category_sp->GetEnabledPosition();
212*5548cb50SEnrico Granata             filter_chosen_sp = filter_current_sp;
213*5548cb50SEnrico Granata         }
214*5548cb50SEnrico Granata     }
215*5548cb50SEnrico Granata     return filter_chosen_sp;
216*5548cb50SEnrico Granata }
217*5548cb50SEnrico Granata 
218*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
219*5548cb50SEnrico Granata lldb::ScriptedSyntheticChildrenSP
220*5548cb50SEnrico Granata FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
221*5548cb50SEnrico Granata {
222*5548cb50SEnrico Granata     if (!type_sp)
223*5548cb50SEnrico Granata         return lldb::ScriptedSyntheticChildrenSP();
224*5548cb50SEnrico Granata     lldb::ScriptedSyntheticChildrenSP synth_chosen_sp;
225*5548cb50SEnrico Granata     uint32_t num_categories = m_categories_map.GetCount();
226*5548cb50SEnrico Granata     lldb::TypeCategoryImplSP category_sp;
227*5548cb50SEnrico Granata     uint32_t prio_category = UINT32_MAX;
228*5548cb50SEnrico Granata     for (uint32_t category_id = 0;
229*5548cb50SEnrico Granata          category_id < num_categories;
230*5548cb50SEnrico Granata          category_id++)
231*5548cb50SEnrico Granata     {
232*5548cb50SEnrico Granata         category_sp = GetCategoryAtIndex(category_id);
233*5548cb50SEnrico Granata         if (category_sp->IsEnabled() == false)
234*5548cb50SEnrico Granata             continue;
235*5548cb50SEnrico Granata         lldb::ScriptedSyntheticChildrenSP synth_current_sp((ScriptedSyntheticChildren*)category_sp->GetSyntheticForType(type_sp).get());
236*5548cb50SEnrico Granata         if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
237*5548cb50SEnrico Granata         {
238*5548cb50SEnrico Granata             prio_category = category_sp->GetEnabledPosition();
239*5548cb50SEnrico Granata             synth_chosen_sp = synth_current_sp;
240*5548cb50SEnrico Granata         }
241*5548cb50SEnrico Granata     }
242*5548cb50SEnrico Granata     return synth_chosen_sp;
243*5548cb50SEnrico Granata }
244*5548cb50SEnrico Granata #endif
245*5548cb50SEnrico Granata 
246*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
247*5548cb50SEnrico Granata lldb::SyntheticChildrenSP
248*5548cb50SEnrico Granata FormatManager::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp)
249*5548cb50SEnrico Granata {
250*5548cb50SEnrico Granata     if (!type_sp)
251*5548cb50SEnrico Granata         return lldb::SyntheticChildrenSP();
252*5548cb50SEnrico Granata     lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp);
253*5548cb50SEnrico Granata     lldb::ScriptedSyntheticChildrenSP synth_sp = GetSyntheticForType(type_sp);
254*5548cb50SEnrico Granata     if (filter_sp->GetRevision() > synth_sp->GetRevision())
255*5548cb50SEnrico Granata         return lldb::SyntheticChildrenSP(filter_sp.get());
256*5548cb50SEnrico Granata     else
257*5548cb50SEnrico Granata         return lldb::SyntheticChildrenSP(synth_sp.get());
258*5548cb50SEnrico Granata }
259*5548cb50SEnrico Granata #endif
260*5548cb50SEnrico Granata 
261*5548cb50SEnrico Granata lldb::TypeCategoryImplSP
262*5548cb50SEnrico Granata FormatManager::GetCategory (const ConstString& category_name,
263*5548cb50SEnrico Granata                          bool can_create)
264*5548cb50SEnrico Granata {
265*5548cb50SEnrico Granata     if (!category_name)
266*5548cb50SEnrico Granata         return GetCategory(m_default_category_name);
267*5548cb50SEnrico Granata     lldb::TypeCategoryImplSP category;
268*5548cb50SEnrico Granata     if (m_categories_map.Get(category_name, category))
269*5548cb50SEnrico Granata         return category;
270*5548cb50SEnrico Granata 
271*5548cb50SEnrico Granata     if (!can_create)
272*5548cb50SEnrico Granata         return lldb::TypeCategoryImplSP();
273*5548cb50SEnrico Granata 
274*5548cb50SEnrico Granata     m_categories_map.Add(category_name,lldb::TypeCategoryImplSP(new TypeCategoryImpl(this, category_name)));
275*5548cb50SEnrico Granata     return GetCategory(category_name);
276*5548cb50SEnrico Granata }
277*5548cb50SEnrico Granata 
278*5548cb50SEnrico Granata lldb::Format
279*5548cb50SEnrico Granata FormatManager::GetSingleItemFormat(lldb::Format vector_format)
280*5548cb50SEnrico Granata {
281*5548cb50SEnrico Granata     switch(vector_format)
282*5548cb50SEnrico Granata     {
283*5548cb50SEnrico Granata         case eFormatVectorOfChar:
284*5548cb50SEnrico Granata             return eFormatCharArray;
285*5548cb50SEnrico Granata 
286*5548cb50SEnrico Granata         case eFormatVectorOfSInt8:
287*5548cb50SEnrico Granata         case eFormatVectorOfSInt16:
288*5548cb50SEnrico Granata         case eFormatVectorOfSInt32:
289*5548cb50SEnrico Granata         case eFormatVectorOfSInt64:
290*5548cb50SEnrico Granata             return eFormatDecimal;
291*5548cb50SEnrico Granata 
292*5548cb50SEnrico Granata         case eFormatVectorOfUInt8:
293*5548cb50SEnrico Granata         case eFormatVectorOfUInt16:
294*5548cb50SEnrico Granata         case eFormatVectorOfUInt32:
295*5548cb50SEnrico Granata         case eFormatVectorOfUInt64:
296*5548cb50SEnrico Granata         case eFormatVectorOfUInt128:
297*5548cb50SEnrico Granata             return eFormatHex;
298*5548cb50SEnrico Granata 
299*5548cb50SEnrico Granata         case eFormatVectorOfFloat32:
300*5548cb50SEnrico Granata         case eFormatVectorOfFloat64:
301*5548cb50SEnrico Granata             return eFormatFloat;
302*5548cb50SEnrico Granata 
303*5548cb50SEnrico Granata         default:
304*5548cb50SEnrico Granata             return lldb::eFormatInvalid;
305*5548cb50SEnrico Granata     }
306*5548cb50SEnrico Granata }
307*5548cb50SEnrico Granata 
308*5548cb50SEnrico Granata ConstString
309*5548cb50SEnrico Granata FormatManager::GetValidTypeName (const ConstString& type)
310*5548cb50SEnrico Granata {
311*5548cb50SEnrico Granata     return ::GetValidTypeName_Impl(type);
312*5548cb50SEnrico Granata }
313*5548cb50SEnrico Granata 
314*5548cb50SEnrico Granata ConstString
315*5548cb50SEnrico Granata GetTypeForCache (ValueObject& valobj,
316*5548cb50SEnrico Granata                  lldb::DynamicValueType use_dynamic)
317*5548cb50SEnrico Granata {
318*5548cb50SEnrico Granata     if (use_dynamic == lldb::eNoDynamicValues)
319*5548cb50SEnrico Granata     {
320*5548cb50SEnrico Granata         if (valobj.IsDynamic())
321*5548cb50SEnrico Granata         {
322*5548cb50SEnrico Granata             if (valobj.GetStaticValue())
323*5548cb50SEnrico Granata                 return valobj.GetStaticValue()->GetQualifiedTypeName();
324*5548cb50SEnrico Granata             else
325*5548cb50SEnrico Granata                 return ConstString();
326*5548cb50SEnrico Granata         }
327*5548cb50SEnrico Granata         else
328*5548cb50SEnrico Granata             return valobj.GetQualifiedTypeName();
329*5548cb50SEnrico Granata     }
330*5548cb50SEnrico Granata     if (valobj.IsDynamic())
331*5548cb50SEnrico Granata         return valobj.GetQualifiedTypeName();
332*5548cb50SEnrico Granata     if (valobj.GetDynamicValue(use_dynamic))
333*5548cb50SEnrico Granata         return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName();
334*5548cb50SEnrico Granata     return ConstString();
335*5548cb50SEnrico Granata }
336*5548cb50SEnrico Granata 
337*5548cb50SEnrico Granata #define USE_CACHE 1
338*5548cb50SEnrico Granata lldb::TypeSummaryImplSP
339*5548cb50SEnrico Granata FormatManager::GetSummaryFormat (ValueObject& valobj,
340*5548cb50SEnrico Granata                                  lldb::DynamicValueType use_dynamic)
341*5548cb50SEnrico Granata {
342*5548cb50SEnrico Granata     TypeSummaryImplSP retval;
343*5548cb50SEnrico Granata #if USE_CACHE
344*5548cb50SEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
345*5548cb50SEnrico Granata     ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
346*5548cb50SEnrico Granata     if (valobj_type)
347*5548cb50SEnrico Granata     {
348*5548cb50SEnrico Granata         if (log)
349*5548cb50SEnrico Granata             log->Printf("[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
350*5548cb50SEnrico Granata         if (m_format_cache.GetSummary(valobj_type,retval))
351*5548cb50SEnrico Granata             return retval;
352*5548cb50SEnrico Granata         if (log)
353*5548cb50SEnrico Granata             log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route");
354*5548cb50SEnrico Granata     }
355*5548cb50SEnrico Granata #endif
356*5548cb50SEnrico Granata     retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic);
357*5548cb50SEnrico Granata #if USE_CACHE
358*5548cb50SEnrico Granata     if (valobj_type)
359*5548cb50SEnrico Granata     {
360*5548cb50SEnrico Granata         if (log)
361*5548cb50SEnrico Granata             log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s",retval.get(),valobj_type.AsCString("<invalid>"));
362*5548cb50SEnrico Granata         m_format_cache.SetSummary(valobj_type,retval);
363*5548cb50SEnrico Granata     }
364*5548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
365*5548cb50SEnrico Granata     if (log)
366*5548cb50SEnrico Granata         log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %llu - Cache Misses: %llu", m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
367*5548cb50SEnrico Granata #endif
368*5548cb50SEnrico Granata #endif
369*5548cb50SEnrico Granata     return retval;
370*5548cb50SEnrico Granata }
371*5548cb50SEnrico Granata 
372*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
373*5548cb50SEnrico Granata lldb::SyntheticChildrenSP
374*5548cb50SEnrico Granata FormatManager::GetSyntheticChildren (ValueObject& valobj,
375*5548cb50SEnrico Granata                       lldb::DynamicValueType use_dynamic)
376*5548cb50SEnrico Granata {
377*5548cb50SEnrico Granata     SyntheticChildrenSP retval;
378*5548cb50SEnrico Granata #if USE_CACHE
379*5548cb50SEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
380*5548cb50SEnrico Granata     ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
381*5548cb50SEnrico Granata     if (valobj_type)
382*5548cb50SEnrico Granata     {
383*5548cb50SEnrico Granata         if (log)
384*5548cb50SEnrico Granata             log->Printf("[FormatManager::GetSyntheticChildren] Looking into cache for type %s\n", valobj_type.AsCString("<invalid>"));
385*5548cb50SEnrico Granata         if (m_format_cache.GetSynthetic(valobj_type,retval))
386*5548cb50SEnrico Granata             return retval;
387*5548cb50SEnrico Granata         if (log)
388*5548cb50SEnrico Granata             log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route\n");
389*5548cb50SEnrico Granata     }
390*5548cb50SEnrico Granata #endif
391*5548cb50SEnrico Granata     retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic);
392*5548cb50SEnrico Granata #if USE_CACHE
393*5548cb50SEnrico Granata     if (valobj_type)
394*5548cb50SEnrico Granata     {
395*5548cb50SEnrico Granata         if (log)
396*5548cb50SEnrico Granata             log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s\n",retval.get(),valobj_type.AsCString("<invalid>"));
397*5548cb50SEnrico Granata         m_format_cache.SetSynthetic(valobj_type,retval);
398*5548cb50SEnrico Granata     }
399*5548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
400*5548cb50SEnrico Granata     if (log)
401*5548cb50SEnrico Granata         log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %llu - Cache Misses: %llu", m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
402*5548cb50SEnrico Granata #endif
403*5548cb50SEnrico Granata #endif
404*5548cb50SEnrico Granata     return retval;
405*5548cb50SEnrico Granata }
406*5548cb50SEnrico Granata #endif
407*5548cb50SEnrico Granata #undef USE_CACHE
408*5548cb50SEnrico Granata 
409*5548cb50SEnrico Granata FormatManager::FormatManager() :
410*5548cb50SEnrico Granata     m_format_cache(),
411*5548cb50SEnrico Granata     m_value_nav("format",this),
412*5548cb50SEnrico Granata     m_named_summaries_map(this),
413*5548cb50SEnrico Granata     m_last_revision(0),
414*5548cb50SEnrico Granata     m_categories_map(this),
415*5548cb50SEnrico Granata     m_default_category_name(ConstString("default")),
416*5548cb50SEnrico Granata     m_system_category_name(ConstString("system")),
417*5548cb50SEnrico Granata     m_gnu_cpp_category_name(ConstString("gnu-libstdc++")),
418*5548cb50SEnrico Granata     m_libcxx_category_name(ConstString("libcxx")),
419*5548cb50SEnrico Granata     m_objc_category_name(ConstString("objc")),
420*5548cb50SEnrico Granata     m_corefoundation_category_name(ConstString("CoreFoundation")),
421*5548cb50SEnrico Granata     m_coregraphics_category_name(ConstString("CoreGraphics")),
422*5548cb50SEnrico Granata     m_coreservices_category_name(ConstString("CoreServices")),
423*5548cb50SEnrico Granata     m_vectortypes_category_name(ConstString("VectorTypes")),
424*5548cb50SEnrico Granata     m_appkit_category_name(ConstString("AppKit"))
425*5548cb50SEnrico Granata {
426*5548cb50SEnrico Granata     LoadSystemFormatters();
427*5548cb50SEnrico Granata     LoadLibStdcppFormatters();
428*5548cb50SEnrico Granata     LoadLibcxxFormatters();
429*5548cb50SEnrico Granata     LoadObjCFormatters();
430*5548cb50SEnrico Granata 
431*5548cb50SEnrico Granata     EnableCategory(m_objc_category_name,TypeCategoryMap::Last);
432*5548cb50SEnrico Granata     EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last);
433*5548cb50SEnrico Granata     EnableCategory(m_appkit_category_name,TypeCategoryMap::Last);
434*5548cb50SEnrico Granata     EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last);
435*5548cb50SEnrico Granata     EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last);
436*5548cb50SEnrico Granata     EnableCategory(m_gnu_cpp_category_name,TypeCategoryMap::Last);
437*5548cb50SEnrico Granata     EnableCategory(m_libcxx_category_name,TypeCategoryMap::Last);
438*5548cb50SEnrico Granata     EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last);
439*5548cb50SEnrico Granata     EnableCategory(m_system_category_name,TypeCategoryMap::Last);
440*5548cb50SEnrico Granata }
441*5548cb50SEnrico Granata 
442*5548cb50SEnrico Granata static void
443*5548cb50SEnrico Granata AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,
444*5548cb50SEnrico Granata                  const char* string,
445*5548cb50SEnrico Granata                  ConstString type_name,
446*5548cb50SEnrico Granata                  TypeSummaryImpl::Flags flags)
447*5548cb50SEnrico Granata {
448*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags,
449*5548cb50SEnrico Granata                                                                string));
450*5548cb50SEnrico Granata     category_sp->GetSummaryNavigator()->Add(type_name,
451*5548cb50SEnrico Granata                                             summary_sp);
452*5548cb50SEnrico Granata }
453*5548cb50SEnrico Granata 
454*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
455*5548cb50SEnrico Granata static void
456*5548cb50SEnrico Granata AddScriptSummary(TypeCategoryImpl::SharedPointer category_sp,
457*5548cb50SEnrico Granata                  const char* funct_name,
458*5548cb50SEnrico Granata                  ConstString type_name,
459*5548cb50SEnrico Granata                  TypeSummaryImpl::Flags flags)
460*5548cb50SEnrico Granata {
461*5548cb50SEnrico Granata 
462*5548cb50SEnrico Granata     std::string code("     ");
463*5548cb50SEnrico Granata     code.append(funct_name).append("(valobj,internal_dict)");
464*5548cb50SEnrico Granata 
465*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP summary_sp(new ScriptSummaryFormat(flags,
466*5548cb50SEnrico Granata                                                                funct_name,
467*5548cb50SEnrico Granata                                                                code.c_str()));
468*5548cb50SEnrico Granata     category_sp->GetSummaryNavigator()->Add(type_name,
469*5548cb50SEnrico Granata                                             summary_sp);
470*5548cb50SEnrico Granata }
471*5548cb50SEnrico Granata #endif
472*5548cb50SEnrico Granata 
473*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
474*5548cb50SEnrico Granata static void
475*5548cb50SEnrico Granata AddCXXSummary (TypeCategoryImpl::SharedPointer category_sp,
476*5548cb50SEnrico Granata                CXXFunctionSummaryFormat::Callback funct,
477*5548cb50SEnrico Granata                const char* description,
478*5548cb50SEnrico Granata                ConstString type_name,
479*5548cb50SEnrico Granata                TypeSummaryImpl::Flags flags)
480*5548cb50SEnrico Granata {
481*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP summary_sp(new CXXFunctionSummaryFormat(flags,funct,description));
482*5548cb50SEnrico Granata     category_sp->GetSummaryNavigator()->Add(type_name,
483*5548cb50SEnrico Granata                                             summary_sp);
484*5548cb50SEnrico Granata }
485*5548cb50SEnrico Granata #endif
486*5548cb50SEnrico Granata 
487*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
488*5548cb50SEnrico Granata static void AddCXXSynthetic  (TypeCategoryImpl::SharedPointer category_sp,
489*5548cb50SEnrico Granata                               CXXSyntheticChildren::CreateFrontEndCallback generator,
490*5548cb50SEnrico Granata                               const char* description,
491*5548cb50SEnrico Granata                               ConstString type_name,
492*5548cb50SEnrico Granata                               ScriptedSyntheticChildren::Flags flags)
493*5548cb50SEnrico Granata {
494*5548cb50SEnrico Granata     lldb::SyntheticChildrenSP synth_sp(new CXXSyntheticChildren(flags,description,generator));
495*5548cb50SEnrico Granata     category_sp->GetSyntheticNavigator()->Add(type_name,synth_sp);
496*5548cb50SEnrico Granata }
497*5548cb50SEnrico Granata #endif
498*5548cb50SEnrico Granata 
499*5548cb50SEnrico Granata void
500*5548cb50SEnrico Granata FormatManager::LoadLibStdcppFormatters()
501*5548cb50SEnrico Granata {
502*5548cb50SEnrico Granata     TypeSummaryImpl::Flags stl_summary_flags;
503*5548cb50SEnrico Granata     stl_summary_flags.SetCascades(true)
504*5548cb50SEnrico Granata     .SetSkipPointers(false)
505*5548cb50SEnrico Granata     .SetSkipReferences(false)
506*5548cb50SEnrico Granata     .SetDontShowChildren(true)
507*5548cb50SEnrico Granata     .SetDontShowValue(true)
508*5548cb50SEnrico Granata     .SetShowMembersOneLiner(false)
509*5548cb50SEnrico Granata     .SetHideItemNames(false);
510*5548cb50SEnrico Granata 
511*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(stl_summary_flags,
512*5548cb50SEnrico Granata                                                                           "${var._M_dataplus._M_p}"));
513*5548cb50SEnrico Granata 
514*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer gnu_category_sp = GetCategory(m_gnu_cpp_category_name);
515*5548cb50SEnrico Granata 
516*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::string"),
517*5548cb50SEnrico Granata                                                 std_string_summary_sp);
518*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char>"),
519*5548cb50SEnrico Granata                                                 std_string_summary_sp);
520*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"),
521*5548cb50SEnrico Granata                                                 std_string_summary_sp);
522*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
523*5548cb50SEnrico Granata                                                 std_string_summary_sp);
524*5548cb50SEnrico Granata 
525*5548cb50SEnrico Granata     // making sure we force-pick the summary for printing wstring (_M_p is a wchar_t*)
526*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP std_wstring_summary_sp(new StringSummaryFormat(stl_summary_flags,
527*5548cb50SEnrico Granata                                                                            "${var._M_dataplus._M_p%S}"));
528*5548cb50SEnrico Granata 
529*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::wstring"),
530*5548cb50SEnrico Granata                                                 std_wstring_summary_sp);
531*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<wchar_t>"),
532*5548cb50SEnrico Granata                                                 std_wstring_summary_sp);
533*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"),
534*5548cb50SEnrico Granata                                                 std_wstring_summary_sp);
535*5548cb50SEnrico Granata     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"),
536*5548cb50SEnrico Granata                                                 std_wstring_summary_sp);
537*5548cb50SEnrico Granata 
538*5548cb50SEnrico Granata 
539*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
540*5548cb50SEnrico Granata 
541*5548cb50SEnrico Granata     SyntheticChildren::Flags stl_synth_flags;
542*5548cb50SEnrico Granata     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
543*5548cb50SEnrico Granata 
544*5548cb50SEnrico Granata     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
545*5548cb50SEnrico Granata                                                        SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
546*5548cb50SEnrico Granata                                                                                                  "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
547*5548cb50SEnrico Granata     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
548*5548cb50SEnrico Granata                                                        SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
549*5548cb50SEnrico Granata                                                                                                  "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider")));
550*5548cb50SEnrico Granata     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")),
551*5548cb50SEnrico Granata                                                        SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
552*5548cb50SEnrico Granata                                                                                                  "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
553*5548cb50SEnrico Granata 
554*5548cb50SEnrico Granata     stl_summary_flags.SetDontShowChildren(false);
555*5548cb50SEnrico Granata     gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
556*5548cb50SEnrico Granata                                                      TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
557*5548cb50SEnrico Granata                                                                                                "size=${svar%#}")));
558*5548cb50SEnrico Granata     gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
559*5548cb50SEnrico Granata                                                      TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
560*5548cb50SEnrico Granata                                                                                                "size=${svar%#}")));
561*5548cb50SEnrico Granata     gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")),
562*5548cb50SEnrico Granata                                                      TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
563*5548cb50SEnrico Granata                                                                                                "size=${svar%#}")));
564*5548cb50SEnrico Granata #endif
565*5548cb50SEnrico Granata }
566*5548cb50SEnrico Granata 
567*5548cb50SEnrico Granata void
568*5548cb50SEnrico Granata FormatManager::LoadLibcxxFormatters()
569*5548cb50SEnrico Granata {
570*5548cb50SEnrico Granata     TypeSummaryImpl::Flags stl_summary_flags;
571*5548cb50SEnrico Granata     stl_summary_flags.SetCascades(true)
572*5548cb50SEnrico Granata     .SetSkipPointers(false)
573*5548cb50SEnrico Granata     .SetSkipReferences(false)
574*5548cb50SEnrico Granata     .SetDontShowChildren(true)
575*5548cb50SEnrico Granata     .SetDontShowValue(true)
576*5548cb50SEnrico Granata     .SetShowMembersOneLiner(false)
577*5548cb50SEnrico Granata     .SetHideItemNames(false);
578*5548cb50SEnrico Granata 
579*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
580*5548cb50SEnrico Granata     //std::string code("     lldb.formatters.cpp.libcxx.stdstring_SummaryProvider(valobj,internal_dict)");
581*5548cb50SEnrico Granata     //lldb::TypeSummaryImplSP std_string_summary_sp(new ScriptSummaryFormat(stl_summary_flags, "lldb.formatters.cpp.libcxx.stdstring_SummaryProvider",code.c_str()));
582*5548cb50SEnrico Granata 
583*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, "std::string summary provider"));
584*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider"));
585*5548cb50SEnrico Granata 
586*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer libcxx_category_sp = GetCategory(m_libcxx_category_name);
587*5548cb50SEnrico Granata 
588*5548cb50SEnrico Granata     libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::string"),
589*5548cb50SEnrico Granata                                                    std_string_summary_sp);
590*5548cb50SEnrico Granata     libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >"),
591*5548cb50SEnrico Granata                                                    std_string_summary_sp);
592*5548cb50SEnrico Granata 
593*5548cb50SEnrico Granata     libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::wstring"),
594*5548cb50SEnrico Granata                                                    std_wstring_summary_sp);
595*5548cb50SEnrico Granata     libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >"),
596*5548cb50SEnrico Granata                                                    std_wstring_summary_sp);
597*5548cb50SEnrico Granata 
598*5548cb50SEnrico Granata     SyntheticChildren::Flags stl_synth_flags;
599*5548cb50SEnrico Granata     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
600*5548cb50SEnrico Granata 
601*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::vector<.+>(( )?&)?$")),
602*5548cb50SEnrico Granata                                                        SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
603*5548cb50SEnrico Granata                                                                                                  "lldb.formatters.cpp.libcxx.stdvector_SynthProvider")));
604*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::list<.+>(( )?&)?$")),
605*5548cb50SEnrico Granata                                                        SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
606*5548cb50SEnrico Granata                                                                                                  "lldb.formatters.cpp.libcxx.stdlist_SynthProvider")));
607*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::map<.+> >(( )?&)?$")),
608*5548cb50SEnrico Granata                                                        SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
609*5548cb50SEnrico Granata                                                                                                  "lldb.formatters.cpp.libcxx.stdmap_SynthProvider")));
610*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)deque<.+>(( )?&)?$")),
611*5548cb50SEnrico Granata                                                           SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
612*5548cb50SEnrico Granata                                                                                                     "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
613*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)shared_ptr<.+>(( )?&)?$")),
614*5548cb50SEnrico Granata                                                           SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
615*5548cb50SEnrico Granata                                                                                                     "lldb.formatters.cpp.libcxx.stdsharedptr_SynthProvider")));
616*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)weak_ptr<.+>(( )?&)?$")),
617*5548cb50SEnrico Granata                                                           SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
618*5548cb50SEnrico Granata                                                                                                     "lldb.formatters.cpp.libcxx.stdsharedptr_SynthProvider")));
619*5548cb50SEnrico Granata 
620*5548cb50SEnrico Granata     stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true);
621*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::vector<.+>(( )?&)?$")),
622*5548cb50SEnrico Granata                                                         TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
623*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::list<.+>(( )?&)?$")),
624*5548cb50SEnrico Granata                                                         TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
625*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::map<.+> >(( )?&)?$")),
626*5548cb50SEnrico Granata                                                         TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
627*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::deque<.+>(( )?&)?$")),
628*5548cb50SEnrico Granata                                                         TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
629*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::shared_ptr<.+>(( )?&)?$")),
630*5548cb50SEnrico Granata                                                         TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "{${var.__ptr_%S}} (strong=${var.count} weak=${var.weak_count})")));
631*5548cb50SEnrico Granata     libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::weak_ptr<.+>(( )?&)?$")),
632*5548cb50SEnrico Granata                                                         TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "{${var.__ptr_%S}} (strong=${var.count} weak=${var.weak_count})")));
633*5548cb50SEnrico Granata 
634*5548cb50SEnrico Granata     // this summary prevails on the regex std::vector<> because we do exact matches before regex ones
635*5548cb50SEnrico Granata     libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::vector<std::__1::allocator<bool> >"),
636*5548cb50SEnrico Granata                                                    TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${var.__size_}")));
637*5548cb50SEnrico Granata 
638*5548cb50SEnrico Granata #endif
639*5548cb50SEnrico Granata }
640*5548cb50SEnrico Granata 
641*5548cb50SEnrico Granata void
642*5548cb50SEnrico Granata FormatManager::LoadSystemFormatters()
643*5548cb50SEnrico Granata {
644*5548cb50SEnrico Granata 
645*5548cb50SEnrico Granata     TypeSummaryImpl::Flags string_flags;
646*5548cb50SEnrico Granata     string_flags.SetCascades(false)
647*5548cb50SEnrico Granata     .SetSkipPointers(true)
648*5548cb50SEnrico Granata     .SetSkipReferences(false)
649*5548cb50SEnrico Granata     .SetDontShowChildren(true)
650*5548cb50SEnrico Granata     .SetDontShowValue(false)
651*5548cb50SEnrico Granata     .SetShowMembersOneLiner(false)
652*5548cb50SEnrico Granata     .SetHideItemNames(false);
653*5548cb50SEnrico Granata 
654*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(string_flags, "${var%s}"));
655*5548cb50SEnrico Granata 
656*5548cb50SEnrico Granata 
657*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
658*5548cb50SEnrico Granata                                                                         .SetSkipPointers(true)
659*5548cb50SEnrico Granata                                                                         .SetSkipReferences(false)
660*5548cb50SEnrico Granata                                                                         .SetDontShowChildren(false)
661*5548cb50SEnrico Granata                                                                         .SetDontShowValue(true)
662*5548cb50SEnrico Granata                                                                         .SetShowMembersOneLiner(false)
663*5548cb50SEnrico Granata                                                                         .SetHideItemNames(false),
664*5548cb50SEnrico Granata                                                                         "${var%s}"));
665*5548cb50SEnrico Granata 
666*5548cb50SEnrico Granata     lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
667*5548cb50SEnrico Granata 
668*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
669*5548cb50SEnrico Granata 
670*5548cb50SEnrico Granata     sys_category_sp->GetSummaryNavigator()->Add(ConstString("char *"), string_format);
671*5548cb50SEnrico Granata     sys_category_sp->GetSummaryNavigator()->Add(ConstString("const char *"), string_format);
672*5548cb50SEnrico Granata     sys_category_sp->GetRegexSummaryNavigator()->Add(any_size_char_arr, string_array_format);
673*5548cb50SEnrico Granata 
674*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP ostype_summary(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
675*5548cb50SEnrico Granata                                                                    .SetSkipPointers(true)
676*5548cb50SEnrico Granata                                                                    .SetSkipReferences(true)
677*5548cb50SEnrico Granata                                                                    .SetDontShowChildren(true)
678*5548cb50SEnrico Granata                                                                    .SetDontShowValue(false)
679*5548cb50SEnrico Granata                                                                    .SetShowMembersOneLiner(false)
680*5548cb50SEnrico Granata                                                                    .SetHideItemNames(false),
681*5548cb50SEnrico Granata                                                                    "${var%O}"));
682*5548cb50SEnrico Granata 
683*5548cb50SEnrico Granata     sys_category_sp->GetSummaryNavigator()->Add(ConstString("OSType"), ostype_summary);
684*5548cb50SEnrico Granata 
685*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
686*5548cb50SEnrico Granata     // FIXME because of a bug in the FormatNavigator we need to add a summary for both X* and const X* (<rdar://problem/12717717>)
687*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("char16_t *"), string_flags);
688*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("const char16_t *"), string_flags);
689*5548cb50SEnrico Granata 
690*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("char32_t *"), string_flags);
691*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("const char32_t *"), string_flags);
692*5548cb50SEnrico Granata 
693*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags);
694*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("const wchar_t *"), string_flags);
695*5548cb50SEnrico Granata 
696*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags);
697*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("const unichar *"), string_flags);
698*5548cb50SEnrico Granata 
699*5548cb50SEnrico Granata     TypeSummaryImpl::Flags widechar_flags;
700*5548cb50SEnrico Granata     widechar_flags.SetDontShowValue(true)
701*5548cb50SEnrico Granata     .SetSkipPointers(true)
702*5548cb50SEnrico Granata     .SetSkipReferences(false)
703*5548cb50SEnrico Granata     .SetCascades(true)
704*5548cb50SEnrico Granata     .SetDontShowChildren(true)
705*5548cb50SEnrico Granata     .SetHideItemNames(true)
706*5548cb50SEnrico Granata     .SetShowMembersOneLiner(false);
707*5548cb50SEnrico Granata 
708*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags);
709*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags);
710*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags);
711*5548cb50SEnrico Granata 
712*5548cb50SEnrico Granata     AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags);
713*5548cb50SEnrico Granata 
714*5548cb50SEnrico Granata #endif
715*5548cb50SEnrico Granata }
716*5548cb50SEnrico Granata 
717*5548cb50SEnrico Granata void
718*5548cb50SEnrico Granata FormatManager::LoadObjCFormatters()
719*5548cb50SEnrico Granata {
720*5548cb50SEnrico Granata     TypeSummaryImpl::Flags objc_flags;
721*5548cb50SEnrico Granata     objc_flags.SetCascades(false)
722*5548cb50SEnrico Granata     .SetSkipPointers(true)
723*5548cb50SEnrico Granata     .SetSkipReferences(true)
724*5548cb50SEnrico Granata     .SetDontShowChildren(true)
725*5548cb50SEnrico Granata     .SetDontShowValue(true)
726*5548cb50SEnrico Granata     .SetShowMembersOneLiner(false)
727*5548cb50SEnrico Granata     .SetHideItemNames(false);
728*5548cb50SEnrico Granata 
729*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
730*5548cb50SEnrico Granata 
731*5548cb50SEnrico Granata     lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,""));
732*5548cb50SEnrico Granata     objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL"),
733*5548cb50SEnrico Granata                                                  ObjC_BOOL_summary);
734*5548cb50SEnrico Granata     objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL &"),
735*5548cb50SEnrico Granata                                                  ObjC_BOOL_summary);
736*5548cb50SEnrico Granata     objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL *"),
737*5548cb50SEnrico Granata                                                  ObjC_BOOL_summary);
738*5548cb50SEnrico Granata 
739*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
740*5548cb50SEnrico Granata     // we need to skip pointers here since we are special casing a SEL* when retrieving its value
741*5548cb50SEnrico Granata     objc_flags.SetSkipPointers(true);
742*5548cb50SEnrico Granata     AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags);
743*5548cb50SEnrico Granata     AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
744*5548cb50SEnrico Granata     AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags);
745*5548cb50SEnrico Granata     AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags);
746*5548cb50SEnrico Granata 
747*5548cb50SEnrico Granata     AddScriptSummary(objc_category_sp, "lldb.formatters.objc.Class.Class_Summary", ConstString("Class"), objc_flags);
748*5548cb50SEnrico Granata #endif // LLDB_DISABLE_PYTHON
749*5548cb50SEnrico Granata 
750*5548cb50SEnrico Granata     objc_flags.SetSkipPointers(false);
751*5548cb50SEnrico Granata 
752*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name);
753*5548cb50SEnrico Granata 
754*5548cb50SEnrico Granata     AddStringSummary(corefoundation_category_sp,
755*5548cb50SEnrico Granata                      "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
756*5548cb50SEnrico Granata                      ConstString("CFGregorianUnits"),
757*5548cb50SEnrico Granata                      objc_flags);
758*5548cb50SEnrico Granata     AddStringSummary(corefoundation_category_sp,
759*5548cb50SEnrico Granata                      "location=${var.location} length=${var.length}",
760*5548cb50SEnrico Granata                      ConstString("CFRange"),
761*5548cb50SEnrico Granata                      objc_flags);
762*5548cb50SEnrico Granata     AddStringSummary(corefoundation_category_sp,
763*5548cb50SEnrico Granata                      "(x=${var.x}, y=${var.y})",
764*5548cb50SEnrico Granata                      ConstString("NSPoint"),
765*5548cb50SEnrico Granata                      objc_flags);
766*5548cb50SEnrico Granata     AddStringSummary(corefoundation_category_sp,
767*5548cb50SEnrico Granata                      "location=${var.location}, length=${var.length}",
768*5548cb50SEnrico Granata                      ConstString("NSRange"),
769*5548cb50SEnrico Granata                      objc_flags);
770*5548cb50SEnrico Granata     AddStringSummary(corefoundation_category_sp,
771*5548cb50SEnrico Granata                      "${var.origin}, ${var.size}",
772*5548cb50SEnrico Granata                      ConstString("NSRect"),
773*5548cb50SEnrico Granata                      objc_flags);
774*5548cb50SEnrico Granata     AddStringSummary(corefoundation_category_sp,
775*5548cb50SEnrico Granata                      "(${var.origin}, ${var.size}), ...",
776*5548cb50SEnrico Granata                      ConstString("NSRectArray"),
777*5548cb50SEnrico Granata                      objc_flags);
778*5548cb50SEnrico Granata     AddStringSummary(objc_category_sp,
779*5548cb50SEnrico Granata                      "(width=${var.width}, height=${var.height})",
780*5548cb50SEnrico Granata                      ConstString("NSSize"),
781*5548cb50SEnrico Granata                      objc_flags);
782*5548cb50SEnrico Granata 
783*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name);
784*5548cb50SEnrico Granata 
785*5548cb50SEnrico Granata     AddStringSummary(coregraphics_category_sp,
786*5548cb50SEnrico Granata                      "(width=${var.width}, height=${var.height})",
787*5548cb50SEnrico Granata                      ConstString("CGSize"),
788*5548cb50SEnrico Granata                      objc_flags);
789*5548cb50SEnrico Granata     AddStringSummary(coregraphics_category_sp,
790*5548cb50SEnrico Granata                      "(x=${var.x}, y=${var.y})",
791*5548cb50SEnrico Granata                      ConstString("CGPoint"),
792*5548cb50SEnrico Granata                      objc_flags);
793*5548cb50SEnrico Granata     AddStringSummary(coregraphics_category_sp,
794*5548cb50SEnrico Granata                      "origin=${var.origin} size=${var.size}",
795*5548cb50SEnrico Granata                      ConstString("CGRect"),
796*5548cb50SEnrico Granata                      objc_flags);
797*5548cb50SEnrico Granata 
798*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name);
799*5548cb50SEnrico Granata 
800*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
801*5548cb50SEnrico Granata                      "red=${var.red} green=${var.green} blue=${var.blue}",
802*5548cb50SEnrico Granata                      ConstString("RGBColor"),
803*5548cb50SEnrico Granata                      objc_flags);
804*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
805*5548cb50SEnrico Granata                      "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
806*5548cb50SEnrico Granata                      ConstString("Rect"),
807*5548cb50SEnrico Granata                      objc_flags);
808*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
809*5548cb50SEnrico Granata                      "(v=${var.v}, h=${var.h})",
810*5548cb50SEnrico Granata                      ConstString("Point"),
811*5548cb50SEnrico Granata                      objc_flags);
812*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
813*5548cb50SEnrico Granata                      "${var.month}/${var.day}/${var.year}  ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
814*5548cb50SEnrico Granata                      ConstString("DateTimeRect *"),
815*5548cb50SEnrico Granata                      objc_flags);
816*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
817*5548cb50SEnrico Granata                      "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
818*5548cb50SEnrico Granata                      ConstString("LongDateRect"),
819*5548cb50SEnrico Granata                      objc_flags);
820*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
821*5548cb50SEnrico Granata                      "(x=${var.x}, y=${var.y})",
822*5548cb50SEnrico Granata                      ConstString("HIPoint"),
823*5548cb50SEnrico Granata                      objc_flags);
824*5548cb50SEnrico Granata     AddStringSummary(coreservices_category_sp,
825*5548cb50SEnrico Granata                      "origin=${var.origin} size=${var.size}",
826*5548cb50SEnrico Granata                      ConstString("HIRect"),
827*5548cb50SEnrico Granata                      objc_flags);
828*5548cb50SEnrico Granata 
829*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name);
830*5548cb50SEnrico Granata 
831*5548cb50SEnrico Granata     TypeSummaryImpl::Flags appkit_flags;
832*5548cb50SEnrico Granata     appkit_flags.SetCascades(true)
833*5548cb50SEnrico Granata     .SetSkipPointers(false)
834*5548cb50SEnrico Granata     .SetSkipReferences(false)
835*5548cb50SEnrico Granata     .SetDontShowChildren(true)
836*5548cb50SEnrico Granata     .SetDontShowValue(false)
837*5548cb50SEnrico Granata     .SetShowMembersOneLiner(false)
838*5548cb50SEnrico Granata     .SetHideItemNames(false);
839*5548cb50SEnrico Granata 
840*5548cb50SEnrico Granata     appkit_flags.SetDontShowChildren(false);
841*5548cb50SEnrico Granata 
842*5548cb50SEnrico Granata 
843*5548cb50SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
844*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags);
845*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
846*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
847*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
848*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
849*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
850*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags);
851*5548cb50SEnrico Granata 
852*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags);
853*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags);
854*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags);
855*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags);
856*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags);
857*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags);
858*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags);
859*5548cb50SEnrico Granata 
860*5548cb50SEnrico Granata     // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags);
861*5548cb50SEnrico Granata 
862*5548cb50SEnrico Granata     appkit_flags.SetDontShowChildren(true);
863*5548cb50SEnrico Granata 
864*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags());
865*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags());
866*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags());
867*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags());
868*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags());
869*5548cb50SEnrico Granata 
870*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags());
871*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags());
872*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags());
873*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags());
874*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags());
875*5548cb50SEnrico Granata     AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags());
876*5548cb50SEnrico Granata 
877*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("CFBagRef"), appkit_flags);
878*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("__CFBag"), appkit_flags);
879*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("const struct __CFBag"), appkit_flags);
880*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("CFMutableBagRef"), appkit_flags);
881*5548cb50SEnrico Granata 
882*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBinaryHeap.CFBinaryHeap_SummaryProvider", ConstString("CFBinaryHeapRef"), appkit_flags);
883*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBinaryHeap.CFBinaryHeap_SummaryProvider", ConstString("__CFBinaryHeap"), appkit_flags);
884*5548cb50SEnrico Granata 
885*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags);
886*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
887*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags);
888*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags);
889*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
890*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags);
891*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags);
892*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
893*5548cb50SEnrico Granata 
894*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFString.CFAttributedString_SummaryProvider", ConstString("NSAttributedString"), appkit_flags);
895*5548cb50SEnrico Granata 
896*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSBundle.NSBundle_SummaryProvider", ConstString("NSBundle"), appkit_flags);
897*5548cb50SEnrico Granata 
898*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags);
899*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
900*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags);
901*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
902*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
903*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
904*5548cb50SEnrico Granata 
905*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSMachPort.NSMachPort_SummaryProvider", ConstString("NSMachPort"), appkit_flags);
906*5548cb50SEnrico Granata 
907*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSNotification.NSNotification_SummaryProvider", ConstString("NSNotification"), appkit_flags);
908*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSNotification.NSNotification_SummaryProvider", ConstString("NSConcreteNotification"), appkit_flags);
909*5548cb50SEnrico Granata 
910*5548cb50SEnrico Granata     AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
911*5548cb50SEnrico Granata     AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
912*5548cb50SEnrico Granata 
913*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
914*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
915*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
916*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
917*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
918*5548cb50SEnrico Granata 
919*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags);
920*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags);
921*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
922*5548cb50SEnrico Granata     AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
923*5548cb50SEnrico Granata 
924*5548cb50SEnrico Granata 
925*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("NSSet"), appkit_flags);
926*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider2", ConstString("CFSetRef"), appkit_flags);
927*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider2", ConstString("CFMutableSetRef"), appkit_flags);
928*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("__NSCFSet"), appkit_flags);
929*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("__NSSetI"), appkit_flags);
930*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("__NSSetM"), appkit_flags);
931*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("NSCountedSet"), appkit_flags);
932*5548cb50SEnrico Granata 
933*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSURL.NSURL_SummaryProvider", ConstString("NSURL"), appkit_flags);
934*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSURL.NSURL_SummaryProvider", ConstString("CFURLRef"), appkit_flags);
935*5548cb50SEnrico Granata 
936*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("NSDate"), appkit_flags);
937*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("__NSDate"), appkit_flags);
938*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("__NSTaggedDate"), appkit_flags);
939*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("NSCalendarDate"), appkit_flags);
940*5548cb50SEnrico Granata 
941*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSTimeZone_SummaryProvider", ConstString("NSTimeZone"), appkit_flags);
942*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSTimeZone_SummaryProvider", ConstString("CFTimeZoneRef"), appkit_flags);
943*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSTimeZone_SummaryProvider", ConstString("__NSTimeZone"), appkit_flags);
944*5548cb50SEnrico Granata 
945*5548cb50SEnrico Granata     // CFAbsoluteTime is actually a double rather than a pointer to an object
946*5548cb50SEnrico Granata     // we do not care about the numeric value, since it is probably meaningless to users
947*5548cb50SEnrico Granata     appkit_flags.SetDontShowValue(true);
948*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.CFAbsoluteTime_SummaryProvider", ConstString("CFAbsoluteTime"), appkit_flags);
949*5548cb50SEnrico Granata     appkit_flags.SetDontShowValue(false);
950*5548cb50SEnrico Granata 
951*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSIndexSet.NSIndexSet_SummaryProvider", ConstString("NSIndexSet"), appkit_flags);
952*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSIndexSet.NSIndexSet_SummaryProvider", ConstString("NSMutableIndexSet"), appkit_flags);
953*5548cb50SEnrico Granata 
954*5548cb50SEnrico Granata     AddStringSummary(appkit_category_sp,
955*5548cb50SEnrico Granata                      "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"",
956*5548cb50SEnrico Granata                      ConstString("CFGregorianDate"),
957*5548cb50SEnrico Granata                      appkit_flags);
958*5548cb50SEnrico Granata 
959*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("CFBitVectorRef"), appkit_flags);
960*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("CFMutableBitVectorRef"), appkit_flags);
961*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("__CFBitVector"), appkit_flags);
962*5548cb50SEnrico Granata     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("__CFMutableBitVector"), appkit_flags);
963*5548cb50SEnrico Granata #endif // LLDB_DISABLE_PYTHON
964*5548cb50SEnrico Granata 
965*5548cb50SEnrico Granata     TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
966*5548cb50SEnrico Granata 
967*5548cb50SEnrico Granata     TypeSummaryImpl::Flags vector_flags;
968*5548cb50SEnrico Granata     vector_flags.SetCascades(true)
969*5548cb50SEnrico Granata     .SetSkipPointers(true)
970*5548cb50SEnrico Granata     .SetSkipReferences(false)
971*5548cb50SEnrico Granata     .SetDontShowChildren(true)
972*5548cb50SEnrico Granata     .SetDontShowValue(false)
973*5548cb50SEnrico Granata     .SetShowMembersOneLiner(true)
974*5548cb50SEnrico Granata     .SetHideItemNames(true);
975*5548cb50SEnrico Granata 
976*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
977*5548cb50SEnrico Granata                      "${var.uint128}",
978*5548cb50SEnrico Granata                      ConstString("builtin_type_vec128"),
979*5548cb50SEnrico Granata                      objc_flags);
980*5548cb50SEnrico Granata 
981*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
982*5548cb50SEnrico Granata                      "",
983*5548cb50SEnrico Granata                      ConstString("float [4]"),
984*5548cb50SEnrico Granata                      vector_flags);
985*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
986*5548cb50SEnrico Granata                      "",
987*5548cb50SEnrico Granata                      ConstString("int32_t [4]"),
988*5548cb50SEnrico Granata                      vector_flags);
989*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
990*5548cb50SEnrico Granata                      "",
991*5548cb50SEnrico Granata                      ConstString("int16_t [8]"),
992*5548cb50SEnrico Granata                      vector_flags);
993*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
994*5548cb50SEnrico Granata                      "",
995*5548cb50SEnrico Granata                      ConstString("vDouble"),
996*5548cb50SEnrico Granata                      vector_flags);
997*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
998*5548cb50SEnrico Granata                      "",
999*5548cb50SEnrico Granata                      ConstString("vFloat"),
1000*5548cb50SEnrico Granata                      vector_flags);
1001*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1002*5548cb50SEnrico Granata                      "",
1003*5548cb50SEnrico Granata                      ConstString("vSInt8"),
1004*5548cb50SEnrico Granata                      vector_flags);
1005*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1006*5548cb50SEnrico Granata                      "",
1007*5548cb50SEnrico Granata                      ConstString("vSInt16"),
1008*5548cb50SEnrico Granata                      vector_flags);
1009*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1010*5548cb50SEnrico Granata                      "",
1011*5548cb50SEnrico Granata                      ConstString("vSInt32"),
1012*5548cb50SEnrico Granata                      vector_flags);
1013*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1014*5548cb50SEnrico Granata                      "",
1015*5548cb50SEnrico Granata                      ConstString("vUInt16"),
1016*5548cb50SEnrico Granata                      vector_flags);
1017*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1018*5548cb50SEnrico Granata                      "",
1019*5548cb50SEnrico Granata                      ConstString("vUInt8"),
1020*5548cb50SEnrico Granata                      vector_flags);
1021*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1022*5548cb50SEnrico Granata                      "",
1023*5548cb50SEnrico Granata                      ConstString("vUInt16"),
1024*5548cb50SEnrico Granata                      vector_flags);
1025*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1026*5548cb50SEnrico Granata                      "",
1027*5548cb50SEnrico Granata                      ConstString("vUInt32"),
1028*5548cb50SEnrico Granata                      vector_flags);
1029*5548cb50SEnrico Granata     AddStringSummary(vectors_category_sp,
1030*5548cb50SEnrico Granata                      "",
1031*5548cb50SEnrico Granata                      ConstString("vBool32"),
1032*5548cb50SEnrico Granata                      vector_flags);
1033*5548cb50SEnrico Granata }
1034