CXXFormatterFunctions.h revision 689696c19cbf0fa8a09e2461f0aaa37409782e3b
1//===-- CXXFormatterFunctions.h------------------------------------*- 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
10#ifndef liblldb_CXXFormatterFunctions_h_
11#define liblldb_CXXFormatterFunctions_h_
12
13#include <stdint.h>
14#include "lldb/lldb-forward.h"
15
16#include "lldb/Core/ConstString.h"
17#include "lldb/DataFormatters/FormatClasses.h"
18#include "lldb/Target/Target.h"
19
20#include "clang/AST/ASTContext.h"
21
22namespace lldb_private {
23    namespace formatters
24    {
25        bool
26        ExtractValueFromObjCExpression (ValueObject &valobj,
27                                        const char* target_type,
28                                        const char* selector,
29                                        uint64_t &value);
30
31        lldb::ValueObjectSP
32        CallSelectorOnObject (ValueObject &valobj,
33                              const char* return_type,
34                              const char* selector,
35                              uint64_t index);
36
37        lldb::ValueObjectSP
38        CallSelectorOnObject (ValueObject &valobj,
39                              const char* return_type,
40                              const char* selector,
41                              const char* key);
42
43        bool
44        Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
45
46        bool
47        Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
48
49        bool
50        WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
51
52        bool
53        Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
54
55        bool
56        Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
57
58        bool
59        WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
60
61        bool
62        LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
63
64        bool
65        LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
66
67        template<bool name_entries>
68        bool
69        NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
70
71        bool
72        NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
73
74        template<bool needs_at>
75        bool
76        NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
77
78        bool
79        NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
80
81        bool
82        NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
83
84        bool
85        ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
86
87        template <bool is_sel_ptr>
88        bool
89        ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
90
91        bool
92        RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
93
94        extern template bool
95        NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
96
97        extern template bool
98        NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
99
100        extern template bool
101        NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
102
103        extern template bool
104        NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
105
106        extern template bool
107        ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
108
109        extern template bool
110        ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
111
112        class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
113        {
114        private:
115            struct DataDescriptor_32
116            {
117                uint32_t _used;
118                uint32_t _priv1 : 2 ;
119                uint32_t _size : 30;
120                uint32_t _priv2 : 2;
121                uint32_t offset : 30;
122                uint32_t _priv3;
123                uint32_t _data;
124            };
125            struct DataDescriptor_64
126            {
127                uint64_t _used;
128                uint64_t _priv1 : 2 ;
129                uint64_t _size : 62;
130                uint64_t _priv2 : 2;
131                uint64_t offset : 62;
132                uint32_t _priv3;
133                uint64_t _data;
134            };
135        public:
136            NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
137
138            virtual size_t
139            CalculateNumChildren ();
140
141            virtual lldb::ValueObjectSP
142            GetChildAtIndex (size_t idx);
143
144            virtual bool
145            Update();
146
147            virtual bool
148            MightHaveChildren ();
149
150            virtual size_t
151            GetIndexOfChildWithName (const ConstString &name);
152
153            virtual
154            ~NSArrayMSyntheticFrontEnd ();
155        private:
156            ExecutionContextRef m_exe_ctx_ref;
157            uint8_t m_ptr_size;
158            DataDescriptor_32 *m_data_32;
159            DataDescriptor_64 *m_data_64;
160            ClangASTType m_id_type;
161            std::vector<lldb::ValueObjectSP> m_children;
162        };
163
164        class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
165        {
166        public:
167            NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
168
169            virtual size_t
170            CalculateNumChildren ();
171
172            virtual lldb::ValueObjectSP
173            GetChildAtIndex (size_t idx);
174
175            virtual bool
176            Update();
177
178            virtual bool
179            MightHaveChildren ();
180
181            virtual size_t
182            GetIndexOfChildWithName (const ConstString &name);
183
184            virtual
185            ~NSArrayISyntheticFrontEnd ();
186        private:
187            ExecutionContextRef m_exe_ctx_ref;
188            uint8_t m_ptr_size;
189            uint64_t m_items;
190            lldb::addr_t m_data_ptr;
191            ClangASTType m_id_type;
192            std::vector<lldb::ValueObjectSP> m_children;
193        };
194
195        class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
196        {
197        public:
198            NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
199
200            virtual size_t
201            CalculateNumChildren ();
202
203            virtual lldb::ValueObjectSP
204            GetChildAtIndex (size_t idx);
205
206            virtual bool
207            Update();
208
209            virtual bool
210            MightHaveChildren ();
211
212            virtual size_t
213            GetIndexOfChildWithName (const ConstString &name);
214
215            virtual
216            ~NSArrayCodeRunningSyntheticFrontEnd ();
217        };
218
219        SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
220
221        class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
222        {
223        private:
224            struct DataDescriptor_32
225            {
226                uint32_t _used : 26;
227                uint32_t _szidx : 6;
228            };
229            struct DataDescriptor_64
230            {
231                uint64_t _used : 58;
232                uint32_t _szidx : 6;
233            };
234
235            struct DictionaryItemDescriptor
236            {
237                lldb::addr_t key_ptr;
238                lldb::addr_t val_ptr;
239                lldb::ValueObjectSP valobj_sp;
240            };
241
242        public:
243            NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
244
245            virtual size_t
246            CalculateNumChildren ();
247
248            virtual lldb::ValueObjectSP
249            GetChildAtIndex (size_t idx);
250
251            virtual bool
252            Update();
253
254            virtual bool
255            MightHaveChildren ();
256
257            virtual size_t
258            GetIndexOfChildWithName (const ConstString &name);
259
260            virtual
261            ~NSDictionaryISyntheticFrontEnd ();
262        private:
263            ExecutionContextRef m_exe_ctx_ref;
264            uint8_t m_ptr_size;
265            DataDescriptor_32 *m_data_32;
266            DataDescriptor_64 *m_data_64;
267            lldb::addr_t m_data_ptr;
268            std::vector<DictionaryItemDescriptor> m_children;
269        };
270
271        class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
272        {
273        private:
274            struct DataDescriptor_32
275            {
276                uint32_t _used : 26;
277                uint32_t _kvo : 1;
278                uint32_t _size;
279                uint32_t _mutations;
280                uint32_t _objs_addr;
281                uint32_t _keys_addr;
282            };
283            struct DataDescriptor_64
284            {
285                uint64_t _used : 58;
286                uint32_t _kvo : 1;
287                uint64_t _size;
288                uint64_t _mutations;
289                uint64_t _objs_addr;
290                uint64_t _keys_addr;
291            };
292            struct DictionaryItemDescriptor
293            {
294                lldb::addr_t key_ptr;
295                lldb::addr_t val_ptr;
296                lldb::ValueObjectSP valobj_sp;
297            };
298        public:
299            NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
300
301            virtual size_t
302            CalculateNumChildren ();
303
304            virtual lldb::ValueObjectSP
305            GetChildAtIndex (size_t idx);
306
307            virtual bool
308            Update();
309
310            virtual bool
311            MightHaveChildren ();
312
313            virtual size_t
314            GetIndexOfChildWithName (const ConstString &name);
315
316            virtual
317            ~NSDictionaryMSyntheticFrontEnd ();
318        private:
319            ExecutionContextRef m_exe_ctx_ref;
320            uint8_t m_ptr_size;
321            DataDescriptor_32 *m_data_32;
322            DataDescriptor_64 *m_data_64;
323            std::vector<DictionaryItemDescriptor> m_children;
324        };
325
326        class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
327        {
328        public:
329            NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
330
331            virtual size_t
332            CalculateNumChildren ();
333
334            virtual lldb::ValueObjectSP
335            GetChildAtIndex (size_t idx);
336
337            virtual bool
338            Update();
339
340            virtual bool
341            MightHaveChildren ();
342
343            virtual size_t
344            GetIndexOfChildWithName (const ConstString &name);
345
346            virtual
347            ~NSDictionaryCodeRunningSyntheticFrontEnd ();
348        };
349
350        SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
351
352        class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
353        {
354        public:
355            LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
356
357            virtual size_t
358            CalculateNumChildren ();
359
360            virtual lldb::ValueObjectSP
361            GetChildAtIndex (size_t idx);
362
363            virtual bool
364            Update();
365
366            virtual bool
367            MightHaveChildren ();
368
369            virtual size_t
370            GetIndexOfChildWithName (const ConstString &name);
371
372            virtual
373            ~LibcxxVectorBoolSyntheticFrontEnd ();
374        private:
375            ExecutionContextRef m_exe_ctx_ref;
376            uint64_t m_count;
377            lldb::addr_t m_base_data_address;
378            EvaluateExpressionOptions m_options;
379        };
380
381        SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
382
383        class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
384        {
385        public:
386            LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
387
388            virtual size_t
389            CalculateNumChildren ();
390
391            virtual lldb::ValueObjectSP
392            GetChildAtIndex (size_t idx);
393
394            virtual bool
395            Update();
396
397            virtual bool
398            MightHaveChildren ();
399
400            virtual size_t
401            GetIndexOfChildWithName (const ConstString &name);
402
403            virtual
404            ~LibstdcppVectorBoolSyntheticFrontEnd ();
405        private:
406            ExecutionContextRef m_exe_ctx_ref;
407            uint64_t m_count;
408            lldb::addr_t m_base_data_address;
409            EvaluateExpressionOptions m_options;
410        };
411
412        SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
413
414
415    }
416}
417
418#endif
419