Type.h revision 262528
11590Srgrimes//===-- Type.h --------------------------------------------------*- C++ -*-===// 250477Speter// 31590Srgrimes// The LLVM Compiler Infrastructure 41590Srgrimes// 535745Sbde// This file is distributed under the University of Illinois Open Source 6146261Sru// License. See LICENSE.TXT for details. 72474Sache// 8249657Sed//===----------------------------------------------------------------------===// 9249657Sed 101590Srgrimes#ifndef liblldb_Type_h_ 11#define liblldb_Type_h_ 12 13#include "lldb/lldb-private.h" 14#include "lldb/Core/ClangForward.h" 15#include "lldb/Core/ConstString.h" 16#include "lldb/Core/UserID.h" 17#include "lldb/Symbol/ClangASTType.h" 18#include "lldb/Symbol/Declaration.h" 19 20#include <set> 21 22namespace lldb_private { 23 24class SymbolFileType : 25 public std::enable_shared_from_this<SymbolFileType>, 26 public UserID 27 { 28 public: 29 SymbolFileType (SymbolFile &symbol_file, lldb::user_id_t uid) : 30 UserID (uid), 31 m_symbol_file (symbol_file) 32 { 33 } 34 35 ~SymbolFileType () 36 { 37 } 38 39 Type * 40 operator->() 41 { 42 return GetType (); 43 } 44 45 Type * 46 GetType (); 47 48 protected: 49 SymbolFile &m_symbol_file; 50 lldb::TypeSP m_type_sp; 51 }; 52 53class Type : 54 public std::enable_shared_from_this<Type>, 55 public UserID 56{ 57public: 58 typedef enum EncodingDataTypeTag 59 { 60 eEncodingInvalid, 61 eEncodingIsUID, ///< This type is the type whose UID is m_encoding_uid 62 eEncodingIsConstUID, ///< This type is the type whose UID is m_encoding_uid with the const qualifier added 63 eEncodingIsRestrictUID, ///< This type is the type whose UID is m_encoding_uid with the restrict qualifier added 64 eEncodingIsVolatileUID, ///< This type is the type whose UID is m_encoding_uid with the volatile qualifier added 65 eEncodingIsTypedefUID, ///< This type is pointer to a type whose UID is m_encoding_uid 66 eEncodingIsPointerUID, ///< This type is pointer to a type whose UID is m_encoding_uid 67 eEncodingIsLValueReferenceUID, ///< This type is L value reference to a type whose UID is m_encoding_uid 68 eEncodingIsRValueReferenceUID, ///< This type is R value reference to a type whose UID is m_encoding_uid 69 eEncodingIsSyntheticUID 70 } EncodingDataType; 71 72 typedef enum ResolveStateTag 73 { 74 eResolveStateUnresolved = 0, 75 eResolveStateForward = 1, 76 eResolveStateLayout = 2, 77 eResolveStateFull = 3 78 } ResolveState; 79 80 Type (lldb::user_id_t uid, 81 SymbolFile* symbol_file, 82 const ConstString &name, 83 uint64_t byte_size, 84 SymbolContextScope *context, 85 lldb::user_id_t encoding_uid, 86 EncodingDataType encoding_uid_type, 87 const Declaration& decl, 88 const ClangASTType &clang_qual_type, 89 ResolveState clang_type_resolve_state); 90 91 // This makes an invalid type. Used for functions that return a Type when they 92 // get an error. 93 Type(); 94 95 Type (const Type &rhs); 96 97 const Type& 98 operator= (const Type& rhs); 99 100 void 101 Dump(Stream *s, bool show_context); 102 103 void 104 DumpTypeName(Stream *s); 105 106 107 void 108 GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name); 109 110 SymbolFile * 111 GetSymbolFile() 112 { 113 return m_symbol_file; 114 } 115 const SymbolFile * 116 GetSymbolFile() const 117 { 118 return m_symbol_file; 119 } 120 121 TypeList* 122 GetTypeList(); 123 124 const ConstString& 125 GetName(); 126 127 uint64_t 128 GetByteSize(); 129 130 uint32_t 131 GetNumChildren (bool omit_empty_base_classes); 132 133 bool 134 IsAggregateType (); 135 136 bool 137 IsValidType () 138 { 139 return m_encoding_uid_type != eEncodingInvalid; 140 } 141 142 bool 143 IsTypedef () 144 { 145 return m_encoding_uid_type == eEncodingIsTypedefUID; 146 } 147 148 lldb::TypeSP 149 GetTypedefType(); 150 151 const ConstString & 152 GetName () const 153 { 154 return m_name; 155 } 156 157 ConstString 158 GetQualifiedName (); 159 160 void 161 DumpValue(ExecutionContext *exe_ctx, 162 Stream *s, 163 const DataExtractor &data, 164 uint32_t data_offset, 165 bool show_type, 166 bool show_summary, 167 bool verbose, 168 lldb::Format format = lldb::eFormatDefault); 169 170 bool 171 DumpValueInMemory(ExecutionContext *exe_ctx, 172 Stream *s, 173 lldb::addr_t address, 174 AddressType address_type, 175 bool show_types, 176 bool show_summary, 177 bool verbose); 178 179 bool 180 ReadFromMemory (ExecutionContext *exe_ctx, 181 lldb::addr_t address, 182 AddressType address_type, 183 DataExtractor &data); 184 185 bool 186 WriteToMemory (ExecutionContext *exe_ctx, 187 lldb::addr_t address, 188 AddressType address_type, 189 DataExtractor &data); 190 191 bool 192 GetIsDeclaration() const; 193 194 void 195 SetIsDeclaration(bool b); 196 197 bool 198 GetIsExternal() const; 199 200 void 201 SetIsExternal(bool b); 202 203 lldb::Format 204 GetFormat (); 205 206 lldb::Encoding 207 GetEncoding (uint64_t &count); 208 209 SymbolContextScope * 210 GetSymbolContextScope() 211 { 212 return m_context; 213 } 214 const SymbolContextScope * 215 GetSymbolContextScope() const 216 { 217 return m_context; 218 } 219 void 220 SetSymbolContextScope(SymbolContextScope *context) 221 { 222 m_context = context; 223 } 224 225 const lldb_private::Declaration & 226 GetDeclaration () const; 227 228 // Get the clang type, and resolve definitions for any 229 // class/struct/union/enum types completely. 230 ClangASTType 231 GetClangFullType (); 232 233 // Get the clang type, and resolve definitions enough so that the type could 234 // have layout performed. This allows ptrs and refs to class/struct/union/enum 235 // types remain forward declarations. 236 ClangASTType 237 GetClangLayoutType (); 238 239 // Get the clang type and leave class/struct/union/enum types as forward 240 // declarations if they haven't already been fully defined. 241 ClangASTType 242 GetClangForwardType (); 243 244 ClangASTContext & 245 GetClangASTContext (); 246 247 static int 248 Compare(const Type &a, const Type &b); 249 250 // From a fully qualified typename, split the type into the type basename 251 // and the remaining type scope (namespaces/classes). 252 static bool 253 GetTypeScopeAndBasename (const char* &name_cstr, 254 std::string &scope, 255 std::string &basename, 256 lldb::TypeClass &type_class); 257 void 258 SetEncodingType (Type *encoding_type) 259 { 260 m_encoding_type = encoding_type; 261 } 262 263 uint32_t 264 GetEncodingMask (); 265 266 ClangASTType 267 CreateClangTypedefType (Type *typedef_type, Type *base_type); 268 269 bool 270 IsRealObjCClass(); 271 272 bool 273 IsCompleteObjCClass() 274 { 275 return m_flags.is_complete_objc_class; 276 } 277 278 void 279 SetIsCompleteObjCClass(bool is_complete_objc_class) 280 { 281 m_flags.is_complete_objc_class = is_complete_objc_class; 282 } 283 284protected: 285 ConstString m_name; 286 SymbolFile *m_symbol_file; 287 SymbolContextScope *m_context; // The symbol context in which this type is defined 288 Type *m_encoding_type; 289 lldb::user_id_t m_encoding_uid; 290 EncodingDataType m_encoding_uid_type; 291 uint64_t m_byte_size; 292 Declaration m_decl; 293 ClangASTType m_clang_type; 294 295 struct Flags { 296 ResolveState clang_type_resolve_state : 2; 297 bool is_complete_objc_class : 1; 298 } m_flags; 299 300 Type * 301 GetEncodingType (); 302 303 bool 304 ResolveClangType (ResolveState clang_type_resolve_state); 305}; 306 307// these classes are used to back the SBType* objects 308 309class TypePair { 310private: 311 ClangASTType clang_type; 312 lldb::TypeSP type_sp; 313 314public: 315 TypePair () : clang_type(), type_sp() {} 316 TypePair (ClangASTType type) : 317 clang_type(type), 318 type_sp() 319 { 320 } 321 322 TypePair (lldb::TypeSP type) : 323 clang_type(), 324 type_sp(type) 325 { 326 clang_type = type_sp->GetClangForwardType(); 327 } 328 329 bool 330 IsValid () const 331 { 332 return clang_type.IsValid() || (type_sp.get() != nullptr); 333 } 334 335 explicit operator bool () const 336 { 337 return IsValid(); 338 } 339 340 bool 341 operator == (const TypePair& rhs) const 342 { 343 return clang_type == rhs.clang_type && 344 type_sp.get() == rhs.type_sp.get(); 345 } 346 347 bool 348 operator != (const TypePair& rhs) const 349 { 350 return clang_type != rhs.clang_type || 351 type_sp.get() != rhs.type_sp.get(); 352 } 353 354 void 355 Clear () 356 { 357 clang_type.Clear(); 358 type_sp.reset(); 359 } 360 361 ConstString 362 GetName () const 363 { 364 if (type_sp) 365 return type_sp->GetName(); 366 if (clang_type) 367 return clang_type.GetTypeName(); 368 return ConstString (); 369 } 370 371 void 372 SetType (ClangASTType type) 373 { 374 type_sp.reset(); 375 clang_type = type; 376 } 377 378 void 379 SetType (lldb::TypeSP type) 380 { 381 type_sp = type; 382 clang_type = type_sp->GetClangForwardType(); 383 } 384 385 lldb::TypeSP 386 GetTypeSP () const 387 { 388 return type_sp; 389 } 390 391 ClangASTType 392 GetClangASTType () const 393 { 394 return clang_type; 395 } 396 397 ClangASTType 398 GetPointerType () const 399 { 400 if (type_sp) 401 return type_sp->GetClangLayoutType().GetPointerType(); 402 return clang_type.GetPointerType(); 403 } 404 405 ClangASTType 406 GetPointeeType () const 407 { 408 if (type_sp) 409 return type_sp->GetClangFullType().GetPointeeType(); 410 return clang_type.GetPointeeType(); 411 } 412 413 ClangASTType 414 GetReferenceType () const 415 { 416 if (type_sp) 417 return type_sp->GetClangLayoutType().GetLValueReferenceType(); 418 return clang_type.GetLValueReferenceType(); 419 } 420 421 ClangASTType 422 GetTypedefedType () const 423 { 424 if (type_sp) 425 return type_sp->GetClangFullType().GetTypedefedType(); 426 return clang_type.GetTypedefedType(); 427 } 428 429 ClangASTType 430 GetDereferencedType () const 431 { 432 if (type_sp) 433 return type_sp->GetClangFullType().GetNonReferenceType(); 434 return clang_type.GetNonReferenceType(); 435 } 436 437 ClangASTType 438 GetUnqualifiedType () const 439 { 440 if (type_sp) 441 return type_sp->GetClangLayoutType().GetFullyUnqualifiedType(); 442 return clang_type.GetFullyUnqualifiedType(); 443 } 444 445 ClangASTType 446 GetCanonicalType () const 447 { 448 if (type_sp) 449 return type_sp->GetClangFullType().GetCanonicalType(); 450 return clang_type.GetCanonicalType(); 451 } 452 453 clang::ASTContext * 454 GetClangASTContext () const 455 { 456 return clang_type.GetASTContext(); 457 } 458}; 459 460class TypeImpl 461{ 462public: 463 464 TypeImpl(); 465 466 ~TypeImpl () {} 467 468 TypeImpl(const TypeImpl& rhs); 469 470 TypeImpl (lldb::TypeSP type_sp); 471 472 TypeImpl (ClangASTType clang_type); 473 474 TypeImpl (lldb::TypeSP type_sp, ClangASTType dynamic); 475 476 TypeImpl (ClangASTType clang_type, ClangASTType dynamic); 477 478 TypeImpl (TypePair pair, ClangASTType dynamic); 479 480 void 481 SetType (lldb::TypeSP type_sp); 482 483 void 484 SetType (ClangASTType clang_type); 485 486 void 487 SetType (lldb::TypeSP type_sp, ClangASTType dynamic); 488 489 void 490 SetType (ClangASTType clang_type, ClangASTType dynamic); 491 492 void 493 SetType (TypePair pair, ClangASTType dynamic); 494 495 TypeImpl& 496 operator = (const TypeImpl& rhs); 497 498 bool 499 operator == (const TypeImpl& rhs) const; 500 501 bool 502 operator != (const TypeImpl& rhs) const; 503 504 bool 505 IsValid() const; 506 507 explicit operator bool () const; 508 509 void Clear(); 510 511 ConstString 512 GetName () const; 513 514 TypeImpl 515 GetPointerType () const; 516 517 TypeImpl 518 GetPointeeType () const; 519 520 TypeImpl 521 GetReferenceType () const; 522 523 TypeImpl 524 GetTypedefedType () const; 525 526 TypeImpl 527 GetDereferencedType () const; 528 529 TypeImpl 530 GetUnqualifiedType() const; 531 532 TypeImpl 533 GetCanonicalType() const; 534 535 ClangASTType 536 GetClangASTType (bool prefer_dynamic); 537 538 clang::ASTContext * 539 GetClangASTContext (bool prefer_dynamic); 540 541 bool 542 GetDescription (lldb_private::Stream &strm, 543 lldb::DescriptionLevel description_level); 544 545private: 546 TypePair m_static_type; 547 ClangASTType m_dynamic_type; 548}; 549 550class TypeListImpl 551{ 552public: 553 TypeListImpl() : 554 m_content() 555 { 556 } 557 558 void 559 Append (const lldb::TypeImplSP& type) 560 { 561 m_content.push_back(type); 562 } 563 564 class AppendVisitor 565 { 566 public: 567 AppendVisitor(TypeListImpl &type_list) : 568 m_type_list(type_list) 569 { 570 } 571 572 void 573 operator() (const lldb::TypeImplSP& type) 574 { 575 m_type_list.Append(type); 576 } 577 578 private: 579 TypeListImpl &m_type_list; 580 }; 581 582 void 583 Append (const lldb_private::TypeList &type_list); 584 585 lldb::TypeImplSP 586 GetTypeAtIndex(size_t idx) 587 { 588 lldb::TypeImplSP type_sp; 589 if (idx < GetSize()) 590 type_sp = m_content[idx]; 591 return type_sp; 592 } 593 594 size_t 595 GetSize() 596 { 597 return m_content.size(); 598 } 599 600private: 601 std::vector<lldb::TypeImplSP> m_content; 602}; 603 604class TypeMemberImpl 605{ 606public: 607 TypeMemberImpl () : 608 m_type_impl_sp (), 609 m_bit_offset (0), 610 m_name (), 611 m_bitfield_bit_size (0), 612 m_is_bitfield (false) 613 614 { 615 } 616 617 TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp, 618 uint64_t bit_offset, 619 const ConstString &name, 620 uint32_t bitfield_bit_size = 0, 621 bool is_bitfield = false) : 622 m_type_impl_sp (type_impl_sp), 623 m_bit_offset (bit_offset), 624 m_name (name), 625 m_bitfield_bit_size (bitfield_bit_size), 626 m_is_bitfield (is_bitfield) 627 { 628 } 629 630 TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp, 631 uint64_t bit_offset): 632 m_type_impl_sp (type_impl_sp), 633 m_bit_offset (bit_offset), 634 m_name (), 635 m_bitfield_bit_size (0), 636 m_is_bitfield (false) 637 { 638 if (m_type_impl_sp) 639 m_name = m_type_impl_sp->GetName(); 640 } 641 642 const lldb::TypeImplSP & 643 GetTypeImpl () 644 { 645 return m_type_impl_sp; 646 } 647 648 const ConstString & 649 GetName () const 650 { 651 return m_name; 652 } 653 654 uint64_t 655 GetBitOffset () const 656 { 657 return m_bit_offset; 658 } 659 660 uint32_t 661 GetBitfieldBitSize () const 662 { 663 return m_bitfield_bit_size; 664 } 665 666 void 667 SetBitfieldBitSize (uint32_t bitfield_bit_size) 668 { 669 m_bitfield_bit_size = bitfield_bit_size; 670 } 671 672 bool 673 GetIsBitfield () const 674 { 675 return m_is_bitfield; 676 } 677 678 void 679 SetIsBitfield (bool is_bitfield) 680 { 681 m_is_bitfield = is_bitfield; 682 } 683 684protected: 685 lldb::TypeImplSP m_type_impl_sp; 686 uint64_t m_bit_offset; 687 ConstString m_name; 688 uint32_t m_bitfield_bit_size; // Bit size for bitfield members only 689 bool m_is_bitfield; 690}; 691 692 693/// 694/// Sometimes you can find the name of the type corresponding to an object, but we don't have debug 695/// information for it. If that is the case, you can return one of these objects, and then if it 696/// has a full type, you can use that, but if not at least you can print the name for informational 697/// purposes. 698/// 699 700class TypeAndOrName 701{ 702public: 703 TypeAndOrName (); 704 TypeAndOrName (lldb::TypeSP &type_sp); 705 TypeAndOrName (const ClangASTType &clang_type); 706 TypeAndOrName (const char *type_str); 707 TypeAndOrName (const TypeAndOrName &rhs); 708 TypeAndOrName (ConstString &type_const_string); 709 710 TypeAndOrName & 711 operator= (const TypeAndOrName &rhs); 712 713 bool 714 operator==(const TypeAndOrName &other) const; 715 716 bool 717 operator!=(const TypeAndOrName &other) const; 718 719 ConstString GetName () const; 720 721 lldb::TypeSP 722 GetTypeSP () const 723 { 724 return m_type_pair.GetTypeSP(); 725 } 726 727 ClangASTType 728 GetClangASTType () const 729 { 730 return m_type_pair.GetClangASTType(); 731 } 732 733 void 734 SetName (const ConstString &type_name); 735 736 void 737 SetName (const char *type_name_cstr); 738 739 void 740 SetTypeSP (lldb::TypeSP type_sp); 741 742 void 743 SetClangASTType (ClangASTType clang_type); 744 745 bool 746 IsEmpty () const; 747 748 bool 749 HasName () const; 750 751 bool 752 HasTypeSP () const; 753 754 bool 755 HasClangASTType () const; 756 757 bool 758 HasType () const 759 { 760 return HasTypeSP() || HasClangASTType(); 761 } 762 763 void 764 Clear (); 765 766 explicit operator bool () 767 { 768 return !IsEmpty(); 769 } 770 771private: 772 TypePair m_type_pair; 773 ConstString m_type_name; 774}; 775 776} // namespace lldb_private 777 778#endif // liblldb_Type_h_ 779 780