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/ADT/ArrayRef.h" 18 #include "llvm/ADT/BitmaskEnum.h" 19 #include "llvm/ADT/None.h" 20 #include "llvm/ADT/Optional.h" 21 #include "llvm/ADT/PointerUnion.h" 22 #include "llvm/ADT/STLExtras.h" 23 #include "llvm/ADT/SmallVector.h" 24 #include "llvm/ADT/StringRef.h" 25 #include "llvm/ADT/iterator_range.h" 26 #include "llvm/BinaryFormat/Dwarf.h" 27 #include "llvm/IR/Constants.h" 28 #include "llvm/IR/Metadata.h" 29 #include "llvm/Support/Casting.h" 30 #include <cassert> 31 #include <climits> 32 #include <cstddef> 33 #include <cstdint> 34 #include <iterator> 35 #include <type_traits> 36 #include <vector> 37 38 // Helper macros for defining get() overrides. 39 #define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__ 40 #define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS 41 #define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) \ 42 static CLASS *getDistinct(LLVMContext &Context, \ 43 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 44 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \ 45 } \ 46 static Temp##CLASS getTemporary(LLVMContext &Context, \ 47 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 48 return Temp##CLASS( \ 49 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \ 50 } 51 #define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \ 52 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 53 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \ 54 } \ 55 static CLASS *getIfExists(LLVMContext &Context, \ 56 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \ 57 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \ 58 /* ShouldCreate */ false); \ 59 } \ 60 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) 61 62 namespace llvm { 63 64 /// Holds a subclass of DINode. 65 /// 66 /// FIXME: This class doesn't currently make much sense. Previously it was a 67 /// union beteen MDString (for ODR-uniqued types) and things like DIType. To 68 /// support CodeView work, it wasn't deleted outright when MDString-based type 69 /// references were deleted; we'll soon need a similar concept for CodeView 70 /// DITypeIndex. 71 template <class T> class TypedDINodeRef { 72 const Metadata *MD = nullptr; 73 74 public: 75 TypedDINodeRef() = default; TypedDINodeRef(std::nullptr_t)76 TypedDINodeRef(std::nullptr_t) {} TypedDINodeRef(const T * MD)77 TypedDINodeRef(const T *MD) : MD(MD) {} 78 TypedDINodeRef(const Metadata * MD)79 explicit TypedDINodeRef(const Metadata *MD) : MD(MD) { 80 assert((!MD || isa<T>(MD)) && "Expected valid type ref"); 81 } 82 83 template <class U> 84 TypedDINodeRef( 85 const TypedDINodeRef<U> &X, 86 typename std::enable_if<std::is_convertible<U *, T *>::value>::type * = 87 nullptr) MD(X)88 : MD(X) {} 89 90 operator Metadata *() const { return const_cast<Metadata *>(MD); } 91 resolve()92 T *resolve() const { return const_cast<T *>(cast_or_null<T>(MD)); } 93 94 bool operator==(const TypedDINodeRef<T> &X) const { return MD == X.MD; } 95 bool operator!=(const TypedDINodeRef<T> &X) const { return MD != X.MD; } 96 }; 97 98 using DINodeRef = TypedDINodeRef<DINode>; 99 using DIScopeRef = TypedDINodeRef<DIScope>; 100 using DITypeRef = TypedDINodeRef<DIType>; 101 102 class DITypeRefArray { 103 const MDTuple *N = nullptr; 104 105 public: 106 DITypeRefArray() = default; DITypeRefArray(const MDTuple * N)107 DITypeRefArray(const MDTuple *N) : N(N) {} 108 109 explicit operator bool() const { return get(); } 110 explicit operator MDTuple *() const { return get(); } 111 get()112 MDTuple *get() const { return const_cast<MDTuple *>(N); } 113 MDTuple *operator->() const { return get(); } 114 MDTuple &operator*() const { return *get(); } 115 116 // FIXME: Fix callers and remove condition on N. size()117 unsigned size() const { return N ? N->getNumOperands() : 0u; } 118 DITypeRef operator[](unsigned I) const { return DITypeRef(N->getOperand(I)); } 119 120 class iterator : std::iterator<std::input_iterator_tag, DITypeRef, 121 std::ptrdiff_t, void, DITypeRef> { 122 MDNode::op_iterator I = nullptr; 123 124 public: 125 iterator() = default; iterator(MDNode::op_iterator I)126 explicit iterator(MDNode::op_iterator I) : I(I) {} 127 128 DITypeRef operator*() const { return DITypeRef(*I); } 129 130 iterator &operator++() { 131 ++I; 132 return *this; 133 } 134 135 iterator operator++(int) { 136 iterator Temp(*this); 137 ++I; 138 return Temp; 139 } 140 141 bool operator==(const iterator &X) const { return I == X.I; } 142 bool operator!=(const iterator &X) const { return I != X.I; } 143 }; 144 145 // FIXME: Fix callers and remove condition on N. begin()146 iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); } end()147 iterator end() const { return N ? iterator(N->op_end()) : iterator(); } 148 }; 149 150 /// Tagged DWARF-like metadata node. 151 /// 152 /// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*, 153 /// defined in llvm/BinaryFormat/Dwarf.h). Called \a DINode because it's 154 /// potentially used for non-DWARF output. 155 class DINode : public MDNode { 156 friend class LLVMContextImpl; 157 friend class MDNode; 158 159 protected: 160 DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 161 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = None) MDNode(C,ID,Storage,Ops1,Ops2)162 : MDNode(C, ID, Storage, Ops1, Ops2) { 163 assert(Tag < 1u << 16); 164 SubclassData16 = Tag; 165 } 166 ~DINode() = default; 167 getOperandAs(unsigned I)168 template <class Ty> Ty *getOperandAs(unsigned I) const { 169 return cast_or_null<Ty>(getOperand(I)); 170 } 171 getStringOperand(unsigned I)172 StringRef getStringOperand(unsigned I) const { 173 if (auto *S = getOperandAs<MDString>(I)) 174 return S->getString(); 175 return StringRef(); 176 } 177 getCanonicalMDString(LLVMContext & Context,StringRef S)178 static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) { 179 if (S.empty()) 180 return nullptr; 181 return MDString::get(Context, S); 182 } 183 184 /// Allow subclasses to mutate the tag. setTag(unsigned Tag)185 void setTag(unsigned Tag) { SubclassData16 = Tag; } 186 187 public: getTag()188 unsigned getTag() const { return SubclassData16; } 189 190 /// Debug info flags. 191 /// 192 /// The three accessibility flags are mutually exclusive and rolled together 193 /// in the first two bits. 194 enum DIFlags : uint32_t { 195 #define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID, 196 #define DI_FLAG_LARGEST_NEEDED 197 #include "llvm/IR/DebugInfoFlags.def" 198 FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic, 199 FlagPtrToMemberRep = FlagSingleInheritance | FlagMultipleInheritance | 200 FlagVirtualInheritance, 201 LLVM_MARK_AS_BITMASK_ENUM(FlagLargest) 202 }; 203 204 static DIFlags getFlag(StringRef Flag); 205 static StringRef getFlagString(DIFlags Flag); 206 207 /// Split up a flags bitfield. 208 /// 209 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns 210 /// any remaining (unrecognized) bits. 211 static DIFlags splitFlags(DIFlags Flags, 212 SmallVectorImpl<DIFlags> &SplitFlags); 213 classof(const Metadata * MD)214 static bool classof(const Metadata *MD) { 215 switch (MD->getMetadataID()) { 216 default: 217 return false; 218 case GenericDINodeKind: 219 case DISubrangeKind: 220 case DIEnumeratorKind: 221 case DIBasicTypeKind: 222 case DIDerivedTypeKind: 223 case DICompositeTypeKind: 224 case DISubroutineTypeKind: 225 case DIFileKind: 226 case DICompileUnitKind: 227 case DISubprogramKind: 228 case DILexicalBlockKind: 229 case DILexicalBlockFileKind: 230 case DINamespaceKind: 231 case DITemplateTypeParameterKind: 232 case DITemplateValueParameterKind: 233 case DIGlobalVariableKind: 234 case DILocalVariableKind: 235 case DILabelKind: 236 case DIObjCPropertyKind: 237 case DIImportedEntityKind: 238 case DIModuleKind: 239 return true; 240 } 241 } 242 }; 243 244 template <class T> struct simplify_type<const TypedDINodeRef<T>> { 245 using SimpleType = Metadata *; 246 247 static SimpleType getSimplifiedValue(const TypedDINodeRef<T> &MD) { 248 return MD; 249 } 250 }; 251 252 template <class T> 253 struct simplify_type<TypedDINodeRef<T>> 254 : simplify_type<const TypedDINodeRef<T>> {}; 255 256 /// Generic tagged DWARF-like metadata node. 257 /// 258 /// An un-specialized DWARF-like metadata node. The first operand is a 259 /// (possibly empty) null-separated \a MDString header that contains arbitrary 260 /// fields. The remaining operands are \a dwarf_operands(), and are pointers 261 /// to other metadata. 262 class GenericDINode : public DINode { 263 friend class LLVMContextImpl; 264 friend class MDNode; 265 266 GenericDINode(LLVMContext &C, StorageType Storage, unsigned Hash, 267 unsigned Tag, ArrayRef<Metadata *> Ops1, 268 ArrayRef<Metadata *> Ops2) 269 : DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) { 270 setHash(Hash); 271 } 272 ~GenericDINode() { dropAllReferences(); } 273 274 void setHash(unsigned Hash) { SubclassData32 = Hash; } 275 void recalculateHash(); 276 277 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag, 278 StringRef Header, ArrayRef<Metadata *> DwarfOps, 279 StorageType Storage, bool ShouldCreate = true) { 280 return getImpl(Context, Tag, getCanonicalMDString(Context, Header), 281 DwarfOps, Storage, ShouldCreate); 282 } 283 284 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag, 285 MDString *Header, ArrayRef<Metadata *> DwarfOps, 286 StorageType Storage, bool ShouldCreate = true); 287 288 TempGenericDINode cloneImpl() const { 289 return getTemporary( 290 getContext(), getTag(), getHeader(), 291 SmallVector<Metadata *, 4>(dwarf_op_begin(), dwarf_op_end())); 292 } 293 294 public: 295 unsigned getHash() const { return SubclassData32; } 296 297 DEFINE_MDNODE_GET(GenericDINode, (unsigned Tag, StringRef Header, 298 ArrayRef<Metadata *> DwarfOps), 299 (Tag, Header, DwarfOps)) 300 DEFINE_MDNODE_GET(GenericDINode, (unsigned Tag, MDString *Header, 301 ArrayRef<Metadata *> DwarfOps), 302 (Tag, Header, DwarfOps)) 303 304 /// Return a (temporary) clone of this. 305 TempGenericDINode clone() const { return cloneImpl(); } 306 307 unsigned getTag() const { return SubclassData16; } 308 StringRef getHeader() const { return getStringOperand(0); } 309 MDString *getRawHeader() const { return getOperandAs<MDString>(0); } 310 311 op_iterator dwarf_op_begin() const { return op_begin() + 1; } 312 op_iterator dwarf_op_end() const { return op_end(); } 313 op_range dwarf_operands() const { 314 return op_range(dwarf_op_begin(), dwarf_op_end()); 315 } 316 317 unsigned getNumDwarfOperands() const { return getNumOperands() - 1; } 318 const MDOperand &getDwarfOperand(unsigned I) const { 319 return getOperand(I + 1); 320 } 321 void replaceDwarfOperandWith(unsigned I, Metadata *New) { 322 replaceOperandWith(I + 1, New); 323 } 324 325 static bool classof(const Metadata *MD) { 326 return MD->getMetadataID() == GenericDINodeKind; 327 } 328 }; 329 330 /// Array subrange. 331 /// 332 /// TODO: Merge into node for DW_TAG_array_type, which should have a custom 333 /// type. 334 class DISubrange : public DINode { 335 friend class LLVMContextImpl; 336 friend class MDNode; 337 338 int64_t LowerBound; 339 340 DISubrange(LLVMContext &C, StorageType Storage, Metadata *Node, 341 int64_t LowerBound, ArrayRef<Metadata *> Ops) 342 : DINode(C, DISubrangeKind, Storage, dwarf::DW_TAG_subrange_type, Ops), 343 LowerBound(LowerBound) {} 344 345 ~DISubrange() = default; 346 347 static DISubrange *getImpl(LLVMContext &Context, int64_t Count, 348 int64_t LowerBound, StorageType Storage, 349 bool ShouldCreate = true); 350 351 static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode, 352 int64_t LowerBound, StorageType Storage, 353 bool ShouldCreate = true); 354 355 TempDISubrange cloneImpl() const { 356 return getTemporary(getContext(), getRawCountNode(), getLowerBound()); 357 } 358 359 public: 360 DEFINE_MDNODE_GET(DISubrange, (int64_t Count, int64_t LowerBound = 0), 361 (Count, LowerBound)) 362 363 DEFINE_MDNODE_GET(DISubrange, (Metadata *CountNode, int64_t LowerBound = 0), 364 (CountNode, LowerBound)) 365 366 TempDISubrange clone() const { return cloneImpl(); } 367 368 int64_t getLowerBound() const { return LowerBound; } 369 370 Metadata *getRawCountNode() const { 371 return getOperand(0).get(); 372 } 373 374 typedef PointerUnion<ConstantInt*, DIVariable*> CountType; 375 376 CountType getCount() const { 377 if (auto *MD = dyn_cast<ConstantAsMetadata>(getRawCountNode())) 378 return CountType(cast<ConstantInt>(MD->getValue())); 379 380 if (auto *DV = dyn_cast<DIVariable>(getRawCountNode())) 381 return CountType(DV); 382 383 return CountType(); 384 } 385 386 static bool classof(const Metadata *MD) { 387 return MD->getMetadataID() == DISubrangeKind; 388 } 389 }; 390 391 /// Enumeration value. 392 /// 393 /// TODO: Add a pointer to the context (DW_TAG_enumeration_type) once that no 394 /// longer creates a type cycle. 395 class DIEnumerator : public DINode { 396 friend class LLVMContextImpl; 397 friend class MDNode; 398 399 int64_t Value; 400 DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value, 401 bool IsUnsigned, ArrayRef<Metadata *> Ops) 402 : DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops), 403 Value(Value) { 404 SubclassData32 = IsUnsigned; 405 } 406 ~DIEnumerator() = default; 407 408 static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value, 409 bool IsUnsigned, StringRef Name, 410 StorageType Storage, bool ShouldCreate = true) { 411 return getImpl(Context, Value, IsUnsigned, 412 getCanonicalMDString(Context, Name), Storage, ShouldCreate); 413 } 414 static DIEnumerator *getImpl(LLVMContext &Context, int64_t Value, 415 bool IsUnsigned, MDString *Name, 416 StorageType Storage, bool ShouldCreate = true); 417 418 TempDIEnumerator cloneImpl() const { 419 return getTemporary(getContext(), getValue(), isUnsigned(), getName()); 420 } 421 422 public: 423 DEFINE_MDNODE_GET(DIEnumerator, (int64_t Value, bool IsUnsigned, StringRef Name), 424 (Value, IsUnsigned, Name)) 425 DEFINE_MDNODE_GET(DIEnumerator, (int64_t Value, bool IsUnsigned, MDString *Name), 426 (Value, IsUnsigned, Name)) 427 428 TempDIEnumerator clone() const { return cloneImpl(); } 429 430 int64_t getValue() const { return Value; } 431 bool isUnsigned() const { return SubclassData32; } 432 StringRef getName() const { return getStringOperand(0); } 433 434 MDString *getRawName() const { return getOperandAs<MDString>(0); } 435 436 static bool classof(const Metadata *MD) { 437 return MD->getMetadataID() == DIEnumeratorKind; 438 } 439 }; 440 441 /// Base class for scope-like contexts. 442 /// 443 /// Base class for lexical scopes and types (which are also declaration 444 /// contexts). 445 /// 446 /// TODO: Separate the concepts of declaration contexts and lexical scopes. 447 class DIScope : public DINode { 448 protected: 449 DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 450 ArrayRef<Metadata *> Ops) 451 : DINode(C, ID, Storage, Tag, Ops) {} 452 ~DIScope() = default; 453 454 public: 455 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 456 457 inline StringRef getFilename() const; 458 inline StringRef getDirectory() const; 459 inline Optional<StringRef> getSource() const; 460 461 StringRef getName() const; 462 DIScopeRef getScope() const; 463 464 /// Return the raw underlying file. 465 /// 466 /// A \a DIFile is a \a DIScope, but it doesn't point at a separate file (it 467 /// \em is the file). If \c this is an \a DIFile, we need to return \c this. 468 /// Otherwise, return the first operand, which is where all other subclasses 469 /// store their file pointer. 470 Metadata *getRawFile() const { 471 return isa<DIFile>(this) ? const_cast<DIScope *>(this) 472 : static_cast<Metadata *>(getOperand(0)); 473 } 474 475 static bool classof(const Metadata *MD) { 476 switch (MD->getMetadataID()) { 477 default: 478 return false; 479 case DIBasicTypeKind: 480 case DIDerivedTypeKind: 481 case DICompositeTypeKind: 482 case DISubroutineTypeKind: 483 case DIFileKind: 484 case DICompileUnitKind: 485 case DISubprogramKind: 486 case DILexicalBlockKind: 487 case DILexicalBlockFileKind: 488 case DINamespaceKind: 489 case DIModuleKind: 490 return true; 491 } 492 } 493 }; 494 495 /// File. 496 /// 497 /// TODO: Merge with directory/file node (including users). 498 /// TODO: Canonicalize paths on creation. 499 class DIFile : public DIScope { 500 friend class LLVMContextImpl; 501 friend class MDNode; 502 503 public: 504 /// Which algorithm (e.g. MD5) a checksum was generated with. 505 /// 506 /// The encoding is explicit because it is used directly in Bitcode. The 507 /// value 0 is reserved to indicate the absence of a checksum in Bitcode. 508 enum ChecksumKind { 509 // The first variant was originally CSK_None, encoded as 0. The new 510 // internal representation removes the need for this by wrapping the 511 // ChecksumInfo in an Optional, but to preserve Bitcode compatibility the 0 512 // encoding is reserved. 513 CSK_MD5 = 1, 514 CSK_SHA1 = 2, 515 CSK_Last = CSK_SHA1 // Should be last enumeration. 516 }; 517 518 /// A single checksum, represented by a \a Kind and a \a Value (a string). 519 template <typename T> 520 struct ChecksumInfo { 521 /// The kind of checksum which \a Value encodes. 522 ChecksumKind Kind; 523 /// The string value of the checksum. 524 T Value; 525 526 ChecksumInfo(ChecksumKind Kind, T Value) : Kind(Kind), Value(Value) { } 527 ~ChecksumInfo() = default; 528 bool operator==(const ChecksumInfo<T> &X) const { 529 return Kind == X.Kind && Value == X.Value; 530 } 531 bool operator!=(const ChecksumInfo<T> &X) const { return !(*this == X); } 532 StringRef getKindAsString() const { return getChecksumKindAsString(Kind); } 533 }; 534 535 private: 536 Optional<ChecksumInfo<MDString *>> Checksum; 537 Optional<MDString *> Source; 538 539 DIFile(LLVMContext &C, StorageType Storage, 540 Optional<ChecksumInfo<MDString *>> CS, Optional<MDString *> Src, 541 ArrayRef<Metadata *> Ops) 542 : DIScope(C, DIFileKind, Storage, dwarf::DW_TAG_file_type, Ops), 543 Checksum(CS), Source(Src) {} 544 ~DIFile() = default; 545 546 static DIFile *getImpl(LLVMContext &Context, StringRef Filename, 547 StringRef Directory, 548 Optional<ChecksumInfo<StringRef>> CS, 549 Optional<StringRef> Source, 550 StorageType Storage, bool ShouldCreate = true) { 551 Optional<ChecksumInfo<MDString *>> MDChecksum; 552 if (CS) 553 MDChecksum.emplace(CS->Kind, getCanonicalMDString(Context, CS->Value)); 554 return getImpl(Context, getCanonicalMDString(Context, Filename), 555 getCanonicalMDString(Context, Directory), MDChecksum, 556 Source ? Optional<MDString *>(getCanonicalMDString(Context, *Source)) : None, 557 Storage, ShouldCreate); 558 } 559 static DIFile *getImpl(LLVMContext &Context, MDString *Filename, 560 MDString *Directory, 561 Optional<ChecksumInfo<MDString *>> CS, 562 Optional<MDString *> Source, StorageType Storage, 563 bool ShouldCreate = true); 564 565 TempDIFile cloneImpl() const { 566 return getTemporary(getContext(), getFilename(), getDirectory(), 567 getChecksum(), getSource()); 568 } 569 570 public: 571 DEFINE_MDNODE_GET(DIFile, (StringRef Filename, StringRef Directory, 572 Optional<ChecksumInfo<StringRef>> CS = None, 573 Optional<StringRef> Source = None), 574 (Filename, Directory, CS, Source)) 575 DEFINE_MDNODE_GET(DIFile, (MDString * Filename, MDString *Directory, 576 Optional<ChecksumInfo<MDString *>> CS = None, 577 Optional<MDString *> Source = None), 578 (Filename, Directory, CS, Source)) 579 580 TempDIFile clone() const { return cloneImpl(); } 581 582 StringRef getFilename() const { return getStringOperand(0); } 583 StringRef getDirectory() const { return getStringOperand(1); } 584 Optional<ChecksumInfo<StringRef>> getChecksum() const { 585 Optional<ChecksumInfo<StringRef>> StringRefChecksum; 586 if (Checksum) 587 StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString()); 588 return StringRefChecksum; 589 } 590 Optional<StringRef> getSource() const { 591 return Source ? Optional<StringRef>((*Source)->getString()) : None; 592 } 593 594 MDString *getRawFilename() const { return getOperandAs<MDString>(0); } 595 MDString *getRawDirectory() const { return getOperandAs<MDString>(1); } 596 Optional<ChecksumInfo<MDString *>> getRawChecksum() const { return Checksum; } 597 Optional<MDString *> getRawSource() const { return Source; } 598 599 static StringRef getChecksumKindAsString(ChecksumKind CSKind); 600 static Optional<ChecksumKind> getChecksumKind(StringRef CSKindStr); 601 602 static bool classof(const Metadata *MD) { 603 return MD->getMetadataID() == DIFileKind; 604 } 605 }; 606 607 StringRef DIScope::getFilename() const { 608 if (auto *F = getFile()) 609 return F->getFilename(); 610 return ""; 611 } 612 613 StringRef DIScope::getDirectory() const { 614 if (auto *F = getFile()) 615 return F->getDirectory(); 616 return ""; 617 } 618 619 Optional<StringRef> DIScope::getSource() const { 620 if (auto *F = getFile()) 621 return F->getSource(); 622 return None; 623 } 624 625 /// Base class for types. 626 /// 627 /// TODO: Remove the hardcoded name and context, since many types don't use 628 /// them. 629 /// TODO: Split up flags. 630 class DIType : public DIScope { 631 unsigned Line; 632 DIFlags Flags; 633 uint64_t SizeInBits; 634 uint64_t OffsetInBits; 635 uint32_t AlignInBits; 636 637 protected: 638 DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 639 unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, 640 uint64_t OffsetInBits, DIFlags Flags, ArrayRef<Metadata *> Ops) 641 : DIScope(C, ID, Storage, Tag, Ops) { 642 init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags); 643 } 644 ~DIType() = default; 645 646 void init(unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, 647 uint64_t OffsetInBits, DIFlags Flags) { 648 this->Line = Line; 649 this->Flags = Flags; 650 this->SizeInBits = SizeInBits; 651 this->AlignInBits = AlignInBits; 652 this->OffsetInBits = OffsetInBits; 653 } 654 655 /// Change fields in place. 656 void mutate(unsigned Tag, unsigned Line, uint64_t SizeInBits, 657 uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags) { 658 assert(isDistinct() && "Only distinct nodes can mutate"); 659 setTag(Tag); 660 init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags); 661 } 662 663 public: 664 TempDIType clone() const { 665 return TempDIType(cast<DIType>(MDNode::clone().release())); 666 } 667 668 unsigned getLine() const { return Line; } 669 uint64_t getSizeInBits() const { return SizeInBits; } 670 uint32_t getAlignInBits() const { return AlignInBits; } 671 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; } 672 uint64_t getOffsetInBits() const { return OffsetInBits; } 673 DIFlags getFlags() const { return Flags; } 674 675 DIScopeRef getScope() const { return DIScopeRef(getRawScope()); } 676 StringRef getName() const { return getStringOperand(2); } 677 678 679 Metadata *getRawScope() const { return getOperand(1); } 680 MDString *getRawName() const { return getOperandAs<MDString>(2); } 681 682 /// Returns a new temporary DIType with updated Flags 683 TempDIType cloneWithFlags(DIFlags NewFlags) const { 684 auto NewTy = clone(); 685 NewTy->Flags = NewFlags; 686 return NewTy; 687 } 688 689 bool isPrivate() const { 690 return (getFlags() & FlagAccessibility) == FlagPrivate; 691 } 692 bool isProtected() const { 693 return (getFlags() & FlagAccessibility) == FlagProtected; 694 } 695 bool isPublic() const { 696 return (getFlags() & FlagAccessibility) == FlagPublic; 697 } 698 bool isForwardDecl() const { return getFlags() & FlagFwdDecl; } 699 bool isAppleBlockExtension() const { return getFlags() & FlagAppleBlock; } 700 bool isBlockByrefStruct() const { return getFlags() & FlagBlockByrefStruct; } 701 bool isVirtual() const { return getFlags() & FlagVirtual; } 702 bool isArtificial() const { return getFlags() & FlagArtificial; } 703 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; } 704 bool isObjcClassComplete() const { 705 return getFlags() & FlagObjcClassComplete; 706 } 707 bool isVector() const { return getFlags() & FlagVector; } 708 bool isBitField() const { return getFlags() & FlagBitField; } 709 bool isStaticMember() const { return getFlags() & FlagStaticMember; } 710 bool isLValueReference() const { return getFlags() & FlagLValueReference; } 711 bool isRValueReference() const { return getFlags() & FlagRValueReference; } 712 bool isTypePassByValue() const { return getFlags() & FlagTypePassByValue; } 713 bool isTypePassByReference() const { 714 return getFlags() & FlagTypePassByReference; 715 } 716 bool isBigEndian() const { return getFlags() & FlagBigEndian; } 717 bool isLittleEndian() const { return getFlags() & FlagLittleEndian; } 718 719 static bool classof(const Metadata *MD) { 720 switch (MD->getMetadataID()) { 721 default: 722 return false; 723 case DIBasicTypeKind: 724 case DIDerivedTypeKind: 725 case DICompositeTypeKind: 726 case DISubroutineTypeKind: 727 return true; 728 } 729 } 730 }; 731 732 /// Basic type, like 'int' or 'float'. 733 /// 734 /// TODO: Split out DW_TAG_unspecified_type. 735 /// TODO: Drop unused accessors. 736 class DIBasicType : public DIType { 737 friend class LLVMContextImpl; 738 friend class MDNode; 739 740 unsigned Encoding; 741 742 DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag, 743 uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, 744 DIFlags Flags, ArrayRef<Metadata *> Ops) 745 : DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0, 746 Flags, Ops), 747 Encoding(Encoding) {} 748 ~DIBasicType() = default; 749 750 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag, 751 StringRef Name, uint64_t SizeInBits, 752 uint32_t AlignInBits, unsigned Encoding, 753 DIFlags Flags, StorageType Storage, 754 bool ShouldCreate = true) { 755 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), 756 SizeInBits, AlignInBits, Encoding, Flags, Storage, 757 ShouldCreate); 758 } 759 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag, 760 MDString *Name, uint64_t SizeInBits, 761 uint32_t AlignInBits, unsigned Encoding, 762 DIFlags Flags, StorageType Storage, 763 bool ShouldCreate = true); 764 765 TempDIBasicType cloneImpl() const { 766 return getTemporary(getContext(), getTag(), getName(), getSizeInBits(), 767 getAlignInBits(), getEncoding(), getFlags()); 768 } 769 770 public: 771 DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name), 772 (Tag, Name, 0, 0, 0, FlagZero)) 773 DEFINE_MDNODE_GET(DIBasicType, 774 (unsigned Tag, StringRef Name, uint64_t SizeInBits, 775 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags), 776 (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags)) 777 DEFINE_MDNODE_GET(DIBasicType, 778 (unsigned Tag, MDString *Name, uint64_t SizeInBits, 779 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags), 780 (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags)) 781 782 TempDIBasicType clone() const { return cloneImpl(); } 783 784 unsigned getEncoding() const { return Encoding; } 785 786 enum class Signedness { Signed, Unsigned }; 787 788 /// Return the signedness of this type, or None if this type is neither 789 /// signed nor unsigned. 790 Optional<Signedness> getSignedness() const; 791 792 static bool classof(const Metadata *MD) { 793 return MD->getMetadataID() == DIBasicTypeKind; 794 } 795 }; 796 797 /// Derived types. 798 /// 799 /// This includes qualified types, pointers, references, friends, typedefs, and 800 /// class members. 801 /// 802 /// TODO: Split out members (inheritance, fields, methods, etc.). 803 class DIDerivedType : public DIType { 804 friend class LLVMContextImpl; 805 friend class MDNode; 806 807 /// The DWARF address space of the memory pointed to or referenced by a 808 /// pointer or reference type respectively. 809 Optional<unsigned> DWARFAddressSpace; 810 811 DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag, 812 unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, 813 uint64_t OffsetInBits, Optional<unsigned> DWARFAddressSpace, 814 DIFlags Flags, ArrayRef<Metadata *> Ops) 815 : DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits, 816 AlignInBits, OffsetInBits, Flags, Ops), 817 DWARFAddressSpace(DWARFAddressSpace) {} 818 ~DIDerivedType() = default; 819 820 static DIDerivedType *getImpl(LLVMContext &Context, unsigned Tag, 821 StringRef Name, DIFile *File, unsigned Line, 822 DIScopeRef Scope, DITypeRef BaseType, 823 uint64_t SizeInBits, uint32_t AlignInBits, 824 uint64_t OffsetInBits, 825 Optional<unsigned> DWARFAddressSpace, 826 DIFlags Flags, Metadata *ExtraData, 827 StorageType Storage, bool ShouldCreate = true) { 828 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File, 829 Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, 830 DWARFAddressSpace, Flags, ExtraData, Storage, ShouldCreate); 831 } 832 static DIDerivedType *getImpl(LLVMContext &Context, unsigned Tag, 833 MDString *Name, Metadata *File, unsigned Line, 834 Metadata *Scope, Metadata *BaseType, 835 uint64_t SizeInBits, uint32_t AlignInBits, 836 uint64_t OffsetInBits, 837 Optional<unsigned> DWARFAddressSpace, 838 DIFlags Flags, Metadata *ExtraData, 839 StorageType Storage, bool ShouldCreate = true); 840 841 TempDIDerivedType cloneImpl() const { 842 return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(), 843 getScope(), getBaseType(), getSizeInBits(), 844 getAlignInBits(), getOffsetInBits(), 845 getDWARFAddressSpace(), getFlags(), getExtraData()); 846 } 847 848 public: 849 DEFINE_MDNODE_GET(DIDerivedType, 850 (unsigned Tag, MDString *Name, Metadata *File, 851 unsigned Line, Metadata *Scope, Metadata *BaseType, 852 uint64_t SizeInBits, uint32_t AlignInBits, 853 uint64_t OffsetInBits, 854 Optional<unsigned> DWARFAddressSpace, DIFlags Flags, 855 Metadata *ExtraData = nullptr), 856 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 857 AlignInBits, OffsetInBits, DWARFAddressSpace, Flags, 858 ExtraData)) 859 DEFINE_MDNODE_GET(DIDerivedType, 860 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line, 861 DIScopeRef Scope, DITypeRef BaseType, uint64_t SizeInBits, 862 uint32_t AlignInBits, uint64_t OffsetInBits, 863 Optional<unsigned> DWARFAddressSpace, DIFlags Flags, 864 Metadata *ExtraData = nullptr), 865 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 866 AlignInBits, OffsetInBits, DWARFAddressSpace, Flags, 867 ExtraData)) 868 869 TempDIDerivedType clone() const { return cloneImpl(); } 870 871 /// Get the base type this is derived from. 872 DITypeRef getBaseType() const { return DITypeRef(getRawBaseType()); } 873 Metadata *getRawBaseType() const { return getOperand(3); } 874 875 /// \returns The DWARF address space of the memory pointed to or referenced by 876 /// a pointer or reference type respectively. 877 Optional<unsigned> getDWARFAddressSpace() const { return DWARFAddressSpace; } 878 879 /// Get extra data associated with this derived type. 880 /// 881 /// Class type for pointer-to-members, objective-c property node for ivars, 882 /// global constant wrapper for static members, or virtual base pointer offset 883 /// for inheritance. 884 /// 885 /// TODO: Separate out types that need this extra operand: pointer-to-member 886 /// types and member fields (static members and ivars). 887 Metadata *getExtraData() const { return getRawExtraData(); } 888 Metadata *getRawExtraData() const { return getOperand(4); } 889 890 /// Get casted version of extra data. 891 /// @{ 892 DITypeRef getClassType() const { 893 assert(getTag() == dwarf::DW_TAG_ptr_to_member_type); 894 return DITypeRef(getExtraData()); 895 } 896 897 DIObjCProperty *getObjCProperty() const { 898 return dyn_cast_or_null<DIObjCProperty>(getExtraData()); 899 } 900 901 uint32_t getVBPtrOffset() const { 902 assert(getTag() == dwarf::DW_TAG_inheritance); 903 if (auto *CM = cast_or_null<ConstantAsMetadata>(getExtraData())) 904 if (auto *CI = dyn_cast_or_null<ConstantInt>(CM->getValue())) 905 return static_cast<uint32_t>(CI->getZExtValue()); 906 return 0; 907 } 908 909 Constant *getStorageOffsetInBits() const { 910 assert(getTag() == dwarf::DW_TAG_member && isBitField()); 911 if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData())) 912 return C->getValue(); 913 return nullptr; 914 } 915 916 Constant *getConstant() const { 917 assert(getTag() == dwarf::DW_TAG_member && isStaticMember()); 918 if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData())) 919 return C->getValue(); 920 return nullptr; 921 } 922 Constant *getDiscriminantValue() const { 923 assert(getTag() == dwarf::DW_TAG_member && !isStaticMember()); 924 if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData())) 925 return C->getValue(); 926 return nullptr; 927 } 928 /// @} 929 930 static bool classof(const Metadata *MD) { 931 return MD->getMetadataID() == DIDerivedTypeKind; 932 } 933 }; 934 935 /// Composite types. 936 /// 937 /// TODO: Detach from DerivedTypeBase (split out MDEnumType?). 938 /// TODO: Create a custom, unrelated node for DW_TAG_array_type. 939 class DICompositeType : public DIType { 940 friend class LLVMContextImpl; 941 friend class MDNode; 942 943 unsigned RuntimeLang; 944 945 DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag, 946 unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, 947 uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, 948 ArrayRef<Metadata *> Ops) 949 : DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits, 950 AlignInBits, OffsetInBits, Flags, Ops), 951 RuntimeLang(RuntimeLang) {} 952 ~DICompositeType() = default; 953 954 /// Change fields in place. 955 void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang, 956 uint64_t SizeInBits, uint32_t AlignInBits, 957 uint64_t OffsetInBits, DIFlags Flags) { 958 assert(isDistinct() && "Only distinct nodes can mutate"); 959 assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate"); 960 this->RuntimeLang = RuntimeLang; 961 DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits, Flags); 962 } 963 964 static DICompositeType * 965 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File, 966 unsigned Line, DIScopeRef Scope, DITypeRef BaseType, 967 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, 968 DIFlags Flags, DINodeArray Elements, unsigned RuntimeLang, 969 DITypeRef VTableHolder, DITemplateParameterArray TemplateParams, 970 StringRef Identifier, DIDerivedType *Discriminator, 971 StorageType Storage, bool ShouldCreate = true) { 972 return getImpl( 973 Context, Tag, getCanonicalMDString(Context, Name), File, Line, Scope, 974 BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements.get(), 975 RuntimeLang, VTableHolder, TemplateParams.get(), 976 getCanonicalMDString(Context, Identifier), Discriminator, Storage, ShouldCreate); 977 } 978 static DICompositeType * 979 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File, 980 unsigned Line, Metadata *Scope, Metadata *BaseType, 981 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, 982 DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, 983 Metadata *VTableHolder, Metadata *TemplateParams, 984 MDString *Identifier, Metadata *Discriminator, 985 StorageType Storage, bool ShouldCreate = true); 986 987 TempDICompositeType cloneImpl() const { 988 return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(), 989 getScope(), getBaseType(), getSizeInBits(), 990 getAlignInBits(), getOffsetInBits(), getFlags(), 991 getElements(), getRuntimeLang(), getVTableHolder(), 992 getTemplateParams(), getIdentifier(), getDiscriminator()); 993 } 994 995 public: 996 DEFINE_MDNODE_GET(DICompositeType, 997 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line, 998 DIScopeRef Scope, DITypeRef BaseType, uint64_t SizeInBits, 999 uint32_t AlignInBits, uint64_t OffsetInBits, 1000 DIFlags Flags, DINodeArray Elements, unsigned RuntimeLang, 1001 DITypeRef VTableHolder, 1002 DITemplateParameterArray TemplateParams = nullptr, 1003 StringRef Identifier = "", DIDerivedType *Discriminator = nullptr), 1004 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1005 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 1006 VTableHolder, TemplateParams, Identifier, Discriminator)) 1007 DEFINE_MDNODE_GET(DICompositeType, 1008 (unsigned Tag, MDString *Name, Metadata *File, 1009 unsigned Line, Metadata *Scope, Metadata *BaseType, 1010 uint64_t SizeInBits, uint32_t AlignInBits, 1011 uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements, 1012 unsigned RuntimeLang, Metadata *VTableHolder, 1013 Metadata *TemplateParams = nullptr, 1014 MDString *Identifier = nullptr, 1015 Metadata *Discriminator = nullptr), 1016 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1017 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 1018 VTableHolder, TemplateParams, Identifier, Discriminator)) 1019 1020 TempDICompositeType clone() const { return cloneImpl(); } 1021 1022 /// Get a DICompositeType with the given ODR identifier. 1023 /// 1024 /// If \a LLVMContext::isODRUniquingDebugTypes(), gets the mapped 1025 /// DICompositeType for the given ODR \c Identifier. If none exists, creates 1026 /// a new node. 1027 /// 1028 /// Else, returns \c nullptr. 1029 static DICompositeType * 1030 getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, 1031 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, 1032 Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, 1033 uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements, 1034 unsigned RuntimeLang, Metadata *VTableHolder, 1035 Metadata *TemplateParams, Metadata *Discriminator); 1036 static DICompositeType *getODRTypeIfExists(LLVMContext &Context, 1037 MDString &Identifier); 1038 1039 /// Build a DICompositeType with the given ODR identifier. 1040 /// 1041 /// Looks up the mapped DICompositeType for the given ODR \c Identifier. If 1042 /// it doesn't exist, creates a new one. If it does exist and \a 1043 /// isForwardDecl(), and the new arguments would be a definition, mutates the 1044 /// the type in place. In either case, returns the type. 1045 /// 1046 /// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns 1047 /// nullptr. 1048 static DICompositeType * 1049 buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, 1050 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, 1051 Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, 1052 uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements, 1053 unsigned RuntimeLang, Metadata *VTableHolder, 1054 Metadata *TemplateParams, Metadata *Discriminator); 1055 1056 DITypeRef getBaseType() const { return DITypeRef(getRawBaseType()); } 1057 DINodeArray getElements() const { 1058 return cast_or_null<MDTuple>(getRawElements()); 1059 } 1060 DITypeRef getVTableHolder() const { return DITypeRef(getRawVTableHolder()); } 1061 DITemplateParameterArray getTemplateParams() const { 1062 return cast_or_null<MDTuple>(getRawTemplateParams()); 1063 } 1064 StringRef getIdentifier() const { return getStringOperand(7); } 1065 unsigned getRuntimeLang() const { return RuntimeLang; } 1066 1067 Metadata *getRawBaseType() const { return getOperand(3); } 1068 Metadata *getRawElements() const { return getOperand(4); } 1069 Metadata *getRawVTableHolder() const { return getOperand(5); } 1070 Metadata *getRawTemplateParams() const { return getOperand(6); } 1071 MDString *getRawIdentifier() const { return getOperandAs<MDString>(7); } 1072 Metadata *getRawDiscriminator() const { return getOperand(8); } 1073 DIDerivedType *getDiscriminator() const { return getOperandAs<DIDerivedType>(8); } 1074 1075 /// Replace operands. 1076 /// 1077 /// If this \a isUniqued() and not \a isResolved(), on a uniquing collision 1078 /// this will be RAUW'ed and deleted. Use a \a TrackingMDRef to keep track 1079 /// of its movement if necessary. 1080 /// @{ 1081 void replaceElements(DINodeArray Elements) { 1082 #ifndef NDEBUG 1083 for (DINode *Op : getElements()) 1084 assert(is_contained(Elements->operands(), Op) && 1085 "Lost a member during member list replacement"); 1086 #endif 1087 replaceOperandWith(4, Elements.get()); 1088 } 1089 1090 void replaceVTableHolder(DITypeRef VTableHolder) { 1091 replaceOperandWith(5, VTableHolder); 1092 } 1093 1094 void replaceTemplateParams(DITemplateParameterArray TemplateParams) { 1095 replaceOperandWith(6, TemplateParams.get()); 1096 } 1097 /// @} 1098 1099 static bool classof(const Metadata *MD) { 1100 return MD->getMetadataID() == DICompositeTypeKind; 1101 } 1102 }; 1103 1104 /// Type array for a subprogram. 1105 /// 1106 /// TODO: Fold the array of types in directly as operands. 1107 class DISubroutineType : public DIType { 1108 friend class LLVMContextImpl; 1109 friend class MDNode; 1110 1111 /// The calling convention used with DW_AT_calling_convention. Actually of 1112 /// type dwarf::CallingConvention. 1113 uint8_t CC; 1114 1115 DISubroutineType(LLVMContext &C, StorageType Storage, DIFlags Flags, 1116 uint8_t CC, ArrayRef<Metadata *> Ops) 1117 : DIType(C, DISubroutineTypeKind, Storage, dwarf::DW_TAG_subroutine_type, 1118 0, 0, 0, 0, Flags, Ops), 1119 CC(CC) {} 1120 ~DISubroutineType() = default; 1121 1122 static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags, 1123 uint8_t CC, DITypeRefArray TypeArray, 1124 StorageType Storage, 1125 bool ShouldCreate = true) { 1126 return getImpl(Context, Flags, CC, TypeArray.get(), Storage, ShouldCreate); 1127 } 1128 static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags, 1129 uint8_t CC, Metadata *TypeArray, 1130 StorageType Storage, 1131 bool ShouldCreate = true); 1132 1133 TempDISubroutineType cloneImpl() const { 1134 return getTemporary(getContext(), getFlags(), getCC(), getTypeArray()); 1135 } 1136 1137 public: 1138 DEFINE_MDNODE_GET(DISubroutineType, 1139 (DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray), 1140 (Flags, CC, TypeArray)) 1141 DEFINE_MDNODE_GET(DISubroutineType, 1142 (DIFlags Flags, uint8_t CC, Metadata *TypeArray), 1143 (Flags, CC, TypeArray)) 1144 1145 TempDISubroutineType clone() const { return cloneImpl(); } 1146 1147 uint8_t getCC() const { return CC; } 1148 1149 DITypeRefArray getTypeArray() const { 1150 return cast_or_null<MDTuple>(getRawTypeArray()); 1151 } 1152 1153 Metadata *getRawTypeArray() const { return getOperand(3); } 1154 1155 static bool classof(const Metadata *MD) { 1156 return MD->getMetadataID() == DISubroutineTypeKind; 1157 } 1158 }; 1159 1160 /// Compile unit. 1161 class DICompileUnit : public DIScope { 1162 friend class LLVMContextImpl; 1163 friend class MDNode; 1164 1165 public: 1166 enum DebugEmissionKind : unsigned { 1167 NoDebug = 0, 1168 FullDebug, 1169 LineTablesOnly, 1170 DebugDirectivesOnly, 1171 LastEmissionKind = DebugDirectivesOnly 1172 }; 1173 1174 enum class DebugNameTableKind : unsigned { 1175 Default = 0, 1176 GNU = 1, 1177 None = 2, 1178 LastDebugNameTableKind = None 1179 }; 1180 1181 static Optional<DebugEmissionKind> getEmissionKind(StringRef Str); 1182 static const char *emissionKindString(DebugEmissionKind EK); 1183 static Optional<DebugNameTableKind> getNameTableKind(StringRef Str); 1184 static const char *nameTableKindString(DebugNameTableKind PK); 1185 1186 private: 1187 unsigned SourceLanguage; 1188 bool IsOptimized; 1189 unsigned RuntimeVersion; 1190 unsigned EmissionKind; 1191 uint64_t DWOId; 1192 bool SplitDebugInlining; 1193 bool DebugInfoForProfiling; 1194 unsigned NameTableKind; 1195 bool RangesBaseAddress; 1196 1197 DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage, 1198 bool IsOptimized, unsigned RuntimeVersion, 1199 unsigned EmissionKind, uint64_t DWOId, bool SplitDebugInlining, 1200 bool DebugInfoForProfiling, unsigned NameTableKind, 1201 bool RangesBaseAddress, ArrayRef<Metadata *> Ops) 1202 : DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops), 1203 SourceLanguage(SourceLanguage), IsOptimized(IsOptimized), 1204 RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind), 1205 DWOId(DWOId), SplitDebugInlining(SplitDebugInlining), 1206 DebugInfoForProfiling(DebugInfoForProfiling), 1207 NameTableKind(NameTableKind), RangesBaseAddress(RangesBaseAddress) { 1208 assert(Storage != Uniqued); 1209 } 1210 ~DICompileUnit() = default; 1211 1212 static DICompileUnit * 1213 getImpl(LLVMContext &Context, unsigned SourceLanguage, DIFile *File, 1214 StringRef Producer, bool IsOptimized, StringRef Flags, 1215 unsigned RuntimeVersion, StringRef SplitDebugFilename, 1216 unsigned EmissionKind, DICompositeTypeArray EnumTypes, 1217 DIScopeArray RetainedTypes, 1218 DIGlobalVariableExpressionArray GlobalVariables, 1219 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, 1220 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, 1221 unsigned NameTableKind, bool RangesBaseAddress, StorageType Storage, 1222 bool ShouldCreate = true) { 1223 return getImpl(Context, SourceLanguage, File, 1224 getCanonicalMDString(Context, Producer), IsOptimized, 1225 getCanonicalMDString(Context, Flags), RuntimeVersion, 1226 getCanonicalMDString(Context, SplitDebugFilename), 1227 EmissionKind, EnumTypes.get(), RetainedTypes.get(), 1228 GlobalVariables.get(), ImportedEntities.get(), Macros.get(), 1229 DWOId, SplitDebugInlining, DebugInfoForProfiling, 1230 NameTableKind, RangesBaseAddress, Storage, ShouldCreate); 1231 } 1232 static DICompileUnit * 1233 getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File, 1234 MDString *Producer, bool IsOptimized, MDString *Flags, 1235 unsigned RuntimeVersion, MDString *SplitDebugFilename, 1236 unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, 1237 Metadata *GlobalVariables, Metadata *ImportedEntities, 1238 Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining, 1239 bool DebugInfoForProfiling, unsigned NameTableKind, 1240 bool RangesBaseAddress, StorageType Storage, bool ShouldCreate = true); 1241 1242 TempDICompileUnit cloneImpl() const { 1243 return getTemporary( 1244 getContext(), getSourceLanguage(), getFile(), getProducer(), 1245 isOptimized(), getFlags(), getRuntimeVersion(), getSplitDebugFilename(), 1246 getEmissionKind(), getEnumTypes(), getRetainedTypes(), 1247 getGlobalVariables(), getImportedEntities(), getMacros(), DWOId, 1248 getSplitDebugInlining(), getDebugInfoForProfiling(), getNameTableKind(), 1249 getRangesBaseAddress()); 1250 } 1251 1252 public: 1253 static void get() = delete; 1254 static void getIfExists() = delete; 1255 1256 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY( 1257 DICompileUnit, 1258 (unsigned SourceLanguage, DIFile *File, StringRef Producer, 1259 bool IsOptimized, StringRef Flags, unsigned RuntimeVersion, 1260 StringRef SplitDebugFilename, DebugEmissionKind EmissionKind, 1261 DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes, 1262 DIGlobalVariableExpressionArray GlobalVariables, 1263 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, 1264 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, 1265 DebugNameTableKind NameTableKind, bool RangesBaseAddress), 1266 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, 1267 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, 1268 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining, 1269 DebugInfoForProfiling, (unsigned)NameTableKind, RangesBaseAddress)) 1270 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY( 1271 DICompileUnit, 1272 (unsigned SourceLanguage, Metadata *File, MDString *Producer, 1273 bool IsOptimized, MDString *Flags, unsigned RuntimeVersion, 1274 MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes, 1275 Metadata *RetainedTypes, Metadata *GlobalVariables, 1276 Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId, 1277 bool SplitDebugInlining, bool DebugInfoForProfiling, 1278 unsigned NameTableKind, bool RangesBaseAddress), 1279 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, 1280 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, 1281 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining, 1282 DebugInfoForProfiling, NameTableKind, RangesBaseAddress)) 1283 1284 TempDICompileUnit clone() const { return cloneImpl(); } 1285 1286 unsigned getSourceLanguage() const { return SourceLanguage; } 1287 bool isOptimized() const { return IsOptimized; } 1288 unsigned getRuntimeVersion() const { return RuntimeVersion; } 1289 DebugEmissionKind getEmissionKind() const { 1290 return (DebugEmissionKind)EmissionKind; 1291 } 1292 bool isDebugDirectivesOnly() const { 1293 return EmissionKind == DebugDirectivesOnly; 1294 } 1295 bool getDebugInfoForProfiling() const { return DebugInfoForProfiling; } 1296 DebugNameTableKind getNameTableKind() const { 1297 return (DebugNameTableKind)NameTableKind; 1298 } 1299 bool getRangesBaseAddress() const { 1300 return RangesBaseAddress; } 1301 StringRef getProducer() const { 1302 return getStringOperand(1); } 1303 StringRef getFlags() const { 1304 return getStringOperand(2); } 1305 StringRef getSplitDebugFilename() const { 1306 return getStringOperand(3); } 1307 DICompositeTypeArray getEnumTypes() const { 1308 return cast_or_null<MDTuple>(getRawEnumTypes()); 1309 } 1310 DIScopeArray getRetainedTypes() const { 1311 return cast_or_null<MDTuple>(getRawRetainedTypes()); 1312 } 1313 DIGlobalVariableExpressionArray getGlobalVariables() const { 1314 return cast_or_null<MDTuple>(getRawGlobalVariables()); 1315 } 1316 DIImportedEntityArray getImportedEntities() const { 1317 return cast_or_null<MDTuple>(getRawImportedEntities()); 1318 } 1319 DIMacroNodeArray getMacros() const { 1320 return cast_or_null<MDTuple>(getRawMacros()); 1321 } 1322 uint64_t getDWOId() const { return DWOId; } 1323 void setDWOId(uint64_t DwoId) { DWOId = DwoId; } 1324 bool getSplitDebugInlining() const { return SplitDebugInlining; } 1325 void setSplitDebugInlining(bool SplitDebugInlining) { 1326 this->SplitDebugInlining = SplitDebugInlining; 1327 } 1328 1329 MDString *getRawProducer() const { return getOperandAs<MDString>(1); } 1330 MDString *getRawFlags() const { return getOperandAs<MDString>(2); } 1331 MDString *getRawSplitDebugFilename() const { 1332 return getOperandAs<MDString>(3); 1333 } 1334 Metadata *getRawEnumTypes() const { return getOperand(4); } 1335 Metadata *getRawRetainedTypes() const { return getOperand(5); } 1336 Metadata *getRawGlobalVariables() const { return getOperand(6); } 1337 Metadata *getRawImportedEntities() const { return getOperand(7); } 1338 Metadata *getRawMacros() const { return getOperand(8); } 1339 1340 /// Replace arrays. 1341 /// 1342 /// If this \a isUniqued() and not \a isResolved(), it will be RAUW'ed and 1343 /// deleted on a uniquing collision. In practice, uniquing collisions on \a 1344 /// DICompileUnit should be fairly rare. 1345 /// @{ 1346 void replaceEnumTypes(DICompositeTypeArray N) { 1347 replaceOperandWith(4, N.get()); 1348 } 1349 void replaceRetainedTypes(DITypeArray N) { 1350 replaceOperandWith(5, N.get()); 1351 } 1352 void replaceGlobalVariables(DIGlobalVariableExpressionArray N) { 1353 replaceOperandWith(6, N.get()); 1354 } 1355 void replaceImportedEntities(DIImportedEntityArray N) { 1356 replaceOperandWith(7, N.get()); 1357 } 1358 void replaceMacros(DIMacroNodeArray N) { replaceOperandWith(8, N.get()); } 1359 /// @} 1360 1361 static bool classof(const Metadata *MD) { 1362 return MD->getMetadataID() == DICompileUnitKind; 1363 } 1364 }; 1365 1366 /// A scope for locals. 1367 /// 1368 /// A legal scope for lexical blocks, local variables, and debug info 1369 /// locations. Subclasses are \a DISubprogram, \a DILexicalBlock, and \a 1370 /// DILexicalBlockFile. 1371 class DILocalScope : public DIScope { 1372 protected: 1373 DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, 1374 ArrayRef<Metadata *> Ops) 1375 : DIScope(C, ID, Storage, Tag, Ops) {} 1376 ~DILocalScope() = default; 1377 1378 public: 1379 /// Get the subprogram for this scope. 1380 /// 1381 /// Return this if it's an \a DISubprogram; otherwise, look up the scope 1382 /// chain. 1383 DISubprogram *getSubprogram() const; 1384 1385 /// Get the first non DILexicalBlockFile scope of this scope. 1386 /// 1387 /// Return this if it's not a \a DILexicalBlockFIle; otherwise, look up the 1388 /// scope chain. 1389 DILocalScope *getNonLexicalBlockFileScope() const; 1390 1391 static bool classof(const Metadata *MD) { 1392 return MD->getMetadataID() == DISubprogramKind || 1393 MD->getMetadataID() == DILexicalBlockKind || 1394 MD->getMetadataID() == DILexicalBlockFileKind; 1395 } 1396 }; 1397 1398 /// Debug location. 1399 /// 1400 /// A debug location in source code, used for debug info and otherwise. 1401 class DILocation : public MDNode { 1402 friend class LLVMContextImpl; 1403 friend class MDNode; 1404 1405 DILocation(LLVMContext &C, StorageType Storage, unsigned Line, 1406 unsigned Column, ArrayRef<Metadata *> MDs, bool ImplicitCode); 1407 ~DILocation() { dropAllReferences(); } 1408 1409 static DILocation *getImpl(LLVMContext &Context, unsigned Line, 1410 unsigned Column, Metadata *Scope, 1411 Metadata *InlinedAt, bool ImplicitCode, 1412 StorageType Storage, bool ShouldCreate = true); 1413 static DILocation *getImpl(LLVMContext &Context, unsigned Line, 1414 unsigned Column, DILocalScope *Scope, 1415 DILocation *InlinedAt, bool ImplicitCode, 1416 StorageType Storage, bool ShouldCreate = true) { 1417 return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope), 1418 static_cast<Metadata *>(InlinedAt), ImplicitCode, Storage, 1419 ShouldCreate); 1420 } 1421 1422 /// With a given unsigned int \p U, use up to 13 bits to represent it. 1423 /// old_bit 1~5 --> new_bit 1~5 1424 /// old_bit 6~12 --> new_bit 7~13 1425 /// new_bit_6 is 0 if higher bits (7~13) are all 0 1426 static unsigned getPrefixEncodingFromUnsigned(unsigned U) { 1427 U &= 0xfff; 1428 return U > 0x1f ? (((U & 0xfe0) << 1) | (U & 0x1f) | 0x20) : U; 1429 } 1430 1431 /// Reverse transformation as getPrefixEncodingFromUnsigned. 1432 static unsigned getUnsignedFromPrefixEncoding(unsigned U) { 1433 if (U & 1) 1434 return 0; 1435 U >>= 1; 1436 return (U & 0x20) ? (((U >> 1) & 0xfe0) | (U & 0x1f)) : (U & 0x1f); 1437 } 1438 1439 /// Returns the next component stored in discriminator. 1440 static unsigned getNextComponentInDiscriminator(unsigned D) { 1441 if ((D & 1) == 0) 1442 return D >> ((D & 0x40) ? 14 : 7); 1443 else 1444 return D >> 1; 1445 } 1446 1447 TempDILocation cloneImpl() const { 1448 // Get the raw scope/inlinedAt since it is possible to invoke this on 1449 // a DILocation containing temporary metadata. 1450 return getTemporary(getContext(), getLine(), getColumn(), getRawScope(), 1451 getRawInlinedAt(), isImplicitCode()); 1452 } 1453 1454 static unsigned encodeComponent(unsigned C) { 1455 return (C == 0) ? 1U : (getPrefixEncodingFromUnsigned(C) << 1); 1456 } 1457 1458 static unsigned encodingBits(unsigned C) { 1459 return (C == 0) ? 1 : (C > 0x1f ? 14 : 7); 1460 } 1461 1462 public: 1463 // Disallow replacing operands. 1464 void replaceOperandWith(unsigned I, Metadata *New) = delete; 1465 1466 DEFINE_MDNODE_GET(DILocation, 1467 (unsigned Line, unsigned Column, Metadata *Scope, 1468 Metadata *InlinedAt = nullptr, bool ImplicitCode = false), 1469 (Line, Column, Scope, InlinedAt, ImplicitCode)) 1470 DEFINE_MDNODE_GET(DILocation, 1471 (unsigned Line, unsigned Column, DILocalScope *Scope, 1472 DILocation *InlinedAt = nullptr, 1473 bool ImplicitCode = false), 1474 (Line, Column, Scope, InlinedAt, ImplicitCode)) 1475 1476 /// Return a (temporary) clone of this. 1477 TempDILocation clone() const { return cloneImpl(); } 1478 1479 unsigned getLine() const { return SubclassData32; } 1480 unsigned getColumn() const { return SubclassData16; } 1481 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); } 1482 1483 DILocation *getInlinedAt() const { 1484 return cast_or_null<DILocation>(getRawInlinedAt()); 1485 } 1486 1487 /// Check if the location corresponds to an implicit code. 1488 /// When the ImplicitCode flag is true, it means that the Instruction 1489 /// with this DILocation has been added by the front-end but it hasn't been 1490 /// written explicitly by the user (e.g. cleanup stuff in C++ put on a closing 1491 /// bracket). It's useful for code coverage to not show a counter on "empty" 1492 /// lines. 1493 bool isImplicitCode() const { return ImplicitCode; } 1494 void setImplicitCode(bool ImplicitCode) { this->ImplicitCode = ImplicitCode; } 1495 1496 DIFile *getFile() const { return getScope()->getFile(); } 1497 StringRef getFilename() const { return getScope()->getFilename(); } 1498 StringRef getDirectory() const { return getScope()->getDirectory(); } 1499 Optional<StringRef> getSource() const { return getScope()->getSource(); } 1500 1501 /// Get the scope where this is inlined. 1502 /// 1503 /// Walk through \a getInlinedAt() and return \a getScope() from the deepest 1504 /// location. 1505 DILocalScope *getInlinedAtScope() const { 1506 if (auto *IA = getInlinedAt()) 1507 return IA->getInlinedAtScope(); 1508 return getScope(); 1509 } 1510 1511 /// Get the DWARF discriminator. 1512 /// 1513 /// DWARF discriminators distinguish identical file locations between 1514 /// instructions that are on different basic blocks. 1515 /// 1516 /// There are 3 components stored in discriminator, from lower bits: 1517 /// 1518 /// Base discriminator: assigned by AddDiscriminators pass to identify IRs 1519 /// that are defined by the same source line, but 1520 /// different basic blocks. 1521 /// Duplication factor: assigned by optimizations that will scale down 1522 /// the execution frequency of the original IR. 1523 /// Copy Identifier: assigned by optimizations that clones the IR. 1524 /// Each copy of the IR will be assigned an identifier. 1525 /// 1526 /// Encoding: 1527 /// 1528 /// The above 3 components are encoded into a 32bit unsigned integer in 1529 /// order. If the lowest bit is 1, the current component is empty, and the 1530 /// next component will start in the next bit. Otherwise, the current 1531 /// component is non-empty, and its content starts in the next bit. The 1532 /// value of each components is either 5 bit or 12 bit: if the 7th bit 1533 /// is 0, the bit 2~6 (5 bits) are used to represent the component; if the 1534 /// 7th bit is 1, the bit 2~6 (5 bits) and 8~14 (7 bits) are combined to 1535 /// represent the component. Thus, the number of bits used for a component 1536 /// is either 0 (if it and all the next components are empty); 1 - if it is 1537 /// empty; 7 - if its value is up to and including 0x1f (lsb and msb are both 1538 /// 0); or 14, if its value is up to and including 0x1ff. Note that the last 1539 /// component is also capped at 0x1ff, even in the case when both first 1540 /// components are 0, and we'd technically have 29 bits available. 1541 /// 1542 /// For precise control over the data being encoded in the discriminator, 1543 /// use encodeDiscriminator/decodeDiscriminator. 1544 /// 1545 /// Use {get|set}BaseDiscriminator and cloneWithDuplicationFactor after reading 1546 /// their documentation, as their behavior has side-effects. 1547 1548 inline unsigned getDiscriminator() const; 1549 1550 /// Returns a new DILocation with updated \p Discriminator. 1551 inline const DILocation *cloneWithDiscriminator(unsigned Discriminator) const; 1552 1553 /// Returns a new DILocation with updated base discriminator \p BD. Only the 1554 /// base discriminator is set in the new DILocation, the other encoded values 1555 /// are elided. 1556 /// If the discriminator cannot be encoded, the function returns None. 1557 inline Optional<const DILocation *> setBaseDiscriminator(unsigned BD) const; 1558 1559 /// Returns the duplication factor stored in the discriminator, or 1 if no 1560 /// duplication factor (or 0) is encoded. 1561 inline unsigned getDuplicationFactor() const; 1562 1563 /// Returns the copy identifier stored in the discriminator. 1564 inline unsigned getCopyIdentifier() const; 1565 1566 /// Returns the base discriminator stored in the discriminator. 1567 inline unsigned getBaseDiscriminator() const; 1568 1569 /// Returns a new DILocation with duplication factor \p DF * current 1570 /// duplication factor encoded in the discriminator. The current duplication 1571 /// factor is as defined by getDuplicationFactor(). 1572 /// Returns None if encoding failed. 1573 inline Optional<const DILocation *> cloneWithDuplicationFactor(unsigned DF) const; 1574 1575 /// When two instructions are combined into a single instruction we also 1576 /// need to combine the original locations into a single location. 1577 /// 1578 /// When the locations are the same we can use either location. When they 1579 /// differ, we need a third location which is distinct from either. If they 1580 /// have the same file/line but have a different discriminator we could 1581 /// create a location with a new discriminator. If they are from different 1582 /// files/lines the location is ambiguous and can't be represented in a line 1583 /// entry. In this case, if \p GenerateLocation is true, we will set the 1584 /// merged debug location as line 0 of the nearest common scope where the two 1585 /// locations are inlined from. 1586 /// 1587 /// \p GenerateLocation: Whether the merged location can be generated when 1588 /// \p LocA and \p LocB differ. 1589 static const DILocation *getMergedLocation(const DILocation *LocA, 1590 const DILocation *LocB); 1591 1592 /// Returns the base discriminator for a given encoded discriminator \p D. 1593 static unsigned getBaseDiscriminatorFromDiscriminator(unsigned D) { 1594 return getUnsignedFromPrefixEncoding(D); 1595 } 1596 1597 /// Raw encoding of the discriminator. APIs such as setBaseDiscriminator or 1598 /// cloneWithDuplicationFactor have certain side-effects. This API, in 1599 /// conjunction with cloneWithDiscriminator, may be used to encode precisely 1600 /// the values provided. \p BD: base discriminator \p DF: duplication factor 1601 /// \p CI: copy index 1602 /// The return is None if the values cannot be encoded in 32 bits - for 1603 /// example, values for BD or DF larger than 12 bits. Otherwise, the return 1604 /// is the encoded value. 1605 static Optional<unsigned> encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI); 1606 1607 /// Raw decoder for values in an encoded discriminator D. 1608 static void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF, 1609 unsigned &CI); 1610 1611 /// Returns the duplication factor for a given encoded discriminator \p D, or 1612 /// 1 if no value or 0 is encoded. 1613 static unsigned getDuplicationFactorFromDiscriminator(unsigned D) { 1614 D = getNextComponentInDiscriminator(D); 1615 unsigned Ret = getUnsignedFromPrefixEncoding(D); 1616 if (Ret == 0) 1617 return 1; 1618 return Ret; 1619 } 1620 1621 /// Returns the copy identifier for a given encoded discriminator \p D. 1622 static unsigned getCopyIdentifierFromDiscriminator(unsigned D) { 1623 return getUnsignedFromPrefixEncoding(getNextComponentInDiscriminator( 1624 getNextComponentInDiscriminator(D))); 1625 } 1626 1627 1628 Metadata *getRawScope() const { return getOperand(0); } 1629 Metadata *getRawInlinedAt() const { 1630 if (getNumOperands() == 2) 1631 return getOperand(1); 1632 return nullptr; 1633 } 1634 1635 static bool classof(const Metadata *MD) { 1636 return MD->getMetadataID() == DILocationKind; 1637 } 1638 }; 1639 1640 /// Subprogram description. 1641 /// 1642 /// TODO: Remove DisplayName. It's always equal to Name. 1643 /// TODO: Split up flags. 1644 class DISubprogram : public DILocalScope { 1645 friend class LLVMContextImpl; 1646 friend class MDNode; 1647 1648 unsigned Line; 1649 unsigned ScopeLine; 1650 unsigned VirtualIndex; 1651 1652 /// In the MS ABI, the implicit 'this' parameter is adjusted in the prologue 1653 /// of method overrides from secondary bases by this amount. It may be 1654 /// negative. 1655 int ThisAdjustment; 1656 1657 public: 1658 /// Debug info subprogram flags. 1659 enum DISPFlags : uint32_t { 1660 #define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID, 1661 #define DISP_FLAG_LARGEST_NEEDED 1662 #include "llvm/IR/DebugInfoFlags.def" 1663 SPFlagNonvirtual = SPFlagZero, 1664 SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual, 1665 LLVM_MARK_AS_BITMASK_ENUM(SPFlagLargest) 1666 }; 1667 1668 static DISPFlags getFlag(StringRef Flag); 1669 static StringRef getFlagString(DISPFlags Flag); 1670 1671 /// Split up a flags bitfield for easier printing. 1672 /// 1673 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns 1674 /// any remaining (unrecognized) bits. 1675 static DISPFlags splitFlags(DISPFlags Flags, 1676 SmallVectorImpl<DISPFlags> &SplitFlags); 1677 1678 // Helper for converting old bitfields to new flags word. 1679 static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, 1680 bool IsOptimized, 1681 unsigned Virtuality = SPFlagNonvirtual) { 1682 // We're assuming virtuality is the low-order field. 1683 static_assert( 1684 int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) && 1685 int(SPFlagPureVirtual) == int(dwarf::DW_VIRTUALITY_pure_virtual), 1686 "Virtuality constant mismatch"); 1687 return static_cast<DISPFlags>( 1688 (Virtuality & SPFlagVirtuality) | 1689 (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) | 1690 (IsDefinition ? SPFlagDefinition : SPFlagZero) | 1691 (IsOptimized ? SPFlagOptimized : SPFlagZero)); 1692 } 1693 1694 private: 1695 DIFlags Flags; 1696 DISPFlags SPFlags; 1697 1698 DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line, 1699 unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment, 1700 DIFlags Flags, DISPFlags SPFlags, ArrayRef<Metadata *> Ops) 1701 : DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram, 1702 Ops), 1703 Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex), 1704 ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) { 1705 static_assert(dwarf::DW_VIRTUALITY_max < 4, "Virtuality out of range"); 1706 } 1707 ~DISubprogram() = default; 1708 1709 static DISubprogram * 1710 getImpl(LLVMContext &Context, DIScopeRef Scope, StringRef Name, 1711 StringRef LinkageName, DIFile *File, unsigned Line, 1712 DISubroutineType *Type, unsigned ScopeLine, DITypeRef ContainingType, 1713 unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags, 1714 DISPFlags SPFlags, DICompileUnit *Unit, 1715 DITemplateParameterArray TemplateParams, DISubprogram *Declaration, 1716 DINodeArray RetainedNodes, DITypeArray ThrownTypes, 1717 StorageType Storage, bool ShouldCreate = true) { 1718 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 1719 getCanonicalMDString(Context, LinkageName), File, Line, Type, 1720 ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, 1721 Flags, SPFlags, Unit, TemplateParams.get(), Declaration, 1722 RetainedNodes.get(), ThrownTypes.get(), Storage, 1723 ShouldCreate); 1724 } 1725 static DISubprogram *getImpl(LLVMContext &Context, Metadata *Scope, 1726 MDString *Name, MDString *LinkageName, 1727 Metadata *File, unsigned Line, Metadata *Type, 1728 unsigned ScopeLine, Metadata *ContainingType, 1729 unsigned VirtualIndex, int ThisAdjustment, 1730 DIFlags Flags, DISPFlags SPFlags, Metadata *Unit, 1731 Metadata *TemplateParams, Metadata *Declaration, 1732 Metadata *RetainedNodes, Metadata *ThrownTypes, 1733 StorageType Storage, bool ShouldCreate = true); 1734 1735 TempDISubprogram cloneImpl() const { 1736 return getTemporary(getContext(), getScope(), getName(), getLinkageName(), 1737 getFile(), getLine(), getType(), getScopeLine(), 1738 getContainingType(), getVirtualIndex(), 1739 getThisAdjustment(), getFlags(), getSPFlags(), 1740 getUnit(), getTemplateParams(), getDeclaration(), 1741 getRetainedNodes(), getThrownTypes()); 1742 } 1743 1744 public: 1745 DEFINE_MDNODE_GET( 1746 DISubprogram, 1747 (DIScopeRef Scope, StringRef Name, StringRef LinkageName, DIFile *File, 1748 unsigned Line, DISubroutineType *Type, unsigned ScopeLine, 1749 DITypeRef ContainingType, unsigned VirtualIndex, int ThisAdjustment, 1750 DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit, 1751 DITemplateParameterArray TemplateParams = nullptr, 1752 DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr, 1753 DITypeArray ThrownTypes = nullptr), 1754 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType, 1755 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams, 1756 Declaration, RetainedNodes, ThrownTypes)) 1757 1758 DEFINE_MDNODE_GET( 1759 DISubprogram, 1760 (Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File, 1761 unsigned Line, Metadata *Type, unsigned ScopeLine, 1762 Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment, 1763 DIFlags Flags, DISPFlags SPFlags, Metadata *Unit, 1764 Metadata *TemplateParams = nullptr, Metadata *Declaration = nullptr, 1765 Metadata *RetainedNodes = nullptr, Metadata *ThrownTypes = nullptr), 1766 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType, 1767 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams, 1768 Declaration, RetainedNodes, ThrownTypes)) 1769 1770 TempDISubprogram clone() const { return cloneImpl(); } 1771 1772 /// Returns a new temporary DISubprogram with updated Flags 1773 TempDISubprogram cloneWithFlags(DIFlags NewFlags) const { 1774 auto NewSP = clone(); 1775 NewSP->Flags = NewFlags; 1776 return NewSP; 1777 } 1778 1779 public: 1780 unsigned getLine() const { return Line; } 1781 unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; } 1782 unsigned getVirtualIndex() const { return VirtualIndex; } 1783 int getThisAdjustment() const { return ThisAdjustment; } 1784 unsigned getScopeLine() const { return ScopeLine; } 1785 DIFlags getFlags() const { return Flags; } 1786 DISPFlags getSPFlags() const { return SPFlags; } 1787 bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; } 1788 bool isDefinition() const { return getSPFlags() & SPFlagDefinition; } 1789 bool isOptimized() const { return getSPFlags() & SPFlagOptimized; } 1790 1791 bool isArtificial() const { return getFlags() & FlagArtificial; } 1792 bool isPrivate() const { 1793 return (getFlags() & FlagAccessibility) == FlagPrivate; 1794 } 1795 bool isProtected() const { 1796 return (getFlags() & FlagAccessibility) == FlagProtected; 1797 } 1798 bool isPublic() const { 1799 return (getFlags() & FlagAccessibility) == FlagPublic; 1800 } 1801 bool isExplicit() const { return getFlags() & FlagExplicit; } 1802 bool isPrototyped() const { return getFlags() & FlagPrototyped; } 1803 bool areAllCallsDescribed() const { 1804 return getFlags() & FlagAllCallsDescribed; 1805 } 1806 bool isMainSubprogram() const { return getFlags() & FlagMainSubprogram; } 1807 1808 /// Check if this is reference-qualified. 1809 /// 1810 /// Return true if this subprogram is a C++11 reference-qualified non-static 1811 /// member function (void foo() &). 1812 bool isLValueReference() const { return getFlags() & FlagLValueReference; } 1813 1814 /// Check if this is rvalue-reference-qualified. 1815 /// 1816 /// Return true if this subprogram is a C++11 rvalue-reference-qualified 1817 /// non-static member function (void foo() &&). 1818 bool isRValueReference() const { return getFlags() & FlagRValueReference; } 1819 1820 /// Check if this is marked as noreturn. 1821 /// 1822 /// Return true if this subprogram is C++11 noreturn or C11 _Noreturn 1823 bool isNoReturn() const { return getFlags() & FlagNoReturn; } 1824 1825 // Check if this routine is a compiler-generated thunk. 1826 // 1827 // Returns true if this subprogram is a thunk generated by the compiler. 1828 bool isThunk() const { return getFlags() & FlagThunk; } 1829 1830 DIScopeRef getScope() const { return DIScopeRef(getRawScope()); } 1831 1832 StringRef getName() const { return getStringOperand(2); } 1833 StringRef getLinkageName() const { return getStringOperand(3); } 1834 1835 DISubroutineType *getType() const { 1836 return cast_or_null<DISubroutineType>(getRawType()); 1837 } 1838 DITypeRef getContainingType() const { 1839 return DITypeRef(getRawContainingType()); 1840 } 1841 1842 DICompileUnit *getUnit() const { 1843 return cast_or_null<DICompileUnit>(getRawUnit()); 1844 } 1845 void replaceUnit(DICompileUnit *CU) { replaceOperandWith(5, CU); } 1846 DITemplateParameterArray getTemplateParams() const { 1847 return cast_or_null<MDTuple>(getRawTemplateParams()); 1848 } 1849 DISubprogram *getDeclaration() const { 1850 return cast_or_null<DISubprogram>(getRawDeclaration()); 1851 } 1852 DINodeArray getRetainedNodes() const { 1853 return cast_or_null<MDTuple>(getRawRetainedNodes()); 1854 } 1855 DITypeArray getThrownTypes() const { 1856 return cast_or_null<MDTuple>(getRawThrownTypes()); 1857 } 1858 1859 Metadata *getRawScope() const { return getOperand(1); } 1860 MDString *getRawName() const { return getOperandAs<MDString>(2); } 1861 MDString *getRawLinkageName() const { return getOperandAs<MDString>(3); } 1862 Metadata *getRawType() const { return getOperand(4); } 1863 Metadata *getRawUnit() const { return getOperand(5); } 1864 Metadata *getRawDeclaration() const { return getOperand(6); } 1865 Metadata *getRawRetainedNodes() const { return getOperand(7); } 1866 Metadata *getRawContainingType() const { 1867 return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr; 1868 } 1869 Metadata *getRawTemplateParams() const { 1870 return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr; 1871 } 1872 Metadata *getRawThrownTypes() const { 1873 return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr; 1874 } 1875 1876 /// Check if this subprogram describes the given function. 1877 /// 1878 /// FIXME: Should this be looking through bitcasts? 1879 bool describes(const Function *F) const; 1880 1881 static bool classof(const Metadata *MD) { 1882 return MD->getMetadataID() == DISubprogramKind; 1883 } 1884 }; 1885 1886 class DILexicalBlockBase : public DILocalScope { 1887 protected: 1888 DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage, 1889 ArrayRef<Metadata *> Ops) 1890 : DILocalScope(C, ID, Storage, dwarf::DW_TAG_lexical_block, Ops) {} 1891 ~DILexicalBlockBase() = default; 1892 1893 public: 1894 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); } 1895 1896 Metadata *getRawScope() const { return getOperand(1); } 1897 1898 static bool classof(const Metadata *MD) { 1899 return MD->getMetadataID() == DILexicalBlockKind || 1900 MD->getMetadataID() == DILexicalBlockFileKind; 1901 } 1902 }; 1903 1904 class DILexicalBlock : public DILexicalBlockBase { 1905 friend class LLVMContextImpl; 1906 friend class MDNode; 1907 1908 unsigned Line; 1909 uint16_t Column; 1910 1911 DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line, 1912 unsigned Column, ArrayRef<Metadata *> Ops) 1913 : DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops), Line(Line), 1914 Column(Column) { 1915 assert(Column < (1u << 16) && "Expected 16-bit column"); 1916 } 1917 ~DILexicalBlock() = default; 1918 1919 static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope, 1920 DIFile *File, unsigned Line, unsigned Column, 1921 StorageType Storage, 1922 bool ShouldCreate = true) { 1923 return getImpl(Context, static_cast<Metadata *>(Scope), 1924 static_cast<Metadata *>(File), Line, Column, Storage, 1925 ShouldCreate); 1926 } 1927 1928 static DILexicalBlock *getImpl(LLVMContext &Context, Metadata *Scope, 1929 Metadata *File, unsigned Line, unsigned Column, 1930 StorageType Storage, bool ShouldCreate = true); 1931 1932 TempDILexicalBlock cloneImpl() const { 1933 return getTemporary(getContext(), getScope(), getFile(), getLine(), 1934 getColumn()); 1935 } 1936 1937 public: 1938 DEFINE_MDNODE_GET(DILexicalBlock, (DILocalScope * Scope, DIFile *File, 1939 unsigned Line, unsigned Column), 1940 (Scope, File, Line, Column)) 1941 DEFINE_MDNODE_GET(DILexicalBlock, (Metadata * Scope, Metadata *File, 1942 unsigned Line, unsigned Column), 1943 (Scope, File, Line, Column)) 1944 1945 TempDILexicalBlock clone() const { return cloneImpl(); } 1946 1947 unsigned getLine() const { return Line; } 1948 unsigned getColumn() const { return Column; } 1949 1950 static bool classof(const Metadata *MD) { 1951 return MD->getMetadataID() == DILexicalBlockKind; 1952 } 1953 }; 1954 1955 class DILexicalBlockFile : public DILexicalBlockBase { 1956 friend class LLVMContextImpl; 1957 friend class MDNode; 1958 1959 unsigned Discriminator; 1960 1961 DILexicalBlockFile(LLVMContext &C, StorageType Storage, 1962 unsigned Discriminator, ArrayRef<Metadata *> Ops) 1963 : DILexicalBlockBase(C, DILexicalBlockFileKind, Storage, Ops), 1964 Discriminator(Discriminator) {} 1965 ~DILexicalBlockFile() = default; 1966 1967 static DILexicalBlockFile *getImpl(LLVMContext &Context, DILocalScope *Scope, 1968 DIFile *File, unsigned Discriminator, 1969 StorageType Storage, 1970 bool ShouldCreate = true) { 1971 return getImpl(Context, static_cast<Metadata *>(Scope), 1972 static_cast<Metadata *>(File), Discriminator, Storage, 1973 ShouldCreate); 1974 } 1975 1976 static DILexicalBlockFile *getImpl(LLVMContext &Context, Metadata *Scope, 1977 Metadata *File, unsigned Discriminator, 1978 StorageType Storage, 1979 bool ShouldCreate = true); 1980 1981 TempDILexicalBlockFile cloneImpl() const { 1982 return getTemporary(getContext(), getScope(), getFile(), 1983 getDiscriminator()); 1984 } 1985 1986 public: 1987 DEFINE_MDNODE_GET(DILexicalBlockFile, (DILocalScope * Scope, DIFile *File, 1988 unsigned Discriminator), 1989 (Scope, File, Discriminator)) 1990 DEFINE_MDNODE_GET(DILexicalBlockFile, 1991 (Metadata * Scope, Metadata *File, unsigned Discriminator), 1992 (Scope, File, Discriminator)) 1993 1994 TempDILexicalBlockFile clone() const { return cloneImpl(); } 1995 1996 // TODO: Remove these once they're gone from DILexicalBlockBase. 1997 unsigned getLine() const = delete; 1998 unsigned getColumn() const = delete; 1999 2000 unsigned getDiscriminator() const { return Discriminator; } 2001 2002 static bool classof(const Metadata *MD) { 2003 return MD->getMetadataID() == DILexicalBlockFileKind; 2004 } 2005 }; 2006 2007 unsigned DILocation::getDiscriminator() const { 2008 if (auto *F = dyn_cast<DILexicalBlockFile>(getScope())) 2009 return F->getDiscriminator(); 2010 return 0; 2011 } 2012 2013 const DILocation * 2014 DILocation::cloneWithDiscriminator(unsigned Discriminator) const { 2015 DIScope *Scope = getScope(); 2016 // Skip all parent DILexicalBlockFile that already have a discriminator 2017 // assigned. We do not want to have nested DILexicalBlockFiles that have 2018 // mutliple discriminators because only the leaf DILexicalBlockFile's 2019 // dominator will be used. 2020 for (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope); 2021 LBF && LBF->getDiscriminator() != 0; 2022 LBF = dyn_cast<DILexicalBlockFile>(Scope)) 2023 Scope = LBF->getScope(); 2024 DILexicalBlockFile *NewScope = 2025 DILexicalBlockFile::get(getContext(), Scope, getFile(), Discriminator); 2026 return DILocation::get(getContext(), getLine(), getColumn(), NewScope, 2027 getInlinedAt()); 2028 } 2029 2030 unsigned DILocation::getBaseDiscriminator() const { 2031 return getBaseDiscriminatorFromDiscriminator(getDiscriminator()); 2032 } 2033 2034 unsigned DILocation::getDuplicationFactor() const { 2035 return getDuplicationFactorFromDiscriminator(getDiscriminator()); 2036 } 2037 2038 unsigned DILocation::getCopyIdentifier() const { 2039 return getCopyIdentifierFromDiscriminator(getDiscriminator()); 2040 } 2041 2042 Optional<const DILocation *> DILocation::setBaseDiscriminator(unsigned D) const { 2043 if (D == 0) 2044 return this; 2045 if (D > 0xfff) 2046 return None; 2047 return cloneWithDiscriminator(encodeComponent(D)); 2048 } 2049 2050 Optional<const DILocation *> DILocation::cloneWithDuplicationFactor(unsigned DF) const { 2051 DF *= getDuplicationFactor(); 2052 if (DF <= 1) 2053 return this; 2054 2055 unsigned BD = getBaseDiscriminator(); 2056 unsigned CI = getCopyIdentifier(); 2057 if (Optional<unsigned> D = encodeDiscriminator(BD, DF, CI)) 2058 return cloneWithDiscriminator(*D); 2059 return None; 2060 } 2061 2062 class DINamespace : public DIScope { 2063 friend class LLVMContextImpl; 2064 friend class MDNode; 2065 2066 unsigned ExportSymbols : 1; 2067 2068 DINamespace(LLVMContext &Context, StorageType Storage, bool ExportSymbols, 2069 ArrayRef<Metadata *> Ops) 2070 : DIScope(Context, DINamespaceKind, Storage, dwarf::DW_TAG_namespace, 2071 Ops), 2072 ExportSymbols(ExportSymbols) {} 2073 ~DINamespace() = default; 2074 2075 static DINamespace *getImpl(LLVMContext &Context, DIScope *Scope, 2076 StringRef Name, bool ExportSymbols, 2077 StorageType Storage, bool ShouldCreate = true) { 2078 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 2079 ExportSymbols, Storage, ShouldCreate); 2080 } 2081 static DINamespace *getImpl(LLVMContext &Context, Metadata *Scope, 2082 MDString *Name, bool ExportSymbols, 2083 StorageType Storage, bool ShouldCreate = true); 2084 2085 TempDINamespace cloneImpl() const { 2086 return getTemporary(getContext(), getScope(), getName(), 2087 getExportSymbols()); 2088 } 2089 2090 public: 2091 DEFINE_MDNODE_GET(DINamespace, 2092 (DIScope *Scope, StringRef Name, bool ExportSymbols), 2093 (Scope, Name, ExportSymbols)) 2094 DEFINE_MDNODE_GET(DINamespace, 2095 (Metadata *Scope, MDString *Name, bool ExportSymbols), 2096 (Scope, Name, ExportSymbols)) 2097 2098 TempDINamespace clone() const { return cloneImpl(); } 2099 2100 bool getExportSymbols() const { return ExportSymbols; } 2101 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 2102 StringRef getName() const { return getStringOperand(2); } 2103 2104 Metadata *getRawScope() const { return getOperand(1); } 2105 MDString *getRawName() const { return getOperandAs<MDString>(2); } 2106 2107 static bool classof(const Metadata *MD) { 2108 return MD->getMetadataID() == DINamespaceKind; 2109 } 2110 }; 2111 2112 /// A (clang) module that has been imported by the compile unit. 2113 /// 2114 class DIModule : public DIScope { 2115 friend class LLVMContextImpl; 2116 friend class MDNode; 2117 2118 DIModule(LLVMContext &Context, StorageType Storage, ArrayRef<Metadata *> Ops) 2119 : DIScope(Context, DIModuleKind, Storage, dwarf::DW_TAG_module, Ops) {} 2120 ~DIModule() = default; 2121 2122 static DIModule *getImpl(LLVMContext &Context, DIScope *Scope, 2123 StringRef Name, StringRef ConfigurationMacros, 2124 StringRef IncludePath, StringRef ISysRoot, 2125 StorageType Storage, bool ShouldCreate = true) { 2126 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 2127 getCanonicalMDString(Context, ConfigurationMacros), 2128 getCanonicalMDString(Context, IncludePath), 2129 getCanonicalMDString(Context, ISysRoot), 2130 Storage, ShouldCreate); 2131 } 2132 static DIModule *getImpl(LLVMContext &Context, Metadata *Scope, 2133 MDString *Name, MDString *ConfigurationMacros, 2134 MDString *IncludePath, MDString *ISysRoot, 2135 StorageType Storage, bool ShouldCreate = true); 2136 2137 TempDIModule cloneImpl() const { 2138 return getTemporary(getContext(), getScope(), getName(), 2139 getConfigurationMacros(), getIncludePath(), 2140 getISysRoot()); 2141 } 2142 2143 public: 2144 DEFINE_MDNODE_GET(DIModule, (DIScope *Scope, StringRef Name, 2145 StringRef ConfigurationMacros, StringRef IncludePath, 2146 StringRef ISysRoot), 2147 (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot)) 2148 DEFINE_MDNODE_GET(DIModule, 2149 (Metadata *Scope, MDString *Name, MDString *ConfigurationMacros, 2150 MDString *IncludePath, MDString *ISysRoot), 2151 (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot)) 2152 2153 TempDIModule clone() const { return cloneImpl(); } 2154 2155 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 2156 StringRef getName() const { return getStringOperand(1); } 2157 StringRef getConfigurationMacros() const { return getStringOperand(2); } 2158 StringRef getIncludePath() const { return getStringOperand(3); } 2159 StringRef getISysRoot() const { return getStringOperand(4); } 2160 2161 Metadata *getRawScope() const { return getOperand(0); } 2162 MDString *getRawName() const { return getOperandAs<MDString>(1); } 2163 MDString *getRawConfigurationMacros() const { return getOperandAs<MDString>(2); } 2164 MDString *getRawIncludePath() const { return getOperandAs<MDString>(3); } 2165 MDString *getRawISysRoot() const { return getOperandAs<MDString>(4); } 2166 2167 static bool classof(const Metadata *MD) { 2168 return MD->getMetadataID() == DIModuleKind; 2169 } 2170 }; 2171 2172 /// Base class for template parameters. 2173 class DITemplateParameter : public DINode { 2174 protected: 2175 DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage, 2176 unsigned Tag, ArrayRef<Metadata *> Ops) 2177 : DINode(Context, ID, Storage, Tag, Ops) {} 2178 ~DITemplateParameter() = default; 2179 2180 public: 2181 StringRef getName() const { return getStringOperand(0); } 2182 DITypeRef getType() const { return DITypeRef(getRawType()); } 2183 2184 MDString *getRawName() const { return getOperandAs<MDString>(0); } 2185 Metadata *getRawType() const { return getOperand(1); } 2186 2187 static bool classof(const Metadata *MD) { 2188 return MD->getMetadataID() == DITemplateTypeParameterKind || 2189 MD->getMetadataID() == DITemplateValueParameterKind; 2190 } 2191 }; 2192 2193 class DITemplateTypeParameter : public DITemplateParameter { 2194 friend class LLVMContextImpl; 2195 friend class MDNode; 2196 2197 DITemplateTypeParameter(LLVMContext &Context, StorageType Storage, 2198 ArrayRef<Metadata *> Ops) 2199 : DITemplateParameter(Context, DITemplateTypeParameterKind, Storage, 2200 dwarf::DW_TAG_template_type_parameter, Ops) {} 2201 ~DITemplateTypeParameter() = default; 2202 2203 static DITemplateTypeParameter *getImpl(LLVMContext &Context, StringRef Name, 2204 DITypeRef Type, StorageType Storage, 2205 bool ShouldCreate = true) { 2206 return getImpl(Context, getCanonicalMDString(Context, Name), Type, Storage, 2207 ShouldCreate); 2208 } 2209 static DITemplateTypeParameter *getImpl(LLVMContext &Context, MDString *Name, 2210 Metadata *Type, StorageType Storage, 2211 bool ShouldCreate = true); 2212 2213 TempDITemplateTypeParameter cloneImpl() const { 2214 return getTemporary(getContext(), getName(), getType()); 2215 } 2216 2217 public: 2218 DEFINE_MDNODE_GET(DITemplateTypeParameter, (StringRef Name, DITypeRef Type), 2219 (Name, Type)) 2220 DEFINE_MDNODE_GET(DITemplateTypeParameter, (MDString * Name, Metadata *Type), 2221 (Name, Type)) 2222 2223 TempDITemplateTypeParameter clone() const { return cloneImpl(); } 2224 2225 static bool classof(const Metadata *MD) { 2226 return MD->getMetadataID() == DITemplateTypeParameterKind; 2227 } 2228 }; 2229 2230 class DITemplateValueParameter : public DITemplateParameter { 2231 friend class LLVMContextImpl; 2232 friend class MDNode; 2233 2234 DITemplateValueParameter(LLVMContext &Context, StorageType Storage, 2235 unsigned Tag, ArrayRef<Metadata *> Ops) 2236 : DITemplateParameter(Context, DITemplateValueParameterKind, Storage, Tag, 2237 Ops) {} 2238 ~DITemplateValueParameter() = default; 2239 2240 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag, 2241 StringRef Name, DITypeRef Type, 2242 Metadata *Value, StorageType Storage, 2243 bool ShouldCreate = true) { 2244 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), Type, 2245 Value, Storage, ShouldCreate); 2246 } 2247 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag, 2248 MDString *Name, Metadata *Type, 2249 Metadata *Value, StorageType Storage, 2250 bool ShouldCreate = true); 2251 2252 TempDITemplateValueParameter cloneImpl() const { 2253 return getTemporary(getContext(), getTag(), getName(), getType(), 2254 getValue()); 2255 } 2256 2257 public: 2258 DEFINE_MDNODE_GET(DITemplateValueParameter, (unsigned Tag, StringRef Name, 2259 DITypeRef Type, Metadata *Value), 2260 (Tag, Name, Type, Value)) 2261 DEFINE_MDNODE_GET(DITemplateValueParameter, (unsigned Tag, MDString *Name, 2262 Metadata *Type, Metadata *Value), 2263 (Tag, Name, Type, Value)) 2264 2265 TempDITemplateValueParameter clone() const { return cloneImpl(); } 2266 2267 Metadata *getValue() const { return getOperand(2); } 2268 2269 static bool classof(const Metadata *MD) { 2270 return MD->getMetadataID() == DITemplateValueParameterKind; 2271 } 2272 }; 2273 2274 /// Base class for variables. 2275 class DIVariable : public DINode { 2276 unsigned Line; 2277 uint32_t AlignInBits; 2278 2279 protected: 2280 DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Line, 2281 ArrayRef<Metadata *> Ops, uint32_t AlignInBits = 0) 2282 : DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line), 2283 AlignInBits(AlignInBits) {} 2284 ~DIVariable() = default; 2285 2286 public: 2287 unsigned getLine() const { return Line; } 2288 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 2289 StringRef getName() const { return getStringOperand(1); } 2290 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 2291 DITypeRef getType() const { return DITypeRef(getRawType()); } 2292 uint32_t getAlignInBits() const { return AlignInBits; } 2293 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; } 2294 /// Determines the size of the variable's type. 2295 Optional<uint64_t> getSizeInBits() const; 2296 2297 /// Return the signedness of this variable's type, or None if this type is 2298 /// neither signed nor unsigned. 2299 Optional<DIBasicType::Signedness> getSignedness() const { 2300 if (auto *BT = dyn_cast<DIBasicType>(getType().resolve())) 2301 return BT->getSignedness(); 2302 return None; 2303 } 2304 2305 StringRef getFilename() const { 2306 if (auto *F = getFile()) 2307 return F->getFilename(); 2308 return ""; 2309 } 2310 2311 StringRef getDirectory() const { 2312 if (auto *F = getFile()) 2313 return F->getDirectory(); 2314 return ""; 2315 } 2316 2317 Optional<StringRef> getSource() const { 2318 if (auto *F = getFile()) 2319 return F->getSource(); 2320 return None; 2321 } 2322 2323 Metadata *getRawScope() const { return getOperand(0); } 2324 MDString *getRawName() const { return getOperandAs<MDString>(1); } 2325 Metadata *getRawFile() const { return getOperand(2); } 2326 Metadata *getRawType() const { return getOperand(3); } 2327 2328 static bool classof(const Metadata *MD) { 2329 return MD->getMetadataID() == DILocalVariableKind || 2330 MD->getMetadataID() == DIGlobalVariableKind; 2331 } 2332 }; 2333 2334 /// DWARF expression. 2335 /// 2336 /// This is (almost) a DWARF expression that modifies the location of a 2337 /// variable, or the location of a single piece of a variable, or (when using 2338 /// DW_OP_stack_value) is the constant variable value. 2339 /// 2340 /// TODO: Co-allocate the expression elements. 2341 /// TODO: Separate from MDNode, or otherwise drop Distinct and Temporary 2342 /// storage types. 2343 class DIExpression : public MDNode { 2344 friend class LLVMContextImpl; 2345 friend class MDNode; 2346 2347 std::vector<uint64_t> Elements; 2348 2349 DIExpression(LLVMContext &C, StorageType Storage, ArrayRef<uint64_t> Elements) 2350 : MDNode(C, DIExpressionKind, Storage, None), 2351 Elements(Elements.begin(), Elements.end()) {} 2352 ~DIExpression() = default; 2353 2354 static DIExpression *getImpl(LLVMContext &Context, 2355 ArrayRef<uint64_t> Elements, StorageType Storage, 2356 bool ShouldCreate = true); 2357 2358 TempDIExpression cloneImpl() const { 2359 return getTemporary(getContext(), getElements()); 2360 } 2361 2362 public: 2363 DEFINE_MDNODE_GET(DIExpression, (ArrayRef<uint64_t> Elements), (Elements)) 2364 2365 TempDIExpression clone() const { return cloneImpl(); } 2366 2367 ArrayRef<uint64_t> getElements() const { return Elements; } 2368 2369 unsigned getNumElements() const { return Elements.size(); } 2370 2371 uint64_t getElement(unsigned I) const { 2372 assert(I < Elements.size() && "Index out of range"); 2373 return Elements[I]; 2374 } 2375 2376 /// Determine whether this represents a standalone constant value. 2377 bool isConstant() const; 2378 2379 using element_iterator = ArrayRef<uint64_t>::iterator; 2380 2381 element_iterator elements_begin() const { return getElements().begin(); } 2382 element_iterator elements_end() const { return getElements().end(); } 2383 2384 /// A lightweight wrapper around an expression operand. 2385 /// 2386 /// TODO: Store arguments directly and change \a DIExpression to store a 2387 /// range of these. 2388 class ExprOperand { 2389 const uint64_t *Op = nullptr; 2390 2391 public: 2392 ExprOperand() = default; 2393 explicit ExprOperand(const uint64_t *Op) : Op(Op) {} 2394 2395 const uint64_t *get() const { return Op; } 2396 2397 /// Get the operand code. 2398 uint64_t getOp() const { return *Op; } 2399 2400 /// Get an argument to the operand. 2401 /// 2402 /// Never returns the operand itself. 2403 uint64_t getArg(unsigned I) const { return Op[I + 1]; } 2404 2405 unsigned getNumArgs() const { return getSize() - 1; } 2406 2407 /// Return the size of the operand. 2408 /// 2409 /// Return the number of elements in the operand (1 + args). 2410 unsigned getSize() const; 2411 2412 /// Append the elements of this operand to \p V. 2413 void appendToVector(SmallVectorImpl<uint64_t> &V) const { 2414 V.append(get(), get() + getSize()); 2415 } 2416 }; 2417 2418 /// An iterator for expression operands. 2419 class expr_op_iterator 2420 : public std::iterator<std::input_iterator_tag, ExprOperand> { 2421 ExprOperand Op; 2422 2423 public: 2424 expr_op_iterator() = default; 2425 explicit expr_op_iterator(element_iterator I) : Op(I) {} 2426 2427 element_iterator getBase() const { return Op.get(); } 2428 const ExprOperand &operator*() const { return Op; } 2429 const ExprOperand *operator->() const { return &Op; } 2430 2431 expr_op_iterator &operator++() { 2432 increment(); 2433 return *this; 2434 } 2435 expr_op_iterator operator++(int) { 2436 expr_op_iterator T(*this); 2437 increment(); 2438 return T; 2439 } 2440 2441 /// Get the next iterator. 2442 /// 2443 /// \a std::next() doesn't work because this is technically an 2444 /// input_iterator, but it's a perfectly valid operation. This is an 2445 /// accessor to provide the same functionality. 2446 expr_op_iterator getNext() const { return ++expr_op_iterator(*this); } 2447 2448 bool operator==(const expr_op_iterator &X) const { 2449 return getBase() == X.getBase(); 2450 } 2451 bool operator!=(const expr_op_iterator &X) const { 2452 return getBase() != X.getBase(); 2453 } 2454 2455 private: 2456 void increment() { Op = ExprOperand(getBase() + Op.getSize()); } 2457 }; 2458 2459 /// Visit the elements via ExprOperand wrappers. 2460 /// 2461 /// These range iterators visit elements through \a ExprOperand wrappers. 2462 /// This is not guaranteed to be a valid range unless \a isValid() gives \c 2463 /// true. 2464 /// 2465 /// \pre \a isValid() gives \c true. 2466 /// @{ 2467 expr_op_iterator expr_op_begin() const { 2468 return expr_op_iterator(elements_begin()); 2469 } 2470 expr_op_iterator expr_op_end() const { 2471 return expr_op_iterator(elements_end()); 2472 } 2473 iterator_range<expr_op_iterator> expr_ops() const { 2474 return {expr_op_begin(), expr_op_end()}; 2475 } 2476 /// @} 2477 2478 bool isValid() const; 2479 2480 static bool classof(const Metadata *MD) { 2481 return MD->getMetadataID() == DIExpressionKind; 2482 } 2483 2484 /// Return whether the first element a DW_OP_deref. 2485 bool startsWithDeref() const { 2486 return getNumElements() > 0 && getElement(0) == dwarf::DW_OP_deref; 2487 } 2488 2489 /// Holds the characteristics of one fragment of a larger variable. 2490 struct FragmentInfo { 2491 uint64_t SizeInBits; 2492 uint64_t OffsetInBits; 2493 }; 2494 2495 /// Retrieve the details of this fragment expression. 2496 static Optional<FragmentInfo> getFragmentInfo(expr_op_iterator Start, 2497 expr_op_iterator End); 2498 2499 /// Retrieve the details of this fragment expression. 2500 Optional<FragmentInfo> getFragmentInfo() const { 2501 return getFragmentInfo(expr_op_begin(), expr_op_end()); 2502 } 2503 2504 /// Return whether this is a piece of an aggregate variable. 2505 bool isFragment() const { return getFragmentInfo().hasValue(); } 2506 2507 /// Append \p Ops with operations to apply the \p Offset. 2508 static void appendOffset(SmallVectorImpl<uint64_t> &Ops, int64_t Offset); 2509 2510 /// If this is a constant offset, extract it. If there is no expression, 2511 /// return true with an offset of zero. 2512 bool extractIfOffset(int64_t &Offset) const; 2513 2514 /// Constants for DIExpression::prepend. 2515 enum { NoDeref = false, WithDeref = true, WithStackValue = true }; 2516 2517 /// Prepend \p DIExpr with a deref and offset operation and optionally turn it 2518 /// into a stack value. 2519 static DIExpression *prepend(const DIExpression *Expr, bool DerefBefore, 2520 int64_t Offset = 0, bool DerefAfter = false, 2521 bool StackValue = false); 2522 2523 /// Prepend \p DIExpr with the given opcodes and optionally turn it into a 2524 /// stack value. 2525 static DIExpression *prependOpcodes(const DIExpression *Expr, 2526 SmallVectorImpl<uint64_t> &Ops, 2527 bool StackValue = false); 2528 2529 /// Append the opcodes \p Ops to \p DIExpr. Unlike \ref appendToStack, the 2530 /// returned expression is a stack value only if \p DIExpr is a stack value. 2531 /// If \p DIExpr describes a fragment, the returned expression will describe 2532 /// the same fragment. 2533 static DIExpression *append(const DIExpression *Expr, ArrayRef<uint64_t> Ops); 2534 2535 /// Convert \p DIExpr into a stack value if it isn't one already by appending 2536 /// DW_OP_deref if needed, and appending \p Ops to the resulting expression. 2537 /// If \p DIExpr describes a fragment, the returned expression will describe 2538 /// the same fragment. 2539 static DIExpression *appendToStack(const DIExpression *Expr, 2540 ArrayRef<uint64_t> Ops); 2541 2542 /// Create a DIExpression to describe one part of an aggregate variable that 2543 /// is fragmented across multiple Values. The DW_OP_LLVM_fragment operation 2544 /// will be appended to the elements of \c Expr. If \c Expr already contains 2545 /// a \c DW_OP_LLVM_fragment \c OffsetInBits is interpreted as an offset 2546 /// into the existing fragment. 2547 /// 2548 /// \param OffsetInBits Offset of the piece in bits. 2549 /// \param SizeInBits Size of the piece in bits. 2550 /// \return Creating a fragment expression may fail if \c Expr 2551 /// contains arithmetic operations that would be truncated. 2552 static Optional<DIExpression *> 2553 createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, 2554 unsigned SizeInBits); 2555 2556 /// Determine the relative position of the fragments described by this 2557 /// DIExpression and \p Other. 2558 /// Returns -1 if this is entirely before Other, 0 if this and Other overlap, 2559 /// 1 if this is entirely after Other. 2560 int fragmentCmp(const DIExpression *Other) const { 2561 auto Fragment1 = *getFragmentInfo(); 2562 auto Fragment2 = *Other->getFragmentInfo(); 2563 unsigned l1 = Fragment1.OffsetInBits; 2564 unsigned l2 = Fragment2.OffsetInBits; 2565 unsigned r1 = l1 + Fragment1.SizeInBits; 2566 unsigned r2 = l2 + Fragment2.SizeInBits; 2567 if (r1 <= l2) 2568 return -1; 2569 else if (r2 <= l1) 2570 return 1; 2571 else 2572 return 0; 2573 } 2574 2575 /// Check if fragments overlap between this DIExpression and \p Other. 2576 bool fragmentsOverlap(const DIExpression *Other) const { 2577 if (!isFragment() || !Other->isFragment()) 2578 return true; 2579 return fragmentCmp(Other) == 0; 2580 } 2581 }; 2582 2583 /// Global variables. 2584 /// 2585 /// TODO: Remove DisplayName. It's always equal to Name. 2586 class DIGlobalVariable : public DIVariable { 2587 friend class LLVMContextImpl; 2588 friend class MDNode; 2589 2590 bool IsLocalToUnit; 2591 bool IsDefinition; 2592 2593 DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line, 2594 bool IsLocalToUnit, bool IsDefinition, uint32_t AlignInBits, 2595 ArrayRef<Metadata *> Ops) 2596 : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits), 2597 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {} 2598 ~DIGlobalVariable() = default; 2599 2600 static DIGlobalVariable * 2601 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name, 2602 StringRef LinkageName, DIFile *File, unsigned Line, DITypeRef Type, 2603 bool IsLocalToUnit, bool IsDefinition, 2604 DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams, 2605 uint32_t AlignInBits, StorageType Storage, bool ShouldCreate = true) { 2606 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), 2607 getCanonicalMDString(Context, LinkageName), File, Line, Type, 2608 IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration, 2609 cast_or_null<Metadata>(TemplateParams), AlignInBits, Storage, 2610 ShouldCreate); 2611 } 2612 static DIGlobalVariable * 2613 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, 2614 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type, 2615 bool IsLocalToUnit, bool IsDefinition, 2616 Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams, 2617 uint32_t AlignInBits, StorageType Storage, bool ShouldCreate = true); 2618 2619 TempDIGlobalVariable cloneImpl() const { 2620 return getTemporary(getContext(), getScope(), getName(), getLinkageName(), 2621 getFile(), getLine(), getType(), isLocalToUnit(), 2622 isDefinition(), getStaticDataMemberDeclaration(), 2623 getTemplateParams(), getAlignInBits()); 2624 } 2625 2626 public: 2627 DEFINE_MDNODE_GET(DIGlobalVariable, 2628 (DIScope * Scope, StringRef Name, StringRef LinkageName, 2629 DIFile *File, unsigned Line, DITypeRef Type, 2630 bool IsLocalToUnit, bool IsDefinition, 2631 DIDerivedType *StaticDataMemberDeclaration, 2632 MDTuple *TemplateParams, uint32_t AlignInBits), 2633 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 2634 IsDefinition, StaticDataMemberDeclaration, TemplateParams, 2635 AlignInBits)) 2636 DEFINE_MDNODE_GET(DIGlobalVariable, 2637 (Metadata * Scope, MDString *Name, MDString *LinkageName, 2638 Metadata *File, unsigned Line, Metadata *Type, 2639 bool IsLocalToUnit, bool IsDefinition, 2640 Metadata *StaticDataMemberDeclaration, 2641 Metadata *TemplateParams, uint32_t AlignInBits), 2642 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 2643 IsDefinition, StaticDataMemberDeclaration, TemplateParams, 2644 AlignInBits)) 2645 2646 TempDIGlobalVariable clone() const { return cloneImpl(); } 2647 2648 bool isLocalToUnit() const { return IsLocalToUnit; } 2649 bool isDefinition() const { return IsDefinition; } 2650 StringRef getDisplayName() const { return getStringOperand(4); } 2651 StringRef getLinkageName() const { return getStringOperand(5); } 2652 DIDerivedType *getStaticDataMemberDeclaration() const { 2653 return cast_or_null<DIDerivedType>(getRawStaticDataMemberDeclaration()); 2654 } 2655 2656 MDString *getRawLinkageName() const { return getOperandAs<MDString>(5); } 2657 Metadata *getRawStaticDataMemberDeclaration() const { return getOperand(6); } 2658 Metadata *getRawTemplateParams() const { return getOperand(7); } 2659 MDTuple *getTemplateParams() const { return getOperandAs<MDTuple>(7); } 2660 2661 static bool classof(const Metadata *MD) { 2662 return MD->getMetadataID() == DIGlobalVariableKind; 2663 } 2664 }; 2665 2666 /// Local variable. 2667 /// 2668 /// TODO: Split up flags. 2669 class DILocalVariable : public DIVariable { 2670 friend class LLVMContextImpl; 2671 friend class MDNode; 2672 2673 unsigned Arg : 16; 2674 DIFlags Flags; 2675 2676 DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line, 2677 unsigned Arg, DIFlags Flags, uint32_t AlignInBits, 2678 ArrayRef<Metadata *> Ops) 2679 : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits), 2680 Arg(Arg), Flags(Flags) { 2681 assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range"); 2682 } 2683 ~DILocalVariable() = default; 2684 2685 static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope, 2686 StringRef Name, DIFile *File, unsigned Line, 2687 DITypeRef Type, unsigned Arg, DIFlags Flags, 2688 uint32_t AlignInBits, StorageType Storage, 2689 bool ShouldCreate = true) { 2690 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File, 2691 Line, Type, Arg, Flags, AlignInBits, Storage, ShouldCreate); 2692 } 2693 static DILocalVariable *getImpl(LLVMContext &Context, Metadata *Scope, 2694 MDString *Name, Metadata *File, unsigned Line, 2695 Metadata *Type, unsigned Arg, DIFlags Flags, 2696 uint32_t AlignInBits, StorageType Storage, 2697 bool ShouldCreate = true); 2698 2699 TempDILocalVariable cloneImpl() const { 2700 return getTemporary(getContext(), getScope(), getName(), getFile(), 2701 getLine(), getType(), getArg(), getFlags(), 2702 getAlignInBits()); 2703 } 2704 2705 public: 2706 DEFINE_MDNODE_GET(DILocalVariable, 2707 (DILocalScope * Scope, StringRef Name, DIFile *File, 2708 unsigned Line, DITypeRef Type, unsigned Arg, 2709 DIFlags Flags, uint32_t AlignInBits), 2710 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits)) 2711 DEFINE_MDNODE_GET(DILocalVariable, 2712 (Metadata * Scope, MDString *Name, Metadata *File, 2713 unsigned Line, Metadata *Type, unsigned Arg, 2714 DIFlags Flags, uint32_t AlignInBits), 2715 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits)) 2716 2717 TempDILocalVariable clone() const { return cloneImpl(); } 2718 2719 /// Get the local scope for this variable. 2720 /// 2721 /// Variables must be defined in a local scope. 2722 DILocalScope *getScope() const { 2723 return cast<DILocalScope>(DIVariable::getScope()); 2724 } 2725 2726 bool isParameter() const { return Arg; } 2727 unsigned getArg() const { return Arg; } 2728 DIFlags getFlags() const { return Flags; } 2729 2730 bool isArtificial() const { return getFlags() & FlagArtificial; } 2731 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; } 2732 2733 /// Check that a location is valid for this variable. 2734 /// 2735 /// Check that \c DL exists, is in the same subprogram, and has the same 2736 /// inlined-at location as \c this. (Otherwise, it's not a valid attachment 2737 /// to a \a DbgInfoIntrinsic.) 2738 bool isValidLocationForIntrinsic(const DILocation *DL) const { 2739 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram(); 2740 } 2741 2742 static bool classof(const Metadata *MD) { 2743 return MD->getMetadataID() == DILocalVariableKind; 2744 } 2745 }; 2746 2747 /// Label. 2748 /// 2749 class DILabel : public DINode { 2750 friend class LLVMContextImpl; 2751 friend class MDNode; 2752 2753 unsigned Line; 2754 2755 DILabel(LLVMContext &C, StorageType Storage, unsigned Line, 2756 ArrayRef<Metadata *> Ops) 2757 : DINode(C, DILabelKind, Storage, dwarf::DW_TAG_label, Ops), Line(Line) {} 2758 ~DILabel() = default; 2759 2760 static DILabel *getImpl(LLVMContext &Context, DIScope *Scope, 2761 StringRef Name, DIFile *File, unsigned Line, 2762 StorageType Storage, 2763 bool ShouldCreate = true) { 2764 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File, 2765 Line, Storage, ShouldCreate); 2766 } 2767 static DILabel *getImpl(LLVMContext &Context, Metadata *Scope, 2768 MDString *Name, Metadata *File, unsigned Line, 2769 StorageType Storage, 2770 bool ShouldCreate = true); 2771 2772 TempDILabel cloneImpl() const { 2773 return getTemporary(getContext(), getScope(), getName(), getFile(), 2774 getLine()); 2775 } 2776 2777 public: 2778 DEFINE_MDNODE_GET(DILabel, 2779 (DILocalScope * Scope, StringRef Name, DIFile *File, 2780 unsigned Line), 2781 (Scope, Name, File, Line)) 2782 DEFINE_MDNODE_GET(DILabel, 2783 (Metadata * Scope, MDString *Name, Metadata *File, 2784 unsigned Line), 2785 (Scope, Name, File, Line)) 2786 2787 TempDILabel clone() const { return cloneImpl(); } 2788 2789 /// Get the local scope for this label. 2790 /// 2791 /// Labels must be defined in a local scope. 2792 DILocalScope *getScope() const { 2793 return cast_or_null<DILocalScope>(getRawScope()); 2794 } 2795 unsigned getLine() const { return Line; } 2796 StringRef getName() const { return getStringOperand(1); } 2797 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 2798 2799 Metadata *getRawScope() const { return getOperand(0); } 2800 MDString *getRawName() const { return getOperandAs<MDString>(1); } 2801 Metadata *getRawFile() const { return getOperand(2); } 2802 2803 /// Check that a location is valid for this label. 2804 /// 2805 /// Check that \c DL exists, is in the same subprogram, and has the same 2806 /// inlined-at location as \c this. (Otherwise, it's not a valid attachment 2807 /// to a \a DbgInfoIntrinsic.) 2808 bool isValidLocationForIntrinsic(const DILocation *DL) const { 2809 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram(); 2810 } 2811 2812 static bool classof(const Metadata *MD) { 2813 return MD->getMetadataID() == DILabelKind; 2814 } 2815 }; 2816 2817 class DIObjCProperty : public DINode { 2818 friend class LLVMContextImpl; 2819 friend class MDNode; 2820 2821 unsigned Line; 2822 unsigned Attributes; 2823 2824 DIObjCProperty(LLVMContext &C, StorageType Storage, unsigned Line, 2825 unsigned Attributes, ArrayRef<Metadata *> Ops) 2826 : DINode(C, DIObjCPropertyKind, Storage, dwarf::DW_TAG_APPLE_property, 2827 Ops), 2828 Line(Line), Attributes(Attributes) {} 2829 ~DIObjCProperty() = default; 2830 2831 static DIObjCProperty * 2832 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line, 2833 StringRef GetterName, StringRef SetterName, unsigned Attributes, 2834 DITypeRef Type, StorageType Storage, bool ShouldCreate = true) { 2835 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line, 2836 getCanonicalMDString(Context, GetterName), 2837 getCanonicalMDString(Context, SetterName), Attributes, Type, 2838 Storage, ShouldCreate); 2839 } 2840 static DIObjCProperty *getImpl(LLVMContext &Context, MDString *Name, 2841 Metadata *File, unsigned Line, 2842 MDString *GetterName, MDString *SetterName, 2843 unsigned Attributes, Metadata *Type, 2844 StorageType Storage, bool ShouldCreate = true); 2845 2846 TempDIObjCProperty cloneImpl() const { 2847 return getTemporary(getContext(), getName(), getFile(), getLine(), 2848 getGetterName(), getSetterName(), getAttributes(), 2849 getType()); 2850 } 2851 2852 public: 2853 DEFINE_MDNODE_GET(DIObjCProperty, 2854 (StringRef Name, DIFile *File, unsigned Line, 2855 StringRef GetterName, StringRef SetterName, 2856 unsigned Attributes, DITypeRef Type), 2857 (Name, File, Line, GetterName, SetterName, Attributes, 2858 Type)) 2859 DEFINE_MDNODE_GET(DIObjCProperty, 2860 (MDString * Name, Metadata *File, unsigned Line, 2861 MDString *GetterName, MDString *SetterName, 2862 unsigned Attributes, Metadata *Type), 2863 (Name, File, Line, GetterName, SetterName, Attributes, 2864 Type)) 2865 2866 TempDIObjCProperty clone() const { return cloneImpl(); } 2867 2868 unsigned getLine() const { return Line; } 2869 unsigned getAttributes() const { return Attributes; } 2870 StringRef getName() const { return getStringOperand(0); } 2871 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 2872 StringRef getGetterName() const { return getStringOperand(2); } 2873 StringRef getSetterName() const { return getStringOperand(3); } 2874 DITypeRef getType() const { return DITypeRef(getRawType()); } 2875 2876 StringRef getFilename() const { 2877 if (auto *F = getFile()) 2878 return F->getFilename(); 2879 return ""; 2880 } 2881 2882 StringRef getDirectory() const { 2883 if (auto *F = getFile()) 2884 return F->getDirectory(); 2885 return ""; 2886 } 2887 2888 Optional<StringRef> getSource() const { 2889 if (auto *F = getFile()) 2890 return F->getSource(); 2891 return None; 2892 } 2893 2894 MDString *getRawName() const { return getOperandAs<MDString>(0); } 2895 Metadata *getRawFile() const { return getOperand(1); } 2896 MDString *getRawGetterName() const { return getOperandAs<MDString>(2); } 2897 MDString *getRawSetterName() const { return getOperandAs<MDString>(3); } 2898 Metadata *getRawType() const { return getOperand(4); } 2899 2900 static bool classof(const Metadata *MD) { 2901 return MD->getMetadataID() == DIObjCPropertyKind; 2902 } 2903 }; 2904 2905 /// An imported module (C++ using directive or similar). 2906 class DIImportedEntity : public DINode { 2907 friend class LLVMContextImpl; 2908 friend class MDNode; 2909 2910 unsigned Line; 2911 2912 DIImportedEntity(LLVMContext &C, StorageType Storage, unsigned Tag, 2913 unsigned Line, ArrayRef<Metadata *> Ops) 2914 : DINode(C, DIImportedEntityKind, Storage, Tag, Ops), Line(Line) {} 2915 ~DIImportedEntity() = default; 2916 2917 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag, 2918 DIScope *Scope, DINodeRef Entity, 2919 DIFile *File, unsigned Line, StringRef Name, 2920 StorageType Storage, 2921 bool ShouldCreate = true) { 2922 return getImpl(Context, Tag, Scope, Entity, File, Line, 2923 getCanonicalMDString(Context, Name), Storage, ShouldCreate); 2924 } 2925 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag, 2926 Metadata *Scope, Metadata *Entity, 2927 Metadata *File, unsigned Line, 2928 MDString *Name, StorageType Storage, 2929 bool ShouldCreate = true); 2930 2931 TempDIImportedEntity cloneImpl() const { 2932 return getTemporary(getContext(), getTag(), getScope(), getEntity(), 2933 getFile(), getLine(), getName()); 2934 } 2935 2936 public: 2937 DEFINE_MDNODE_GET(DIImportedEntity, 2938 (unsigned Tag, DIScope *Scope, DINodeRef Entity, 2939 DIFile *File, unsigned Line, StringRef Name = ""), 2940 (Tag, Scope, Entity, File, Line, Name)) 2941 DEFINE_MDNODE_GET(DIImportedEntity, 2942 (unsigned Tag, Metadata *Scope, Metadata *Entity, 2943 Metadata *File, unsigned Line, MDString *Name), 2944 (Tag, Scope, Entity, File, Line, Name)) 2945 2946 TempDIImportedEntity clone() const { return cloneImpl(); } 2947 2948 unsigned getLine() const { return Line; } 2949 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); } 2950 DINodeRef getEntity() const { return DINodeRef(getRawEntity()); } 2951 StringRef getName() const { return getStringOperand(2); } 2952 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 2953 2954 Metadata *getRawScope() const { return getOperand(0); } 2955 Metadata *getRawEntity() const { return getOperand(1); } 2956 MDString *getRawName() const { return getOperandAs<MDString>(2); } 2957 Metadata *getRawFile() const { return getOperand(3); } 2958 2959 static bool classof(const Metadata *MD) { 2960 return MD->getMetadataID() == DIImportedEntityKind; 2961 } 2962 }; 2963 2964 /// A pair of DIGlobalVariable and DIExpression. 2965 class DIGlobalVariableExpression : public MDNode { 2966 friend class LLVMContextImpl; 2967 friend class MDNode; 2968 2969 DIGlobalVariableExpression(LLVMContext &C, StorageType Storage, 2970 ArrayRef<Metadata *> Ops) 2971 : MDNode(C, DIGlobalVariableExpressionKind, Storage, Ops) {} 2972 ~DIGlobalVariableExpression() = default; 2973 2974 static DIGlobalVariableExpression * 2975 getImpl(LLVMContext &Context, Metadata *Variable, Metadata *Expression, 2976 StorageType Storage, bool ShouldCreate = true); 2977 2978 TempDIGlobalVariableExpression cloneImpl() const { 2979 return getTemporary(getContext(), getVariable(), getExpression()); 2980 } 2981 2982 public: 2983 DEFINE_MDNODE_GET(DIGlobalVariableExpression, 2984 (Metadata * Variable, Metadata *Expression), 2985 (Variable, Expression)) 2986 2987 TempDIGlobalVariableExpression clone() const { return cloneImpl(); } 2988 2989 Metadata *getRawVariable() const { return getOperand(0); } 2990 2991 DIGlobalVariable *getVariable() const { 2992 return cast_or_null<DIGlobalVariable>(getRawVariable()); 2993 } 2994 2995 Metadata *getRawExpression() const { return getOperand(1); } 2996 2997 DIExpression *getExpression() const { 2998 return cast<DIExpression>(getRawExpression()); 2999 } 3000 3001 static bool classof(const Metadata *MD) { 3002 return MD->getMetadataID() == DIGlobalVariableExpressionKind; 3003 } 3004 }; 3005 3006 /// Macro Info DWARF-like metadata node. 3007 /// 3008 /// A metadata node with a DWARF macro info (i.e., a constant named 3009 /// \c DW_MACINFO_*, defined in llvm/BinaryFormat/Dwarf.h). Called \a 3010 /// DIMacroNode 3011 /// because it's potentially used for non-DWARF output. 3012 class DIMacroNode : public MDNode { 3013 friend class LLVMContextImpl; 3014 friend class MDNode; 3015 3016 protected: 3017 DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType, 3018 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = None) 3019 : MDNode(C, ID, Storage, Ops1, Ops2) { 3020 assert(MIType < 1u << 16); 3021 SubclassData16 = MIType; 3022 } 3023 ~DIMacroNode() = default; 3024 3025 template <class Ty> Ty *getOperandAs(unsigned I) const { 3026 return cast_or_null<Ty>(getOperand(I)); 3027 } 3028 3029 StringRef getStringOperand(unsigned I) const { 3030 if (auto *S = getOperandAs<MDString>(I)) 3031 return S->getString(); 3032 return StringRef(); 3033 } 3034 3035 static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) { 3036 if (S.empty()) 3037 return nullptr; 3038 return MDString::get(Context, S); 3039 } 3040 3041 public: 3042 unsigned getMacinfoType() const { return SubclassData16; } 3043 3044 static bool classof(const Metadata *MD) { 3045 switch (MD->getMetadataID()) { 3046 default: 3047 return false; 3048 case DIMacroKind: 3049 case DIMacroFileKind: 3050 return true; 3051 } 3052 } 3053 }; 3054 3055 class DIMacro : public DIMacroNode { 3056 friend class LLVMContextImpl; 3057 friend class MDNode; 3058 3059 unsigned Line; 3060 3061 DIMacro(LLVMContext &C, StorageType Storage, unsigned MIType, unsigned Line, 3062 ArrayRef<Metadata *> Ops) 3063 : DIMacroNode(C, DIMacroKind, Storage, MIType, Ops), Line(Line) {} 3064 ~DIMacro() = default; 3065 3066 static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line, 3067 StringRef Name, StringRef Value, StorageType Storage, 3068 bool ShouldCreate = true) { 3069 return getImpl(Context, MIType, Line, getCanonicalMDString(Context, Name), 3070 getCanonicalMDString(Context, Value), Storage, ShouldCreate); 3071 } 3072 static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line, 3073 MDString *Name, MDString *Value, StorageType Storage, 3074 bool ShouldCreate = true); 3075 3076 TempDIMacro cloneImpl() const { 3077 return getTemporary(getContext(), getMacinfoType(), getLine(), getName(), 3078 getValue()); 3079 } 3080 3081 public: 3082 DEFINE_MDNODE_GET(DIMacro, (unsigned MIType, unsigned Line, StringRef Name, 3083 StringRef Value = ""), 3084 (MIType, Line, Name, Value)) 3085 DEFINE_MDNODE_GET(DIMacro, (unsigned MIType, unsigned Line, MDString *Name, 3086 MDString *Value), 3087 (MIType, Line, Name, Value)) 3088 3089 TempDIMacro clone() const { return cloneImpl(); } 3090 3091 unsigned getLine() const { return Line; } 3092 3093 StringRef getName() const { return getStringOperand(0); } 3094 StringRef getValue() const { return getStringOperand(1); } 3095 3096 MDString *getRawName() const { return getOperandAs<MDString>(0); } 3097 MDString *getRawValue() const { return getOperandAs<MDString>(1); } 3098 3099 static bool classof(const Metadata *MD) { 3100 return MD->getMetadataID() == DIMacroKind; 3101 } 3102 }; 3103 3104 class DIMacroFile : public DIMacroNode { 3105 friend class LLVMContextImpl; 3106 friend class MDNode; 3107 3108 unsigned Line; 3109 3110 DIMacroFile(LLVMContext &C, StorageType Storage, unsigned MIType, 3111 unsigned Line, ArrayRef<Metadata *> Ops) 3112 : DIMacroNode(C, DIMacroFileKind, Storage, MIType, Ops), Line(Line) {} 3113 ~DIMacroFile() = default; 3114 3115 static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType, 3116 unsigned Line, DIFile *File, 3117 DIMacroNodeArray Elements, StorageType Storage, 3118 bool ShouldCreate = true) { 3119 return getImpl(Context, MIType, Line, static_cast<Metadata *>(File), 3120 Elements.get(), Storage, ShouldCreate); 3121 } 3122 3123 static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType, 3124 unsigned Line, Metadata *File, Metadata *Elements, 3125 StorageType Storage, bool ShouldCreate = true); 3126 3127 TempDIMacroFile cloneImpl() const { 3128 return getTemporary(getContext(), getMacinfoType(), getLine(), getFile(), 3129 getElements()); 3130 } 3131 3132 public: 3133 DEFINE_MDNODE_GET(DIMacroFile, (unsigned MIType, unsigned Line, DIFile *File, 3134 DIMacroNodeArray Elements), 3135 (MIType, Line, File, Elements)) 3136 DEFINE_MDNODE_GET(DIMacroFile, (unsigned MIType, unsigned Line, 3137 Metadata *File, Metadata *Elements), 3138 (MIType, Line, File, Elements)) 3139 3140 TempDIMacroFile clone() const { return cloneImpl(); } 3141 3142 void replaceElements(DIMacroNodeArray Elements) { 3143 #ifndef NDEBUG 3144 for (DIMacroNode *Op : getElements()) 3145 assert(is_contained(Elements->operands(), Op) && 3146 "Lost a macro node during macro node list replacement"); 3147 #endif 3148 replaceOperandWith(1, Elements.get()); 3149 } 3150 3151 unsigned getLine() const { return Line; } 3152 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); } 3153 3154 DIMacroNodeArray getElements() const { 3155 return cast_or_null<MDTuple>(getRawElements()); 3156 } 3157 3158 Metadata *getRawFile() const { return getOperand(0); } 3159 Metadata *getRawElements() const { return getOperand(1); } 3160 3161 static bool classof(const Metadata *MD) { 3162 return MD->getMetadataID() == DIMacroFileKind; 3163 } 3164 }; 3165 3166 } // end namespace llvm 3167 3168 #undef DEFINE_MDNODE_GET_UNPACK_IMPL 3169 #undef DEFINE_MDNODE_GET_UNPACK 3170 #undef DEFINE_MDNODE_GET 3171 3172 #endif // LLVM_IR_DEBUGINFOMETADATA_H 3173