CXXFormatterFunctions.h revision cba09f60618744e2155bc97c9049fa9c797698ad
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        bool
32        ExtractSummaryFromObjCExpression (ValueObject &valobj,
33                                          const char* target_type,
34                                          const char* selector,
35                                          Stream &stream);
36
37        lldb::ValueObjectSP
38        CallSelectorOnObject (ValueObject &valobj,
39                              const char* return_type,
40                              const char* selector,
41                              uint64_t index);
42
43        lldb::ValueObjectSP
44        CallSelectorOnObject (ValueObject &valobj,
45                              const char* return_type,
46                              const char* selector,
47                              const char* key);
48
49        size_t
50        ExtractIndexFromString (const char* item_name);
51
52        bool
53        Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
54
55        bool
56        Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
57
58        bool
59        WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
60
61        bool
62        Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
63
64        bool
65        Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
66
67        bool
68        WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
69
70        bool
71        LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
72
73        bool
74        LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
75
76        bool
77        ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream);
78
79        template<bool name_entries>
80        bool
81        NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
82
83        bool
84        NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream);
85
86        bool
87        NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
88
89        template<bool cf_style>
90        bool
91        NSSetSummaryProvider (ValueObject& valobj, Stream& stream);
92
93        template<bool needs_at>
94        bool
95        NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
96
97        bool
98        NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
99
100        bool
101        NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream);
102
103        bool
104        NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream);
105
106        bool
107        NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream);
108
109        bool
110        CFBagSummaryProvider (ValueObject& valobj, Stream& stream);
111
112        bool
113        CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream);
114
115        bool
116        CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream);
117
118        bool
119        NSDateSummaryProvider (ValueObject& valobj, Stream& stream);
120
121        bool
122        CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream);
123
124        bool
125        NSBundleSummaryProvider (ValueObject& valobj, Stream& stream);
126
127        bool
128        NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
129
130        bool
131        NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
132
133        bool
134        NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
135
136        bool
137        NSURLSummaryProvider (ValueObject& valobj, Stream& stream);
138
139        bool
140        ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
141
142        template <bool is_sel_ptr>
143        bool
144        ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
145
146        bool
147        RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
148
149        extern template bool
150        NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
151
152        extern template bool
153        NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
154
155        extern template bool
156        NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
157
158        extern template bool
159        NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
160
161        extern template bool
162        ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
163
164        extern template bool
165        ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
166
167        class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
168        {
169        private:
170            struct DataDescriptor_32
171            {
172                uint32_t _used;
173                uint32_t _priv1 : 2 ;
174                uint32_t _size : 30;
175                uint32_t _priv2 : 2;
176                uint32_t offset : 30;
177                uint32_t _priv3;
178                uint32_t _data;
179            };
180            struct DataDescriptor_64
181            {
182                uint64_t _used;
183                uint64_t _priv1 : 2 ;
184                uint64_t _size : 62;
185                uint64_t _priv2 : 2;
186                uint64_t offset : 62;
187                uint32_t _priv3;
188                uint64_t _data;
189            };
190        public:
191            NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
192
193            virtual size_t
194            CalculateNumChildren ();
195
196            virtual lldb::ValueObjectSP
197            GetChildAtIndex (size_t idx);
198
199            virtual bool
200            Update();
201
202            virtual bool
203            MightHaveChildren ();
204
205            virtual size_t
206            GetIndexOfChildWithName (const ConstString &name);
207
208            virtual
209            ~NSArrayMSyntheticFrontEnd ();
210        private:
211            ExecutionContextRef m_exe_ctx_ref;
212            uint8_t m_ptr_size;
213            DataDescriptor_32 *m_data_32;
214            DataDescriptor_64 *m_data_64;
215            ClangASTType m_id_type;
216            std::vector<lldb::ValueObjectSP> m_children;
217        };
218
219        class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
220        {
221        public:
222            NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
223
224            virtual size_t
225            CalculateNumChildren ();
226
227            virtual lldb::ValueObjectSP
228            GetChildAtIndex (size_t idx);
229
230            virtual bool
231            Update();
232
233            virtual bool
234            MightHaveChildren ();
235
236            virtual size_t
237            GetIndexOfChildWithName (const ConstString &name);
238
239            virtual
240            ~NSArrayISyntheticFrontEnd ();
241        private:
242            ExecutionContextRef m_exe_ctx_ref;
243            uint8_t m_ptr_size;
244            uint64_t m_items;
245            lldb::addr_t m_data_ptr;
246            ClangASTType m_id_type;
247            std::vector<lldb::ValueObjectSP> m_children;
248        };
249
250        class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
251        {
252        public:
253            NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
254
255            virtual size_t
256            CalculateNumChildren ();
257
258            virtual lldb::ValueObjectSP
259            GetChildAtIndex (size_t idx);
260
261            virtual bool
262            Update();
263
264            virtual bool
265            MightHaveChildren ();
266
267            virtual size_t
268            GetIndexOfChildWithName (const ConstString &name);
269
270            virtual
271            ~NSArrayCodeRunningSyntheticFrontEnd ();
272        };
273
274        SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
275
276        class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
277        {
278        private:
279            struct DataDescriptor_32
280            {
281                uint32_t _used : 26;
282                uint32_t _szidx : 6;
283            };
284            struct DataDescriptor_64
285            {
286                uint64_t _used : 58;
287                uint32_t _szidx : 6;
288            };
289
290            struct DictionaryItemDescriptor
291            {
292                lldb::addr_t key_ptr;
293                lldb::addr_t val_ptr;
294                lldb::ValueObjectSP valobj_sp;
295            };
296
297        public:
298            NSDictionaryISyntheticFrontEnd (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            ~NSDictionaryISyntheticFrontEnd ();
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            lldb::addr_t m_data_ptr;
323            std::vector<DictionaryItemDescriptor> m_children;
324        };
325
326        class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
327        {
328        private:
329            struct DataDescriptor_32
330            {
331                uint32_t _used : 26;
332                uint32_t _kvo : 1;
333                uint32_t _size;
334                uint32_t _mutations;
335                uint32_t _objs_addr;
336                uint32_t _keys_addr;
337            };
338            struct DataDescriptor_64
339            {
340                uint64_t _used : 58;
341                uint32_t _kvo : 1;
342                uint64_t _size;
343                uint64_t _mutations;
344                uint64_t _objs_addr;
345                uint64_t _keys_addr;
346            };
347            struct DictionaryItemDescriptor
348            {
349                lldb::addr_t key_ptr;
350                lldb::addr_t val_ptr;
351                lldb::ValueObjectSP valobj_sp;
352            };
353        public:
354            NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
355
356            virtual size_t
357            CalculateNumChildren ();
358
359            virtual lldb::ValueObjectSP
360            GetChildAtIndex (size_t idx);
361
362            virtual bool
363            Update();
364
365            virtual bool
366            MightHaveChildren ();
367
368            virtual size_t
369            GetIndexOfChildWithName (const ConstString &name);
370
371            virtual
372            ~NSDictionaryMSyntheticFrontEnd ();
373        private:
374            ExecutionContextRef m_exe_ctx_ref;
375            uint8_t m_ptr_size;
376            DataDescriptor_32 *m_data_32;
377            DataDescriptor_64 *m_data_64;
378            std::vector<DictionaryItemDescriptor> m_children;
379        };
380
381        class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
382        {
383        public:
384            NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
385
386            virtual size_t
387            CalculateNumChildren ();
388
389            virtual lldb::ValueObjectSP
390            GetChildAtIndex (size_t idx);
391
392            virtual bool
393            Update();
394
395            virtual bool
396            MightHaveChildren ();
397
398            virtual size_t
399            GetIndexOfChildWithName (const ConstString &name);
400
401            virtual
402            ~NSDictionaryCodeRunningSyntheticFrontEnd ();
403        };
404
405        SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
406
407        class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd
408        {
409        private:
410            struct DataDescriptor_32
411            {
412                uint32_t _used : 26;
413                uint32_t _szidx : 6;
414            };
415            struct DataDescriptor_64
416            {
417                uint64_t _used : 58;
418                uint32_t _szidx : 6;
419            };
420
421            struct SetItemDescriptor
422            {
423                lldb::addr_t item_ptr;
424                lldb::ValueObjectSP valobj_sp;
425            };
426
427        public:
428            NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
429
430            virtual size_t
431            CalculateNumChildren ();
432
433            virtual lldb::ValueObjectSP
434            GetChildAtIndex (size_t idx);
435
436            virtual bool
437            Update();
438
439            virtual bool
440            MightHaveChildren ();
441
442            virtual size_t
443            GetIndexOfChildWithName (const ConstString &name);
444
445            virtual
446            ~NSSetISyntheticFrontEnd ();
447        private:
448            ExecutionContextRef m_exe_ctx_ref;
449            uint8_t m_ptr_size;
450            DataDescriptor_32 *m_data_32;
451            DataDescriptor_64 *m_data_64;
452            lldb::addr_t m_data_ptr;
453            std::vector<SetItemDescriptor> m_children;
454        };
455
456        class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
457        {
458        private:
459            struct DataDescriptor_32
460            {
461                uint32_t _used : 26;
462                uint32_t _size;
463                uint32_t _mutations;
464                uint32_t _objs_addr;
465            };
466            struct DataDescriptor_64
467            {
468                uint64_t _used : 58;
469                uint64_t _size;
470                uint64_t _mutations;
471                uint64_t _objs_addr;
472            };
473            struct SetItemDescriptor
474            {
475                lldb::addr_t item_ptr;
476                lldb::ValueObjectSP valobj_sp;
477            };
478        public:
479            NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
480
481            virtual size_t
482            CalculateNumChildren ();
483
484            virtual lldb::ValueObjectSP
485            GetChildAtIndex (size_t idx);
486
487            virtual bool
488            Update();
489
490            virtual bool
491            MightHaveChildren ();
492
493            virtual size_t
494            GetIndexOfChildWithName (const ConstString &name);
495
496            virtual
497            ~NSSetMSyntheticFrontEnd ();
498        private:
499            ExecutionContextRef m_exe_ctx_ref;
500            uint8_t m_ptr_size;
501            DataDescriptor_32 *m_data_32;
502            DataDescriptor_64 *m_data_64;
503            std::vector<SetItemDescriptor> m_children;
504        };
505
506        class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
507        {
508        public:
509            NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
510
511            virtual size_t
512            CalculateNumChildren ();
513
514            virtual lldb::ValueObjectSP
515            GetChildAtIndex (size_t idx);
516
517            virtual bool
518            Update();
519
520            virtual bool
521            MightHaveChildren ();
522
523            virtual size_t
524            GetIndexOfChildWithName (const ConstString &name);
525
526            virtual
527            ~NSSetCodeRunningSyntheticFrontEnd ();
528        };
529
530        SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
531
532        class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
533        {
534        public:
535            LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
536
537            virtual size_t
538            CalculateNumChildren ();
539
540            virtual lldb::ValueObjectSP
541            GetChildAtIndex (size_t idx);
542
543            virtual bool
544            Update();
545
546            virtual bool
547            MightHaveChildren ();
548
549            virtual size_t
550            GetIndexOfChildWithName (const ConstString &name);
551
552            virtual
553            ~LibcxxVectorBoolSyntheticFrontEnd ();
554        private:
555            ExecutionContextRef m_exe_ctx_ref;
556            uint64_t m_count;
557            lldb::addr_t m_base_data_address;
558            EvaluateExpressionOptions m_options;
559        };
560
561        SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
562
563        class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
564        {
565        public:
566            LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
567
568            virtual size_t
569            CalculateNumChildren ();
570
571            virtual lldb::ValueObjectSP
572            GetChildAtIndex (size_t idx);
573
574            virtual bool
575            Update();
576
577            virtual bool
578            MightHaveChildren ();
579
580            virtual size_t
581            GetIndexOfChildWithName (const ConstString &name);
582
583            virtual
584            ~LibstdcppVectorBoolSyntheticFrontEnd ();
585        private:
586            ExecutionContextRef m_exe_ctx_ref;
587            uint64_t m_count;
588            lldb::addr_t m_base_data_address;
589            EvaluateExpressionOptions m_options;
590        };
591
592        SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
593
594        class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
595        {
596        public:
597            LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
598
599            virtual size_t
600            CalculateNumChildren ();
601
602            virtual lldb::ValueObjectSP
603            GetChildAtIndex (size_t idx);
604
605            virtual bool
606            Update();
607
608            virtual bool
609            MightHaveChildren ();
610
611            virtual size_t
612            GetIndexOfChildWithName (const ConstString &name);
613
614            virtual
615            ~LibstdcppMapIteratorSyntheticFrontEnd ();
616        private:
617            ExecutionContextRef m_exe_ctx_ref;
618            lldb::addr_t m_pair_address;
619            ClangASTType m_pair_type;
620            EvaluateExpressionOptions m_options;
621            lldb::ValueObjectSP m_pair_sp;
622        };
623
624        SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
625
626        class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
627        {
628        public:
629            LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
630
631            virtual size_t
632            CalculateNumChildren ();
633
634            virtual lldb::ValueObjectSP
635            GetChildAtIndex (size_t idx);
636
637            virtual bool
638            Update();
639
640            virtual bool
641            MightHaveChildren ();
642
643            virtual size_t
644            GetIndexOfChildWithName (const ConstString &name);
645
646            virtual
647            ~LibCxxMapIteratorSyntheticFrontEnd ();
648        private:
649            ValueObject *m_pair_ptr;
650        };
651
652        SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
653
654        class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
655        {
656        public:
657            VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp,
658                                             ConstString item_name);
659
660            virtual size_t
661            CalculateNumChildren ();
662
663            virtual lldb::ValueObjectSP
664            GetChildAtIndex (size_t idx);
665
666            virtual bool
667            Update();
668
669            virtual bool
670            MightHaveChildren ();
671
672            virtual size_t
673            GetIndexOfChildWithName (const ConstString &name);
674
675            virtual
676            ~VectorIteratorSyntheticFrontEnd ();
677        private:
678            ExecutionContextRef m_exe_ctx_ref;
679            ConstString m_item_name;
680            lldb::ValueObjectSP m_item_sp;
681        };
682
683        SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
684
685        SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
686
687    } // namespace formatters
688} // namespace lldb_private
689
690#endif // liblldb_CXXFormatterFunctions_h_
691