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