CXXFormatterFunctions.h revision 269024
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 <time.h> 15 16#include "lldb/lldb-forward.h" 17 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" 23 24#include "clang/AST/ASTContext.h" 25 26namespace lldb_private { 27 namespace formatters 28 { 29 bool 30 ExtractValueFromObjCExpression (ValueObject &valobj, 31 const char* target_type, 32 const char* selector, 33 uint64_t &value); 34 35 bool 36 ExtractSummaryFromObjCExpression (ValueObject &valobj, 37 const char* target_type, 38 const char* selector, 39 Stream &stream); 40 41 lldb::ValueObjectSP 42 CallSelectorOnObject (ValueObject &valobj, 43 const char* return_type, 44 const char* selector, 45 uint64_t index); 46 47 lldb::ValueObjectSP 48 CallSelectorOnObject (ValueObject &valobj, 49 const char* return_type, 50 const char* selector, 51 const char* key); 52 53 size_t 54 ExtractIndexFromString (const char* item_name); 55 56 time_t 57 GetOSXEpoch (); 58 59 bool 60 Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar* 61 62 bool 63 Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t* 64 65 bool 66 WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t* 67 68 bool 69 Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar 70 71 bool 72 Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t 73 74 bool 75 WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t 76 77 bool 78 LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string 79 80 bool 81 LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring 82 83 bool 84 LibcxxSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::shared_ptr<> and std::weak_ptr<> 85 86 bool 87 ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream); 88 89 SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 90 91 template<bool name_entries> 92 bool 93 NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream); 94 95 bool 96 NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream); 97 98 bool 99 NSArraySummaryProvider (ValueObject& valobj, Stream& stream); 100 101 template<bool cf_style> 102 bool 103 NSSetSummaryProvider (ValueObject& valobj, Stream& stream); 104 105 template<bool needs_at> 106 bool 107 NSDataSummaryProvider (ValueObject& valobj, Stream& stream); 108 109 bool 110 NSNumberSummaryProvider (ValueObject& valobj, Stream& stream); 111 112 bool 113 NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream); 114 115 bool 116 NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream); 117 118 bool 119 NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream); 120 121 bool 122 CFBagSummaryProvider (ValueObject& valobj, Stream& stream); 123 124 bool 125 CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream); 126 127 bool 128 CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream); 129 130 bool 131 NSDateSummaryProvider (ValueObject& valobj, Stream& stream); 132 133 bool 134 CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream); 135 136 bool 137 NSBundleSummaryProvider (ValueObject& valobj, Stream& stream); 138 139 bool 140 NSStringSummaryProvider (ValueObject& valobj, Stream& stream); 141 142 bool 143 NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream); 144 145 bool 146 NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream); 147 148 bool 149 NSURLSummaryProvider (ValueObject& valobj, Stream& stream); 150 151 bool 152 ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream); 153 154 template <bool is_sel_ptr> 155 bool 156 ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream); 157 158 bool 159 RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream); 160 161 extern template bool 162 NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ; 163 164 extern template bool 165 NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ; 166 167 extern template bool 168 NSDataSummaryProvider<true> (ValueObject&, Stream&) ; 169 170 extern template bool 171 NSDataSummaryProvider<false> (ValueObject&, Stream&) ; 172 173 extern template bool 174 ObjCSELSummaryProvider<true> (ValueObject&, Stream&); 175 176 extern template bool 177 ObjCSELSummaryProvider<false> (ValueObject&, Stream&); 178 179 class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd 180 { 181 private: 182 struct DataDescriptor_32 183 { 184 uint32_t _used; 185 uint32_t _priv1 : 2 ; 186 uint32_t _size : 30; 187 uint32_t _priv2 : 2; 188 uint32_t offset : 30; 189 uint32_t _priv3; 190 uint32_t _data; 191 }; 192 struct DataDescriptor_64 193 { 194 uint64_t _used; 195 uint64_t _priv1 : 2 ; 196 uint64_t _size : 62; 197 uint64_t _priv2 : 2; 198 uint64_t offset : 62; 199 uint32_t _priv3; 200 uint64_t _data; 201 }; 202 public: 203 NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 204 205 virtual size_t 206 CalculateNumChildren (); 207 208 virtual lldb::ValueObjectSP 209 GetChildAtIndex (size_t idx); 210 211 virtual bool 212 Update(); 213 214 virtual bool 215 MightHaveChildren (); 216 217 virtual size_t 218 GetIndexOfChildWithName (const ConstString &name); 219 220 virtual 221 ~NSArrayMSyntheticFrontEnd (); 222 private: 223 ExecutionContextRef m_exe_ctx_ref; 224 uint8_t m_ptr_size; 225 DataDescriptor_32 *m_data_32; 226 DataDescriptor_64 *m_data_64; 227 ClangASTType m_id_type; 228 std::vector<lldb::ValueObjectSP> m_children; 229 }; 230 231 class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd 232 { 233 public: 234 NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 235 236 virtual size_t 237 CalculateNumChildren (); 238 239 virtual lldb::ValueObjectSP 240 GetChildAtIndex (size_t idx); 241 242 virtual bool 243 Update(); 244 245 virtual bool 246 MightHaveChildren (); 247 248 virtual size_t 249 GetIndexOfChildWithName (const ConstString &name); 250 251 virtual 252 ~NSArrayISyntheticFrontEnd (); 253 private: 254 ExecutionContextRef m_exe_ctx_ref; 255 uint8_t m_ptr_size; 256 uint64_t m_items; 257 lldb::addr_t m_data_ptr; 258 ClangASTType m_id_type; 259 std::vector<lldb::ValueObjectSP> m_children; 260 }; 261 262 class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd 263 { 264 public: 265 NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 266 267 virtual size_t 268 CalculateNumChildren (); 269 270 virtual lldb::ValueObjectSP 271 GetChildAtIndex (size_t idx); 272 273 virtual bool 274 Update(); 275 276 virtual bool 277 MightHaveChildren (); 278 279 virtual size_t 280 GetIndexOfChildWithName (const ConstString &name); 281 282 virtual 283 ~NSArrayCodeRunningSyntheticFrontEnd (); 284 }; 285 286 SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 287 288 class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd 289 { 290 private: 291 struct DataDescriptor_32 292 { 293 uint32_t _used : 26; 294 uint32_t _szidx : 6; 295 }; 296 struct DataDescriptor_64 297 { 298 uint64_t _used : 58; 299 uint32_t _szidx : 6; 300 }; 301 302 struct DictionaryItemDescriptor 303 { 304 lldb::addr_t key_ptr; 305 lldb::addr_t val_ptr; 306 lldb::ValueObjectSP valobj_sp; 307 }; 308 309 public: 310 NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 311 312 virtual size_t 313 CalculateNumChildren (); 314 315 virtual lldb::ValueObjectSP 316 GetChildAtIndex (size_t idx); 317 318 virtual bool 319 Update(); 320 321 virtual bool 322 MightHaveChildren (); 323 324 virtual size_t 325 GetIndexOfChildWithName (const ConstString &name); 326 327 virtual 328 ~NSDictionaryISyntheticFrontEnd (); 329 private: 330 ExecutionContextRef m_exe_ctx_ref; 331 uint8_t m_ptr_size; 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; 338 }; 339 340 class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd 341 { 342 private: 343 struct DataDescriptor_32 344 { 345 uint32_t _used : 26; 346 uint32_t _kvo : 1; 347 uint32_t _size; 348 uint32_t _mutations; 349 uint32_t _objs_addr; 350 uint32_t _keys_addr; 351 }; 352 struct DataDescriptor_64 353 { 354 uint64_t _used : 58; 355 uint32_t _kvo : 1; 356 uint64_t _size; 357 uint64_t _mutations; 358 uint64_t _objs_addr; 359 uint64_t _keys_addr; 360 }; 361 struct DictionaryItemDescriptor 362 { 363 lldb::addr_t key_ptr; 364 lldb::addr_t val_ptr; 365 lldb::ValueObjectSP valobj_sp; 366 }; 367 public: 368 NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 369 370 virtual size_t 371 CalculateNumChildren (); 372 373 virtual lldb::ValueObjectSP 374 GetChildAtIndex (size_t idx); 375 376 virtual bool 377 Update(); 378 379 virtual bool 380 MightHaveChildren (); 381 382 virtual size_t 383 GetIndexOfChildWithName (const ConstString &name); 384 385 virtual 386 ~NSDictionaryMSyntheticFrontEnd (); 387 private: 388 ExecutionContextRef m_exe_ctx_ref; 389 uint8_t m_ptr_size; 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; 395 }; 396 397 class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd 398 { 399 public: 400 NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 401 402 virtual size_t 403 CalculateNumChildren (); 404 405 virtual lldb::ValueObjectSP 406 GetChildAtIndex (size_t idx); 407 408 virtual bool 409 Update(); 410 411 virtual bool 412 MightHaveChildren (); 413 414 virtual size_t 415 GetIndexOfChildWithName (const ConstString &name); 416 417 virtual 418 ~NSDictionaryCodeRunningSyntheticFrontEnd (); 419 }; 420 421 SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 422 423 class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd 424 { 425 private: 426 struct DataDescriptor_32 427 { 428 uint32_t _used : 26; 429 uint32_t _szidx : 6; 430 }; 431 struct DataDescriptor_64 432 { 433 uint64_t _used : 58; 434 uint32_t _szidx : 6; 435 }; 436 437 struct SetItemDescriptor 438 { 439 lldb::addr_t item_ptr; 440 lldb::ValueObjectSP valobj_sp; 441 }; 442 443 public: 444 NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 445 446 virtual size_t 447 CalculateNumChildren (); 448 449 virtual lldb::ValueObjectSP 450 GetChildAtIndex (size_t idx); 451 452 virtual bool 453 Update(); 454 455 virtual bool 456 MightHaveChildren (); 457 458 virtual size_t 459 GetIndexOfChildWithName (const ConstString &name); 460 461 virtual 462 ~NSSetISyntheticFrontEnd (); 463 private: 464 ExecutionContextRef m_exe_ctx_ref; 465 uint8_t m_ptr_size; 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; 470 }; 471 472 class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd 473 { 474 private: 475 476 public: 477 NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 478 479 virtual size_t 480 CalculateNumChildren (); 481 482 virtual lldb::ValueObjectSP 483 GetChildAtIndex (size_t idx); 484 485 virtual bool 486 Update(); 487 488 virtual bool 489 MightHaveChildren (); 490 491 virtual size_t 492 GetIndexOfChildWithName (const ConstString &name); 493 494 virtual 495 ~NSOrderedSetSyntheticFrontEnd (); 496 private: 497 uint32_t m_count; 498 std::map<uint32_t,lldb::ValueObjectSP> m_children; 499 }; 500 501 class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd 502 { 503 private: 504 struct DataDescriptor_32 505 { 506 uint32_t _used : 26; 507 uint32_t _size; 508 uint32_t _mutations; 509 uint32_t _objs_addr; 510 }; 511 struct DataDescriptor_64 512 { 513 uint64_t _used : 58; 514 uint64_t _size; 515 uint64_t _mutations; 516 uint64_t _objs_addr; 517 }; 518 struct SetItemDescriptor 519 { 520 lldb::addr_t item_ptr; 521 lldb::ValueObjectSP valobj_sp; 522 }; 523 public: 524 NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 525 526 virtual size_t 527 CalculateNumChildren (); 528 529 virtual lldb::ValueObjectSP 530 GetChildAtIndex (size_t idx); 531 532 virtual bool 533 Update(); 534 535 virtual bool 536 MightHaveChildren (); 537 538 virtual size_t 539 GetIndexOfChildWithName (const ConstString &name); 540 541 virtual 542 ~NSSetMSyntheticFrontEnd (); 543 private: 544 ExecutionContextRef m_exe_ctx_ref; 545 uint8_t m_ptr_size; 546 DataDescriptor_32 *m_data_32; 547 DataDescriptor_64 *m_data_64; 548 std::vector<SetItemDescriptor> m_children; 549 }; 550 551 class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd 552 { 553 public: 554 NSSetCodeRunningSyntheticFrontEnd (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 ~NSSetCodeRunningSyntheticFrontEnd (); 573 }; 574 575 SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 576 577 class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd 578 { 579 public: 580 LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 581 582 virtual size_t 583 CalculateNumChildren (); 584 585 virtual lldb::ValueObjectSP 586 GetChildAtIndex (size_t idx); 587 588 virtual bool 589 Update(); 590 591 virtual bool 592 MightHaveChildren (); 593 594 virtual size_t 595 GetIndexOfChildWithName (const ConstString &name); 596 597 virtual 598 ~LibcxxVectorBoolSyntheticFrontEnd (); 599 private: 600 ClangASTType m_bool_type; 601 ExecutionContextRef m_exe_ctx_ref; 602 uint64_t m_count; 603 lldb::addr_t m_base_data_address; 604 std::map<size_t,lldb::ValueObjectSP> m_children; 605 }; 606 607 SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 608 609 bool 610 LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream); 611 612 class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd 613 { 614 public: 615 LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 616 617 virtual size_t 618 CalculateNumChildren (); 619 620 virtual lldb::ValueObjectSP 621 GetChildAtIndex (size_t idx); 622 623 virtual bool 624 Update(); 625 626 virtual bool 627 MightHaveChildren (); 628 629 virtual size_t 630 GetIndexOfChildWithName (const ConstString &name); 631 632 virtual 633 ~LibstdcppVectorBoolSyntheticFrontEnd (); 634 private: 635 ExecutionContextRef m_exe_ctx_ref; 636 uint64_t m_count; 637 lldb::addr_t m_base_data_address; 638 EvaluateExpressionOptions m_options; 639 }; 640 641 SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 642 643 class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd 644 { 645 public: 646 LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 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 ~LibstdcppMapIteratorSyntheticFrontEnd (); 665 private: 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; 671 }; 672 673 SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 674 675 class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd 676 { 677 public: 678 LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 679 680 virtual size_t 681 CalculateNumChildren (); 682 683 virtual lldb::ValueObjectSP 684 GetChildAtIndex (size_t idx); 685 686 virtual bool 687 Update(); 688 689 virtual bool 690 MightHaveChildren (); 691 692 virtual size_t 693 GetIndexOfChildWithName (const ConstString &name); 694 695 virtual 696 ~LibCxxMapIteratorSyntheticFrontEnd (); 697 private: 698 ValueObject *m_pair_ptr; 699 }; 700 701 SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 702 703 class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd 704 { 705 public: 706 VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, 707 ConstString item_name); 708 709 virtual size_t 710 CalculateNumChildren (); 711 712 virtual lldb::ValueObjectSP 713 GetChildAtIndex (size_t idx); 714 715 virtual bool 716 Update(); 717 718 virtual bool 719 MightHaveChildren (); 720 721 virtual size_t 722 GetIndexOfChildWithName (const ConstString &name); 723 724 virtual 725 ~VectorIteratorSyntheticFrontEnd (); 726 private: 727 ExecutionContextRef m_exe_ctx_ref; 728 ConstString m_item_name; 729 lldb::ValueObjectSP m_item_sp; 730 }; 731 732 SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 733 734 SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 735 736 class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd 737 { 738 public: 739 LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 740 741 virtual size_t 742 CalculateNumChildren (); 743 744 virtual lldb::ValueObjectSP 745 GetChildAtIndex (size_t idx); 746 747 virtual bool 748 Update(); 749 750 virtual bool 751 MightHaveChildren (); 752 753 virtual size_t 754 GetIndexOfChildWithName (const ConstString &name); 755 756 virtual 757 ~LibcxxSharedPtrSyntheticFrontEnd (); 758 private: 759 ValueObject* m_cntrl; 760 lldb::ValueObjectSP m_count_sp; 761 lldb::ValueObjectSP m_weak_count_sp; 762 uint8_t m_ptr_size; 763 lldb::ByteOrder m_byte_order; 764 }; 765 766 SyntheticChildrenFrontEnd* LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 767 768 class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd 769 { 770 public: 771 LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 772 773 virtual size_t 774 CalculateNumChildren (); 775 776 virtual lldb::ValueObjectSP 777 GetChildAtIndex (size_t idx); 778 779 virtual bool 780 Update(); 781 782 virtual bool 783 MightHaveChildren (); 784 785 virtual size_t 786 GetIndexOfChildWithName (const ConstString &name); 787 788 virtual 789 ~LibcxxStdVectorSyntheticFrontEnd (); 790 private: 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; 796 }; 797 798 SyntheticChildrenFrontEnd* LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 799 800 class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd 801 { 802 public: 803 LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 804 805 virtual size_t 806 CalculateNumChildren (); 807 808 virtual lldb::ValueObjectSP 809 GetChildAtIndex (size_t idx); 810 811 virtual bool 812 Update(); 813 814 virtual bool 815 MightHaveChildren (); 816 817 virtual size_t 818 GetIndexOfChildWithName (const ConstString &name); 819 820 virtual 821 ~LibcxxStdListSyntheticFrontEnd (); 822 private: 823 bool 824 HasLoop(); 825 826 size_t m_list_capping_size; 827 static const bool g_use_loop_detect = true; 828 lldb::addr_t m_node_address; 829 ValueObject* m_head; 830 ValueObject* m_tail; 831 ClangASTType m_element_type; 832 size_t m_count; 833 std::map<size_t,lldb::ValueObjectSP> m_children; 834 }; 835 836 SyntheticChildrenFrontEnd* LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 837 838 class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd 839 { 840 public: 841 LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 842 843 virtual size_t 844 CalculateNumChildren (); 845 846 virtual lldb::ValueObjectSP 847 GetChildAtIndex (size_t idx); 848 849 virtual bool 850 Update(); 851 852 virtual bool 853 MightHaveChildren (); 854 855 virtual size_t 856 GetIndexOfChildWithName (const ConstString &name); 857 858 virtual 859 ~LibcxxStdMapSyntheticFrontEnd (); 860 private: 861 bool 862 GetDataType(); 863 864 void 865 GetValueOffset (const lldb::ValueObjectSP& node); 866 867 ValueObject* m_tree; 868 ValueObject* m_root_node; 869 ClangASTType m_element_type; 870 uint32_t m_skip_size; 871 size_t m_count; 872 std::map<size_t,lldb::ValueObjectSP> m_children; 873 }; 874 875 SyntheticChildrenFrontEnd* LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 876 877 class LibcxxStdUnorderedMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd 878 { 879 public: 880 LibcxxStdUnorderedMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 881 882 virtual size_t 883 CalculateNumChildren (); 884 885 virtual lldb::ValueObjectSP 886 GetChildAtIndex (size_t idx); 887 888 virtual bool 889 Update(); 890 891 virtual bool 892 MightHaveChildren (); 893 894 virtual size_t 895 GetIndexOfChildWithName (const ConstString &name); 896 897 virtual 898 ~LibcxxStdUnorderedMapSyntheticFrontEnd (); 899 private: 900 901 ValueObject* m_tree; 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; 906 }; 907 908 SyntheticChildrenFrontEnd* LibcxxStdUnorderedMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 909 910 } // namespace formatters 911} // namespace lldb_private 912 913#endif // liblldb_CXXFormatterFunctions_h_ 914