DebugInfoMetadata.h revision 286684
1//===- llvm/IR/DebugInfoMetadata.h - Debug info metadata --------*- 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// Declarations for metadata specific to debug info. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_IR_DEBUGINFOMETADATA_H 15#define LLVM_IR_DEBUGINFOMETADATA_H 16 17#include "llvm/IR/Metadata.h" 18#include "llvm/Support/Dwarf.h" 19 20// Helper macros for defining get() overrides. 21#define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__ 22#define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS 23#define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \ 24 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 25 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \ 26 } \ 27 static CLASS *getIfExists(LLVMContext &Context, \ 28 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 29 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \ 30 /* ShouldCreate */ false); \ 31 } \ 32 static CLASS *getDistinct(LLVMContext &Context, \ 33 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 34 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \ 35 } \ 36 static Temp##CLASS getTemporary(LLVMContext &Context, \ 37 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 38 return Temp##CLASS( \ 39 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \ 40 } 41 42namespace llvm { 43 44/// \brief Pointer union between a subclass of DINode and MDString. 45/// 46/// \a DICompositeType can be referenced via an \a MDString unique identifier. 47/// This class allows some type safety in the face of that, requiring either a 48/// node of a particular type or an \a MDString. 49template <class T> class TypedDINodeRef { 50 const Metadata *MD = nullptr; 51 52public: 53 TypedDINodeRef() = default; 54 TypedDINodeRef(std::nullptr_t) {} 55 56 /// \brief Construct from a raw pointer. 57 explicit TypedDINodeRef(const Metadata *MD) : MD(MD) { 58 assert((!MD || isa<MDString>(MD) || isa<T>(MD)) && "Expected valid ref"); 59 } 60 61 template <class U> 62 TypedDINodeRef( 63 const TypedDINodeRef<U> &X, 64 typename std::enable_if<std::is_convertible<U *, T *>::value>::type * = 65 nullptr) 66 : MD(X) {} 67 68 operator Metadata *() const { return const_cast<Metadata *>(MD); } 69 70 bool operator==(const TypedDINodeRef<T> &X) const { return MD == X.MD; }; 71 bool operator!=(const TypedDINodeRef<T> &X) const { return MD != X.MD; }; 72 73 /// \brief Create a reference. 74 /// 75 /// Get a reference to \c N, using an \a MDString reference if available. 76 static TypedDINodeRef get(const T *N); 77 78 template <class MapTy> T *resolve(const MapTy &Map) const { 79 if (!MD) 80 return nullptr; 81 82 if (auto *Typed = dyn_cast<T>(MD)) 83 return const_cast<T *>(Typed); 84 85 auto *S = cast<MDString>(MD); 86 auto I = Map.find(S); 87 assert(I != Map.end() && "Missing identifier in type map"); 88 return cast<T>(I->second); 89 } 90}; 91 92typedef TypedDINodeRef<DINode> DINodeRef; 93typedef TypedDINodeRef<DIScope> DIScopeRef; 94typedef TypedDINodeRef<DIType> DITypeRef; 95 96class DITypeRefArray { 97 const MDTuple *N = nullptr; 98 99public: 100 DITypeRefArray(const MDTuple *N) : N(N) {} 101 102 explicit operator bool() const { return get(); } 103 explicit operator MDTuple *() const { return get(); } 104 105 MDTuple *get() const { return const_cast<MDTuple *>(N); } 106 MDTuple *operator->() const { return get(); } 107 MDTuple &operator*() const { return *get(); } 108 109 // FIXME: Fix callers and remove condition on N. 110 unsigned size() const { return N ? N->getNumOperands() : 0u; } 111 DITypeRef operator[](unsigned I) const { return DITypeRef(N->getOperand(I)); } 112 113 class iterator : std::iterator<std::input_iterator_tag, DITypeRef, 114 std::ptrdiff_t, void, DITypeRef> { 115 MDNode::op_iterator I = nullptr; 116 117 public: 118 iterator() = default; 119 explicit iterator(MDNode::op_iterator I) : I(I) {} 120 DITypeRef operator*() const { return DITypeRef(*I); } 121 iterator &operator++() { 122 ++I; 123 return *this; 124 } 125 iterator operator++(int) { 126 iterator Temp(*this); 127 ++I; 128 return Temp; 129 } 130 bool operator==(const iterator &X) const { return I == X.I; } 131 bool operator!=(const iterator &X) const { return I != X.I; } 132 }; 133 134 // FIXME: Fix callers and remove condition on N. 135 iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); } 136 iterator end() const { return N ? iterator(N->op_end()) : iterator(); } 137}; 138 139/// \brief Tagged DWARF-like metadata node. 140/// 141/// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*, 142/// defined in llvm/Support/Dwarf.h). Called \a DINode because it's 143/// potentially used for non-DWARF output. 144class DINode : public MDNode { 145 friend class LLVMContextImpl; 146 friend class MDNode; 147 148protected: 149 DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 150 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = None) 151 : MDNode(C, ID, Storage, Ops1, Ops2) { 152 assert(Tag < 1u << 16); 153 SubclassData16 = Tag; 154 } 155 ~DINode() = default; 156 157 template <class Ty> Ty *getOperandAs(unsigned I) const { 158 return cast_or_null<Ty>(getOperand(I)); 159 } 160 161 StringRef getStringOperand(unsigned I) const { 162 if (auto *S = getOperandAs<MDString>(I)) 163 return S->getString(); 164 return StringRef(); 165 } 166 167 static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) { 168 if (S.empty()) 169 return nullptr; 170 return MDString::get(Context, S); 171 } 172 173public: 174 unsigned getTag() const { return SubclassData16; } 175 176 /// \brief Debug info flags. 177 /// 178 /// The three accessibility flags are mutually exclusive and rolled together 179 /// in the first two bits. 180 enum DIFlags { 181#define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID, 182#include "llvm/IR/DebugInfoFlags.def" 183 FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic 184 }; 185 186 static unsigned getFlag(StringRef Flag); 187 static const char *getFlagString(unsigned Flag); 188 189 /// \brief Split up a flags bitfield. 190 /// 191 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns 192 /// any remaining (unrecognized) bits. 193 static unsigned splitFlags(unsigned Flags, 194 SmallVectorImpl<unsigned> &SplitFlags); 195 196 DINodeRef getRef() const { return DINodeRef::get(this); } 197 198 static bool classof(const Metadata *MD) { 199 switch (MD->getMetadataID()) { 200 default: 201 return false; 202 case GenericDINodeKind: 203 case DISubrangeKind: 204 case DIEnumeratorKind: 205 case DIBasicTypeKind: 206 case DIDerivedTypeKind: 207 case DICompositeTypeKind: 208 case DISubroutineTypeKind: 209 case DIFileKind: 210 case DICompileUnitKind: 211 case DISubprogramKind: 212 case DILexicalBlockKind: 213 case DILexicalBlockFileKind: 214 case DINamespaceKind: 215 case DITemplateTypeParameterKind: 216 case DITemplateValueParameterKind: 217 case DIGlobalVariableKind: 218 case DILocalVariableKind: 219 case DIObjCPropertyKind: 220 case DIImportedEntityKind: 221 case DIModuleKind: 222 return true; 223 } 224 } 225}; 226 227template <class T> struct simplify_type<const TypedDINodeRef<T>> { 228 typedef Metadata *SimpleType; 229 static SimpleType getSimplifiedValue(const TypedDINodeRef<T> &MD) { 230 return MD; 231 } 232}; 233 234template <class T> 235struct simplify_type<TypedDINodeRef<T>> 236 : simplify_type<const TypedDINodeRef<T>> {}; 237 238/// \brief Generic tagged DWARF-like metadata node. 239/// 240/// An un-specialized DWARF-like metadata node. The first operand is a 241/// (possibly empty) null-separated \a MDString header that contains arbitrary 242/// fields. The remaining operands are \a dwarf_operands(), and are pointers 243/// to other metadata. 244class GenericDINode : public DINode { 245 friend class LLVMContextImpl; 246 friend class MDNode; 247 248 GenericDINode(LLVMContext &C, StorageType Storage, unsigned Hash, 249 unsigned Tag, ArrayRef<Metadata *> Ops1, 250 ArrayRef<Metadata *> Ops2) 251 : DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) { 252 setHash(Hash); 253 } 254 ~GenericDINode() { dropAllReferences(); } 255 256 void setHash(unsigned Hash) { SubclassData32 = Hash; } 257 void recalculateHash(); 258 259 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag, 260 StringRef Header, ArrayRef<Metadata *> DwarfOps, 261 StorageType Storage, bool ShouldCreate = true) { 262 return getImpl(Context, Tag, getCanonicalMDString(Context, Header), 263 DwarfOps, Storage, ShouldCreate); 264 } 265 266 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag, 267 MDString *Header, ArrayRef<Metadata *> DwarfOps, 268 StorageType Storage, bool ShouldCreate = true); 269 270 TempGenericDINode cloneImpl() const { 271 return getTemporary( 272 getContext(), getTag(), getHeader(), 273 SmallVector<Metadata *, 4>(dwarf_op_begin(), dwarf_op_end())); 274 } 275 276public: 277 unsigned getHash() const { return SubclassData32; } 278 279 DEFINE_MDNODE_GET(GenericDINode, (unsigned Tag, StringRef Header, 280 ArrayRef<Metadata *> DwarfOps), 281 (Tag, Header, DwarfOps)) 282 DEFINE_MDNODE_GET(GenericDINode, (unsigned Tag, MDString *Header, 283 ArrayRef<Metadata *> DwarfOps), 284 (Tag, Header, DwarfOps)) 285 286 /// \brief Return a (temporary) clone of this. 287 TempGenericDINode clone() const { return cloneImpl(); } 288 289 unsigned getTag() const { return SubclassData16; } 290 StringRef getHeader() const { return getStringOperand(0); } 291 292 op_iterator dwarf_op_begin() const { return op_begin() + 1; } 293 op_iterator dwarf_op_end() const { return op_end(); } 294 op_range dwarf_operands() const { 295 return op_range(dwarf_op_begin(), dwarf_op_end()); 296 } 297 298 unsigned getNumDwarfOperands() const { return getNumOperands() - 1; } 299 const MDOperand &getDwarfOperand(unsigned I) const { 300 return getOperand(I + 1); 301 } 302 void replaceDwarfOperandWith(unsigned I, Metadata *New) { 303 replaceOperandWith(I + 1, New); 304 } 305 306 static bool classof(const Metadata *MD) { 307 return MD->getMetadataID() == GenericDINodeKind; 308 } 309}; 310 311/// \brief Array subrange. 312/// 313/// TODO: Merge into node for DW_TAG_array_type, which should have a custom 314/// type. 315class DISubrange : public DINode { 316 friend class LLVMContextImpl; 317 friend class MDNode; 318 319 int64_t Count; 320 int64_t LowerBound; 321 322 DISubrange(LLVMContext &C, StorageType Storage, int64_t Count, 323 int64_t LowerBound) 324 : DINode(C, DISubrangeKind, Storage, dwarf::DW_TAG_subrange_type, None), 325 Count(Count), LowerBound(LowerBound) {} 326 ~DISubrange() = default; 327 328 static DISubrange *getImpl(LLVMContext &Context, int64_t Count, 329 int64_t LowerBound, StorageType Storage, 330 bool ShouldCreate = true); 331 332 TempDISubrange cloneImpl() const { 333 return getTemporary(getContext(), getCount(), getLowerBound()); 334 } 335 336public: 337 DEFINE_MDNODE_GET(DISubrange, (int64_t Count, int64_t LowerBound = 0), 338 (Count, LowerBound)) 339 340 TempDISubrange clone() const { return cloneImpl(); } 341 342 int64_t getLowerBound() const { return LowerBound; } 343 int64_t getCount() const { return Count; } 344 345 static bool classof(const Metadata *MD) { 346 return MD->getMetadataID() == DISubrangeKind; 347 } 348}; 349 350/// \brief Enumeration value. 351/// 352/// TODO: Add a pointer to the context (DW_TAG_enumeration_type) once that no 353/// longer creates a type cycle. 354class DIEnumerator : public DINode { 355 friend class LLVMContextImpl; 356 friend class MDNode; 357 358 int64_t Value; 359 360 DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value, 361 ArrayRef<Metadata *> Ops) 362 : DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops), 363 Value(Value) {} 364 ~DIEnumerator() = default; 365 366 static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value, 367 StringRef Name, StorageType Storage, 368 bool ShouldCreate = true) { 369 return getImpl(Context, Value, getCanonicalMDString(Context, Name), Storage, 370 ShouldCreate); 371 } 372 static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value, 373 MDString *Name, StorageType Storage, 374 bool ShouldCreate = true); 375 376 TempDIEnumerator cloneImpl() const { 377 return getTemporary(getContext(), getValue(), getName()); 378 } 379 380public: 381 DEFINE_MDNODE_GET(DIEnumerator, (int64_t Value, StringRef Name), 382 (Value, Name)) 383 DEFINE_MDNODE_GET(DIEnumerator, (int64_t Value, MDString *Name), 384 (Value, Name)) 385 386 TempDIEnumerator clone() const { return cloneImpl(); } 387 388 int64_t getValue() const { return Value; } 389 StringRef getName() const { return getStringOperand(0); } 390 391 MDString *getRawName() const { return getOperandAs<MDString>(0); } 392 393 static bool classof(const Metadata *MD) { 394 return MD->getMetadataID() == DIEnumeratorKind; 395 } 396}; 397 398/// \brief Base class for scope-like contexts. 399/// 400/// Base class for lexical scopes and types (which are also declaration 401/// contexts). 402/// 403/// TODO: Separate the concepts of declaration contexts and lexical scopes. 404class DIScope : public DINode { 405protected: 406 DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 407 ArrayRef<Metadata *> Ops) 408 : DINode(C, ID, Storage, Tag, Ops) {} 409 ~DIScope() = default; 410 411public: 412 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 413 414 inline StringRef getFilename() const; 415 inline StringRef getDirectory() const; 416 417 StringRef getName() const; 418 DIScopeRef getScope() const; 419 420 /// \brief Return the raw underlying file. 421 /// 422 /// An \a DIFile is an \a DIScope, but it doesn't point at a separate file 423 /// (it\em is the file). If \c this is an \a DIFile, we need to return \c 424 /// this. Otherwise, return the first operand, which is where all other 425 /// subclasses store their file pointer. 426 Metadata *getRawFile() const { 427 return isa<DIFile>(this) ? const_cast<DIScope *>(this) 428 : static_cast<Metadata *>(getOperand(0)); 429 } 430 431 DIScopeRef getRef() const { return DIScopeRef::get(this); } 432 433 static bool classof(const Metadata *MD) { 434 switch (MD->getMetadataID()) { 435 default: 436 return false; 437 case DIBasicTypeKind: 438 case DIDerivedTypeKind: 439 case DICompositeTypeKind: 440 case DISubroutineTypeKind: 441 case DIFileKind: 442 case DICompileUnitKind: 443 case DISubprogramKind: 444 case DILexicalBlockKind: 445 case DILexicalBlockFileKind: 446 case DINamespaceKind: 447 case DIModuleKind: 448 return true; 449 } 450 } 451}; 452 453/// \brief File. 454/// 455/// TODO: Merge with directory/file node (including users). 456/// TODO: Canonicalize paths on creation. 457class DIFile : public DIScope { 458 friend class LLVMContextImpl; 459 friend class MDNode; 460 461 DIFile(LLVMContext &C, StorageType Storage, ArrayRef<Metadata *> Ops) 462 : DIScope(C, DIFileKind, Storage, dwarf::DW_TAG_file_type, Ops) {} 463 ~DIFile() = default; 464 465 static DIFile *getImpl(LLVMContext &Context, StringRef Filename, 466 StringRef Directory, StorageType Storage, 467 bool ShouldCreate = true) { 468 return getImpl(Context, getCanonicalMDString(Context, Filename), 469 getCanonicalMDString(Context, Directory), Storage, 470 ShouldCreate); 471 } 472 static DIFile *getImpl(LLVMContext &Context, MDString *Filename, 473 MDString *Directory, StorageType Storage, 474 bool ShouldCreate = true); 475 476 TempDIFile cloneImpl() const { 477 return getTemporary(getContext(), getFilename(), getDirectory()); 478 } 479 480public: 481 DEFINE_MDNODE_GET(DIFile, (StringRef Filename, StringRef Directory), 482 (Filename, Directory)) 483 DEFINE_MDNODE_GET(DIFile, (MDString * Filename, MDString *Directory), 484 (Filename, Directory)) 485 486 TempDIFile clone() const { return cloneImpl(); } 487 488 StringRef getFilename() const { return getStringOperand(0); } 489 StringRef getDirectory() const { return getStringOperand(1); } 490 491 MDString *getRawFilename() const { return getOperandAs<MDString>(0); } 492 MDString *getRawDirectory() const { return getOperandAs<MDString>(1); } 493 494 static bool classof(const Metadata *MD) { 495 return MD->getMetadataID() == DIFileKind; 496 } 497}; 498 499StringRef DIScope::getFilename() const { 500 if (auto *F = getFile()) 501 return F->getFilename(); 502 return ""; 503} 504 505StringRef DIScope::getDirectory() const { 506 if (auto *F = getFile()) 507 return F->getDirectory(); 508 return ""; 509} 510 511/// \brief Base class for types. 512/// 513/// TODO: Remove the hardcoded name and context, since many types don't use 514/// them. 515/// TODO: Split up flags. 516class DIType : public DIScope { 517 unsigned Line; 518 unsigned Flags; 519 uint64_t SizeInBits; 520 uint64_t AlignInBits; 521 uint64_t OffsetInBits; 522 523protected: 524 DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 525 unsigned Line, uint64_t SizeInBits, uint64_t AlignInBits, 526 uint64_t OffsetInBits, unsigned Flags, ArrayRef<Metadata *> Ops) 527 : DIScope(C, ID, Storage, Tag, Ops), Line(Line), Flags(Flags), 528 SizeInBits(SizeInBits), AlignInBits(AlignInBits), 529 OffsetInBits(OffsetInBits) {} 530 ~DIType() = default; 531 532public: 533 TempDIType clone() const { 534 return TempDIType(cast<DIType>(MDNode::clone().release())); 535 } 536 537 unsigned getLine() const { return Line; } 538 uint64_t getSizeInBits() const { return SizeInBits; } 539 uint64_t getAlignInBits() const { return AlignInBits; } 540 uint64_t getOffsetInBits() const { return OffsetInBits; } 541 unsigned getFlags() const { return Flags; } 542 543 DIScopeRef getScope() const { return DIScopeRef(getRawScope()); } 544 StringRef getName() const { return getStringOperand(2); } 545 546 547 Metadata *getRawScope() const { return getOperand(1); } 548 MDString *getRawName() const { return getOperandAs<MDString>(2); } 549 550 void setFlags(unsigned NewFlags) { 551 assert(!isUniqued() && "Cannot set flags on uniqued nodes"); 552 Flags = NewFlags; 553 } 554 555 bool isPrivate() const { 556 return (getFlags() & FlagAccessibility) == FlagPrivate; 557 } 558 bool isProtected() const { 559 return (getFlags() & FlagAccessibility) == FlagProtected; 560 } 561 bool isPublic() const { 562 return (getFlags() & FlagAccessibility) == FlagPublic; 563 } 564 bool isForwardDecl() const { return getFlags() & FlagFwdDecl; } 565 bool isAppleBlockExtension() const { return getFlags() & FlagAppleBlock; } 566 bool isBlockByrefStruct() const { return getFlags() & FlagBlockByrefStruct; } 567 bool isVirtual() const { return getFlags() & FlagVirtual; } 568 bool isArtificial() const { return getFlags() & FlagArtificial; } 569 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; } 570 bool isObjcClassComplete() const { 571 return getFlags() & FlagObjcClassComplete; 572 } 573 bool isVector() const { return getFlags() & FlagVector; } 574 bool isStaticMember() const { return getFlags() & FlagStaticMember; } 575 bool isLValueReference() const { return getFlags() & FlagLValueReference; } 576 bool isRValueReference() const { return getFlags() & FlagRValueReference; } 577 578 DITypeRef getRef() const { return DITypeRef::get(this); } 579 580 static bool classof(const Metadata *MD) { 581 switch (MD->getMetadataID()) { 582 default: 583 return false; 584 case DIBasicTypeKind: 585 case DIDerivedTypeKind: 586 case DICompositeTypeKind: 587 case DISubroutineTypeKind: 588 return true; 589 } 590 } 591}; 592 593/// \brief Basic type, like 'int' or 'float'. 594/// 595/// TODO: Split out DW_TAG_unspecified_type. 596/// TODO: Drop unused accessors. 597class DIBasicType : public DIType { 598 friend class LLVMContextImpl; 599 friend class MDNode; 600 601 unsigned Encoding; 602 603 DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag, 604 uint64_t SizeInBits, uint64_t AlignInBits, unsigned Encoding, 605 ArrayRef<Metadata *> Ops) 606 : DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0, 607 0, Ops), 608 Encoding(Encoding) {} 609 ~DIBasicType() = default; 610 611 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag, 612 StringRef Name, uint64_t SizeInBits, 613 uint64_t AlignInBits, unsigned Encoding, 614 StorageType Storage, bool ShouldCreate = true) { 615 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), 616 SizeInBits, AlignInBits, Encoding, Storage, ShouldCreate); 617 } 618 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag, 619 MDString *Name, uint64_t SizeInBits, 620 uint64_t AlignInBits, unsigned Encoding, 621 StorageType Storage, bool ShouldCreate = true); 622 623 TempDIBasicType cloneImpl() const { 624 return getTemporary(getContext(), getTag(), getName(), getSizeInBits(), 625 getAlignInBits(), getEncoding()); 626 } 627 628public: 629 DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name), 630 (Tag, Name, 0, 0, 0)) 631 DEFINE_MDNODE_GET(DIBasicType, 632 (unsigned Tag, StringRef Name, uint64_t SizeInBits, 633 uint64_t AlignInBits, unsigned Encoding), 634 (Tag, Name, SizeInBits, AlignInBits, Encoding)) 635 DEFINE_MDNODE_GET(DIBasicType, 636 (unsigned Tag, MDString *Name, uint64_t SizeInBits, 637 uint64_t AlignInBits, unsigned Encoding), 638 (Tag, Name, SizeInBits, AlignInBits, Encoding)) 639 640 TempDIBasicType clone() const { return cloneImpl(); } 641 642 unsigned getEncoding() const { return Encoding; } 643 644 static bool classof(const Metadata *MD) { 645 return MD->getMetadataID() == DIBasicTypeKind; 646 } 647}; 648 649/// \brief Base class for DIDerivedType and DICompositeType. 650/// 651/// TODO: Delete; they're not really related. 652class DIDerivedTypeBase : public DIType { 653protected: 654 DIDerivedTypeBase(LLVMContext &C, unsigned ID, StorageType Storage, 655 unsigned Tag, unsigned Line, uint64_t SizeInBits, 656 uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, 657 ArrayRef<Metadata *> Ops) 658 : DIType(C, ID, Storage, Tag, Line, SizeInBits, AlignInBits, OffsetInBits, 659 Flags, Ops) {} 660 ~DIDerivedTypeBase() = default; 661 662public: 663 DITypeRef getBaseType() const { return DITypeRef(getRawBaseType()); } 664 Metadata *getRawBaseType() const { return getOperand(3); } 665 666 static bool classof(const Metadata *MD) { 667 return MD->getMetadataID() == DIDerivedTypeKind || 668 MD->getMetadataID() == DICompositeTypeKind || 669 MD->getMetadataID() == DISubroutineTypeKind; 670 } 671}; 672 673/// \brief Derived types. 674/// 675/// This includes qualified types, pointers, references, friends, typedefs, and 676/// class members. 677/// 678/// TODO: Split out members (inheritance, fields, methods, etc.). 679class DIDerivedType : public DIDerivedTypeBase { 680 friend class LLVMContextImpl; 681 friend class MDNode; 682 683 DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag, 684 unsigned Line, uint64_t SizeInBits, uint64_t AlignInBits, 685 uint64_t OffsetInBits, unsigned Flags, ArrayRef<Metadata *> Ops) 686 : DIDerivedTypeBase(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits, 687 AlignInBits, OffsetInBits, Flags, Ops) {} 688 ~DIDerivedType() = default; 689 690 static DIDerivedType *getImpl(LLVMContext &Context, unsigned Tag, 691 StringRef Name, DIFile *File, unsigned Line, 692 DIScopeRef Scope, DITypeRef BaseType, 693 uint64_t SizeInBits, uint64_t AlignInBits, 694 uint64_t OffsetInBits, unsigned Flags, 695 Metadata *ExtraData, StorageType Storage, 696 bool ShouldCreate = true) { 697 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File, 698 Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, 699 Flags, ExtraData, Storage, ShouldCreate); 700 } 701 static DIDerivedType *getImpl(LLVMContext &Context, unsigned Tag, 702 MDString *Name, Metadata *File, unsigned Line, 703 Metadata *Scope, Metadata *BaseType, 704 uint64_t SizeInBits, uint64_t AlignInBits, 705 uint64_t OffsetInBits, unsigned Flags, 706 Metadata *ExtraData, StorageType Storage, 707 bool ShouldCreate = true); 708 709 TempDIDerivedType cloneImpl() const { 710 return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(), 711 getScope(), getBaseType(), getSizeInBits(), 712 getAlignInBits(), getOffsetInBits(), getFlags(), 713 getExtraData()); 714 } 715 716public: 717 DEFINE_MDNODE_GET(DIDerivedType, 718 (unsigned Tag, MDString *Name, Metadata *File, 719 unsigned Line, Metadata *Scope, Metadata *BaseType, 720 uint64_t SizeInBits, uint64_t AlignInBits, 721 uint64_t OffsetInBits, unsigned Flags, 722 Metadata *ExtraData = nullptr), 723 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 724 AlignInBits, OffsetInBits, Flags, ExtraData)) 725 DEFINE_MDNODE_GET(DIDerivedType, 726 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line, 727 DIScopeRef Scope, DITypeRef BaseType, uint64_t SizeInBits, 728 uint64_t AlignInBits, uint64_t OffsetInBits, 729 unsigned Flags, Metadata *ExtraData = nullptr), 730 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 731 AlignInBits, OffsetInBits, Flags, ExtraData)) 732 733 TempDIDerivedType clone() const { return cloneImpl(); } 734 735 /// \brief Get extra data associated with this derived type. 736 /// 737 /// Class type for pointer-to-members, objective-c property node for ivars, 738 /// or global constant wrapper for static members. 739 /// 740 /// TODO: Separate out types that need this extra operand: pointer-to-member 741 /// types and member fields (static members and ivars). 742 Metadata *getExtraData() const { return getRawExtraData(); } 743 Metadata *getRawExtraData() const { return getOperand(4); } 744 745 /// \brief Get casted version of extra data. 746 /// @{ 747 DITypeRef getClassType() const { 748 assert(getTag() == dwarf::DW_TAG_ptr_to_member_type); 749 return DITypeRef(getExtraData()); 750 } 751 DIObjCProperty *getObjCProperty() const { 752 return dyn_cast_or_null<DIObjCProperty>(getExtraData()); 753 } 754 Constant *getConstant() const { 755 assert(getTag() == dwarf::DW_TAG_member && isStaticMember()); 756 if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData())) 757 return C->getValue(); 758 return nullptr; 759 } 760 /// @} 761 762 static bool classof(const Metadata *MD) { 763 return MD->getMetadataID() == DIDerivedTypeKind; 764 } 765}; 766 767/// \brief Base class for DICompositeType and DISubroutineType. 768/// 769/// TODO: Delete; they're not really related. 770class DICompositeTypeBase : public DIDerivedTypeBase { 771 unsigned RuntimeLang; 772 773protected: 774 DICompositeTypeBase(LLVMContext &C, unsigned ID, StorageType Storage, 775 unsigned Tag, unsigned Line, unsigned RuntimeLang, 776 uint64_t SizeInBits, uint64_t AlignInBits, 777 uint64_t OffsetInBits, unsigned Flags, 778 ArrayRef<Metadata *> Ops) 779 : DIDerivedTypeBase(C, ID, Storage, Tag, Line, SizeInBits, AlignInBits, 780 OffsetInBits, Flags, Ops), 781 RuntimeLang(RuntimeLang) {} 782 ~DICompositeTypeBase() = default; 783 784public: 785 /// \brief Get the elements of the composite type. 786 /// 787 /// \note Calling this is only valid for \a DICompositeType. This assertion 788 /// can be removed once \a DISubroutineType has been separated from 789 /// "composite types". 790 DINodeArray getElements() const { 791 assert(!isa<DISubroutineType>(this) && "no elements for DISubroutineType"); 792 return cast_or_null<MDTuple>(getRawElements()); 793 } 794 DITypeRef getVTableHolder() const { return DITypeRef(getRawVTableHolder()); } 795 DITemplateParameterArray getTemplateParams() const { 796 return cast_or_null<MDTuple>(getRawTemplateParams()); 797 } 798 StringRef getIdentifier() const { return getStringOperand(7); } 799 unsigned getRuntimeLang() const { return RuntimeLang; } 800 801 Metadata *getRawElements() const { return getOperand(4); } 802 Metadata *getRawVTableHolder() const { return getOperand(5); } 803 Metadata *getRawTemplateParams() const { return getOperand(6); } 804 MDString *getRawIdentifier() const { return getOperandAs<MDString>(7); } 805 806 /// \brief Replace operands. 807 /// 808 /// If this \a isUniqued() and not \a isResolved(), on a uniquing collision 809 /// this will be RAUW'ed and deleted. Use a \a TrackingMDRef to keep track 810 /// of its movement if necessary. 811 /// @{ 812 void replaceElements(DINodeArray Elements) { 813#ifndef NDEBUG 814 for (DINode *Op : getElements()) 815 assert(std::find(Elements->op_begin(), Elements->op_end(), Op) && 816 "Lost a member during member list replacement"); 817#endif 818 replaceOperandWith(4, Elements.get()); 819 } 820 void replaceVTableHolder(DITypeRef VTableHolder) { 821 replaceOperandWith(5, VTableHolder); 822 } 823 void replaceTemplateParams(DITemplateParameterArray TemplateParams) { 824 replaceOperandWith(6, TemplateParams.get()); 825 } 826 /// @} 827 828 static bool classof(const Metadata *MD) { 829 return MD->getMetadataID() == DICompositeTypeKind || 830 MD->getMetadataID() == DISubroutineTypeKind; 831 } 832}; 833 834/// \brief Composite types. 835/// 836/// TODO: Detach from DerivedTypeBase (split out MDEnumType?). 837/// TODO: Create a custom, unrelated node for DW_TAG_array_type. 838class DICompositeType : public DICompositeTypeBase { 839 friend class LLVMContextImpl; 840 friend class MDNode; 841 842 DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag, 843 unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, 844 uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, 845 ArrayRef<Metadata *> Ops) 846 : DICompositeTypeBase(C, DICompositeTypeKind, Storage, Tag, Line, 847 RuntimeLang, SizeInBits, AlignInBits, OffsetInBits, 848 Flags, Ops) {} 849 ~DICompositeType() = default; 850 851 static DICompositeType * 852 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File, 853 unsigned Line, DIScopeRef Scope, DITypeRef BaseType, 854 uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, 855 uint64_t Flags, DINodeArray Elements, unsigned RuntimeLang, 856 DITypeRef VTableHolder, DITemplateParameterArray TemplateParams, 857 StringRef Identifier, StorageType Storage, bool ShouldCreate = true) { 858 return getImpl( 859 Context, Tag, getCanonicalMDString(Context, Name), File, Line, Scope, 860 BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements.get(), 861 RuntimeLang, VTableHolder, TemplateParams.get(), 862 getCanonicalMDString(Context, Identifier), Storage, ShouldCreate); 863 } 864 static DICompositeType * 865 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File, 866 unsigned Line, Metadata *Scope, Metadata *BaseType, 867 uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, 868 unsigned Flags, Metadata *Elements, unsigned RuntimeLang, 869 Metadata *VTableHolder, Metadata *TemplateParams, 870 MDString *Identifier, StorageType Storage, bool ShouldCreate = true); 871 872 TempDICompositeType cloneImpl() const { 873 return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(), 874 getScope(), getBaseType(), getSizeInBits(), 875 getAlignInBits(), getOffsetInBits(), getFlags(), 876 getElements(), getRuntimeLang(), getVTableHolder(), 877 getTemplateParams(), getIdentifier()); 878 } 879 880public: 881 DEFINE_MDNODE_GET(DICompositeType, 882 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line, 883 DIScopeRef Scope, DITypeRef BaseType, uint64_t SizeInBits, 884 uint64_t AlignInBits, uint64_t OffsetInBits, 885 unsigned Flags, DINodeArray Elements, unsigned RuntimeLang, 886 DITypeRef VTableHolder, 887 DITemplateParameterArray TemplateParams = nullptr, 888 StringRef Identifier = ""), 889 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 890 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 891 VTableHolder, TemplateParams, Identifier)) 892 DEFINE_MDNODE_GET(DICompositeType, 893 (unsigned Tag, MDString *Name, Metadata *File, 894 unsigned Line, Metadata *Scope, Metadata *BaseType, 895 uint64_t SizeInBits, uint64_t AlignInBits, 896 uint64_t OffsetInBits, unsigned Flags, Metadata *Elements, 897 unsigned RuntimeLang, Metadata *VTableHolder, 898 Metadata *TemplateParams = nullptr, 899 MDString *Identifier = nullptr), 900 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 901 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 902 VTableHolder, TemplateParams, Identifier)) 903 904 TempDICompositeType clone() const { return cloneImpl(); } 905 906 static bool classof(const Metadata *MD) { 907 return MD->getMetadataID() == DICompositeTypeKind; 908 } 909}; 910 911template <class T> TypedDINodeRef<T> TypedDINodeRef<T>::get(const T *N) { 912 if (N) 913 if (auto *Composite = dyn_cast<DICompositeType>(N)) 914 if (auto *S = Composite->getRawIdentifier()) 915 return TypedDINodeRef<T>(S); 916 return TypedDINodeRef<T>(N); 917} 918 919/// \brief Type array for a subprogram. 920/// 921/// TODO: Detach from CompositeType, and fold the array of types in directly 922/// as operands. 923class DISubroutineType : public DICompositeTypeBase { 924 friend class LLVMContextImpl; 925 friend class MDNode; 926 927 DISubroutineType(LLVMContext &C, StorageType Storage, unsigned Flags, 928 ArrayRef<Metadata *> Ops) 929 : DICompositeTypeBase(C, DISubroutineTypeKind, Storage, 930 dwarf::DW_TAG_subroutine_type, 0, 0, 0, 0, 0, Flags, 931 Ops) {} 932 ~DISubroutineType() = default; 933 934 static DISubroutineType *getImpl(LLVMContext &Context, unsigned Flags, 935 DITypeRefArray TypeArray, 936 StorageType Storage, 937 bool ShouldCreate = true) { 938 return getImpl(Context, Flags, TypeArray.get(), Storage, ShouldCreate); 939 } 940 static DISubroutineType *getImpl(LLVMContext &Context, unsigned Flags, 941 Metadata *TypeArray, StorageType Storage, 942 bool ShouldCreate = true); 943 944 TempDISubroutineType cloneImpl() const { 945 return getTemporary(getContext(), getFlags(), getTypeArray()); 946 } 947 948public: 949 DEFINE_MDNODE_GET(DISubroutineType, 950 (unsigned Flags, DITypeRefArray TypeArray), 951 (Flags, TypeArray)) 952 DEFINE_MDNODE_GET(DISubroutineType, (unsigned Flags, Metadata *TypeArray), 953 (Flags, TypeArray)) 954 955 TempDISubroutineType clone() const { return cloneImpl(); } 956 957 DITypeRefArray getTypeArray() const { 958 return cast_or_null<MDTuple>(getRawTypeArray()); 959 } 960 Metadata *getRawTypeArray() const { return getRawElements(); } 961 962 static bool classof(const Metadata *MD) { 963 return MD->getMetadataID() == DISubroutineTypeKind; 964 } 965}; 966 967/// \brief Compile unit. 968class DICompileUnit : public DIScope { 969 friend class LLVMContextImpl; 970 friend class MDNode; 971 972 unsigned SourceLanguage; 973 bool IsOptimized; 974 unsigned RuntimeVersion; 975 unsigned EmissionKind; 976 uint64_t DWOId; 977 978 DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage, 979 bool IsOptimized, unsigned RuntimeVersion, 980 unsigned EmissionKind, uint64_t DWOId, ArrayRef<Metadata *> Ops) 981 : DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops), 982 SourceLanguage(SourceLanguage), IsOptimized(IsOptimized), 983 RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind), 984 DWOId(DWOId) {} 985 ~DICompileUnit() = default; 986 987 static DICompileUnit * 988 getImpl(LLVMContext &Context, unsigned SourceLanguage, DIFile *File, 989 StringRef Producer, bool IsOptimized, StringRef Flags, 990 unsigned RuntimeVersion, StringRef SplitDebugFilename, 991 unsigned EmissionKind, DICompositeTypeArray EnumTypes, 992 DITypeArray RetainedTypes, DISubprogramArray Subprograms, 993 DIGlobalVariableArray GlobalVariables, 994 DIImportedEntityArray ImportedEntities, uint64_t DWOId, 995 StorageType Storage, bool ShouldCreate = true) { 996 return getImpl(Context, SourceLanguage, File, 997 getCanonicalMDString(Context, Producer), IsOptimized, 998 getCanonicalMDString(Context, Flags), RuntimeVersion, 999 getCanonicalMDString(Context, SplitDebugFilename), 1000 EmissionKind, EnumTypes.get(), RetainedTypes.get(), 1001 Subprograms.get(), GlobalVariables.get(), 1002 ImportedEntities.get(), DWOId, Storage, ShouldCreate); 1003 } 1004 static DICompileUnit * 1005 getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File, 1006 MDString *Producer, bool IsOptimized, MDString *Flags, 1007 unsigned RuntimeVersion, MDString *SplitDebugFilename, 1008 unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, 1009 Metadata *Subprograms, Metadata *GlobalVariables, 1010 Metadata *ImportedEntities, uint64_t DWOId, StorageType Storage, 1011 bool ShouldCreate = true); 1012 1013 TempDICompileUnit cloneImpl() const { 1014 return getTemporary( 1015 getContext(), getSourceLanguage(), getFile(), getProducer(), 1016 isOptimized(), getFlags(), getRuntimeVersion(), getSplitDebugFilename(), 1017 getEmissionKind(), getEnumTypes(), getRetainedTypes(), getSubprograms(), 1018 getGlobalVariables(), getImportedEntities(), DWOId); 1019 } 1020 1021public: 1022 DEFINE_MDNODE_GET(DICompileUnit, 1023 (unsigned SourceLanguage, DIFile *File, StringRef Producer, 1024 bool IsOptimized, StringRef Flags, unsigned RuntimeVersion, 1025 StringRef SplitDebugFilename, unsigned EmissionKind, 1026 DICompositeTypeArray EnumTypes, DITypeArray RetainedTypes, 1027 DISubprogramArray Subprograms, 1028 DIGlobalVariableArray GlobalVariables, 1029 DIImportedEntityArray ImportedEntities, uint64_t DWOId), 1030 (SourceLanguage, File, Producer, IsOptimized, Flags, 1031 RuntimeVersion, SplitDebugFilename, EmissionKind, 1032 EnumTypes, RetainedTypes, Subprograms, GlobalVariables, 1033 ImportedEntities, DWOId)) 1034 DEFINE_MDNODE_GET( 1035 DICompileUnit, 1036 (unsigned SourceLanguage, Metadata *File, MDString *Producer, 1037 bool IsOptimized, MDString *Flags, unsigned RuntimeVersion, 1038 MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes, 1039 Metadata *RetainedTypes, Metadata *Subprograms, 1040 Metadata *GlobalVariables, Metadata *ImportedEntities, uint64_t DWOId), 1041 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, 1042 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, Subprograms, 1043 GlobalVariables, ImportedEntities, DWOId)) 1044 1045 TempDICompileUnit clone() const { return cloneImpl(); } 1046 1047 unsigned getSourceLanguage() const { return SourceLanguage; } 1048 bool isOptimized() const { return IsOptimized; } 1049 unsigned getRuntimeVersion() const { return RuntimeVersion; } 1050 unsigned getEmissionKind() const { return EmissionKind; } 1051 StringRef getProducer() const { return getStringOperand(1); } 1052 StringRef getFlags() const { return getStringOperand(2); } 1053 StringRef getSplitDebugFilename() const { return getStringOperand(3); } 1054 DICompositeTypeArray getEnumTypes() const { 1055 return cast_or_null<MDTuple>(getRawEnumTypes()); 1056 } 1057 DITypeArray getRetainedTypes() const { 1058 return cast_or_null<MDTuple>(getRawRetainedTypes()); 1059 } 1060 DISubprogramArray getSubprograms() const { 1061 return cast_or_null<MDTuple>(getRawSubprograms()); 1062 } 1063 DIGlobalVariableArray getGlobalVariables() const { 1064 return cast_or_null<MDTuple>(getRawGlobalVariables()); 1065 } 1066 DIImportedEntityArray getImportedEntities() const { 1067 return cast_or_null<MDTuple>(getRawImportedEntities()); 1068 } 1069 unsigned getDWOId() const { return DWOId; } 1070 1071 MDString *getRawProducer() const { return getOperandAs<MDString>(1); } 1072 MDString *getRawFlags() const { return getOperandAs<MDString>(2); } 1073 MDString *getRawSplitDebugFilename() const { 1074 return getOperandAs<MDString>(3); 1075 } 1076 Metadata *getRawEnumTypes() const { return getOperand(4); } 1077 Metadata *getRawRetainedTypes() const { return getOperand(5); } 1078 Metadata *getRawSubprograms() const { return getOperand(6); } 1079 Metadata *getRawGlobalVariables() const { return getOperand(7); } 1080 Metadata *getRawImportedEntities() const { return getOperand(8); } 1081 1082 /// \brief Replace arrays. 1083 /// 1084 /// If this \a isUniqued() and not \a isResolved(), it will be RAUW'ed and 1085 /// deleted on a uniquing collision. In practice, uniquing collisions on \a 1086 /// DICompileUnit should be fairly rare. 1087 /// @{ 1088 void replaceEnumTypes(DICompositeTypeArray N) { 1089 replaceOperandWith(4, N.get()); 1090 } 1091 void replaceRetainedTypes(DITypeArray N) { 1092 replaceOperandWith(5, N.get()); 1093 } 1094 void replaceSubprograms(DISubprogramArray N) { 1095 replaceOperandWith(6, N.get()); 1096 } 1097 void replaceGlobalVariables(DIGlobalVariableArray N) { 1098 replaceOperandWith(7, N.get()); 1099 } 1100 void replaceImportedEntities(DIImportedEntityArray N) { 1101 replaceOperandWith(8, N.get()); 1102 } 1103 /// @} 1104 1105 static bool classof(const Metadata *MD) { 1106 return MD->getMetadataID() == DICompileUnitKind; 1107 } 1108}; 1109 1110/// \brief A scope for locals. 1111/// 1112/// A legal scope for lexical blocks, local variables, and debug info 1113/// locations. Subclasses are \a DISubprogram, \a DILexicalBlock, and \a 1114/// DILexicalBlockFile. 1115class DILocalScope : public DIScope { 1116protected: 1117 DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 1118 ArrayRef<Metadata *> Ops) 1119 : DIScope(C, ID, Storage, Tag, Ops) {} 1120 ~DILocalScope() = default; 1121 1122public: 1123 /// \brief Get the subprogram for this scope. 1124 /// 1125 /// Return this if it's an \a DISubprogram; otherwise, look up the scope 1126 /// chain. 1127 DISubprogram *getSubprogram() const; 1128 1129 static bool classof(const Metadata *MD) { 1130 return MD->getMetadataID() == DISubprogramKind || 1131 MD->getMetadataID() == DILexicalBlockKind || 1132 MD->getMetadataID() == DILexicalBlockFileKind; 1133 } 1134}; 1135 1136/// \brief Debug location. 1137/// 1138/// A debug location in source code, used for debug info and otherwise. 1139class DILocation : public MDNode { 1140 friend class LLVMContextImpl; 1141 friend class MDNode; 1142 1143 DILocation(LLVMContext &C, StorageType Storage, unsigned Line, 1144 unsigned Column, ArrayRef<Metadata *> MDs); 1145 ~DILocation() { dropAllReferences(); } 1146 1147 static DILocation *getImpl(LLVMContext &Context, unsigned Line, 1148 unsigned Column, Metadata *Scope, 1149 Metadata *InlinedAt, StorageType Storage, 1150 bool ShouldCreate = true); 1151 static DILocation *getImpl(LLVMContext &Context, unsigned Line, 1152 unsigned Column, DILocalScope *Scope, 1153 DILocation *InlinedAt, StorageType Storage, 1154 bool ShouldCreate = true) { 1155 return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope), 1156 static_cast<Metadata *>(InlinedAt), Storage, ShouldCreate); 1157 } 1158 1159 TempDILocation cloneImpl() const { 1160 return getTemporary(getContext(), getLine(), getColumn(), getScope(), 1161 getInlinedAt()); 1162 } 1163 1164 // Disallow replacing operands. 1165 void replaceOperandWith(unsigned I, Metadata *New) = delete; 1166 1167public: 1168 DEFINE_MDNODE_GET(DILocation, 1169 (unsigned Line, unsigned Column, Metadata *Scope, 1170 Metadata *InlinedAt = nullptr), 1171 (Line, Column, Scope, InlinedAt)) 1172 DEFINE_MDNODE_GET(DILocation, 1173 (unsigned Line, unsigned Column, DILocalScope *Scope, 1174 DILocation *InlinedAt = nullptr), 1175 (Line, Column, Scope, InlinedAt)) 1176 1177 /// \brief Return a (temporary) clone of this. 1178 TempDILocation clone() const { return cloneImpl(); } 1179 1180 unsigned getLine() const { return SubclassData32; } 1181 unsigned getColumn() const { return SubclassData16; } 1182 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); } 1183 DILocation *getInlinedAt() const { 1184 return cast_or_null<DILocation>(getRawInlinedAt()); 1185 } 1186 1187 DIFile *getFile() const { return getScope()->getFile(); } 1188 StringRef getFilename() const { return getScope()->getFilename(); } 1189 StringRef getDirectory() const { return getScope()->getDirectory(); } 1190 1191 /// \brief Get the scope where this is inlined. 1192 /// 1193 /// Walk through \a getInlinedAt() and return \a getScope() from the deepest 1194 /// location. 1195 DILocalScope *getInlinedAtScope() const { 1196 if (auto *IA = getInlinedAt()) 1197 return IA->getInlinedAtScope(); 1198 return getScope(); 1199 } 1200 1201 /// \brief Check whether this can be discriminated from another location. 1202 /// 1203 /// Check \c this can be discriminated from \c RHS in a linetable entry. 1204 /// Scope and inlined-at chains are not recorded in the linetable, so they 1205 /// cannot be used to distinguish basic blocks. 1206 /// 1207 /// The current implementation is weaker than it should be, since it just 1208 /// checks filename and line. 1209 /// 1210 /// FIXME: Add a check for getDiscriminator(). 1211 /// FIXME: Add a check for getColumn(). 1212 /// FIXME: Change the getFilename() check to getFile() (or add one for 1213 /// getDirectory()). 1214 bool canDiscriminate(const DILocation &RHS) const { 1215 return getFilename() != RHS.getFilename() || getLine() != RHS.getLine(); 1216 } 1217 1218 /// \brief Get the DWARF discriminator. 1219 /// 1220 /// DWARF discriminators distinguish identical file locations between 1221 /// instructions that are on different basic blocks. 1222 inline unsigned getDiscriminator() const; 1223 1224 /// \brief Compute new discriminator in the given context. 1225 /// 1226 /// This modifies the \a LLVMContext that \c this is in to increment the next 1227 /// discriminator for \c this's line/filename combination. 1228 /// 1229 /// FIXME: Delete this. See comments in implementation and at the only call 1230 /// site in \a AddDiscriminators::runOnFunction(). 1231 unsigned computeNewDiscriminator() const; 1232 1233 Metadata *getRawScope() const { return getOperand(0); } 1234 Metadata *getRawInlinedAt() const { 1235 if (getNumOperands() == 2) 1236 return getOperand(1); 1237 return nullptr; 1238 } 1239 1240 static bool classof(const Metadata *MD) { 1241 return MD->getMetadataID() == DILocationKind; 1242 } 1243}; 1244 1245/// \brief Subprogram description. 1246/// 1247/// TODO: Remove DisplayName. It's always equal to Name. 1248/// TODO: Split up flags. 1249class DISubprogram : public DILocalScope { 1250 friend class LLVMContextImpl; 1251 friend class MDNode; 1252 1253 unsigned Line; 1254 unsigned ScopeLine; 1255 unsigned Virtuality; 1256 unsigned VirtualIndex; 1257 unsigned Flags; 1258 bool IsLocalToUnit; 1259 bool IsDefinition; 1260 bool IsOptimized; 1261 1262 DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line, 1263 unsigned ScopeLine, unsigned Virtuality, unsigned VirtualIndex, 1264 unsigned Flags, bool IsLocalToUnit, bool IsDefinition, 1265 bool IsOptimized, ArrayRef<Metadata *> Ops) 1266 : DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram, 1267 Ops), 1268 Line(Line), ScopeLine(ScopeLine), Virtuality(Virtuality), 1269 VirtualIndex(VirtualIndex), Flags(Flags), IsLocalToUnit(IsLocalToUnit), 1270 IsDefinition(IsDefinition), IsOptimized(IsOptimized) {} 1271 ~DISubprogram() = default; 1272 1273 static DISubprogram * 1274 getImpl(LLVMContext &Context, DIScopeRef Scope, StringRef Name, 1275 StringRef LinkageName, DIFile *File, unsigned Line, 1276 DISubroutineType *Type, bool IsLocalToUnit, bool IsDefinition, 1277 unsigned ScopeLine, DITypeRef ContainingType, unsigned Virtuality, 1278 unsigned VirtualIndex, unsigned Flags, bool IsOptimized, 1279 Constant *Function, DITemplateParameterArray TemplateParams, 1280 DISubprogram *Declaration, DILocalVariableArray Variables, 1281 StorageType Storage, bool ShouldCreate = true) { 1282 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 1283 getCanonicalMDString(Context, LinkageName), File, Line, Type, 1284 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1285 Virtuality, VirtualIndex, Flags, IsOptimized, 1286 Function ? ConstantAsMetadata::get(Function) : nullptr, 1287 TemplateParams.get(), Declaration, Variables.get(), Storage, 1288 ShouldCreate); 1289 } 1290 static DISubprogram * 1291 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, 1292 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type, 1293 bool IsLocalToUnit, bool IsDefinition, unsigned ScopeLine, 1294 Metadata *ContainingType, unsigned Virtuality, unsigned VirtualIndex, 1295 unsigned Flags, bool IsOptimized, Metadata *Function, 1296 Metadata *TemplateParams, Metadata *Declaration, Metadata *Variables, 1297 StorageType Storage, bool ShouldCreate = true); 1298 1299 TempDISubprogram cloneImpl() const { 1300 return getTemporary(getContext(), getScope(), getName(), getLinkageName(), 1301 getFile(), getLine(), getType(), isLocalToUnit(), 1302 isDefinition(), getScopeLine(), getContainingType(), 1303 getVirtuality(), getVirtualIndex(), getFlags(), 1304 isOptimized(), getFunctionConstant(), 1305 getTemplateParams(), getDeclaration(), getVariables()); 1306 } 1307 1308public: 1309 DEFINE_MDNODE_GET(DISubprogram, 1310 (DIScopeRef Scope, StringRef Name, StringRef LinkageName, 1311 DIFile *File, unsigned Line, DISubroutineType *Type, 1312 bool IsLocalToUnit, bool IsDefinition, unsigned ScopeLine, 1313 DITypeRef ContainingType, unsigned Virtuality, 1314 unsigned VirtualIndex, unsigned Flags, bool IsOptimized, 1315 Constant *Function = nullptr, 1316 DITemplateParameterArray TemplateParams = nullptr, 1317 DISubprogram *Declaration = nullptr, 1318 DILocalVariableArray Variables = nullptr), 1319 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 1320 IsDefinition, ScopeLine, ContainingType, Virtuality, 1321 VirtualIndex, Flags, IsOptimized, Function, TemplateParams, 1322 Declaration, Variables)) 1323 DEFINE_MDNODE_GET( 1324 DISubprogram, 1325 (Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File, 1326 unsigned Line, Metadata *Type, bool IsLocalToUnit, bool IsDefinition, 1327 unsigned ScopeLine, Metadata *ContainingType, unsigned Virtuality, 1328 unsigned VirtualIndex, unsigned Flags, bool IsOptimized, 1329 Metadata *Function = nullptr, Metadata *TemplateParams = nullptr, 1330 Metadata *Declaration = nullptr, Metadata *Variables = nullptr), 1331 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition, 1332 ScopeLine, ContainingType, Virtuality, VirtualIndex, Flags, IsOptimized, 1333 Function, TemplateParams, Declaration, Variables)) 1334 1335 TempDISubprogram clone() const { return cloneImpl(); } 1336 1337public: 1338 unsigned getLine() const { return Line; } 1339 unsigned getVirtuality() const { return Virtuality; } 1340 unsigned getVirtualIndex() const { return VirtualIndex; } 1341 unsigned getScopeLine() const { return ScopeLine; } 1342 unsigned getFlags() const { return Flags; } 1343 bool isLocalToUnit() const { return IsLocalToUnit; } 1344 bool isDefinition() const { return IsDefinition; } 1345 bool isOptimized() const { return IsOptimized; } 1346 1347 unsigned isArtificial() const { return getFlags() & FlagArtificial; } 1348 bool isPrivate() const { 1349 return (getFlags() & FlagAccessibility) == FlagPrivate; 1350 } 1351 bool isProtected() const { 1352 return (getFlags() & FlagAccessibility) == FlagProtected; 1353 } 1354 bool isPublic() const { 1355 return (getFlags() & FlagAccessibility) == FlagPublic; 1356 } 1357 bool isExplicit() const { return getFlags() & FlagExplicit; } 1358 bool isPrototyped() const { return getFlags() & FlagPrototyped; } 1359 1360 /// \brief Check if this is reference-qualified. 1361 /// 1362 /// Return true if this subprogram is a C++11 reference-qualified non-static 1363 /// member function (void foo() &). 1364 unsigned isLValueReference() const { 1365 return getFlags() & FlagLValueReference; 1366 } 1367 1368 /// \brief Check if this is rvalue-reference-qualified. 1369 /// 1370 /// Return true if this subprogram is a C++11 rvalue-reference-qualified 1371 /// non-static member function (void foo() &&). 1372 unsigned isRValueReference() const { 1373 return getFlags() & FlagRValueReference; 1374 } 1375 1376 DIScopeRef getScope() const { return DIScopeRef(getRawScope()); } 1377 1378 StringRef getName() const { return getStringOperand(2); } 1379 StringRef getDisplayName() const { return getStringOperand(3); } 1380 StringRef getLinkageName() const { return getStringOperand(4); } 1381 1382 MDString *getRawName() const { return getOperandAs<MDString>(2); } 1383 MDString *getRawLinkageName() const { return getOperandAs<MDString>(4); } 1384 1385 DISubroutineType *getType() const { 1386 return cast_or_null<DISubroutineType>(getRawType()); 1387 } 1388 DITypeRef getContainingType() const { 1389 return DITypeRef(getRawContainingType()); 1390 } 1391 1392 Constant *getFunctionConstant() const { 1393 if (auto *C = cast_or_null<ConstantAsMetadata>(getRawFunction())) 1394 return C->getValue(); 1395 return nullptr; 1396 } 1397 DITemplateParameterArray getTemplateParams() const { 1398 return cast_or_null<MDTuple>(getRawTemplateParams()); 1399 } 1400 DISubprogram *getDeclaration() const { 1401 return cast_or_null<DISubprogram>(getRawDeclaration()); 1402 } 1403 DILocalVariableArray getVariables() const { 1404 return cast_or_null<MDTuple>(getRawVariables()); 1405 } 1406 1407 Metadata *getRawScope() const { return getOperand(1); } 1408 Metadata *getRawType() const { return getOperand(5); } 1409 Metadata *getRawContainingType() const { return getOperand(6); } 1410 Metadata *getRawFunction() const { return getOperand(7); } 1411 Metadata *getRawTemplateParams() const { return getOperand(8); } 1412 Metadata *getRawDeclaration() const { return getOperand(9); } 1413 Metadata *getRawVariables() const { return getOperand(10); } 1414 1415 /// \brief Get a pointer to the function this subprogram describes. 1416 /// 1417 /// This dyn_casts \a getFunctionConstant() to \a Function. 1418 /// 1419 /// FIXME: Should this be looking through bitcasts? 1420 Function *getFunction() const; 1421 1422 /// \brief Replace the function. 1423 /// 1424 /// If \a isUniqued() and not \a isResolved(), this could node will be 1425 /// RAUW'ed and deleted out from under the caller. Use a \a TrackingMDRef if 1426 /// that's a problem. 1427 /// @{ 1428 void replaceFunction(Function *F); 1429 void replaceFunction(ConstantAsMetadata *MD) { replaceOperandWith(7, MD); } 1430 void replaceFunction(std::nullptr_t) { replaceOperandWith(7, nullptr); } 1431 /// @} 1432 1433 /// \brief Check if this subprogram decribes the given function. 1434 /// 1435 /// FIXME: Should this be looking through bitcasts? 1436 bool describes(const Function *F) const; 1437 1438 static bool classof(const Metadata *MD) { 1439 return MD->getMetadataID() == DISubprogramKind; 1440 } 1441}; 1442 1443class DILexicalBlockBase : public DILocalScope { 1444protected: 1445 DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage, 1446 ArrayRef<Metadata *> Ops) 1447 : DILocalScope(C, ID, Storage, dwarf::DW_TAG_lexical_block, Ops) {} 1448 ~DILexicalBlockBase() = default; 1449 1450public: 1451 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); } 1452 1453 Metadata *getRawScope() const { return getOperand(1); } 1454 1455 /// \brief Forwarding accessors to LexicalBlock. 1456 /// 1457 /// TODO: Remove these and update code to use \a DILexicalBlock directly. 1458 /// @{ 1459 inline unsigned getLine() const; 1460 inline unsigned getColumn() const; 1461 /// @} 1462 static bool classof(const Metadata *MD) { 1463 return MD->getMetadataID() == DILexicalBlockKind || 1464 MD->getMetadataID() == DILexicalBlockFileKind; 1465 } 1466}; 1467 1468class DILexicalBlock : public DILexicalBlockBase { 1469 friend class LLVMContextImpl; 1470 friend class MDNode; 1471 1472 unsigned Line; 1473 unsigned Column; 1474 1475 DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line, 1476 unsigned Column, ArrayRef<Metadata *> Ops) 1477 : DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops), Line(Line), 1478 Column(Column) {} 1479 ~DILexicalBlock() = default; 1480 1481 static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope, 1482 DIFile *File, unsigned Line, unsigned Column, 1483 StorageType Storage, 1484 bool ShouldCreate = true) { 1485 return getImpl(Context, static_cast<Metadata *>(Scope), 1486 static_cast<Metadata *>(File), Line, Column, Storage, 1487 ShouldCreate); 1488 } 1489 1490 static DILexicalBlock *getImpl(LLVMContext &Context, Metadata *Scope, 1491 Metadata *File, unsigned Line, unsigned Column, 1492 StorageType Storage, bool ShouldCreate = true); 1493 1494 TempDILexicalBlock cloneImpl() const { 1495 return getTemporary(getContext(), getScope(), getFile(), getLine(), 1496 getColumn()); 1497 } 1498 1499public: 1500 DEFINE_MDNODE_GET(DILexicalBlock, (DILocalScope * Scope, DIFile *File, 1501 unsigned Line, unsigned Column), 1502 (Scope, File, Line, Column)) 1503 DEFINE_MDNODE_GET(DILexicalBlock, (Metadata * Scope, Metadata *File, 1504 unsigned Line, unsigned Column), 1505 (Scope, File, Line, Column)) 1506 1507 TempDILexicalBlock clone() const { return cloneImpl(); } 1508 1509 unsigned getLine() const { return Line; } 1510 unsigned getColumn() const { return Column; } 1511 1512 static bool classof(const Metadata *MD) { 1513 return MD->getMetadataID() == DILexicalBlockKind; 1514 } 1515}; 1516 1517unsigned DILexicalBlockBase::getLine() const { 1518 if (auto *N = dyn_cast<DILexicalBlock>(this)) 1519 return N->getLine(); 1520 return 0; 1521} 1522 1523unsigned DILexicalBlockBase::getColumn() const { 1524 if (auto *N = dyn_cast<DILexicalBlock>(this)) 1525 return N->getColumn(); 1526 return 0; 1527} 1528 1529class DILexicalBlockFile : public DILexicalBlockBase { 1530 friend class LLVMContextImpl; 1531 friend class MDNode; 1532 1533 unsigned Discriminator; 1534 1535 DILexicalBlockFile(LLVMContext &C, StorageType Storage, 1536 unsigned Discriminator, ArrayRef<Metadata *> Ops) 1537 : DILexicalBlockBase(C, DILexicalBlockFileKind, Storage, Ops), 1538 Discriminator(Discriminator) {} 1539 ~DILexicalBlockFile() = default; 1540 1541 static DILexicalBlockFile *getImpl(LLVMContext &Context, DILocalScope *Scope, 1542 DIFile *File, unsigned Discriminator, 1543 StorageType Storage, 1544 bool ShouldCreate = true) { 1545 return getImpl(Context, static_cast<Metadata *>(Scope), 1546 static_cast<Metadata *>(File), Discriminator, Storage, 1547 ShouldCreate); 1548 } 1549 1550 static DILexicalBlockFile *getImpl(LLVMContext &Context, Metadata *Scope, 1551 Metadata *File, unsigned Discriminator, 1552 StorageType Storage, 1553 bool ShouldCreate = true); 1554 1555 TempDILexicalBlockFile cloneImpl() const { 1556 return getTemporary(getContext(), getScope(), getFile(), 1557 getDiscriminator()); 1558 } 1559 1560public: 1561 DEFINE_MDNODE_GET(DILexicalBlockFile, (DILocalScope * Scope, DIFile *File, 1562 unsigned Discriminator), 1563 (Scope, File, Discriminator)) 1564 DEFINE_MDNODE_GET(DILexicalBlockFile, 1565 (Metadata * Scope, Metadata *File, unsigned Discriminator), 1566 (Scope, File, Discriminator)) 1567 1568 TempDILexicalBlockFile clone() const { return cloneImpl(); } 1569 1570 // TODO: Remove these once they're gone from DILexicalBlockBase. 1571 unsigned getLine() const = delete; 1572 unsigned getColumn() const = delete; 1573 1574 unsigned getDiscriminator() const { return Discriminator; } 1575 1576 static bool classof(const Metadata *MD) { 1577 return MD->getMetadataID() == DILexicalBlockFileKind; 1578 } 1579}; 1580 1581unsigned DILocation::getDiscriminator() const { 1582 if (auto *F = dyn_cast<DILexicalBlockFile>(getScope())) 1583 return F->getDiscriminator(); 1584 return 0; 1585} 1586 1587class DINamespace : public DIScope { 1588 friend class LLVMContextImpl; 1589 friend class MDNode; 1590 1591 unsigned Line; 1592 1593 DINamespace(LLVMContext &Context, StorageType Storage, unsigned Line, 1594 ArrayRef<Metadata *> Ops) 1595 : DIScope(Context, DINamespaceKind, Storage, dwarf::DW_TAG_namespace, 1596 Ops), 1597 Line(Line) {} 1598 ~DINamespace() = default; 1599 1600 static DINamespace *getImpl(LLVMContext &Context, DIScope *Scope, 1601 DIFile *File, StringRef Name, unsigned Line, 1602 StorageType Storage, bool ShouldCreate = true) { 1603 return getImpl(Context, Scope, File, getCanonicalMDString(Context, Name), 1604 Line, Storage, ShouldCreate); 1605 } 1606 static DINamespace *getImpl(LLVMContext &Context, Metadata *Scope, 1607 Metadata *File, MDString *Name, unsigned Line, 1608 StorageType Storage, bool ShouldCreate = true); 1609 1610 TempDINamespace cloneImpl() const { 1611 return getTemporary(getContext(), getScope(), getFile(), getName(), 1612 getLine()); 1613 } 1614 1615public: 1616 DEFINE_MDNODE_GET(DINamespace, (DIScope * Scope, DIFile *File, StringRef Name, 1617 unsigned Line), 1618 (Scope, File, Name, Line)) 1619 DEFINE_MDNODE_GET(DINamespace, (Metadata * Scope, Metadata *File, 1620 MDString *Name, unsigned Line), 1621 (Scope, File, Name, Line)) 1622 1623 TempDINamespace clone() const { return cloneImpl(); } 1624 1625 unsigned getLine() const { return Line; } 1626 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 1627 StringRef getName() const { return getStringOperand(2); } 1628 1629 Metadata *getRawScope() const { return getOperand(1); } 1630 MDString *getRawName() const { return getOperandAs<MDString>(2); } 1631 1632 static bool classof(const Metadata *MD) { 1633 return MD->getMetadataID() == DINamespaceKind; 1634 } 1635}; 1636 1637/// \brief A (clang) module that has been imported by the compile unit. 1638/// 1639class DIModule : public DIScope { 1640 friend class LLVMContextImpl; 1641 friend class MDNode; 1642 1643 DIModule(LLVMContext &Context, StorageType Storage, ArrayRef<Metadata *> Ops) 1644 : DIScope(Context, DIModuleKind, Storage, dwarf::DW_TAG_module, Ops) {} 1645 ~DIModule() {} 1646 1647 static DIModule *getImpl(LLVMContext &Context, DIScope *Scope, 1648 StringRef Name, StringRef ConfigurationMacros, 1649 StringRef IncludePath, StringRef ISysRoot, 1650 StorageType Storage, bool ShouldCreate = true) { 1651 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 1652 getCanonicalMDString(Context, ConfigurationMacros), 1653 getCanonicalMDString(Context, IncludePath), 1654 getCanonicalMDString(Context, ISysRoot), 1655 Storage, ShouldCreate); 1656 } 1657 static DIModule *getImpl(LLVMContext &Context, Metadata *Scope, 1658 MDString *Name, MDString *ConfigurationMacros, 1659 MDString *IncludePath, MDString *ISysRoot, 1660 StorageType Storage, bool ShouldCreate = true); 1661 1662 TempDIModule cloneImpl() const { 1663 return getTemporary(getContext(), getScope(), getName(), 1664 getConfigurationMacros(), getIncludePath(), 1665 getISysRoot()); 1666 } 1667 1668public: 1669 DEFINE_MDNODE_GET(DIModule, (DIScope *Scope, StringRef Name, 1670 StringRef ConfigurationMacros, StringRef IncludePath, 1671 StringRef ISysRoot), 1672 (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot)) 1673 DEFINE_MDNODE_GET(DIModule, 1674 (Metadata *Scope, MDString *Name, MDString *ConfigurationMacros, 1675 MDString *IncludePath, MDString *ISysRoot), 1676 (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot)) 1677 1678 TempDIModule clone() const { return cloneImpl(); } 1679 1680 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 1681 StringRef getName() const { return getStringOperand(1); } 1682 StringRef getConfigurationMacros() const { return getStringOperand(2); } 1683 StringRef getIncludePath() const { return getStringOperand(3); } 1684 StringRef getISysRoot() const { return getStringOperand(4); } 1685 1686 Metadata *getRawScope() const { return getOperand(0); } 1687 MDString *getRawName() const { return getOperandAs<MDString>(1); } 1688 MDString *getRawConfigurationMacros() const { return getOperandAs<MDString>(2); } 1689 MDString *getRawIncludePath() const { return getOperandAs<MDString>(3); } 1690 MDString *getRawISysRoot() const { return getOperandAs<MDString>(4); } 1691 1692 static bool classof(const Metadata *MD) { 1693 return MD->getMetadataID() == DIModuleKind; 1694 } 1695}; 1696 1697/// \brief Base class for template parameters. 1698class DITemplateParameter : public DINode { 1699protected: 1700 DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage, 1701 unsigned Tag, ArrayRef<Metadata *> Ops) 1702 : DINode(Context, ID, Storage, Tag, Ops) {} 1703 ~DITemplateParameter() = default; 1704 1705public: 1706 StringRef getName() const { return getStringOperand(0); } 1707 DITypeRef getType() const { return DITypeRef(getRawType()); } 1708 1709 MDString *getRawName() const { return getOperandAs<MDString>(0); } 1710 Metadata *getRawType() const { return getOperand(1); } 1711 1712 static bool classof(const Metadata *MD) { 1713 return MD->getMetadataID() == DITemplateTypeParameterKind || 1714 MD->getMetadataID() == DITemplateValueParameterKind; 1715 } 1716}; 1717 1718class DITemplateTypeParameter : public DITemplateParameter { 1719 friend class LLVMContextImpl; 1720 friend class MDNode; 1721 1722 DITemplateTypeParameter(LLVMContext &Context, StorageType Storage, 1723 ArrayRef<Metadata *> Ops) 1724 : DITemplateParameter(Context, DITemplateTypeParameterKind, Storage, 1725 dwarf::DW_TAG_template_type_parameter, Ops) {} 1726 ~DITemplateTypeParameter() = default; 1727 1728 static DITemplateTypeParameter *getImpl(LLVMContext &Context, StringRef Name, 1729 DITypeRef Type, StorageType Storage, 1730 bool ShouldCreate = true) { 1731 return getImpl(Context, getCanonicalMDString(Context, Name), Type, Storage, 1732 ShouldCreate); 1733 } 1734 static DITemplateTypeParameter *getImpl(LLVMContext &Context, MDString *Name, 1735 Metadata *Type, StorageType Storage, 1736 bool ShouldCreate = true); 1737 1738 TempDITemplateTypeParameter cloneImpl() const { 1739 return getTemporary(getContext(), getName(), getType()); 1740 } 1741 1742public: 1743 DEFINE_MDNODE_GET(DITemplateTypeParameter, (StringRef Name, DITypeRef Type), 1744 (Name, Type)) 1745 DEFINE_MDNODE_GET(DITemplateTypeParameter, (MDString * Name, Metadata *Type), 1746 (Name, Type)) 1747 1748 TempDITemplateTypeParameter clone() const { return cloneImpl(); } 1749 1750 static bool classof(const Metadata *MD) { 1751 return MD->getMetadataID() == DITemplateTypeParameterKind; 1752 } 1753}; 1754 1755class DITemplateValueParameter : public DITemplateParameter { 1756 friend class LLVMContextImpl; 1757 friend class MDNode; 1758 1759 DITemplateValueParameter(LLVMContext &Context, StorageType Storage, 1760 unsigned Tag, ArrayRef<Metadata *> Ops) 1761 : DITemplateParameter(Context, DITemplateValueParameterKind, Storage, Tag, 1762 Ops) {} 1763 ~DITemplateValueParameter() = default; 1764 1765 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag, 1766 StringRef Name, DITypeRef Type, 1767 Metadata *Value, StorageType Storage, 1768 bool ShouldCreate = true) { 1769 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), Type, 1770 Value, Storage, ShouldCreate); 1771 } 1772 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag, 1773 MDString *Name, Metadata *Type, 1774 Metadata *Value, StorageType Storage, 1775 bool ShouldCreate = true); 1776 1777 TempDITemplateValueParameter cloneImpl() const { 1778 return getTemporary(getContext(), getTag(), getName(), getType(), 1779 getValue()); 1780 } 1781 1782public: 1783 DEFINE_MDNODE_GET(DITemplateValueParameter, (unsigned Tag, StringRef Name, 1784 DITypeRef Type, Metadata *Value), 1785 (Tag, Name, Type, Value)) 1786 DEFINE_MDNODE_GET(DITemplateValueParameter, (unsigned Tag, MDString *Name, 1787 Metadata *Type, Metadata *Value), 1788 (Tag, Name, Type, Value)) 1789 1790 TempDITemplateValueParameter clone() const { return cloneImpl(); } 1791 1792 Metadata *getValue() const { return getOperand(2); } 1793 1794 static bool classof(const Metadata *MD) { 1795 return MD->getMetadataID() == DITemplateValueParameterKind; 1796 } 1797}; 1798 1799/// \brief Base class for variables. 1800/// 1801/// TODO: Hardcode to DW_TAG_variable. 1802class DIVariable : public DINode { 1803 unsigned Line; 1804 1805protected: 1806 DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 1807 unsigned Line, ArrayRef<Metadata *> Ops) 1808 : DINode(C, ID, Storage, Tag, Ops), Line(Line) {} 1809 ~DIVariable() = default; 1810 1811public: 1812 unsigned getLine() const { return Line; } 1813 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 1814 StringRef getName() const { return getStringOperand(1); } 1815 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 1816 DITypeRef getType() const { return DITypeRef(getRawType()); } 1817 1818 StringRef getFilename() const { 1819 if (auto *F = getFile()) 1820 return F->getFilename(); 1821 return ""; 1822 } 1823 StringRef getDirectory() const { 1824 if (auto *F = getFile()) 1825 return F->getDirectory(); 1826 return ""; 1827 } 1828 1829 Metadata *getRawScope() const { return getOperand(0); } 1830 MDString *getRawName() const { return getOperandAs<MDString>(1); } 1831 Metadata *getRawFile() const { return getOperand(2); } 1832 Metadata *getRawType() const { return getOperand(3); } 1833 1834 static bool classof(const Metadata *MD) { 1835 return MD->getMetadataID() == DILocalVariableKind || 1836 MD->getMetadataID() == DIGlobalVariableKind; 1837 } 1838}; 1839 1840/// \brief Global variables. 1841/// 1842/// TODO: Remove DisplayName. It's always equal to Name. 1843class DIGlobalVariable : public DIVariable { 1844 friend class LLVMContextImpl; 1845 friend class MDNode; 1846 1847 bool IsLocalToUnit; 1848 bool IsDefinition; 1849 1850 DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line, 1851 bool IsLocalToUnit, bool IsDefinition, 1852 ArrayRef<Metadata *> Ops) 1853 : DIVariable(C, DIGlobalVariableKind, Storage, dwarf::DW_TAG_variable, 1854 Line, Ops), 1855 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {} 1856 ~DIGlobalVariable() = default; 1857 1858 static DIGlobalVariable * 1859 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name, 1860 StringRef LinkageName, DIFile *File, unsigned Line, DITypeRef Type, 1861 bool IsLocalToUnit, bool IsDefinition, Constant *Variable, 1862 DIDerivedType *StaticDataMemberDeclaration, StorageType Storage, 1863 bool ShouldCreate = true) { 1864 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 1865 getCanonicalMDString(Context, LinkageName), File, Line, Type, 1866 IsLocalToUnit, IsDefinition, 1867 Variable ? ConstantAsMetadata::get(Variable) : nullptr, 1868 StaticDataMemberDeclaration, Storage, ShouldCreate); 1869 } 1870 static DIGlobalVariable * 1871 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, 1872 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type, 1873 bool IsLocalToUnit, bool IsDefinition, Metadata *Variable, 1874 Metadata *StaticDataMemberDeclaration, StorageType Storage, 1875 bool ShouldCreate = true); 1876 1877 TempDIGlobalVariable cloneImpl() const { 1878 return getTemporary(getContext(), getScope(), getName(), getLinkageName(), 1879 getFile(), getLine(), getType(), isLocalToUnit(), 1880 isDefinition(), getVariable(), 1881 getStaticDataMemberDeclaration()); 1882 } 1883 1884public: 1885 DEFINE_MDNODE_GET(DIGlobalVariable, 1886 (DIScope * Scope, StringRef Name, StringRef LinkageName, 1887 DIFile *File, unsigned Line, DITypeRef Type, 1888 bool IsLocalToUnit, bool IsDefinition, Constant *Variable, 1889 DIDerivedType *StaticDataMemberDeclaration), 1890 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 1891 IsDefinition, Variable, StaticDataMemberDeclaration)) 1892 DEFINE_MDNODE_GET(DIGlobalVariable, 1893 (Metadata * Scope, MDString *Name, MDString *LinkageName, 1894 Metadata *File, unsigned Line, Metadata *Type, 1895 bool IsLocalToUnit, bool IsDefinition, Metadata *Variable, 1896 Metadata *StaticDataMemberDeclaration), 1897 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 1898 IsDefinition, Variable, StaticDataMemberDeclaration)) 1899 1900 TempDIGlobalVariable clone() const { return cloneImpl(); } 1901 1902 bool isLocalToUnit() const { return IsLocalToUnit; } 1903 bool isDefinition() const { return IsDefinition; } 1904 StringRef getDisplayName() const { return getStringOperand(4); } 1905 StringRef getLinkageName() const { return getStringOperand(5); } 1906 Constant *getVariable() const { 1907 if (auto *C = cast_or_null<ConstantAsMetadata>(getRawVariable())) 1908 return dyn_cast<Constant>(C->getValue()); 1909 return nullptr; 1910 } 1911 DIDerivedType *getStaticDataMemberDeclaration() const { 1912 return cast_or_null<DIDerivedType>(getRawStaticDataMemberDeclaration()); 1913 } 1914 1915 MDString *getRawLinkageName() const { return getOperandAs<MDString>(5); } 1916 Metadata *getRawVariable() const { return getOperand(6); } 1917 Metadata *getRawStaticDataMemberDeclaration() const { return getOperand(7); } 1918 1919 static bool classof(const Metadata *MD) { 1920 return MD->getMetadataID() == DIGlobalVariableKind; 1921 } 1922}; 1923 1924/// \brief Local variable. 1925/// 1926/// TODO: Split between arguments and otherwise. 1927/// TODO: Use \c DW_TAG_variable instead of fake tags. 1928/// TODO: Split up flags. 1929class DILocalVariable : public DIVariable { 1930 friend class LLVMContextImpl; 1931 friend class MDNode; 1932 1933 unsigned Arg; 1934 unsigned Flags; 1935 1936 DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Tag, 1937 unsigned Line, unsigned Arg, unsigned Flags, 1938 ArrayRef<Metadata *> Ops) 1939 : DIVariable(C, DILocalVariableKind, Storage, Tag, Line, Ops), Arg(Arg), 1940 Flags(Flags) {} 1941 ~DILocalVariable() = default; 1942 1943 static DILocalVariable *getImpl(LLVMContext &Context, unsigned Tag, 1944 DIScope *Scope, StringRef Name, DIFile *File, 1945 unsigned Line, DITypeRef Type, unsigned Arg, 1946 unsigned Flags, StorageType Storage, 1947 bool ShouldCreate = true) { 1948 return getImpl(Context, Tag, Scope, getCanonicalMDString(Context, Name), 1949 File, Line, Type, Arg, Flags, Storage, ShouldCreate); 1950 } 1951 static DILocalVariable * 1952 getImpl(LLVMContext &Context, unsigned Tag, Metadata *Scope, MDString *Name, 1953 Metadata *File, unsigned Line, Metadata *Type, unsigned Arg, 1954 unsigned Flags, StorageType Storage, bool ShouldCreate = true); 1955 1956 TempDILocalVariable cloneImpl() const { 1957 return getTemporary(getContext(), getTag(), getScope(), getName(), 1958 getFile(), getLine(), getType(), getArg(), getFlags()); 1959 } 1960 1961public: 1962 DEFINE_MDNODE_GET(DILocalVariable, 1963 (unsigned Tag, DILocalScope *Scope, StringRef Name, 1964 DIFile *File, unsigned Line, DITypeRef Type, unsigned Arg, 1965 unsigned Flags), 1966 (Tag, Scope, Name, File, Line, Type, Arg, Flags)) 1967 DEFINE_MDNODE_GET(DILocalVariable, 1968 (unsigned Tag, Metadata *Scope, MDString *Name, 1969 Metadata *File, unsigned Line, Metadata *Type, 1970 unsigned Arg, unsigned Flags), 1971 (Tag, Scope, Name, File, Line, Type, Arg, Flags)) 1972 1973 TempDILocalVariable clone() const { return cloneImpl(); } 1974 1975 /// \brief Get the local scope for this variable. 1976 /// 1977 /// Variables must be defined in a local scope. 1978 DILocalScope *getScope() const { 1979 return cast<DILocalScope>(DIVariable::getScope()); 1980 } 1981 1982 unsigned getArg() const { return Arg; } 1983 unsigned getFlags() const { return Flags; } 1984 1985 bool isArtificial() const { return getFlags() & FlagArtificial; } 1986 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; } 1987 1988 /// \brief Check that a location is valid for this variable. 1989 /// 1990 /// Check that \c DL exists, is in the same subprogram, and has the same 1991 /// inlined-at location as \c this. (Otherwise, it's not a valid attachemnt 1992 /// to a \a DbgInfoIntrinsic.) 1993 bool isValidLocationForIntrinsic(const DILocation *DL) const { 1994 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram(); 1995 } 1996 1997 static bool classof(const Metadata *MD) { 1998 return MD->getMetadataID() == DILocalVariableKind; 1999 } 2000}; 2001 2002/// \brief DWARF expression. 2003/// 2004/// This is (almost) a DWARF expression that modifies the location of a 2005/// variable or (or the location of a single piece of a variable). 2006/// 2007/// FIXME: Instead of DW_OP_plus taking an argument, this should use DW_OP_const 2008/// and have DW_OP_plus consume the topmost elements on the stack. 2009/// 2010/// TODO: Co-allocate the expression elements. 2011/// TODO: Separate from MDNode, or otherwise drop Distinct and Temporary 2012/// storage types. 2013class DIExpression : public MDNode { 2014 friend class LLVMContextImpl; 2015 friend class MDNode; 2016 2017 std::vector<uint64_t> Elements; 2018 2019 DIExpression(LLVMContext &C, StorageType Storage, ArrayRef<uint64_t> Elements) 2020 : MDNode(C, DIExpressionKind, Storage, None), 2021 Elements(Elements.begin(), Elements.end()) {} 2022 ~DIExpression() = default; 2023 2024 static DIExpression *getImpl(LLVMContext &Context, 2025 ArrayRef<uint64_t> Elements, StorageType Storage, 2026 bool ShouldCreate = true); 2027 2028 TempDIExpression cloneImpl() const { 2029 return getTemporary(getContext(), getElements()); 2030 } 2031 2032public: 2033 DEFINE_MDNODE_GET(DIExpression, (ArrayRef<uint64_t> Elements), (Elements)) 2034 2035 TempDIExpression clone() const { return cloneImpl(); } 2036 2037 ArrayRef<uint64_t> getElements() const { return Elements; } 2038 2039 unsigned getNumElements() const { return Elements.size(); } 2040 uint64_t getElement(unsigned I) const { 2041 assert(I < Elements.size() && "Index out of range"); 2042 return Elements[I]; 2043 } 2044 2045 /// \brief Return whether this is a piece of an aggregate variable. 2046 bool isBitPiece() const; 2047 2048 /// \brief Return the offset of this piece in bits. 2049 uint64_t getBitPieceOffset() const; 2050 2051 /// \brief Return the size of this piece in bits. 2052 uint64_t getBitPieceSize() const; 2053 2054 typedef ArrayRef<uint64_t>::iterator element_iterator; 2055 element_iterator elements_begin() const { return getElements().begin(); } 2056 element_iterator elements_end() const { return getElements().end(); } 2057 2058 /// \brief A lightweight wrapper around an expression operand. 2059 /// 2060 /// TODO: Store arguments directly and change \a DIExpression to store a 2061 /// range of these. 2062 class ExprOperand { 2063 const uint64_t *Op; 2064 2065 public: 2066 explicit ExprOperand(const uint64_t *Op) : Op(Op) {} 2067 2068 const uint64_t *get() const { return Op; } 2069 2070 /// \brief Get the operand code. 2071 uint64_t getOp() const { return *Op; } 2072 2073 /// \brief Get an argument to the operand. 2074 /// 2075 /// Never returns the operand itself. 2076 uint64_t getArg(unsigned I) const { return Op[I + 1]; } 2077 2078 unsigned getNumArgs() const { return getSize() - 1; } 2079 2080 /// \brief Return the size of the operand. 2081 /// 2082 /// Return the number of elements in the operand (1 + args). 2083 unsigned getSize() const; 2084 }; 2085 2086 /// \brief An iterator for expression operands. 2087 class expr_op_iterator 2088 : public std::iterator<std::input_iterator_tag, ExprOperand> { 2089 ExprOperand Op; 2090 2091 public: 2092 explicit expr_op_iterator(element_iterator I) : Op(I) {} 2093 2094 element_iterator getBase() const { return Op.get(); } 2095 const ExprOperand &operator*() const { return Op; } 2096 const ExprOperand *operator->() const { return &Op; } 2097 2098 expr_op_iterator &operator++() { 2099 increment(); 2100 return *this; 2101 } 2102 expr_op_iterator operator++(int) { 2103 expr_op_iterator T(*this); 2104 increment(); 2105 return T; 2106 } 2107 2108 /// \brief Get the next iterator. 2109 /// 2110 /// \a std::next() doesn't work because this is technically an 2111 /// input_iterator, but it's a perfectly valid operation. This is an 2112 /// accessor to provide the same functionality. 2113 expr_op_iterator getNext() const { return ++expr_op_iterator(*this); } 2114 2115 bool operator==(const expr_op_iterator &X) const { 2116 return getBase() == X.getBase(); 2117 } 2118 bool operator!=(const expr_op_iterator &X) const { 2119 return getBase() != X.getBase(); 2120 } 2121 2122 private: 2123 void increment() { Op = ExprOperand(getBase() + Op.getSize()); } 2124 }; 2125 2126 /// \brief Visit the elements via ExprOperand wrappers. 2127 /// 2128 /// These range iterators visit elements through \a ExprOperand wrappers. 2129 /// This is not guaranteed to be a valid range unless \a isValid() gives \c 2130 /// true. 2131 /// 2132 /// \pre \a isValid() gives \c true. 2133 /// @{ 2134 expr_op_iterator expr_op_begin() const { 2135 return expr_op_iterator(elements_begin()); 2136 } 2137 expr_op_iterator expr_op_end() const { 2138 return expr_op_iterator(elements_end()); 2139 } 2140 /// @} 2141 2142 bool isValid() const; 2143 2144 static bool classof(const Metadata *MD) { 2145 return MD->getMetadataID() == DIExpressionKind; 2146 } 2147}; 2148 2149class DIObjCProperty : public DINode { 2150 friend class LLVMContextImpl; 2151 friend class MDNode; 2152 2153 unsigned Line; 2154 unsigned Attributes; 2155 2156 DIObjCProperty(LLVMContext &C, StorageType Storage, unsigned Line, 2157 unsigned Attributes, ArrayRef<Metadata *> Ops) 2158 : DINode(C, DIObjCPropertyKind, Storage, dwarf::DW_TAG_APPLE_property, 2159 Ops), 2160 Line(Line), Attributes(Attributes) {} 2161 ~DIObjCProperty() = default; 2162 2163 static DIObjCProperty * 2164 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line, 2165 StringRef GetterName, StringRef SetterName, unsigned Attributes, 2166 DITypeRef Type, StorageType Storage, bool ShouldCreate = true) { 2167 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line, 2168 getCanonicalMDString(Context, GetterName), 2169 getCanonicalMDString(Context, SetterName), Attributes, Type, 2170 Storage, ShouldCreate); 2171 } 2172 static DIObjCProperty *getImpl(LLVMContext &Context, MDString *Name, 2173 Metadata *File, unsigned Line, 2174 MDString *GetterName, MDString *SetterName, 2175 unsigned Attributes, Metadata *Type, 2176 StorageType Storage, bool ShouldCreate = true); 2177 2178 TempDIObjCProperty cloneImpl() const { 2179 return getTemporary(getContext(), getName(), getFile(), getLine(), 2180 getGetterName(), getSetterName(), getAttributes(), 2181 getType()); 2182 } 2183 2184public: 2185 DEFINE_MDNODE_GET(DIObjCProperty, 2186 (StringRef Name, DIFile *File, unsigned Line, 2187 StringRef GetterName, StringRef SetterName, 2188 unsigned Attributes, DITypeRef Type), 2189 (Name, File, Line, GetterName, SetterName, Attributes, 2190 Type)) 2191 DEFINE_MDNODE_GET(DIObjCProperty, 2192 (MDString * Name, Metadata *File, unsigned Line, 2193 MDString *GetterName, MDString *SetterName, 2194 unsigned Attributes, Metadata *Type), 2195 (Name, File, Line, GetterName, SetterName, Attributes, 2196 Type)) 2197 2198 TempDIObjCProperty clone() const { return cloneImpl(); } 2199 2200 unsigned getLine() const { return Line; } 2201 unsigned getAttributes() const { return Attributes; } 2202 StringRef getName() const { return getStringOperand(0); } 2203 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 2204 StringRef getGetterName() const { return getStringOperand(2); } 2205 StringRef getSetterName() const { return getStringOperand(3); } 2206 DITypeRef getType() const { return DITypeRef(getRawType()); } 2207 2208 StringRef getFilename() const { 2209 if (auto *F = getFile()) 2210 return F->getFilename(); 2211 return ""; 2212 } 2213 StringRef getDirectory() const { 2214 if (auto *F = getFile()) 2215 return F->getDirectory(); 2216 return ""; 2217 } 2218 2219 MDString *getRawName() const { return getOperandAs<MDString>(0); } 2220 Metadata *getRawFile() const { return getOperand(1); } 2221 MDString *getRawGetterName() const { return getOperandAs<MDString>(2); } 2222 MDString *getRawSetterName() const { return getOperandAs<MDString>(3); } 2223 Metadata *getRawType() const { return getOperand(4); } 2224 2225 static bool classof(const Metadata *MD) { 2226 return MD->getMetadataID() == DIObjCPropertyKind; 2227 } 2228}; 2229 2230/// \brief An imported module (C++ using directive or similar). 2231class DIImportedEntity : public DINode { 2232 friend class LLVMContextImpl; 2233 friend class MDNode; 2234 2235 unsigned Line; 2236 2237 DIImportedEntity(LLVMContext &C, StorageType Storage, unsigned Tag, 2238 unsigned Line, ArrayRef<Metadata *> Ops) 2239 : DINode(C, DIImportedEntityKind, Storage, Tag, Ops), Line(Line) {} 2240 ~DIImportedEntity() = default; 2241 2242 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag, 2243 DIScope *Scope, DINodeRef Entity, 2244 unsigned Line, StringRef Name, 2245 StorageType Storage, 2246 bool ShouldCreate = true) { 2247 return getImpl(Context, Tag, Scope, Entity, Line, 2248 getCanonicalMDString(Context, Name), Storage, ShouldCreate); 2249 } 2250 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag, 2251 Metadata *Scope, Metadata *Entity, 2252 unsigned Line, MDString *Name, 2253 StorageType Storage, 2254 bool ShouldCreate = true); 2255 2256 TempDIImportedEntity cloneImpl() const { 2257 return getTemporary(getContext(), getTag(), getScope(), getEntity(), 2258 getLine(), getName()); 2259 } 2260 2261public: 2262 DEFINE_MDNODE_GET(DIImportedEntity, 2263 (unsigned Tag, DIScope *Scope, DINodeRef Entity, 2264 unsigned Line, StringRef Name = ""), 2265 (Tag, Scope, Entity, Line, Name)) 2266 DEFINE_MDNODE_GET(DIImportedEntity, 2267 (unsigned Tag, Metadata *Scope, Metadata *Entity, 2268 unsigned Line, MDString *Name), 2269 (Tag, Scope, Entity, Line, Name)) 2270 2271 TempDIImportedEntity clone() const { return cloneImpl(); } 2272 2273 unsigned getLine() const { return Line; } 2274 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 2275 DINodeRef getEntity() const { return DINodeRef(getRawEntity()); } 2276 StringRef getName() const { return getStringOperand(2); } 2277 2278 Metadata *getRawScope() const { return getOperand(0); } 2279 Metadata *getRawEntity() const { return getOperand(1); } 2280 MDString *getRawName() const { return getOperandAs<MDString>(2); } 2281 2282 static bool classof(const Metadata *MD) { 2283 return MD->getMetadataID() == DIImportedEntityKind; 2284 } 2285}; 2286 2287} // end namespace llvm 2288 2289#undef DEFINE_MDNODE_GET_UNPACK_IMPL 2290#undef DEFINE_MDNODE_GET_UNPACK 2291#undef DEFINE_MDNODE_GET 2292 2293#endif 2294