File indexing completed on 2026-05-10 08:43:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_IR_DEBUGINFOMETADATA_H
0014 #define LLVM_IR_DEBUGINFOMETADATA_H
0015
0016 #include "llvm/ADT/ArrayRef.h"
0017 #include "llvm/ADT/BitmaskEnum.h"
0018 #include "llvm/ADT/PointerUnion.h"
0019 #include "llvm/ADT/STLExtras.h"
0020 #include "llvm/ADT/SmallVector.h"
0021 #include "llvm/ADT/StringRef.h"
0022 #include "llvm/ADT/iterator_range.h"
0023 #include "llvm/IR/Constants.h"
0024 #include "llvm/IR/DbgVariableFragmentInfo.h"
0025 #include "llvm/IR/Metadata.h"
0026 #include "llvm/IR/PseudoProbe.h"
0027 #include "llvm/Support/Casting.h"
0028 #include "llvm/Support/CommandLine.h"
0029 #include "llvm/Support/Discriminator.h"
0030 #include <cassert>
0031 #include <climits>
0032 #include <cstddef>
0033 #include <cstdint>
0034 #include <iterator>
0035 #include <optional>
0036 #include <vector>
0037
0038
0039 #define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__
0040 #define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS
0041 #define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) \
0042 static CLASS *getDistinct(LLVMContext &Context, \
0043 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
0044 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \
0045 } \
0046 static Temp##CLASS getTemporary(LLVMContext &Context, \
0047 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
0048 return Temp##CLASS( \
0049 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \
0050 }
0051 #define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \
0052 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
0053 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \
0054 } \
0055 static CLASS *getIfExists(LLVMContext &Context, \
0056 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
0057 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \
0058 false); \
0059 } \
0060 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
0061
0062 namespace llvm {
0063
0064 namespace dwarf {
0065 enum Tag : uint16_t;
0066 }
0067
0068 class DbgVariableIntrinsic;
0069 class DbgVariableRecord;
0070
0071 extern cl::opt<bool> EnableFSDiscriminator;
0072
0073 class DITypeRefArray {
0074 const MDTuple *N = nullptr;
0075
0076 public:
0077 DITypeRefArray() = default;
0078 DITypeRefArray(const MDTuple *N) : N(N) {}
0079
0080 explicit operator bool() const { return get(); }
0081 explicit operator MDTuple *() const { return get(); }
0082
0083 MDTuple *get() const { return const_cast<MDTuple *>(N); }
0084 MDTuple *operator->() const { return get(); }
0085 MDTuple &operator*() const { return *get(); }
0086
0087
0088 unsigned size() const { return N ? N->getNumOperands() : 0u; }
0089 DIType *operator[](unsigned I) const {
0090 return cast_or_null<DIType>(N->getOperand(I));
0091 }
0092
0093 class iterator {
0094 MDNode::op_iterator I = nullptr;
0095
0096 public:
0097 using iterator_category = std::input_iterator_tag;
0098 using value_type = DIType *;
0099 using difference_type = std::ptrdiff_t;
0100 using pointer = void;
0101 using reference = DIType *;
0102
0103 iterator() = default;
0104 explicit iterator(MDNode::op_iterator I) : I(I) {}
0105
0106 DIType *operator*() const { return cast_or_null<DIType>(*I); }
0107
0108 iterator &operator++() {
0109 ++I;
0110 return *this;
0111 }
0112
0113 iterator operator++(int) {
0114 iterator Temp(*this);
0115 ++I;
0116 return Temp;
0117 }
0118
0119 bool operator==(const iterator &X) const { return I == X.I; }
0120 bool operator!=(const iterator &X) const { return I != X.I; }
0121 };
0122
0123
0124 iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); }
0125 iterator end() const { return N ? iterator(N->op_end()) : iterator(); }
0126 };
0127
0128
0129
0130
0131
0132
0133
0134
0135 class DINode : public MDNode {
0136 friend class LLVMContextImpl;
0137 friend class MDNode;
0138
0139 protected:
0140 DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
0141 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = {})
0142 : MDNode(C, ID, Storage, Ops1, Ops2) {
0143 assert(Tag < 1u << 16);
0144 SubclassData16 = Tag;
0145 }
0146 ~DINode() = default;
0147
0148 template <class Ty> Ty *getOperandAs(unsigned I) const {
0149 return cast_or_null<Ty>(getOperand(I));
0150 }
0151
0152 StringRef getStringOperand(unsigned I) const {
0153 if (auto *S = getOperandAs<MDString>(I))
0154 return S->getString();
0155 return StringRef();
0156 }
0157
0158 static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) {
0159 if (S.empty())
0160 return nullptr;
0161 return MDString::get(Context, S);
0162 }
0163
0164
0165 void setTag(unsigned Tag) { SubclassData16 = Tag; }
0166
0167 public:
0168 dwarf::Tag getTag() const;
0169
0170
0171
0172
0173
0174 enum DIFlags : uint32_t {
0175 #define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
0176 #define DI_FLAG_LARGEST_NEEDED
0177 #include "llvm/IR/DebugInfoFlags.def"
0178 FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic,
0179 FlagPtrToMemberRep = FlagSingleInheritance | FlagMultipleInheritance |
0180 FlagVirtualInheritance,
0181 LLVM_MARK_AS_BITMASK_ENUM(FlagLargest)
0182 };
0183
0184 static DIFlags getFlag(StringRef Flag);
0185 static StringRef getFlagString(DIFlags Flag);
0186
0187
0188
0189
0190
0191 static DIFlags splitFlags(DIFlags Flags,
0192 SmallVectorImpl<DIFlags> &SplitFlags);
0193
0194 static bool classof(const Metadata *MD) {
0195 switch (MD->getMetadataID()) {
0196 default:
0197 return false;
0198 case GenericDINodeKind:
0199 case DISubrangeKind:
0200 case DIEnumeratorKind:
0201 case DIBasicTypeKind:
0202 case DIStringTypeKind:
0203 case DIDerivedTypeKind:
0204 case DICompositeTypeKind:
0205 case DISubroutineTypeKind:
0206 case DIFileKind:
0207 case DICompileUnitKind:
0208 case DISubprogramKind:
0209 case DILexicalBlockKind:
0210 case DILexicalBlockFileKind:
0211 case DINamespaceKind:
0212 case DICommonBlockKind:
0213 case DITemplateTypeParameterKind:
0214 case DITemplateValueParameterKind:
0215 case DIGlobalVariableKind:
0216 case DILocalVariableKind:
0217 case DILabelKind:
0218 case DIObjCPropertyKind:
0219 case DIImportedEntityKind:
0220 case DIModuleKind:
0221 case DIGenericSubrangeKind:
0222 case DIAssignIDKind:
0223 return true;
0224 }
0225 }
0226 };
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236 class GenericDINode : public DINode {
0237 friend class LLVMContextImpl;
0238 friend class MDNode;
0239
0240 GenericDINode(LLVMContext &C, StorageType Storage, unsigned Hash,
0241 unsigned Tag, ArrayRef<Metadata *> Ops1,
0242 ArrayRef<Metadata *> Ops2)
0243 : DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) {
0244 setHash(Hash);
0245 }
0246 ~GenericDINode() { dropAllReferences(); }
0247
0248 void setHash(unsigned Hash) { SubclassData32 = Hash; }
0249 void recalculateHash();
0250
0251 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
0252 StringRef Header, ArrayRef<Metadata *> DwarfOps,
0253 StorageType Storage, bool ShouldCreate = true) {
0254 return getImpl(Context, Tag, getCanonicalMDString(Context, Header),
0255 DwarfOps, Storage, ShouldCreate);
0256 }
0257
0258 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
0259 MDString *Header, ArrayRef<Metadata *> DwarfOps,
0260 StorageType Storage, bool ShouldCreate = true);
0261
0262 TempGenericDINode cloneImpl() const {
0263 return getTemporary(getContext(), getTag(), getHeader(),
0264 SmallVector<Metadata *, 4>(dwarf_operands()));
0265 }
0266
0267 public:
0268 unsigned getHash() const { return SubclassData32; }
0269
0270 DEFINE_MDNODE_GET(GenericDINode,
0271 (unsigned Tag, StringRef Header,
0272 ArrayRef<Metadata *> DwarfOps),
0273 (Tag, Header, DwarfOps))
0274 DEFINE_MDNODE_GET(GenericDINode,
0275 (unsigned Tag, MDString *Header,
0276 ArrayRef<Metadata *> DwarfOps),
0277 (Tag, Header, DwarfOps))
0278
0279
0280 TempGenericDINode clone() const { return cloneImpl(); }
0281
0282 dwarf::Tag getTag() const;
0283 StringRef getHeader() const { return getStringOperand(0); }
0284 MDString *getRawHeader() const { return getOperandAs<MDString>(0); }
0285
0286 op_iterator dwarf_op_begin() const { return op_begin() + 1; }
0287 op_iterator dwarf_op_end() const { return op_end(); }
0288 op_range dwarf_operands() const {
0289 return op_range(dwarf_op_begin(), dwarf_op_end());
0290 }
0291
0292 unsigned getNumDwarfOperands() const { return getNumOperands() - 1; }
0293 const MDOperand &getDwarfOperand(unsigned I) const {
0294 return getOperand(I + 1);
0295 }
0296 void replaceDwarfOperandWith(unsigned I, Metadata *New) {
0297 replaceOperandWith(I + 1, New);
0298 }
0299
0300 static bool classof(const Metadata *MD) {
0301 return MD->getMetadataID() == GenericDINodeKind;
0302 }
0303 };
0304
0305
0306
0307
0308
0309 class DIAssignID : public MDNode {
0310 friend class LLVMContextImpl;
0311 friend class MDNode;
0312
0313 DIAssignID(LLVMContext &C, StorageType Storage)
0314 : MDNode(C, DIAssignIDKind, Storage, {}) {}
0315
0316 ~DIAssignID() { dropAllReferences(); }
0317
0318 static DIAssignID *getImpl(LLVMContext &Context, StorageType Storage,
0319 bool ShouldCreate = true);
0320
0321 TempDIAssignID cloneImpl() const { return getTemporary(getContext()); }
0322
0323 public:
0324
0325 void replaceOperandWith(unsigned I, Metadata *New) = delete;
0326
0327 SmallVector<DbgVariableRecord *> getAllDbgVariableRecordUsers() {
0328 return Context.getReplaceableUses()->getAllDbgVariableRecordUsers();
0329 }
0330
0331 static DIAssignID *getDistinct(LLVMContext &Context) {
0332 return getImpl(Context, Distinct);
0333 }
0334 static TempDIAssignID getTemporary(LLVMContext &Context) {
0335 return TempDIAssignID(getImpl(Context, Temporary));
0336 }
0337
0338
0339 static bool classof(const Metadata *MD) {
0340 return MD->getMetadataID() == DIAssignIDKind;
0341 }
0342 };
0343
0344
0345
0346
0347
0348 class DISubrange : public DINode {
0349 friend class LLVMContextImpl;
0350 friend class MDNode;
0351
0352 DISubrange(LLVMContext &C, StorageType Storage, ArrayRef<Metadata *> Ops);
0353
0354 ~DISubrange() = default;
0355
0356 static DISubrange *getImpl(LLVMContext &Context, int64_t Count,
0357 int64_t LowerBound, StorageType Storage,
0358 bool ShouldCreate = true);
0359
0360 static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
0361 int64_t LowerBound, StorageType Storage,
0362 bool ShouldCreate = true);
0363
0364 static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
0365 Metadata *LowerBound, Metadata *UpperBound,
0366 Metadata *Stride, StorageType Storage,
0367 bool ShouldCreate = true);
0368
0369 TempDISubrange cloneImpl() const {
0370 return getTemporary(getContext(), getRawCountNode(), getRawLowerBound(),
0371 getRawUpperBound(), getRawStride());
0372 }
0373
0374 public:
0375 DEFINE_MDNODE_GET(DISubrange, (int64_t Count, int64_t LowerBound = 0),
0376 (Count, LowerBound))
0377
0378 DEFINE_MDNODE_GET(DISubrange, (Metadata * CountNode, int64_t LowerBound = 0),
0379 (CountNode, LowerBound))
0380
0381 DEFINE_MDNODE_GET(DISubrange,
0382 (Metadata * CountNode, Metadata *LowerBound,
0383 Metadata *UpperBound, Metadata *Stride),
0384 (CountNode, LowerBound, UpperBound, Stride))
0385
0386 TempDISubrange clone() const { return cloneImpl(); }
0387
0388 Metadata *getRawCountNode() const { return getOperand(0).get(); }
0389
0390 Metadata *getRawLowerBound() const { return getOperand(1).get(); }
0391
0392 Metadata *getRawUpperBound() const { return getOperand(2).get(); }
0393
0394 Metadata *getRawStride() const { return getOperand(3).get(); }
0395
0396 typedef PointerUnion<ConstantInt *, DIVariable *, DIExpression *> BoundType;
0397
0398 BoundType getCount() const;
0399
0400 BoundType getLowerBound() const;
0401
0402 BoundType getUpperBound() const;
0403
0404 BoundType getStride() const;
0405
0406 static bool classof(const Metadata *MD) {
0407 return MD->getMetadataID() == DISubrangeKind;
0408 }
0409 };
0410
0411 class DIGenericSubrange : public DINode {
0412 friend class LLVMContextImpl;
0413 friend class MDNode;
0414
0415 DIGenericSubrange(LLVMContext &C, StorageType Storage,
0416 ArrayRef<Metadata *> Ops);
0417
0418 ~DIGenericSubrange() = default;
0419
0420 static DIGenericSubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
0421 Metadata *LowerBound, Metadata *UpperBound,
0422 Metadata *Stride, StorageType Storage,
0423 bool ShouldCreate = true);
0424
0425 TempDIGenericSubrange cloneImpl() const {
0426 return getTemporary(getContext(), getRawCountNode(), getRawLowerBound(),
0427 getRawUpperBound(), getRawStride());
0428 }
0429
0430 public:
0431 DEFINE_MDNODE_GET(DIGenericSubrange,
0432 (Metadata * CountNode, Metadata *LowerBound,
0433 Metadata *UpperBound, Metadata *Stride),
0434 (CountNode, LowerBound, UpperBound, Stride))
0435
0436 TempDIGenericSubrange clone() const { return cloneImpl(); }
0437
0438 Metadata *getRawCountNode() const { return getOperand(0).get(); }
0439 Metadata *getRawLowerBound() const { return getOperand(1).get(); }
0440 Metadata *getRawUpperBound() const { return getOperand(2).get(); }
0441 Metadata *getRawStride() const { return getOperand(3).get(); }
0442
0443 using BoundType = PointerUnion<DIVariable *, DIExpression *>;
0444
0445 BoundType getCount() const;
0446 BoundType getLowerBound() const;
0447 BoundType getUpperBound() const;
0448 BoundType getStride() const;
0449
0450 static bool classof(const Metadata *MD) {
0451 return MD->getMetadataID() == DIGenericSubrangeKind;
0452 }
0453 };
0454
0455
0456
0457
0458
0459 class DIEnumerator : public DINode {
0460 friend class LLVMContextImpl;
0461 friend class MDNode;
0462
0463 APInt Value;
0464 DIEnumerator(LLVMContext &C, StorageType Storage, const APInt &Value,
0465 bool IsUnsigned, ArrayRef<Metadata *> Ops);
0466 DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value,
0467 bool IsUnsigned, ArrayRef<Metadata *> Ops)
0468 : DIEnumerator(C, Storage, APInt(64, Value, !IsUnsigned), IsUnsigned,
0469 Ops) {}
0470 ~DIEnumerator() = default;
0471
0472 static DIEnumerator *getImpl(LLVMContext &Context, const APInt &Value,
0473 bool IsUnsigned, StringRef Name,
0474 StorageType Storage, bool ShouldCreate = true) {
0475 return getImpl(Context, Value, IsUnsigned,
0476 getCanonicalMDString(Context, Name), Storage, ShouldCreate);
0477 }
0478 static DIEnumerator *getImpl(LLVMContext &Context, const APInt &Value,
0479 bool IsUnsigned, MDString *Name,
0480 StorageType Storage, bool ShouldCreate = true);
0481
0482 TempDIEnumerator cloneImpl() const {
0483 return getTemporary(getContext(), getValue(), isUnsigned(), getName());
0484 }
0485
0486 public:
0487 DEFINE_MDNODE_GET(DIEnumerator,
0488 (int64_t Value, bool IsUnsigned, StringRef Name),
0489 (APInt(64, Value, !IsUnsigned), IsUnsigned, Name))
0490 DEFINE_MDNODE_GET(DIEnumerator,
0491 (int64_t Value, bool IsUnsigned, MDString *Name),
0492 (APInt(64, Value, !IsUnsigned), IsUnsigned, Name))
0493 DEFINE_MDNODE_GET(DIEnumerator,
0494 (APInt Value, bool IsUnsigned, StringRef Name),
0495 (Value, IsUnsigned, Name))
0496 DEFINE_MDNODE_GET(DIEnumerator,
0497 (APInt Value, bool IsUnsigned, MDString *Name),
0498 (Value, IsUnsigned, Name))
0499
0500 TempDIEnumerator clone() const { return cloneImpl(); }
0501
0502 const APInt &getValue() const { return Value; }
0503 bool isUnsigned() const { return SubclassData32; }
0504 StringRef getName() const { return getStringOperand(0); }
0505
0506 MDString *getRawName() const { return getOperandAs<MDString>(0); }
0507
0508 static bool classof(const Metadata *MD) {
0509 return MD->getMetadataID() == DIEnumeratorKind;
0510 }
0511 };
0512
0513
0514
0515
0516
0517
0518
0519 class DIScope : public DINode {
0520 protected:
0521 DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
0522 ArrayRef<Metadata *> Ops)
0523 : DINode(C, ID, Storage, Tag, Ops) {}
0524 ~DIScope() = default;
0525
0526 public:
0527 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
0528
0529 inline StringRef getFilename() const;
0530 inline StringRef getDirectory() const;
0531 inline std::optional<StringRef> getSource() const;
0532
0533 StringRef getName() const;
0534 DIScope *getScope() const;
0535
0536
0537
0538
0539
0540
0541
0542 Metadata *getRawFile() const {
0543 return isa<DIFile>(this) ? const_cast<DIScope *>(this)
0544 : static_cast<Metadata *>(getOperand(0));
0545 }
0546
0547 static bool classof(const Metadata *MD) {
0548 switch (MD->getMetadataID()) {
0549 default:
0550 return false;
0551 case DIBasicTypeKind:
0552 case DIStringTypeKind:
0553 case DIDerivedTypeKind:
0554 case DICompositeTypeKind:
0555 case DISubroutineTypeKind:
0556 case DIFileKind:
0557 case DICompileUnitKind:
0558 case DISubprogramKind:
0559 case DILexicalBlockKind:
0560 case DILexicalBlockFileKind:
0561 case DINamespaceKind:
0562 case DICommonBlockKind:
0563 case DIModuleKind:
0564 return true;
0565 }
0566 }
0567 };
0568
0569
0570
0571
0572
0573 class DIFile : public DIScope {
0574 friend class LLVMContextImpl;
0575 friend class MDNode;
0576
0577 public:
0578
0579
0580
0581
0582 enum ChecksumKind {
0583
0584
0585
0586
0587 CSK_MD5 = 1,
0588 CSK_SHA1 = 2,
0589 CSK_SHA256 = 3,
0590 CSK_Last = CSK_SHA256
0591 };
0592
0593
0594 template <typename T> struct ChecksumInfo {
0595
0596 ChecksumKind Kind;
0597
0598 T Value;
0599
0600 ChecksumInfo(ChecksumKind Kind, T Value) : Kind(Kind), Value(Value) {}
0601 ~ChecksumInfo() = default;
0602 bool operator==(const ChecksumInfo<T> &X) const {
0603 return Kind == X.Kind && Value == X.Value;
0604 }
0605 bool operator!=(const ChecksumInfo<T> &X) const { return !(*this == X); }
0606 StringRef getKindAsString() const { return getChecksumKindAsString(Kind); }
0607 };
0608
0609 private:
0610 std::optional<ChecksumInfo<MDString *>> Checksum;
0611
0612 MDString *Source;
0613
0614 DIFile(LLVMContext &C, StorageType Storage,
0615 std::optional<ChecksumInfo<MDString *>> CS, MDString *Src,
0616 ArrayRef<Metadata *> Ops);
0617 ~DIFile() = default;
0618
0619 static DIFile *getImpl(LLVMContext &Context, StringRef Filename,
0620 StringRef Directory,
0621 std::optional<ChecksumInfo<StringRef>> CS,
0622 std::optional<StringRef> Source, StorageType Storage,
0623 bool ShouldCreate = true) {
0624 std::optional<ChecksumInfo<MDString *>> MDChecksum;
0625 if (CS)
0626 MDChecksum.emplace(CS->Kind, getCanonicalMDString(Context, CS->Value));
0627 return getImpl(Context, getCanonicalMDString(Context, Filename),
0628 getCanonicalMDString(Context, Directory), MDChecksum,
0629 Source ? MDString::get(Context, *Source) : nullptr, Storage,
0630 ShouldCreate);
0631 }
0632 static DIFile *getImpl(LLVMContext &Context, MDString *Filename,
0633 MDString *Directory,
0634 std::optional<ChecksumInfo<MDString *>> CS,
0635 MDString *Source, StorageType Storage,
0636 bool ShouldCreate = true);
0637
0638 TempDIFile cloneImpl() const {
0639 return getTemporary(getContext(), getFilename(), getDirectory(),
0640 getChecksum(), getSource());
0641 }
0642
0643 public:
0644 DEFINE_MDNODE_GET(DIFile,
0645 (StringRef Filename, StringRef Directory,
0646 std::optional<ChecksumInfo<StringRef>> CS = std::nullopt,
0647 std::optional<StringRef> Source = std::nullopt),
0648 (Filename, Directory, CS, Source))
0649 DEFINE_MDNODE_GET(DIFile,
0650 (MDString * Filename, MDString *Directory,
0651 std::optional<ChecksumInfo<MDString *>> CS = std::nullopt,
0652 MDString *Source = nullptr),
0653 (Filename, Directory, CS, Source))
0654
0655 TempDIFile clone() const { return cloneImpl(); }
0656
0657 StringRef getFilename() const { return getStringOperand(0); }
0658 StringRef getDirectory() const { return getStringOperand(1); }
0659 std::optional<ChecksumInfo<StringRef>> getChecksum() const {
0660 std::optional<ChecksumInfo<StringRef>> StringRefChecksum;
0661 if (Checksum)
0662 StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString());
0663 return StringRefChecksum;
0664 }
0665 std::optional<StringRef> getSource() const {
0666 return Source ? std::optional<StringRef>(Source->getString())
0667 : std::nullopt;
0668 }
0669
0670 MDString *getRawFilename() const { return getOperandAs<MDString>(0); }
0671 MDString *getRawDirectory() const { return getOperandAs<MDString>(1); }
0672 std::optional<ChecksumInfo<MDString *>> getRawChecksum() const {
0673 return Checksum;
0674 }
0675 MDString *getRawSource() const { return Source; }
0676
0677 static StringRef getChecksumKindAsString(ChecksumKind CSKind);
0678 static std::optional<ChecksumKind> getChecksumKind(StringRef CSKindStr);
0679
0680 static bool classof(const Metadata *MD) {
0681 return MD->getMetadataID() == DIFileKind;
0682 }
0683 };
0684
0685 StringRef DIScope::getFilename() const {
0686 if (auto *F = getFile())
0687 return F->getFilename();
0688 return "";
0689 }
0690
0691 StringRef DIScope::getDirectory() const {
0692 if (auto *F = getFile())
0693 return F->getDirectory();
0694 return "";
0695 }
0696
0697 std::optional<StringRef> DIScope::getSource() const {
0698 if (auto *F = getFile())
0699 return F->getSource();
0700 return std::nullopt;
0701 }
0702
0703
0704
0705
0706
0707
0708
0709
0710 class DIType : public DIScope {
0711 unsigned Line;
0712 DIFlags Flags;
0713 uint64_t SizeInBits;
0714 uint64_t OffsetInBits;
0715 uint32_t NumExtraInhabitants;
0716
0717 protected:
0718 DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
0719 unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
0720 uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags,
0721 ArrayRef<Metadata *> Ops)
0722 : DIScope(C, ID, Storage, Tag, Ops) {
0723 init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
0724 Flags);
0725 }
0726 ~DIType() = default;
0727
0728 void init(unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
0729 uint64_t OffsetInBits, uint32_t NumExtraInhabitants,
0730 DIFlags Flags) {
0731 this->Line = Line;
0732 this->Flags = Flags;
0733 this->SizeInBits = SizeInBits;
0734 this->SubclassData32 = AlignInBits;
0735 this->OffsetInBits = OffsetInBits;
0736 this->NumExtraInhabitants = NumExtraInhabitants;
0737 }
0738
0739
0740 void mutate(unsigned Tag, unsigned Line, uint64_t SizeInBits,
0741 uint32_t AlignInBits, uint64_t OffsetInBits,
0742 uint32_t NumExtraInhabitants, DIFlags Flags) {
0743 assert(isDistinct() && "Only distinct nodes can mutate");
0744 setTag(Tag);
0745 init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
0746 Flags);
0747 }
0748
0749 public:
0750 TempDIType clone() const {
0751 return TempDIType(cast<DIType>(MDNode::clone().release()));
0752 }
0753
0754 unsigned getLine() const { return Line; }
0755 uint64_t getSizeInBits() const { return SizeInBits; }
0756 uint32_t getAlignInBits() const;
0757 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
0758 uint64_t getOffsetInBits() const { return OffsetInBits; }
0759 uint32_t getNumExtraInhabitants() const { return NumExtraInhabitants; }
0760 DIFlags getFlags() const { return Flags; }
0761
0762 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
0763 StringRef getName() const { return getStringOperand(2); }
0764
0765 Metadata *getRawScope() const { return getOperand(1); }
0766 MDString *getRawName() const { return getOperandAs<MDString>(2); }
0767
0768
0769 TempDIType cloneWithFlags(DIFlags NewFlags) const {
0770 auto NewTy = clone();
0771 NewTy->Flags = NewFlags;
0772 return NewTy;
0773 }
0774
0775 bool isPrivate() const {
0776 return (getFlags() & FlagAccessibility) == FlagPrivate;
0777 }
0778 bool isProtected() const {
0779 return (getFlags() & FlagAccessibility) == FlagProtected;
0780 }
0781 bool isPublic() const {
0782 return (getFlags() & FlagAccessibility) == FlagPublic;
0783 }
0784 bool isForwardDecl() const { return getFlags() & FlagFwdDecl; }
0785 bool isAppleBlockExtension() const { return getFlags() & FlagAppleBlock; }
0786 bool isVirtual() const { return getFlags() & FlagVirtual; }
0787 bool isArtificial() const { return getFlags() & FlagArtificial; }
0788 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
0789 bool isObjcClassComplete() const {
0790 return getFlags() & FlagObjcClassComplete;
0791 }
0792 bool isVector() const { return getFlags() & FlagVector; }
0793 bool isBitField() const { return getFlags() & FlagBitField; }
0794 bool isStaticMember() const { return getFlags() & FlagStaticMember; }
0795 bool isLValueReference() const { return getFlags() & FlagLValueReference; }
0796 bool isRValueReference() const { return getFlags() & FlagRValueReference; }
0797 bool isTypePassByValue() const { return getFlags() & FlagTypePassByValue; }
0798 bool isTypePassByReference() const {
0799 return getFlags() & FlagTypePassByReference;
0800 }
0801 bool isBigEndian() const { return getFlags() & FlagBigEndian; }
0802 bool isLittleEndian() const { return getFlags() & FlagLittleEndian; }
0803 bool getExportSymbols() const { return getFlags() & FlagExportSymbols; }
0804
0805 static bool classof(const Metadata *MD) {
0806 switch (MD->getMetadataID()) {
0807 default:
0808 return false;
0809 case DIBasicTypeKind:
0810 case DIStringTypeKind:
0811 case DIDerivedTypeKind:
0812 case DICompositeTypeKind:
0813 case DISubroutineTypeKind:
0814 return true;
0815 }
0816 }
0817 };
0818
0819
0820
0821
0822
0823 class DIBasicType : public DIType {
0824 friend class LLVMContextImpl;
0825 friend class MDNode;
0826
0827 unsigned Encoding;
0828
0829 DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag,
0830 uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
0831 uint32_t NumExtraInhabitants, DIFlags Flags,
0832 ArrayRef<Metadata *> Ops)
0833 : DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
0834 NumExtraInhabitants, Flags, Ops),
0835 Encoding(Encoding) {}
0836 ~DIBasicType() = default;
0837
0838 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
0839 StringRef Name, uint64_t SizeInBits,
0840 uint32_t AlignInBits, unsigned Encoding,
0841 uint32_t NumExtraInhabitants, DIFlags Flags,
0842 StorageType Storage, bool ShouldCreate = true) {
0843 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
0844 SizeInBits, AlignInBits, Encoding, NumExtraInhabitants,
0845 Flags, Storage, ShouldCreate);
0846 }
0847 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
0848 MDString *Name, uint64_t SizeInBits,
0849 uint32_t AlignInBits, unsigned Encoding,
0850 uint32_t NumExtraInhabitants, DIFlags Flags,
0851 StorageType Storage, bool ShouldCreate = true);
0852
0853 TempDIBasicType cloneImpl() const {
0854 return getTemporary(getContext(), getTag(), getName(), getSizeInBits(),
0855 getAlignInBits(), getEncoding(),
0856 getNumExtraInhabitants(), getFlags());
0857 }
0858
0859 public:
0860 DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name),
0861 (Tag, Name, 0, 0, 0, 0, FlagZero))
0862 DEFINE_MDNODE_GET(DIBasicType,
0863 (unsigned Tag, StringRef Name, uint64_t SizeInBits),
0864 (Tag, Name, SizeInBits, 0, 0, 0, FlagZero))
0865 DEFINE_MDNODE_GET(DIBasicType,
0866 (unsigned Tag, MDString *Name, uint64_t SizeInBits),
0867 (Tag, Name, SizeInBits, 0, 0, 0, FlagZero))
0868 DEFINE_MDNODE_GET(DIBasicType,
0869 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
0870 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
0871 (Tag, Name, SizeInBits, AlignInBits, Encoding, 0, Flags))
0872 DEFINE_MDNODE_GET(DIBasicType,
0873 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
0874 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
0875 (Tag, Name, SizeInBits, AlignInBits, Encoding, 0, Flags))
0876 DEFINE_MDNODE_GET(DIBasicType,
0877 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
0878 uint32_t AlignInBits, unsigned Encoding,
0879 uint32_t NumExtraInhabitants, DIFlags Flags),
0880 (Tag, Name, SizeInBits, AlignInBits, Encoding,
0881 NumExtraInhabitants, Flags))
0882 DEFINE_MDNODE_GET(DIBasicType,
0883 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
0884 uint32_t AlignInBits, unsigned Encoding,
0885 uint32_t NumExtraInhabitants, DIFlags Flags),
0886 (Tag, Name, SizeInBits, AlignInBits, Encoding,
0887 NumExtraInhabitants, Flags))
0888
0889 TempDIBasicType clone() const { return cloneImpl(); }
0890
0891 unsigned getEncoding() const { return Encoding; }
0892
0893 enum class Signedness { Signed, Unsigned };
0894
0895
0896
0897 std::optional<Signedness> getSignedness() const;
0898
0899 static bool classof(const Metadata *MD) {
0900 return MD->getMetadataID() == DIBasicTypeKind;
0901 }
0902 };
0903
0904
0905 class DIStringType : public DIType {
0906 friend class LLVMContextImpl;
0907 friend class MDNode;
0908
0909 unsigned Encoding;
0910
0911 DIStringType(LLVMContext &C, StorageType Storage, unsigned Tag,
0912 uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
0913 ArrayRef<Metadata *> Ops)
0914 : DIType(C, DIStringTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
0915 0, FlagZero, Ops),
0916 Encoding(Encoding) {}
0917 ~DIStringType() = default;
0918
0919 static DIStringType *getImpl(LLVMContext &Context, unsigned Tag,
0920 StringRef Name, Metadata *StringLength,
0921 Metadata *StrLenExp, Metadata *StrLocationExp,
0922 uint64_t SizeInBits, uint32_t AlignInBits,
0923 unsigned Encoding, StorageType Storage,
0924 bool ShouldCreate = true) {
0925 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
0926 StringLength, StrLenExp, StrLocationExp, SizeInBits,
0927 AlignInBits, Encoding, Storage, ShouldCreate);
0928 }
0929 static DIStringType *getImpl(LLVMContext &Context, unsigned Tag,
0930 MDString *Name, Metadata *StringLength,
0931 Metadata *StrLenExp, Metadata *StrLocationExp,
0932 uint64_t SizeInBits, uint32_t AlignInBits,
0933 unsigned Encoding, StorageType Storage,
0934 bool ShouldCreate = true);
0935
0936 TempDIStringType cloneImpl() const {
0937 return getTemporary(getContext(), getTag(), getRawName(),
0938 getRawStringLength(), getRawStringLengthExp(),
0939 getRawStringLocationExp(), getSizeInBits(),
0940 getAlignInBits(), getEncoding());
0941 }
0942
0943 public:
0944 DEFINE_MDNODE_GET(DIStringType,
0945 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
0946 uint32_t AlignInBits),
0947 (Tag, Name, nullptr, nullptr, nullptr, SizeInBits,
0948 AlignInBits, 0))
0949 DEFINE_MDNODE_GET(DIStringType,
0950 (unsigned Tag, MDString *Name, Metadata *StringLength,
0951 Metadata *StringLengthExp, Metadata *StringLocationExp,
0952 uint64_t SizeInBits, uint32_t AlignInBits,
0953 unsigned Encoding),
0954 (Tag, Name, StringLength, StringLengthExp,
0955 StringLocationExp, SizeInBits, AlignInBits, Encoding))
0956 DEFINE_MDNODE_GET(DIStringType,
0957 (unsigned Tag, StringRef Name, Metadata *StringLength,
0958 Metadata *StringLengthExp, Metadata *StringLocationExp,
0959 uint64_t SizeInBits, uint32_t AlignInBits,
0960 unsigned Encoding),
0961 (Tag, Name, StringLength, StringLengthExp,
0962 StringLocationExp, SizeInBits, AlignInBits, Encoding))
0963
0964 TempDIStringType clone() const { return cloneImpl(); }
0965
0966 static bool classof(const Metadata *MD) {
0967 return MD->getMetadataID() == DIStringTypeKind;
0968 }
0969
0970 DIVariable *getStringLength() const {
0971 return cast_or_null<DIVariable>(getRawStringLength());
0972 }
0973
0974 DIExpression *getStringLengthExp() const {
0975 return cast_or_null<DIExpression>(getRawStringLengthExp());
0976 }
0977
0978 DIExpression *getStringLocationExp() const {
0979 return cast_or_null<DIExpression>(getRawStringLocationExp());
0980 }
0981
0982 unsigned getEncoding() const { return Encoding; }
0983
0984 Metadata *getRawStringLength() const { return getOperand(3); }
0985
0986 Metadata *getRawStringLengthExp() const { return getOperand(4); }
0987
0988 Metadata *getRawStringLocationExp() const { return getOperand(5); }
0989 };
0990
0991
0992
0993
0994
0995
0996
0997 class DIDerivedType : public DIType {
0998 public:
0999
1000 struct PtrAuthData {
1001
1002
1003
1004
1005
1006
1007 unsigned RawData;
1008
1009 PtrAuthData(unsigned FromRawData) : RawData(FromRawData) {}
1010 PtrAuthData(unsigned Key, bool IsDiscr, unsigned Discriminator,
1011 bool IsaPointer, bool AuthenticatesNullValues) {
1012 assert(Key < 16);
1013 assert(Discriminator <= 0xffff);
1014 RawData = (Key << 0) | (IsDiscr ? (1 << 4) : 0) | (Discriminator << 5) |
1015 (IsaPointer ? (1 << 21) : 0) |
1016 (AuthenticatesNullValues ? (1 << 22) : 0);
1017 }
1018
1019 unsigned key() { return (RawData >> 0) & 0b1111; }
1020 bool isAddressDiscriminated() { return (RawData >> 4) & 1; }
1021 unsigned extraDiscriminator() { return (RawData >> 5) & 0xffff; }
1022 bool isaPointer() { return (RawData >> 21) & 1; }
1023 bool authenticatesNullValues() { return (RawData >> 22) & 1; }
1024 };
1025
1026 private:
1027 friend class LLVMContextImpl;
1028 friend class MDNode;
1029
1030
1031
1032 std::optional<unsigned> DWARFAddressSpace;
1033
1034 DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag,
1035 unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
1036 uint64_t OffsetInBits,
1037 std::optional<unsigned> DWARFAddressSpace,
1038 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1039 ArrayRef<Metadata *> Ops)
1040 : DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
1041 AlignInBits, OffsetInBits, 0, Flags, Ops),
1042 DWARFAddressSpace(DWARFAddressSpace) {
1043 if (PtrAuthData)
1044 SubclassData32 = PtrAuthData->RawData;
1045 }
1046 ~DIDerivedType() = default;
1047 static DIDerivedType *
1048 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1049 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1050 uint32_t AlignInBits, uint64_t OffsetInBits,
1051 std::optional<unsigned> DWARFAddressSpace,
1052 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1053 Metadata *ExtraData, DINodeArray Annotations, StorageType Storage,
1054 bool ShouldCreate = true) {
1055 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1056 Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
1057 DWARFAddressSpace, PtrAuthData, Flags, ExtraData,
1058 Annotations.get(), Storage, ShouldCreate);
1059 }
1060 static DIDerivedType *
1061 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1062 unsigned Line, Metadata *Scope, Metadata *BaseType,
1063 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1064 std::optional<unsigned> DWARFAddressSpace,
1065 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1066 Metadata *ExtraData, Metadata *Annotations, StorageType Storage,
1067 bool ShouldCreate = true);
1068
1069 TempDIDerivedType cloneImpl() const {
1070 return getTemporary(getContext(), getTag(), getName(), getFile(), getLine(),
1071 getScope(), getBaseType(), getSizeInBits(),
1072 getAlignInBits(), getOffsetInBits(),
1073 getDWARFAddressSpace(), getPtrAuthData(), getFlags(),
1074 getExtraData(), getAnnotations());
1075 }
1076
1077 public:
1078 DEFINE_MDNODE_GET(DIDerivedType,
1079 (unsigned Tag, MDString *Name, Metadata *File,
1080 unsigned Line, Metadata *Scope, Metadata *BaseType,
1081 uint64_t SizeInBits, uint32_t AlignInBits,
1082 uint64_t OffsetInBits,
1083 std::optional<unsigned> DWARFAddressSpace,
1084 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1085 Metadata *ExtraData = nullptr,
1086 Metadata *Annotations = nullptr),
1087 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1088 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1089 Flags, ExtraData, Annotations))
1090 DEFINE_MDNODE_GET(DIDerivedType,
1091 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1092 DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1093 uint32_t AlignInBits, uint64_t OffsetInBits,
1094 std::optional<unsigned> DWARFAddressSpace,
1095 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1096 Metadata *ExtraData = nullptr,
1097 DINodeArray Annotations = nullptr),
1098 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1099 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1100 Flags, ExtraData, Annotations))
1101
1102 TempDIDerivedType clone() const { return cloneImpl(); }
1103
1104
1105 DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
1106 Metadata *getRawBaseType() const { return getOperand(3); }
1107
1108
1109
1110 std::optional<unsigned> getDWARFAddressSpace() const {
1111 return DWARFAddressSpace;
1112 }
1113
1114 std::optional<PtrAuthData> getPtrAuthData() const;
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124 Metadata *getExtraData() const { return getRawExtraData(); }
1125 Metadata *getRawExtraData() const { return getOperand(4); }
1126
1127
1128 DITemplateParameterArray getTemplateParams() const {
1129 return cast_or_null<MDTuple>(getExtraData());
1130 }
1131
1132
1133 DINodeArray getAnnotations() const {
1134 return cast_or_null<MDTuple>(getRawAnnotations());
1135 }
1136 Metadata *getRawAnnotations() const { return getOperand(5); }
1137
1138
1139
1140 DIType *getClassType() const;
1141
1142 DIObjCProperty *getObjCProperty() const {
1143 return dyn_cast_or_null<DIObjCProperty>(getExtraData());
1144 }
1145
1146 uint32_t getVBPtrOffset() const;
1147
1148 Constant *getStorageOffsetInBits() const;
1149
1150 Constant *getConstant() const;
1151
1152 Constant *getDiscriminantValue() const;
1153
1154
1155 static bool classof(const Metadata *MD) {
1156 return MD->getMetadataID() == DIDerivedTypeKind;
1157 }
1158 };
1159
1160 inline bool operator==(DIDerivedType::PtrAuthData Lhs,
1161 DIDerivedType::PtrAuthData Rhs) {
1162 return Lhs.RawData == Rhs.RawData;
1163 }
1164
1165 inline bool operator!=(DIDerivedType::PtrAuthData Lhs,
1166 DIDerivedType::PtrAuthData Rhs) {
1167 return !(Lhs == Rhs);
1168 }
1169
1170
1171
1172
1173
1174 class DICompositeType : public DIType {
1175 friend class LLVMContextImpl;
1176 friend class MDNode;
1177
1178 unsigned RuntimeLang;
1179
1180 DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
1181 unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits,
1182 uint32_t AlignInBits, uint64_t OffsetInBits,
1183 uint32_t NumExtraInhabitants, DIFlags Flags,
1184 ArrayRef<Metadata *> Ops)
1185 : DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits,
1186 AlignInBits, OffsetInBits, NumExtraInhabitants, Flags, Ops),
1187 RuntimeLang(RuntimeLang) {}
1188 ~DICompositeType() = default;
1189
1190
1191 void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang,
1192 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1193 uint32_t NumExtraInhabitants, DIFlags Flags) {
1194 assert(isDistinct() && "Only distinct nodes can mutate");
1195 assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate");
1196 this->RuntimeLang = RuntimeLang;
1197 DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits,
1198 NumExtraInhabitants, Flags);
1199 }
1200
1201 static DICompositeType *
1202 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
1203 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1204 uint32_t AlignInBits, uint64_t OffsetInBits, DIType *Specification,
1205 uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1206 unsigned RuntimeLang, DIType *VTableHolder,
1207 DITemplateParameterArray TemplateParams, StringRef Identifier,
1208 DIDerivedType *Discriminator, Metadata *DataLocation,
1209 Metadata *Associated, Metadata *Allocated, Metadata *Rank,
1210 DINodeArray Annotations, StorageType Storage,
1211 bool ShouldCreate = true) {
1212 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1213 Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
1214 Flags, Elements.get(), RuntimeLang, VTableHolder,
1215 TemplateParams.get(),
1216 getCanonicalMDString(Context, Identifier), Discriminator,
1217 DataLocation, Associated, Allocated, Rank, Annotations.get(),
1218 Specification, NumExtraInhabitants, Storage, ShouldCreate);
1219 }
1220 static DICompositeType *
1221 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1222 unsigned Line, Metadata *Scope, Metadata *BaseType,
1223 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1224 DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
1225 Metadata *VTableHolder, Metadata *TemplateParams,
1226 MDString *Identifier, Metadata *Discriminator, Metadata *DataLocation,
1227 Metadata *Associated, Metadata *Allocated, Metadata *Rank,
1228 Metadata *Annotations, Metadata *Specification,
1229 uint32_t NumExtraInhabitants, StorageType Storage,
1230 bool ShouldCreate = true);
1231
1232 TempDICompositeType cloneImpl() const {
1233 return getTemporary(
1234 getContext(), getTag(), getName(), getFile(), getLine(), getScope(),
1235 getBaseType(), getSizeInBits(), getAlignInBits(), getOffsetInBits(),
1236 getFlags(), getElements(), getRuntimeLang(), getVTableHolder(),
1237 getTemplateParams(), getIdentifier(), getDiscriminator(),
1238 getRawDataLocation(), getRawAssociated(), getRawAllocated(),
1239 getRawRank(), getAnnotations(), getSpecification(),
1240 getNumExtraInhabitants());
1241 }
1242
1243 public:
1244 DEFINE_MDNODE_GET(
1245 DICompositeType,
1246 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1247 DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1248 uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
1249 DINodeArray Elements, unsigned RuntimeLang, DIType *VTableHolder,
1250 DITemplateParameterArray TemplateParams = nullptr,
1251 StringRef Identifier = "", DIDerivedType *Discriminator = nullptr,
1252 Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
1253 Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1254 DINodeArray Annotations = nullptr, DIType *Specification = nullptr,
1255 uint32_t NumExtraInhabitants = 0),
1256 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1257 OffsetInBits, Specification, NumExtraInhabitants, Flags, Elements,
1258 RuntimeLang, VTableHolder, TemplateParams, Identifier, Discriminator,
1259 DataLocation, Associated, Allocated, Rank, Annotations))
1260 DEFINE_MDNODE_GET(
1261 DICompositeType,
1262 (unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
1263 Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits,
1264 uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
1265 Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder,
1266 Metadata *TemplateParams = nullptr, MDString *Identifier = nullptr,
1267 Metadata *Discriminator = nullptr, Metadata *DataLocation = nullptr,
1268 Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1269 Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1270 Metadata *Specification = nullptr, uint32_t NumExtraInhabitants = 0),
1271 (Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1272 OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams,
1273 Identifier, Discriminator, DataLocation, Associated, Allocated, Rank,
1274 Annotations, Specification, NumExtraInhabitants))
1275
1276 TempDICompositeType clone() const { return cloneImpl(); }
1277
1278
1279
1280
1281
1282
1283
1284
1285 static DICompositeType *
1286 getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1287 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1288 Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1289 uint64_t OffsetInBits, Metadata *Specification,
1290 uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements,
1291 unsigned RuntimeLang, Metadata *VTableHolder,
1292 Metadata *TemplateParams, Metadata *Discriminator,
1293 Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
1294 Metadata *Rank, Metadata *Annotations);
1295 static DICompositeType *getODRTypeIfExists(LLVMContext &Context,
1296 MDString &Identifier);
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307 static DICompositeType *
1308 buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1309 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1310 Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1311 uint64_t OffsetInBits, Metadata *Specification,
1312 uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements,
1313 unsigned RuntimeLang, Metadata *VTableHolder,
1314 Metadata *TemplateParams, Metadata *Discriminator,
1315 Metadata *DataLocation, Metadata *Associated,
1316 Metadata *Allocated, Metadata *Rank, Metadata *Annotations);
1317
1318 DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
1319 DINodeArray getElements() const {
1320 return cast_or_null<MDTuple>(getRawElements());
1321 }
1322 DIType *getVTableHolder() const {
1323 return cast_or_null<DIType>(getRawVTableHolder());
1324 }
1325 DITemplateParameterArray getTemplateParams() const {
1326 return cast_or_null<MDTuple>(getRawTemplateParams());
1327 }
1328 StringRef getIdentifier() const { return getStringOperand(7); }
1329 unsigned getRuntimeLang() const { return RuntimeLang; }
1330
1331 Metadata *getRawBaseType() const { return getOperand(3); }
1332 Metadata *getRawElements() const { return getOperand(4); }
1333 Metadata *getRawVTableHolder() const { return getOperand(5); }
1334 Metadata *getRawTemplateParams() const { return getOperand(6); }
1335 MDString *getRawIdentifier() const { return getOperandAs<MDString>(7); }
1336 Metadata *getRawDiscriminator() const { return getOperand(8); }
1337 DIDerivedType *getDiscriminator() const {
1338 return getOperandAs<DIDerivedType>(8);
1339 }
1340 Metadata *getRawDataLocation() const { return getOperand(9); }
1341 DIVariable *getDataLocation() const {
1342 return dyn_cast_or_null<DIVariable>(getRawDataLocation());
1343 }
1344 DIExpression *getDataLocationExp() const {
1345 return dyn_cast_or_null<DIExpression>(getRawDataLocation());
1346 }
1347 Metadata *getRawAssociated() const { return getOperand(10); }
1348 DIVariable *getAssociated() const {
1349 return dyn_cast_or_null<DIVariable>(getRawAssociated());
1350 }
1351 DIExpression *getAssociatedExp() const {
1352 return dyn_cast_or_null<DIExpression>(getRawAssociated());
1353 }
1354 Metadata *getRawAllocated() const { return getOperand(11); }
1355 DIVariable *getAllocated() const {
1356 return dyn_cast_or_null<DIVariable>(getRawAllocated());
1357 }
1358 DIExpression *getAllocatedExp() const {
1359 return dyn_cast_or_null<DIExpression>(getRawAllocated());
1360 }
1361 Metadata *getRawRank() const { return getOperand(12); }
1362 ConstantInt *getRankConst() const {
1363 if (auto *MD = dyn_cast_or_null<ConstantAsMetadata>(getRawRank()))
1364 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1365 return nullptr;
1366 }
1367 DIExpression *getRankExp() const {
1368 return dyn_cast_or_null<DIExpression>(getRawRank());
1369 }
1370
1371 Metadata *getRawAnnotations() const { return getOperand(13); }
1372 DINodeArray getAnnotations() const {
1373 return cast_or_null<MDTuple>(getRawAnnotations());
1374 }
1375
1376 Metadata *getRawSpecification() const { return getOperand(14); }
1377 DIType *getSpecification() const {
1378 return cast_or_null<DIType>(getRawSpecification());
1379 }
1380
1381
1382
1383
1384
1385
1386 void replaceElements(DINodeArray Elements) {
1387 #ifndef NDEBUG
1388 for (DINode *Op : getElements())
1389 assert(is_contained(Elements->operands(), Op) &&
1390 "Lost a member during member list replacement");
1391 #endif
1392 replaceOperandWith(4, Elements.get());
1393 }
1394
1395 void replaceVTableHolder(DIType *VTableHolder) {
1396 replaceOperandWith(5, VTableHolder);
1397 }
1398
1399 void replaceTemplateParams(DITemplateParameterArray TemplateParams) {
1400 replaceOperandWith(6, TemplateParams.get());
1401 }
1402
1403
1404 static bool classof(const Metadata *MD) {
1405 return MD->getMetadataID() == DICompositeTypeKind;
1406 }
1407 };
1408
1409
1410
1411
1412 class DISubroutineType : public DIType {
1413 friend class LLVMContextImpl;
1414 friend class MDNode;
1415
1416
1417
1418 uint8_t CC;
1419
1420 DISubroutineType(LLVMContext &C, StorageType Storage, DIFlags Flags,
1421 uint8_t CC, ArrayRef<Metadata *> Ops);
1422 ~DISubroutineType() = default;
1423
1424 static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1425 uint8_t CC, DITypeRefArray TypeArray,
1426 StorageType Storage,
1427 bool ShouldCreate = true) {
1428 return getImpl(Context, Flags, CC, TypeArray.get(), Storage, ShouldCreate);
1429 }
1430 static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1431 uint8_t CC, Metadata *TypeArray,
1432 StorageType Storage,
1433 bool ShouldCreate = true);
1434
1435 TempDISubroutineType cloneImpl() const {
1436 return getTemporary(getContext(), getFlags(), getCC(), getTypeArray());
1437 }
1438
1439 public:
1440 DEFINE_MDNODE_GET(DISubroutineType,
1441 (DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray),
1442 (Flags, CC, TypeArray))
1443 DEFINE_MDNODE_GET(DISubroutineType,
1444 (DIFlags Flags, uint8_t CC, Metadata *TypeArray),
1445 (Flags, CC, TypeArray))
1446
1447 TempDISubroutineType clone() const { return cloneImpl(); }
1448
1449 TempDISubroutineType cloneWithCC(uint8_t CC) const {
1450 auto NewTy = clone();
1451 NewTy->CC = CC;
1452 return NewTy;
1453 }
1454
1455 uint8_t getCC() const { return CC; }
1456
1457 DITypeRefArray getTypeArray() const {
1458 return cast_or_null<MDTuple>(getRawTypeArray());
1459 }
1460
1461 Metadata *getRawTypeArray() const { return getOperand(3); }
1462
1463 static bool classof(const Metadata *MD) {
1464 return MD->getMetadataID() == DISubroutineTypeKind;
1465 }
1466 };
1467
1468
1469 class DICompileUnit : public DIScope {
1470 friend class LLVMContextImpl;
1471 friend class MDNode;
1472
1473 public:
1474 enum DebugEmissionKind : unsigned {
1475 NoDebug = 0,
1476 FullDebug,
1477 LineTablesOnly,
1478 DebugDirectivesOnly,
1479 LastEmissionKind = DebugDirectivesOnly
1480 };
1481
1482 enum class DebugNameTableKind : unsigned {
1483 Default = 0,
1484 GNU = 1,
1485 None = 2,
1486 Apple = 3,
1487 LastDebugNameTableKind = Apple
1488 };
1489
1490 static std::optional<DebugEmissionKind> getEmissionKind(StringRef Str);
1491 static const char *emissionKindString(DebugEmissionKind EK);
1492 static std::optional<DebugNameTableKind> getNameTableKind(StringRef Str);
1493 static const char *nameTableKindString(DebugNameTableKind PK);
1494
1495 private:
1496 unsigned SourceLanguage;
1497 unsigned RuntimeVersion;
1498 uint64_t DWOId;
1499 unsigned EmissionKind;
1500 unsigned NameTableKind;
1501 bool IsOptimized;
1502 bool SplitDebugInlining;
1503 bool DebugInfoForProfiling;
1504 bool RangesBaseAddress;
1505
1506 DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage,
1507 bool IsOptimized, unsigned RuntimeVersion,
1508 unsigned EmissionKind, uint64_t DWOId, bool SplitDebugInlining,
1509 bool DebugInfoForProfiling, unsigned NameTableKind,
1510 bool RangesBaseAddress, ArrayRef<Metadata *> Ops);
1511 ~DICompileUnit() = default;
1512
1513 static DICompileUnit *
1514 getImpl(LLVMContext &Context, unsigned SourceLanguage, DIFile *File,
1515 StringRef Producer, bool IsOptimized, StringRef Flags,
1516 unsigned RuntimeVersion, StringRef SplitDebugFilename,
1517 unsigned EmissionKind, DICompositeTypeArray EnumTypes,
1518 DIScopeArray RetainedTypes,
1519 DIGlobalVariableExpressionArray GlobalVariables,
1520 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
1521 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
1522 unsigned NameTableKind, bool RangesBaseAddress, StringRef SysRoot,
1523 StringRef SDK, StorageType Storage, bool ShouldCreate = true) {
1524 return getImpl(
1525 Context, SourceLanguage, File, getCanonicalMDString(Context, Producer),
1526 IsOptimized, getCanonicalMDString(Context, Flags), RuntimeVersion,
1527 getCanonicalMDString(Context, SplitDebugFilename), EmissionKind,
1528 EnumTypes.get(), RetainedTypes.get(), GlobalVariables.get(),
1529 ImportedEntities.get(), Macros.get(), DWOId, SplitDebugInlining,
1530 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
1531 getCanonicalMDString(Context, SysRoot),
1532 getCanonicalMDString(Context, SDK), Storage, ShouldCreate);
1533 }
1534 static DICompileUnit *
1535 getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
1536 MDString *Producer, bool IsOptimized, MDString *Flags,
1537 unsigned RuntimeVersion, MDString *SplitDebugFilename,
1538 unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
1539 Metadata *GlobalVariables, Metadata *ImportedEntities,
1540 Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining,
1541 bool DebugInfoForProfiling, unsigned NameTableKind,
1542 bool RangesBaseAddress, MDString *SysRoot, MDString *SDK,
1543 StorageType Storage, bool ShouldCreate = true);
1544
1545 TempDICompileUnit cloneImpl() const {
1546 return getTemporary(
1547 getContext(), getSourceLanguage(), getFile(), getProducer(),
1548 isOptimized(), getFlags(), getRuntimeVersion(), getSplitDebugFilename(),
1549 getEmissionKind(), getEnumTypes(), getRetainedTypes(),
1550 getGlobalVariables(), getImportedEntities(), getMacros(), DWOId,
1551 getSplitDebugInlining(), getDebugInfoForProfiling(), getNameTableKind(),
1552 getRangesBaseAddress(), getSysRoot(), getSDK());
1553 }
1554
1555 public:
1556 static void get() = delete;
1557 static void getIfExists() = delete;
1558
1559 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
1560 DICompileUnit,
1561 (unsigned SourceLanguage, DIFile *File, StringRef Producer,
1562 bool IsOptimized, StringRef Flags, unsigned RuntimeVersion,
1563 StringRef SplitDebugFilename, DebugEmissionKind EmissionKind,
1564 DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
1565 DIGlobalVariableExpressionArray GlobalVariables,
1566 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
1567 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
1568 DebugNameTableKind NameTableKind, bool RangesBaseAddress,
1569 StringRef SysRoot, StringRef SDK),
1570 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
1571 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
1572 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
1573 DebugInfoForProfiling, (unsigned)NameTableKind, RangesBaseAddress,
1574 SysRoot, SDK))
1575 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
1576 DICompileUnit,
1577 (unsigned SourceLanguage, Metadata *File, MDString *Producer,
1578 bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
1579 MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes,
1580 Metadata *RetainedTypes, Metadata *GlobalVariables,
1581 Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId,
1582 bool SplitDebugInlining, bool DebugInfoForProfiling,
1583 unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot,
1584 MDString *SDK),
1585 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
1586 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
1587 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
1588 DebugInfoForProfiling, NameTableKind, RangesBaseAddress, SysRoot, SDK))
1589
1590 TempDICompileUnit clone() const { return cloneImpl(); }
1591
1592 unsigned getSourceLanguage() const { return SourceLanguage; }
1593 bool isOptimized() const { return IsOptimized; }
1594 unsigned getRuntimeVersion() const { return RuntimeVersion; }
1595 DebugEmissionKind getEmissionKind() const {
1596 return (DebugEmissionKind)EmissionKind;
1597 }
1598 bool isDebugDirectivesOnly() const {
1599 return EmissionKind == DebugDirectivesOnly;
1600 }
1601 bool getDebugInfoForProfiling() const { return DebugInfoForProfiling; }
1602 DebugNameTableKind getNameTableKind() const {
1603 return (DebugNameTableKind)NameTableKind;
1604 }
1605 bool getRangesBaseAddress() const { return RangesBaseAddress; }
1606 StringRef getProducer() const { return getStringOperand(1); }
1607 StringRef getFlags() const { return getStringOperand(2); }
1608 StringRef getSplitDebugFilename() const { return getStringOperand(3); }
1609 DICompositeTypeArray getEnumTypes() const {
1610 return cast_or_null<MDTuple>(getRawEnumTypes());
1611 }
1612 DIScopeArray getRetainedTypes() const {
1613 return cast_or_null<MDTuple>(getRawRetainedTypes());
1614 }
1615 DIGlobalVariableExpressionArray getGlobalVariables() const {
1616 return cast_or_null<MDTuple>(getRawGlobalVariables());
1617 }
1618 DIImportedEntityArray getImportedEntities() const {
1619 return cast_or_null<MDTuple>(getRawImportedEntities());
1620 }
1621 DIMacroNodeArray getMacros() const {
1622 return cast_or_null<MDTuple>(getRawMacros());
1623 }
1624 uint64_t getDWOId() const { return DWOId; }
1625 void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
1626 bool getSplitDebugInlining() const { return SplitDebugInlining; }
1627 void setSplitDebugInlining(bool SplitDebugInlining) {
1628 this->SplitDebugInlining = SplitDebugInlining;
1629 }
1630 StringRef getSysRoot() const { return getStringOperand(9); }
1631 StringRef getSDK() const { return getStringOperand(10); }
1632
1633 MDString *getRawProducer() const { return getOperandAs<MDString>(1); }
1634 MDString *getRawFlags() const { return getOperandAs<MDString>(2); }
1635 MDString *getRawSplitDebugFilename() const {
1636 return getOperandAs<MDString>(3);
1637 }
1638 Metadata *getRawEnumTypes() const { return getOperand(4); }
1639 Metadata *getRawRetainedTypes() const { return getOperand(5); }
1640 Metadata *getRawGlobalVariables() const { return getOperand(6); }
1641 Metadata *getRawImportedEntities() const { return getOperand(7); }
1642 Metadata *getRawMacros() const { return getOperand(8); }
1643 MDString *getRawSysRoot() const { return getOperandAs<MDString>(9); }
1644 MDString *getRawSDK() const { return getOperandAs<MDString>(10); }
1645
1646
1647
1648
1649
1650
1651
1652 void replaceEnumTypes(DICompositeTypeArray N) {
1653 replaceOperandWith(4, N.get());
1654 }
1655 void replaceRetainedTypes(DITypeArray N) { replaceOperandWith(5, N.get()); }
1656 void replaceGlobalVariables(DIGlobalVariableExpressionArray N) {
1657 replaceOperandWith(6, N.get());
1658 }
1659 void replaceImportedEntities(DIImportedEntityArray N) {
1660 replaceOperandWith(7, N.get());
1661 }
1662 void replaceMacros(DIMacroNodeArray N) { replaceOperandWith(8, N.get()); }
1663
1664
1665 static bool classof(const Metadata *MD) {
1666 return MD->getMetadataID() == DICompileUnitKind;
1667 }
1668 };
1669
1670
1671
1672
1673
1674
1675 class DILocalScope : public DIScope {
1676 protected:
1677 DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
1678 ArrayRef<Metadata *> Ops)
1679 : DIScope(C, ID, Storage, Tag, Ops) {}
1680 ~DILocalScope() = default;
1681
1682 public:
1683
1684
1685
1686
1687 DISubprogram *getSubprogram() const;
1688
1689
1690
1691 static DILocalScope *
1692 cloneScopeForSubprogram(DILocalScope &RootScope, DISubprogram &NewSP,
1693 LLVMContext &Ctx,
1694 DenseMap<const MDNode *, MDNode *> &Cache);
1695
1696
1697
1698
1699
1700 DILocalScope *getNonLexicalBlockFileScope() const;
1701
1702 static bool classof(const Metadata *MD) {
1703 return MD->getMetadataID() == DISubprogramKind ||
1704 MD->getMetadataID() == DILexicalBlockKind ||
1705 MD->getMetadataID() == DILexicalBlockFileKind;
1706 }
1707 };
1708
1709
1710 class DISubprogram : public DILocalScope {
1711 friend class LLVMContextImpl;
1712 friend class MDNode;
1713
1714 unsigned Line;
1715 unsigned ScopeLine;
1716 unsigned VirtualIndex;
1717
1718
1719
1720
1721 int ThisAdjustment;
1722
1723 public:
1724
1725 enum DISPFlags : uint32_t {
1726 #define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID,
1727 #define DISP_FLAG_LARGEST_NEEDED
1728 #include "llvm/IR/DebugInfoFlags.def"
1729 SPFlagNonvirtual = SPFlagZero,
1730 SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual,
1731 LLVM_MARK_AS_BITMASK_ENUM(SPFlagLargest)
1732 };
1733
1734 static DISPFlags getFlag(StringRef Flag);
1735 static StringRef getFlagString(DISPFlags Flag);
1736
1737
1738
1739
1740
1741 static DISPFlags splitFlags(DISPFlags Flags,
1742 SmallVectorImpl<DISPFlags> &SplitFlags);
1743
1744
1745 static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition,
1746 bool IsOptimized,
1747 unsigned Virtuality = SPFlagNonvirtual,
1748 bool IsMainSubprogram = false);
1749
1750 private:
1751 DIFlags Flags;
1752 DISPFlags SPFlags;
1753
1754 DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
1755 unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
1756 DIFlags Flags, DISPFlags SPFlags, ArrayRef<Metadata *> Ops);
1757 ~DISubprogram() = default;
1758
1759 static DISubprogram *
1760 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
1761 StringRef LinkageName, DIFile *File, unsigned Line,
1762 DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType,
1763 unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
1764 DISPFlags SPFlags, DICompileUnit *Unit,
1765 DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
1766 DINodeArray RetainedNodes, DITypeArray ThrownTypes,
1767 DINodeArray Annotations, StringRef TargetFuncName,
1768 StorageType Storage, bool ShouldCreate = true) {
1769 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
1770 getCanonicalMDString(Context, LinkageName), File, Line, Type,
1771 ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
1772 Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
1773 RetainedNodes.get(), ThrownTypes.get(), Annotations.get(),
1774 getCanonicalMDString(Context, TargetFuncName),
1775 Storage, ShouldCreate);
1776 }
1777 static DISubprogram *
1778 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
1779 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
1780 unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
1781 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1782 Metadata *TemplateParams, Metadata *Declaration,
1783 Metadata *RetainedNodes, Metadata *ThrownTypes, Metadata *Annotations,
1784 MDString *TargetFuncName, StorageType Storage,
1785 bool ShouldCreate = true);
1786
1787 TempDISubprogram cloneImpl() const {
1788 return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
1789 getFile(), getLine(), getType(), getScopeLine(),
1790 getContainingType(), getVirtualIndex(),
1791 getThisAdjustment(), getFlags(), getSPFlags(),
1792 getUnit(), getTemplateParams(), getDeclaration(),
1793 getRetainedNodes(), getThrownTypes(), getAnnotations(),
1794 getTargetFuncName());
1795 }
1796
1797 public:
1798 DEFINE_MDNODE_GET(
1799 DISubprogram,
1800 (DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
1801 unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
1802 DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1803 DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
1804 DITemplateParameterArray TemplateParams = nullptr,
1805 DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
1806 DITypeArray ThrownTypes = nullptr, DINodeArray Annotations = nullptr,
1807 StringRef TargetFuncName = ""),
1808 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1809 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1810 Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName))
1811
1812 DEFINE_MDNODE_GET(
1813 DISubprogram,
1814 (Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
1815 unsigned Line, Metadata *Type, unsigned ScopeLine,
1816 Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1817 DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1818 Metadata *TemplateParams = nullptr, Metadata *Declaration = nullptr,
1819 Metadata *RetainedNodes = nullptr, Metadata *ThrownTypes = nullptr,
1820 Metadata *Annotations = nullptr, MDString *TargetFuncName = nullptr),
1821 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1822 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1823 Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName))
1824
1825 TempDISubprogram clone() const { return cloneImpl(); }
1826
1827
1828 TempDISubprogram cloneWithFlags(DIFlags NewFlags) const {
1829 auto NewSP = clone();
1830 NewSP->Flags = NewFlags;
1831 return NewSP;
1832 }
1833
1834 public:
1835 unsigned getLine() const { return Line; }
1836 unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; }
1837 unsigned getVirtualIndex() const { return VirtualIndex; }
1838 int getThisAdjustment() const { return ThisAdjustment; }
1839 unsigned getScopeLine() const { return ScopeLine; }
1840 void setScopeLine(unsigned L) {
1841 assert(isDistinct());
1842 ScopeLine = L;
1843 }
1844 DIFlags getFlags() const { return Flags; }
1845 DISPFlags getSPFlags() const { return SPFlags; }
1846 bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; }
1847 bool isDefinition() const { return getSPFlags() & SPFlagDefinition; }
1848 bool isOptimized() const { return getSPFlags() & SPFlagOptimized; }
1849 bool isMainSubprogram() const { return getSPFlags() & SPFlagMainSubprogram; }
1850
1851 bool isArtificial() const { return getFlags() & FlagArtificial; }
1852 bool isPrivate() const {
1853 return (getFlags() & FlagAccessibility) == FlagPrivate;
1854 }
1855 bool isProtected() const {
1856 return (getFlags() & FlagAccessibility) == FlagProtected;
1857 }
1858 bool isPublic() const {
1859 return (getFlags() & FlagAccessibility) == FlagPublic;
1860 }
1861 bool isExplicit() const { return getFlags() & FlagExplicit; }
1862 bool isPrototyped() const { return getFlags() & FlagPrototyped; }
1863 bool areAllCallsDescribed() const {
1864 return getFlags() & FlagAllCallsDescribed;
1865 }
1866 bool isPure() const { return getSPFlags() & SPFlagPure; }
1867 bool isElemental() const { return getSPFlags() & SPFlagElemental; }
1868 bool isRecursive() const { return getSPFlags() & SPFlagRecursive; }
1869 bool isObjCDirect() const { return getSPFlags() & SPFlagObjCDirect; }
1870
1871
1872
1873
1874
1875 bool isDeleted() const { return getSPFlags() & SPFlagDeleted; }
1876
1877
1878
1879
1880
1881 bool isLValueReference() const { return getFlags() & FlagLValueReference; }
1882
1883
1884
1885
1886
1887 bool isRValueReference() const { return getFlags() & FlagRValueReference; }
1888
1889
1890
1891
1892 bool isNoReturn() const { return getFlags() & FlagNoReturn; }
1893
1894
1895
1896
1897 bool isThunk() const { return getFlags() & FlagThunk; }
1898
1899 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
1900
1901 StringRef getName() const { return getStringOperand(2); }
1902 StringRef getLinkageName() const { return getStringOperand(3); }
1903
1904 void replaceLinkageName(MDString *LN) { replaceOperandWith(3, LN); }
1905
1906 DISubroutineType *getType() const {
1907 return cast_or_null<DISubroutineType>(getRawType());
1908 }
1909 DIType *getContainingType() const {
1910 return cast_or_null<DIType>(getRawContainingType());
1911 }
1912 void replaceType(DISubroutineType *Ty) {
1913 assert(isDistinct() && "Only distinct nodes can mutate");
1914 replaceOperandWith(4, Ty);
1915 }
1916
1917 DICompileUnit *getUnit() const {
1918 return cast_or_null<DICompileUnit>(getRawUnit());
1919 }
1920 void replaceUnit(DICompileUnit *CU) { replaceOperandWith(5, CU); }
1921 DITemplateParameterArray getTemplateParams() const {
1922 return cast_or_null<MDTuple>(getRawTemplateParams());
1923 }
1924 DISubprogram *getDeclaration() const {
1925 return cast_or_null<DISubprogram>(getRawDeclaration());
1926 }
1927 void replaceDeclaration(DISubprogram *Decl) { replaceOperandWith(6, Decl); }
1928 DINodeArray getRetainedNodes() const {
1929 return cast_or_null<MDTuple>(getRawRetainedNodes());
1930 }
1931 DITypeArray getThrownTypes() const {
1932 return cast_or_null<MDTuple>(getRawThrownTypes());
1933 }
1934 DINodeArray getAnnotations() const {
1935 return cast_or_null<MDTuple>(getRawAnnotations());
1936 }
1937 StringRef getTargetFuncName() const {
1938 return (getRawTargetFuncName()) ? getStringOperand(12) : StringRef();
1939 }
1940
1941 Metadata *getRawScope() const { return getOperand(1); }
1942 MDString *getRawName() const { return getOperandAs<MDString>(2); }
1943 MDString *getRawLinkageName() const { return getOperandAs<MDString>(3); }
1944 Metadata *getRawType() const { return getOperand(4); }
1945 Metadata *getRawUnit() const { return getOperand(5); }
1946 Metadata *getRawDeclaration() const { return getOperand(6); }
1947 Metadata *getRawRetainedNodes() const { return getOperand(7); }
1948 Metadata *getRawContainingType() const {
1949 return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr;
1950 }
1951 Metadata *getRawTemplateParams() const {
1952 return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr;
1953 }
1954 Metadata *getRawThrownTypes() const {
1955 return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr;
1956 }
1957 Metadata *getRawAnnotations() const {
1958 return getNumOperands() > 11 ? getOperandAs<Metadata>(11) : nullptr;
1959 }
1960 MDString *getRawTargetFuncName() const {
1961 return getNumOperands() > 12 ? getOperandAs<MDString>(12) : nullptr;
1962 }
1963
1964 void replaceRawLinkageName(MDString *LinkageName) {
1965 replaceOperandWith(3, LinkageName);
1966 }
1967 void replaceRetainedNodes(DINodeArray N) {
1968 replaceOperandWith(7, N.get());
1969 }
1970
1971
1972
1973
1974 bool describes(const Function *F) const;
1975
1976 static bool classof(const Metadata *MD) {
1977 return MD->getMetadataID() == DISubprogramKind;
1978 }
1979 };
1980
1981
1982
1983
1984
1985
1986
1987
1988 class DILocation : public MDNode {
1989 friend class LLVMContextImpl;
1990 friend class MDNode;
1991
1992 DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
1993 unsigned Column, ArrayRef<Metadata *> MDs, bool ImplicitCode);
1994 ~DILocation() { dropAllReferences(); }
1995
1996 static DILocation *getImpl(LLVMContext &Context, unsigned Line,
1997 unsigned Column, Metadata *Scope,
1998 Metadata *InlinedAt, bool ImplicitCode,
1999 StorageType Storage, bool ShouldCreate = true);
2000 static DILocation *getImpl(LLVMContext &Context, unsigned Line,
2001 unsigned Column, DILocalScope *Scope,
2002 DILocation *InlinedAt, bool ImplicitCode,
2003 StorageType Storage, bool ShouldCreate = true) {
2004 return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope),
2005 static_cast<Metadata *>(InlinedAt), ImplicitCode, Storage,
2006 ShouldCreate);
2007 }
2008
2009 TempDILocation cloneImpl() const {
2010
2011
2012 return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
2013 getRawInlinedAt(), isImplicitCode());
2014 }
2015
2016 public:
2017
2018 void replaceOperandWith(unsigned I, Metadata *New) = delete;
2019
2020 DEFINE_MDNODE_GET(DILocation,
2021 (unsigned Line, unsigned Column, Metadata *Scope,
2022 Metadata *InlinedAt = nullptr, bool ImplicitCode = false),
2023 (Line, Column, Scope, InlinedAt, ImplicitCode))
2024 DEFINE_MDNODE_GET(DILocation,
2025 (unsigned Line, unsigned Column, DILocalScope *Scope,
2026 DILocation *InlinedAt = nullptr,
2027 bool ImplicitCode = false),
2028 (Line, Column, Scope, InlinedAt, ImplicitCode))
2029
2030
2031 TempDILocation clone() const { return cloneImpl(); }
2032
2033 unsigned getLine() const { return SubclassData32; }
2034 unsigned getColumn() const { return SubclassData16; }
2035 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }
2036
2037
2038
2039 StringRef getSubprogramLinkageName() const {
2040 DISubprogram *SP = getScope()->getSubprogram();
2041 if (!SP)
2042 return "";
2043 auto Name = SP->getLinkageName();
2044 if (!Name.empty())
2045 return Name;
2046 return SP->getName();
2047 }
2048
2049 DILocation *getInlinedAt() const {
2050 return cast_or_null<DILocation>(getRawInlinedAt());
2051 }
2052
2053
2054
2055
2056
2057
2058
2059 bool isImplicitCode() const { return SubclassData1; }
2060 void setImplicitCode(bool ImplicitCode) { SubclassData1 = ImplicitCode; }
2061
2062 DIFile *getFile() const { return getScope()->getFile(); }
2063 StringRef getFilename() const { return getScope()->getFilename(); }
2064 StringRef getDirectory() const { return getScope()->getDirectory(); }
2065 std::optional<StringRef> getSource() const { return getScope()->getSource(); }
2066
2067
2068
2069
2070
2071 DILocalScope *getInlinedAtScope() const {
2072 if (auto *IA = getInlinedAt())
2073 return IA->getInlinedAtScope();
2074 return getScope();
2075 }
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111 inline unsigned getDiscriminator() const;
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121 inline static bool isPseudoProbeDiscriminator(unsigned Discriminator) {
2122 return ((Discriminator & 0x7) == 0x7) && (Discriminator & 0xFFFFFFF8);
2123 }
2124
2125
2126 inline const DILocation *cloneWithDiscriminator(unsigned Discriminator) const;
2127
2128
2129
2130
2131
2132 inline std::optional<const DILocation *>
2133 cloneWithBaseDiscriminator(unsigned BD) const;
2134
2135
2136
2137 inline unsigned getDuplicationFactor() const;
2138
2139
2140 inline unsigned getCopyIdentifier() const;
2141
2142
2143 inline unsigned getBaseDiscriminator() const;
2144
2145
2146
2147
2148
2149 inline std::optional<const DILocation *>
2150 cloneByMultiplyingDuplicationFactor(unsigned DF) const;
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166 static DILocation *getMergedLocation(DILocation *LocA, DILocation *LocB);
2167
2168
2169
2170
2171
2172 static DILocation *getMergedLocations(ArrayRef<DILocation *> Locs);
2173
2174
2175
2176
2177 static unsigned getMaskedDiscriminator(unsigned D, unsigned B) {
2178 return (D & getN1Bits(B));
2179 }
2180
2181
2182 static unsigned getBaseDiscriminatorBits() { return getBaseFSBitEnd(); }
2183
2184
2185 static unsigned
2186 getBaseDiscriminatorFromDiscriminator(unsigned D,
2187 bool IsFSDiscriminator = false) {
2188
2189
2190 if (isPseudoProbeDiscriminator(D)) {
2191 auto DwarfBaseDiscriminator =
2192 PseudoProbeDwarfDiscriminator::extractDwarfBaseDiscriminator(D);
2193 if (DwarfBaseDiscriminator)
2194 return *DwarfBaseDiscriminator;
2195
2196
2197
2198
2199
2200 return PseudoProbeDwarfDiscriminator::extractProbeIndex(D);
2201 }
2202
2203 if (IsFSDiscriminator)
2204 return getMaskedDiscriminator(D, getBaseDiscriminatorBits());
2205 return getUnsignedFromPrefixEncoding(D);
2206 }
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221 static std::optional<unsigned> encodeDiscriminator(unsigned BD, unsigned DF,
2222 unsigned CI);
2223
2224
2225 static void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF,
2226 unsigned &CI);
2227
2228
2229
2230 static unsigned getDuplicationFactorFromDiscriminator(unsigned D) {
2231 if (EnableFSDiscriminator)
2232 return 1;
2233 D = getNextComponentInDiscriminator(D);
2234 unsigned Ret = getUnsignedFromPrefixEncoding(D);
2235 if (Ret == 0)
2236 return 1;
2237 return Ret;
2238 }
2239
2240
2241 static unsigned getCopyIdentifierFromDiscriminator(unsigned D) {
2242 return getUnsignedFromPrefixEncoding(
2243 getNextComponentInDiscriminator(getNextComponentInDiscriminator(D)));
2244 }
2245
2246 Metadata *getRawScope() const { return getOperand(0); }
2247 Metadata *getRawInlinedAt() const {
2248 if (getNumOperands() == 2)
2249 return getOperand(1);
2250 return nullptr;
2251 }
2252
2253 static bool classof(const Metadata *MD) {
2254 return MD->getMetadataID() == DILocationKind;
2255 }
2256 };
2257
2258 class DILexicalBlockBase : public DILocalScope {
2259 protected:
2260 DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage,
2261 ArrayRef<Metadata *> Ops);
2262 ~DILexicalBlockBase() = default;
2263
2264 public:
2265 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }
2266
2267 Metadata *getRawScope() const { return getOperand(1); }
2268
2269 void replaceScope(DIScope *Scope) {
2270 assert(!isUniqued());
2271 setOperand(1, Scope);
2272 }
2273
2274 static bool classof(const Metadata *MD) {
2275 return MD->getMetadataID() == DILexicalBlockKind ||
2276 MD->getMetadataID() == DILexicalBlockFileKind;
2277 }
2278 };
2279
2280
2281
2282
2283 class DILexicalBlock : public DILexicalBlockBase {
2284 friend class LLVMContextImpl;
2285 friend class MDNode;
2286
2287 uint16_t Column;
2288
2289 DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line,
2290 unsigned Column, ArrayRef<Metadata *> Ops)
2291 : DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops),
2292 Column(Column) {
2293 SubclassData32 = Line;
2294 assert(Column < (1u << 16) && "Expected 16-bit column");
2295 }
2296 ~DILexicalBlock() = default;
2297
2298 static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope,
2299 DIFile *File, unsigned Line, unsigned Column,
2300 StorageType Storage,
2301 bool ShouldCreate = true) {
2302 return getImpl(Context, static_cast<Metadata *>(Scope),
2303 static_cast<Metadata *>(File), Line, Column, Storage,
2304 ShouldCreate);
2305 }
2306
2307 static DILexicalBlock *getImpl(LLVMContext &Context, Metadata *Scope,
2308 Metadata *File, unsigned Line, unsigned Column,
2309 StorageType Storage, bool ShouldCreate = true);
2310
2311 TempDILexicalBlock cloneImpl() const {
2312 return getTemporary(getContext(), getScope(), getFile(), getLine(),
2313 getColumn());
2314 }
2315
2316 public:
2317 DEFINE_MDNODE_GET(DILexicalBlock,
2318 (DILocalScope * Scope, DIFile *File, unsigned Line,
2319 unsigned Column),
2320 (Scope, File, Line, Column))
2321 DEFINE_MDNODE_GET(DILexicalBlock,
2322 (Metadata * Scope, Metadata *File, unsigned Line,
2323 unsigned Column),
2324 (Scope, File, Line, Column))
2325
2326 TempDILexicalBlock clone() const { return cloneImpl(); }
2327
2328 unsigned getLine() const { return SubclassData32; }
2329 unsigned getColumn() const { return Column; }
2330
2331 static bool classof(const Metadata *MD) {
2332 return MD->getMetadataID() == DILexicalBlockKind;
2333 }
2334 };
2335
2336 class DILexicalBlockFile : public DILexicalBlockBase {
2337 friend class LLVMContextImpl;
2338 friend class MDNode;
2339
2340 DILexicalBlockFile(LLVMContext &C, StorageType Storage,
2341 unsigned Discriminator, ArrayRef<Metadata *> Ops)
2342 : DILexicalBlockBase(C, DILexicalBlockFileKind, Storage, Ops) {
2343 SubclassData32 = Discriminator;
2344 }
2345 ~DILexicalBlockFile() = default;
2346
2347 static DILexicalBlockFile *getImpl(LLVMContext &Context, DILocalScope *Scope,
2348 DIFile *File, unsigned Discriminator,
2349 StorageType Storage,
2350 bool ShouldCreate = true) {
2351 return getImpl(Context, static_cast<Metadata *>(Scope),
2352 static_cast<Metadata *>(File), Discriminator, Storage,
2353 ShouldCreate);
2354 }
2355
2356 static DILexicalBlockFile *getImpl(LLVMContext &Context, Metadata *Scope,
2357 Metadata *File, unsigned Discriminator,
2358 StorageType Storage,
2359 bool ShouldCreate = true);
2360
2361 TempDILexicalBlockFile cloneImpl() const {
2362 return getTemporary(getContext(), getScope(), getFile(),
2363 getDiscriminator());
2364 }
2365
2366 public:
2367 DEFINE_MDNODE_GET(DILexicalBlockFile,
2368 (DILocalScope * Scope, DIFile *File,
2369 unsigned Discriminator),
2370 (Scope, File, Discriminator))
2371 DEFINE_MDNODE_GET(DILexicalBlockFile,
2372 (Metadata * Scope, Metadata *File, unsigned Discriminator),
2373 (Scope, File, Discriminator))
2374
2375 TempDILexicalBlockFile clone() const { return cloneImpl(); }
2376 unsigned getDiscriminator() const { return SubclassData32; }
2377
2378 static bool classof(const Metadata *MD) {
2379 return MD->getMetadataID() == DILexicalBlockFileKind;
2380 }
2381 };
2382
2383 unsigned DILocation::getDiscriminator() const {
2384 if (auto *F = dyn_cast<DILexicalBlockFile>(getScope()))
2385 return F->getDiscriminator();
2386 return 0;
2387 }
2388
2389 const DILocation *
2390 DILocation::cloneWithDiscriminator(unsigned Discriminator) const {
2391 DIScope *Scope = getScope();
2392
2393
2394
2395
2396 for (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope);
2397 LBF && LBF->getDiscriminator() != 0;
2398 LBF = dyn_cast<DILexicalBlockFile>(Scope))
2399 Scope = LBF->getScope();
2400 DILexicalBlockFile *NewScope =
2401 DILexicalBlockFile::get(getContext(), Scope, getFile(), Discriminator);
2402 return DILocation::get(getContext(), getLine(), getColumn(), NewScope,
2403 getInlinedAt());
2404 }
2405
2406 unsigned DILocation::getBaseDiscriminator() const {
2407 return getBaseDiscriminatorFromDiscriminator(getDiscriminator(),
2408 EnableFSDiscriminator);
2409 }
2410
2411 unsigned DILocation::getDuplicationFactor() const {
2412 return getDuplicationFactorFromDiscriminator(getDiscriminator());
2413 }
2414
2415 unsigned DILocation::getCopyIdentifier() const {
2416 return getCopyIdentifierFromDiscriminator(getDiscriminator());
2417 }
2418
2419 std::optional<const DILocation *>
2420 DILocation::cloneWithBaseDiscriminator(unsigned D) const {
2421 unsigned BD, DF, CI;
2422
2423 if (EnableFSDiscriminator) {
2424 BD = getBaseDiscriminator();
2425 if (D == BD)
2426 return this;
2427 return cloneWithDiscriminator(D);
2428 }
2429
2430 decodeDiscriminator(getDiscriminator(), BD, DF, CI);
2431 if (D == BD)
2432 return this;
2433 if (std::optional<unsigned> Encoded = encodeDiscriminator(D, DF, CI))
2434 return cloneWithDiscriminator(*Encoded);
2435 return std::nullopt;
2436 }
2437
2438 std::optional<const DILocation *>
2439 DILocation::cloneByMultiplyingDuplicationFactor(unsigned DF) const {
2440 assert(!EnableFSDiscriminator && "FSDiscriminator should not call this.");
2441
2442
2443
2444
2445 if (isPseudoProbeDiscriminator(getDiscriminator()))
2446 return this;
2447
2448 DF *= getDuplicationFactor();
2449 if (DF <= 1)
2450 return this;
2451
2452 unsigned BD = getBaseDiscriminator();
2453 unsigned CI = getCopyIdentifier();
2454 if (std::optional<unsigned> D = encodeDiscriminator(BD, DF, CI))
2455 return cloneWithDiscriminator(*D);
2456 return std::nullopt;
2457 }
2458
2459
2460
2461
2462 class DINamespace : public DIScope {
2463 friend class LLVMContextImpl;
2464 friend class MDNode;
2465
2466 DINamespace(LLVMContext &Context, StorageType Storage, bool ExportSymbols,
2467 ArrayRef<Metadata *> Ops);
2468 ~DINamespace() = default;
2469
2470 static DINamespace *getImpl(LLVMContext &Context, DIScope *Scope,
2471 StringRef Name, bool ExportSymbols,
2472 StorageType Storage, bool ShouldCreate = true) {
2473 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
2474 ExportSymbols, Storage, ShouldCreate);
2475 }
2476 static DINamespace *getImpl(LLVMContext &Context, Metadata *Scope,
2477 MDString *Name, bool ExportSymbols,
2478 StorageType Storage, bool ShouldCreate = true);
2479
2480 TempDINamespace cloneImpl() const {
2481 return getTemporary(getContext(), getScope(), getName(),
2482 getExportSymbols());
2483 }
2484
2485 public:
2486 DEFINE_MDNODE_GET(DINamespace,
2487 (DIScope * Scope, StringRef Name, bool ExportSymbols),
2488 (Scope, Name, ExportSymbols))
2489 DEFINE_MDNODE_GET(DINamespace,
2490 (Metadata * Scope, MDString *Name, bool ExportSymbols),
2491 (Scope, Name, ExportSymbols))
2492
2493 TempDINamespace clone() const { return cloneImpl(); }
2494
2495 bool getExportSymbols() const { return SubclassData1; }
2496 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
2497 StringRef getName() const { return getStringOperand(2); }
2498
2499 Metadata *getRawScope() const { return getOperand(1); }
2500 MDString *getRawName() const { return getOperandAs<MDString>(2); }
2501
2502 static bool classof(const Metadata *MD) {
2503 return MD->getMetadataID() == DINamespaceKind;
2504 }
2505 };
2506
2507
2508
2509
2510
2511 class DIModule : public DIScope {
2512 friend class LLVMContextImpl;
2513 friend class MDNode;
2514
2515 DIModule(LLVMContext &Context, StorageType Storage, unsigned LineNo,
2516 bool IsDecl, ArrayRef<Metadata *> Ops);
2517 ~DIModule() = default;
2518
2519 static DIModule *getImpl(LLVMContext &Context, DIFile *File, DIScope *Scope,
2520 StringRef Name, StringRef ConfigurationMacros,
2521 StringRef IncludePath, StringRef APINotesFile,
2522 unsigned LineNo, bool IsDecl, StorageType Storage,
2523 bool ShouldCreate = true) {
2524 return getImpl(Context, File, Scope, getCanonicalMDString(Context, Name),
2525 getCanonicalMDString(Context, ConfigurationMacros),
2526 getCanonicalMDString(Context, IncludePath),
2527 getCanonicalMDString(Context, APINotesFile), LineNo, IsDecl,
2528 Storage, ShouldCreate);
2529 }
2530 static DIModule *getImpl(LLVMContext &Context, Metadata *File,
2531 Metadata *Scope, MDString *Name,
2532 MDString *ConfigurationMacros, MDString *IncludePath,
2533 MDString *APINotesFile, unsigned LineNo, bool IsDecl,
2534 StorageType Storage, bool ShouldCreate = true);
2535
2536 TempDIModule cloneImpl() const {
2537 return getTemporary(getContext(), getFile(), getScope(), getName(),
2538 getConfigurationMacros(), getIncludePath(),
2539 getAPINotesFile(), getLineNo(), getIsDecl());
2540 }
2541
2542 public:
2543 DEFINE_MDNODE_GET(DIModule,
2544 (DIFile * File, DIScope *Scope, StringRef Name,
2545 StringRef ConfigurationMacros, StringRef IncludePath,
2546 StringRef APINotesFile, unsigned LineNo,
2547 bool IsDecl = false),
2548 (File, Scope, Name, ConfigurationMacros, IncludePath,
2549 APINotesFile, LineNo, IsDecl))
2550 DEFINE_MDNODE_GET(DIModule,
2551 (Metadata * File, Metadata *Scope, MDString *Name,
2552 MDString *ConfigurationMacros, MDString *IncludePath,
2553 MDString *APINotesFile, unsigned LineNo,
2554 bool IsDecl = false),
2555 (File, Scope, Name, ConfigurationMacros, IncludePath,
2556 APINotesFile, LineNo, IsDecl))
2557
2558 TempDIModule clone() const { return cloneImpl(); }
2559
2560 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
2561 StringRef getName() const { return getStringOperand(2); }
2562 StringRef getConfigurationMacros() const { return getStringOperand(3); }
2563 StringRef getIncludePath() const { return getStringOperand(4); }
2564 StringRef getAPINotesFile() const { return getStringOperand(5); }
2565 unsigned getLineNo() const { return SubclassData32; }
2566 bool getIsDecl() const { return SubclassData1; }
2567
2568 Metadata *getRawScope() const { return getOperand(1); }
2569 MDString *getRawName() const { return getOperandAs<MDString>(2); }
2570 MDString *getRawConfigurationMacros() const {
2571 return getOperandAs<MDString>(3);
2572 }
2573 MDString *getRawIncludePath() const { return getOperandAs<MDString>(4); }
2574 MDString *getRawAPINotesFile() const { return getOperandAs<MDString>(5); }
2575
2576 static bool classof(const Metadata *MD) {
2577 return MD->getMetadataID() == DIModuleKind;
2578 }
2579 };
2580
2581
2582
2583
2584 class DITemplateParameter : public DINode {
2585 protected:
2586 DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage,
2587 unsigned Tag, bool IsDefault, ArrayRef<Metadata *> Ops)
2588 : DINode(Context, ID, Storage, Tag, Ops) {
2589 SubclassData1 = IsDefault;
2590 }
2591 ~DITemplateParameter() = default;
2592
2593 public:
2594 StringRef getName() const { return getStringOperand(0); }
2595 DIType *getType() const { return cast_or_null<DIType>(getRawType()); }
2596
2597 MDString *getRawName() const { return getOperandAs<MDString>(0); }
2598 Metadata *getRawType() const { return getOperand(1); }
2599 bool isDefault() const { return SubclassData1; }
2600
2601 static bool classof(const Metadata *MD) {
2602 return MD->getMetadataID() == DITemplateTypeParameterKind ||
2603 MD->getMetadataID() == DITemplateValueParameterKind;
2604 }
2605 };
2606
2607 class DITemplateTypeParameter : public DITemplateParameter {
2608 friend class LLVMContextImpl;
2609 friend class MDNode;
2610
2611 DITemplateTypeParameter(LLVMContext &Context, StorageType Storage,
2612 bool IsDefault, ArrayRef<Metadata *> Ops);
2613 ~DITemplateTypeParameter() = default;
2614
2615 static DITemplateTypeParameter *getImpl(LLVMContext &Context, StringRef Name,
2616 DIType *Type, bool IsDefault,
2617 StorageType Storage,
2618 bool ShouldCreate = true) {
2619 return getImpl(Context, getCanonicalMDString(Context, Name), Type,
2620 IsDefault, Storage, ShouldCreate);
2621 }
2622 static DITemplateTypeParameter *getImpl(LLVMContext &Context, MDString *Name,
2623 Metadata *Type, bool IsDefault,
2624 StorageType Storage,
2625 bool ShouldCreate = true);
2626
2627 TempDITemplateTypeParameter cloneImpl() const {
2628 return getTemporary(getContext(), getName(), getType(), isDefault());
2629 }
2630
2631 public:
2632 DEFINE_MDNODE_GET(DITemplateTypeParameter,
2633 (StringRef Name, DIType *Type, bool IsDefault),
2634 (Name, Type, IsDefault))
2635 DEFINE_MDNODE_GET(DITemplateTypeParameter,
2636 (MDString * Name, Metadata *Type, bool IsDefault),
2637 (Name, Type, IsDefault))
2638
2639 TempDITemplateTypeParameter clone() const { return cloneImpl(); }
2640
2641 static bool classof(const Metadata *MD) {
2642 return MD->getMetadataID() == DITemplateTypeParameterKind;
2643 }
2644 };
2645
2646 class DITemplateValueParameter : public DITemplateParameter {
2647 friend class LLVMContextImpl;
2648 friend class MDNode;
2649
2650 DITemplateValueParameter(LLVMContext &Context, StorageType Storage,
2651 unsigned Tag, bool IsDefault,
2652 ArrayRef<Metadata *> Ops)
2653 : DITemplateParameter(Context, DITemplateValueParameterKind, Storage, Tag,
2654 IsDefault, Ops) {}
2655 ~DITemplateValueParameter() = default;
2656
2657 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag,
2658 StringRef Name, DIType *Type,
2659 bool IsDefault, Metadata *Value,
2660 StorageType Storage,
2661 bool ShouldCreate = true) {
2662 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), Type,
2663 IsDefault, Value, Storage, ShouldCreate);
2664 }
2665 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag,
2666 MDString *Name, Metadata *Type,
2667 bool IsDefault, Metadata *Value,
2668 StorageType Storage,
2669 bool ShouldCreate = true);
2670
2671 TempDITemplateValueParameter cloneImpl() const {
2672 return getTemporary(getContext(), getTag(), getName(), getType(),
2673 isDefault(), getValue());
2674 }
2675
2676 public:
2677 DEFINE_MDNODE_GET(DITemplateValueParameter,
2678 (unsigned Tag, StringRef Name, DIType *Type, bool IsDefault,
2679 Metadata *Value),
2680 (Tag, Name, Type, IsDefault, Value))
2681 DEFINE_MDNODE_GET(DITemplateValueParameter,
2682 (unsigned Tag, MDString *Name, Metadata *Type,
2683 bool IsDefault, Metadata *Value),
2684 (Tag, Name, Type, IsDefault, Value))
2685
2686 TempDITemplateValueParameter clone() const { return cloneImpl(); }
2687
2688 Metadata *getValue() const { return getOperand(2); }
2689
2690 static bool classof(const Metadata *MD) {
2691 return MD->getMetadataID() == DITemplateValueParameterKind;
2692 }
2693 };
2694
2695
2696
2697
2698 class DIVariable : public DINode {
2699 unsigned Line;
2700
2701 protected:
2702 DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, signed Line,
2703 ArrayRef<Metadata *> Ops, uint32_t AlignInBits = 0);
2704 ~DIVariable() = default;
2705
2706 public:
2707 unsigned getLine() const { return Line; }
2708 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
2709 StringRef getName() const { return getStringOperand(1); }
2710 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
2711 DIType *getType() const { return cast_or_null<DIType>(getRawType()); }
2712 uint32_t getAlignInBits() const { return SubclassData32; }
2713 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
2714
2715 std::optional<uint64_t> getSizeInBits() const;
2716
2717
2718
2719 std::optional<DIBasicType::Signedness> getSignedness() const {
2720 if (auto *BT = dyn_cast<DIBasicType>(getType()))
2721 return BT->getSignedness();
2722 return std::nullopt;
2723 }
2724
2725 StringRef getFilename() const {
2726 if (auto *F = getFile())
2727 return F->getFilename();
2728 return "";
2729 }
2730
2731 StringRef getDirectory() const {
2732 if (auto *F = getFile())
2733 return F->getDirectory();
2734 return "";
2735 }
2736
2737 std::optional<StringRef> getSource() const {
2738 if (auto *F = getFile())
2739 return F->getSource();
2740 return std::nullopt;
2741 }
2742
2743 Metadata *getRawScope() const { return getOperand(0); }
2744 MDString *getRawName() const { return getOperandAs<MDString>(1); }
2745 Metadata *getRawFile() const { return getOperand(2); }
2746 Metadata *getRawType() const { return getOperand(3); }
2747
2748 static bool classof(const Metadata *MD) {
2749 return MD->getMetadataID() == DILocalVariableKind ||
2750 MD->getMetadataID() == DIGlobalVariableKind;
2751 }
2752 };
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763 class DIExpression : public MDNode {
2764 friend class LLVMContextImpl;
2765 friend class MDNode;
2766
2767 std::vector<uint64_t> Elements;
2768
2769 DIExpression(LLVMContext &C, StorageType Storage, ArrayRef<uint64_t> Elements)
2770 : MDNode(C, DIExpressionKind, Storage, {}),
2771 Elements(Elements.begin(), Elements.end()) {}
2772 ~DIExpression() = default;
2773
2774 static DIExpression *getImpl(LLVMContext &Context,
2775 ArrayRef<uint64_t> Elements, StorageType Storage,
2776 bool ShouldCreate = true);
2777
2778 TempDIExpression cloneImpl() const {
2779 return getTemporary(getContext(), getElements());
2780 }
2781
2782 public:
2783 DEFINE_MDNODE_GET(DIExpression, (ArrayRef<uint64_t> Elements), (Elements))
2784
2785 TempDIExpression clone() const { return cloneImpl(); }
2786
2787 ArrayRef<uint64_t> getElements() const { return Elements; }
2788
2789 unsigned getNumElements() const { return Elements.size(); }
2790
2791 uint64_t getElement(unsigned I) const {
2792 assert(I < Elements.size() && "Index out of range");
2793 return Elements[I];
2794 }
2795
2796 enum SignedOrUnsignedConstant { SignedConstant, UnsignedConstant };
2797
2798
2799 std::optional<SignedOrUnsignedConstant> isConstant() const;
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809 uint64_t getNumLocationOperands() const;
2810
2811 using element_iterator = ArrayRef<uint64_t>::iterator;
2812
2813 element_iterator elements_begin() const { return getElements().begin(); }
2814 element_iterator elements_end() const { return getElements().end(); }
2815
2816
2817
2818
2819
2820 class ExprOperand {
2821 const uint64_t *Op = nullptr;
2822
2823 public:
2824 ExprOperand() = default;
2825 explicit ExprOperand(const uint64_t *Op) : Op(Op) {}
2826
2827 const uint64_t *get() const { return Op; }
2828
2829
2830 uint64_t getOp() const { return *Op; }
2831
2832
2833
2834
2835 uint64_t getArg(unsigned I) const { return Op[I + 1]; }
2836
2837 unsigned getNumArgs() const { return getSize() - 1; }
2838
2839
2840
2841
2842 unsigned getSize() const;
2843
2844
2845 void appendToVector(SmallVectorImpl<uint64_t> &V) const {
2846 V.append(get(), get() + getSize());
2847 }
2848 };
2849
2850
2851 class expr_op_iterator {
2852 ExprOperand Op;
2853
2854 public:
2855 using iterator_category = std::input_iterator_tag;
2856 using value_type = ExprOperand;
2857 using difference_type = std::ptrdiff_t;
2858 using pointer = value_type *;
2859 using reference = value_type &;
2860
2861 expr_op_iterator() = default;
2862 explicit expr_op_iterator(element_iterator I) : Op(I) {}
2863
2864 element_iterator getBase() const { return Op.get(); }
2865 const ExprOperand &operator*() const { return Op; }
2866 const ExprOperand *operator->() const { return &Op; }
2867
2868 expr_op_iterator &operator++() {
2869 increment();
2870 return *this;
2871 }
2872 expr_op_iterator operator++(int) {
2873 expr_op_iterator T(*this);
2874 increment();
2875 return T;
2876 }
2877
2878
2879
2880
2881
2882
2883 expr_op_iterator getNext() const { return ++expr_op_iterator(*this); }
2884
2885 bool operator==(const expr_op_iterator &X) const {
2886 return getBase() == X.getBase();
2887 }
2888 bool operator!=(const expr_op_iterator &X) const {
2889 return getBase() != X.getBase();
2890 }
2891
2892 private:
2893 void increment() { Op = ExprOperand(getBase() + Op.getSize()); }
2894 };
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904 expr_op_iterator expr_op_begin() const {
2905 return expr_op_iterator(elements_begin());
2906 }
2907 expr_op_iterator expr_op_end() const {
2908 return expr_op_iterator(elements_end());
2909 }
2910 iterator_range<expr_op_iterator> expr_ops() const {
2911 return {expr_op_begin(), expr_op_end()};
2912 }
2913
2914
2915 bool isValid() const;
2916
2917 static bool classof(const Metadata *MD) {
2918 return MD->getMetadataID() == DIExpressionKind;
2919 }
2920
2921
2922 bool startsWithDeref() const;
2923
2924
2925 bool isDeref() const;
2926
2927 using FragmentInfo = DbgVariableFragmentInfo;
2928
2929
2930
2931
2932
2933 std::optional<uint64_t> getActiveBits(DIVariable *Var);
2934
2935
2936 static std::optional<FragmentInfo> getFragmentInfo(expr_op_iterator Start,
2937 expr_op_iterator End);
2938
2939
2940 std::optional<FragmentInfo> getFragmentInfo() const {
2941 return getFragmentInfo(expr_op_begin(), expr_op_end());
2942 }
2943
2944
2945 bool isFragment() const { return getFragmentInfo().has_value(); }
2946
2947
2948 bool isImplicit() const;
2949
2950
2951
2952 bool isComplex() const;
2953
2954
2955
2956
2957 bool isSingleLocationExpression() const;
2958
2959
2960
2961
2962
2963
2964 std::optional<ArrayRef<uint64_t>> getSingleLocationExpressionElements() const;
2965
2966
2967
2968
2969
2970
2971
2972 static const DIExpression *convertToUndefExpression(const DIExpression *Expr);
2973
2974
2975
2976
2977 static const DIExpression *
2978 convertToVariadicExpression(const DIExpression *Expr);
2979
2980
2981
2982
2983
2984
2985
2986
2987 static std::optional<const DIExpression *>
2988 convertToNonVariadicExpression(const DIExpression *Expr);
2989
2990
2991
2992
2993
2994
2995 static void canonicalizeExpressionOps(SmallVectorImpl<uint64_t> &Ops,
2996 const DIExpression *Expr,
2997 bool IsIndirect);
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010 static bool isEqualExpression(const DIExpression *FirstExpr,
3011 bool FirstIndirect,
3012 const DIExpression *SecondExpr,
3013 bool SecondIndirect);
3014
3015
3016 static void appendOffset(SmallVectorImpl<uint64_t> &Ops, int64_t Offset);
3017
3018
3019
3020 bool extractIfOffset(int64_t &Offset) const;
3021
3022
3023
3024
3025
3026
3027
3028
3029 bool extractLeadingOffset(int64_t &OffsetInBytes,
3030 SmallVectorImpl<uint64_t> &RemainingOps) const;
3031
3032
3033
3034 bool hasAllLocationOps(unsigned N) const;
3035
3036
3037
3038
3039 static const DIExpression *extractAddressClass(const DIExpression *Expr,
3040 unsigned &AddrClass);
3041
3042
3043 enum PrependOps : uint8_t {
3044 ApplyOffset = 0,
3045 DerefBefore = 1 << 0,
3046 DerefAfter = 1 << 1,
3047 StackValue = 1 << 2,
3048 EntryValue = 1 << 3
3049 };
3050
3051
3052
3053 static DIExpression *prepend(const DIExpression *Expr, uint8_t Flags,
3054 int64_t Offset = 0);
3055
3056
3057
3058 static DIExpression *prependOpcodes(const DIExpression *Expr,
3059 SmallVectorImpl<uint64_t> &Ops,
3060 bool StackValue = false,
3061 bool EntryValue = false);
3062
3063
3064
3065
3066
3067 static DIExpression *append(const DIExpression *Expr, ArrayRef<uint64_t> Ops);
3068
3069
3070
3071
3072
3073 static DIExpression *appendToStack(const DIExpression *Expr,
3074 ArrayRef<uint64_t> Ops);
3075
3076
3077
3078
3079
3080 static DIExpression *appendOpsToArg(const DIExpression *Expr,
3081 ArrayRef<uint64_t> Ops, unsigned ArgNo,
3082 bool StackValue = false);
3083
3084
3085
3086
3087
3088
3089
3090 static DIExpression *replaceArg(const DIExpression *Expr, uint64_t OldArg,
3091 uint64_t NewArg);
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104 static std::optional<DIExpression *>
3105 createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits,
3106 unsigned SizeInBits);
3107
3108
3109
3110
3111 static int fragmentCmp(const FragmentInfo &A, const FragmentInfo &B) {
3112 uint64_t l1 = A.OffsetInBits;
3113 uint64_t l2 = B.OffsetInBits;
3114 uint64_t r1 = l1 + A.SizeInBits;
3115 uint64_t r2 = l2 + B.SizeInBits;
3116 if (r1 <= l2)
3117 return -1;
3118 else if (r2 <= l1)
3119 return 1;
3120 else
3121 return 0;
3122 }
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154 static bool calculateFragmentIntersect(
3155 const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits,
3156 uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits,
3157 int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag,
3158 std::optional<DIExpression::FragmentInfo> &Result,
3159 int64_t &OffsetFromLocationInBits);
3160
3161 using ExtOps = std::array<uint64_t, 6>;
3162
3163
3164 static ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed);
3165
3166
3167
3168 static DIExpression *appendExt(const DIExpression *Expr, unsigned FromSize,
3169 unsigned ToSize, bool Signed);
3170
3171
3172 static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B) {
3173 return fragmentCmp(A, B) == 0;
3174 }
3175
3176
3177
3178 int fragmentCmp(const DIExpression *Other) const {
3179 auto Fragment1 = *getFragmentInfo();
3180 auto Fragment2 = *Other->getFragmentInfo();
3181 return fragmentCmp(Fragment1, Fragment2);
3182 }
3183
3184
3185 bool fragmentsOverlap(const DIExpression *Other) const {
3186 if (!isFragment() || !Other->isFragment())
3187 return true;
3188 return fragmentCmp(Other) == 0;
3189 }
3190
3191
3192
3193 bool isEntryValue() const;
3194
3195
3196
3197
3198 std::pair<DIExpression *, const ConstantInt *>
3199 constantFold(const ConstantInt *CI);
3200
3201
3202
3203
3204 DIExpression *foldConstantMath();
3205 };
3206
3207 inline bool operator==(const DIExpression::FragmentInfo &A,
3208 const DIExpression::FragmentInfo &B) {
3209 return std::tie(A.SizeInBits, A.OffsetInBits) ==
3210 std::tie(B.SizeInBits, B.OffsetInBits);
3211 }
3212
3213 inline bool operator<(const DIExpression::FragmentInfo &A,
3214 const DIExpression::FragmentInfo &B) {
3215 return std::tie(A.SizeInBits, A.OffsetInBits) <
3216 std::tie(B.SizeInBits, B.OffsetInBits);
3217 }
3218
3219 template <> struct DenseMapInfo<DIExpression::FragmentInfo> {
3220 using FragInfo = DIExpression::FragmentInfo;
3221 static const uint64_t MaxVal = std::numeric_limits<uint64_t>::max();
3222
3223 static inline FragInfo getEmptyKey() { return {MaxVal, MaxVal}; }
3224
3225 static inline FragInfo getTombstoneKey() { return {MaxVal - 1, MaxVal - 1}; }
3226
3227 static unsigned getHashValue(const FragInfo &Frag) {
3228 return (Frag.SizeInBits & 0xffff) << 16 | (Frag.OffsetInBits & 0xffff);
3229 }
3230
3231 static bool isEqual(const FragInfo &A, const FragInfo &B) { return A == B; }
3232 };
3233
3234
3235
3236 class DIExpressionCursor {
3237 DIExpression::expr_op_iterator Start, End;
3238
3239 public:
3240 DIExpressionCursor(const DIExpression *Expr) {
3241 if (!Expr) {
3242 assert(Start == End);
3243 return;
3244 }
3245 Start = Expr->expr_op_begin();
3246 End = Expr->expr_op_end();
3247 }
3248
3249 DIExpressionCursor(ArrayRef<uint64_t> Expr)
3250 : Start(Expr.begin()), End(Expr.end()) {}
3251
3252 DIExpressionCursor(const DIExpressionCursor &) = default;
3253
3254
3255 std::optional<DIExpression::ExprOperand> take() {
3256 if (Start == End)
3257 return std::nullopt;
3258 return *(Start++);
3259 }
3260
3261
3262 void consume(unsigned N) { std::advance(Start, N); }
3263
3264
3265 std::optional<DIExpression::ExprOperand> peek() const {
3266 if (Start == End)
3267 return std::nullopt;
3268 return *(Start);
3269 }
3270
3271
3272 std::optional<DIExpression::ExprOperand> peekNext() const {
3273 if (Start == End)
3274 return std::nullopt;
3275
3276 auto Next = Start.getNext();
3277 if (Next == End)
3278 return std::nullopt;
3279
3280 return *Next;
3281 }
3282
3283 std::optional<DIExpression::ExprOperand> peekNextN(unsigned N) const {
3284 if (Start == End)
3285 return std::nullopt;
3286 DIExpression::expr_op_iterator Nth = Start;
3287 for (unsigned I = 0; I < N; I++) {
3288 Nth = Nth.getNext();
3289 if (Nth == End)
3290 return std::nullopt;
3291 }
3292 return *Nth;
3293 }
3294
3295 void assignNewExpr(ArrayRef<uint64_t> Expr) {
3296 this->Start = DIExpression::expr_op_iterator(Expr.begin());
3297 this->End = DIExpression::expr_op_iterator(Expr.end());
3298 }
3299
3300
3301 operator bool() const { return Start != End; }
3302
3303 DIExpression::expr_op_iterator begin() const { return Start; }
3304 DIExpression::expr_op_iterator end() const { return End; }
3305
3306
3307 std::optional<DIExpression::FragmentInfo> getFragmentInfo() const {
3308 return DIExpression::getFragmentInfo(Start, End);
3309 }
3310 };
3311
3312
3313
3314
3315 class DIGlobalVariable : public DIVariable {
3316 friend class LLVMContextImpl;
3317 friend class MDNode;
3318
3319 bool IsLocalToUnit;
3320 bool IsDefinition;
3321
3322 DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
3323 bool IsLocalToUnit, bool IsDefinition, uint32_t AlignInBits,
3324 ArrayRef<Metadata *> Ops)
3325 : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits),
3326 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
3327 ~DIGlobalVariable() = default;
3328
3329 static DIGlobalVariable *
3330 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
3331 StringRef LinkageName, DIFile *File, unsigned Line, DIType *Type,
3332 bool IsLocalToUnit, bool IsDefinition,
3333 DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams,
3334 uint32_t AlignInBits, DINodeArray Annotations, StorageType Storage,
3335 bool ShouldCreate = true) {
3336 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
3337 getCanonicalMDString(Context, LinkageName), File, Line, Type,
3338 IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration,
3339 cast_or_null<Metadata>(TemplateParams), AlignInBits,
3340 Annotations.get(), Storage, ShouldCreate);
3341 }
3342 static DIGlobalVariable *
3343 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
3344 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
3345 bool IsLocalToUnit, bool IsDefinition,
3346 Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams,
3347 uint32_t AlignInBits, Metadata *Annotations, StorageType Storage,
3348 bool ShouldCreate = true);
3349
3350 TempDIGlobalVariable cloneImpl() const {
3351 return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
3352 getFile(), getLine(), getType(), isLocalToUnit(),
3353 isDefinition(), getStaticDataMemberDeclaration(),
3354 getTemplateParams(), getAlignInBits(),
3355 getAnnotations());
3356 }
3357
3358 public:
3359 DEFINE_MDNODE_GET(
3360 DIGlobalVariable,
3361 (DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
3362 unsigned Line, DIType *Type, bool IsLocalToUnit, bool IsDefinition,
3363 DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams,
3364 uint32_t AlignInBits, DINodeArray Annotations),
3365 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
3366 StaticDataMemberDeclaration, TemplateParams, AlignInBits, Annotations))
3367 DEFINE_MDNODE_GET(
3368 DIGlobalVariable,
3369 (Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
3370 unsigned Line, Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
3371 Metadata *StaticDataMemberDeclaration, Metadata *TemplateParams,
3372 uint32_t AlignInBits, Metadata *Annotations),
3373 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
3374 StaticDataMemberDeclaration, TemplateParams, AlignInBits, Annotations))
3375
3376 TempDIGlobalVariable clone() const { return cloneImpl(); }
3377
3378 bool isLocalToUnit() const { return IsLocalToUnit; }
3379 bool isDefinition() const { return IsDefinition; }
3380 StringRef getDisplayName() const { return getStringOperand(4); }
3381 StringRef getLinkageName() const { return getStringOperand(5); }
3382 DIDerivedType *getStaticDataMemberDeclaration() const {
3383 return cast_or_null<DIDerivedType>(getRawStaticDataMemberDeclaration());
3384 }
3385 DINodeArray getAnnotations() const {
3386 return cast_or_null<MDTuple>(getRawAnnotations());
3387 }
3388
3389 MDString *getRawLinkageName() const { return getOperandAs<MDString>(5); }
3390 Metadata *getRawStaticDataMemberDeclaration() const { return getOperand(6); }
3391 Metadata *getRawTemplateParams() const { return getOperand(7); }
3392 MDTuple *getTemplateParams() const { return getOperandAs<MDTuple>(7); }
3393 Metadata *getRawAnnotations() const { return getOperand(8); }
3394
3395 static bool classof(const Metadata *MD) {
3396 return MD->getMetadataID() == DIGlobalVariableKind;
3397 }
3398 };
3399
3400
3401
3402
3403 class DICommonBlock : public DIScope {
3404 friend class LLVMContextImpl;
3405 friend class MDNode;
3406
3407 DICommonBlock(LLVMContext &Context, StorageType Storage, unsigned LineNo,
3408 ArrayRef<Metadata *> Ops);
3409
3410 static DICommonBlock *getImpl(LLVMContext &Context, DIScope *Scope,
3411 DIGlobalVariable *Decl, StringRef Name,
3412 DIFile *File, unsigned LineNo,
3413 StorageType Storage, bool ShouldCreate = true) {
3414 return getImpl(Context, Scope, Decl, getCanonicalMDString(Context, Name),
3415 File, LineNo, Storage, ShouldCreate);
3416 }
3417 static DICommonBlock *getImpl(LLVMContext &Context, Metadata *Scope,
3418 Metadata *Decl, MDString *Name, Metadata *File,
3419 unsigned LineNo, StorageType Storage,
3420 bool ShouldCreate = true);
3421
3422 TempDICommonBlock cloneImpl() const {
3423 return getTemporary(getContext(), getScope(), getDecl(), getName(),
3424 getFile(), getLineNo());
3425 }
3426
3427 public:
3428 DEFINE_MDNODE_GET(DICommonBlock,
3429 (DIScope * Scope, DIGlobalVariable *Decl, StringRef Name,
3430 DIFile *File, unsigned LineNo),
3431 (Scope, Decl, Name, File, LineNo))
3432 DEFINE_MDNODE_GET(DICommonBlock,
3433 (Metadata * Scope, Metadata *Decl, MDString *Name,
3434 Metadata *File, unsigned LineNo),
3435 (Scope, Decl, Name, File, LineNo))
3436
3437 TempDICommonBlock clone() const { return cloneImpl(); }
3438
3439 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
3440 DIGlobalVariable *getDecl() const {
3441 return cast_or_null<DIGlobalVariable>(getRawDecl());
3442 }
3443 StringRef getName() const { return getStringOperand(2); }
3444 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3445 unsigned getLineNo() const { return SubclassData32; }
3446
3447 Metadata *getRawScope() const { return getOperand(0); }
3448 Metadata *getRawDecl() const { return getOperand(1); }
3449 MDString *getRawName() const { return getOperandAs<MDString>(2); }
3450 Metadata *getRawFile() const { return getOperand(3); }
3451
3452 static bool classof(const Metadata *MD) {
3453 return MD->getMetadataID() == DICommonBlockKind;
3454 }
3455 };
3456
3457
3458
3459
3460 class DILocalVariable : public DIVariable {
3461 friend class LLVMContextImpl;
3462 friend class MDNode;
3463
3464 unsigned Arg : 16;
3465 DIFlags Flags;
3466
3467 DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
3468 unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
3469 ArrayRef<Metadata *> Ops)
3470 : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits),
3471 Arg(Arg), Flags(Flags) {
3472 assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range");
3473 }
3474 ~DILocalVariable() = default;
3475
3476 static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope,
3477 StringRef Name, DIFile *File, unsigned Line,
3478 DIType *Type, unsigned Arg, DIFlags Flags,
3479 uint32_t AlignInBits, DINodeArray Annotations,
3480 StorageType Storage,
3481 bool ShouldCreate = true) {
3482 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
3483 Line, Type, Arg, Flags, AlignInBits, Annotations.get(),
3484 Storage, ShouldCreate);
3485 }
3486 static DILocalVariable *getImpl(LLVMContext &Context, Metadata *Scope,
3487 MDString *Name, Metadata *File, unsigned Line,
3488 Metadata *Type, unsigned Arg, DIFlags Flags,
3489 uint32_t AlignInBits, Metadata *Annotations,
3490 StorageType Storage,
3491 bool ShouldCreate = true);
3492
3493 TempDILocalVariable cloneImpl() const {
3494 return getTemporary(getContext(), getScope(), getName(), getFile(),
3495 getLine(), getType(), getArg(), getFlags(),
3496 getAlignInBits(), getAnnotations());
3497 }
3498
3499 public:
3500 DEFINE_MDNODE_GET(DILocalVariable,
3501 (DILocalScope * Scope, StringRef Name, DIFile *File,
3502 unsigned Line, DIType *Type, unsigned Arg, DIFlags Flags,
3503 uint32_t AlignInBits, DINodeArray Annotations),
3504 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
3505 Annotations))
3506 DEFINE_MDNODE_GET(DILocalVariable,
3507 (Metadata * Scope, MDString *Name, Metadata *File,
3508 unsigned Line, Metadata *Type, unsigned Arg, DIFlags Flags,
3509 uint32_t AlignInBits, Metadata *Annotations),
3510 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
3511 Annotations))
3512
3513 TempDILocalVariable clone() const { return cloneImpl(); }
3514
3515
3516
3517
3518 DILocalScope *getScope() const {
3519 return cast<DILocalScope>(DIVariable::getScope());
3520 }
3521
3522 bool isParameter() const { return Arg; }
3523 unsigned getArg() const { return Arg; }
3524 DIFlags getFlags() const { return Flags; }
3525
3526 DINodeArray getAnnotations() const {
3527 return cast_or_null<MDTuple>(getRawAnnotations());
3528 }
3529 Metadata *getRawAnnotations() const { return getOperand(4); }
3530
3531 bool isArtificial() const { return getFlags() & FlagArtificial; }
3532 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
3533
3534
3535
3536
3537
3538
3539 bool isValidLocationForIntrinsic(const DILocation *DL) const {
3540 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
3541 }
3542
3543 static bool classof(const Metadata *MD) {
3544 return MD->getMetadataID() == DILocalVariableKind;
3545 }
3546 };
3547
3548
3549
3550
3551 class DILabel : public DINode {
3552 friend class LLVMContextImpl;
3553 friend class MDNode;
3554
3555 DILabel(LLVMContext &C, StorageType Storage, unsigned Line,
3556 ArrayRef<Metadata *> Ops);
3557 ~DILabel() = default;
3558
3559 static DILabel *getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
3560 DIFile *File, unsigned Line, StorageType Storage,
3561 bool ShouldCreate = true) {
3562 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
3563 Line, Storage, ShouldCreate);
3564 }
3565 static DILabel *getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
3566 Metadata *File, unsigned Line, StorageType Storage,
3567 bool ShouldCreate = true);
3568
3569 TempDILabel cloneImpl() const {
3570 return getTemporary(getContext(), getScope(), getName(), getFile(),
3571 getLine());
3572 }
3573
3574 public:
3575 DEFINE_MDNODE_GET(DILabel,
3576 (DILocalScope * Scope, StringRef Name, DIFile *File,
3577 unsigned Line),
3578 (Scope, Name, File, Line))
3579 DEFINE_MDNODE_GET(DILabel,
3580 (Metadata * Scope, MDString *Name, Metadata *File,
3581 unsigned Line),
3582 (Scope, Name, File, Line))
3583
3584 TempDILabel clone() const { return cloneImpl(); }
3585
3586
3587
3588
3589 DILocalScope *getScope() const {
3590 return cast_or_null<DILocalScope>(getRawScope());
3591 }
3592 unsigned getLine() const { return SubclassData32; }
3593 StringRef getName() const { return getStringOperand(1); }
3594 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3595
3596 Metadata *getRawScope() const { return getOperand(0); }
3597 MDString *getRawName() const { return getOperandAs<MDString>(1); }
3598 Metadata *getRawFile() const { return getOperand(2); }
3599
3600
3601
3602
3603
3604
3605 bool isValidLocationForIntrinsic(const DILocation *DL) const {
3606 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
3607 }
3608
3609 static bool classof(const Metadata *MD) {
3610 return MD->getMetadataID() == DILabelKind;
3611 }
3612 };
3613
3614 class DIObjCProperty : public DINode {
3615 friend class LLVMContextImpl;
3616 friend class MDNode;
3617
3618 unsigned Line;
3619 unsigned Attributes;
3620
3621 DIObjCProperty(LLVMContext &C, StorageType Storage, unsigned Line,
3622 unsigned Attributes, ArrayRef<Metadata *> Ops);
3623 ~DIObjCProperty() = default;
3624
3625 static DIObjCProperty *
3626 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line,
3627 StringRef GetterName, StringRef SetterName, unsigned Attributes,
3628 DIType *Type, StorageType Storage, bool ShouldCreate = true) {
3629 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line,
3630 getCanonicalMDString(Context, GetterName),
3631 getCanonicalMDString(Context, SetterName), Attributes, Type,
3632 Storage, ShouldCreate);
3633 }
3634 static DIObjCProperty *getImpl(LLVMContext &Context, MDString *Name,
3635 Metadata *File, unsigned Line,
3636 MDString *GetterName, MDString *SetterName,
3637 unsigned Attributes, Metadata *Type,
3638 StorageType Storage, bool ShouldCreate = true);
3639
3640 TempDIObjCProperty cloneImpl() const {
3641 return getTemporary(getContext(), getName(), getFile(), getLine(),
3642 getGetterName(), getSetterName(), getAttributes(),
3643 getType());
3644 }
3645
3646 public:
3647 DEFINE_MDNODE_GET(DIObjCProperty,
3648 (StringRef Name, DIFile *File, unsigned Line,
3649 StringRef GetterName, StringRef SetterName,
3650 unsigned Attributes, DIType *Type),
3651 (Name, File, Line, GetterName, SetterName, Attributes,
3652 Type))
3653 DEFINE_MDNODE_GET(DIObjCProperty,
3654 (MDString * Name, Metadata *File, unsigned Line,
3655 MDString *GetterName, MDString *SetterName,
3656 unsigned Attributes, Metadata *Type),
3657 (Name, File, Line, GetterName, SetterName, Attributes,
3658 Type))
3659
3660 TempDIObjCProperty clone() const { return cloneImpl(); }
3661
3662 unsigned getLine() const { return Line; }
3663 unsigned getAttributes() const { return Attributes; }
3664 StringRef getName() const { return getStringOperand(0); }
3665 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3666 StringRef getGetterName() const { return getStringOperand(2); }
3667 StringRef getSetterName() const { return getStringOperand(3); }
3668 DIType *getType() const { return cast_or_null<DIType>(getRawType()); }
3669
3670 StringRef getFilename() const {
3671 if (auto *F = getFile())
3672 return F->getFilename();
3673 return "";
3674 }
3675
3676 StringRef getDirectory() const {
3677 if (auto *F = getFile())
3678 return F->getDirectory();
3679 return "";
3680 }
3681
3682 MDString *getRawName() const { return getOperandAs<MDString>(0); }
3683 Metadata *getRawFile() const { return getOperand(1); }
3684 MDString *getRawGetterName() const { return getOperandAs<MDString>(2); }
3685 MDString *getRawSetterName() const { return getOperandAs<MDString>(3); }
3686 Metadata *getRawType() const { return getOperand(4); }
3687
3688 static bool classof(const Metadata *MD) {
3689 return MD->getMetadataID() == DIObjCPropertyKind;
3690 }
3691 };
3692
3693
3694
3695
3696 class DIImportedEntity : public DINode {
3697 friend class LLVMContextImpl;
3698 friend class MDNode;
3699
3700 DIImportedEntity(LLVMContext &C, StorageType Storage, unsigned Tag,
3701 unsigned Line, ArrayRef<Metadata *> Ops)
3702 : DINode(C, DIImportedEntityKind, Storage, Tag, Ops) {
3703 SubclassData32 = Line;
3704 }
3705 ~DIImportedEntity() = default;
3706
3707 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
3708 DIScope *Scope, DINode *Entity, DIFile *File,
3709 unsigned Line, StringRef Name,
3710 DINodeArray Elements, StorageType Storage,
3711 bool ShouldCreate = true) {
3712 return getImpl(Context, Tag, Scope, Entity, File, Line,
3713 getCanonicalMDString(Context, Name), Elements.get(), Storage,
3714 ShouldCreate);
3715 }
3716 static DIImportedEntity *
3717 getImpl(LLVMContext &Context, unsigned Tag, Metadata *Scope, Metadata *Entity,
3718 Metadata *File, unsigned Line, MDString *Name, Metadata *Elements,
3719 StorageType Storage, bool ShouldCreate = true);
3720
3721 TempDIImportedEntity cloneImpl() const {
3722 return getTemporary(getContext(), getTag(), getScope(), getEntity(),
3723 getFile(), getLine(), getName(), getElements());
3724 }
3725
3726 public:
3727 DEFINE_MDNODE_GET(DIImportedEntity,
3728 (unsigned Tag, DIScope *Scope, DINode *Entity, DIFile *File,
3729 unsigned Line, StringRef Name = "",
3730 DINodeArray Elements = nullptr),
3731 (Tag, Scope, Entity, File, Line, Name, Elements))
3732 DEFINE_MDNODE_GET(DIImportedEntity,
3733 (unsigned Tag, Metadata *Scope, Metadata *Entity,
3734 Metadata *File, unsigned Line, MDString *Name,
3735 Metadata *Elements = nullptr),
3736 (Tag, Scope, Entity, File, Line, Name, Elements))
3737
3738 TempDIImportedEntity clone() const { return cloneImpl(); }
3739
3740 unsigned getLine() const { return SubclassData32; }
3741 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
3742 DINode *getEntity() const { return cast_or_null<DINode>(getRawEntity()); }
3743 StringRef getName() const { return getStringOperand(2); }
3744 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3745 DINodeArray getElements() const {
3746 return cast_or_null<MDTuple>(getRawElements());
3747 }
3748
3749 Metadata *getRawScope() const { return getOperand(0); }
3750 Metadata *getRawEntity() const { return getOperand(1); }
3751 MDString *getRawName() const { return getOperandAs<MDString>(2); }
3752 Metadata *getRawFile() const { return getOperand(3); }
3753 Metadata *getRawElements() const { return getOperand(4); }
3754
3755 static bool classof(const Metadata *MD) {
3756 return MD->getMetadataID() == DIImportedEntityKind;
3757 }
3758 };
3759
3760
3761 class DIGlobalVariableExpression : public MDNode {
3762 friend class LLVMContextImpl;
3763 friend class MDNode;
3764
3765 DIGlobalVariableExpression(LLVMContext &C, StorageType Storage,
3766 ArrayRef<Metadata *> Ops)
3767 : MDNode(C, DIGlobalVariableExpressionKind, Storage, Ops) {}
3768 ~DIGlobalVariableExpression() = default;
3769
3770 static DIGlobalVariableExpression *
3771 getImpl(LLVMContext &Context, Metadata *Variable, Metadata *Expression,
3772 StorageType Storage, bool ShouldCreate = true);
3773
3774 TempDIGlobalVariableExpression cloneImpl() const {
3775 return getTemporary(getContext(), getVariable(), getExpression());
3776 }
3777
3778 public:
3779 DEFINE_MDNODE_GET(DIGlobalVariableExpression,
3780 (Metadata * Variable, Metadata *Expression),
3781 (Variable, Expression))
3782
3783 TempDIGlobalVariableExpression clone() const { return cloneImpl(); }
3784
3785 Metadata *getRawVariable() const { return getOperand(0); }
3786
3787 DIGlobalVariable *getVariable() const {
3788 return cast_or_null<DIGlobalVariable>(getRawVariable());
3789 }
3790
3791 Metadata *getRawExpression() const { return getOperand(1); }
3792
3793 DIExpression *getExpression() const {
3794 return cast<DIExpression>(getRawExpression());
3795 }
3796
3797 static bool classof(const Metadata *MD) {
3798 return MD->getMetadataID() == DIGlobalVariableExpressionKind;
3799 }
3800 };
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810 class DIMacroNode : public MDNode {
3811 friend class LLVMContextImpl;
3812 friend class MDNode;
3813
3814 protected:
3815 DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType,
3816 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = {})
3817 : MDNode(C, ID, Storage, Ops1, Ops2) {
3818 assert(MIType < 1u << 16);
3819 SubclassData16 = MIType;
3820 }
3821 ~DIMacroNode() = default;
3822
3823 template <class Ty> Ty *getOperandAs(unsigned I) const {
3824 return cast_or_null<Ty>(getOperand(I));
3825 }
3826
3827 StringRef getStringOperand(unsigned I) const {
3828 if (auto *S = getOperandAs<MDString>(I))
3829 return S->getString();
3830 return StringRef();
3831 }
3832
3833 static MDString *getCanonicalMDString(LLVMContext &Context, StringRef S) {
3834 if (S.empty())
3835 return nullptr;
3836 return MDString::get(Context, S);
3837 }
3838
3839 public:
3840 unsigned getMacinfoType() const { return SubclassData16; }
3841
3842 static bool classof(const Metadata *MD) {
3843 switch (MD->getMetadataID()) {
3844 default:
3845 return false;
3846 case DIMacroKind:
3847 case DIMacroFileKind:
3848 return true;
3849 }
3850 }
3851 };
3852
3853
3854
3855
3856 class DIMacro : public DIMacroNode {
3857 friend class LLVMContextImpl;
3858 friend class MDNode;
3859
3860 DIMacro(LLVMContext &C, StorageType Storage, unsigned MIType, unsigned Line,
3861 ArrayRef<Metadata *> Ops)
3862 : DIMacroNode(C, DIMacroKind, Storage, MIType, Ops) {
3863 SubclassData32 = Line;
3864 }
3865 ~DIMacro() = default;
3866
3867 static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
3868 StringRef Name, StringRef Value, StorageType Storage,
3869 bool ShouldCreate = true) {
3870 return getImpl(Context, MIType, Line, getCanonicalMDString(Context, Name),
3871 getCanonicalMDString(Context, Value), Storage, ShouldCreate);
3872 }
3873 static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
3874 MDString *Name, MDString *Value, StorageType Storage,
3875 bool ShouldCreate = true);
3876
3877 TempDIMacro cloneImpl() const {
3878 return getTemporary(getContext(), getMacinfoType(), getLine(), getName(),
3879 getValue());
3880 }
3881
3882 public:
3883 DEFINE_MDNODE_GET(DIMacro,
3884 (unsigned MIType, unsigned Line, StringRef Name,
3885 StringRef Value = ""),
3886 (MIType, Line, Name, Value))
3887 DEFINE_MDNODE_GET(DIMacro,
3888 (unsigned MIType, unsigned Line, MDString *Name,
3889 MDString *Value),
3890 (MIType, Line, Name, Value))
3891
3892 TempDIMacro clone() const { return cloneImpl(); }
3893
3894 unsigned getLine() const { return SubclassData32; }
3895
3896 StringRef getName() const { return getStringOperand(0); }
3897 StringRef getValue() const { return getStringOperand(1); }
3898
3899 MDString *getRawName() const { return getOperandAs<MDString>(0); }
3900 MDString *getRawValue() const { return getOperandAs<MDString>(1); }
3901
3902 static bool classof(const Metadata *MD) {
3903 return MD->getMetadataID() == DIMacroKind;
3904 }
3905 };
3906
3907
3908
3909
3910 class DIMacroFile : public DIMacroNode {
3911 friend class LLVMContextImpl;
3912 friend class MDNode;
3913
3914 DIMacroFile(LLVMContext &C, StorageType Storage, unsigned MIType,
3915 unsigned Line, ArrayRef<Metadata *> Ops)
3916 : DIMacroNode(C, DIMacroFileKind, Storage, MIType, Ops) {
3917 SubclassData32 = Line;
3918 }
3919 ~DIMacroFile() = default;
3920
3921 static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
3922 unsigned Line, DIFile *File,
3923 DIMacroNodeArray Elements, StorageType Storage,
3924 bool ShouldCreate = true) {
3925 return getImpl(Context, MIType, Line, static_cast<Metadata *>(File),
3926 Elements.get(), Storage, ShouldCreate);
3927 }
3928
3929 static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
3930 unsigned Line, Metadata *File, Metadata *Elements,
3931 StorageType Storage, bool ShouldCreate = true);
3932
3933 TempDIMacroFile cloneImpl() const {
3934 return getTemporary(getContext(), getMacinfoType(), getLine(), getFile(),
3935 getElements());
3936 }
3937
3938 public:
3939 DEFINE_MDNODE_GET(DIMacroFile,
3940 (unsigned MIType, unsigned Line, DIFile *File,
3941 DIMacroNodeArray Elements),
3942 (MIType, Line, File, Elements))
3943 DEFINE_MDNODE_GET(DIMacroFile,
3944 (unsigned MIType, unsigned Line, Metadata *File,
3945 Metadata *Elements),
3946 (MIType, Line, File, Elements))
3947
3948 TempDIMacroFile clone() const { return cloneImpl(); }
3949
3950 void replaceElements(DIMacroNodeArray Elements) {
3951 #ifndef NDEBUG
3952 for (DIMacroNode *Op : getElements())
3953 assert(is_contained(Elements->operands(), Op) &&
3954 "Lost a macro node during macro node list replacement");
3955 #endif
3956 replaceOperandWith(1, Elements.get());
3957 }
3958
3959 unsigned getLine() const { return SubclassData32; }
3960 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
3961
3962 DIMacroNodeArray getElements() const {
3963 return cast_or_null<MDTuple>(getRawElements());
3964 }
3965
3966 Metadata *getRawFile() const { return getOperand(0); }
3967 Metadata *getRawElements() const { return getOperand(1); }
3968
3969 static bool classof(const Metadata *MD) {
3970 return MD->getMetadataID() == DIMacroFileKind;
3971 }
3972 };
3973
3974
3975
3976 class DIArgList : public Metadata, ReplaceableMetadataImpl {
3977 friend class ReplaceableMetadataImpl;
3978 friend class LLVMContextImpl;
3979 using iterator = SmallVectorImpl<ValueAsMetadata *>::iterator;
3980
3981 SmallVector<ValueAsMetadata *, 4> Args;
3982
3983 DIArgList(LLVMContext &Context, ArrayRef<ValueAsMetadata *> Args)
3984 : Metadata(DIArgListKind, Uniqued), ReplaceableMetadataImpl(Context),
3985 Args(Args) {
3986 track();
3987 }
3988 ~DIArgList() { untrack(); }
3989
3990 void track();
3991 void untrack();
3992 void dropAllReferences(bool Untrack);
3993
3994 public:
3995 static DIArgList *get(LLVMContext &Context, ArrayRef<ValueAsMetadata *> Args);
3996
3997 ArrayRef<ValueAsMetadata *> getArgs() const { return Args; }
3998
3999 iterator args_begin() { return Args.begin(); }
4000 iterator args_end() { return Args.end(); }
4001
4002 static bool classof(const Metadata *MD) {
4003 return MD->getMetadataID() == DIArgListKind;
4004 }
4005
4006 SmallVector<DbgVariableRecord *> getAllDbgVariableRecordUsers() {
4007 return ReplaceableMetadataImpl::getAllDbgVariableRecordUsers();
4008 }
4009
4010 void handleChangedOperand(void *Ref, Metadata *New);
4011 };
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024 class DebugVariable {
4025 using FragmentInfo = DIExpression::FragmentInfo;
4026
4027 const DILocalVariable *Variable;
4028 std::optional<FragmentInfo> Fragment;
4029 const DILocation *InlinedAt;
4030
4031
4032
4033 static const FragmentInfo DefaultFragment;
4034
4035 public:
4036 DebugVariable(const DbgVariableIntrinsic *DII);
4037 DebugVariable(const DbgVariableRecord *DVR);
4038
4039 DebugVariable(const DILocalVariable *Var,
4040 std::optional<FragmentInfo> FragmentInfo,
4041 const DILocation *InlinedAt)
4042 : Variable(Var), Fragment(FragmentInfo), InlinedAt(InlinedAt) {}
4043
4044 DebugVariable(const DILocalVariable *Var, const DIExpression *DIExpr,
4045 const DILocation *InlinedAt)
4046 : Variable(Var),
4047 Fragment(DIExpr ? DIExpr->getFragmentInfo() : std::nullopt),
4048 InlinedAt(InlinedAt) {}
4049
4050 const DILocalVariable *getVariable() const { return Variable; }
4051 std::optional<FragmentInfo> getFragment() const { return Fragment; }
4052 const DILocation *getInlinedAt() const { return InlinedAt; }
4053
4054 FragmentInfo getFragmentOrDefault() const {
4055 return Fragment.value_or(DefaultFragment);
4056 }
4057
4058 static bool isDefaultFragment(const FragmentInfo F) {
4059 return F == DefaultFragment;
4060 }
4061
4062 bool operator==(const DebugVariable &Other) const {
4063 return std::tie(Variable, Fragment, InlinedAt) ==
4064 std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
4065 }
4066
4067 bool operator<(const DebugVariable &Other) const {
4068 return std::tie(Variable, Fragment, InlinedAt) <
4069 std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
4070 }
4071 };
4072
4073 template <> struct DenseMapInfo<DebugVariable> {
4074 using FragmentInfo = DIExpression::FragmentInfo;
4075
4076
4077 static inline DebugVariable getEmptyKey() {
4078 return DebugVariable(nullptr, std::nullopt, nullptr);
4079 }
4080
4081
4082 static inline DebugVariable getTombstoneKey() {
4083 return DebugVariable(nullptr, {{0, 0}}, nullptr);
4084 }
4085
4086 static unsigned getHashValue(const DebugVariable &D) {
4087 unsigned HV = 0;
4088 const std::optional<FragmentInfo> Fragment = D.getFragment();
4089 if (Fragment)
4090 HV = DenseMapInfo<FragmentInfo>::getHashValue(*Fragment);
4091
4092 return hash_combine(D.getVariable(), HV, D.getInlinedAt());
4093 }
4094
4095 static bool isEqual(const DebugVariable &A, const DebugVariable &B) {
4096 return A == B;
4097 }
4098 };
4099
4100
4101
4102 class DebugVariableAggregate : public DebugVariable {
4103 public:
4104 DebugVariableAggregate(const DbgVariableIntrinsic *DVI);
4105 DebugVariableAggregate(const DebugVariable &V)
4106 : DebugVariable(V.getVariable(), std::nullopt, V.getInlinedAt()) {}
4107 };
4108
4109 template <>
4110 struct DenseMapInfo<DebugVariableAggregate>
4111 : public DenseMapInfo<DebugVariable> {};
4112 }
4113
4114 #undef DEFINE_MDNODE_GET_UNPACK_IMPL
4115 #undef DEFINE_MDNODE_GET_UNPACK
4116 #undef DEFINE_MDNODE_GET
4117
4118 #endif