1 //===-- CXXFormatterFunctions.h------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_CXXFormatterFunctions_h_
11 #define liblldb_CXXFormatterFunctions_h_
16 #include "lldb/lldb-forward.h"
18 #include "lldb/Core/ConstString.h"
19 #include "lldb/DataFormatters/FormatClasses.h"
20 #include "lldb/Target/Target.h"
22 #include "clang/AST/ASTContext.h"
24 namespace lldb_private {
28 ExtractValueFromObjCExpression (ValueObject &valobj,
29 const char* target_type,
34 ExtractSummaryFromObjCExpression (ValueObject &valobj,
35 const char* target_type,
40 CallSelectorOnObject (ValueObject &valobj,
41 const char* return_type,
46 CallSelectorOnObject (ValueObject &valobj,
47 const char* return_type,
52 ExtractIndexFromString (const char* item_name);
58 Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
61 Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
64 WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
67 Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
70 Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
73 WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
76 LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
79 LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
82 ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream);
84 SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
86 template<bool name_entries>
88 NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
91 NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream);
94 NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
96 template<bool cf_style>
98 NSSetSummaryProvider (ValueObject& valobj, Stream& stream);
100 template<bool needs_at>
102 NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
105 NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
108 NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream);
111 NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream);
114 NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream);
117 CFBagSummaryProvider (ValueObject& valobj, Stream& stream);
120 CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream);
123 CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream);
126 NSDateSummaryProvider (ValueObject& valobj, Stream& stream);
129 CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream);
132 NSBundleSummaryProvider (ValueObject& valobj, Stream& stream);
135 NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
138 NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
141 NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
144 NSURLSummaryProvider (ValueObject& valobj, Stream& stream);
147 ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
149 template <bool is_sel_ptr>
151 ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
154 RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
157 NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
160 NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
163 NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
166 NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
169 ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
172 ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
174 class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
177 struct DataDescriptor_32
180 uint32_t _priv1 : 2 ;
183 uint32_t offset : 30;
187 struct DataDescriptor_64
190 uint64_t _priv1 : 2 ;
193 uint64_t offset : 62;
198 NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
201 CalculateNumChildren ();
203 virtual lldb::ValueObjectSP
204 GetChildAtIndex (size_t idx);
210 MightHaveChildren ();
213 GetIndexOfChildWithName (const ConstString &name);
216 ~NSArrayMSyntheticFrontEnd ();
218 ExecutionContextRef m_exe_ctx_ref;
220 DataDescriptor_32 *m_data_32;
221 DataDescriptor_64 *m_data_64;
222 ClangASTType m_id_type;
223 std::vector<lldb::ValueObjectSP> m_children;
226 class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
229 NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
232 CalculateNumChildren ();
234 virtual lldb::ValueObjectSP
235 GetChildAtIndex (size_t idx);
241 MightHaveChildren ();
244 GetIndexOfChildWithName (const ConstString &name);
247 ~NSArrayISyntheticFrontEnd ();
249 ExecutionContextRef m_exe_ctx_ref;
252 lldb::addr_t m_data_ptr;
253 ClangASTType m_id_type;
254 std::vector<lldb::ValueObjectSP> m_children;
257 class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
260 NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
263 CalculateNumChildren ();
265 virtual lldb::ValueObjectSP
266 GetChildAtIndex (size_t idx);
272 MightHaveChildren ();
275 GetIndexOfChildWithName (const ConstString &name);
278 ~NSArrayCodeRunningSyntheticFrontEnd ();
281 SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
283 class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
286 struct DataDescriptor_32
291 struct DataDescriptor_64
297 struct DictionaryItemDescriptor
299 lldb::addr_t key_ptr;
300 lldb::addr_t val_ptr;
301 lldb::ValueObjectSP valobj_sp;
305 NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
308 CalculateNumChildren ();
310 virtual lldb::ValueObjectSP
311 GetChildAtIndex (size_t idx);
317 MightHaveChildren ();
320 GetIndexOfChildWithName (const ConstString &name);
323 ~NSDictionaryISyntheticFrontEnd ();
325 ExecutionContextRef m_exe_ctx_ref;
327 lldb::ByteOrder m_order;
328 DataDescriptor_32 *m_data_32;
329 DataDescriptor_64 *m_data_64;
330 lldb::addr_t m_data_ptr;
331 ClangASTType m_pair_type;
332 std::vector<DictionaryItemDescriptor> m_children;
335 class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
338 struct DataDescriptor_32
347 struct DataDescriptor_64
356 struct DictionaryItemDescriptor
358 lldb::addr_t key_ptr;
359 lldb::addr_t val_ptr;
360 lldb::ValueObjectSP valobj_sp;
363 NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
366 CalculateNumChildren ();
368 virtual lldb::ValueObjectSP
369 GetChildAtIndex (size_t idx);
375 MightHaveChildren ();
378 GetIndexOfChildWithName (const ConstString &name);
381 ~NSDictionaryMSyntheticFrontEnd ();
383 ExecutionContextRef m_exe_ctx_ref;
385 lldb::ByteOrder m_order;
386 DataDescriptor_32 *m_data_32;
387 DataDescriptor_64 *m_data_64;
388 ClangASTType m_pair_type;
389 std::vector<DictionaryItemDescriptor> m_children;
392 class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
395 NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
398 CalculateNumChildren ();
400 virtual lldb::ValueObjectSP
401 GetChildAtIndex (size_t idx);
407 MightHaveChildren ();
410 GetIndexOfChildWithName (const ConstString &name);
413 ~NSDictionaryCodeRunningSyntheticFrontEnd ();
416 SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
418 class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd
421 struct DataDescriptor_32
426 struct DataDescriptor_64
432 struct SetItemDescriptor
434 lldb::addr_t item_ptr;
435 lldb::ValueObjectSP valobj_sp;
439 NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
442 CalculateNumChildren ();
444 virtual lldb::ValueObjectSP
445 GetChildAtIndex (size_t idx);
451 MightHaveChildren ();
454 GetIndexOfChildWithName (const ConstString &name);
457 ~NSSetISyntheticFrontEnd ();
459 ExecutionContextRef m_exe_ctx_ref;
461 DataDescriptor_32 *m_data_32;
462 DataDescriptor_64 *m_data_64;
463 lldb::addr_t m_data_ptr;
464 std::vector<SetItemDescriptor> m_children;
467 class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd
472 NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
475 CalculateNumChildren ();
477 virtual lldb::ValueObjectSP
478 GetChildAtIndex (size_t idx);
484 MightHaveChildren ();
487 GetIndexOfChildWithName (const ConstString &name);
490 ~NSOrderedSetSyntheticFrontEnd ();
493 std::map<uint32_t,lldb::ValueObjectSP> m_children;
496 class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
499 struct DataDescriptor_32
506 struct DataDescriptor_64
513 struct SetItemDescriptor
515 lldb::addr_t item_ptr;
516 lldb::ValueObjectSP valobj_sp;
519 NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
522 CalculateNumChildren ();
524 virtual lldb::ValueObjectSP
525 GetChildAtIndex (size_t idx);
531 MightHaveChildren ();
534 GetIndexOfChildWithName (const ConstString &name);
537 ~NSSetMSyntheticFrontEnd ();
539 ExecutionContextRef m_exe_ctx_ref;
541 DataDescriptor_32 *m_data_32;
542 DataDescriptor_64 *m_data_64;
543 std::vector<SetItemDescriptor> m_children;
546 class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
549 NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
552 CalculateNumChildren ();
554 virtual lldb::ValueObjectSP
555 GetChildAtIndex (size_t idx);
561 MightHaveChildren ();
564 GetIndexOfChildWithName (const ConstString &name);
567 ~NSSetCodeRunningSyntheticFrontEnd ();
570 SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
572 class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
575 LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
578 CalculateNumChildren ();
580 virtual lldb::ValueObjectSP
581 GetChildAtIndex (size_t idx);
587 MightHaveChildren ();
590 GetIndexOfChildWithName (const ConstString &name);
593 ~LibcxxVectorBoolSyntheticFrontEnd ();
595 ExecutionContextRef m_exe_ctx_ref;
597 lldb::addr_t m_base_data_address;
598 EvaluateExpressionOptions m_options;
601 SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
604 LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream);
606 class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
609 LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
612 CalculateNumChildren ();
614 virtual lldb::ValueObjectSP
615 GetChildAtIndex (size_t idx);
621 MightHaveChildren ();
624 GetIndexOfChildWithName (const ConstString &name);
627 ~LibstdcppVectorBoolSyntheticFrontEnd ();
629 ExecutionContextRef m_exe_ctx_ref;
631 lldb::addr_t m_base_data_address;
632 EvaluateExpressionOptions m_options;
635 SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
637 class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
640 LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
643 CalculateNumChildren ();
645 virtual lldb::ValueObjectSP
646 GetChildAtIndex (size_t idx);
652 MightHaveChildren ();
655 GetIndexOfChildWithName (const ConstString &name);
658 ~LibstdcppMapIteratorSyntheticFrontEnd ();
660 ExecutionContextRef m_exe_ctx_ref;
661 lldb::addr_t m_pair_address;
662 ClangASTType m_pair_type;
663 EvaluateExpressionOptions m_options;
664 lldb::ValueObjectSP m_pair_sp;
667 SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
669 class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
672 LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
675 CalculateNumChildren ();
677 virtual lldb::ValueObjectSP
678 GetChildAtIndex (size_t idx);
684 MightHaveChildren ();
687 GetIndexOfChildWithName (const ConstString &name);
690 ~LibCxxMapIteratorSyntheticFrontEnd ();
692 ValueObject *m_pair_ptr;
695 SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
697 class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
700 VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp,
701 ConstString item_name);
704 CalculateNumChildren ();
706 virtual lldb::ValueObjectSP
707 GetChildAtIndex (size_t idx);
713 MightHaveChildren ();
716 GetIndexOfChildWithName (const ConstString &name);
719 ~VectorIteratorSyntheticFrontEnd ();
721 ExecutionContextRef m_exe_ctx_ref;
722 ConstString m_item_name;
723 lldb::ValueObjectSP m_item_sp;
726 SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
728 SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
730 class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd
733 LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
736 CalculateNumChildren ();
738 virtual lldb::ValueObjectSP
739 GetChildAtIndex (size_t idx);
745 MightHaveChildren ();
748 GetIndexOfChildWithName (const ConstString &name);
751 ~LibcxxSharedPtrSyntheticFrontEnd ();
753 ValueObject* m_cntrl;
754 lldb::ValueObjectSP m_count_sp;
755 lldb::ValueObjectSP m_weak_count_sp;
757 lldb::ByteOrder m_byte_order;
760 SyntheticChildrenFrontEnd* LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
762 class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
765 LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
768 CalculateNumChildren ();
770 virtual lldb::ValueObjectSP
771 GetChildAtIndex (size_t idx);
777 MightHaveChildren ();
780 GetIndexOfChildWithName (const ConstString &name);
783 ~LibcxxStdVectorSyntheticFrontEnd ();
785 ValueObject* m_start;
786 ValueObject* m_finish;
787 ClangASTType m_element_type;
788 uint32_t m_element_size;
789 std::map<size_t,lldb::ValueObjectSP> m_children;
792 SyntheticChildrenFrontEnd* LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
794 class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd
797 LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
800 CalculateNumChildren ();
802 virtual lldb::ValueObjectSP
803 GetChildAtIndex (size_t idx);
809 MightHaveChildren ();
812 GetIndexOfChildWithName (const ConstString &name);
815 ~LibcxxStdListSyntheticFrontEnd ();
820 size_t m_list_capping_size;
821 static const bool g_use_loop_detect = true;
822 lldb::addr_t m_node_address;
825 ClangASTType m_element_type;
827 std::map<size_t,lldb::ValueObjectSP> m_children;
830 SyntheticChildrenFrontEnd* LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
832 class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd
835 LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
838 CalculateNumChildren ();
840 virtual lldb::ValueObjectSP
841 GetChildAtIndex (size_t idx);
847 MightHaveChildren ();
850 GetIndexOfChildWithName (const ConstString &name);
853 ~LibcxxStdMapSyntheticFrontEnd ();
859 GetValueOffset (const lldb::ValueObjectSP& node);
862 ValueObject* m_root_node;
863 ClangASTType m_element_type;
864 uint32_t m_skip_size;
866 std::map<size_t,lldb::ValueObjectSP> m_children;
869 SyntheticChildrenFrontEnd* LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
871 } // namespace formatters
872 } // namespace lldb_private
874 #endif // liblldb_CXXFormatterFunctions_h_