LLVM 23.0.0git
DebugInfoMetadata.h
Go to the documentation of this file.
1//===- llvm/IR/DebugInfoMetadata.h - Debug info metadata --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Declarations for metadata specific to debug info.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_IR_DEBUGINFOMETADATA_H
14#define LLVM_IR_DEBUGINFOMETADATA_H
15
16#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/Constants.h"
25#include "llvm/IR/Metadata.h"
26#include "llvm/IR/PseudoProbe.h"
31#include <cassert>
32#include <climits>
33#include <cstddef>
34#include <cstdint>
35#include <iterator>
36#include <optional>
37#include <vector>
38
39// Helper macros for defining get() overrides.
40#define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__
41#define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS
42#define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) \
43 static CLASS *getDistinct(LLVMContext &Context, \
44 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
45 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \
46 } \
47 static Temp##CLASS getTemporary(LLVMContext &Context, \
48 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
49 return Temp##CLASS( \
50 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \
51 }
52#define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \
53 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
54 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \
55 } \
56 static CLASS *getIfExists(LLVMContext &Context, \
57 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
58 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \
59 /* ShouldCreate */ false); \
60 } \
61 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
62
63namespace llvm {
64
65namespace dwarf {
66enum Tag : uint16_t;
67}
68
69/// Wrapper structure that holds a language name and its version.
70///
71/// Some debug-info formats, particularly DWARF, distniguish between
72/// language codes that include the version name and codes that don't.
73/// DISourceLanguageName may hold either of these.
74///
76 /// Language version. The version scheme is language
77 /// dependent.
78 uint32_t Version = 0;
79
80 /// Language name.
81 /// If \ref HasVersion is \c true, then this name
82 /// is version independent (i.e., doesn't include the language
83 /// version in its name).
84 uint16_t Name;
85
86 /// If \c true, then \ref Version is interpretable and \ref Name
87 /// is a version independent name.
88 bool HasVersion;
89
90public:
91 bool hasVersionedName() const { return HasVersion; }
92
93 /// Returns a versioned or unversioned language name.
94 uint16_t getName() const { return Name; }
95
96 /// Transitional API for cases where we do not yet support
97 /// versioned source language names. Use \ref getName instead.
98 ///
99 /// FIXME: remove once all callers of this API account for versioned
100 /// names.
103 return Name;
104 }
105
106 /// Returns language version. Only valid for versioned language names.
109 return Version;
110 }
111
113 : Version(Version), Name(Lang), HasVersion(true) {};
115 : Version(0), Name(Lang), HasVersion(false) {};
116};
117
118class DbgVariableRecord;
119
121
122/// Tagged DWARF-like metadata node.
123///
124/// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*,
125/// defined in llvm/BinaryFormat/Dwarf.h). Called \a DINode because it's
126/// potentially used for non-DWARF output.
127///
128/// Uses the SubclassData16 Metadata slot.
129class DINode : public MDNode {
130 friend class LLVMContextImpl;
131 friend class MDNode;
132
133protected:
134 DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
136 : MDNode(C, ID, Storage, Ops1, Ops2) {
137 assert(Tag < 1u << 16);
139 }
140 ~DINode() = default;
141
142 template <class Ty> Ty *getOperandAs(unsigned I) const {
144 }
145
146 StringRef getStringOperand(unsigned I) const {
147 if (auto *S = getOperandAs<MDString>(I))
148 return S->getString();
149 return StringRef();
150 }
151
153 if (S.empty())
154 return nullptr;
155 return MDString::get(Context, S);
156 }
157
158 /// Allow subclasses to mutate the tag.
159 void setTag(unsigned Tag) { SubclassData16 = Tag; }
160
161public:
162 LLVM_ABI dwarf::Tag getTag() const;
163
164 /// Debug info flags.
165 ///
166 /// The three accessibility flags are mutually exclusive and rolled together
167 /// in the first two bits.
169#define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
170#define DI_FLAG_LARGEST_NEEDED
171#include "llvm/IR/DebugInfoFlags.def"
172 FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic,
173 FlagPtrToMemberRep = FlagSingleInheritance | FlagMultipleInheritance |
174 FlagVirtualInheritance,
175 LLVM_MARK_AS_BITMASK_ENUM(FlagLargest)
176 };
177
178 LLVM_ABI static DIFlags getFlag(StringRef Flag);
179 LLVM_ABI static StringRef getFlagString(DIFlags Flag);
180
181 /// Split up a flags bitfield.
182 ///
183 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns
184 /// any remaining (unrecognized) bits.
185 LLVM_ABI static DIFlags splitFlags(DIFlags Flags,
186 SmallVectorImpl<DIFlags> &SplitFlags);
187
188 static bool classof(const Metadata *MD) {
189 switch (MD->getMetadataID()) {
190 default:
191 return false;
192 case GenericDINodeKind:
193 case DISubrangeKind:
194 case DIEnumeratorKind:
195 case DIBasicTypeKind:
196 case DIFixedPointTypeKind:
197 case DIStringTypeKind:
198 case DISubrangeTypeKind:
199 case DIDerivedTypeKind:
200 case DICompositeTypeKind:
201 case DISubroutineTypeKind:
202 case DIFileKind:
203 case DICompileUnitKind:
204 case DISubprogramKind:
205 case DILexicalBlockKind:
206 case DILexicalBlockFileKind:
207 case DINamespaceKind:
208 case DICommonBlockKind:
209 case DITemplateTypeParameterKind:
210 case DITemplateValueParameterKind:
211 case DIGlobalVariableKind:
212 case DILocalVariableKind:
213 case DILabelKind:
214 case DIObjCPropertyKind:
215 case DIImportedEntityKind:
216 case DIModuleKind:
217 case DIGenericSubrangeKind:
218 case DIAssignIDKind:
219 return true;
220 }
221 }
222};
223
224/// Generic tagged DWARF-like metadata node.
225///
226/// An un-specialized DWARF-like metadata node. The first operand is a
227/// (possibly empty) null-separated \a MDString header that contains arbitrary
228/// fields. The remaining operands are \a dwarf_operands(), and are pointers
229/// to other metadata.
230///
231/// Uses the SubclassData32 Metadata slot.
232class GenericDINode : public DINode {
233 friend class LLVMContextImpl;
234 friend class MDNode;
235
236 GenericDINode(LLVMContext &C, StorageType Storage, unsigned Hash,
237 unsigned Tag, ArrayRef<Metadata *> Ops1,
239 : DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) {
240 setHash(Hash);
241 }
243
244 void setHash(unsigned Hash) { SubclassData32 = Hash; }
245 void recalculateHash();
246
247 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
249 StorageType Storage, bool ShouldCreate = true) {
250 return getImpl(Context, Tag, getCanonicalMDString(Context, Header),
251 DwarfOps, Storage, ShouldCreate);
252 }
253
254 LLVM_ABI static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
255 MDString *Header,
258 bool ShouldCreate = true);
259
260 TempGenericDINode cloneImpl() const {
263 }
264
265public:
266 unsigned getHash() const { return SubclassData32; }
267
268 DEFINE_MDNODE_GET(GenericDINode,
269 (unsigned Tag, StringRef Header,
271 (Tag, Header, DwarfOps))
272 DEFINE_MDNODE_GET(GenericDINode,
273 (unsigned Tag, MDString *Header,
276
277 /// Return a (temporary) clone of this.
278 TempGenericDINode clone() const { return cloneImpl(); }
279
280 LLVM_ABI dwarf::Tag getTag() const;
281 StringRef getHeader() const { return getStringOperand(0); }
283
284 op_iterator dwarf_op_begin() const { return op_begin() + 1; }
285 op_iterator dwarf_op_end() const { return op_end(); }
288 }
289
290 unsigned getNumDwarfOperands() const { return getNumOperands() - 1; }
291 const MDOperand &getDwarfOperand(unsigned I) const {
292 return getOperand(I + 1);
293 }
294 void replaceDwarfOperandWith(unsigned I, Metadata *New) {
295 replaceOperandWith(I + 1, New);
296 }
297
298 static bool classof(const Metadata *MD) {
299 return MD->getMetadataID() == GenericDINodeKind;
300 }
301};
302
303/// Assignment ID.
304/// Used to link stores (as an attachment) and dbg.assigns (as an operand).
305/// DIAssignID metadata is never uniqued as we compare instances using
306/// referential equality (the instance/address is the ID).
307class DIAssignID : public MDNode {
308 friend class LLVMContextImpl;
309 friend class MDNode;
310
312 : MDNode(C, DIAssignIDKind, Storage, {}) {}
313
314 ~DIAssignID() { dropAllReferences(); }
315
316 LLVM_ABI static DIAssignID *getImpl(LLVMContext &Context, StorageType Storage,
317 bool ShouldCreate = true);
318
319 TempDIAssignID cloneImpl() const { return getTemporary(getContext()); }
320
321public:
322 // This node has no operands to replace.
323 void replaceOperandWith(unsigned I, Metadata *New) = delete;
324
326 return Context.getReplaceableUses()->getAllDbgVariableRecordUsers();
327 }
328
329 static DIAssignID *getDistinct(LLVMContext &Context) {
330 return getImpl(Context, Distinct);
331 }
332 static TempDIAssignID getTemporary(LLVMContext &Context) {
333 return TempDIAssignID(getImpl(Context, Temporary));
334 }
335 // NOTE: Do not define get(LLVMContext&) - see class comment.
336
337 static bool classof(const Metadata *MD) {
338 return MD->getMetadataID() == DIAssignIDKind;
339 }
340};
341
342/// Array subrange.
343class DISubrange : public DINode {
344 friend class LLVMContextImpl;
345 friend class MDNode;
346
348
349 ~DISubrange() = default;
350
351 LLVM_ABI static DISubrange *getImpl(LLVMContext &Context, int64_t Count,
353 bool ShouldCreate = true);
354
355 LLVM_ABI static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
357 bool ShouldCreate = true);
358
359 LLVM_ABI static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
361 Metadata *UpperBound, Metadata *Stride,
363 bool ShouldCreate = true);
364
365 TempDISubrange cloneImpl() const {
366 return getTemporary(getContext(), getRawCountNode(), getRawLowerBound(),
367 getRawUpperBound(), getRawStride());
368 }
369
370public:
371 DEFINE_MDNODE_GET(DISubrange, (int64_t Count, int64_t LowerBound = 0),
372 (Count, LowerBound))
373
374 DEFINE_MDNODE_GET(DISubrange, (Metadata * CountNode, int64_t LowerBound = 0),
376
377 DEFINE_MDNODE_GET(DISubrange,
379 Metadata *UpperBound, Metadata *Stride),
380 (CountNode, LowerBound, UpperBound, Stride))
381
382 TempDISubrange clone() const { return cloneImpl(); }
383
384 Metadata *getRawCountNode() const { return getOperand(0).get(); }
385
386 Metadata *getRawLowerBound() const { return getOperand(1).get(); }
387
388 Metadata *getRawUpperBound() const { return getOperand(2).get(); }
389
390 Metadata *getRawStride() const { return getOperand(3).get(); }
391
392 typedef PointerUnion<ConstantInt *, DIVariable *, DIExpression *> BoundType;
393
394 LLVM_ABI BoundType getCount() const;
395
396 LLVM_ABI BoundType getLowerBound() const;
397
398 LLVM_ABI BoundType getUpperBound() const;
399
400 LLVM_ABI BoundType getStride() const;
401
402 static bool classof(const Metadata *MD) {
403 return MD->getMetadataID() == DISubrangeKind;
404 }
405};
406
407class DIGenericSubrange : public DINode {
408 friend class LLVMContextImpl;
409 friend class MDNode;
410
411 DIGenericSubrange(LLVMContext &C, StorageType Storage,
413
414 ~DIGenericSubrange() = default;
415
416 LLVM_ABI static DIGenericSubrange *
417 getImpl(LLVMContext &Context, Metadata *CountNode, Metadata *LowerBound,
418 Metadata *UpperBound, Metadata *Stride, StorageType Storage,
419 bool ShouldCreate = true);
420
421 TempDIGenericSubrange cloneImpl() const {
424 }
425
426public:
427 DEFINE_MDNODE_GET(DIGenericSubrange,
428 (Metadata * CountNode, Metadata *LowerBound,
429 Metadata *UpperBound, Metadata *Stride),
430 (CountNode, LowerBound, UpperBound, Stride))
431
432 TempDIGenericSubrange clone() const { return cloneImpl(); }
433
434 Metadata *getRawCountNode() const { return getOperand(0).get(); }
435 Metadata *getRawLowerBound() const { return getOperand(1).get(); }
436 Metadata *getRawUpperBound() const { return getOperand(2).get(); }
437 Metadata *getRawStride() const { return getOperand(3).get(); }
438
440
445
446 static bool classof(const Metadata *MD) {
447 return MD->getMetadataID() == DIGenericSubrangeKind;
448 }
449};
450
451/// Enumeration value.
452///
453/// TODO: Add a pointer to the context (DW_TAG_enumeration_type) once that no
454/// longer creates a type cycle.
455class DIEnumerator : public DINode {
456 friend class LLVMContextImpl;
457 friend class MDNode;
458
459 APInt Value;
460 LLVM_ABI DIEnumerator(LLVMContext &C, StorageType Storage, const APInt &Value,
462 DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value,
464 : DIEnumerator(C, Storage, APInt(64, Value, !IsUnsigned), IsUnsigned,
465 Ops) {}
466 ~DIEnumerator() = default;
467
468 static DIEnumerator *getImpl(LLVMContext &Context, const APInt &Value,
470 StorageType Storage, bool ShouldCreate = true) {
471 return getImpl(Context, Value, IsUnsigned,
472 getCanonicalMDString(Context, Name), Storage, ShouldCreate);
473 }
474 LLVM_ABI static DIEnumerator *getImpl(LLVMContext &Context,
475 const APInt &Value, bool IsUnsigned,
476 MDString *Name, StorageType Storage,
477 bool ShouldCreate = true);
478
479 TempDIEnumerator cloneImpl() const {
481 }
482
483public:
484 DEFINE_MDNODE_GET(DIEnumerator,
485 (int64_t Value, bool IsUnsigned, StringRef Name),
486 (APInt(64, Value, !IsUnsigned), IsUnsigned, Name))
487 DEFINE_MDNODE_GET(DIEnumerator,
488 (int64_t Value, bool IsUnsigned, MDString *Name),
489 (APInt(64, Value, !IsUnsigned), IsUnsigned, Name))
490 DEFINE_MDNODE_GET(DIEnumerator,
491 (APInt Value, bool IsUnsigned, StringRef Name),
492 (Value, IsUnsigned, Name))
493 DEFINE_MDNODE_GET(DIEnumerator,
494 (APInt Value, bool IsUnsigned, MDString *Name),
495 (Value, IsUnsigned, Name))
496
497 TempDIEnumerator clone() const { return cloneImpl(); }
498
499 const APInt &getValue() const { return Value; }
500 bool isUnsigned() const { return SubclassData32; }
501 StringRef getName() const { return getStringOperand(0); }
502
504
505 static bool classof(const Metadata *MD) {
506 return MD->getMetadataID() == DIEnumeratorKind;
507 }
508};
509
510/// Base class for scope-like contexts.
511///
512/// Base class for lexical scopes and types (which are also declaration
513/// contexts).
514///
515/// TODO: Separate the concepts of declaration contexts and lexical scopes.
516class DIScope : public DINode {
517protected:
521 ~DIScope() = default;
522
523public:
525
526 inline StringRef getFilename() const;
527 inline StringRef getDirectory() const;
528 inline std::optional<StringRef> getSource() const;
529
530 LLVM_ABI StringRef getName() const;
531 LLVM_ABI DIScope *getScope() const;
532
533 /// Return the raw underlying file.
534 ///
535 /// A \a DIFile is a \a DIScope, but it doesn't point at a separate file (it
536 /// \em is the file). If \c this is an \a DIFile, we need to return \c this.
537 /// Otherwise, return the first operand, which is where all other subclasses
538 /// store their file pointer.
540 return isa<DIFile>(this) ? const_cast<DIScope *>(this)
541 : static_cast<Metadata *>(getOperand(0));
542 }
543
544 static bool classof(const Metadata *MD) {
545 switch (MD->getMetadataID()) {
546 default:
547 return false;
548 case DIBasicTypeKind:
549 case DIFixedPointTypeKind:
550 case DIStringTypeKind:
551 case DISubrangeTypeKind:
552 case DIDerivedTypeKind:
553 case DICompositeTypeKind:
554 case DISubroutineTypeKind:
555 case DIFileKind:
556 case DICompileUnitKind:
557 case DISubprogramKind:
558 case DILexicalBlockKind:
559 case DILexicalBlockFileKind:
560 case DINamespaceKind:
561 case DICommonBlockKind:
562 case DIModuleKind:
563 return true;
564 }
565 }
566};
567
568/// File.
569///
570/// TODO: Merge with directory/file node (including users).
571/// TODO: Canonicalize paths on creation.
572class DIFile : public DIScope {
573 friend class LLVMContextImpl;
574 friend class MDNode;
575
576public:
577 /// Which algorithm (e.g. MD5) a checksum was generated with.
578 ///
579 /// The encoding is explicit because it is used directly in Bitcode. The
580 /// value 0 is reserved to indicate the absence of a checksum in Bitcode.
582 // The first variant was originally CSK_None, encoded as 0. The new
583 // internal representation removes the need for this by wrapping the
584 // ChecksumInfo in an Optional, but to preserve Bitcode compatibility the 0
585 // encoding is reserved.
589 CSK_Last = CSK_SHA256 // Should be last enumeration.
590 };
591
592 /// A single checksum, represented by a \a Kind and a \a Value (a string).
593 template <typename T> struct ChecksumInfo {
594 /// The kind of checksum which \a Value encodes.
596 /// The string value of the checksum.
598
600 ~ChecksumInfo() = default;
601 bool operator==(const ChecksumInfo<T> &X) const {
602 return Kind == X.Kind && Value == X.Value;
603 }
604 bool operator!=(const ChecksumInfo<T> &X) const { return !(*this == X); }
605 StringRef getKindAsString() const { return getChecksumKindAsString(Kind); }
606 };
607
608private:
609 std::optional<ChecksumInfo<MDString *>> Checksum;
610 /// An optional source. A nullptr means none.
612
614 std::optional<ChecksumInfo<MDString *>> CS, MDString *Src,
616 ~DIFile() = default;
617
618 static DIFile *getImpl(LLVMContext &Context, StringRef Filename,
620 std::optional<ChecksumInfo<StringRef>> CS,
621 std::optional<StringRef> Source, StorageType Storage,
622 bool ShouldCreate = true) {
623 std::optional<ChecksumInfo<MDString *>> MDChecksum;
624 if (CS)
625 MDChecksum.emplace(CS->Kind, getCanonicalMDString(Context, CS->Value));
626 return getImpl(Context, getCanonicalMDString(Context, Filename),
627 getCanonicalMDString(Context, Directory), MDChecksum,
628 Source ? MDString::get(Context, *Source) : nullptr, Storage,
629 ShouldCreate);
630 }
631 LLVM_ABI static DIFile *getImpl(LLVMContext &Context, MDString *Filename,
632 MDString *Directory,
633 std::optional<ChecksumInfo<MDString *>> CS,
634 MDString *Source, StorageType Storage,
635 bool ShouldCreate = true);
636
637 TempDIFile cloneImpl() const {
639 getChecksum(), getSource());
640 }
641
642public:
645 std::optional<ChecksumInfo<StringRef>> CS = std::nullopt,
646 std::optional<StringRef> Source = std::nullopt),
647 (Filename, Directory, CS, Source))
648 DEFINE_MDNODE_GET(DIFile,
650 std::optional<ChecksumInfo<MDString *>> CS = std::nullopt,
651 MDString *Source = nullptr),
652 (Filename, Directory, CS, Source))
653
654 TempDIFile clone() const { return cloneImpl(); }
655
656 StringRef getFilename() const { return getStringOperand(0); }
657 StringRef getDirectory() const { return getStringOperand(1); }
658 std::optional<ChecksumInfo<StringRef>> getChecksum() const {
659 std::optional<ChecksumInfo<StringRef>> StringRefChecksum;
660 if (Checksum)
661 StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString());
662 return StringRefChecksum;
663 }
664 std::optional<StringRef> getSource() const {
665 return Source ? std::optional<StringRef>(Source->getString())
666 : std::nullopt;
667 }
668
669 MDString *getRawFilename() const { return getOperandAs<MDString>(0); }
670 MDString *getRawDirectory() const { return getOperandAs<MDString>(1); }
671 std::optional<ChecksumInfo<MDString *>> getRawChecksum() const {
672 return Checksum;
673 }
674 MDString *getRawSource() const { return Source; }
675
676 LLVM_ABI static StringRef getChecksumKindAsString(ChecksumKind CSKind);
677 LLVM_ABI static std::optional<ChecksumKind>
678 getChecksumKind(StringRef CSKindStr);
679
680 static bool classof(const Metadata *MD) {
681 return MD->getMetadataID() == DIFileKind;
682 }
683};
684
686 if (auto *F = getFile())
687 return F->getFilename();
688 return "";
689}
690
692 if (auto *F = getFile())
693 return F->getDirectory();
694 return "";
695}
696
697std::optional<StringRef> DIScope::getSource() const {
698 if (auto *F = getFile())
699 return F->getSource();
700 return std::nullopt;
701}
702
703/// Base class for types.
704///
705/// TODO: Remove the hardcoded name and context, since many types don't use
706/// them.
707/// TODO: Split up flags.
708///
709/// Uses the SubclassData32 Metadata slot.
710class DIType : public DIScope {
711 unsigned Line;
712 DIFlags Flags;
713 uint32_t NumExtraInhabitants;
714
715protected:
716 static constexpr unsigned N_OPERANDS = 5;
717
718 DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
719 unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants,
721 : DIScope(C, ID, Storage, Tag, Ops) {
722 init(Line, AlignInBits, NumExtraInhabitants, Flags);
723 }
724 ~DIType() = default;
725
726 void init(unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants,
727 DIFlags Flags) {
728 this->Line = Line;
729 this->Flags = Flags;
730 this->SubclassData32 = AlignInBits;
731 this->NumExtraInhabitants = NumExtraInhabitants;
732 }
733
734 /// Change fields in place.
735 void mutate(unsigned Tag, unsigned Line, uint32_t AlignInBits,
736 uint32_t NumExtraInhabitants, DIFlags Flags) {
737 assert(isDistinct() && "Only distinct nodes can mutate");
738 setTag(Tag);
739 init(Line, AlignInBits, NumExtraInhabitants, Flags);
740 }
741
742public:
743 TempDIType clone() const {
744 return TempDIType(cast<DIType>(MDNode::clone().release()));
745 }
746
747 unsigned getLine() const { return Line; }
749 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
750 uint32_t getNumExtraInhabitants() const { return NumExtraInhabitants; }
751 DIFlags getFlags() const { return Flags; }
752
754 StringRef getName() const { return getStringOperand(2); }
755
756 Metadata *getRawScope() const { return getOperand(1); }
758
759 Metadata *getRawSizeInBits() const { return getOperand(3); }
762 if (ConstantInt *CI = dyn_cast_or_null<ConstantInt>(MD->getValue()))
763 return CI->getZExtValue();
764 }
765 return 0;
766 }
767
768 Metadata *getRawOffsetInBits() const { return getOperand(4); }
771 if (ConstantInt *CI = dyn_cast_or_null<ConstantInt>(MD->getValue()))
772 return CI->getZExtValue();
773 }
774 return 0;
775 }
776
777 /// Returns a new temporary DIType with updated Flags
778 TempDIType cloneWithFlags(DIFlags NewFlags) const {
779 auto NewTy = clone();
780 NewTy->Flags = NewFlags;
781 return NewTy;
782 }
783
784 bool isPrivate() const {
785 return (getFlags() & FlagAccessibility) == FlagPrivate;
786 }
787 bool isProtected() const {
788 return (getFlags() & FlagAccessibility) == FlagProtected;
789 }
790 bool isPublic() const {
791 return (getFlags() & FlagAccessibility) == FlagPublic;
792 }
793 bool isForwardDecl() const { return getFlags() & FlagFwdDecl; }
794 bool isAppleBlockExtension() const { return getFlags() & FlagAppleBlock; }
795 bool isVirtual() const { return getFlags() & FlagVirtual; }
796 bool isArtificial() const { return getFlags() & FlagArtificial; }
797 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
798 bool isObjcClassComplete() const {
799 return getFlags() & FlagObjcClassComplete;
800 }
801 bool isVector() const { return getFlags() & FlagVector; }
802 bool isBitField() const { return getFlags() & FlagBitField; }
803 bool isStaticMember() const { return getFlags() & FlagStaticMember; }
804 bool isLValueReference() const { return getFlags() & FlagLValueReference; }
805 bool isRValueReference() const { return getFlags() & FlagRValueReference; }
806 bool isTypePassByValue() const { return getFlags() & FlagTypePassByValue; }
808 return getFlags() & FlagTypePassByReference;
809 }
810 bool isBigEndian() const { return getFlags() & FlagBigEndian; }
811 bool isLittleEndian() const { return getFlags() & FlagLittleEndian; }
812 bool getExportSymbols() const { return getFlags() & FlagExportSymbols; }
813
814 static bool classof(const Metadata *MD) {
815 switch (MD->getMetadataID()) {
816 default:
817 return false;
818 case DIBasicTypeKind:
819 case DIFixedPointTypeKind:
820 case DIStringTypeKind:
821 case DISubrangeTypeKind:
822 case DIDerivedTypeKind:
823 case DICompositeTypeKind:
824 case DISubroutineTypeKind:
825 return true;
826 }
827 }
828};
829
830/// Basic type, like 'int' or 'float'.
831///
832/// TODO: Split out DW_TAG_unspecified_type.
833/// TODO: Drop unused accessors.
834class DIBasicType : public DIType {
835 friend class LLVMContextImpl;
836 friend class MDNode;
837
838 unsigned Encoding;
839 /// Describes the number of bits used by the value of the object. Non-zero
840 /// when the value of an object does not fully occupy the storage size
841 /// specified by SizeInBits.
842 uint32_t DataSizeInBits;
843
844protected:
846 uint32_t AlignInBits, unsigned Encoding,
847 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
849 : DIType(C, DIBasicTypeKind, Storage, Tag, 0, AlignInBits,
851 Encoding(Encoding), DataSizeInBits(DataSizeInBits) {}
853 uint32_t AlignInBits, unsigned Encoding,
854 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
857 Ops),
858 Encoding(Encoding), DataSizeInBits(DataSizeInBits) {}
859 ~DIBasicType() = default;
860
861 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
863 uint32_t AlignInBits, unsigned Encoding,
865 uint32_t DataSizeInBits, DIFlags Flags,
866 StorageType Storage, bool ShouldCreate = true) {
867 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
869 DataSizeInBits, Flags, Storage, ShouldCreate);
870 }
871 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
873 uint32_t AlignInBits, unsigned Encoding,
875 uint32_t DataSizeInBits, DIFlags Flags,
876 StorageType Storage, bool ShouldCreate = true) {
877 auto *SizeInBitsNode = ConstantAsMetadata::get(
878 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
879 return getImpl(Context, Tag, Name, SizeInBitsNode, AlignInBits, Encoding,
880 NumExtraInhabitants, DataSizeInBits, Flags, Storage,
881 ShouldCreate);
882 }
883 LLVM_ABI static DIBasicType *
884 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
887 StorageType Storage, bool ShouldCreate = true);
888
889 TempDIBasicType cloneImpl() const {
893 getFlags());
894 }
895
896public:
898 (Tag, Name, 0, 0, 0, 0, 0, FlagZero))
901 (Tag, Name, SizeInBits, 0, 0, 0, 0, FlagZero))
903 (unsigned Tag, MDString *Name, uint64_t SizeInBits),
904 (Tag, Name, SizeInBits, 0, 0, 0, 0, FlagZero))
907 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
908 (Tag, Name, SizeInBits, AlignInBits, Encoding, 0, 0, Flags))
910 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
911 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
912 (Tag, Name, SizeInBits, AlignInBits, Encoding, 0, 0, Flags))
915 uint32_t AlignInBits, unsigned Encoding,
921 uint32_t AlignInBits, unsigned Encoding,
922 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
923 DIFlags Flags),
924 (Tag, Name, SizeInBits, AlignInBits, Encoding,
925 NumExtraInhabitants, DataSizeInBits, Flags))
928 uint32_t AlignInBits, unsigned Encoding,
932 NumExtraInhabitants, DataSizeInBits, Flags))
934 (unsigned Tag, MDString *Name, Metadata *SizeInBits,
935 uint32_t AlignInBits, unsigned Encoding,
936 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
937 DIFlags Flags),
938 (Tag, Name, SizeInBits, AlignInBits, Encoding,
939 NumExtraInhabitants, DataSizeInBits, Flags))
940
941 TempDIBasicType clone() const { return cloneImpl(); }
942
943 unsigned getEncoding() const { return Encoding; }
944
945 uint32_t getDataSizeInBits() const { return DataSizeInBits; }
946
947 enum class Signedness { Signed, Unsigned };
948
949 /// Return the signedness of this type, or std::nullopt if this type is
950 /// neither signed nor unsigned.
951 LLVM_ABI std::optional<Signedness> getSignedness() const;
952
953 static bool classof(const Metadata *MD) {
954 return MD->getMetadataID() == DIBasicTypeKind ||
955 MD->getMetadataID() == DIFixedPointTypeKind;
956 }
957};
958
959/// Fixed-point type.
960class DIFixedPointType : public DIBasicType {
961 friend class LLVMContextImpl;
962 friend class MDNode;
963
964 // Actually FixedPointKind.
965 unsigned Kind;
966 // Used for binary and decimal.
967 int Factor;
968 // Used for rational.
969 APInt Numerator;
970 APInt Denominator;
971
972 DIFixedPointType(LLVMContext &C, StorageType Storage, unsigned Tag,
974 unsigned Kind, int Factor, ArrayRef<Metadata *> Ops)
975 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
976 Encoding, 0, 0, Flags, Ops),
977 Kind(Kind), Factor(Factor) {
978 assert(Kind == FixedPointBinary || Kind == FixedPointDecimal);
979 }
981 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
982 unsigned Kind, APInt Numerator, APInt Denominator,
984 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
985 Encoding, 0, 0, Flags, Ops),
987 assert(Kind == FixedPointRational);
988 }
989 DIFixedPointType(LLVMContext &C, StorageType Storage, unsigned Tag,
990 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
991 unsigned Kind, int Factor, APInt Numerator,
993 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
994 Encoding, 0, 0, Flags, Ops),
995 Kind(Kind), Factor(Factor), Numerator(Numerator),
997 ~DIFixedPointType() = default;
998
999 static DIFixedPointType *
1000 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name,
1001 uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
1002 DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
1003 APInt Denominator, StorageType Storage, bool ShouldCreate = true) {
1004 auto *SizeInBitsNode = ConstantAsMetadata::get(
1005 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1006 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
1007 SizeInBitsNode, AlignInBits, Encoding, Flags, Kind, Factor,
1008 Numerator, Denominator, Storage, ShouldCreate);
1009 }
1010 static DIFixedPointType *
1011 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name,
1012 Metadata *SizeInBits, uint32_t AlignInBits, unsigned Encoding,
1013 DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
1014 APInt Denominator, StorageType Storage, bool ShouldCreate = true) {
1015 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
1016 SizeInBits, AlignInBits, Encoding, Flags, Kind, Factor,
1017 Numerator, Denominator, Storage, ShouldCreate);
1018 }
1019 static DIFixedPointType *
1020 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
1021 uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
1022 DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
1023 APInt Denominator, StorageType Storage, bool ShouldCreate = true) {
1024 auto *SizeInBitsNode = ConstantAsMetadata::get(
1025 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1026 return getImpl(Context, Tag, Name, SizeInBitsNode, AlignInBits, Encoding,
1027 Flags, Kind, Factor, Numerator, Denominator, Storage,
1028 ShouldCreate);
1029 }
1030 LLVM_ABI static DIFixedPointType *
1031 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
1032 Metadata *SizeInBits, uint32_t AlignInBits, unsigned Encoding,
1033 DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
1034 APInt Denominator, StorageType Storage, bool ShouldCreate = true);
1035
1036 TempDIFixedPointType cloneImpl() const {
1039 getFlags(), Kind, Factor, Numerator, Denominator);
1040 }
1041
1042public:
1043 enum FixedPointKind : unsigned {
1044 /// Scale factor 2^Factor.
1046 /// Scale factor 10^Factor.
1048 /// Arbitrary rational scale factor.
1051 };
1052
1053 LLVM_ABI static std::optional<FixedPointKind>
1055 LLVM_ABI static const char *fixedPointKindString(FixedPointKind);
1056
1057 DEFINE_MDNODE_GET(DIFixedPointType,
1058 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
1060 unsigned Kind, int Factor, APInt Numerator,
1061 APInt Denominator),
1063 Factor, Numerator, Denominator))
1064 DEFINE_MDNODE_GET(DIFixedPointType,
1067 unsigned Kind, int Factor, APInt Numerator,
1068 APInt Denominator),
1070 Factor, Numerator, Denominator))
1071 DEFINE_MDNODE_GET(DIFixedPointType,
1072 (unsigned Tag, MDString *Name, Metadata *SizeInBits,
1074 unsigned Kind, int Factor, APInt Numerator,
1075 APInt Denominator),
1077 Factor, Numerator, Denominator))
1078
1079 TempDIFixedPointType clone() const { return cloneImpl(); }
1080
1081 bool isBinary() const { return Kind == FixedPointBinary; }
1082 bool isDecimal() const { return Kind == FixedPointDecimal; }
1083 bool isRational() const { return Kind == FixedPointRational; }
1084
1085 LLVM_ABI bool isSigned() const;
1086
1087 FixedPointKind getKind() const { return static_cast<FixedPointKind>(Kind); }
1088
1089 int getFactorRaw() const { return Factor; }
1090 int getFactor() const {
1091 assert(Kind == FixedPointBinary || Kind == FixedPointDecimal);
1092 return Factor;
1093 }
1094
1095 const APInt &getNumeratorRaw() const { return Numerator; }
1096 const APInt &getNumerator() const {
1097 assert(Kind == FixedPointRational);
1098 return Numerator;
1099 }
1100
1101 const APInt &getDenominatorRaw() const { return Denominator; }
1102 const APInt &getDenominator() const {
1103 assert(Kind == FixedPointRational);
1104 return Denominator;
1105 }
1106
1107 static bool classof(const Metadata *MD) {
1108 return MD->getMetadataID() == DIFixedPointTypeKind;
1109 }
1110};
1111
1112/// String type, Fortran CHARACTER(n)
1113class DIStringType : public DIType {
1114 friend class LLVMContextImpl;
1115 friend class MDNode;
1116
1117 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1118
1119 unsigned Encoding;
1120
1121 DIStringType(LLVMContext &C, StorageType Storage, unsigned Tag,
1122 uint32_t AlignInBits, unsigned Encoding,
1124 : DIType(C, DIStringTypeKind, Storage, Tag, 0, AlignInBits, 0, FlagZero,
1125 Ops),
1126 Encoding(Encoding) {}
1127 ~DIStringType() = default;
1128
1129 static DIStringType *getImpl(LLVMContext &Context, unsigned Tag,
1131 Metadata *StrLenExp, Metadata *StrLocationExp,
1133 unsigned Encoding, StorageType Storage,
1134 bool ShouldCreate = true) {
1135 auto *SizeInBitsNode = ConstantAsMetadata::get(
1136 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1137 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
1138 StringLength, StrLenExp, StrLocationExp, SizeInBitsNode,
1139 AlignInBits, Encoding, Storage, ShouldCreate);
1140 }
1141 static DIStringType *getImpl(LLVMContext &Context, unsigned Tag,
1142 MDString *Name, Metadata *StringLength,
1143 Metadata *StrLenExp, Metadata *StrLocationExp,
1145 unsigned Encoding, StorageType Storage,
1146 bool ShouldCreate = true) {
1147 auto *SizeInBitsNode = ConstantAsMetadata::get(
1148 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1149 return getImpl(Context, Tag, Name, StringLength, StrLenExp, StrLocationExp,
1150 SizeInBitsNode, AlignInBits, Encoding, Storage,
1151 ShouldCreate);
1152 }
1153 LLVM_ABI static DIStringType *
1154 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
1155 Metadata *StringLength, Metadata *StrLenExp, Metadata *StrLocationExp,
1156 Metadata *SizeInBits, uint32_t AlignInBits, unsigned Encoding,
1157 StorageType Storage, bool ShouldCreate = true);
1158
1159 TempDIStringType cloneImpl() const {
1164 }
1165
1166public:
1167 DEFINE_MDNODE_GET(DIStringType,
1168 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
1170 (Tag, Name, nullptr, nullptr, nullptr, SizeInBits,
1171 AlignInBits, 0))
1172 DEFINE_MDNODE_GET(DIStringType,
1176 unsigned Encoding),
1179 DEFINE_MDNODE_GET(DIStringType,
1180 (unsigned Tag, StringRef Name, Metadata *StringLength,
1183 unsigned Encoding),
1186 DEFINE_MDNODE_GET(DIStringType,
1190 unsigned Encoding),
1193
1194 TempDIStringType clone() const { return cloneImpl(); }
1195
1196 static bool classof(const Metadata *MD) {
1197 return MD->getMetadataID() == DIStringTypeKind;
1198 }
1199
1203
1207
1211
1212 unsigned getEncoding() const { return Encoding; }
1213
1214 Metadata *getRawStringLength() const { return getOperand(MY_FIRST_OPERAND); }
1215
1217 return getOperand(MY_FIRST_OPERAND + 1);
1218 }
1219
1221 return getOperand(MY_FIRST_OPERAND + 2);
1222 }
1223};
1224
1225/// Derived types.
1226///
1227/// This includes qualified types, pointers, references, friends, typedefs, and
1228/// class members.
1229///
1230/// TODO: Split out members (inheritance, fields, methods, etc.).
1231class DIDerivedType : public DIType {
1232public:
1233 /// Pointer authentication (__ptrauth) metadata.
1235 // RawData layout:
1236 // - Bits 0..3: Key
1237 // - Bit 4: IsAddressDiscriminated
1238 // - Bits 5..20: ExtraDiscriminator
1239 // - Bit 21: IsaPointer
1240 // - Bit 22: AuthenticatesNullValues
1241 unsigned RawData;
1242
1243 PtrAuthData(unsigned FromRawData) : RawData(FromRawData) {}
1244 PtrAuthData(unsigned Key, bool IsDiscr, unsigned Discriminator,
1245 bool IsaPointer, bool AuthenticatesNullValues) {
1246 assert(Key < 16);
1247 assert(Discriminator <= 0xffff);
1248 RawData = (Key << 0) | (IsDiscr ? (1 << 4) : 0) | (Discriminator << 5) |
1249 (IsaPointer ? (1 << 21) : 0) |
1250 (AuthenticatesNullValues ? (1 << 22) : 0);
1251 }
1252
1253 unsigned key() { return (RawData >> 0) & 0b1111; }
1254 bool isAddressDiscriminated() { return (RawData >> 4) & 1; }
1255 unsigned extraDiscriminator() { return (RawData >> 5) & 0xffff; }
1256 bool isaPointer() { return (RawData >> 21) & 1; }
1257 bool authenticatesNullValues() { return (RawData >> 22) & 1; }
1258 };
1259
1260private:
1261 friend class LLVMContextImpl;
1262 friend class MDNode;
1263
1264 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1265
1266 /// The DWARF address space of the memory pointed to or referenced by a
1267 /// pointer or reference type respectively.
1268 std::optional<unsigned> DWARFAddressSpace;
1269
1270 DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag,
1271 unsigned Line, uint32_t AlignInBits,
1272 std::optional<unsigned> DWARFAddressSpace,
1273 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1275 : DIType(C, DIDerivedTypeKind, Storage, Tag, Line, AlignInBits, 0, Flags,
1276 Ops),
1277 DWARFAddressSpace(DWARFAddressSpace) {
1278 if (PtrAuthData)
1280 }
1281 ~DIDerivedType() = default;
1282 static DIDerivedType *
1283 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1284 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1286 std::optional<unsigned> DWARFAddressSpace,
1287 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1289 bool ShouldCreate = true) {
1290 auto *SizeInBitsNode = ConstantAsMetadata::get(
1291 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1292 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1293 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1294 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1295 Line, Scope, BaseType, SizeInBitsNode, AlignInBits,
1296 OffsetInBitsNode, DWARFAddressSpace, PtrAuthData, Flags,
1297 ExtraData, Annotations.get(), Storage, ShouldCreate);
1298 }
1299 static DIDerivedType *
1300 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, DIFile *File,
1301 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1303 std::optional<unsigned> DWARFAddressSpace,
1304 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1306 bool ShouldCreate = true) {
1307 auto *SizeInBitsNode = ConstantAsMetadata::get(
1308 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1309 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1310 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1311 return getImpl(Context, Tag, Name, File, Line, Scope, BaseType,
1312 SizeInBitsNode, AlignInBits, OffsetInBitsNode,
1314 Annotations.get(), Storage, ShouldCreate);
1315 }
1316 static DIDerivedType *
1317 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1320 std::optional<unsigned> DWARFAddressSpace,
1321 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1323 bool ShouldCreate = true) {
1324 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1326 DWARFAddressSpace, PtrAuthData, Flags, ExtraData,
1327 Annotations.get(), Storage, ShouldCreate);
1328 }
1329 LLVM_ABI static DIDerivedType *
1330 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1331 unsigned Line, Metadata *Scope, Metadata *BaseType,
1333 std::optional<unsigned> DWARFAddressSpace,
1334 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1336 bool ShouldCreate = true);
1337
1338 TempDIDerivedType cloneImpl() const {
1339 return getTemporary(
1342 getRawOffsetInBits(), getDWARFAddressSpace(), getPtrAuthData(),
1344 }
1345
1346public:
1347 DEFINE_MDNODE_GET(DIDerivedType,
1348 (unsigned Tag, MDString *Name, Metadata *File,
1349 unsigned Line, Metadata *Scope, Metadata *BaseType,
1352 std::optional<unsigned> DWARFAddressSpace,
1353 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1354 Metadata *ExtraData = nullptr,
1355 Metadata *Annotations = nullptr),
1357 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1359 DEFINE_MDNODE_GET(DIDerivedType,
1360 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1363 std::optional<unsigned> DWARFAddressSpace,
1364 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1366 DINodeArray Annotations = nullptr),
1368 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1370 DEFINE_MDNODE_GET(DIDerivedType,
1371 (unsigned Tag, MDString *Name, DIFile *File, unsigned Line,
1374 std::optional<unsigned> DWARFAddressSpace,
1375 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1376 Metadata *ExtraData = nullptr,
1377 DINodeArray Annotations = nullptr),
1379 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1381 DEFINE_MDNODE_GET(DIDerivedType,
1382 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1385 std::optional<unsigned> DWARFAddressSpace,
1386 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1387 Metadata *ExtraData = nullptr,
1388 DINodeArray Annotations = nullptr),
1390 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1392
1393 TempDIDerivedType clone() const { return cloneImpl(); }
1394
1395 /// Get the base type this is derived from.
1396 DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
1397 Metadata *getRawBaseType() const { return getOperand(MY_FIRST_OPERAND); }
1398
1399 /// \returns The DWARF address space of the memory pointed to or referenced by
1400 /// a pointer or reference type respectively.
1401 std::optional<unsigned> getDWARFAddressSpace() const {
1402 return DWARFAddressSpace;
1403 }
1404
1405 LLVM_ABI std::optional<PtrAuthData> getPtrAuthData() const;
1406
1407 /// Get extra data associated with this derived type.
1408 ///
1409 /// Class type for pointer-to-members, objective-c property node for ivars,
1410 /// global constant wrapper for static members, virtual base pointer offset
1411 /// for inheritance, a tuple of template parameters for template aliases,
1412 /// discriminant for a variant, or storage offset for a bit field.
1413 ///
1414 /// TODO: Separate out types that need this extra operand: pointer-to-member
1415 /// types and member fields (static members and ivars).
1417 Metadata *getRawExtraData() const { return getOperand(MY_FIRST_OPERAND + 1); }
1418
1419 /// Get the template parameters from a template alias.
1420 DITemplateParameterArray getTemplateParams() const {
1422 }
1423
1424 /// Get annotations associated with this derived type.
1425 DINodeArray getAnnotations() const {
1427 }
1429 return getOperand(MY_FIRST_OPERAND + 2);
1430 }
1431
1432 /// Get casted version of extra data.
1433 /// @{
1434 LLVM_ABI DIType *getClassType() const;
1435
1439
1441
1443
1444 LLVM_ABI Constant *getConstant() const;
1445
1447 /// @}
1448
1449 static bool classof(const Metadata *MD) {
1450 return MD->getMetadataID() == DIDerivedTypeKind;
1451 }
1452};
1453
1456 return Lhs.RawData == Rhs.RawData;
1457}
1458
1461 return !(Lhs == Rhs);
1462}
1463
1464/// Subrange type. This is somewhat similar to DISubrange, but it
1465/// is also a DIType.
1466class DISubrangeType : public DIType {
1467public:
1469 DIDerivedType *>
1471
1472private:
1473 friend class LLVMContextImpl;
1474 friend class MDNode;
1475
1476 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1477
1478 DISubrangeType(LLVMContext &C, StorageType Storage, unsigned Line,
1480
1481 ~DISubrangeType() = default;
1482
1483 static DISubrangeType *
1484 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line,
1488 StorageType Storage, bool ShouldCreate = true) {
1489 auto *SizeInBitsNode = ConstantAsMetadata::get(
1490 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1491 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line,
1492 Scope, SizeInBitsNode, AlignInBits, Flags, BaseType,
1493 LowerBound, UpperBound, Stride, Bias, Storage, ShouldCreate);
1494 }
1495
1496 LLVM_ABI static DISubrangeType *
1497 getImpl(LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
1499 DIFlags Flags, Metadata *BaseType, Metadata *LowerBound,
1501 StorageType Storage, bool ShouldCreate = true);
1502
1503 TempDISubrangeType cloneImpl() const {
1508 }
1509
1510 LLVM_ABI BoundType convertRawToBound(Metadata *IN) const;
1511
1512public:
1513 DEFINE_MDNODE_GET(DISubrangeType,
1514 (MDString * Name, Metadata *File, unsigned Line,
1521 DEFINE_MDNODE_GET(DISubrangeType,
1528
1529 TempDISubrangeType clone() const { return cloneImpl(); }
1530
1531 /// Get the base type this is derived from.
1533 Metadata *getRawBaseType() const { return getOperand(MY_FIRST_OPERAND); }
1534
1536 return getOperand(MY_FIRST_OPERAND + 1).get();
1537 }
1538
1540 return getOperand(MY_FIRST_OPERAND + 2).get();
1541 }
1542
1544 return getOperand(MY_FIRST_OPERAND + 3).get();
1545 }
1546
1548 return getOperand(MY_FIRST_OPERAND + 4).get();
1549 }
1550
1552 return convertRawToBound(getRawLowerBound());
1553 }
1554
1556 return convertRawToBound(getRawUpperBound());
1557 }
1558
1559 BoundType getStride() const { return convertRawToBound(getRawStride()); }
1560
1561 BoundType getBias() const { return convertRawToBound(getRawBias()); }
1562
1563 static bool classof(const Metadata *MD) {
1564 return MD->getMetadataID() == DISubrangeTypeKind;
1565 }
1566};
1567
1568/// Composite types.
1569///
1570/// TODO: Detach from DerivedTypeBase (split out MDEnumType?).
1571/// TODO: Create a custom, unrelated node for DW_TAG_array_type.
1572class DICompositeType : public DIType {
1573 friend class LLVMContextImpl;
1574 friend class MDNode;
1575
1576 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1577
1578 unsigned RuntimeLang;
1579 std::optional<uint32_t> EnumKind;
1580
1581 DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
1582 unsigned Line, unsigned RuntimeLang, uint32_t AlignInBits,
1584 std::optional<uint32_t> EnumKind, DIFlags Flags,
1586 : DIType(C, DICompositeTypeKind, Storage, Tag, Line, AlignInBits,
1588 RuntimeLang(RuntimeLang), EnumKind(EnumKind) {}
1589 ~DICompositeType() = default;
1590
1591 /// Change fields in place.
1592 void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang,
1594 std::optional<uint32_t> EnumKind, DIFlags Flags) {
1595 assert(isDistinct() && "Only distinct nodes can mutate");
1596 assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate");
1597 this->RuntimeLang = RuntimeLang;
1598 this->EnumKind = EnumKind;
1600 }
1601
1602 static DICompositeType *
1603 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
1604 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1606 uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1607 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1608 DIType *VTableHolder, DITemplateParameterArray TemplateParams,
1609 StringRef Identifier, DIDerivedType *Discriminator,
1611 Metadata *Rank, DINodeArray Annotations, Metadata *BitStride,
1612 StorageType Storage, bool ShouldCreate = true) {
1613 auto *SizeInBitsNode = ConstantAsMetadata::get(
1614 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1615 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1616 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1617 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1618 Line, Scope, BaseType, SizeInBitsNode, AlignInBits,
1619 OffsetInBitsNode, Flags, Elements.get(), RuntimeLang,
1621 getCanonicalMDString(Context, Identifier), Discriminator,
1624 ShouldCreate);
1625 }
1626 static DICompositeType *
1627 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1628 unsigned Line, Metadata *Scope, Metadata *BaseType,
1629 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1630 DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
1631 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1636 Metadata *BitStride, StorageType Storage, bool ShouldCreate = true) {
1637 auto *SizeInBitsNode = ConstantAsMetadata::get(
1638 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1639 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1640 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1641 return getImpl(Context, Tag, Name, File, Line, Scope, BaseType,
1642 SizeInBitsNode, AlignInBits, OffsetInBitsNode, Flags,
1643 Elements, RuntimeLang, EnumKind, VTableHolder,
1646 NumExtraInhabitants, BitStride, Storage, ShouldCreate);
1647 }
1648 static DICompositeType *
1649 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
1652 uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1653 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1654 DIType *VTableHolder, DITemplateParameterArray TemplateParams,
1655 StringRef Identifier, DIDerivedType *Discriminator,
1657 Metadata *Rank, DINodeArray Annotations, Metadata *BitStride,
1658 StorageType Storage, bool ShouldCreate = true) {
1659 return getImpl(
1660 Context, Tag, getCanonicalMDString(Context, Name), File, Line, Scope,
1662 RuntimeLang, EnumKind, VTableHolder, TemplateParams.get(),
1665 NumExtraInhabitants, BitStride, Storage, ShouldCreate);
1666 }
1667 LLVM_ABI static DICompositeType *
1668 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1669 unsigned Line, Metadata *Scope, Metadata *BaseType,
1671 DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
1672 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1677 Metadata *BitStride, StorageType Storage, bool ShouldCreate = true);
1678
1679 TempDICompositeType cloneImpl() const {
1680 return getTemporary(
1688 getRawBitStride());
1689 }
1690
1691public:
1693 DICompositeType,
1694 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1697 DINodeArray Elements, unsigned RuntimeLang,
1698 std::optional<uint32_t> EnumKind, DIType *VTableHolder,
1699 DITemplateParameterArray TemplateParams = nullptr,
1701 Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
1702 Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1703 DINodeArray Annotations = nullptr, DIType *Specification = nullptr,
1707 RuntimeLang, EnumKind, VTableHolder, TemplateParams, Identifier,
1709 BitStride))
1711 DICompositeType,
1712 (unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
1715 Metadata *Elements, unsigned RuntimeLang,
1716 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1719 Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1720 Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1722 Metadata *BitStride = nullptr),
1724 OffsetInBits, Flags, Elements, RuntimeLang, EnumKind, VTableHolder,
1727 BitStride))
1729 DICompositeType,
1730 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1733 DINodeArray Elements, unsigned RuntimeLang,
1734 std::optional<uint32_t> EnumKind, DIType *VTableHolder,
1735 DITemplateParameterArray TemplateParams = nullptr,
1737 Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
1738 Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1739 DINodeArray Annotations = nullptr, DIType *Specification = nullptr,
1743 RuntimeLang, EnumKind, VTableHolder, TemplateParams, Identifier,
1745 BitStride))
1747 DICompositeType,
1748 (unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
1751 Metadata *Elements, unsigned RuntimeLang,
1752 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1753 Metadata *TemplateParams = nullptr, MDString *Identifier = nullptr,
1754 Metadata *Discriminator = nullptr, Metadata *DataLocation = nullptr,
1755 Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1756 Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1758 Metadata *BitStride = nullptr),
1760 OffsetInBits, Flags, Elements, RuntimeLang, EnumKind, VTableHolder,
1763 BitStride))
1764
1765 TempDICompositeType clone() const { return cloneImpl(); }
1766
1767 /// Get a DICompositeType with the given ODR identifier.
1768 ///
1769 /// If \a LLVMContext::isODRUniquingDebugTypes(), gets the mapped
1770 /// DICompositeType for the given ODR \c Identifier. If none exists, creates
1771 /// a new node.
1772 ///
1773 /// Else, returns \c nullptr.
1774 LLVM_ABI static DICompositeType *
1775 getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1776 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1780 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1786 MDString &Identifier);
1787
1788 /// Build a DICompositeType with the given ODR identifier.
1789 ///
1790 /// Looks up the mapped DICompositeType for the given ODR \c Identifier. If
1791 /// it doesn't exist, creates a new one. If it does exist and \a
1792 /// isForwardDecl(), and the new arguments would be a definition, mutates the
1793 /// the type in place. In either case, returns the type.
1794 ///
1795 /// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns
1796 /// nullptr.
1797 LLVM_ABI static DICompositeType *
1798 buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1799 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1803 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1808
1810 DINodeArray getElements() const {
1812 }
1816 DITemplateParameterArray getTemplateParams() const {
1818 }
1820 return getStringOperand(MY_FIRST_OPERAND + 4);
1821 }
1822 unsigned getRuntimeLang() const { return RuntimeLang; }
1823 std::optional<uint32_t> getEnumKind() const { return EnumKind; }
1824
1825 Metadata *getRawBaseType() const { return getOperand(MY_FIRST_OPERAND); }
1826 Metadata *getRawElements() const { return getOperand(MY_FIRST_OPERAND + 1); }
1828 return getOperand(MY_FIRST_OPERAND + 2);
1829 }
1831 return getOperand(MY_FIRST_OPERAND + 3);
1832 }
1834 return getOperandAs<MDString>(MY_FIRST_OPERAND + 4);
1835 }
1837 return getOperand(MY_FIRST_OPERAND + 5);
1838 }
1840 return getOperandAs<DIDerivedType>(MY_FIRST_OPERAND + 5);
1841 }
1843 return getOperand(MY_FIRST_OPERAND + 6);
1844 }
1852 return getOperand(MY_FIRST_OPERAND + 7);
1853 }
1860 Metadata *getRawAllocated() const { return getOperand(MY_FIRST_OPERAND + 8); }
1867 Metadata *getRawRank() const { return getOperand(MY_FIRST_OPERAND + 9); }
1870 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1871 return nullptr;
1872 }
1876
1878 return getOperand(MY_FIRST_OPERAND + 10);
1879 }
1880 DINodeArray getAnnotations() const {
1882 }
1883
1885 return getOperand(MY_FIRST_OPERAND + 11);
1886 }
1890
1891 bool isNameSimplified() const { return getFlags() & FlagNameIsSimplified; }
1892
1894 return getOperand(MY_FIRST_OPERAND + 12);
1895 }
1898 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1899 return nullptr;
1900 }
1901
1902 /// Replace operands.
1903 ///
1904 /// If this \a isUniqued() and not \a isResolved(), on a uniquing collision
1905 /// this will be RAUW'ed and deleted. Use a \a TrackingMDRef to keep track
1906 /// of its movement if necessary.
1907 /// @{
1908 void replaceElements(DINodeArray Elements) {
1909#ifndef NDEBUG
1910 for (DINode *Op : getElements())
1911 assert(is_contained(Elements->operands(), Op) &&
1912 "Lost a member during member list replacement");
1913#endif
1914 replaceOperandWith(MY_FIRST_OPERAND + 1, Elements.get());
1915 }
1916
1918 replaceOperandWith(MY_FIRST_OPERAND + 2, VTableHolder);
1919 }
1920
1921 void replaceTemplateParams(DITemplateParameterArray TemplateParams) {
1922 replaceOperandWith(MY_FIRST_OPERAND + 3, TemplateParams.get());
1923 }
1924 /// @}
1925
1926 static bool classof(const Metadata *MD) {
1927 return MD->getMetadataID() == DICompositeTypeKind;
1928 }
1929};
1930
1931/// Type array for a subprogram.
1932///
1933/// TODO: Fold the array of types in directly as operands.
1934class DISubroutineType : public DIType {
1935 friend class LLVMContextImpl;
1936 friend class MDNode;
1937
1938 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1939
1940 /// The calling convention used with DW_AT_calling_convention. Actually of
1941 /// type dwarf::CallingConvention.
1942 uint8_t CC;
1943
1944 DISubroutineType(LLVMContext &C, StorageType Storage, DIFlags Flags,
1946 ~DISubroutineType() = default;
1947
1948 static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1949 uint8_t CC, DITypeArray TypeArray,
1951 bool ShouldCreate = true) {
1952 return getImpl(Context, Flags, CC, TypeArray.get(), Storage, ShouldCreate);
1953 }
1954 LLVM_ABI static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1957 bool ShouldCreate = true);
1958
1959 TempDISubroutineType cloneImpl() const {
1961 }
1962
1963public:
1964 DEFINE_MDNODE_GET(DISubroutineType,
1965 (DIFlags Flags, uint8_t CC, DITypeArray TypeArray),
1966 (Flags, CC, TypeArray))
1967 DEFINE_MDNODE_GET(DISubroutineType,
1970
1971 TempDISubroutineType clone() const { return cloneImpl(); }
1972 // Returns a new temporary DISubroutineType with updated CC
1973 TempDISubroutineType cloneWithCC(uint8_t CC) const {
1974 auto NewTy = clone();
1975 NewTy->CC = CC;
1976 return NewTy;
1977 }
1978
1979 uint8_t getCC() const { return CC; }
1980
1981 DITypeArray getTypeArray() const {
1983 }
1984
1985 Metadata *getRawTypeArray() const { return getOperand(MY_FIRST_OPERAND); }
1986
1987 static bool classof(const Metadata *MD) {
1988 return MD->getMetadataID() == DISubroutineTypeKind;
1989 }
1990};
1991
1992/// Compile unit.
1993class DICompileUnit : public DIScope {
1994 friend class LLVMContextImpl;
1995 friend class MDNode;
1996
1997public:
2005
2013
2014 LLVM_ABI static std::optional<DebugEmissionKind>
2016 LLVM_ABI static const char *emissionKindString(DebugEmissionKind EK);
2017 LLVM_ABI static std::optional<DebugNameTableKind>
2019 LLVM_ABI static const char *nameTableKindString(DebugNameTableKind PK);
2020
2021private:
2023 unsigned RuntimeVersion;
2025 unsigned EmissionKind;
2026 unsigned NameTableKind;
2027 bool IsOptimized;
2028 bool SplitDebugInlining;
2030 bool RangesBaseAddress;
2031
2034 unsigned RuntimeVersion, unsigned EmissionKind, uint64_t DWOId,
2036 unsigned NameTableKind, bool RangesBaseAddress,
2038 ~DICompileUnit() = default;
2039
2040 static DICompileUnit *
2044 unsigned EmissionKind, DICompositeTypeArray EnumTypes,
2045 DIScopeArray RetainedTypes,
2046 DIGlobalVariableExpressionArray GlobalVariables,
2047 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
2050 StringRef SDK, StorageType Storage, bool ShouldCreate = true) {
2051 return getImpl(
2052 Context, SourceLanguage, File, getCanonicalMDString(Context, Producer),
2055 EnumTypes.get(), RetainedTypes.get(), GlobalVariables.get(),
2058 getCanonicalMDString(Context, SysRoot),
2059 getCanonicalMDString(Context, SDK), Storage, ShouldCreate);
2060 }
2061 LLVM_ABI static DICompileUnit *
2062 getImpl(LLVMContext &Context, DISourceLanguageName SourceLanguage,
2063 Metadata *File, MDString *Producer, bool IsOptimized, MDString *Flags,
2064 unsigned RuntimeVersion, MDString *SplitDebugFilename,
2068 bool DebugInfoForProfiling, unsigned NameTableKind,
2069 bool RangesBaseAddress, MDString *SysRoot, MDString *SDK,
2070 StorageType Storage, bool ShouldCreate = true);
2071
2072 TempDICompileUnit cloneImpl() const {
2073 return getTemporary(
2080 }
2081
2082public:
2083 static void get() = delete;
2084 static void getIfExists() = delete;
2085
2087 DICompileUnit,
2089 bool IsOptimized, StringRef Flags, unsigned RuntimeVersion,
2091 DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
2092 DIGlobalVariableExpressionArray GlobalVariables,
2093 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
2094 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
2095 DebugNameTableKind NameTableKind, bool RangesBaseAddress,
2097 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
2099 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
2100 DebugInfoForProfiling, (unsigned)NameTableKind, RangesBaseAddress,
2101 SysRoot, SDK))
2103 DICompileUnit,
2105 bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
2109 bool SplitDebugInlining, bool DebugInfoForProfiling,
2110 unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot,
2112 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
2114 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
2115 DebugInfoForProfiling, NameTableKind, RangesBaseAddress, SysRoot, SDK))
2116
2117 TempDICompileUnit clone() const { return cloneImpl(); }
2118
2119 DISourceLanguageName getSourceLanguage() const { return SourceLanguage; }
2120 bool isOptimized() const { return IsOptimized; }
2121 bool isDebugInfoForProfiling() const { return DebugInfoForProfiling; }
2122 unsigned getRuntimeVersion() const { return RuntimeVersion; }
2124 return (DebugEmissionKind)EmissionKind;
2125 }
2127 return EmissionKind == DebugDirectivesOnly;
2128 }
2129 bool getDebugInfoForProfiling() const { return DebugInfoForProfiling; }
2131 return (DebugNameTableKind)NameTableKind;
2132 }
2133 bool getRangesBaseAddress() const { return RangesBaseAddress; }
2135 StringRef getFlags() const { return getStringOperand(2); }
2137 DICompositeTypeArray getEnumTypes() const {
2139 }
2140 DIScopeArray getRetainedTypes() const {
2142 }
2143 DIGlobalVariableExpressionArray getGlobalVariables() const {
2145 }
2146 DIImportedEntityArray getImportedEntities() const {
2148 }
2149 DIMacroNodeArray getMacros() const {
2151 }
2152 uint64_t getDWOId() const { return DWOId; }
2153 void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
2154 bool getSplitDebugInlining() const { return SplitDebugInlining; }
2155 void setSplitDebugInlining(bool SplitDebugInlining) {
2156 this->SplitDebugInlining = SplitDebugInlining;
2157 }
2159 StringRef getSDK() const { return getStringOperand(10); }
2160
2166 Metadata *getRawEnumTypes() const { return getOperand(4); }
2170 Metadata *getRawMacros() const { return getOperand(8); }
2173
2174 /// Replace arrays.
2175 ///
2176 /// If this \a isUniqued() and not \a isResolved(), it will be RAUW'ed and
2177 /// deleted on a uniquing collision. In practice, uniquing collisions on \a
2178 /// DICompileUnit should be fairly rare.
2179 /// @{
2180 void replaceEnumTypes(DICompositeTypeArray N) {
2181 replaceOperandWith(4, N.get());
2182 }
2183 void replaceRetainedTypes(DITypeArray N) { replaceOperandWith(5, N.get()); }
2184 void replaceGlobalVariables(DIGlobalVariableExpressionArray N) {
2185 replaceOperandWith(6, N.get());
2186 }
2187 void replaceImportedEntities(DIImportedEntityArray N) {
2188 replaceOperandWith(7, N.get());
2189 }
2190 void replaceMacros(DIMacroNodeArray N) { replaceOperandWith(8, N.get()); }
2191 /// @}
2192
2193 static bool classof(const Metadata *MD) {
2194 return MD->getMetadataID() == DICompileUnitKind;
2195 }
2196};
2197
2198/// A scope for locals.
2199///
2200/// A legal scope for lexical blocks, local variables, and debug info
2201/// locations. Subclasses are \a DISubprogram, \a DILexicalBlock, and \a
2202/// DILexicalBlockFile.
2203class DILocalScope : public DIScope {
2204protected:
2208 ~DILocalScope() = default;
2209
2210public:
2211 /// Get the subprogram for this scope.
2212 ///
2213 /// Return this if it's an \a DISubprogram; otherwise, look up the scope
2214 /// chain.
2216
2217 /// Traverses the scope chain rooted at RootScope until it hits a Subprogram,
2218 /// recreating the chain with "NewSP" instead.
2219 LLVM_ABI static DILocalScope *
2221 LLVMContext &Ctx,
2223
2224 /// Get the first non DILexicalBlockFile scope of this scope.
2225 ///
2226 /// Return this if it's not a \a DILexicalBlockFIle; otherwise, look up the
2227 /// scope chain.
2229
2230 static bool classof(const Metadata *MD) {
2231 return MD->getMetadataID() == DISubprogramKind ||
2232 MD->getMetadataID() == DILexicalBlockKind ||
2233 MD->getMetadataID() == DILexicalBlockFileKind;
2234 }
2235};
2236
2237/// Subprogram description. Uses SubclassData1.
2238class DISubprogram : public DILocalScope {
2239 friend class LLVMContextImpl;
2240 friend class MDNode;
2241
2242 unsigned Line;
2243 unsigned ScopeLine;
2244 unsigned VirtualIndex;
2245
2246 /// In the MS ABI, the implicit 'this' parameter is adjusted in the prologue
2247 /// of method overrides from secondary bases by this amount. It may be
2248 /// negative.
2249 int ThisAdjustment;
2250
2251public:
2252 /// Debug info subprogram flags.
2254#define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID,
2255#define DISP_FLAG_LARGEST_NEEDED
2256#include "llvm/IR/DebugInfoFlags.def"
2257 SPFlagNonvirtual = SPFlagZero,
2258 SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual,
2259 LLVM_MARK_AS_BITMASK_ENUM(SPFlagLargest)
2260 };
2261
2262 LLVM_ABI static DISPFlags getFlag(StringRef Flag);
2263 LLVM_ABI static StringRef getFlagString(DISPFlags Flag);
2264
2265 /// Split up a flags bitfield for easier printing.
2266 ///
2267 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns
2268 /// any remaining (unrecognized) bits.
2269 LLVM_ABI static DISPFlags splitFlags(DISPFlags Flags,
2270 SmallVectorImpl<DISPFlags> &SplitFlags);
2271
2272 // Helper for converting old bitfields to new flags word.
2273 LLVM_ABI static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition,
2274 bool IsOptimized,
2275 unsigned Virtuality = SPFlagNonvirtual,
2276 bool IsMainSubprogram = false);
2277
2278private:
2279 DIFlags Flags;
2280 DISPFlags SPFlags;
2281
2282 DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
2283 unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
2284 DIFlags Flags, DISPFlags SPFlags, bool UsesKeyInstructions,
2286 ~DISubprogram() = default;
2287
2288 static DISubprogram *
2289 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
2290 StringRef LinkageName, DIFile *File, unsigned Line,
2292 unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
2293 DISPFlags SPFlags, DICompileUnit *Unit,
2294 DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
2295 DINodeArray RetainedNodes, DITypeArray ThrownTypes,
2298 bool ShouldCreate = true) {
2299 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
2300 getCanonicalMDString(Context, LinkageName), File, Line, Type,
2302 Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
2303 RetainedNodes.get(), ThrownTypes.get(), Annotations.get(),
2305 UsesKeyInstructions, Storage, ShouldCreate);
2306 }
2307
2308 LLVM_ABI static DISubprogram *
2309 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
2310 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
2311 unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
2312 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
2315 MDString *TargetFuncName, bool UsesKeyInstructions,
2316 StorageType Storage, bool ShouldCreate = true);
2317
2318 TempDISubprogram cloneImpl() const {
2320 getFile(), getLine(), getType(), getScopeLine(),
2321 getContainingType(), getVirtualIndex(),
2322 getThisAdjustment(), getFlags(), getSPFlags(),
2323 getUnit(), getTemplateParams(), getDeclaration(),
2324 getRetainedNodes(), getThrownTypes(), getAnnotations(),
2325 getTargetFuncName(), getKeyInstructionsEnabled());
2326 }
2327
2328public:
2330 DISubprogram,
2332 unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
2333 DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
2334 DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
2335 DITemplateParameterArray TemplateParams = nullptr,
2336 DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
2337 DITypeArray ThrownTypes = nullptr, DINodeArray Annotations = nullptr,
2338 StringRef TargetFuncName = "", bool UsesKeyInstructions = false),
2339 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
2340 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
2343
2345 DISubprogram,
2347 unsigned Line, Metadata *Type, unsigned ScopeLine,
2348 Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
2349 DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
2353 bool UsesKeyInstructions = false),
2354 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
2355 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
2358
2359 TempDISubprogram clone() const { return cloneImpl(); }
2360
2361 /// Returns a new temporary DISubprogram with updated Flags
2362 TempDISubprogram cloneWithFlags(DIFlags NewFlags) const {
2363 auto NewSP = clone();
2364 NewSP->Flags = NewFlags;
2365 return NewSP;
2366 }
2367
2368 bool getKeyInstructionsEnabled() const { return SubclassData1; }
2369
2370public:
2371 unsigned getLine() const { return Line; }
2372 unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; }
2373 unsigned getVirtualIndex() const { return VirtualIndex; }
2374 int getThisAdjustment() const { return ThisAdjustment; }
2375 unsigned getScopeLine() const { return ScopeLine; }
2376 void setScopeLine(unsigned L) {
2377 assert(isDistinct());
2378 ScopeLine = L;
2379 }
2380 DIFlags getFlags() const { return Flags; }
2381 DISPFlags getSPFlags() const { return SPFlags; }
2382 bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; }
2383 bool isDefinition() const { return getSPFlags() & SPFlagDefinition; }
2384 bool isOptimized() const { return getSPFlags() & SPFlagOptimized; }
2385 bool isMainSubprogram() const { return getSPFlags() & SPFlagMainSubprogram; }
2386
2387 bool isArtificial() const { return getFlags() & FlagArtificial; }
2388 bool isPrivate() const {
2389 return (getFlags() & FlagAccessibility) == FlagPrivate;
2390 }
2391 bool isProtected() const {
2392 return (getFlags() & FlagAccessibility) == FlagProtected;
2393 }
2394 bool isPublic() const {
2395 return (getFlags() & FlagAccessibility) == FlagPublic;
2396 }
2397 bool isExplicit() const { return getFlags() & FlagExplicit; }
2398 bool isPrototyped() const { return getFlags() & FlagPrototyped; }
2399 bool isNameSimplified() const { return getFlags() & FlagNameIsSimplified; }
2400 bool areAllCallsDescribed() const {
2401 return getFlags() & FlagAllCallsDescribed;
2402 }
2403 bool isPure() const { return getSPFlags() & SPFlagPure; }
2404 bool isElemental() const { return getSPFlags() & SPFlagElemental; }
2405 bool isRecursive() const { return getSPFlags() & SPFlagRecursive; }
2406 bool isObjCDirect() const { return getSPFlags() & SPFlagObjCDirect; }
2407
2408 /// Check if this is deleted member function.
2409 ///
2410 /// Return true if this subprogram is a C++11 special
2411 /// member function declared deleted.
2412 bool isDeleted() const { return getSPFlags() & SPFlagDeleted; }
2413
2414 /// Check if this is reference-qualified.
2415 ///
2416 /// Return true if this subprogram is a C++11 reference-qualified non-static
2417 /// member function (void foo() &).
2418 bool isLValueReference() const { return getFlags() & FlagLValueReference; }
2419
2420 /// Check if this is rvalue-reference-qualified.
2421 ///
2422 /// Return true if this subprogram is a C++11 rvalue-reference-qualified
2423 /// non-static member function (void foo() &&).
2424 bool isRValueReference() const { return getFlags() & FlagRValueReference; }
2425
2426 /// Check if this is marked as noreturn.
2427 ///
2428 /// Return true if this subprogram is C++11 noreturn or C11 _Noreturn
2429 bool isNoReturn() const { return getFlags() & FlagNoReturn; }
2430
2431 // Check if this routine is a compiler-generated thunk.
2432 //
2433 // Returns true if this subprogram is a thunk generated by the compiler.
2434 bool isThunk() const { return getFlags() & FlagThunk; }
2435
2436 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
2437
2438 StringRef getName() const { return getStringOperand(2); }
2439 StringRef getLinkageName() const { return getStringOperand(3); }
2440 /// Only used by clients of CloneFunction, and only right after the cloning.
2441 void replaceLinkageName(MDString *LN) { replaceOperandWith(3, LN); }
2442
2443 DISubroutineType *getType() const {
2444 return cast_or_null<DISubroutineType>(getRawType());
2445 }
2446 DIType *getContainingType() const {
2447 return cast_or_null<DIType>(getRawContainingType());
2448 }
2449 void replaceType(DISubroutineType *Ty) {
2450 assert(isDistinct() && "Only distinct nodes can mutate");
2451 replaceOperandWith(4, Ty);
2452 }
2453
2454 DICompileUnit *getUnit() const {
2455 return cast_or_null<DICompileUnit>(getRawUnit());
2456 }
2457 void replaceUnit(DICompileUnit *CU) { replaceOperandWith(5, CU); }
2458 DITemplateParameterArray getTemplateParams() const {
2459 return cast_or_null<MDTuple>(getRawTemplateParams());
2460 }
2461 DISubprogram *getDeclaration() const {
2462 return cast_or_null<DISubprogram>(getRawDeclaration());
2463 }
2464 void replaceDeclaration(DISubprogram *Decl) { replaceOperandWith(6, Decl); }
2465 DINodeArray getRetainedNodes() const {
2466 return cast_or_null<MDTuple>(getRawRetainedNodes());
2467 }
2468 DITypeArray getThrownTypes() const {
2469 return cast_or_null<MDTuple>(getRawThrownTypes());
2470 }
2471 DINodeArray getAnnotations() const {
2472 return cast_or_null<MDTuple>(getRawAnnotations());
2473 }
2474 StringRef getTargetFuncName() const {
2475 return (getRawTargetFuncName()) ? getStringOperand(12) : StringRef();
2476 }
2477
2478 Metadata *getRawScope() const { return getOperand(1); }
2479 MDString *getRawName() const { return getOperandAs<MDString>(2); }
2480 MDString *getRawLinkageName() const { return getOperandAs<MDString>(3); }
2481 Metadata *getRawType() const { return getOperand(4); }
2482 Metadata *getRawUnit() const { return getOperand(5); }
2483 Metadata *getRawDeclaration() const { return getOperand(6); }
2484 Metadata *getRawRetainedNodes() const { return getOperand(7); }
2485 Metadata *getRawContainingType() const {
2486 return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr;
2487 }
2488 Metadata *getRawTemplateParams() const {
2489 return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr;
2490 }
2491 Metadata *getRawThrownTypes() const {
2492 return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr;
2493 }
2494 Metadata *getRawAnnotations() const {
2495 return getNumOperands() > 11 ? getOperandAs<Metadata>(11) : nullptr;
2496 }
2497 MDString *getRawTargetFuncName() const {
2498 return getNumOperands() > 12 ? getOperandAs<MDString>(12) : nullptr;
2499 }
2500
2501 void replaceRawLinkageName(MDString *LinkageName) {
2503 }
2504 void replaceRetainedNodes(DINodeArray N) {
2505 replaceOperandWith(7, N.get());
2506 }
2507
2508 /// For the given retained node of DISubprogram, applies one of the
2509 /// given functions depending on the type of the node.
2510 template <typename T, typename MetadataT, typename FuncLVT,
2511 typename FuncLabelT, typename FuncImportedEntityT,
2512 typename FuncTypeT, typename FuncUnknownT>
2513 static T visitRetainedNode(MetadataT *N, FuncLVT &&FuncLV,
2514 FuncLabelT &&FuncLabel,
2515 FuncImportedEntityT &&FuncIE, FuncTypeT &&FuncType,
2516 FuncUnknownT &&FuncUnknown) {
2517 static_assert(std::is_base_of_v<Metadata, MetadataT>,
2518 "N must point to Metadata or const Metadata");
2519
2520 if (auto *LV = dyn_cast<DILocalVariable>(N))
2521 return FuncLV(LV);
2522 if (auto *L = dyn_cast<DILabel>(N))
2523 return FuncLabel(L);
2524 if (auto *IE = dyn_cast<DIImportedEntity>(N))
2525 return FuncIE(IE);
2526 if (auto *Ty = dyn_cast<DIType>(N))
2527 return FuncType(Ty);
2528 return FuncUnknown(N);
2529 }
2530
2531 /// Returns the scope of subprogram's retainedNodes.
2532 static const DILocalScope *getRetainedNodeScope(const MDNode *N);
2534 // For use in Verifier.
2535 static const DIScope *getRawRetainedNodeScope(const MDNode *N);
2537
2538 /// For each retained node, applies one of the given functions depending
2539 /// on the type of a node.
2540 template <typename FuncLVT, typename FuncLabelT, typename FuncImportedEntityT,
2541 typename FuncTypeT>
2542 void forEachRetainedNode(FuncLVT &&FuncLV, FuncLabelT &&FuncLabel,
2543 FuncImportedEntityT &&FuncIE, FuncTypeT &&FuncType) {
2544 for (MDNode *N : getRetainedNodes())
2545 visitRetainedNode<void>(
2546 N, FuncLV, FuncLabel, FuncIE, FuncType,
2547 [](auto *N) { llvm_unreachable("Unexpected retained node!"); });
2548 }
2549
2550 /// When IR modules are merged, typically during LTO, the merged module
2551 /// may contain several types having the same linkageName. They are
2552 /// supposed to represent the same type included by multiple source code
2553 /// files from a single header file.
2554 ///
2555 /// DebugTypeODRUniquing feature uniques (deduplicates) such types
2556 /// based on their linkageName during metadata loading, to speed up
2557 /// compilation and reduce debug info size.
2558 ///
2559 /// However, since function-local types are tracked in DISubprogram's
2560 /// retainedNodes field, a single local type may be referenced by multiple
2561 /// DISubprograms via retainedNodes as the result of DebugTypeODRUniquing.
2562 /// But retainedNodes field of a DISubprogram is meant to hold only
2563 /// subprogram's own local entities, therefore such references may
2564 /// cause crashes.
2565 ///
2566 /// To address this problem, this method is called for each new subprogram
2567 /// after module loading. It removes references to types belonging
2568 /// to other DISubprograms from a subprogram's retainedNodes list.
2569 /// If a corresponding IR function refers to local scopes from another
2570 /// subprogram, emitted debug info (e.g. DWARF) should rely
2571 /// on cross-subprogram references (and cross-CU references, as subprograms
2572 /// may belong to different compile units). This is also a drawback:
2573 /// when a subprogram refers to types that are local to another subprogram,
2574 /// it is more complicated for debugger to properly discover local types
2575 /// of a current scope for expression evaluation.
2576 void cleanupRetainedNodes();
2577
2578 /// Calls SP->cleanupRetainedNodes() for a range of DISubprograms.
2579 template <typename RangeT>
2580 static void cleanupRetainedNodes(const RangeT &NewDistinctSPs) {
2581 for (DISubprogram *SP : NewDistinctSPs)
2582 SP->cleanupRetainedNodes();
2583 }
2584
2585 /// Check if this subprogram describes the given function.
2586 ///
2587 /// FIXME: Should this be looking through bitcasts?
2588 LLVM_ABI bool describes(const Function *F) const;
2589
2590 static bool classof(const Metadata *MD) {
2591 return MD->getMetadataID() == DISubprogramKind;
2592 }
2593};
2594
2595/// Debug location.
2596///
2597/// A debug location in source code, used for debug info and otherwise.
2598///
2599/// Uses the SubclassData1, SubclassData16 and SubclassData32
2600/// Metadata slots.
2601
2602class DILocation : public MDNode {
2603 friend class LLVMContextImpl;
2604 friend class MDNode;
2605 uint64_t AtomGroup : 61;
2606 uint64_t AtomRank : 3;
2607
2608 DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
2609 unsigned Column, uint64_t AtomGroup, uint8_t AtomRank,
2611 ~DILocation() { dropAllReferences(); }
2612
2613 LLVM_ABI static DILocation *
2614 getImpl(LLVMContext &Context, unsigned Line, unsigned Column, Metadata *Scope,
2616 uint8_t AtomRank, StorageType Storage, bool ShouldCreate = true);
2617 static DILocation *getImpl(LLVMContext &Context, unsigned Line,
2618 unsigned Column, DILocalScope *Scope,
2621 StorageType Storage, bool ShouldCreate = true) {
2622 return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope),
2623 static_cast<Metadata *>(InlinedAt), ImplicitCode, AtomGroup,
2624 AtomRank, Storage, ShouldCreate);
2625 }
2626
2627 TempDILocation cloneImpl() const {
2628 // Get the raw scope/inlinedAt since it is possible to invoke this on
2629 // a DILocation containing temporary metadata.
2630 return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
2631 getRawInlinedAt(), isImplicitCode(), getAtomGroup(),
2632 getAtomRank());
2633 }
2634
2635public:
2636 uint64_t getAtomGroup() const { return AtomGroup; }
2637 uint8_t getAtomRank() const { return AtomRank; }
2638
2639 const DILocation *getWithoutAtom() const {
2640 if (!getAtomGroup() && !getAtomRank())
2641 return this;
2642 return get(getContext(), getLine(), getColumn(), getScope(), getInlinedAt(),
2643 isImplicitCode());
2644 }
2645
2646 // Disallow replacing operands.
2647 void replaceOperandWith(unsigned I, Metadata *New) = delete;
2648
2650 (unsigned Line, unsigned Column, Metadata *Scope,
2651 Metadata *InlinedAt = nullptr, bool ImplicitCode = false,
2652 uint64_t AtomGroup = 0, uint8_t AtomRank = 0),
2653 (Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
2654 AtomRank))
2655 DEFINE_MDNODE_GET(DILocation,
2656 (unsigned Line, unsigned Column, DILocalScope *Scope,
2657 DILocation *InlinedAt = nullptr, bool ImplicitCode = false,
2658 uint64_t AtomGroup = 0, uint8_t AtomRank = 0),
2659 (Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
2660 AtomRank))
2661
2662 /// Return a (temporary) clone of this.
2663 TempDILocation clone() const { return cloneImpl(); }
2664
2665 unsigned getLine() const { return SubclassData32; }
2666 unsigned getColumn() const { return SubclassData16; }
2667 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }
2668
2669 /// Return the linkage name of Subprogram. If the linkage name is empty,
2670 /// return scope name (the demangled name).
2671 StringRef getSubprogramLinkageName() const {
2672 DISubprogram *SP = getScope()->getSubprogram();
2673 if (!SP)
2674 return "";
2675 auto Name = SP->getLinkageName();
2676 if (!Name.empty())
2677 return Name;
2678 return SP->getName();
2679 }
2680
2681 DILocation *getInlinedAt() const {
2683 }
2684
2685 /// Check if the location corresponds to an implicit code.
2686 /// When the ImplicitCode flag is true, it means that the Instruction
2687 /// with this DILocation has been added by the front-end but it hasn't been
2688 /// written explicitly by the user (e.g. cleanup stuff in C++ put on a closing
2689 /// bracket). It's useful for code coverage to not show a counter on "empty"
2690 /// lines.
2691 bool isImplicitCode() const { return SubclassData1; }
2692 void setImplicitCode(bool ImplicitCode) { SubclassData1 = ImplicitCode; }
2693
2694 DIFile *getFile() const { return getScope()->getFile(); }
2695 StringRef getFilename() const { return getScope()->getFilename(); }
2696 StringRef getDirectory() const { return getScope()->getDirectory(); }
2697 std::optional<StringRef> getSource() const { return getScope()->getSource(); }
2698
2699 /// Walk through \a getInlinedAt() and return the \a DILocation of the
2700 /// outermost call site in the inlining chain.
2701 const DILocation *getInlinedAtLocation() const {
2702 const DILocation *Current = this;
2703 while (const DILocation *Next = Current->getInlinedAt())
2704 Current = Next;
2705 return Current;
2706 }
2707
2708 // Return the \a DILocalScope of the outermost call site in the inlining
2709 // chain.
2710 DILocalScope *getInlinedAtScope() const {
2711 return getInlinedAtLocation()->getScope();
2712 }
2713
2714 /// Get the DWARF discriminator.
2715 ///
2716 /// DWARF discriminators distinguish identical file locations between
2717 /// instructions that are on different basic blocks.
2718 ///
2719 /// There are 3 components stored in discriminator, from lower bits:
2720 ///
2721 /// Base discriminator: assigned by AddDiscriminators pass to identify IRs
2722 /// that are defined by the same source line, but
2723 /// different basic blocks.
2724 /// Duplication factor: assigned by optimizations that will scale down
2725 /// the execution frequency of the original IR.
2726 /// Copy Identifier: assigned by optimizations that clones the IR.
2727 /// Each copy of the IR will be assigned an identifier.
2728 ///
2729 /// Encoding:
2730 ///
2731 /// The above 3 components are encoded into a 32bit unsigned integer in
2732 /// order. If the lowest bit is 1, the current component is empty, and the
2733 /// next component will start in the next bit. Otherwise, the current
2734 /// component is non-empty, and its content starts in the next bit. The
2735 /// value of each components is either 5 bit or 12 bit: if the 7th bit
2736 /// is 0, the bit 2~6 (5 bits) are used to represent the component; if the
2737 /// 7th bit is 1, the bit 2~6 (5 bits) and 8~14 (7 bits) are combined to
2738 /// represent the component. Thus, the number of bits used for a component
2739 /// is either 0 (if it and all the next components are empty); 1 - if it is
2740 /// empty; 7 - if its value is up to and including 0x1f (lsb and msb are both
2741 /// 0); or 14, if its value is up to and including 0x1ff. Note that the last
2742 /// component is also capped at 0x1ff, even in the case when both first
2743 /// components are 0, and we'd technically have 29 bits available.
2744 ///
2745 /// For precise control over the data being encoded in the discriminator,
2746 /// use encodeDiscriminator/decodeDiscriminator.
2747
2748 inline unsigned getDiscriminator() const;
2749
2750 // For the regular discriminator, it stands for all empty components if all
2751 // the lowest 3 bits are non-zero and all higher 29 bits are unused(zero by
2752 // default). Here we fully leverage the higher 29 bits for pseudo probe use.
2753 // This is the format:
2754 // [2:0] - 0x7
2755 // [31:3] - pseudo probe fields guaranteed to be non-zero as a whole
2756 // So if the lower 3 bits is non-zero and the others has at least one
2757 // non-zero bit, it guarantees to be a pseudo probe discriminator
2758 inline static bool isPseudoProbeDiscriminator(unsigned Discriminator) {
2759 return ((Discriminator & 0x7) == 0x7) && (Discriminator & 0xFFFFFFF8);
2760 }
2761
2762 /// Returns a new DILocation with updated \p Discriminator.
2763 inline const DILocation *cloneWithDiscriminator(unsigned Discriminator) const;
2764
2765 /// Returns a new DILocation with updated base discriminator \p BD. Only the
2766 /// base discriminator is set in the new DILocation, the other encoded values
2767 /// are elided.
2768 /// If the discriminator cannot be encoded, the function returns std::nullopt.
2769 inline std::optional<const DILocation *>
2770 cloneWithBaseDiscriminator(unsigned BD) const;
2771
2772 /// Returns the duplication factor stored in the discriminator, or 1 if no
2773 /// duplication factor (or 0) is encoded.
2774 inline unsigned getDuplicationFactor() const;
2775
2776 /// Returns the copy identifier stored in the discriminator.
2777 inline unsigned getCopyIdentifier() const;
2778
2779 /// Returns the base discriminator stored in the discriminator.
2780 inline unsigned getBaseDiscriminator() const;
2781
2782 /// Returns a new DILocation with duplication factor \p DF * current
2783 /// duplication factor encoded in the discriminator. The current duplication
2784 /// factor is as defined by getDuplicationFactor().
2785 /// Returns std::nullopt if encoding failed.
2786 inline std::optional<const DILocation *>
2788
2789 /// Attempts to merge \p LocA and \p LocB into a single location; see
2790 /// DebugLoc::getMergedLocation for more details.
2791 /// NB: When merging the locations of instructions, prefer to use
2792 /// DebugLoc::getMergedLocation(), as an instruction's DebugLoc may contain
2793 /// additional metadata that will not be preserved when merging the unwrapped
2794 /// DILocations.
2796 DILocation *LocB);
2797
2798 /// Try to combine the vector of locations passed as input in a single one.
2799 /// This function applies getMergedLocation() repeatedly left-to-right.
2800 /// NB: When merging the locations of instructions, prefer to use
2801 /// DebugLoc::getMergedLocations(), as an instruction's DebugLoc may contain
2802 /// additional metadata that will not be preserved when merging the unwrapped
2803 /// DILocations.
2804 ///
2805 /// \p Locs: The locations to be merged.
2807
2808 /// Return the masked discriminator value for an input discrimnator value D
2809 /// (i.e. zero out the (B+1)-th and above bits for D (B is 0-base).
2810 // Example: an input of (0x1FF, 7) returns 0xFF.
2811 static unsigned getMaskedDiscriminator(unsigned D, unsigned B) {
2812 return (D & getN1Bits(B));
2813 }
2814
2815 /// Return the bits used for base discriminators.
2816 static unsigned getBaseDiscriminatorBits() { return getBaseFSBitEnd(); }
2817
2818 /// Returns the base discriminator for a given encoded discriminator \p D.
2819 static unsigned
2821 bool IsFSDiscriminator = false) {
2822 // Extract the dwarf base discriminator if it's encoded in the pseudo probe
2823 // discriminator.
2825 auto DwarfBaseDiscriminator =
2827 if (DwarfBaseDiscriminator)
2828 return *DwarfBaseDiscriminator;
2829 // Return the probe id instead of zero for a pseudo probe discriminator.
2830 // This should help differenciate callsites with same line numbers to
2831 // achieve a decent AutoFDO profile under -fpseudo-probe-for-profiling,
2832 // where the original callsite dwarf discriminator is overwritten by
2833 // callsite probe information.
2835 }
2836
2837 if (IsFSDiscriminator)
2840 }
2841
2842 /// Raw encoding of the discriminator. APIs such as cloneWithDuplicationFactor
2843 /// have certain special case behavior (e.g. treating empty duplication factor
2844 /// as the value '1').
2845 /// This API, in conjunction with cloneWithDiscriminator, may be used to
2846 /// encode the raw values provided.
2847 ///
2848 /// \p BD: base discriminator
2849 /// \p DF: duplication factor
2850 /// \p CI: copy index
2851 ///
2852 /// The return is std::nullopt if the values cannot be encoded in 32 bits -
2853 /// for example, values for BD or DF larger than 12 bits. Otherwise, the
2854 /// return is the encoded value.
2855 LLVM_ABI static std::optional<unsigned>
2856 encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI);
2857
2858 /// Raw decoder for values in an encoded discriminator D.
2859 LLVM_ABI static void decodeDiscriminator(unsigned D, unsigned &BD,
2860 unsigned &DF, unsigned &CI);
2861
2862 /// Returns the duplication factor for a given encoded discriminator \p D, or
2863 /// 1 if no value or 0 is encoded.
2864 static unsigned getDuplicationFactorFromDiscriminator(unsigned D) {
2866 return 1;
2868 unsigned Ret = getUnsignedFromPrefixEncoding(D);
2869 if (Ret == 0)
2870 return 1;
2871 return Ret;
2872 }
2873
2874 /// Returns the copy identifier for a given encoded discriminator \p D.
2879
2880 Metadata *getRawScope() const { return getOperand(0); }
2882 if (getNumOperands() == 2)
2883 return getOperand(1);
2884 return nullptr;
2885 }
2886
2887 static bool classof(const Metadata *MD) {
2888 return MD->getMetadataID() == DILocationKind;
2889 }
2890};
2891
2893protected:
2897
2898public:
2900
2901 Metadata *getRawScope() const { return getOperand(1); }
2902
2903 void replaceScope(DIScope *Scope) {
2904 assert(!isUniqued());
2905 setOperand(1, Scope);
2906 }
2907
2908 static bool classof(const Metadata *MD) {
2909 return MD->getMetadataID() == DILexicalBlockKind ||
2910 MD->getMetadataID() == DILexicalBlockFileKind;
2911 }
2912};
2913
2914/// Debug lexical block.
2915///
2916/// Uses the SubclassData32 Metadata slot.
2917class DILexicalBlock : public DILexicalBlockBase {
2918 friend class LLVMContextImpl;
2919 friend class MDNode;
2920
2921 uint16_t Column;
2922
2923 DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line,
2924 unsigned Column, ArrayRef<Metadata *> Ops)
2925 : DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops),
2926 Column(Column) {
2928 assert(Column < (1u << 16) && "Expected 16-bit column");
2929 }
2930 ~DILexicalBlock() = default;
2931
2932 static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope,
2933 DIFile *File, unsigned Line, unsigned Column,
2935 bool ShouldCreate = true) {
2936 return getImpl(Context, static_cast<Metadata *>(Scope),
2937 static_cast<Metadata *>(File), Line, Column, Storage,
2938 ShouldCreate);
2939 }
2940
2941 LLVM_ABI static DILexicalBlock *getImpl(LLVMContext &Context, Metadata *Scope,
2942 Metadata *File, unsigned Line,
2943 unsigned Column, StorageType Storage,
2944 bool ShouldCreate = true);
2945
2946 TempDILexicalBlock cloneImpl() const {
2948 getColumn());
2949 }
2950
2951public:
2952 DEFINE_MDNODE_GET(DILexicalBlock,
2953 (DILocalScope * Scope, DIFile *File, unsigned Line,
2954 unsigned Column),
2955 (Scope, File, Line, Column))
2956 DEFINE_MDNODE_GET(DILexicalBlock,
2958 unsigned Column),
2959 (Scope, File, Line, Column))
2960
2961 TempDILexicalBlock clone() const { return cloneImpl(); }
2962
2963 unsigned getLine() const { return SubclassData32; }
2964 unsigned getColumn() const { return Column; }
2965
2966 static bool classof(const Metadata *MD) {
2967 return MD->getMetadataID() == DILexicalBlockKind;
2968 }
2969};
2970
2971class DILexicalBlockFile : public DILexicalBlockBase {
2972 friend class LLVMContextImpl;
2973 friend class MDNode;
2974
2975 DILexicalBlockFile(LLVMContext &C, StorageType Storage,
2977 : DILexicalBlockBase(C, DILexicalBlockFileKind, Storage, Ops) {
2979 }
2980 ~DILexicalBlockFile() = default;
2981
2982 static DILexicalBlockFile *getImpl(LLVMContext &Context, DILocalScope *Scope,
2983 DIFile *File, unsigned Discriminator,
2985 bool ShouldCreate = true) {
2986 return getImpl(Context, static_cast<Metadata *>(Scope),
2987 static_cast<Metadata *>(File), Discriminator, Storage,
2988 ShouldCreate);
2989 }
2990
2991 LLVM_ABI static DILexicalBlockFile *getImpl(LLVMContext &Context,
2992 Metadata *Scope, Metadata *File,
2993 unsigned Discriminator,
2995 bool ShouldCreate = true);
2996
2997 TempDILexicalBlockFile cloneImpl() const {
2998 return getTemporary(getContext(), getScope(), getFile(),
3000 }
3001
3002public:
3003 DEFINE_MDNODE_GET(DILexicalBlockFile,
3005 unsigned Discriminator),
3007 DEFINE_MDNODE_GET(DILexicalBlockFile,
3010
3011 TempDILexicalBlockFile clone() const { return cloneImpl(); }
3012 unsigned getDiscriminator() const { return SubclassData32; }
3013
3014 static bool classof(const Metadata *MD) {
3015 return MD->getMetadataID() == DILexicalBlockFileKind;
3016 }
3017};
3018
3019unsigned DILocation::getDiscriminator() const {
3020 if (auto *F = dyn_cast<DILexicalBlockFile>(getScope()))
3021 return F->getDiscriminator();
3022 return 0;
3023}
3024
3025const DILocation *
3026DILocation::cloneWithDiscriminator(unsigned Discriminator) const {
3027 DIScope *Scope = getScope();
3028 // Skip all parent DILexicalBlockFile that already have a discriminator
3029 // assigned. We do not want to have nested DILexicalBlockFiles that have
3030 // multiple discriminators because only the leaf DILexicalBlockFile's
3031 // dominator will be used.
3032 for (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope);
3033 LBF && LBF->getDiscriminator() != 0;
3035 Scope = LBF->getScope();
3036 DILexicalBlockFile *NewScope =
3037 DILexicalBlockFile::get(getContext(), Scope, getFile(), Discriminator);
3038 return DILocation::get(getContext(), getLine(), getColumn(), NewScope,
3039 getInlinedAt(), isImplicitCode(), getAtomGroup(),
3040 getAtomRank());
3041}
3042
3044 return getBaseDiscriminatorFromDiscriminator(getDiscriminator(),
3046}
3047
3049 return getDuplicationFactorFromDiscriminator(getDiscriminator());
3050}
3051
3053 return getCopyIdentifierFromDiscriminator(getDiscriminator());
3054}
3055
3056std::optional<const DILocation *>
3058 // Do not interfere with pseudo probes. Pseudo probe at a callsite uses
3059 // the dwarf discriminator to store pseudo probe related information,
3060 // such as the probe id.
3061 if (isPseudoProbeDiscriminator(getDiscriminator()))
3062 return this;
3063
3064 unsigned BD, DF, CI;
3065
3067 BD = getBaseDiscriminator();
3068 if (D == BD)
3069 return this;
3070 return cloneWithDiscriminator(D);
3071 }
3072
3073 decodeDiscriminator(getDiscriminator(), BD, DF, CI);
3074 if (D == BD)
3075 return this;
3076 if (std::optional<unsigned> Encoded = encodeDiscriminator(D, DF, CI))
3077 return cloneWithDiscriminator(*Encoded);
3078 return std::nullopt;
3079}
3080
3081std::optional<const DILocation *>
3083 assert(!EnableFSDiscriminator && "FSDiscriminator should not call this.");
3084 // Do no interfere with pseudo probes. Pseudo probe doesn't need duplication
3085 // factor support as samples collected on cloned probes will be aggregated.
3086 // Also pseudo probe at a callsite uses the dwarf discriminator to store
3087 // pseudo probe related information, such as the probe id.
3088 if (isPseudoProbeDiscriminator(getDiscriminator()))
3089 return this;
3090
3092 if (DF <= 1)
3093 return this;
3094
3095 unsigned BD = getBaseDiscriminator();
3096 unsigned CI = getCopyIdentifier();
3097 if (std::optional<unsigned> D = encodeDiscriminator(BD, DF, CI))
3098 return cloneWithDiscriminator(*D);
3099 return std::nullopt;
3100}
3101
3102/// Debug lexical block.
3103///
3104/// Uses the SubclassData1 Metadata slot.
3105class DINamespace : public DIScope {
3106 friend class LLVMContextImpl;
3107 friend class MDNode;
3108
3109 DINamespace(LLVMContext &Context, StorageType Storage, bool ExportSymbols,
3111 ~DINamespace() = default;
3112
3113 static DINamespace *getImpl(LLVMContext &Context, DIScope *Scope,
3115 StorageType Storage, bool ShouldCreate = true) {
3116 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
3117 ExportSymbols, Storage, ShouldCreate);
3118 }
3119 LLVM_ABI static DINamespace *getImpl(LLVMContext &Context, Metadata *Scope,
3122 bool ShouldCreate = true);
3123
3124 TempDINamespace cloneImpl() const {
3125 return getTemporary(getContext(), getScope(), getName(),
3127 }
3128
3129public:
3133 DEFINE_MDNODE_GET(DINamespace,
3136
3137 TempDINamespace clone() const { return cloneImpl(); }
3138
3139 bool getExportSymbols() const { return SubclassData1; }
3141 StringRef getName() const { return getStringOperand(2); }
3142
3143 Metadata *getRawScope() const { return getOperand(1); }
3145
3146 static bool classof(const Metadata *MD) {
3147 return MD->getMetadataID() == DINamespaceKind;
3148 }
3149};
3150
3151/// Represents a module in the programming language, for example, a Clang
3152/// module, or a Fortran module.
3153///
3154/// Uses the SubclassData1 and SubclassData32 Metadata slots.
3155class DIModule : public DIScope {
3156 friend class LLVMContextImpl;
3157 friend class MDNode;
3158
3159 DIModule(LLVMContext &Context, StorageType Storage, unsigned LineNo,
3160 bool IsDecl, ArrayRef<Metadata *> Ops);
3161 ~DIModule() = default;
3162
3163 static DIModule *getImpl(LLVMContext &Context, DIFile *File, DIScope *Scope,
3166 unsigned LineNo, bool IsDecl, StorageType Storage,
3167 bool ShouldCreate = true) {
3168 return getImpl(Context, File, Scope, getCanonicalMDString(Context, Name),
3171 getCanonicalMDString(Context, APINotesFile), LineNo, IsDecl,
3172 Storage, ShouldCreate);
3173 }
3174 LLVM_ABI static DIModule *
3175 getImpl(LLVMContext &Context, Metadata *File, Metadata *Scope, MDString *Name,
3177 MDString *APINotesFile, unsigned LineNo, bool IsDecl,
3178 StorageType Storage, bool ShouldCreate = true);
3179
3180 TempDIModule cloneImpl() const {
3182 getConfigurationMacros(), getIncludePath(),
3183 getAPINotesFile(), getLineNo(), getIsDecl());
3184 }
3185
3186public:
3190 StringRef APINotesFile, unsigned LineNo,
3191 bool IsDecl = false),
3193 APINotesFile, LineNo, IsDecl))
3194 DEFINE_MDNODE_GET(DIModule,
3198 bool IsDecl = false),
3200 APINotesFile, LineNo, IsDecl))
3201
3202 TempDIModule clone() const { return cloneImpl(); }
3203
3204 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
3205 StringRef getName() const { return getStringOperand(2); }
3206 StringRef getConfigurationMacros() const { return getStringOperand(3); }
3207 StringRef getIncludePath() const { return getStringOperand(4); }
3208 StringRef getAPINotesFile() const { return getStringOperand(5); }
3209 unsigned getLineNo() const { return SubclassData32; }
3210 bool getIsDecl() const { return SubclassData1; }
3211
3212 Metadata *getRawScope() const { return getOperand(1); }
3213 MDString *getRawName() const { return getOperandAs<MDString>(2); }
3214 MDString *getRawConfigurationMacros() const {
3215 return getOperandAs<MDString>(3);
3216 }
3217 MDString *getRawIncludePath() const { return getOperandAs<MDString>(4); }
3218 MDString *getRawAPINotesFile() const { return getOperandAs<MDString>(5); }
3219
3220 static bool classof(const Metadata *MD) {
3221 return MD->getMetadataID() == DIModuleKind;
3222 }
3223};
3224
3225/// Base class for template parameters.
3226///
3227/// Uses the SubclassData1 Metadata slot.
3229protected:
3231 unsigned Tag, bool IsDefault, ArrayRef<Metadata *> Ops)
3232 : DINode(Context, ID, Storage, Tag, Ops) {
3233 SubclassData1 = IsDefault;
3234 }
3236
3237public:
3238 StringRef getName() const { return getStringOperand(0); }
3240
3242 Metadata *getRawType() const { return getOperand(1); }
3243 bool isDefault() const { return SubclassData1; }
3244
3245 static bool classof(const Metadata *MD) {
3246 return MD->getMetadataID() == DITemplateTypeParameterKind ||
3247 MD->getMetadataID() == DITemplateValueParameterKind;
3248 }
3249};
3250
3251class DITemplateTypeParameter : public DITemplateParameter {
3252 friend class LLVMContextImpl;
3253 friend class MDNode;
3254
3255 DITemplateTypeParameter(LLVMContext &Context, StorageType Storage,
3257 ~DITemplateTypeParameter() = default;
3258
3259 static DITemplateTypeParameter *getImpl(LLVMContext &Context, StringRef Name,
3260 DIType *Type, bool IsDefault,
3262 bool ShouldCreate = true) {
3263 return getImpl(Context, getCanonicalMDString(Context, Name), Type,
3264 IsDefault, Storage, ShouldCreate);
3265 }
3267 getImpl(LLVMContext &Context, MDString *Name, Metadata *Type, bool IsDefault,
3268 StorageType Storage, bool ShouldCreate = true);
3269
3270 TempDITemplateTypeParameter cloneImpl() const {
3271 return getTemporary(getContext(), getName(), getType(), isDefault());
3272 }
3273
3274public:
3275 DEFINE_MDNODE_GET(DITemplateTypeParameter,
3277 (Name, Type, IsDefault))
3278 DEFINE_MDNODE_GET(DITemplateTypeParameter,
3281
3282 TempDITemplateTypeParameter clone() const { return cloneImpl(); }
3283
3284 static bool classof(const Metadata *MD) {
3285 return MD->getMetadataID() == DITemplateTypeParameterKind;
3286 }
3287};
3288
3289class DITemplateValueParameter : public DITemplateParameter {
3290 friend class LLVMContextImpl;
3291 friend class MDNode;
3292
3293 DITemplateValueParameter(LLVMContext &Context, StorageType Storage,
3294 unsigned Tag, bool IsDefault,
3296 : DITemplateParameter(Context, DITemplateValueParameterKind, Storage, Tag,
3297 IsDefault, Ops) {}
3298 ~DITemplateValueParameter() = default;
3299
3300 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag,
3302 bool IsDefault, Metadata *Value,
3304 bool ShouldCreate = true) {
3305 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), Type,
3306 IsDefault, Value, Storage, ShouldCreate);
3307 }
3308 LLVM_ABI static DITemplateValueParameter *
3309 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *Type,
3310 bool IsDefault, Metadata *Value, StorageType Storage,
3311 bool ShouldCreate = true);
3312
3313 TempDITemplateValueParameter cloneImpl() const {
3314 return getTemporary(getContext(), getTag(), getName(), getType(),
3315 isDefault(), getValue());
3316 }
3317
3318public:
3319 DEFINE_MDNODE_GET(DITemplateValueParameter,
3320 (unsigned Tag, StringRef Name, DIType *Type, bool IsDefault,
3321 Metadata *Value),
3322 (Tag, Name, Type, IsDefault, Value))
3323 DEFINE_MDNODE_GET(DITemplateValueParameter,
3327
3328 TempDITemplateValueParameter clone() const { return cloneImpl(); }
3329
3330 Metadata *getValue() const { return getOperand(2); }
3331
3332 static bool classof(const Metadata *MD) {
3333 return MD->getMetadataID() == DITemplateValueParameterKind;
3334 }
3335};
3336
3337/// Base class for variables.
3338///
3339/// Uses the SubclassData32 Metadata slot.
3340class DIVariable : public DINode {
3341 unsigned Line;
3342
3343protected:
3345 signed Line, ArrayRef<Metadata *> Ops,
3346 uint32_t AlignInBits = 0);
3347 ~DIVariable() = default;
3348
3349public:
3350 unsigned getLine() const { return Line; }
3352 StringRef getName() const { return getStringOperand(1); }
3356 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
3357 /// Determines the size of the variable's type.
3358 LLVM_ABI std::optional<uint64_t> getSizeInBits() const;
3359
3360 /// Return the signedness of this variable's type, or std::nullopt if this
3361 /// type is neither signed nor unsigned.
3362 std::optional<DIBasicType::Signedness> getSignedness() const {
3363 if (auto *BT = dyn_cast<DIBasicType>(getType()))
3364 return BT->getSignedness();
3365 return std::nullopt;
3366 }
3367
3369 if (auto *F = getFile())
3370 return F->getFilename();
3371 return "";
3372 }
3373
3375 if (auto *F = getFile())
3376 return F->getDirectory();
3377 return "";
3378 }
3379
3380 std::optional<StringRef> getSource() const {
3381 if (auto *F = getFile())
3382 return F->getSource();
3383 return std::nullopt;
3384 }
3385
3386 Metadata *getRawScope() const { return getOperand(0); }
3388 Metadata *getRawFile() const { return getOperand(2); }
3389 Metadata *getRawType() const { return getOperand(3); }
3390
3391 static bool classof(const Metadata *MD) {
3392 return MD->getMetadataID() == DILocalVariableKind ||
3393 MD->getMetadataID() == DIGlobalVariableKind;
3394 }
3395};
3396
3397/// DWARF expression.
3398///
3399/// This is (almost) a DWARF expression that modifies the location of a
3400/// variable, or the location of a single piece of a variable, or (when using
3401/// DW_OP_stack_value) is the constant variable value.
3402///
3403/// TODO: Co-allocate the expression elements.
3404/// TODO: Separate from MDNode, or otherwise drop Distinct and Temporary
3405/// storage types.
3406class DIExpression : public MDNode {
3407 friend class LLVMContextImpl;
3408 friend class MDNode;
3409
3410 std::vector<uint64_t> Elements;
3411
3412 DIExpression(LLVMContext &C, StorageType Storage, ArrayRef<uint64_t> Elements)
3413 : MDNode(C, DIExpressionKind, Storage, {}),
3414 Elements(Elements.begin(), Elements.end()) {}
3415 ~DIExpression() = default;
3416
3417 LLVM_ABI static DIExpression *getImpl(LLVMContext &Context,
3418 ArrayRef<uint64_t> Elements,
3420 bool ShouldCreate = true);
3421
3422 TempDIExpression cloneImpl() const {
3423 return getTemporary(getContext(), getElements());
3424 }
3425
3426public:
3427 DEFINE_MDNODE_GET(DIExpression, (ArrayRef<uint64_t> Elements), (Elements))
3428
3429 TempDIExpression clone() const { return cloneImpl(); }
3430
3431 ArrayRef<uint64_t> getElements() const { return Elements; }
3432
3433 unsigned getNumElements() const { return Elements.size(); }
3434
3435 uint64_t getElement(unsigned I) const {
3436 assert(I < Elements.size() && "Index out of range");
3437 return Elements[I];
3438 }
3439
3441 /// Determine whether this represents a constant value, if so
3442 // return it's sign information.
3443 LLVM_ABI std::optional<SignedOrUnsignedConstant> isConstant() const;
3444
3445 /// Return the number of unique location operands referred to (via
3446 /// DW_OP_LLVM_arg) in this expression; this is not necessarily the number of
3447 /// instances of DW_OP_LLVM_arg within the expression.
3448 /// For example, for the expression:
3449 /// (DW_OP_LLVM_arg 0, DW_OP_LLVM_arg 1, DW_OP_plus,
3450 /// DW_OP_LLVM_arg 0, DW_OP_mul)
3451 /// This function would return 2, as there are two unique location operands
3452 /// (0 and 1).
3454
3456
3459
3460 /// A lightweight wrapper around an expression operand.
3461 ///
3462 /// TODO: Store arguments directly and change \a DIExpression to store a
3463 /// range of these.
3465 const uint64_t *Op = nullptr;
3466
3467 public:
3468 ExprOperand() = default;
3469 explicit ExprOperand(const uint64_t *Op) : Op(Op) {}
3470
3471 const uint64_t *get() const { return Op; }
3472
3473 /// Get the operand code.
3474 uint64_t getOp() const { return *Op; }
3475
3476 /// Get an argument to the operand.
3477 ///
3478 /// Never returns the operand itself.
3479 uint64_t getArg(unsigned I) const { return Op[I + 1]; }
3480
3481 unsigned getNumArgs() const { return getSize() - 1; }
3482
3483 /// Return the size of the operand.
3484 ///
3485 /// Return the number of elements in the operand (1 + args).
3486 LLVM_ABI unsigned getSize() const;
3487
3488 /// Append the elements of this operand to \p V.
3490 V.append(get(), get() + getSize());
3491 }
3492 };
3493
3494 /// An iterator for expression operands.
3496 ExprOperand Op;
3497
3498 public:
3499 using iterator_category = std::input_iterator_tag;
3501 using difference_type = std::ptrdiff_t;
3504
3505 expr_op_iterator() = default;
3507
3508 element_iterator getBase() const { return Op.get(); }
3509 const ExprOperand &operator*() const { return Op; }
3510 const ExprOperand *operator->() const { return &Op; }
3511
3513 increment();
3514 return *this;
3515 }
3517 expr_op_iterator T(*this);
3518 increment();
3519 return T;
3520 }
3521
3522 /// Get the next iterator.
3523 ///
3524 /// \a std::next() doesn't work because this is technically an
3525 /// input_iterator, but it's a perfectly valid operation. This is an
3526 /// accessor to provide the same functionality.
3527 expr_op_iterator getNext() const { return ++expr_op_iterator(*this); }
3528
3529 bool operator==(const expr_op_iterator &X) const {
3530 return getBase() == X.getBase();
3531 }
3532 bool operator!=(const expr_op_iterator &X) const {
3533 return getBase() != X.getBase();
3534 }
3535
3536 private:
3537 void increment() { Op = ExprOperand(getBase() + Op.getSize()); }
3538 };
3539
3540 /// Visit the elements via ExprOperand wrappers.
3541 ///
3542 /// These range iterators visit elements through \a ExprOperand wrappers.
3543 /// This is not guaranteed to be a valid range unless \a isValid() gives \c
3544 /// true.
3545 ///
3546 /// \pre \a isValid() gives \c true.
3547 /// @{
3557 /// @}
3558
3559 LLVM_ABI bool isValid() const;
3560
3561 static bool classof(const Metadata *MD) {
3562 return MD->getMetadataID() == DIExpressionKind;
3563 }
3564
3565 /// Return whether the first element a DW_OP_deref.
3566 LLVM_ABI bool startsWithDeref() const;
3567
3568 /// Return whether there is exactly one operator and it is a DW_OP_deref;
3569 LLVM_ABI bool isDeref() const;
3570
3572
3573 /// Return the number of bits that have an active value, i.e. those that
3574 /// aren't known to be zero/sign (depending on the type of Var) and which
3575 /// are within the size of this fragment (if it is one). If we can't deduce
3576 /// anything from the expression this will return the size of Var.
3577 LLVM_ABI std::optional<uint64_t> getActiveBits(DIVariable *Var);
3578
3579 /// Retrieve the details of this fragment expression.
3580 LLVM_ABI static std::optional<FragmentInfo>
3582
3583 /// Retrieve the details of this fragment expression.
3584 std::optional<FragmentInfo> getFragmentInfo() const {
3586 }
3587
3588 /// Return whether this is a piece of an aggregate variable.
3589 bool isFragment() const { return getFragmentInfo().has_value(); }
3590
3591 /// Return whether this is an implicit location description.
3592 LLVM_ABI bool isImplicit() const;
3593
3594 /// Return whether the location is computed on the expression stack, meaning
3595 /// it cannot be a simple register location.
3596 LLVM_ABI bool isComplex() const;
3597
3598 /// Return whether the evaluated expression makes use of a single location at
3599 /// the start of the expression, i.e. if it contains only a single
3600 /// DW_OP_LLVM_arg op as its first operand, or if it contains none.
3602
3603 /// Returns a reference to the elements contained in this expression, skipping
3604 /// past the leading `DW_OP_LLVM_arg, 0` if one is present.
3605 /// Similar to `convertToNonVariadicExpression`, but faster and cheaper - it
3606 /// does not check whether the expression is a single-location expression, and
3607 /// it returns elements rather than creating a new DIExpression.
3608 LLVM_ABI std::optional<ArrayRef<uint64_t>>
3610
3611 /// Removes all elements from \p Expr that do not apply to an undef debug
3612 /// value, which includes every operator that computes the value/location on
3613 /// the DWARF stack, including any DW_OP_LLVM_arg elements (making the result
3614 /// of this function always a single-location expression) while leaving
3615 /// everything that defines what the computed value applies to, i.e. the
3616 /// fragment information.
3617 LLVM_ABI static const DIExpression *
3619
3620 /// If \p Expr is a non-variadic expression (i.e. one that does not contain
3621 /// DW_OP_LLVM_arg), returns \p Expr converted to variadic form by adding a
3622 /// leading [DW_OP_LLVM_arg, 0] to the expression; otherwise returns \p Expr.
3623 LLVM_ABI static const DIExpression *
3625
3626 /// If \p Expr is a valid single-location expression, i.e. it refers to only a
3627 /// single debug operand at the start of the expression, then return that
3628 /// expression in a non-variadic form by removing DW_OP_LLVM_arg from the
3629 /// expression if it is present; otherwise returns std::nullopt.
3630 /// See also `getSingleLocationExpressionElements` above, which skips
3631 /// checking `isSingleLocationExpression` and returns a list of elements
3632 /// rather than a DIExpression.
3633 LLVM_ABI static std::optional<const DIExpression *>
3635
3636 /// Inserts the elements of \p Expr into \p Ops modified to a canonical form,
3637 /// which uses DW_OP_LLVM_arg (i.e. is a variadic expression) and folds the
3638 /// implied derefence from the \p IsIndirect flag into the expression. This
3639 /// allows us to check equivalence between expressions with differing
3640 /// directness or variadicness.
3642 const DIExpression *Expr,
3643 bool IsIndirect);
3644
3645 /// Determines whether two debug values should produce equivalent DWARF
3646 /// expressions, using their DIExpressions and directness, ignoring the
3647 /// differences between otherwise identical expressions in variadic and
3648 /// non-variadic form and not considering the debug operands.
3649 /// \p FirstExpr is the DIExpression for the first debug value.
3650 /// \p FirstIndirect should be true if the first debug value is indirect; in
3651 /// IR this should be true for dbg.declare intrinsics and false for
3652 /// dbg.values, and in MIR this should be true only for DBG_VALUE instructions
3653 /// whose second operand is an immediate value.
3654 /// \p SecondExpr and \p SecondIndirect have the same meaning as the prior
3655 /// arguments, but apply to the second debug value.
3656 LLVM_ABI static bool isEqualExpression(const DIExpression *FirstExpr,
3657 bool FirstIndirect,
3658 const DIExpression *SecondExpr,
3659 bool SecondIndirect);
3660
3661 /// Append \p Ops with operations to apply the \p Offset.
3663 int64_t Offset);
3664
3665 /// If this is a constant offset, extract it. If there is no expression,
3666 /// return true with an offset of zero.
3667 LLVM_ABI bool extractIfOffset(int64_t &Offset) const;
3668
3669 /// Assuming that the expression operates on an address, extract a constant
3670 /// offset and the successive ops. Return false if the expression contains
3671 /// any incompatible ops (including non-zero DW_OP_LLVM_args - only a single
3672 /// address operand to the expression is permitted).
3673 ///
3674 /// We don't try very hard to interpret the expression because we assume that
3675 /// foldConstantMath has canonicalized the expression.
3676 LLVM_ABI bool
3677 extractLeadingOffset(int64_t &OffsetInBytes,
3678 SmallVectorImpl<uint64_t> &RemainingOps) const;
3679
3680 /// Returns true iff this DIExpression contains at least one instance of
3681 /// `DW_OP_LLVM_arg, n` for all n in [0, N).
3682 LLVM_ABI bool hasAllLocationOps(unsigned N) const;
3683
3684 /// Checks if the last 4 elements of the expression are DW_OP_constu <DWARF
3685 /// Address Space> DW_OP_swap DW_OP_xderef and extracts the <DWARF Address
3686 /// Space>.
3687 LLVM_ABI static const DIExpression *
3688 extractAddressClass(const DIExpression *Expr, unsigned &AddrClass);
3689
3690 /// Used for DIExpression::prepend.
3693 DerefBefore = 1 << 0,
3694 DerefAfter = 1 << 1,
3695 StackValue = 1 << 2,
3696 EntryValue = 1 << 3
3697 };
3698
3699 /// Prepend \p DIExpr with a deref and offset operation and optionally turn it
3700 /// into a stack value or/and an entry value.
3701 LLVM_ABI static DIExpression *prepend(const DIExpression *Expr, uint8_t Flags,
3702 int64_t Offset = 0);
3703
3704 /// Prepend \p DIExpr with the given opcodes and optionally turn it into a
3705 /// stack value.
3708 bool StackValue = false,
3709 bool EntryValue = false);
3710
3711 /// Append the opcodes \p Ops to \p DIExpr. Unlike \ref appendToStack, the
3712 /// returned expression is a stack value only if \p DIExpr is a stack value.
3713 /// If \p DIExpr describes a fragment, the returned expression will describe
3714 /// the same fragment.
3715 LLVM_ABI static DIExpression *append(const DIExpression *Expr,
3717
3718 /// Convert \p DIExpr into a stack value if it isn't one already by appending
3719 /// DW_OP_deref if needed, and appending \p Ops to the resulting expression.
3720 /// If \p DIExpr describes a fragment, the returned expression will describe
3721 /// the same fragment.
3722 LLVM_ABI static DIExpression *appendToStack(const DIExpression *Expr,
3724
3725 /// Create a copy of \p Expr by appending the given list of \p Ops to each
3726 /// instance of the operand `DW_OP_LLVM_arg, \p ArgNo`. This is used to
3727 /// modify a specific location used by \p Expr, such as when salvaging that
3728 /// location.
3731 unsigned ArgNo,
3732 bool StackValue = false);
3733
3734 /// Create a copy of \p Expr with each instance of
3735 /// `DW_OP_LLVM_arg, \p OldArg` replaced with `DW_OP_LLVM_arg, \p NewArg`,
3736 /// and each instance of `DW_OP_LLVM_arg, Arg` with `DW_OP_LLVM_arg, Arg - 1`
3737 /// for all Arg > \p OldArg.
3738 /// This is used when replacing one of the operands of a debug value list
3739 /// with another operand in the same list and deleting the old operand.
3740 LLVM_ABI static DIExpression *replaceArg(const DIExpression *Expr,
3741 uint64_t OldArg, uint64_t NewArg);
3742
3743 /// Create a DIExpression to describe one part of an aggregate variable that
3744 /// is fragmented across multiple Values. The DW_OP_LLVM_fragment operation
3745 /// will be appended to the elements of \c Expr. If \c Expr already contains
3746 /// a \c DW_OP_LLVM_fragment \c OffsetInBits is interpreted as an offset
3747 /// into the existing fragment.
3748 ///
3749 /// \param OffsetInBits Offset of the piece in bits.
3750 /// \param SizeInBits Size of the piece in bits.
3751 /// \return Creating a fragment expression may fail if \c Expr
3752 /// contains arithmetic operations that would be
3753 /// truncated.
3754 LLVM_ABI static std::optional<DIExpression *>
3755 createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits,
3756 unsigned SizeInBits);
3757
3758 /// Determine the relative position of the fragments passed in.
3759 /// Returns -1 if this is entirely before Other, 0 if this and Other overlap,
3760 /// 1 if this is entirely after Other.
3761 static int fragmentCmp(const FragmentInfo &A, const FragmentInfo &B) {
3762 uint64_t l1 = A.OffsetInBits;
3763 uint64_t l2 = B.OffsetInBits;
3764 uint64_t r1 = l1 + A.SizeInBits;
3765 uint64_t r2 = l2 + B.SizeInBits;
3766 if (r1 <= l2)
3767 return -1;
3768 else if (r2 <= l1)
3769 return 1;
3770 else
3771 return 0;
3772 }
3773
3774 /// Computes a fragment, bit-extract operation if needed, and new constant
3775 /// offset to describe a part of a variable covered by some memory.
3776 ///
3777 /// The memory region starts at:
3778 /// \p SliceStart + \p SliceOffsetInBits
3779 /// And is size:
3780 /// \p SliceSizeInBits
3781 ///
3782 /// The location of the existing variable fragment \p VarFrag is:
3783 /// \p DbgPtr + \p DbgPtrOffsetInBits + \p DbgExtractOffsetInBits.
3784 ///
3785 /// It is intended that these arguments are derived from a debug record:
3786 /// - \p DbgPtr is the (single) DIExpression operand.
3787 /// - \p DbgPtrOffsetInBits is the constant offset applied to \p DbgPtr.
3788 /// - \p DbgExtractOffsetInBits is the offset from a
3789 /// DW_OP_LLVM_bit_extract_[sz]ext operation.
3790 ///
3791 /// Results and return value:
3792 /// - Return false if the result can't be calculated for any reason.
3793 /// - \p Result is set to nullopt if the intersect equals \p VarFarg.
3794 /// - \p Result contains a zero-sized fragment if there's no intersect.
3795 /// - \p OffsetFromLocationInBits is set to the difference between the first
3796 /// bit of the variable location and the first bit of the slice. The
3797 /// magnitude of a negative value therefore indicates the number of bits
3798 /// into the variable fragment that the memory region begins.
3799 ///
3800 /// We don't pass in a debug record directly to get the constituent parts
3801 /// and offsets because different debug records store the information in
3802 /// different places (dbg_assign has two DIExpressions - one contains the
3803 /// fragment info for the entire intrinsic).
3805 const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits,
3806 uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits,
3807 int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag,
3808 std::optional<DIExpression::FragmentInfo> &Result,
3809 int64_t &OffsetFromLocationInBits);
3810
3811 using ExtOps = std::array<uint64_t, 6>;
3812
3813 /// Returns the ops for a zero- or sign-extension in a DIExpression.
3814 LLVM_ABI static ExtOps getExtOps(unsigned FromSize, unsigned ToSize,
3815 bool Signed);
3816
3817 /// Append a zero- or sign-extension to \p Expr. Converts the expression to a
3818 /// stack value if it isn't one already.
3819 LLVM_ABI static DIExpression *appendExt(const DIExpression *Expr,
3820 unsigned FromSize, unsigned ToSize,
3821 bool Signed);
3822
3823 /// Check if fragments overlap between a pair of FragmentInfos.
3824 static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B) {
3825 return fragmentCmp(A, B) == 0;
3826 }
3827
3828 /// Determine the relative position of the fragments described by this
3829 /// DIExpression and \p Other. Calls static fragmentCmp implementation.
3830 int fragmentCmp(const DIExpression *Other) const {
3831 auto Fragment1 = *getFragmentInfo();
3832 auto Fragment2 = *Other->getFragmentInfo();
3833 return fragmentCmp(Fragment1, Fragment2);
3834 }
3835
3836 /// Check if fragments overlap between this DIExpression and \p Other.
3837 bool fragmentsOverlap(const DIExpression *Other) const {
3838 if (!isFragment() || !Other->isFragment())
3839 return true;
3840 return fragmentCmp(Other) == 0;
3841 }
3842
3843 /// Check if the expression consists of exactly one entry value operand.
3844 /// (This is the only configuration of entry values that is supported.)
3845 LLVM_ABI bool isEntryValue() const;
3846
3847 /// Try to shorten an expression with an initial constant operand.
3848 /// Returns a new expression and constant on success, or the original
3849 /// expression and constant on failure.
3850 LLVM_ABI std::pair<DIExpression *, const ConstantInt *>
3851 constantFold(const ConstantInt *CI);
3852
3853 /// Try to shorten an expression with constant math operations that can be
3854 /// evaluated at compile time. Returns a new expression on success, or the old
3855 /// expression if there is nothing to be reduced.
3857};
3858
3861 return std::tie(A.SizeInBits, A.OffsetInBits) ==
3862 std::tie(B.SizeInBits, B.OffsetInBits);
3863}
3864
3867 return std::tie(A.SizeInBits, A.OffsetInBits) <
3868 std::tie(B.SizeInBits, B.OffsetInBits);
3869}
3870
3871template <> struct DenseMapInfo<DIExpression::FragmentInfo> {
3873 static const uint64_t MaxVal = std::numeric_limits<uint64_t>::max();
3874
3875 static inline FragInfo getEmptyKey() { return {MaxVal, MaxVal}; }
3876
3877 static inline FragInfo getTombstoneKey() { return {MaxVal - 1, MaxVal - 1}; }
3878
3879 static unsigned getHashValue(const FragInfo &Frag) {
3880 return (Frag.SizeInBits & 0xffff) << 16 | (Frag.OffsetInBits & 0xffff);
3881 }
3882
3883 static bool isEqual(const FragInfo &A, const FragInfo &B) { return A == B; }
3884};
3885
3886/// Holds a DIExpression and keeps track of how many operands have been consumed
3887/// so far.
3890
3891public:
3893 if (!Expr) {
3894 assert(Start == End);
3895 return;
3896 }
3897 Start = Expr->expr_op_begin();
3898 End = Expr->expr_op_end();
3899 }
3900
3902 : Start(Expr.begin()), End(Expr.end()) {}
3903
3905
3906 /// Consume one operation.
3907 std::optional<DIExpression::ExprOperand> take() {
3908 if (Start == End)
3909 return std::nullopt;
3910 return *(Start++);
3911 }
3912
3913 /// Consume N operations.
3914 void consume(unsigned N) { std::advance(Start, N); }
3915
3916 /// Return the current operation.
3917 std::optional<DIExpression::ExprOperand> peek() const {
3918 if (Start == End)
3919 return std::nullopt;
3920 return *(Start);
3921 }
3922
3923 /// Return the next operation.
3924 std::optional<DIExpression::ExprOperand> peekNext() const {
3925 if (Start == End)
3926 return std::nullopt;
3927
3928 auto Next = Start.getNext();
3929 if (Next == End)
3930 return std::nullopt;
3931
3932 return *Next;
3933 }
3934
3935 std::optional<DIExpression::ExprOperand> peekNextN(unsigned N) const {
3936 if (Start == End)
3937 return std::nullopt;
3939 for (unsigned I = 0; I < N; I++) {
3940 Nth = Nth.getNext();
3941 if (Nth == End)
3942 return std::nullopt;
3943 }
3944 return *Nth;
3945 }
3946
3948 this->Start = DIExpression::expr_op_iterator(Expr.begin());
3949 this->End = DIExpression::expr_op_iterator(Expr.end());
3950 }
3951
3952 /// Determine whether there are any operations left in this expression.
3953 operator bool() const { return Start != End; }
3954
3955 DIExpression::expr_op_iterator begin() const { return Start; }
3956 DIExpression::expr_op_iterator end() const { return End; }
3957
3958 /// Retrieve the fragment information, if any.
3959 std::optional<DIExpression::FragmentInfo> getFragmentInfo() const {
3960 return DIExpression::getFragmentInfo(Start, End);
3961 }
3962};
3963
3964/// Global variables.
3965///
3966/// TODO: Remove DisplayName. It's always equal to Name.
3967class DIGlobalVariable : public DIVariable {
3968 friend class LLVMContextImpl;
3969 friend class MDNode;
3970
3971 bool IsLocalToUnit;
3972 bool IsDefinition;
3973
3974 DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
3975 bool IsLocalToUnit, bool IsDefinition, uint32_t AlignInBits,
3977 : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits),
3978 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
3979 ~DIGlobalVariable() = default;
3980
3981 static DIGlobalVariable *
3982 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
3983 StringRef LinkageName, DIFile *File, unsigned Line, DIType *Type,
3984 bool IsLocalToUnit, bool IsDefinition,
3987 bool ShouldCreate = true) {
3988 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
3989 getCanonicalMDString(Context, LinkageName), File, Line, Type,
3992 Annotations.get(), Storage, ShouldCreate);
3993 }
3994 LLVM_ABI static DIGlobalVariable *
3995 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
3996 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
3997 bool IsLocalToUnit, bool IsDefinition,
4000 bool ShouldCreate = true);
4001
4002 TempDIGlobalVariable cloneImpl() const {
4007 getAnnotations());
4008 }
4009
4010public:
4012 DIGlobalVariable,
4014 unsigned Line, DIType *Type, bool IsLocalToUnit, bool IsDefinition,
4016 uint32_t AlignInBits, DINodeArray Annotations),
4017 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
4020 DIGlobalVariable,
4022 unsigned Line, Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
4025 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
4027
4028 TempDIGlobalVariable clone() const { return cloneImpl(); }
4029
4030 bool isLocalToUnit() const { return IsLocalToUnit; }
4031 bool isDefinition() const { return IsDefinition; }
4037 DINodeArray getAnnotations() const {
4039 }
4040
4045 Metadata *getRawAnnotations() const { return getOperand(8); }
4046
4047 static bool classof(const Metadata *MD) {
4048 return MD->getMetadataID() == DIGlobalVariableKind;
4049 }
4050};
4051
4052/// Debug common block.
4053///
4054/// Uses the SubclassData32 Metadata slot.
4055class DICommonBlock : public DIScope {
4056 friend class LLVMContextImpl;
4057 friend class MDNode;
4058
4059 DICommonBlock(LLVMContext &Context, StorageType Storage, unsigned LineNo,
4061
4062 static DICommonBlock *getImpl(LLVMContext &Context, DIScope *Scope,
4064 DIFile *File, unsigned LineNo,
4065 StorageType Storage, bool ShouldCreate = true) {
4066 return getImpl(Context, Scope, Decl, getCanonicalMDString(Context, Name),
4067 File, LineNo, Storage, ShouldCreate);
4068 }
4069 LLVM_ABI static DICommonBlock *getImpl(LLVMContext &Context, Metadata *Scope,
4071 Metadata *File, unsigned LineNo,
4073 bool ShouldCreate = true);
4074
4075 TempDICommonBlock cloneImpl() const {
4077 getFile(), getLineNo());
4078 }
4079
4080public:
4081 DEFINE_MDNODE_GET(DICommonBlock,
4083 DIFile *File, unsigned LineNo),
4084 (Scope, Decl, Name, File, LineNo))
4085 DEFINE_MDNODE_GET(DICommonBlock,
4087 Metadata *File, unsigned LineNo),
4089
4090 TempDICommonBlock clone() const { return cloneImpl(); }
4091
4096 StringRef getName() const { return getStringOperand(2); }
4098 unsigned getLineNo() const { return SubclassData32; }
4099
4100 Metadata *getRawScope() const { return getOperand(0); }
4101 Metadata *getRawDecl() const { return getOperand(1); }
4103 Metadata *getRawFile() const { return getOperand(3); }
4104
4105 static bool classof(const Metadata *MD) {
4106 return MD->getMetadataID() == DICommonBlockKind;
4107 }
4108};
4109
4110/// Local variable.
4111///
4112/// TODO: Split up flags.
4113class DILocalVariable : public DIVariable {
4114 friend class LLVMContextImpl;
4115 friend class MDNode;
4116
4117 unsigned Arg : 16;
4118 DIFlags Flags;
4119
4120 DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
4121 unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
4123 : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits),
4124 Arg(Arg), Flags(Flags) {
4125 assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range");
4126 }
4127 ~DILocalVariable() = default;
4128
4129 static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope,
4130 StringRef Name, DIFile *File, unsigned Line,
4131 DIType *Type, unsigned Arg, DIFlags Flags,
4132 uint32_t AlignInBits, DINodeArray Annotations,
4134 bool ShouldCreate = true) {
4135 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
4136 Line, Type, Arg, Flags, AlignInBits, Annotations.get(),
4137 Storage, ShouldCreate);
4138 }
4139 LLVM_ABI static DILocalVariable *
4140 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, Metadata *File,
4141 unsigned Line, Metadata *Type, unsigned Arg, DIFlags Flags,
4143 bool ShouldCreate = true);
4144
4145 TempDILocalVariable cloneImpl() const {
4147 getLine(), getType(), getArg(), getFlags(),
4149 }
4150
4151public:
4152 DEFINE_MDNODE_GET(DILocalVariable,
4154 unsigned Line, DIType *Type, unsigned Arg, DIFlags Flags,
4155 uint32_t AlignInBits, DINodeArray Annotations),
4156 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
4157 Annotations))
4158 DEFINE_MDNODE_GET(DILocalVariable,
4160 unsigned Line, Metadata *Type, unsigned Arg, DIFlags Flags,
4162 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
4163 Annotations))
4164
4165 TempDILocalVariable clone() const { return cloneImpl(); }
4166
4167 /// Get the local scope for this variable.
4168 ///
4169 /// Variables must be defined in a local scope.
4173
4174 bool isParameter() const { return Arg; }
4175 unsigned getArg() const { return Arg; }
4176 DIFlags getFlags() const { return Flags; }
4177
4178 DINodeArray getAnnotations() const {
4180 }
4181 Metadata *getRawAnnotations() const { return getOperand(4); }
4182
4183 bool isArtificial() const { return getFlags() & FlagArtificial; }
4184 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
4185
4186 /// Check that a location is valid for this variable.
4187 ///
4188 /// Check that \c DL exists, is in the same subprogram, and has the same
4189 /// inlined-at location as \c this. (Otherwise, it's not a valid attachment
4190 /// to a \a DbgInfoIntrinsic.)
4192 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
4193 }
4194
4195 static bool classof(const Metadata *MD) {
4196 return MD->getMetadataID() == DILocalVariableKind;
4197 }
4198};
4199
4200/// Label.
4201///
4202/// Uses the SubclassData32 Metadata slot.
4203class DILabel : public DINode {
4204 friend class LLVMContextImpl;
4205 friend class MDNode;
4206
4207 unsigned Column;
4208 std::optional<unsigned> CoroSuspendIdx;
4209 bool IsArtificial;
4210
4211 DILabel(LLVMContext &C, StorageType Storage, unsigned Line, unsigned Column,
4212 bool IsArtificial, std::optional<unsigned> CoroSuspendIdx,
4214 ~DILabel() = default;
4215
4216 static DILabel *getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
4217 DIFile *File, unsigned Line, unsigned Column,
4218 bool IsArtificial,
4219 std::optional<unsigned> CoroSuspendIdx,
4220 StorageType Storage, bool ShouldCreate = true) {
4221 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
4222 Line, Column, IsArtificial, CoroSuspendIdx, Storage,
4223 ShouldCreate);
4224 }
4225 LLVM_ABI static DILabel *
4226 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, Metadata *File,
4227 unsigned Line, unsigned Column, bool IsArtificial,
4228 std::optional<unsigned> CoroSuspendIdx, StorageType Storage,
4229 bool ShouldCreate = true);
4230
4231 TempDILabel cloneImpl() const {
4235 }
4236
4237public:
4240 unsigned Line, unsigned Column, bool IsArtificial,
4241 std::optional<unsigned> CoroSuspendIdx),
4242 (Scope, Name, File, Line, Column, IsArtificial,
4243 CoroSuspendIdx))
4244 DEFINE_MDNODE_GET(DILabel,
4246 unsigned Line, unsigned Column, bool IsArtificial,
4247 std::optional<unsigned> CoroSuspendIdx),
4248 (Scope, Name, File, Line, Column, IsArtificial,
4249 CoroSuspendIdx))
4250
4251 TempDILabel clone() const { return cloneImpl(); }
4252
4253 /// Get the local scope for this label.
4254 ///
4255 /// Labels must be defined in a local scope.
4259 unsigned getLine() const { return SubclassData32; }
4260 unsigned getColumn() const { return Column; }
4261 StringRef getName() const { return getStringOperand(1); }
4263 bool isArtificial() const { return IsArtificial; }
4264 std::optional<unsigned> getCoroSuspendIdx() const { return CoroSuspendIdx; }
4265
4266 Metadata *getRawScope() const { return getOperand(0); }
4268 Metadata *getRawFile() const { return getOperand(2); }
4269
4270 /// Check that a location is valid for this label.
4271 ///
4272 /// Check that \c DL exists, is in the same subprogram, and has the same
4273 /// inlined-at location as \c this. (Otherwise, it's not a valid attachment
4274 /// to a \a DbgInfoIntrinsic.)
4276 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
4277 }
4278
4279 static bool classof(const Metadata *MD) {
4280 return MD->getMetadataID() == DILabelKind;
4281 }
4282};
4283
4284class DIObjCProperty : public DINode {
4285 friend class LLVMContextImpl;
4286 friend class MDNode;
4287
4288 unsigned Line;
4289 unsigned Attributes;
4290
4291 DIObjCProperty(LLVMContext &C, StorageType Storage, unsigned Line,
4292 unsigned Attributes, ArrayRef<Metadata *> Ops);
4293 ~DIObjCProperty() = default;
4294
4295 static DIObjCProperty *
4296 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line,
4297 StringRef GetterName, StringRef SetterName, unsigned Attributes,
4298 DIType *Type, StorageType Storage, bool ShouldCreate = true) {
4299 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line,
4301 getCanonicalMDString(Context, SetterName), Attributes, Type,
4302 Storage, ShouldCreate);
4303 }
4304 LLVM_ABI static DIObjCProperty *
4305 getImpl(LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
4306 MDString *GetterName, MDString *SetterName, unsigned Attributes,
4307 Metadata *Type, StorageType Storage, bool ShouldCreate = true);
4308
4309 TempDIObjCProperty cloneImpl() const {
4310 return getTemporary(getContext(), getName(), getFile(), getLine(),
4312 getType());
4313 }
4314
4315public:
4316 DEFINE_MDNODE_GET(DIObjCProperty,
4317 (StringRef Name, DIFile *File, unsigned Line,
4319 unsigned Attributes, DIType *Type),
4320 (Name, File, Line, GetterName, SetterName, Attributes,
4321 Type))
4322 DEFINE_MDNODE_GET(DIObjCProperty,
4323 (MDString * Name, Metadata *File, unsigned Line,
4325 unsigned Attributes, Metadata *Type),
4326 (Name, File, Line, GetterName, SetterName, Attributes,
4327 Type))
4328
4329 TempDIObjCProperty clone() const { return cloneImpl(); }
4330
4331 unsigned getLine() const { return Line; }
4332 unsigned getAttributes() const { return Attributes; }
4333 StringRef getName() const { return getStringOperand(0); }
4338
4340 if (auto *F = getFile())
4341 return F->getFilename();
4342 return "";
4343 }
4344
4346 if (auto *F = getFile())
4347 return F->getDirectory();
4348 return "";
4349 }
4350
4352 Metadata *getRawFile() const { return getOperand(1); }
4355 Metadata *getRawType() const { return getOperand(4); }
4356
4357 static bool classof(const Metadata *MD) {
4358 return MD->getMetadataID() == DIObjCPropertyKind;
4359 }
4360};
4361
4362/// An imported module (C++ using directive or similar).
4363///
4364/// Uses the SubclassData32 Metadata slot.
4365class DIImportedEntity : public DINode {
4366 friend class LLVMContextImpl;
4367 friend class MDNode;
4368
4369 DIImportedEntity(LLVMContext &C, StorageType Storage, unsigned Tag,
4370 unsigned Line, ArrayRef<Metadata *> Ops)
4371 : DINode(C, DIImportedEntityKind, Storage, Tag, Ops) {
4373 }
4374 ~DIImportedEntity() = default;
4375
4376 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
4377 DIScope *Scope, DINode *Entity, DIFile *File,
4378 unsigned Line, StringRef Name,
4379 DINodeArray Elements, StorageType Storage,
4380 bool ShouldCreate = true) {
4381 return getImpl(Context, Tag, Scope, Entity, File, Line,
4382 getCanonicalMDString(Context, Name), Elements.get(), Storage,
4383 ShouldCreate);
4384 }
4385 LLVM_ABI static DIImportedEntity *
4386 getImpl(LLVMContext &Context, unsigned Tag, Metadata *Scope, Metadata *Entity,
4387 Metadata *File, unsigned Line, MDString *Name, Metadata *Elements,
4388 StorageType Storage, bool ShouldCreate = true);
4389
4390 TempDIImportedEntity cloneImpl() const {
4391 return getTemporary(getContext(), getTag(), getScope(), getEntity(),
4392 getFile(), getLine(), getName(), getElements());
4393 }
4394
4395public:
4396 DEFINE_MDNODE_GET(DIImportedEntity,
4397 (unsigned Tag, DIScope *Scope, DINode *Entity, DIFile *File,
4398 unsigned Line, StringRef Name = "",
4399 DINodeArray Elements = nullptr),
4400 (Tag, Scope, Entity, File, Line, Name, Elements))
4401 DEFINE_MDNODE_GET(DIImportedEntity,
4404 Metadata *Elements = nullptr),
4405 (Tag, Scope, Entity, File, Line, Name, Elements))
4406
4407 TempDIImportedEntity clone() const { return cloneImpl(); }
4408
4409 unsigned getLine() const { return SubclassData32; }
4410 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
4411 DINode *getEntity() const { return cast_or_null<DINode>(getRawEntity()); }
4412 StringRef getName() const { return getStringOperand(2); }
4413 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
4414 DINodeArray getElements() const {
4415 return cast_or_null<MDTuple>(getRawElements());
4416 }
4417
4418 Metadata *getRawScope() const { return getOperand(0); }
4419 Metadata *getRawEntity() const { return getOperand(1); }
4420 MDString *getRawName() const { return getOperandAs<MDString>(2); }
4421 Metadata *getRawFile() const { return getOperand(3); }
4422 Metadata *getRawElements() const { return getOperand(4); }
4423
4424 static bool classof(const Metadata *MD) {
4425 return MD->getMetadataID() == DIImportedEntityKind;
4426 }
4427};
4428
4429/// A pair of DIGlobalVariable and DIExpression.
4430class DIGlobalVariableExpression : public MDNode {
4431 friend class LLVMContextImpl;
4432 friend class MDNode;
4433
4434 DIGlobalVariableExpression(LLVMContext &C, StorageType Storage,
4436 : MDNode(C, DIGlobalVariableExpressionKind, Storage, Ops) {}
4437 ~DIGlobalVariableExpression() = default;
4438
4440 getImpl(LLVMContext &Context, Metadata *Variable, Metadata *Expression,
4441 StorageType Storage, bool ShouldCreate = true);
4442
4443 TempDIGlobalVariableExpression cloneImpl() const {
4445 }
4446
4447public:
4448 DEFINE_MDNODE_GET(DIGlobalVariableExpression,
4449 (Metadata * Variable, Metadata *Expression),
4450 (Variable, Expression))
4451
4452 TempDIGlobalVariableExpression clone() const { return cloneImpl(); }
4453
4454 Metadata *getRawVariable() const { return getOperand(0); }
4455
4459
4460 Metadata *getRawExpression() const { return getOperand(1); }
4461
4465
4466 static bool classof(const Metadata *MD) {
4467 return MD->getMetadataID() == DIGlobalVariableExpressionKind;
4468 }
4469};
4470
4471/// Macro Info DWARF-like metadata node.
4472///
4473/// A metadata node with a DWARF macro info (i.e., a constant named
4474/// \c DW_MACINFO_*, defined in llvm/BinaryFormat/Dwarf.h). Called \a
4475/// DIMacroNode
4476/// because it's potentially used for non-DWARF output.
4477///
4478/// Uses the SubclassData16 Metadata slot.
4479class DIMacroNode : public MDNode {
4480 friend class LLVMContextImpl;
4481 friend class MDNode;
4482
4483protected:
4484 DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType,
4486 : MDNode(C, ID, Storage, Ops1, Ops2) {
4487 assert(MIType < 1u << 16);
4488 SubclassData16 = MIType;
4489 }
4490 ~DIMacroNode() = default;
4491
4492 template <class Ty> Ty *getOperandAs(unsigned I) const {
4493 return cast_or_null<Ty>(getOperand(I));
4494 }
4495
4496 StringRef getStringOperand(unsigned I) const {
4497 if (auto *S = getOperandAs<MDString>(I))
4498 return S->getString();
4499 return StringRef();
4500 }
4501
4503 if (S.empty())
4504 return nullptr;
4505 return MDString::get(Context, S);
4506 }
4507
4508public:
4509 unsigned getMacinfoType() const { return SubclassData16; }
4510
4511 static bool classof(const Metadata *MD) {
4512 switch (MD->getMetadataID()) {
4513 default:
4514 return false;
4515 case DIMacroKind:
4516 case DIMacroFileKind:
4517 return true;
4518 }
4519 }
4520};
4521
4522/// Macro
4523///
4524/// Uses the SubclassData32 Metadata slot.
4525class DIMacro : public DIMacroNode {
4526 friend class LLVMContextImpl;
4527 friend class MDNode;
4528
4529 DIMacro(LLVMContext &C, StorageType Storage, unsigned MIType, unsigned Line,
4531 : DIMacroNode(C, DIMacroKind, Storage, MIType, Ops) {
4533 }
4534 ~DIMacro() = default;
4535
4536 static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
4538 bool ShouldCreate = true) {
4539 return getImpl(Context, MIType, Line, getCanonicalMDString(Context, Name),
4540 getCanonicalMDString(Context, Value), Storage, ShouldCreate);
4541 }
4542 LLVM_ABI static DIMacro *getImpl(LLVMContext &Context, unsigned MIType,
4543 unsigned Line, MDString *Name,
4544 MDString *Value, StorageType Storage,
4545 bool ShouldCreate = true);
4546
4547 TempDIMacro cloneImpl() const {
4549 getValue());
4550 }
4551
4552public:
4554 (unsigned MIType, unsigned Line, StringRef Name,
4555 StringRef Value = ""),
4556 (MIType, Line, Name, Value))
4557 DEFINE_MDNODE_GET(DIMacro,
4558 (unsigned MIType, unsigned Line, MDString *Name,
4561
4562 TempDIMacro clone() const { return cloneImpl(); }
4563
4564 unsigned getLine() const { return SubclassData32; }
4565
4566 StringRef getName() const { return getStringOperand(0); }
4567 StringRef getValue() const { return getStringOperand(1); }
4568
4571
4572 static bool classof(const Metadata *MD) {
4573 return MD->getMetadataID() == DIMacroKind;
4574 }
4575};
4576
4577/// Macro file
4578///
4579/// Uses the SubclassData32 Metadata slot.
4580class DIMacroFile : public DIMacroNode {
4581 friend class LLVMContextImpl;
4582 friend class MDNode;
4583
4584 DIMacroFile(LLVMContext &C, StorageType Storage, unsigned MIType,
4585 unsigned Line, ArrayRef<Metadata *> Ops)
4586 : DIMacroNode(C, DIMacroFileKind, Storage, MIType, Ops) {
4588 }
4589 ~DIMacroFile() = default;
4590
4591 static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
4592 unsigned Line, DIFile *File,
4593 DIMacroNodeArray Elements, StorageType Storage,
4594 bool ShouldCreate = true) {
4595 return getImpl(Context, MIType, Line, static_cast<Metadata *>(File),
4596 Elements.get(), Storage, ShouldCreate);
4597 }
4598
4599 LLVM_ABI static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
4600 unsigned Line, Metadata *File,
4602 bool ShouldCreate = true);
4603
4604 TempDIMacroFile cloneImpl() const {
4606 getElements());
4607 }
4608
4609public:
4611 (unsigned MIType, unsigned Line, DIFile *File,
4612 DIMacroNodeArray Elements),
4613 (MIType, Line, File, Elements))
4614 DEFINE_MDNODE_GET(DIMacroFile,
4615 (unsigned MIType, unsigned Line, Metadata *File,
4618
4619 TempDIMacroFile clone() const { return cloneImpl(); }
4620
4621 void replaceElements(DIMacroNodeArray Elements) {
4622#ifndef NDEBUG
4623 for (DIMacroNode *Op : getElements())
4624 assert(is_contained(Elements->operands(), Op) &&
4625 "Lost a macro node during macro node list replacement");
4626#endif
4627 replaceOperandWith(1, Elements.get());
4628 }
4629
4630 unsigned getLine() const { return SubclassData32; }
4632
4633 DIMacroNodeArray getElements() const {
4635 }
4636
4637 Metadata *getRawFile() const { return getOperand(0); }
4638 Metadata *getRawElements() const { return getOperand(1); }
4639
4640 static bool classof(const Metadata *MD) {
4641 return MD->getMetadataID() == DIMacroFileKind;
4642 }
4643};
4644
4645/// List of ValueAsMetadata, to be used as an argument to a dbg.value
4646/// intrinsic.
4647class DIArgList : public Metadata, ReplaceableMetadataImpl {
4649 friend class LLVMContextImpl;
4651
4653
4654 DIArgList(LLVMContext &Context, ArrayRef<ValueAsMetadata *> Args)
4655 : Metadata(DIArgListKind, Uniqued), ReplaceableMetadataImpl(Context),
4656 Args(Args) {
4657 track();
4658 }
4659 ~DIArgList() { untrack(); }
4660
4661 LLVM_ABI void track();
4662 LLVM_ABI void untrack();
4663 void dropAllReferences(bool Untrack);
4664
4665public:
4666 LLVM_ABI static DIArgList *get(LLVMContext &Context,
4668
4669 ArrayRef<ValueAsMetadata *> getArgs() const { return Args; }
4670
4671 iterator args_begin() { return Args.begin(); }
4672 iterator args_end() { return Args.end(); }
4673
4674 static bool classof(const Metadata *MD) {
4675 return MD->getMetadataID() == DIArgListKind;
4676 }
4677
4681
4682 LLVM_ABI void handleChangedOperand(void *Ref, Metadata *New);
4683};
4684
4685/// Identifies a unique instance of a variable.
4686///
4687/// Storage for identifying a potentially inlined instance of a variable,
4688/// or a fragment thereof. This guarantees that exactly one variable instance
4689/// may be identified by this class, even when that variable is a fragment of
4690/// an aggregate variable and/or there is another inlined instance of the same
4691/// source code variable nearby.
4692/// This class does not necessarily uniquely identify that variable: it is
4693/// possible that a DebugVariable with different parameters may point to the
4694/// same variable instance, but not that one DebugVariable points to multiple
4695/// variable instances.
4697 using FragmentInfo = DIExpression::FragmentInfo;
4698
4699 const DILocalVariable *Variable;
4700 std::optional<FragmentInfo> Fragment;
4701 const DILocation *InlinedAt;
4702
4703 /// Fragment that will overlap all other fragments. Used as default when
4704 /// caller demands a fragment.
4705 LLVM_ABI static const FragmentInfo DefaultFragment;
4706
4707public:
4709
4711 std::optional<FragmentInfo> FragmentInfo,
4712 const DILocation *InlinedAt)
4713 : Variable(Var), Fragment(FragmentInfo), InlinedAt(InlinedAt) {}
4714
4715 DebugVariable(const DILocalVariable *Var, const DIExpression *DIExpr,
4716 const DILocation *InlinedAt)
4717 : Variable(Var),
4718 Fragment(DIExpr ? DIExpr->getFragmentInfo() : std::nullopt),
4719 InlinedAt(InlinedAt) {}
4720
4721 const DILocalVariable *getVariable() const { return Variable; }
4722 std::optional<FragmentInfo> getFragment() const { return Fragment; }
4723 const DILocation *getInlinedAt() const { return InlinedAt; }
4724
4725 FragmentInfo getFragmentOrDefault() const {
4726 return Fragment.value_or(DefaultFragment);
4727 }
4728
4729 static bool isDefaultFragment(const FragmentInfo F) {
4730 return F == DefaultFragment;
4731 }
4732
4733 bool operator==(const DebugVariable &Other) const {
4734 return std::tie(Variable, Fragment, InlinedAt) ==
4735 std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
4736 }
4737
4738 bool operator<(const DebugVariable &Other) const {
4739 return std::tie(Variable, Fragment, InlinedAt) <
4740 std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
4741 }
4742};
4743
4744template <> struct DenseMapInfo<DebugVariable> {
4746
4747 /// Empty key: no key should be generated that has no DILocalVariable.
4748 static inline DebugVariable getEmptyKey() {
4749 return DebugVariable(nullptr, std::nullopt, nullptr);
4750 }
4751
4752 /// Difference in tombstone is that the Optional is meaningful.
4754 return DebugVariable(nullptr, {{0, 0}}, nullptr);
4755 }
4756
4757 static unsigned getHashValue(const DebugVariable &D) {
4758 unsigned HV = 0;
4759 const std::optional<FragmentInfo> Fragment = D.getFragment();
4760 if (Fragment)
4762
4763 return hash_combine(D.getVariable(), HV, D.getInlinedAt());
4764 }
4765
4766 static bool isEqual(const DebugVariable &A, const DebugVariable &B) {
4767 return A == B;
4768 }
4769};
4770
4771/// Identifies a unique instance of a whole variable (discards/ignores fragment
4772/// information).
4779
4780template <>
4782 : public DenseMapInfo<DebugVariable> {};
4783} // end namespace llvm
4784
4785#undef DEFINE_MDNODE_GET_UNPACK_IMPL
4786#undef DEFINE_MDNODE_GET_UNPACK
4787#undef DEFINE_MDNODE_GET
4788
4789#endif // LLVM_IR_DEBUGINFOMETADATA_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static std::string getLinkageName(GlobalValue::LinkageTypes LT)
#define X(NUM, ENUM, NAME)
Definition ELF.h:849
BitTracker BT
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
#define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS)
#define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
static unsigned getNextComponentInDiscriminator(unsigned D)
Returns the next component stored in discriminator.
static unsigned getUnsignedFromPrefixEncoding(unsigned U)
Reverse transformation as getPrefixEncodingFromUnsigned.
static SmallString< 128 > getFilename(const DIScope *SP, vfs::FileSystem &VFS)
Extract a filename for a DIScope.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define T
static constexpr StringLiteral Filename
This file defines the PointerUnion class, which is a discriminated union of pointer types.
static StringRef getName(Value *V)
static void r2(uint32_t &A, uint32_t &B, uint32_t &C, uint32_t &D, uint32_t &E, int I, uint32_t *Buf)
Definition SHA1.cpp:51
static void r1(uint32_t &A, uint32_t &B, uint32_t &C, uint32_t &D, uint32_t &E, int I, uint32_t *Buf)
Definition SHA1.cpp:45
This file contains some templates that are useful if you are working with the STL at all.
static enum BaseType getBaseType(const Value *Val)
Return the baseType for Val which states whether Val is exclusively derived from constant/null,...
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallVector class.
static uint32_t getFlags(const Symbol *Sym)
Definition TapiFile.cpp:26
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Class for arbitrary precision integers.
Definition APInt.h:78
Annotations lets you mark points and ranges inside source code, for tests:
Definition Annotations.h:53
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
const_pointer iterator
Definition ArrayRef.h:47
iterator begin() const
Definition ArrayRef.h:130
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:537
This is the shared class of boolean and integer constants.
Definition Constants.h:87
This is an important base class in LLVM.
Definition Constant.h:43
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
ArrayRef< ValueAsMetadata * > getArgs() const
LLVM_ABI void handleChangedOperand(void *Ref, Metadata *New)
static bool classof(const Metadata *MD)
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
friend class ReplaceableMetadataImpl
friend class LLVMContextImpl
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static bool classof(const Metadata *MD)
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static TempDIAssignID getTemporary(LLVMContext &Context)
static DIAssignID * getDistinct(LLVMContext &Context)
friend class LLVMContextImpl
void replaceOperandWith(unsigned I, Metadata *New)=delete
Basic type, like 'int' or 'float'.
static DIBasicType * getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, StorageType Storage, bool ShouldCreate=true)
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned Encoding
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags
TempDIBasicType cloneImpl() const
DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, ArrayRef< Metadata * > Ops)
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t DIFlags Flags unsigned MDString uint64_t uint32_t unsigned uint32_t uint32_t DataSizeInBits
~DIBasicType()=default
static bool classof(const Metadata *MD)
DEFINE_MDNODE_GET(DIBasicType,(unsigned Tag, StringRef Name),(Tag, Name, 0, 0, 0, 0, 0, FlagZero)) DEFINE_MDNODE_GET(DIBasicType
static DIBasicType * getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, StorageType Storage, bool ShouldCreate=true)
uint32_t getDataSizeInBits() const
unsigned StringRef uint64_t SizeInBits
friend class LLVMContextImpl
LLVM_ABI std::optional< Signedness > getSignedness() const
Return the signedness of this type, or std::nullopt if this type is neither signed nor unsigned.
unsigned getEncoding() const
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t NumExtraInhabitants
DIBasicType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, ArrayRef< Metadata * > Ops)
unsigned StringRef Name
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t AlignInBits
Debug common block.
Metadata * getRawScope() const
Metadata Metadata MDString Metadata unsigned LineNo TempDICommonBlock clone() const
Metadata * getRawDecl() const
Metadata Metadata * Decl
Metadata * getRawFile() const
Metadata Metadata MDString Metadata unsigned LineNo
Metadata Metadata MDString * Name
MDString * getRawName() const
DIFile * getFile() const
static bool classof(const Metadata *MD)
unsigned getLineNo() const
Metadata Metadata MDString Metadata * File
StringRef getName() const
DIScope * getScope() const
DEFINE_MDNODE_GET(DICommonBlock,(DIScope *Scope, DIGlobalVariable *Decl, StringRef Name, DIFile *File, unsigned LineNo),(Scope, Decl, Name, File, LineNo)) DEFINE_MDNODE_GET(DICommonBlock
DIGlobalVariable * getDecl() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned NameTableKind
MDString * getRawSplitDebugFilename() const
bool getDebugInfoForProfiling() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool DebugInfoForProfiling
Metadata * getRawRetainedTypes() const
static LLVM_ABI const char * nameTableKindString(DebugNameTableKind PK)
static LLVM_ABI const char * emissionKindString(DebugEmissionKind EK)
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString * SysRoot
DISourceLanguageName Metadata MDString bool MDString * Flags
void setSplitDebugInlining(bool SplitDebugInlining)
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString MDString * SDK
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata * GlobalVariables
DICompositeTypeArray getEnumTypes() const
DebugEmissionKind getEmissionKind() const
bool isDebugDirectivesOnly() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t DWOId
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata * EnumTypes
StringRef getFlags() const
MDString * getRawProducer() const
DISourceLanguageName Metadata MDString * Producer
void replaceEnumTypes(DICompositeTypeArray N)
Replace arrays.
MDString * getRawSysRoot() const
DISourceLanguageName Metadata MDString bool MDString unsigned RuntimeVersion
StringRef getSDK() const
static void getIfExists()=delete
bool getRangesBaseAddress() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata * RetainedTypes
DIMacroNodeArray getMacros() const
unsigned getRuntimeVersion() const
Metadata * getRawMacros() const
void replaceRetainedTypes(DITypeArray N)
static bool classof(const Metadata *MD)
DISourceLanguageName Metadata MDString bool MDString unsigned MDString * SplitDebugFilename
void replaceGlobalVariables(DIGlobalVariableExpressionArray N)
void replaceMacros(DIMacroNodeArray N)
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString MDString SDK TempDICompileUnit clone() const
bool getSplitDebugInlining() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata * ImportedEntities
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata * Macros
StringRef getSysRoot() const
DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(DICompileUnit,(DISourceLanguageName SourceLanguage, DIFile *File, StringRef Producer, bool IsOptimized, StringRef Flags, unsigned RuntimeVersion, StringRef SplitDebugFilename, DebugEmissionKind EmissionKind, DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes, DIGlobalVariableExpressionArray GlobalVariables, DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, DebugNameTableKind NameTableKind, bool RangesBaseAddress, StringRef SysRoot, StringRef SDK),(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining, DebugInfoForProfiling,(unsigned) NameTableKind, RangesBaseAddress, SysRoot, SDK)) DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(DICompileUnit
DebugNameTableKind getNameTableKind() const
MDString * getRawSDK() const
DISourceLanguageName Metadata MDString bool IsOptimized
DISourceLanguageName Metadata * File
MDString * getRawFlags() const
DIImportedEntityArray getImportedEntities() const
bool isDebugInfoForProfiling() const
Metadata * getRawEnumTypes() const
StringRef getProducer() const
void setDWOId(uint64_t DwoId)
DIScopeArray getRetainedTypes() const
void replaceImportedEntities(DIImportedEntityArray N)
Metadata * getRawGlobalVariables() const
DIGlobalVariableExpressionArray getGlobalVariables() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool SplitDebugInlining
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned EmissionKind
DISourceLanguageName getSourceLanguage() const
Metadata * getRawImportedEntities() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool RangesBaseAddress
uint64_t getDWOId() const
StringRef getSplitDebugFilename() const
static void get()=delete
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t AlignInBits
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > EnumKind
Metadata * getRawVTableHolder() const
DIExpression * getRankExp() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata * DataLocation
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
unsigned MDString Metadata unsigned Line
Metadata * getRawRank() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata * Elements
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned RuntimeLang
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata * Annotations
Metadata * getRawSpecification() const
DIExpression * getAssociatedExp() const
DIVariable * getAllocated() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString * Identifier
DIExpression * getDataLocationExp() const
Metadata * getRawDiscriminator() const
static LLVM_ABI DICompositeType * getODRTypeIfExists(LLVMContext &Context, MDString &Identifier)
DIVariable * getAssociated() const
DIDerivedType * getDiscriminator() const
DIVariable * getDataLocation() const
unsigned getRuntimeLang() const
DIType * getSpecification() const
Metadata * getRawElements() const
unsigned MDString * Name
void replaceVTableHolder(DIType *VTableHolder)
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata * Discriminator
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata * TemplateParams
StringRef getIdentifier() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t OffsetInBits
unsigned MDString Metadata unsigned Metadata * Scope
unsigned MDString Metadata * File
Metadata * getRawDataLocation() const
Metadata * getRawTemplateParams() const
unsigned MDString Metadata unsigned Metadata Metadata * BaseType
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Flags
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata * Allocated
DINodeArray getElements() const
DITemplateParameterArray getTemplateParams() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata * Specification
Metadata * getRawAnnotations() const
Metadata * getRawAllocated() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata * VTableHolder
DIExpression * getAllocatedExp() const
void replaceElements(DINodeArray Elements)
Replace operands.
ConstantInt * getBitStrideConst() const
std::optional< uint32_t > getEnumKind() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t SizeInBits
DIType * getVTableHolder() const
DINodeArray getAnnotations() const
Metadata * getRawAssociated() const
ConstantInt * getRankConst() const
void replaceTemplateParams(DITemplateParameterArray TemplateParams)
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata * Associated
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata uint32_t NumExtraInhabitants
Metadata * getRawBitStride() const
Metadata * getRawBaseType() const
DEFINE_MDNODE_GET(DICompositeType,(unsigned Tag, StringRef Name, DIFile *File, unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, DINodeArray Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, DIType *VTableHolder, DITemplateParameterArray TemplateParams=nullptr, StringRef Identifier="", DIDerivedType *Discriminator=nullptr, Metadata *DataLocation=nullptr, Metadata *Associated=nullptr, Metadata *Allocated=nullptr, Metadata *Rank=nullptr, DINodeArray Annotations=nullptr, DIType *Specification=nullptr, uint32_t NumExtraInhabitants=0, Metadata *BitStride=nullptr),(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, Specification, NumExtraInhabitants, Flags, Elements, RuntimeLang, EnumKind, VTableHolder, TemplateParams, Identifier, Discriminator, DataLocation, Associated, Allocated, Rank, Annotations, BitStride)) DEFINE_MDNODE_GET(DICompositeType
MDString * getRawIdentifier() const
static bool classof(const Metadata *MD)
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata * Rank
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata uint32_t Metadata * BitStride
DIType * getBaseType() const
Metadata * getRawExtraData() const
unsigned StringRef DIFile unsigned DIScope DIType * BaseType
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata * OffsetInBits
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > std::optional< PtrAuthData > DIFlags Flags
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t AlignInBits
DINodeArray getAnnotations() const
Get annotations associated with this derived type.
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > std::optional< PtrAuthData > PtrAuthData
DEFINE_MDNODE_GET(DIDerivedType,(unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, std::optional< unsigned > DWARFAddressSpace, std::optional< PtrAuthData > PtrAuthData, DIFlags Flags, Metadata *ExtraData=nullptr, Metadata *Annotations=nullptr),(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData, Flags, ExtraData, Annotations)) DEFINE_MDNODE_GET(DIDerivedType
Metadata * getExtraData() const
Get extra data associated with this derived type.
DITemplateParameterArray getTemplateParams() const
Get the template parameters from a template alias.
unsigned StringRef DIFile * File
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > std::optional< PtrAuthData > DIFlags Metadata DINodeArray Annotations
DIObjCProperty * getObjCProperty() const
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > DWARFAddressSpace
unsigned StringRef DIFile unsigned DIScope * Scope
Metadata * getRawAnnotations() const
LLVM_ABI DIType * getClassType() const
Get casted version of extra data.
static bool classof(const Metadata *MD)
LLVM_ABI Constant * getConstant() const
unsigned StringRef DIFile unsigned DIScope DIType Metadata * SizeInBits
LLVM_ABI Constant * getStorageOffsetInBits() const
LLVM_ABI Constant * getDiscriminantValue() const
unsigned StringRef Name
LLVM_ABI uint32_t getVBPtrOffset() const
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > std::optional< PtrAuthData > DIFlags Metadata * ExtraData
unsigned StringRef DIFile unsigned Line
Enumeration value.
int64_t bool MDString APInt(64, Value, !IsUnsigned)
const APInt & getValue() const
int64_t bool MDString Name APInt bool MDString Name TempDIEnumerator clone() const
MDString * getRawName() const
StringRef getName() const
friend class LLVMContextImpl
DEFINE_MDNODE_GET(DIEnumerator,(int64_t Value, bool IsUnsigned, StringRef Name),(APInt(64, Value, !IsUnsigned), IsUnsigned, Name)) DEFINE_MDNODE_GET(DIEnumerator
static bool classof(const Metadata *MD)
int64_t bool MDString * Name
std::optional< DIExpression::ExprOperand > peekNext() const
Return the next operation.
std::optional< DIExpression::FragmentInfo > getFragmentInfo() const
Retrieve the fragment information, if any.
DIExpressionCursor(const DIExpressionCursor &)=default
DIExpressionCursor(const DIExpression *Expr)
DIExpression::expr_op_iterator end() const
std::optional< DIExpression::ExprOperand > peekNextN(unsigned N) const
std::optional< DIExpression::ExprOperand > peek() const
Return the current operation.
void consume(unsigned N)
Consume N operations.
std::optional< DIExpression::ExprOperand > take()
Consume one operation.
DIExpressionCursor(ArrayRef< uint64_t > Expr)
DIExpression::expr_op_iterator begin() const
void assignNewExpr(ArrayRef< uint64_t > Expr)
A lightweight wrapper around an expression operand.
LLVM_ABI unsigned getSize() const
Return the size of the operand.
uint64_t getArg(unsigned I) const
Get an argument to the operand.
uint64_t getOp() const
Get the operand code.
void appendToVector(SmallVectorImpl< uint64_t > &V) const
Append the elements of this operand to V.
An iterator for expression operands.
bool operator==(const expr_op_iterator &X) const
const ExprOperand * operator->() const
bool operator!=(const expr_op_iterator &X) const
const ExprOperand & operator*() const
expr_op_iterator getNext() const
Get the next iterator.
DWARF expression.
element_iterator elements_end() const
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
iterator_range< expr_op_iterator > expr_ops() const
bool isFragment() const
Return whether this is a piece of an aggregate variable.
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
std::array< uint64_t, 6 > ExtOps
unsigned getNumElements() const
ArrayRef< uint64_t >::iterator element_iterator
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
expr_op_iterator expr_op_begin() const
Visit the elements via ExprOperand wrappers.
LLVM_ABI bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
DbgVariableFragmentInfo FragmentInfo
int fragmentCmp(const DIExpression *Other) const
Determine the relative position of the fragments described by this DIExpression and Other.
LLVM_ABI bool startsWithDeref() const
Return whether the first element a DW_OP_deref.
static LLVM_ABI bool isEqualExpression(const DIExpression *FirstExpr, bool FirstIndirect, const DIExpression *SecondExpr, bool SecondIndirect)
Determines whether two debug values should produce equivalent DWARF expressions, using their DIExpres...
expr_op_iterator expr_op_end() const
LLVM_ABI bool isImplicit() const
Return whether this is an implicit location description.
DEFINE_MDNODE_GET(DIExpression,(ArrayRef< uint64_t > Elements),(Elements)) TempDIExpression clone() const
static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B)
Check if fragments overlap between a pair of FragmentInfos.
static LLVM_ABI bool calculateFragmentIntersect(const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits, int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag, std::optional< DIExpression::FragmentInfo > &Result, int64_t &OffsetFromLocationInBits)
Computes a fragment, bit-extract operation if needed, and new constant offset to describe a part of a...
element_iterator elements_begin() const
LLVM_ABI bool hasAllLocationOps(unsigned N) const
Returns true iff this DIExpression contains at least one instance of DW_OP_LLVM_arg,...
std::optional< FragmentInfo > getFragmentInfo() const
Retrieve the details of this fragment expression.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
PrependOps
Used for DIExpression::prepend.
static int fragmentCmp(const FragmentInfo &A, const FragmentInfo &B)
Determine the relative position of the fragments passed in.
LLVM_ABI bool isComplex() const
Return whether the location is computed on the expression stack, meaning it cannot be a simple regist...
bool fragmentsOverlap(const DIExpression *Other) const
Check if fragments overlap between this DIExpression and Other.
LLVM_ABI DIExpression * foldConstantMath()
Try to shorten an expression with constant math operations that can be evaluated at compile time.
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
LLVM_ABI std::pair< DIExpression *, const ConstantInt * > constantFold(const ConstantInt *CI)
Try to shorten an expression with an initial constant operand.
LLVM_ABI bool isDeref() const
Return whether there is exactly one operator and it is a DW_OP_deref;.
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
ArrayRef< uint64_t > getElements() const
static LLVM_ABI DIExpression * replaceArg(const DIExpression *Expr, uint64_t OldArg, uint64_t NewArg)
Create a copy of Expr with each instance of DW_OP_LLVM_arg, \p OldArg replaced with DW_OP_LLVM_arg,...
static bool classof(const Metadata *MD)
LLVM_ABI std::optional< uint64_t > getActiveBits(DIVariable *Var)
Return the number of bits that have an active value, i.e.
static LLVM_ABI void canonicalizeExpressionOps(SmallVectorImpl< uint64_t > &Ops, const DIExpression *Expr, bool IsIndirect)
Inserts the elements of Expr into Ops modified to a canonical form, which uses DW_OP_LLVM_arg (i....
uint64_t getElement(unsigned I) const
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * appendToStack(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Convert DIExpr into a stack value if it isn't one already by appending DW_OP_deref if needed,...
static LLVM_ABI DIExpression * appendExt(const DIExpression *Expr, unsigned FromSize, unsigned ToSize, bool Signed)
Append a zero- or sign-extension to Expr.
LLVM_ABI std::optional< ArrayRef< uint64_t > > getSingleLocationExpressionElements() const
Returns a reference to the elements contained in this expression, skipping past the leading DW_OP_LLV...
LLVM_ABI bool isSingleLocationExpression() const
Return whether the evaluated expression makes use of a single location at the start of the expression...
LLVM_ABI bool extractLeadingOffset(int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps) const
Assuming that the expression operates on an address, extract a constant offset and the successive ops...
LLVM_ABI std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
LLVM_ABI bool isValid() const
static LLVM_ABI const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the last 4 elements of the expression are DW_OP_constu <DWARFAddress Space> DW_OP_swap DW_O...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
static bool classof(const Metadata *MD)
MDString MDString * Directory
MDString MDString std::optional< ChecksumInfo< MDString * > > MDString * Source
DEFINE_MDNODE_GET(DIFile,(StringRef Filename, StringRef Directory, std::optional< ChecksumInfo< StringRef > > CS=std::nullopt, std::optional< StringRef > Source=std::nullopt),(Filename, Directory, CS, Source)) DEFINE_MDNODE_GET(DIFile
MDString * Filename
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
friend class LLVMContextImpl
friend class MDNode
MDString MDString std::optional< ChecksumInfo< MDString * > > CS
unsigned StringRef uint64_t uint32_t unsigned DIFlags unsigned int Factor
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI const char * fixedPointKindString(FixedPointKind)
const APInt & getNumeratorRaw() const
unsigned StringRef uint64_t uint32_t unsigned Encoding
static bool classof(const Metadata *MD)
const APInt & getDenominator() const
unsigned StringRef uint64_t uint32_t AlignInBits
LLVM_ABI bool isSigned() const
@ FixedPointBinary
Scale factor 2^Factor.
@ FixedPointDecimal
Scale factor 10^Factor.
@ FixedPointRational
Arbitrary rational scale factor.
FixedPointKind getKind() const
const APInt & getNumerator() const
DEFINE_MDNODE_GET(DIFixedPointType,(unsigned Tag, MDString *Name, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, DIFlags Flags, unsigned Kind, int Factor, APInt Numerator, APInt Denominator),(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags, Kind, Factor, Numerator, Denominator)) DEFINE_MDNODE_GET(DIFixedPointType
unsigned StringRef uint64_t uint32_t unsigned DIFlags unsigned int APInt Numerator
unsigned StringRef uint64_t uint32_t unsigned DIFlags unsigned int APInt APInt Denominator
unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags
unsigned StringRef uint64_t SizeInBits
const APInt & getDenominatorRaw() const
Metadata * getRawLowerBound() const
Metadata * getRawCountNode() const
Metadata * getRawStride() const
LLVM_ABI BoundType getLowerBound() const
DEFINE_MDNODE_GET(DIGenericSubrange,(Metadata *CountNode, Metadata *LowerBound, Metadata *UpperBound, Metadata *Stride),(CountNode, LowerBound, UpperBound, Stride)) TempDIGenericSubrange clone() const
Metadata * getRawUpperBound() const
static bool classof(const Metadata *MD)
LLVM_ABI BoundType getCount() const
LLVM_ABI BoundType getUpperBound() const
PointerUnion< DIVariable *, DIExpression * > BoundType
LLVM_ABI BoundType getStride() const
A pair of DIGlobalVariable and DIExpression.
DEFINE_MDNODE_GET(DIGlobalVariableExpression,(Metadata *Variable, Metadata *Expression),(Variable, Expression)) TempDIGlobalVariableExpression clone() const
DIGlobalVariable * getVariable() const
static bool classof(const Metadata *MD)
Metadata * getRawAnnotations() const
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata * TemplateParams
Metadata MDString MDString Metadata unsigned Metadata bool bool IsDefinition
Metadata MDString MDString Metadata unsigned Line
Metadata MDString MDString Metadata unsigned Metadata * Type
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t Metadata * Annotations
DIDerivedType * getStaticDataMemberDeclaration() const
DEFINE_MDNODE_GET(DIGlobalVariable,(DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned Line, DIType *Type, bool IsLocalToUnit, bool IsDefinition, DIDerivedType *StaticDataMemberDeclaration, MDTuple *TemplateParams, uint32_t AlignInBits, DINodeArray Annotations),(Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration, TemplateParams, AlignInBits, Annotations)) DEFINE_MDNODE_GET(DIGlobalVariable
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t Metadata Annotations TempDIGlobalVariable clone() const
Metadata MDString * Name
MDTuple * getTemplateParams() const
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata * StaticDataMemberDeclaration
Metadata * getRawStaticDataMemberDeclaration() const
Metadata MDString MDString * LinkageName
MDString * getRawLinkageName() const
StringRef getLinkageName() const
static bool classof(const Metadata *MD)
StringRef getDisplayName() const
Metadata MDString MDString Metadata * File
DINodeArray getAnnotations() const
Metadata MDString MDString Metadata unsigned Metadata bool IsLocalToUnit
Metadata * getRawTemplateParams() const
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t AlignInBits
An imported module (C++ using directive or similar).
unsigned Metadata Metadata * Entity
DEFINE_MDNODE_GET(DIImportedEntity,(unsigned Tag, DIScope *Scope, DINode *Entity, DIFile *File, unsigned Line, StringRef Name="", DINodeArray Elements=nullptr),(Tag, Scope, Entity, File, Line, Name, Elements)) DEFINE_MDNODE_GET(DIImportedEntity
unsigned Metadata Metadata Metadata unsigned Line
unsigned Metadata Metadata Metadata unsigned MDString * Name
unsigned Metadata Metadata Metadata * File
unsigned Metadata * Scope
Metadata MDString Metadata unsigned unsigned bool std::optional< unsigned > CoroSuspendIdx
DIFile * getFile() const
Metadata MDString Metadata unsigned unsigned bool std::optional< unsigned > CoroSuspendIdx TempDILabel clone() const
StringRef getName() const
static bool classof(const Metadata *MD)
Metadata MDString Metadata unsigned unsigned Column
unsigned getLine() const
bool isArtificial() const
Metadata MDString Metadata unsigned unsigned bool IsArtificial
Metadata * getRawFile() const
unsigned getColumn() const
DILocalScope * getScope() const
Get the local scope for this label.
MDString * getRawName() const
std::optional< unsigned > getCoroSuspendIdx() const
Metadata MDString Metadata unsigned Line
Metadata MDString * Name
DEFINE_MDNODE_GET(DILabel,(DILocalScope *Scope, StringRef Name, DIFile *File, unsigned Line, unsigned Column, bool IsArtificial, std::optional< unsigned > CoroSuspendIdx),(Scope, Name, File, Line, Column, IsArtificial, CoroSuspendIdx)) DEFINE_MDNODE_GET(DILabel
friend class LLVMContextImpl
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this label.
Metadata * getRawScope() const
friend class MDNode
Metadata MDString Metadata * File
static bool classof(const Metadata *MD)
void replaceScope(DIScope *Scope)
Metadata * getRawScope() const
LLVM_ABI DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops)
DILocalScope * getScope() const
Metadata Metadata unsigned Discriminator
static bool classof(const Metadata *MD)
unsigned getDiscriminator() const
Metadata Metadata unsigned Discriminator TempDILexicalBlockFile clone() const
DEFINE_MDNODE_GET(DILexicalBlockFile,(DILocalScope *Scope, DIFile *File, unsigned Discriminator),(Scope, File, Discriminator)) DEFINE_MDNODE_GET(DILexicalBlockFile
Debug lexical block.
Metadata Metadata unsigned unsigned Column
Metadata Metadata unsigned Line
DEFINE_MDNODE_GET(DILexicalBlock,(DILocalScope *Scope, DIFile *File, unsigned Line, unsigned Column),(Scope, File, Line, Column)) DEFINE_MDNODE_GET(DILexicalBlock
static bool classof(const Metadata *MD)
Metadata Metadata * File
unsigned getColumn() const
Metadata Metadata unsigned unsigned Column TempDILexicalBlock clone() const
A scope for locals.
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
LLVM_ABI DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
~DILocalScope()=default
DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
static bool classof(const Metadata *MD)
static LLVM_ABI DILocalScope * cloneScopeForSubprogram(DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Traverses the scope chain rooted at RootScope until it hits a Subprogram, recreating the chain with "...
Metadata MDString Metadata unsigned Metadata * Type
Metadata MDString Metadata * File
static bool classof(const Metadata *MD)
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t Metadata Annotations TempDILocalVariable clone() const
DILocalScope * getScope() const
Get the local scope for this variable.
Metadata MDString * Name
Metadata MDString Metadata unsigned Metadata unsigned Arg
DINodeArray getAnnotations() const
DEFINE_MDNODE_GET(DILocalVariable,(DILocalScope *Scope, StringRef Name, DIFile *File, unsigned Line, DIType *Type, unsigned Arg, DIFlags Flags, uint32_t AlignInBits, DINodeArray Annotations),(Scope, Name, File, Line, Type, Arg, Flags, AlignInBits, Annotations)) DEFINE_MDNODE_GET(DILocalVariable
Metadata MDString Metadata unsigned Line
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t Metadata * Annotations
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t AlignInBits
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this variable.
Metadata * getRawAnnotations() const
unsigned unsigned DILocalScope * Scope
const DILocation * getWithoutAtom() const
static unsigned getDuplicationFactorFromDiscriminator(unsigned D)
Returns the duplication factor for a given encoded discriminator D, or 1 if no value or 0 is encoded.
static bool isPseudoProbeDiscriminator(unsigned Discriminator)
unsigned unsigned DILocalScope DILocation bool uint64_t AtomGroup
unsigned getDuplicationFactor() const
Returns the duplication factor stored in the discriminator, or 1 if no duplication factor (or 0) is e...
uint64_t getAtomGroup() const
static LLVM_ABI DILocation * getMergedLocations(ArrayRef< DILocation * > Locs)
Try to combine the vector of locations passed as input in a single one.
static unsigned getBaseDiscriminatorBits()
Return the bits used for base discriminators.
static LLVM_ABI std::optional< unsigned > encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI)
Raw encoding of the discriminator.
unsigned unsigned DILocalScope DILocation bool ImplicitCode
Metadata * getRawScope() const
static LLVM_ABI void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF, unsigned &CI)
Raw decoder for values in an encoded discriminator D.
static LLVM_ABI DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
Attempts to merge LocA and LocB into a single location; see DebugLoc::getMergedLocation for more deta...
std::optional< const DILocation * > cloneWithBaseDiscriminator(unsigned BD) const
Returns a new DILocation with updated base discriminator BD.
unsigned getBaseDiscriminator() const
Returns the base discriminator stored in the discriminator.
static unsigned getBaseDiscriminatorFromDiscriminator(unsigned D, bool IsFSDiscriminator=false)
Returns the base discriminator for a given encoded discriminator D.
unsigned unsigned Column
Metadata * getRawInlinedAt() const
unsigned unsigned DILocalScope DILocation * InlinedAt
friend class LLVMContextImpl
static unsigned getMaskedDiscriminator(unsigned D, unsigned B)
Return the masked discriminator value for an input discrimnator value D (i.e.
const DILocation * cloneWithDiscriminator(unsigned Discriminator) const
Returns a new DILocation with updated Discriminator.
static unsigned getCopyIdentifierFromDiscriminator(unsigned D)
Returns the copy identifier for a given encoded discriminator D.
uint8_t getAtomRank() const
DEFINE_MDNODE_GET(DILocation,(unsigned Line, unsigned Column, Metadata *Scope, Metadata *InlinedAt=nullptr, bool ImplicitCode=false, uint64_t AtomGroup=0, uint8_t AtomRank=0),(Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup, AtomRank)) DEFINE_MDNODE_GET(DILocation
void replaceOperandWith(unsigned I, Metadata *New)=delete
std::optional< const DILocation * > cloneByMultiplyingDuplicationFactor(unsigned DF) const
Returns a new DILocation with duplication factor DF * current duplication factor encoded in the discr...
static bool classof(const Metadata *MD)
unsigned getCopyIdentifier() const
Returns the copy identifier stored in the discriminator.
unsigned unsigned DILocalScope DILocation bool uint64_t uint8_t AtomRank
unsigned unsigned Metadata * File
Metadata * getRawElements() const
DEFINE_MDNODE_GET(DIMacroFile,(unsigned MIType, unsigned Line, DIFile *File, DIMacroNodeArray Elements),(MIType, Line, File, Elements)) DEFINE_MDNODE_GET(DIMacroFile
unsigned unsigned Line
DIFile * getFile() const
unsigned getLine() const
unsigned unsigned Metadata Metadata * Elements
Metadata * getRawFile() const
static bool classof(const Metadata *MD)
friend class LLVMContextImpl
void replaceElements(DIMacroNodeArray Elements)
unsigned unsigned Metadata Metadata Elements TempDIMacroFile clone() const
DIMacroNodeArray getElements() const
DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
unsigned getMacinfoType() const
StringRef getStringOperand(unsigned I) const
static bool classof(const Metadata *MD)
static MDString * getCanonicalMDString(LLVMContext &Context, StringRef S)
friend class LLVMContextImpl
Ty * getOperandAs(unsigned I) const
~DIMacroNode()=default
unsigned getLine() const
MDString * getRawName() const
unsigned unsigned MDString MDString Value TempDIMacro clone() const
unsigned unsigned MDString MDString * Value
unsigned unsigned MDString * Name
StringRef getName() const
MDString * getRawValue() const
unsigned unsigned Line
friend class LLVMContextImpl
DEFINE_MDNODE_GET(DIMacro,(unsigned MIType, unsigned Line, StringRef Name, StringRef Value=""),(MIType, Line, Name, Value)) DEFINE_MDNODE_GET(DIMacro
friend class MDNode
StringRef getValue() const
static bool classof(const Metadata *MD)
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
Metadata Metadata * Scope
Metadata Metadata MDString * Name
Metadata Metadata MDString MDString MDString MDString * APINotesFile
Metadata Metadata MDString MDString MDString * IncludePath
Metadata Metadata MDString MDString * ConfigurationMacros
friend class LLVMContextImpl
DEFINE_MDNODE_GET(DIModule,(DIFile *File, DIScope *Scope, StringRef Name, StringRef ConfigurationMacros, StringRef IncludePath, StringRef APINotesFile, unsigned LineNo, bool IsDecl=false),(File, Scope, Name, ConfigurationMacros, IncludePath, APINotesFile, LineNo, IsDecl)) DEFINE_MDNODE_GET(DIModule
Metadata Metadata MDString MDString MDString MDString unsigned LineNo
Debug lexical block.
Metadata MDString bool ExportSymbols TempDINamespace clone() const
static bool classof(const Metadata *MD)
DEFINE_MDNODE_GET(DINamespace,(DIScope *Scope, StringRef Name, bool ExportSymbols),(Scope, Name, ExportSymbols)) DEFINE_MDNODE_GET(DINamespace
DIScope * getScope() const
Metadata MDString bool ExportSymbols
StringRef getName() const
MDString * getRawName() const
Metadata MDString * Name
friend class LLVMContextImpl
bool getExportSymbols() const
Metadata * getRawScope() const
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
static MDString * getCanonicalMDString(LLVMContext &Context, StringRef S)
static LLVM_ABI DIFlags getFlag(StringRef Flag)
static LLVM_ABI DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
void setTag(unsigned Tag)
Allow subclasses to mutate the tag.
DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
StringRef getStringOperand(unsigned I) const
Ty * getOperandAs(unsigned I) const
friend class LLVMContextImpl
static bool classof(const Metadata *MD)
static LLVM_ABI StringRef getFlagString(DIFlags Flag)
friend class MDNode
~DINode()=default
DIFlags
Debug info flags.
MDString Metadata unsigned MDString MDString unsigned Metadata Type TempDIObjCProperty clone() const
unsigned getAttributes() const
StringRef getFilename() const
MDString * getRawName() const
StringRef getDirectory() const
MDString * getRawSetterName() const
Metadata * getRawType() const
StringRef getGetterName() const
MDString Metadata * File
MDString Metadata unsigned MDString MDString unsigned Metadata * Type
static bool classof(const Metadata *MD)
MDString * getRawGetterName() const
Metadata * getRawFile() const
MDString Metadata unsigned MDString * GetterName
MDString Metadata unsigned MDString MDString * SetterName
StringRef getName() const
DEFINE_MDNODE_GET(DIObjCProperty,(StringRef Name, DIFile *File, unsigned Line, StringRef GetterName, StringRef SetterName, unsigned Attributes, DIType *Type),(Name, File, Line, GetterName, SetterName, Attributes, Type)) DEFINE_MDNODE_GET(DIObjCProperty
StringRef getSetterName() const
Base class for scope-like contexts.
~DIScope()=default
StringRef getFilename() const
LLVM_ABI StringRef getName() const
static bool classof(const Metadata *MD)
DIFile * getFile() const
StringRef getDirectory() const
std::optional< StringRef > getSource() const
LLVM_ABI DIScope * getScope() const
Metadata * getRawFile() const
Return the raw underlying file.
DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
Wrapper structure that holds a language name and its version.
uint16_t getUnversionedName() const
Transitional API for cases where we do not yet support versioned source language names.
uint32_t getVersion() const
Returns language version. Only valid for versioned language names.
DISourceLanguageName(uint16_t Lang, uint32_t Version)
uint16_t getName() const
Returns a versioned or unversioned language name.
String type, Fortran CHARACTER(n)
unsigned MDString * Name
unsigned MDString Metadata Metadata Metadata uint64_t SizeInBits
unsigned getEncoding() const
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t AlignInBits
static bool classof(const Metadata *MD)
unsigned MDString Metadata Metadata Metadata * StringLocationExp
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t unsigned Encoding unsigned MDString Metadata Metadata Metadata Metadata uint32_t unsigned Encoding TempDIStringType clone() const
DIExpression * getStringLengthExp() const
unsigned MDString Metadata Metadata * StringLengthExp
Metadata * getRawStringLengthExp() const
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t unsigned Encoding
Metadata * getRawStringLength() const
DIVariable * getStringLength() const
DIExpression * getStringLocationExp() const
unsigned MDString Metadata * StringLength
Metadata * getRawStringLocationExp() const
DEFINE_MDNODE_GET(DIStringType,(unsigned Tag, StringRef Name, uint64_t SizeInBits, uint32_t AlignInBits),(Tag, Name, nullptr, nullptr, nullptr, SizeInBits, AlignInBits, 0)) DEFINE_MDNODE_GET(DIStringType
Subprogram description. Uses SubclassData1.
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata * Unit
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString bool UsesKeyInstructions
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata * Annotations
void cleanupRetainedNodes()
When IR modules are merged, typically during LTO, the merged module may contain several types having ...
Metadata MDString MDString Metadata unsigned Metadata unsigned ScopeLine
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags SPFlags
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata * ContainingType
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata * TemplateParams
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata * Declaration
static DILocalScope * getRetainedNodeScope(MDNode *N)
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString * TargetFuncName
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
static void cleanupRetainedNodes(const RangeT &NewDistinctSPs)
Calls SP->cleanupRetainedNodes() for a range of DISubprograms.
static const DIScope * getRawRetainedNodeScope(const MDNode *N)
void forEachRetainedNode(FuncLVT &&FuncLV, FuncLabelT &&FuncLabel, FuncImportedEntityT &&FuncIE, FuncTypeT &&FuncType)
For each retained node, applies one of the given functions depending on the type of a node.
Metadata MDString * Name
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata * ThrownTypes
DEFINE_MDNODE_GET(DISubprogram,(DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned Line, DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit, DITemplateParameterArray TemplateParams=nullptr, DISubprogram *Declaration=nullptr, DINodeArray RetainedNodes=nullptr, DITypeArray ThrownTypes=nullptr, DINodeArray Annotations=nullptr, StringRef TargetFuncName="", bool UsesKeyInstructions=false),(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName, UsesKeyInstructions)) DEFINE_MDNODE_GET(DISubprogram
static LLVM_ABI DISPFlags getFlag(StringRef Flag)
Metadata MDString MDString Metadata * File
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned VirtualIndex
static LLVM_ABI DISPFlags splitFlags(DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags)
Split up a flags bitfield for easier printing.
static bool classof(const Metadata *MD)
Metadata MDString MDString * LinkageName
static LLVM_ABI StringRef getFlagString(DISPFlags Flag)
Metadata MDString MDString Metadata unsigned Metadata * Type
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata * RetainedNodes
DISPFlags
Debug info subprogram flags.
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int ThisAdjustment
LLVM_ABI bool describes(const Function *F) const
Check if this subprogram describes the given function.
StringRef DIFile unsigned Line
Metadata * getRawUpperBound() const
BoundType getLowerBound() const
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata * UpperBound
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType * BaseType
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata Metadata * Bias
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata * Stride
StringRef DIFile unsigned DIScope uint64_t SizeInBits
static bool classof(const Metadata *MD)
BoundType getBias() const
DEFINE_MDNODE_GET(DISubrangeType,(MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *SizeInBits, uint32_t AlignInBits, DIFlags Flags, Metadata *BaseType, Metadata *LowerBound, Metadata *UpperBound, Metadata *Stride, Metadata *Bias),(Name, File, Line, Scope, SizeInBits, AlignInBits, Flags, BaseType, LowerBound, UpperBound, Stride, Bias)) DEFINE_MDNODE_GET(DISubrangeType
Metadata * getRawBias() const
Metadata * getRawBaseType() const
StringRef DIFile * File
PointerUnion< ConstantInt *, DIVariable *, DIExpression *, DIDerivedType * > BoundType
StringRef DIFile unsigned DIScope * Scope
BoundType getUpperBound() const
DIType * getBaseType() const
Get the base type this is derived from.
BoundType getStride() const
Metadata * getRawLowerBound() const
StringRef DIFile unsigned DIScope uint64_t uint32_t AlignInBits
Metadata * getRawStride() const
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata * LowerBound
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags Flags
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata Metadata Bias TempDISubrangeType clone() const
static bool classof(const Metadata *MD)
LLVM_ABI BoundType getUpperBound() const
LLVM_ABI BoundType getStride() const
LLVM_ABI BoundType getLowerBound() const
DEFINE_MDNODE_GET(DISubrange,(int64_t Count, int64_t LowerBound=0),(Count, LowerBound)) DEFINE_MDNODE_GET(DISubrange
friend class LLVMContextImpl
LLVM_ABI BoundType getCount() const
Metadata int64_t LowerBound
Type array for a subprogram.
DITypeArray getTypeArray() const
TempDISubroutineType cloneWithCC(uint8_t CC) const
DEFINE_MDNODE_GET(DISubroutineType,(DIFlags Flags, uint8_t CC, DITypeArray TypeArray),(Flags, CC, TypeArray)) DEFINE_MDNODE_GET(DISubroutineType
DIFlags uint8_t Metadata * TypeArray
static bool classof(const Metadata *MD)
Metadata * getRawTypeArray() const
DIFlags uint8_t Metadata TypeArray TempDISubroutineType clone() const
static bool classof(const Metadata *MD)
DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage, unsigned Tag, bool IsDefault, ArrayRef< Metadata * > Ops)
MDString Metadata bool IsDefault
DEFINE_MDNODE_GET(DITemplateTypeParameter,(StringRef Name, DIType *Type, bool IsDefault),(Name, Type, IsDefault)) DEFINE_MDNODE_GET(DITemplateTypeParameter
MDString Metadata bool IsDefault TempDITemplateTypeParameter clone() const
static bool classof(const Metadata *MD)
unsigned MDString Metadata bool Metadata Value TempDITemplateValueParameter clone() const
unsigned MDString Metadata * Type
static bool classof(const Metadata *MD)
DEFINE_MDNODE_GET(DITemplateValueParameter,(unsigned Tag, StringRef Name, DIType *Type, bool IsDefault, Metadata *Value),(Tag, Name, Type, IsDefault, Value)) DEFINE_MDNODE_GET(DITemplateValueParameter
unsigned MDString Metadata bool IsDefault
unsigned MDString Metadata bool Metadata * Value
Base class for types.
bool isLittleEndian() const
static constexpr unsigned N_OPERANDS
bool isPublic() const
bool isPrivate() const
uint32_t getNumExtraInhabitants() const
bool isBigEndian() const
bool isLValueReference() const
bool isBitField() const
~DIType()=default
bool isStaticMember() const
bool isVirtual() const
TempDIType cloneWithFlags(DIFlags NewFlags) const
Returns a new temporary DIType with updated Flags.
bool isObjcClassComplete() const
MDString * getRawName() const
bool isAppleBlockExtension() const
uint64_t getOffsetInBits() const
bool isVector() const
bool isProtected() const
bool isObjectPointer() const
DIFlags getFlags() const
Metadata * getRawScope() const
StringRef getName() const
bool isForwardDecl() const
bool isTypePassByValue() const
uint64_t getSizeInBits() const
static bool classof(const Metadata *MD)
DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants, DIFlags Flags, ArrayRef< Metadata * > Ops)
uint32_t getAlignInBytes() const
void mutate(unsigned Tag, unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants, DIFlags Flags)
Change fields in place.
void init(unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants, DIFlags Flags)
LLVM_ABI uint32_t getAlignInBits() const
Metadata * getRawSizeInBits() const
unsigned getLine() const
bool isRValueReference() const
bool isArtificial() const
bool getExportSymbols() const
TempDIType clone() const
DIScope * getScope() const
bool isTypePassByReference() const
Metadata * getRawOffsetInBits() const
Base class for variables.
std::optional< DIBasicType::Signedness > getSignedness() const
Return the signedness of this variable's type, or std::nullopt if this type is neither signed nor uns...
uint32_t getAlignInBits() const
DIFile * getFile() const
MDString * getRawName() const
uint32_t getAlignInBytes() const
DIScope * getScope() const
~DIVariable()=default
StringRef getDirectory() const
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
Metadata * getRawFile() const
std::optional< StringRef > getSource() const
StringRef getFilename() const
Metadata * getRawType() const
static bool classof(const Metadata *MD)
LLVM_ABI DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, signed Line, ArrayRef< Metadata * > Ops, uint32_t AlignInBits=0)
DIType * getType() const
unsigned getLine() const
StringRef getName() const
Metadata * getRawScope() const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Record of a variable value-assignment, aka a non instruction representation of the dbg....
Identifies a unique instance of a whole variable (discards/ignores fragment information).
LLVM_ABI DebugVariableAggregate(const DbgVariableRecord *DVR)
DebugVariableAggregate(const DebugVariable &V)
Identifies a unique instance of a variable.
static bool isDefaultFragment(const FragmentInfo F)
DebugVariable(const DILocalVariable *Var, const DIExpression *DIExpr, const DILocation *InlinedAt)
const DILocation * getInlinedAt() const
bool operator<(const DebugVariable &Other) const
DebugVariable(const DILocalVariable *Var, std::optional< FragmentInfo > FragmentInfo, const DILocation *InlinedAt)
bool operator==(const DebugVariable &Other) const
FragmentInfo getFragmentOrDefault() const
std::optional< FragmentInfo > getFragment() const
const DILocalVariable * getVariable() const
LLVM_ABI DebugVariable(const DbgVariableRecord *DVR)
Class representing an expression and its matching format.
Generic tagged DWARF-like metadata node.
static bool classof(const Metadata *MD)
unsigned MDString ArrayRef< Metadata * > DwarfOps TempGenericDINode clone() const
Return a (temporary) clone of this.
LLVM_ABI dwarf::Tag getTag() const
StringRef getHeader() const
MDString * getRawHeader() const
const MDOperand & getDwarfOperand(unsigned I) const
unsigned getHash() const
unsigned getNumDwarfOperands() const
op_iterator dwarf_op_end() const
op_iterator dwarf_op_begin() const
unsigned MDString * Header
op_range dwarf_operands() const
DEFINE_MDNODE_GET(GenericDINode,(unsigned Tag, StringRef Header, ArrayRef< Metadata * > DwarfOps),(Tag, Header, DwarfOps)) DEFINE_MDNODE_GET(GenericDINode
void replaceDwarfOperandWith(unsigned I, Metadata *New)
unsigned MDString ArrayRef< Metadata * > DwarfOps
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Metadata node.
Definition Metadata.h:1080
friend class DIAssignID
Definition Metadata.h:1083
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1584
op_iterator op_end() const
Definition Metadata.h:1438
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1572
bool isUniqued() const
Definition Metadata.h:1262
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1450
iterator_range< op_iterator > op_range
Definition Metadata.h:1432
LLVM_ABI TempMDNode clone() const
Create a (temporary) clone of this.
Definition Metadata.cpp:683
bool isDistinct() const
Definition Metadata.h:1263
LLVM_ABI void setOperand(unsigned I, Metadata *New)
Set an operand.
op_iterator op_begin() const
Definition Metadata.h:1434
LLVMContext & getContext() const
Definition Metadata.h:1244
LLVM_ABI void dropAllReferences()
Definition Metadata.cpp:923
const MDOperand * op_iterator
Definition Metadata.h:1431
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
Metadata * get() const
Definition Metadata.h:931
A single uniqued string.
Definition Metadata.h:722
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:614
Tuple of metadata.
Definition Metadata.h:1500
Root of the metadata hierarchy.
Definition Metadata.h:64
StorageType
Active type of storage.
Definition Metadata.h:72
unsigned short SubclassData16
Definition Metadata.h:78
unsigned SubclassData32
Definition Metadata.h:79
unsigned char Storage
Storage flag for non-uniqued, otherwise unowned, metadata.
Definition Metadata.h:75
unsigned getMetadataID() const
Definition Metadata.h:104
unsigned char SubclassData1
Definition Metadata.h:77
Metadata(unsigned ID, StorageType Storage)
Definition Metadata.h:88
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
LLVM_ABI SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
Returns the list of all DbgVariableRecord users of this.
Definition Metadata.cpp:279
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::iterator iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:314
LLVM Value Representation.
Definition Value.h:75
A range adaptor for a pair of iterators.
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString)
Definition Dwarf.cpp:385
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
template class LLVM_TEMPLATE_ABI opt< bool >
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
bool operator!=(uint64_t V1, const APInt &V2)
Definition APInt.h:2131
auto cast_or_null(const Y &Val)
Definition Casting.h:714
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
static unsigned getBaseFSBitEnd()
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ Other
Any other memory.
Definition ModRef.h:68
static unsigned getN1Bits(int N)
FunctionAddr VTableAddr Next
Definition InstrProf.h:141
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:592
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
#define N
Pointer authentication (__ptrauth) metadata.
PtrAuthData(unsigned Key, bool IsDiscr, unsigned Discriminator, bool IsaPointer, bool AuthenticatesNullValues)
A single checksum, represented by a Kind and a Value (a string).
bool operator==(const ChecksumInfo< T > &X) const
T Value
The string value of the checksum.
ChecksumKind Kind
The kind of checksum which Value encodes.
ChecksumInfo(ChecksumKind Kind, T Value)
bool operator!=(const ChecksumInfo< T > &X) const
StringRef getKindAsString() const
static bool isEqual(const FragInfo &A, const FragInfo &B)
static unsigned getHashValue(const FragInfo &Frag)
static unsigned getHashValue(const DebugVariable &D)
static DebugVariable getEmptyKey()
Empty key: no key should be generated that has no DILocalVariable.
DIExpression::FragmentInfo FragmentInfo
static DebugVariable getTombstoneKey()
Difference in tombstone is that the Optional is meaningful.
static bool isEqual(const DebugVariable &A, const DebugVariable &B)
An information struct used to provide DenseMap with the various necessary components for a given valu...
static uint32_t extractProbeIndex(uint32_t Value)
Definition PseudoProbe.h:75
static std::optional< uint32_t > extractDwarfBaseDiscriminator(uint32_t Value)
Definition PseudoProbe.h:81