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/DataFormatters/TypeSynthetic.h"
21 #include "lldb/Target/ExecutionContext.h"
22 #include "lldb/Target/Target.h"
24 #include "clang/AST/ASTContext.h"
26 namespace lldb_private {
30 ExtractValueFromObjCExpression (ValueObject &valobj,
31 const char* target_type,
36 ExtractSummaryFromObjCExpression (ValueObject &valobj,
37 const char* target_type,
42 CallSelectorOnObject (ValueObject &valobj,
43 const char* return_type,
48 CallSelectorOnObject (ValueObject &valobj,
49 const char* return_type,
54 ExtractIndexFromString (const char* item_name);
60 Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
63 Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
66 WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
69 Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
72 Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
75 WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
78 LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
81 LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
84 LibcxxSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::shared_ptr<> and std::weak_ptr<>
87 ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream);
89 SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
91 template<bool name_entries>
93 NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
96 NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream);
99 NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
101 template<bool cf_style>
103 NSSetSummaryProvider (ValueObject& valobj, Stream& stream);
105 template<bool needs_at>
107 NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
110 NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
113 NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream);
116 NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream);
119 NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream);
122 CFBagSummaryProvider (ValueObject& valobj, Stream& stream);
125 CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream);
128 CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream);
131 NSDateSummaryProvider (ValueObject& valobj, Stream& stream);
134 CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream);
137 NSBundleSummaryProvider (ValueObject& valobj, Stream& stream);
140 NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
143 NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
146 NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
149 NSURLSummaryProvider (ValueObject& valobj, Stream& stream);
152 ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
154 template <bool is_sel_ptr>
156 ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
159 RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
162 NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
165 NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
168 NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
171 NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
174 ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
177 ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
179 class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
182 struct DataDescriptor_32
185 uint32_t _priv1 : 2 ;
188 uint32_t offset : 30;
192 struct DataDescriptor_64
195 uint64_t _priv1 : 2 ;
198 uint64_t offset : 62;
203 NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
206 CalculateNumChildren ();
208 virtual lldb::ValueObjectSP
209 GetChildAtIndex (size_t idx);
215 MightHaveChildren ();
218 GetIndexOfChildWithName (const ConstString &name);
221 ~NSArrayMSyntheticFrontEnd ();
223 ExecutionContextRef m_exe_ctx_ref;
225 DataDescriptor_32 *m_data_32;
226 DataDescriptor_64 *m_data_64;
227 ClangASTType m_id_type;
228 std::vector<lldb::ValueObjectSP> m_children;
231 class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
234 NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
237 CalculateNumChildren ();
239 virtual lldb::ValueObjectSP
240 GetChildAtIndex (size_t idx);
246 MightHaveChildren ();
249 GetIndexOfChildWithName (const ConstString &name);
252 ~NSArrayISyntheticFrontEnd ();
254 ExecutionContextRef m_exe_ctx_ref;
257 lldb::addr_t m_data_ptr;
258 ClangASTType m_id_type;
259 std::vector<lldb::ValueObjectSP> m_children;
262 class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
265 NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
268 CalculateNumChildren ();
270 virtual lldb::ValueObjectSP
271 GetChildAtIndex (size_t idx);
277 MightHaveChildren ();
280 GetIndexOfChildWithName (const ConstString &name);
283 ~NSArrayCodeRunningSyntheticFrontEnd ();
286 SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
288 class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
291 struct DataDescriptor_32
296 struct DataDescriptor_64
302 struct DictionaryItemDescriptor
304 lldb::addr_t key_ptr;
305 lldb::addr_t val_ptr;
306 lldb::ValueObjectSP valobj_sp;
310 NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
313 CalculateNumChildren ();
315 virtual lldb::ValueObjectSP
316 GetChildAtIndex (size_t idx);
322 MightHaveChildren ();
325 GetIndexOfChildWithName (const ConstString &name);
328 ~NSDictionaryISyntheticFrontEnd ();
330 ExecutionContextRef m_exe_ctx_ref;
332 lldb::ByteOrder m_order;
333 DataDescriptor_32 *m_data_32;
334 DataDescriptor_64 *m_data_64;
335 lldb::addr_t m_data_ptr;
336 ClangASTType m_pair_type;
337 std::vector<DictionaryItemDescriptor> m_children;
340 class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
343 struct DataDescriptor_32
352 struct DataDescriptor_64
361 struct DictionaryItemDescriptor
363 lldb::addr_t key_ptr;
364 lldb::addr_t val_ptr;
365 lldb::ValueObjectSP valobj_sp;
368 NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
371 CalculateNumChildren ();
373 virtual lldb::ValueObjectSP
374 GetChildAtIndex (size_t idx);
380 MightHaveChildren ();
383 GetIndexOfChildWithName (const ConstString &name);
386 ~NSDictionaryMSyntheticFrontEnd ();
388 ExecutionContextRef m_exe_ctx_ref;
390 lldb::ByteOrder m_order;
391 DataDescriptor_32 *m_data_32;
392 DataDescriptor_64 *m_data_64;
393 ClangASTType m_pair_type;
394 std::vector<DictionaryItemDescriptor> m_children;
397 class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
400 NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
403 CalculateNumChildren ();
405 virtual lldb::ValueObjectSP
406 GetChildAtIndex (size_t idx);
412 MightHaveChildren ();
415 GetIndexOfChildWithName (const ConstString &name);
418 ~NSDictionaryCodeRunningSyntheticFrontEnd ();
421 SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
423 class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd
426 struct DataDescriptor_32
431 struct DataDescriptor_64
437 struct SetItemDescriptor
439 lldb::addr_t item_ptr;
440 lldb::ValueObjectSP valobj_sp;
444 NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
447 CalculateNumChildren ();
449 virtual lldb::ValueObjectSP
450 GetChildAtIndex (size_t idx);
456 MightHaveChildren ();
459 GetIndexOfChildWithName (const ConstString &name);
462 ~NSSetISyntheticFrontEnd ();
464 ExecutionContextRef m_exe_ctx_ref;
466 DataDescriptor_32 *m_data_32;
467 DataDescriptor_64 *m_data_64;
468 lldb::addr_t m_data_ptr;
469 std::vector<SetItemDescriptor> m_children;
472 class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd
477 NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
480 CalculateNumChildren ();
482 virtual lldb::ValueObjectSP
483 GetChildAtIndex (size_t idx);
489 MightHaveChildren ();
492 GetIndexOfChildWithName (const ConstString &name);
495 ~NSOrderedSetSyntheticFrontEnd ();
498 std::map<uint32_t,lldb::ValueObjectSP> m_children;
501 class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
504 struct DataDescriptor_32
511 struct DataDescriptor_64
518 struct SetItemDescriptor
520 lldb::addr_t item_ptr;
521 lldb::ValueObjectSP valobj_sp;
524 NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
527 CalculateNumChildren ();
529 virtual lldb::ValueObjectSP
530 GetChildAtIndex (size_t idx);
536 MightHaveChildren ();
539 GetIndexOfChildWithName (const ConstString &name);
542 ~NSSetMSyntheticFrontEnd ();
544 ExecutionContextRef m_exe_ctx_ref;
546 DataDescriptor_32 *m_data_32;
547 DataDescriptor_64 *m_data_64;
548 std::vector<SetItemDescriptor> m_children;
551 class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
554 NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
557 CalculateNumChildren ();
559 virtual lldb::ValueObjectSP
560 GetChildAtIndex (size_t idx);
566 MightHaveChildren ();
569 GetIndexOfChildWithName (const ConstString &name);
572 ~NSSetCodeRunningSyntheticFrontEnd ();
575 SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
577 class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
580 LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
583 CalculateNumChildren ();
585 virtual lldb::ValueObjectSP
586 GetChildAtIndex (size_t idx);
592 MightHaveChildren ();
595 GetIndexOfChildWithName (const ConstString &name);
598 ~LibcxxVectorBoolSyntheticFrontEnd ();
600 ClangASTType m_bool_type;
601 ExecutionContextRef m_exe_ctx_ref;
603 lldb::addr_t m_base_data_address;
604 std::map<size_t,lldb::ValueObjectSP> m_children;
607 SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
610 LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream);
612 class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
615 LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
618 CalculateNumChildren ();
620 virtual lldb::ValueObjectSP
621 GetChildAtIndex (size_t idx);
627 MightHaveChildren ();
630 GetIndexOfChildWithName (const ConstString &name);
633 ~LibstdcppVectorBoolSyntheticFrontEnd ();
635 ExecutionContextRef m_exe_ctx_ref;
637 lldb::addr_t m_base_data_address;
638 EvaluateExpressionOptions m_options;
641 SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
643 class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
646 LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
649 CalculateNumChildren ();
651 virtual lldb::ValueObjectSP
652 GetChildAtIndex (size_t idx);
658 MightHaveChildren ();
661 GetIndexOfChildWithName (const ConstString &name);
664 ~LibstdcppMapIteratorSyntheticFrontEnd ();
666 ExecutionContextRef m_exe_ctx_ref;
667 lldb::addr_t m_pair_address;
668 ClangASTType m_pair_type;
669 EvaluateExpressionOptions m_options;
670 lldb::ValueObjectSP m_pair_sp;
673 SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
675 class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
678 LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
681 CalculateNumChildren ();
683 virtual lldb::ValueObjectSP
684 GetChildAtIndex (size_t idx);
690 MightHaveChildren ();
693 GetIndexOfChildWithName (const ConstString &name);
696 ~LibCxxMapIteratorSyntheticFrontEnd ();
698 ValueObject *m_pair_ptr;
701 SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
703 class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
706 VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp,
707 ConstString item_name);
710 CalculateNumChildren ();
712 virtual lldb::ValueObjectSP
713 GetChildAtIndex (size_t idx);
719 MightHaveChildren ();
722 GetIndexOfChildWithName (const ConstString &name);
725 ~VectorIteratorSyntheticFrontEnd ();
727 ExecutionContextRef m_exe_ctx_ref;
728 ConstString m_item_name;
729 lldb::ValueObjectSP m_item_sp;
732 SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
734 SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
736 class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd
739 LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
742 CalculateNumChildren ();
744 virtual lldb::ValueObjectSP
745 GetChildAtIndex (size_t idx);
751 MightHaveChildren ();
754 GetIndexOfChildWithName (const ConstString &name);
757 ~LibcxxSharedPtrSyntheticFrontEnd ();
759 ValueObject* m_cntrl;
760 lldb::ValueObjectSP m_count_sp;
761 lldb::ValueObjectSP m_weak_count_sp;
763 lldb::ByteOrder m_byte_order;
766 SyntheticChildrenFrontEnd* LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
768 class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
771 LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
774 CalculateNumChildren ();
776 virtual lldb::ValueObjectSP
777 GetChildAtIndex (size_t idx);
783 MightHaveChildren ();
786 GetIndexOfChildWithName (const ConstString &name);
789 ~LibcxxStdVectorSyntheticFrontEnd ();
791 ValueObject* m_start;
792 ValueObject* m_finish;
793 ClangASTType m_element_type;
794 uint32_t m_element_size;
795 std::map<size_t,lldb::ValueObjectSP> m_children;
798 SyntheticChildrenFrontEnd* LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
800 class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd
803 LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
806 CalculateNumChildren ();
808 virtual lldb::ValueObjectSP
809 GetChildAtIndex (size_t idx);
815 MightHaveChildren ();
818 GetIndexOfChildWithName (const ConstString &name);
821 ~LibcxxStdListSyntheticFrontEnd ();
826 size_t m_list_capping_size;
827 static const bool g_use_loop_detect = true;
828 lldb::addr_t m_node_address;
831 ClangASTType m_element_type;
833 std::map<size_t,lldb::ValueObjectSP> m_children;
836 SyntheticChildrenFrontEnd* LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
838 class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd
841 LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
844 CalculateNumChildren ();
846 virtual lldb::ValueObjectSP
847 GetChildAtIndex (size_t idx);
853 MightHaveChildren ();
856 GetIndexOfChildWithName (const ConstString &name);
859 ~LibcxxStdMapSyntheticFrontEnd ();
865 GetValueOffset (const lldb::ValueObjectSP& node);
868 ValueObject* m_root_node;
869 ClangASTType m_element_type;
870 uint32_t m_skip_size;
872 std::map<size_t,lldb::ValueObjectSP> m_children;
875 SyntheticChildrenFrontEnd* LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
877 class LibcxxStdUnorderedMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd
880 LibcxxStdUnorderedMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
883 CalculateNumChildren ();
885 virtual lldb::ValueObjectSP
886 GetChildAtIndex (size_t idx);
892 MightHaveChildren ();
895 GetIndexOfChildWithName (const ConstString &name);
898 ~LibcxxStdUnorderedMapSyntheticFrontEnd ();
902 size_t m_num_elements;
903 ValueObject* m_next_element;
904 std::map<size_t,lldb::ValueObjectSP> m_children;
905 std::vector<std::pair<ValueObject*, uint64_t> > m_elements_cache;
908 SyntheticChildrenFrontEnd* LibcxxStdUnorderedMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
910 } // namespace formatters
911 } // namespace lldb_private
913 #endif // liblldb_CXXFormatterFunctions_h_