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