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