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 source language identity metadata that includes
70/// language name, optional language version, and an optional language dialect.
71///
72/// Some debug-info formats, particularly DWARF, distniguish between
73/// language codes that include the version name and codes that don't.
74/// DISourceLanguageName may hold either of these.
75///
77 /// Language version. The version scheme is language
78 /// dependent.
79 uint32_t Version = 0;
80
81 /// Language name.
82 /// If \ref HasVersion is \c true, then this name
83 /// is version independent (i.e., doesn't include the language
84 /// version in its name).
85 uint16_t Name;
86
87 /// If \c true, then \ref Version is interpretable and \ref Name
88 /// is a version independent name.
89 bool HasVersion;
90
91 /// Optional target-specific language dialect for DWARF that can be used to
92 /// indicate the programming/execution model.
93 ///
94 /// This is intentionally not modeled as a DICompileUnit operand. Code that
95 /// introspects DICompileUnit through getNumOperands()/getOperand(i) will not
96 /// see this field.
97 uint16_t Dialect = 0;
98
99public:
100 bool hasVersionedName() const { return HasVersion; }
101
102 /// Returns a versioned or unversioned language name.
103 uint16_t getName() const { return Name; }
104
105 /// Transitional API for cases where we do not yet support
106 /// versioned source language names. Use \ref getName instead.
107 ///
108 /// FIXME: remove once all callers of this API account for versioned
109 /// names.
112 return Name;
113 }
114
115 /// Returns language version. Only valid for versioned language names.
118 return Version;
119 }
120
121 uint16_t getDialect() const { return Dialect; }
122
123 DISourceLanguageName(uint16_t Lang, uint32_t Version, uint16_t Dialect = 0)
124 : Version(Version), Name(Lang), HasVersion(true), Dialect(Dialect) {}
126 : Version(0), Name(Lang), HasVersion(false), Dialect(Dialect) {}
127};
128
129class DbgVariableRecord;
130
132
133/// Tagged DWARF-like metadata node.
134///
135/// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*,
136/// defined in llvm/BinaryFormat/Dwarf.h). Called \a DINode because it's
137/// potentially used for non-DWARF output.
138///
139/// Uses the SubclassData16 Metadata slot.
140class DINode : public MDNode {
141 friend class LLVMContextImpl;
142 friend class MDNode;
143
144protected:
145 DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
147 : MDNode(C, ID, Storage, Ops1, Ops2) {
148 assert(Tag < 1u << 16);
150 }
151 ~DINode() = default;
152
153 template <class Ty> Ty *getOperandAs(unsigned I) const {
155 }
156
157 StringRef getStringOperand(unsigned I) const {
158 if (auto *S = getOperandAs<MDString>(I))
159 return S->getString();
160 return StringRef();
161 }
162
164 if (S.empty())
165 return nullptr;
166 return MDString::get(Context, S);
167 }
168
169 /// Allow subclasses to mutate the tag.
170 void setTag(unsigned Tag) { SubclassData16 = Tag; }
171
172public:
173 LLVM_ABI dwarf::Tag getTag() const;
174
175 /// Debug info flags.
176 ///
177 /// The three accessibility flags are mutually exclusive and rolled together
178 /// in the first two bits.
180#define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
181#define DI_FLAG_LARGEST_NEEDED
182#include "llvm/IR/DebugInfoFlags.def"
183 FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic,
184 FlagPtrToMemberRep = FlagSingleInheritance | FlagMultipleInheritance |
185 FlagVirtualInheritance,
186 LLVM_MARK_AS_BITMASK_ENUM(FlagLargest)
187 };
188
189 LLVM_ABI static DIFlags getFlag(StringRef Flag);
190 LLVM_ABI static StringRef getFlagString(DIFlags Flag);
191
192 /// Split up a flags bitfield.
193 ///
194 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns
195 /// any remaining (unrecognized) bits.
196 LLVM_ABI static DIFlags splitFlags(DIFlags Flags,
197 SmallVectorImpl<DIFlags> &SplitFlags);
198
199 static bool classof(const Metadata *MD) {
200 switch (MD->getMetadataID()) {
201 default:
202 return false;
203 case GenericDINodeKind:
204 case DISubrangeKind:
205 case DIEnumeratorKind:
206 case DIBasicTypeKind:
207 case DIFixedPointTypeKind:
208 case DIStringTypeKind:
209 case DISubrangeTypeKind:
210 case DIDerivedTypeKind:
211 case DICompositeTypeKind:
212 case DISubroutineTypeKind:
213 case DIFileKind:
214 case DICompileUnitKind:
215 case DISubprogramKind:
216 case DILexicalBlockKind:
217 case DILexicalBlockFileKind:
218 case DINamespaceKind:
219 case DICommonBlockKind:
220 case DITemplateTypeParameterKind:
221 case DITemplateValueParameterKind:
222 case DIGlobalVariableKind:
223 case DILocalVariableKind:
224 case DILabelKind:
225 case DIObjCPropertyKind:
226 case DIImportedEntityKind:
227 case DIModuleKind:
228 case DIGenericSubrangeKind:
229 case DIAssignIDKind:
230 return true;
231 }
232 }
233};
234
235/// Generic tagged DWARF-like metadata node.
236///
237/// An un-specialized DWARF-like metadata node. The first operand is a
238/// (possibly empty) null-separated \a MDString header that contains arbitrary
239/// fields. The remaining operands are \a dwarf_operands(), and are pointers
240/// to other metadata.
241///
242/// Uses the SubclassData32 Metadata slot.
243class GenericDINode : public DINode {
244 friend class LLVMContextImpl;
245 friend class MDNode;
246
247 GenericDINode(LLVMContext &C, StorageType Storage, unsigned Hash,
248 unsigned Tag, ArrayRef<Metadata *> Ops1,
250 : DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) {
251 setHash(Hash);
252 }
254
255 void setHash(unsigned Hash) { SubclassData32 = Hash; }
256 void recalculateHash();
257
258 static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
260 StorageType Storage, bool ShouldCreate = true) {
261 return getImpl(Context, Tag, getCanonicalMDString(Context, Header),
262 DwarfOps, Storage, ShouldCreate);
263 }
264
265 LLVM_ABI static GenericDINode *getImpl(LLVMContext &Context, unsigned Tag,
266 MDString *Header,
269 bool ShouldCreate = true);
270
271 TempGenericDINode cloneImpl() const {
274 }
275
276public:
277 unsigned getHash() const { return SubclassData32; }
278
279 DEFINE_MDNODE_GET(GenericDINode,
280 (unsigned Tag, StringRef Header,
282 (Tag, Header, DwarfOps))
283 DEFINE_MDNODE_GET(GenericDINode,
284 (unsigned Tag, MDString *Header,
287
288 /// Return a (temporary) clone of this.
289 TempGenericDINode clone() const { return cloneImpl(); }
290
291 LLVM_ABI dwarf::Tag getTag() const;
292 StringRef getHeader() const { return getStringOperand(0); }
294
295 op_iterator dwarf_op_begin() const { return op_begin() + 1; }
296 op_iterator dwarf_op_end() const { return op_end(); }
299 }
300
301 unsigned getNumDwarfOperands() const { return getNumOperands() - 1; }
302 const MDOperand &getDwarfOperand(unsigned I) const {
303 return getOperand(I + 1);
304 }
305 void replaceDwarfOperandWith(unsigned I, Metadata *New) {
306 replaceOperandWith(I + 1, New);
307 }
308
309 static bool classof(const Metadata *MD) {
310 return MD->getMetadataID() == GenericDINodeKind;
311 }
312};
313
314/// Assignment ID.
315/// Used to link stores (as an attachment) and dbg.assigns (as an operand).
316/// DIAssignID metadata is never uniqued as we compare instances using
317/// referential equality (the instance/address is the ID).
318class DIAssignID : public MDNode {
319 friend class LLVMContextImpl;
320 friend class MDNode;
321
323 : MDNode(C, DIAssignIDKind, Storage, {}) {}
324
325 ~DIAssignID() { dropAllReferences(); }
326
327 LLVM_ABI static DIAssignID *getImpl(LLVMContext &Context, StorageType Storage,
328 bool ShouldCreate = true);
329
330 TempDIAssignID cloneImpl() const { return getTemporary(getContext()); }
331
332public:
333 // This node has no operands to replace.
334 void replaceOperandWith(unsigned I, Metadata *New) = delete;
335
337 return Context.getReplaceableUses()->getAllDbgVariableRecordUsers();
338 }
339
340 static DIAssignID *getDistinct(LLVMContext &Context) {
341 return getImpl(Context, Distinct);
342 }
343 static TempDIAssignID getTemporary(LLVMContext &Context) {
344 return TempDIAssignID(getImpl(Context, Temporary));
345 }
346 // NOTE: Do not define get(LLVMContext&) - see class comment.
347
348 static bool classof(const Metadata *MD) {
349 return MD->getMetadataID() == DIAssignIDKind;
350 }
351};
352
353/// Array subrange.
354class DISubrange : public DINode {
355 friend class LLVMContextImpl;
356 friend class MDNode;
357
359
360 ~DISubrange() = default;
361
362 LLVM_ABI static DISubrange *getImpl(LLVMContext &Context, int64_t Count,
364 bool ShouldCreate = true);
365
366 LLVM_ABI static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
368 bool ShouldCreate = true);
369
370 LLVM_ABI static DISubrange *getImpl(LLVMContext &Context, Metadata *CountNode,
372 Metadata *UpperBound, Metadata *Stride,
374 bool ShouldCreate = true);
375
376 TempDISubrange cloneImpl() const {
377 return getTemporary(getContext(), getRawCountNode(), getRawLowerBound(),
378 getRawUpperBound(), getRawStride());
379 }
380
381public:
382 DEFINE_MDNODE_GET(DISubrange, (int64_t Count, int64_t LowerBound = 0),
383 (Count, LowerBound))
384
385 DEFINE_MDNODE_GET(DISubrange, (Metadata * CountNode, int64_t LowerBound = 0),
387
388 DEFINE_MDNODE_GET(DISubrange,
390 Metadata *UpperBound, Metadata *Stride),
391 (CountNode, LowerBound, UpperBound, Stride))
392
393 TempDISubrange clone() const { return cloneImpl(); }
394
395 Metadata *getRawCountNode() const { return getOperand(0).get(); }
396
397 Metadata *getRawLowerBound() const { return getOperand(1).get(); }
398
399 Metadata *getRawUpperBound() const { return getOperand(2).get(); }
400
401 Metadata *getRawStride() const { return getOperand(3).get(); }
402
403 typedef PointerUnion<ConstantInt *, DIVariable *, DIExpression *> BoundType;
404
405 LLVM_ABI BoundType getCount() const;
406
407 LLVM_ABI BoundType getLowerBound() const;
408
409 LLVM_ABI BoundType getUpperBound() const;
410
411 LLVM_ABI BoundType getStride() const;
412
413 static bool classof(const Metadata *MD) {
414 return MD->getMetadataID() == DISubrangeKind;
415 }
416};
417
418class DIGenericSubrange : public DINode {
419 friend class LLVMContextImpl;
420 friend class MDNode;
421
422 DIGenericSubrange(LLVMContext &C, StorageType Storage,
424
425 ~DIGenericSubrange() = default;
426
427 LLVM_ABI static DIGenericSubrange *
428 getImpl(LLVMContext &Context, Metadata *CountNode, Metadata *LowerBound,
429 Metadata *UpperBound, Metadata *Stride, StorageType Storage,
430 bool ShouldCreate = true);
431
432 TempDIGenericSubrange cloneImpl() const {
435 }
436
437public:
438 DEFINE_MDNODE_GET(DIGenericSubrange,
439 (Metadata * CountNode, Metadata *LowerBound,
440 Metadata *UpperBound, Metadata *Stride),
441 (CountNode, LowerBound, UpperBound, Stride))
442
443 TempDIGenericSubrange clone() const { return cloneImpl(); }
444
445 Metadata *getRawCountNode() const { return getOperand(0).get(); }
446 Metadata *getRawLowerBound() const { return getOperand(1).get(); }
447 Metadata *getRawUpperBound() const { return getOperand(2).get(); }
448 Metadata *getRawStride() const { return getOperand(3).get(); }
449
451
456
457 static bool classof(const Metadata *MD) {
458 return MD->getMetadataID() == DIGenericSubrangeKind;
459 }
460};
461
462/// Enumeration value.
463///
464/// TODO: Add a pointer to the context (DW_TAG_enumeration_type) once that no
465/// longer creates a type cycle.
466class DIEnumerator : public DINode {
467 friend class LLVMContextImpl;
468 friend class MDNode;
469
470 APInt Value;
471 LLVM_ABI DIEnumerator(LLVMContext &C, StorageType Storage, const APInt &Value,
473 DIEnumerator(LLVMContext &C, StorageType Storage, int64_t Value,
475 : DIEnumerator(C, Storage, APInt(64, Value, !IsUnsigned), IsUnsigned,
476 Ops) {}
477 ~DIEnumerator() = default;
478
479 static DIEnumerator *getImpl(LLVMContext &Context, const APInt &Value,
481 StorageType Storage, bool ShouldCreate = true) {
482 return getImpl(Context, Value, IsUnsigned,
483 getCanonicalMDString(Context, Name), Storage, ShouldCreate);
484 }
485 LLVM_ABI static DIEnumerator *getImpl(LLVMContext &Context,
486 const APInt &Value, bool IsUnsigned,
487 MDString *Name, StorageType Storage,
488 bool ShouldCreate = true);
489
490 TempDIEnumerator cloneImpl() const {
492 }
493
494public:
495 DEFINE_MDNODE_GET(DIEnumerator,
496 (int64_t Value, bool IsUnsigned, StringRef Name),
497 (APInt(64, Value, !IsUnsigned), IsUnsigned, Name))
498 DEFINE_MDNODE_GET(DIEnumerator,
499 (int64_t Value, bool IsUnsigned, MDString *Name),
500 (APInt(64, Value, !IsUnsigned), IsUnsigned, Name))
501 DEFINE_MDNODE_GET(DIEnumerator,
502 (APInt Value, bool IsUnsigned, StringRef Name),
503 (Value, IsUnsigned, Name))
504 DEFINE_MDNODE_GET(DIEnumerator,
505 (APInt Value, bool IsUnsigned, MDString *Name),
506 (Value, IsUnsigned, Name))
507
508 TempDIEnumerator clone() const { return cloneImpl(); }
509
510 const APInt &getValue() const { return Value; }
511 bool isUnsigned() const { return SubclassData32; }
512 StringRef getName() const { return getStringOperand(0); }
513
515
516 static bool classof(const Metadata *MD) {
517 return MD->getMetadataID() == DIEnumeratorKind;
518 }
519};
520
521/// Base class for scope-like contexts.
522///
523/// Base class for lexical scopes and types (which are also declaration
524/// contexts).
525///
526/// TODO: Separate the concepts of declaration contexts and lexical scopes.
527class DIScope : public DINode {
528protected:
532 ~DIScope() = default;
533
534public:
536
537 inline StringRef getFilename() const;
538 inline StringRef getDirectory() const;
539 inline std::optional<StringRef> getSource() const;
540
541 LLVM_ABI StringRef getName() const;
542 LLVM_ABI DIScope *getScope() const;
543
544 /// Return the raw underlying file.
545 ///
546 /// A \a DIFile is a \a DIScope, but it doesn't point at a separate file (it
547 /// \em is the file). If \c this is an \a DIFile, we need to return \c this.
548 /// Otherwise, return the first operand, which is where all other subclasses
549 /// store their file pointer.
551 return isa<DIFile>(this) ? const_cast<DIScope *>(this)
552 : static_cast<Metadata *>(getOperand(0));
553 }
554
555 static bool classof(const Metadata *MD) {
556 switch (MD->getMetadataID()) {
557 default:
558 return false;
559 case DIBasicTypeKind:
560 case DIFixedPointTypeKind:
561 case DIStringTypeKind:
562 case DISubrangeTypeKind:
563 case DIDerivedTypeKind:
564 case DICompositeTypeKind:
565 case DISubroutineTypeKind:
566 case DIFileKind:
567 case DICompileUnitKind:
568 case DISubprogramKind:
569 case DILexicalBlockKind:
570 case DILexicalBlockFileKind:
571 case DINamespaceKind:
572 case DICommonBlockKind:
573 case DIModuleKind:
574 return true;
575 }
576 }
577};
578
579/// File.
580///
581/// TODO: Merge with directory/file node (including users).
582/// TODO: Canonicalize paths on creation.
583class DIFile : public DIScope {
584 friend class LLVMContextImpl;
585 friend class MDNode;
586
587public:
588 /// Which algorithm (e.g. MD5) a checksum was generated with.
589 ///
590 /// The encoding is explicit because it is used directly in Bitcode. The
591 /// value 0 is reserved to indicate the absence of a checksum in Bitcode.
593 // The first variant was originally CSK_None, encoded as 0. The new
594 // internal representation removes the need for this by wrapping the
595 // ChecksumInfo in an Optional, but to preserve Bitcode compatibility the 0
596 // encoding is reserved.
600 CSK_Last = CSK_SHA256 // Should be last enumeration.
601 };
602
603 /// A single checksum, represented by a \a Kind and a \a Value (a string).
604 template <typename T> struct ChecksumInfo {
605 /// The kind of checksum which \a Value encodes.
607 /// The string value of the checksum.
609
611 ~ChecksumInfo() = default;
612 bool operator==(const ChecksumInfo<T> &X) const {
613 return Kind == X.Kind && Value == X.Value;
614 }
615 bool operator!=(const ChecksumInfo<T> &X) const { return !(*this == X); }
616 StringRef getKindAsString() const { return getChecksumKindAsString(Kind); }
617 };
618
619private:
620 std::optional<ChecksumInfo<MDString *>> Checksum;
621 /// An optional source. A nullptr means none.
623
625 std::optional<ChecksumInfo<MDString *>> CS, MDString *Src,
627 ~DIFile() = default;
628
629 static DIFile *getImpl(LLVMContext &Context, StringRef Filename,
631 std::optional<ChecksumInfo<StringRef>> CS,
632 std::optional<StringRef> Source, StorageType Storage,
633 bool ShouldCreate = true) {
634 std::optional<ChecksumInfo<MDString *>> MDChecksum;
635 if (CS)
636 MDChecksum.emplace(CS->Kind, getCanonicalMDString(Context, CS->Value));
637 return getImpl(Context, getCanonicalMDString(Context, Filename),
638 getCanonicalMDString(Context, Directory), MDChecksum,
639 Source ? MDString::get(Context, *Source) : nullptr, Storage,
640 ShouldCreate);
641 }
642 LLVM_ABI static DIFile *getImpl(LLVMContext &Context, MDString *Filename,
643 MDString *Directory,
644 std::optional<ChecksumInfo<MDString *>> CS,
645 MDString *Source, StorageType Storage,
646 bool ShouldCreate = true);
647
648 TempDIFile cloneImpl() const {
650 getChecksum(), getSource());
651 }
652
653public:
656 std::optional<ChecksumInfo<StringRef>> CS = std::nullopt,
657 std::optional<StringRef> Source = std::nullopt),
658 (Filename, Directory, CS, Source))
659 DEFINE_MDNODE_GET(DIFile,
661 std::optional<ChecksumInfo<MDString *>> CS = std::nullopt,
662 MDString *Source = nullptr),
663 (Filename, Directory, CS, Source))
664
665 TempDIFile clone() const { return cloneImpl(); }
666
667 StringRef getFilename() const { return getStringOperand(0); }
668 StringRef getDirectory() const { return getStringOperand(1); }
669 std::optional<ChecksumInfo<StringRef>> getChecksum() const {
670 std::optional<ChecksumInfo<StringRef>> StringRefChecksum;
671 if (Checksum)
672 StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString());
673 return StringRefChecksum;
674 }
675 std::optional<StringRef> getSource() const {
676 return Source ? std::optional<StringRef>(Source->getString())
677 : std::nullopt;
678 }
679
680 MDString *getRawFilename() const { return getOperandAs<MDString>(0); }
681 MDString *getRawDirectory() const { return getOperandAs<MDString>(1); }
682 std::optional<ChecksumInfo<MDString *>> getRawChecksum() const {
683 return Checksum;
684 }
685 MDString *getRawSource() const { return Source; }
686
687 LLVM_ABI static StringRef getChecksumKindAsString(ChecksumKind CSKind);
688 LLVM_ABI static std::optional<ChecksumKind>
689 getChecksumKind(StringRef CSKindStr);
690
691 static bool classof(const Metadata *MD) {
692 return MD->getMetadataID() == DIFileKind;
693 }
694};
695
697 if (auto *F = getFile())
698 return F->getFilename();
699 return "";
700}
701
703 if (auto *F = getFile())
704 return F->getDirectory();
705 return "";
706}
707
708std::optional<StringRef> DIScope::getSource() const {
709 if (auto *F = getFile())
710 return F->getSource();
711 return std::nullopt;
712}
713
714/// Base class for types.
715///
716/// TODO: Remove the hardcoded name and context, since many types don't use
717/// them.
718/// TODO: Split up flags.
719///
720/// Uses the SubclassData32 Metadata slot.
721class DIType : public DIScope {
722 unsigned Line;
723 DIFlags Flags;
724 uint32_t NumExtraInhabitants;
725
726protected:
727 static constexpr unsigned N_OPERANDS = 5;
728
729 DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
730 unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants,
732 : DIScope(C, ID, Storage, Tag, Ops) {
733 init(Line, AlignInBits, NumExtraInhabitants, Flags);
734 }
735 ~DIType() = default;
736
737 void init(unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants,
738 DIFlags Flags) {
739 this->Line = Line;
740 this->Flags = Flags;
741 this->SubclassData32 = AlignInBits;
742 this->NumExtraInhabitants = NumExtraInhabitants;
743 }
744
745 /// Change fields in place.
746 void mutate(unsigned Tag, unsigned Line, uint32_t AlignInBits,
747 uint32_t NumExtraInhabitants, DIFlags Flags) {
748 assert(isDistinct() && "Only distinct nodes can mutate");
749 setTag(Tag);
750 init(Line, AlignInBits, NumExtraInhabitants, Flags);
751 }
752
753public:
754 TempDIType clone() const {
755 return TempDIType(cast<DIType>(MDNode::clone().release()));
756 }
757
758 unsigned getLine() const { return Line; }
760 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
761 uint32_t getNumExtraInhabitants() const { return NumExtraInhabitants; }
762 DIFlags getFlags() const { return Flags; }
763
765 StringRef getName() const { return getStringOperand(2); }
766
767 Metadata *getRawScope() const { return getOperand(1); }
769
770 Metadata *getRawSizeInBits() const { return getOperand(3); }
773 if (ConstantInt *CI = dyn_cast_or_null<ConstantInt>(MD->getValue()))
774 return CI->getZExtValue();
775 }
776 return 0;
777 }
778
779 Metadata *getRawOffsetInBits() const { return getOperand(4); }
782 if (ConstantInt *CI = dyn_cast_or_null<ConstantInt>(MD->getValue()))
783 return CI->getZExtValue();
784 }
785 return 0;
786 }
787
788 /// Returns a new temporary DIType with updated Flags
789 TempDIType cloneWithFlags(DIFlags NewFlags) const {
790 auto NewTy = clone();
791 NewTy->Flags = NewFlags;
792 return NewTy;
793 }
794
795 bool isPrivate() const {
796 return (getFlags() & FlagAccessibility) == FlagPrivate;
797 }
798 bool isProtected() const {
799 return (getFlags() & FlagAccessibility) == FlagProtected;
800 }
801 bool isPublic() const {
802 return (getFlags() & FlagAccessibility) == FlagPublic;
803 }
804 bool isForwardDecl() const { return getFlags() & FlagFwdDecl; }
805 bool isAppleBlockExtension() const { return getFlags() & FlagAppleBlock; }
806 bool isVirtual() const { return getFlags() & FlagVirtual; }
807 bool isArtificial() const { return getFlags() & FlagArtificial; }
808 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
809 bool isObjcClassComplete() const {
810 return getFlags() & FlagObjcClassComplete;
811 }
812 bool isVector() const { return getFlags() & FlagVector; }
813 bool isBitField() const { return getFlags() & FlagBitField; }
814 bool isStaticMember() const { return getFlags() & FlagStaticMember; }
815 bool isLValueReference() const { return getFlags() & FlagLValueReference; }
816 bool isRValueReference() const { return getFlags() & FlagRValueReference; }
817 bool isTypePassByValue() const { return getFlags() & FlagTypePassByValue; }
819 return getFlags() & FlagTypePassByReference;
820 }
821 bool isBigEndian() const { return getFlags() & FlagBigEndian; }
822 bool isLittleEndian() const { return getFlags() & FlagLittleEndian; }
823 bool getExportSymbols() const { return getFlags() & FlagExportSymbols; }
824
825 static bool classof(const Metadata *MD) {
826 switch (MD->getMetadataID()) {
827 default:
828 return false;
829 case DIBasicTypeKind:
830 case DIFixedPointTypeKind:
831 case DIStringTypeKind:
832 case DISubrangeTypeKind:
833 case DIDerivedTypeKind:
834 case DICompositeTypeKind:
835 case DISubroutineTypeKind:
836 return true;
837 }
838 }
839};
840
841/// Basic type, like 'int' or 'float'.
842///
843/// TODO: Split out DW_TAG_unspecified_type.
844/// TODO: Drop unused accessors.
845class DIBasicType : public DIType {
846 friend class LLVMContextImpl;
847 friend class MDNode;
848
849 unsigned Encoding;
850 /// Describes the number of bits used by the value of the object. Non-zero
851 /// when the value of an object does not fully occupy the storage size
852 /// specified by SizeInBits.
853 uint32_t DataSizeInBits;
854
855protected:
857 unsigned LineNo, uint32_t AlignInBits, unsigned Encoding,
858 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
860 : DIType(C, DIBasicTypeKind, Storage, Tag, LineNo, AlignInBits,
862 Encoding(Encoding), DataSizeInBits(DataSizeInBits) {}
864 unsigned LineNo, uint32_t AlignInBits, unsigned Encoding,
865 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
868 Flags, Ops),
869 Encoding(Encoding), DataSizeInBits(DataSizeInBits) {}
870 ~DIBasicType() = default;
871
872 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
873 StringRef Name, DIFile *File, unsigned LineNo,
875 uint32_t AlignInBits, unsigned Encoding,
877 uint32_t DataSizeInBits, DIFlags Flags,
878 StorageType Storage, bool ShouldCreate = true) {
879 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
880 LineNo, Scope, SizeInBits, AlignInBits, Encoding,
881 NumExtraInhabitants, DataSizeInBits, Flags, Storage,
882 ShouldCreate);
883 }
884 static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
885 MDString *Name, DIFile *File, unsigned LineNo,
887 uint32_t AlignInBits, unsigned Encoding,
889 uint32_t DataSizeInBits, DIFlags Flags,
890 StorageType Storage, bool ShouldCreate = true) {
891 auto *SizeInBitsNode = ConstantAsMetadata::get(
892 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
893 return getImpl(Context, Tag, Name, File, LineNo, Scope, SizeInBitsNode,
894 AlignInBits, Encoding, NumExtraInhabitants, DataSizeInBits,
895 Flags, Storage, ShouldCreate);
896 }
897 LLVM_ABI static DIBasicType *
898 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
899 unsigned LineNo, Metadata *Scope, Metadata *SizeInBits,
902 bool ShouldCreate = true);
903
904 TempDIBasicType cloneImpl() const {
905 return getTemporary(
909 }
910
911public:
913 (Tag, Name, nullptr, 0, nullptr, 0, 0, 0, 0, 0, FlagZero))
916 (Tag, Name, nullptr, 0, nullptr, SizeInBits, 0, 0, 0, 0,
917 FlagZero))
919 (unsigned Tag, MDString *Name, uint64_t SizeInBits),
920 (Tag, Name, nullptr, 0, nullptr, SizeInBits, 0, 0, 0, 0,
921 FlagZero))
924 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
925 (Tag, Name, nullptr, 0, nullptr, SizeInBits, AlignInBits,
926 Encoding, 0, 0, Flags))
928 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
929 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
930 (Tag, Name, nullptr, 0, nullptr, SizeInBits, AlignInBits,
931 Encoding, 0, 0, Flags))
934 uint32_t AlignInBits, unsigned Encoding,
936 (Tag, Name, nullptr, 0, nullptr, SizeInBits, AlignInBits,
940 uint32_t AlignInBits, unsigned Encoding,
941 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
942 DIFlags Flags),
943 (Tag, Name, nullptr, 0, nullptr, SizeInBits, AlignInBits,
944 Encoding, NumExtraInhabitants, DataSizeInBits, Flags))
948 uint32_t AlignInBits, unsigned Encoding,
952 Encoding, NumExtraInhabitants, DataSizeInBits, Flags))
954 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
955 uint32_t AlignInBits, unsigned Encoding,
956 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
957 DIFlags Flags),
958 (Tag, Name, nullptr, 0, nullptr, SizeInBits, AlignInBits,
959 Encoding, NumExtraInhabitants, DataSizeInBits, Flags))
962 uint32_t AlignInBits, unsigned Encoding,
965 (Tag, Name, nullptr, 0, nullptr, SizeInBits, AlignInBits,
966 Encoding, NumExtraInhabitants, DataSizeInBits, Flags))
968 (unsigned Tag, MDString *Name, Metadata *File,
970 uint32_t AlignInBits, unsigned Encoding,
971 uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
972 DIFlags Flags),
974 Encoding, NumExtraInhabitants, DataSizeInBits, Flags))
975
976 TempDIBasicType clone() const { return cloneImpl(); }
977
978 unsigned getEncoding() const { return Encoding; }
979
980 uint32_t getDataSizeInBits() const { return DataSizeInBits; }
981
982 enum class Signedness { Signed, Unsigned };
983
984 /// Return the signedness of this type, or std::nullopt if this type is
985 /// neither signed nor unsigned.
986 LLVM_ABI std::optional<Signedness> getSignedness() const;
987
988 static bool classof(const Metadata *MD) {
989 return MD->getMetadataID() == DIBasicTypeKind ||
990 MD->getMetadataID() == DIFixedPointTypeKind;
991 }
992};
993
994/// Fixed-point type.
995class DIFixedPointType : public DIBasicType {
996 friend class LLVMContextImpl;
997 friend class MDNode;
998
999 // Actually FixedPointKind.
1000 unsigned Kind;
1001 // Used for binary and decimal.
1002 int Factor;
1003 // Used for rational.
1004 APInt Numerator;
1005 APInt Denominator;
1006
1007 DIFixedPointType(LLVMContext &C, StorageType Storage, unsigned Tag,
1008 unsigned LineNo, uint32_t AlignInBits, unsigned Encoding,
1009 DIFlags Flags, unsigned Kind, int Factor,
1011 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, LineNo, AlignInBits,
1012 Encoding, 0, 0, Flags, Ops),
1013 Kind(Kind), Factor(Factor) {
1014 assert(Kind == FixedPointBinary || Kind == FixedPointDecimal);
1015 }
1017 unsigned LineNo, uint32_t AlignInBits, unsigned Encoding,
1018 DIFlags Flags, unsigned Kind, APInt Numerator,
1020 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, LineNo, AlignInBits,
1021 Encoding, 0, 0, Flags, Ops),
1022 Kind(Kind), Factor(0), Numerator(Numerator), Denominator(Denominator) {
1023 assert(Kind == FixedPointRational);
1024 }
1025 DIFixedPointType(LLVMContext &C, StorageType Storage, unsigned Tag,
1026 unsigned LineNo, uint32_t AlignInBits, unsigned Encoding,
1027 DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
1029 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, LineNo, AlignInBits,
1030 Encoding, 0, 0, Flags, Ops),
1031 Kind(Kind), Factor(Factor), Numerator(Numerator),
1033 ~DIFixedPointType() = default;
1034
1035 static DIFixedPointType *
1036 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1037 unsigned LineNo, DIScope *Scope, uint64_t SizeInBits,
1038 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags, unsigned Kind,
1039 int Factor, APInt Numerator, APInt Denominator, StorageType Storage,
1040 bool ShouldCreate = true) {
1041 auto *SizeInBitsNode = ConstantAsMetadata::get(
1042 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1043 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1044 LineNo, Scope, SizeInBitsNode, AlignInBits, Encoding, Flags,
1045 Kind, Factor, Numerator, Denominator, Storage, ShouldCreate);
1046 }
1047 static DIFixedPointType *
1048 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1049 unsigned LineNo, DIScope *Scope, Metadata *SizeInBits,
1050 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags, unsigned Kind,
1051 int Factor, APInt Numerator, APInt Denominator, StorageType Storage,
1052 bool ShouldCreate = true) {
1053 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1055 Kind, Factor, Numerator, Denominator, Storage, ShouldCreate);
1056 }
1057 static DIFixedPointType *
1058 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, DIFile *File,
1059 unsigned LineNo, DIScope *Scope, uint64_t SizeInBits,
1060 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags, unsigned Kind,
1061 int Factor, APInt Numerator, APInt Denominator, StorageType Storage,
1062 bool ShouldCreate = true) {
1063 auto *SizeInBitsNode = ConstantAsMetadata::get(
1064 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1065 return getImpl(Context, Tag, Name, File, LineNo, Scope, SizeInBitsNode,
1066 AlignInBits, Encoding, Flags, Kind, Factor, Numerator,
1067 Denominator, Storage, ShouldCreate);
1068 }
1069 LLVM_ABI static DIFixedPointType *
1070 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1072 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags, unsigned Kind,
1073 int Factor, APInt Numerator, APInt Denominator, StorageType Storage,
1074 bool ShouldCreate = true);
1075
1076 TempDIFixedPointType cloneImpl() const {
1079 getAlignInBits(), getEncoding(), getFlags(), Kind,
1080 Factor, Numerator, Denominator);
1081 }
1082
1083public:
1084 enum FixedPointKind : unsigned {
1085 /// Scale factor 2^Factor.
1087 /// Scale factor 10^Factor.
1089 /// Arbitrary rational scale factor.
1092 };
1093
1094 LLVM_ABI static std::optional<FixedPointKind>
1096 LLVM_ABI static const char *fixedPointKindString(FixedPointKind);
1097
1098 DEFINE_MDNODE_GET(DIFixedPointType,
1099 (unsigned Tag, MDString *Name, DIFile *File,
1102 unsigned Kind, int Factor, APInt Numerator,
1103 APInt Denominator),
1105 Encoding, Flags, Kind, Factor, Numerator, Denominator))
1106 DEFINE_MDNODE_GET(DIFixedPointType,
1110 unsigned Kind, int Factor, APInt Numerator,
1111 APInt Denominator),
1113 Encoding, Flags, Kind, Factor, Numerator, Denominator))
1114 DEFINE_MDNODE_GET(DIFixedPointType,
1115 (unsigned Tag, MDString *Name, Metadata *File,
1118 unsigned Kind, int Factor, APInt Numerator,
1119 APInt Denominator),
1121 Encoding, Flags, Kind, Factor, Numerator, Denominator))
1122
1123 TempDIFixedPointType clone() const { return cloneImpl(); }
1124
1125 bool isBinary() const { return Kind == FixedPointBinary; }
1126 bool isDecimal() const { return Kind == FixedPointDecimal; }
1127 bool isRational() const { return Kind == FixedPointRational; }
1128
1129 LLVM_ABI bool isSigned() const;
1130
1131 FixedPointKind getKind() const { return static_cast<FixedPointKind>(Kind); }
1132
1133 int getFactorRaw() const { return Factor; }
1134 int getFactor() const {
1135 assert(Kind == FixedPointBinary || Kind == FixedPointDecimal);
1136 return Factor;
1137 }
1138
1139 const APInt &getNumeratorRaw() const { return Numerator; }
1140 const APInt &getNumerator() const {
1141 assert(Kind == FixedPointRational);
1142 return Numerator;
1143 }
1144
1145 const APInt &getDenominatorRaw() const { return Denominator; }
1146 const APInt &getDenominator() const {
1147 assert(Kind == FixedPointRational);
1148 return Denominator;
1149 }
1150
1151 static bool classof(const Metadata *MD) {
1152 return MD->getMetadataID() == DIFixedPointTypeKind;
1153 }
1154};
1155
1156/// String type, Fortran CHARACTER(n)
1157class DIStringType : public DIType {
1158 friend class LLVMContextImpl;
1159 friend class MDNode;
1160
1161 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1162
1163 unsigned Encoding;
1164
1165 DIStringType(LLVMContext &C, StorageType Storage, unsigned Tag,
1166 uint32_t AlignInBits, unsigned Encoding,
1168 : DIType(C, DIStringTypeKind, Storage, Tag, 0, AlignInBits, 0, FlagZero,
1169 Ops),
1170 Encoding(Encoding) {}
1171 ~DIStringType() = default;
1172
1173 static DIStringType *getImpl(LLVMContext &Context, unsigned Tag,
1175 Metadata *StrLenExp, Metadata *StrLocationExp,
1177 unsigned Encoding, StorageType Storage,
1178 bool ShouldCreate = true) {
1179 auto *SizeInBitsNode = ConstantAsMetadata::get(
1180 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1181 return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
1182 StringLength, StrLenExp, StrLocationExp, SizeInBitsNode,
1183 AlignInBits, Encoding, Storage, ShouldCreate);
1184 }
1185 static DIStringType *getImpl(LLVMContext &Context, unsigned Tag,
1186 MDString *Name, Metadata *StringLength,
1187 Metadata *StrLenExp, Metadata *StrLocationExp,
1189 unsigned Encoding, StorageType Storage,
1190 bool ShouldCreate = true) {
1191 auto *SizeInBitsNode = ConstantAsMetadata::get(
1192 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1193 return getImpl(Context, Tag, Name, StringLength, StrLenExp, StrLocationExp,
1194 SizeInBitsNode, AlignInBits, Encoding, Storage,
1195 ShouldCreate);
1196 }
1197 LLVM_ABI static DIStringType *
1198 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
1199 Metadata *StringLength, Metadata *StrLenExp, Metadata *StrLocationExp,
1200 Metadata *SizeInBits, uint32_t AlignInBits, unsigned Encoding,
1201 StorageType Storage, bool ShouldCreate = true);
1202
1203 TempDIStringType cloneImpl() const {
1208 }
1209
1210public:
1211 DEFINE_MDNODE_GET(DIStringType,
1212 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
1214 (Tag, Name, nullptr, nullptr, nullptr, SizeInBits,
1215 AlignInBits, 0))
1216 DEFINE_MDNODE_GET(DIStringType,
1220 unsigned Encoding),
1223 DEFINE_MDNODE_GET(DIStringType,
1224 (unsigned Tag, StringRef Name, Metadata *StringLength,
1227 unsigned Encoding),
1230 DEFINE_MDNODE_GET(DIStringType,
1234 unsigned Encoding),
1237
1238 TempDIStringType clone() const { return cloneImpl(); }
1239
1240 static bool classof(const Metadata *MD) {
1241 return MD->getMetadataID() == DIStringTypeKind;
1242 }
1243
1247
1251
1255
1256 unsigned getEncoding() const { return Encoding; }
1257
1258 Metadata *getRawStringLength() const { return getOperand(MY_FIRST_OPERAND); }
1259
1261 return getOperand(MY_FIRST_OPERAND + 1);
1262 }
1263
1265 return getOperand(MY_FIRST_OPERAND + 2);
1266 }
1267};
1268
1269/// Derived types.
1270///
1271/// This includes qualified types, pointers, references, friends, typedefs, and
1272/// class members.
1273///
1274/// TODO: Split out members (inheritance, fields, methods, etc.).
1275class DIDerivedType : public DIType {
1276public:
1277 /// Pointer authentication (__ptrauth) metadata.
1279 // RawData layout:
1280 // - Bits 0..3: Key
1281 // - Bit 4: IsAddressDiscriminated
1282 // - Bits 5..20: ExtraDiscriminator
1283 // - Bit 21: IsaPointer
1284 // - Bit 22: AuthenticatesNullValues
1285 unsigned RawData;
1286
1287 PtrAuthData(unsigned FromRawData) : RawData(FromRawData) {}
1288 PtrAuthData(unsigned Key, bool IsDiscr, unsigned Discriminator,
1289 bool IsaPointer, bool AuthenticatesNullValues) {
1290 assert(Key < 16);
1291 assert(Discriminator <= 0xffff);
1292 RawData = (Key << 0) | (IsDiscr ? (1 << 4) : 0) | (Discriminator << 5) |
1293 (IsaPointer ? (1 << 21) : 0) |
1294 (AuthenticatesNullValues ? (1 << 22) : 0);
1295 }
1296
1297 unsigned key() { return (RawData >> 0) & 0b1111; }
1298 bool isAddressDiscriminated() { return (RawData >> 4) & 1; }
1299 unsigned extraDiscriminator() { return (RawData >> 5) & 0xffff; }
1300 bool isaPointer() { return (RawData >> 21) & 1; }
1301 bool authenticatesNullValues() { return (RawData >> 22) & 1; }
1302 };
1303
1304private:
1305 friend class LLVMContextImpl;
1306 friend class MDNode;
1307
1308 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1309
1310 /// The DWARF address space of the memory pointed to or referenced by a
1311 /// pointer or reference type respectively.
1312 std::optional<unsigned> DWARFAddressSpace;
1313
1314 DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag,
1315 unsigned Line, uint32_t AlignInBits,
1316 std::optional<unsigned> DWARFAddressSpace,
1317 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1319 : DIType(C, DIDerivedTypeKind, Storage, Tag, Line, AlignInBits, 0, Flags,
1320 Ops),
1321 DWARFAddressSpace(DWARFAddressSpace) {
1322 if (PtrAuthData)
1324 }
1325 ~DIDerivedType() = default;
1326 static DIDerivedType *
1327 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1328 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1330 std::optional<unsigned> DWARFAddressSpace,
1331 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1333 bool ShouldCreate = true) {
1334 auto *SizeInBitsNode = ConstantAsMetadata::get(
1335 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1336 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1337 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1338 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1339 Line, Scope, BaseType, SizeInBitsNode, AlignInBits,
1340 OffsetInBitsNode, DWARFAddressSpace, PtrAuthData, Flags,
1341 ExtraData, Annotations.get(), Storage, ShouldCreate);
1342 }
1343 static DIDerivedType *
1344 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, DIFile *File,
1345 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1347 std::optional<unsigned> DWARFAddressSpace,
1348 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1350 bool ShouldCreate = true) {
1351 auto *SizeInBitsNode = ConstantAsMetadata::get(
1352 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1353 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1354 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1355 return getImpl(Context, Tag, Name, File, Line, Scope, BaseType,
1356 SizeInBitsNode, AlignInBits, OffsetInBitsNode,
1358 Annotations.get(), Storage, ShouldCreate);
1359 }
1360 static DIDerivedType *
1361 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
1364 std::optional<unsigned> DWARFAddressSpace,
1365 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1367 bool ShouldCreate = true) {
1368 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1370 DWARFAddressSpace, PtrAuthData, Flags, ExtraData,
1371 Annotations.get(), Storage, ShouldCreate);
1372 }
1373 LLVM_ABI static DIDerivedType *
1374 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1375 unsigned Line, Metadata *Scope, Metadata *BaseType,
1377 std::optional<unsigned> DWARFAddressSpace,
1378 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1380 bool ShouldCreate = true);
1381
1382 TempDIDerivedType cloneImpl() const {
1383 return getTemporary(
1386 getRawOffsetInBits(), getDWARFAddressSpace(), getPtrAuthData(),
1388 }
1389
1390public:
1391 DEFINE_MDNODE_GET(DIDerivedType,
1392 (unsigned Tag, MDString *Name, Metadata *File,
1393 unsigned Line, Metadata *Scope, Metadata *BaseType,
1396 std::optional<unsigned> DWARFAddressSpace,
1397 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1398 Metadata *ExtraData = nullptr,
1399 Metadata *Annotations = nullptr),
1401 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1403 DEFINE_MDNODE_GET(DIDerivedType,
1404 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1407 std::optional<unsigned> DWARFAddressSpace,
1408 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1410 DINodeArray Annotations = nullptr),
1412 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1414 DEFINE_MDNODE_GET(DIDerivedType,
1415 (unsigned Tag, MDString *Name, DIFile *File, unsigned Line,
1418 std::optional<unsigned> DWARFAddressSpace,
1419 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1420 Metadata *ExtraData = nullptr,
1421 DINodeArray Annotations = nullptr),
1423 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1425 DEFINE_MDNODE_GET(DIDerivedType,
1426 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1429 std::optional<unsigned> DWARFAddressSpace,
1430 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1431 Metadata *ExtraData = nullptr,
1432 DINodeArray Annotations = nullptr),
1434 AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1436
1437 TempDIDerivedType clone() const { return cloneImpl(); }
1438
1439 /// Get the base type this is derived from.
1440 DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
1441 Metadata *getRawBaseType() const { return getOperand(MY_FIRST_OPERAND); }
1442
1443 /// \returns The DWARF address space of the memory pointed to or referenced by
1444 /// a pointer or reference type respectively.
1445 std::optional<unsigned> getDWARFAddressSpace() const {
1446 return DWARFAddressSpace;
1447 }
1448
1449 LLVM_ABI std::optional<PtrAuthData> getPtrAuthData() const;
1450
1451 /// Get extra data associated with this derived type.
1452 ///
1453 /// Class type for pointer-to-members, objective-c property node for ivars,
1454 /// global constant wrapper for static members, virtual base pointer offset
1455 /// for inheritance, a tuple of template parameters for template aliases,
1456 /// discriminant for a variant, or storage offset for a bit field.
1457 ///
1458 /// TODO: Separate out types that need this extra operand: pointer-to-member
1459 /// types and member fields (static members and ivars).
1461 Metadata *getRawExtraData() const { return getOperand(MY_FIRST_OPERAND + 1); }
1462
1463 /// Get the template parameters from a template alias.
1464 DITemplateParameterArray getTemplateParams() const {
1466 }
1467
1468 /// Get annotations associated with this derived type.
1469 DINodeArray getAnnotations() const {
1471 }
1473 return getOperand(MY_FIRST_OPERAND + 2);
1474 }
1475
1476 /// Get casted version of extra data.
1477 /// @{
1478 LLVM_ABI DIType *getClassType() const;
1479
1483
1485
1487
1488 LLVM_ABI Constant *getConstant() const;
1489
1491 /// @}
1492
1493 static bool classof(const Metadata *MD) {
1494 return MD->getMetadataID() == DIDerivedTypeKind;
1495 }
1496};
1497
1500 return Lhs.RawData == Rhs.RawData;
1501}
1502
1505 return !(Lhs == Rhs);
1506}
1507
1508/// Subrange type. This is somewhat similar to DISubrange, but it
1509/// is also a DIType.
1510class DISubrangeType : public DIType {
1511public:
1513 DIDerivedType *>
1515
1516private:
1517 friend class LLVMContextImpl;
1518 friend class MDNode;
1519
1520 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1521
1522 DISubrangeType(LLVMContext &C, StorageType Storage, unsigned Line,
1524
1525 ~DISubrangeType() = default;
1526
1527 static DISubrangeType *
1528 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line,
1532 StorageType Storage, bool ShouldCreate = true) {
1533 auto *SizeInBitsNode = ConstantAsMetadata::get(
1534 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1535 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line,
1536 Scope, SizeInBitsNode, AlignInBits, Flags, BaseType,
1537 LowerBound, UpperBound, Stride, Bias, Storage, ShouldCreate);
1538 }
1539
1540 LLVM_ABI static DISubrangeType *
1541 getImpl(LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
1543 DIFlags Flags, Metadata *BaseType, Metadata *LowerBound,
1545 StorageType Storage, bool ShouldCreate = true);
1546
1547 TempDISubrangeType cloneImpl() const {
1552 }
1553
1554 LLVM_ABI BoundType convertRawToBound(Metadata *IN) const;
1555
1556public:
1557 DEFINE_MDNODE_GET(DISubrangeType,
1558 (MDString * Name, Metadata *File, unsigned Line,
1565 DEFINE_MDNODE_GET(DISubrangeType,
1572
1573 TempDISubrangeType clone() const { return cloneImpl(); }
1574
1575 /// Get the base type this is derived from.
1577 Metadata *getRawBaseType() const { return getOperand(MY_FIRST_OPERAND); }
1578
1580 return getOperand(MY_FIRST_OPERAND + 1).get();
1581 }
1582
1584 return getOperand(MY_FIRST_OPERAND + 2).get();
1585 }
1586
1588 return getOperand(MY_FIRST_OPERAND + 3).get();
1589 }
1590
1592 return getOperand(MY_FIRST_OPERAND + 4).get();
1593 }
1594
1596 return convertRawToBound(getRawLowerBound());
1597 }
1598
1600 return convertRawToBound(getRawUpperBound());
1601 }
1602
1603 BoundType getStride() const { return convertRawToBound(getRawStride()); }
1604
1605 BoundType getBias() const { return convertRawToBound(getRawBias()); }
1606
1607 static bool classof(const Metadata *MD) {
1608 return MD->getMetadataID() == DISubrangeTypeKind;
1609 }
1610};
1611
1612/// Composite types.
1613///
1614/// TODO: Detach from DerivedTypeBase (split out MDEnumType?).
1615/// TODO: Create a custom, unrelated node for DW_TAG_array_type.
1616class DICompositeType : public DIType {
1617 friend class LLVMContextImpl;
1618 friend class MDNode;
1619
1620 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1621
1622 unsigned RuntimeLang;
1623 std::optional<uint32_t> EnumKind;
1624
1625 DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
1626 unsigned Line, unsigned RuntimeLang, uint32_t AlignInBits,
1628 std::optional<uint32_t> EnumKind, DIFlags Flags,
1630 : DIType(C, DICompositeTypeKind, Storage, Tag, Line, AlignInBits,
1632 RuntimeLang(RuntimeLang), EnumKind(EnumKind) {}
1633 ~DICompositeType() = default;
1634
1635 /// Change fields in place.
1636 void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang,
1638 std::optional<uint32_t> EnumKind, DIFlags Flags) {
1639 assert(isDistinct() && "Only distinct nodes can mutate");
1640 assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate");
1641 this->RuntimeLang = RuntimeLang;
1642 this->EnumKind = EnumKind;
1644 }
1645
1646 static DICompositeType *
1647 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
1648 unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1650 uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1651 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1652 DIType *VTableHolder, DITemplateParameterArray TemplateParams,
1653 StringRef Identifier, DIDerivedType *Discriminator,
1655 Metadata *Rank, DINodeArray Annotations, Metadata *BitStride,
1656 StorageType Storage, bool ShouldCreate = true) {
1657 auto *SizeInBitsNode = ConstantAsMetadata::get(
1658 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1659 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1660 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1661 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1662 Line, Scope, BaseType, SizeInBitsNode, AlignInBits,
1663 OffsetInBitsNode, Flags, Elements.get(), RuntimeLang,
1665 getCanonicalMDString(Context, Identifier), Discriminator,
1668 ShouldCreate);
1669 }
1670 static DICompositeType *
1671 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1672 unsigned Line, Metadata *Scope, Metadata *BaseType,
1673 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1674 DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
1675 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1680 Metadata *BitStride, StorageType Storage, bool ShouldCreate = true) {
1681 auto *SizeInBitsNode = ConstantAsMetadata::get(
1682 ConstantInt::get(Type::getInt64Ty(Context), SizeInBits));
1683 auto *OffsetInBitsNode = ConstantAsMetadata::get(
1684 ConstantInt::get(Type::getInt64Ty(Context), OffsetInBits));
1685 return getImpl(Context, Tag, Name, File, Line, Scope, BaseType,
1686 SizeInBitsNode, AlignInBits, OffsetInBitsNode, Flags,
1687 Elements, RuntimeLang, EnumKind, VTableHolder,
1690 NumExtraInhabitants, BitStride, Storage, ShouldCreate);
1691 }
1692 static DICompositeType *
1693 getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
1696 uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1697 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1698 DIType *VTableHolder, DITemplateParameterArray TemplateParams,
1699 StringRef Identifier, DIDerivedType *Discriminator,
1701 Metadata *Rank, DINodeArray Annotations, Metadata *BitStride,
1702 StorageType Storage, bool ShouldCreate = true) {
1703 return getImpl(
1704 Context, Tag, getCanonicalMDString(Context, Name), File, Line, Scope,
1706 RuntimeLang, EnumKind, VTableHolder, TemplateParams.get(),
1709 NumExtraInhabitants, BitStride, Storage, ShouldCreate);
1710 }
1711 LLVM_ABI static DICompositeType *
1712 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1713 unsigned Line, Metadata *Scope, Metadata *BaseType,
1715 DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
1716 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1721 Metadata *BitStride, StorageType Storage, bool ShouldCreate = true);
1722
1723 TempDICompositeType cloneImpl() const {
1724 return getTemporary(
1732 getRawBitStride());
1733 }
1734
1735public:
1737 DICompositeType,
1738 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1741 DINodeArray Elements, unsigned RuntimeLang,
1742 std::optional<uint32_t> EnumKind, DIType *VTableHolder,
1743 DITemplateParameterArray TemplateParams = nullptr,
1745 Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
1746 Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1747 DINodeArray Annotations = nullptr, DIType *Specification = nullptr,
1751 RuntimeLang, EnumKind, VTableHolder, TemplateParams, Identifier,
1753 BitStride))
1755 DICompositeType,
1756 (unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
1759 Metadata *Elements, unsigned RuntimeLang,
1760 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1763 Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1764 Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1766 Metadata *BitStride = nullptr),
1768 OffsetInBits, Flags, Elements, RuntimeLang, EnumKind, VTableHolder,
1771 BitStride))
1773 DICompositeType,
1774 (unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1777 DINodeArray Elements, unsigned RuntimeLang,
1778 std::optional<uint32_t> EnumKind, DIType *VTableHolder,
1779 DITemplateParameterArray TemplateParams = nullptr,
1781 Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
1782 Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1783 DINodeArray Annotations = nullptr, DIType *Specification = nullptr,
1787 RuntimeLang, EnumKind, VTableHolder, TemplateParams, Identifier,
1789 BitStride))
1791 DICompositeType,
1792 (unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
1795 Metadata *Elements, unsigned RuntimeLang,
1796 std::optional<uint32_t> EnumKind, Metadata *VTableHolder,
1797 Metadata *TemplateParams = nullptr, MDString *Identifier = nullptr,
1798 Metadata *Discriminator = nullptr, Metadata *DataLocation = nullptr,
1799 Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1800 Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1802 Metadata *BitStride = nullptr),
1804 OffsetInBits, Flags, Elements, RuntimeLang, EnumKind, VTableHolder,
1807 BitStride))
1808
1809 TempDICompositeType clone() const { return cloneImpl(); }
1810
1811 /// Get a DICompositeType with the given ODR identifier.
1812 ///
1813 /// If \a LLVMContext::isODRUniquingDebugTypes(), gets the mapped
1814 /// DICompositeType for the given ODR \c Identifier. If none exists, creates
1815 /// a new node.
1816 ///
1817 /// Else, returns \c nullptr.
1818 LLVM_ABI static DICompositeType *
1819 getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1820 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1824 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1830 MDString &Identifier);
1831
1832 /// Build a DICompositeType with the given ODR identifier.
1833 ///
1834 /// Looks up the mapped DICompositeType for the given ODR \c Identifier. If
1835 /// it doesn't exist, creates a new one. If it does exist and \a
1836 /// isForwardDecl(), and the new arguments would be a definition, mutates the
1837 /// the type in place. In either case, returns the type.
1838 ///
1839 /// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns
1840 /// nullptr.
1841 LLVM_ABI static DICompositeType *
1842 buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1843 MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1847 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1852
1854 DINodeArray getElements() const {
1856 }
1860 DITemplateParameterArray getTemplateParams() const {
1862 }
1864 return getStringOperand(MY_FIRST_OPERAND + 4);
1865 }
1866 unsigned getRuntimeLang() const { return RuntimeLang; }
1867 std::optional<uint32_t> getEnumKind() const { return EnumKind; }
1868
1869 Metadata *getRawBaseType() const { return getOperand(MY_FIRST_OPERAND); }
1870 Metadata *getRawElements() const { return getOperand(MY_FIRST_OPERAND + 1); }
1872 return getOperand(MY_FIRST_OPERAND + 2);
1873 }
1875 return getOperand(MY_FIRST_OPERAND + 3);
1876 }
1878 return getOperandAs<MDString>(MY_FIRST_OPERAND + 4);
1879 }
1881 return getOperand(MY_FIRST_OPERAND + 5);
1882 }
1884 return getOperandAs<DIDerivedType>(MY_FIRST_OPERAND + 5);
1885 }
1887 return getOperand(MY_FIRST_OPERAND + 6);
1888 }
1896 return getOperand(MY_FIRST_OPERAND + 7);
1897 }
1904 Metadata *getRawAllocated() const { return getOperand(MY_FIRST_OPERAND + 8); }
1911 Metadata *getRawRank() const { return getOperand(MY_FIRST_OPERAND + 9); }
1914 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1915 return nullptr;
1916 }
1920
1922 return getOperand(MY_FIRST_OPERAND + 10);
1923 }
1924 DINodeArray getAnnotations() const {
1926 }
1927
1929 return getOperand(MY_FIRST_OPERAND + 11);
1930 }
1934
1935 bool isNameSimplified() const { return getFlags() & FlagNameIsSimplified; }
1936
1938 return getOperand(MY_FIRST_OPERAND + 12);
1939 }
1942 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1943 return nullptr;
1944 }
1945
1946 /// Replace operands.
1947 ///
1948 /// If this \a isUniqued() and not \a isResolved(), on a uniquing collision
1949 /// this will be RAUW'ed and deleted. Use a \a TrackingMDRef to keep track
1950 /// of its movement if necessary.
1951 /// @{
1952 void replaceElements(DINodeArray Elements) {
1953#ifndef NDEBUG
1954 for (DINode *Op : getElements())
1955 assert(is_contained(Elements->operands(), Op) &&
1956 "Lost a member during member list replacement");
1957#endif
1958 replaceOperandWith(MY_FIRST_OPERAND + 1, Elements.get());
1959 }
1960
1962 replaceOperandWith(MY_FIRST_OPERAND + 2, VTableHolder);
1963 }
1964
1965 void replaceTemplateParams(DITemplateParameterArray TemplateParams) {
1966 replaceOperandWith(MY_FIRST_OPERAND + 3, TemplateParams.get());
1967 }
1968 /// @}
1969
1970 static bool classof(const Metadata *MD) {
1971 return MD->getMetadataID() == DICompositeTypeKind;
1972 }
1973};
1974
1975/// Type array for a subprogram.
1976///
1977/// TODO: Fold the array of types in directly as operands.
1978class DISubroutineType : public DIType {
1979 friend class LLVMContextImpl;
1980 friend class MDNode;
1981
1982 static constexpr unsigned MY_FIRST_OPERAND = DIType::N_OPERANDS;
1983
1984 /// The calling convention used with DW_AT_calling_convention. Actually of
1985 /// type dwarf::CallingConvention.
1986 uint8_t CC;
1987
1988 DISubroutineType(LLVMContext &C, StorageType Storage, DIFlags Flags,
1990 ~DISubroutineType() = default;
1991
1992 static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
1993 uint8_t CC, DITypeArray TypeArray,
1995 bool ShouldCreate = true) {
1996 return getImpl(Context, Flags, CC, TypeArray.get(), Storage, ShouldCreate);
1997 }
1998 LLVM_ABI static DISubroutineType *getImpl(LLVMContext &Context, DIFlags Flags,
2001 bool ShouldCreate = true);
2002
2003 TempDISubroutineType cloneImpl() const {
2005 }
2006
2007public:
2008 DEFINE_MDNODE_GET(DISubroutineType,
2009 (DIFlags Flags, uint8_t CC, DITypeArray TypeArray),
2010 (Flags, CC, TypeArray))
2011 DEFINE_MDNODE_GET(DISubroutineType,
2014
2015 TempDISubroutineType clone() const { return cloneImpl(); }
2016 // Returns a new temporary DISubroutineType with updated CC
2017 TempDISubroutineType cloneWithCC(uint8_t CC) const {
2018 auto NewTy = clone();
2019 NewTy->CC = CC;
2020 return NewTy;
2021 }
2022
2023 uint8_t getCC() const { return CC; }
2024
2025 DITypeArray getTypeArray() const {
2027 }
2028
2029 Metadata *getRawTypeArray() const { return getOperand(MY_FIRST_OPERAND); }
2030
2031 static bool classof(const Metadata *MD) {
2032 return MD->getMetadataID() == DISubroutineTypeKind;
2033 }
2034};
2035
2036/// Compile unit.
2037class DICompileUnit : public DIScope {
2038 friend class LLVMContextImpl;
2039 friend class MDNode;
2040
2041public:
2049
2057
2058 LLVM_ABI static std::optional<DebugEmissionKind>
2060 LLVM_ABI static const char *emissionKindString(DebugEmissionKind EK);
2061 LLVM_ABI static std::optional<DebugNameTableKind>
2063 LLVM_ABI static const char *nameTableKindString(DebugNameTableKind PK);
2064
2065private:
2066 DISourceLanguageName SourceLanguage;
2067 unsigned RuntimeVersion;
2069 unsigned EmissionKind;
2070 unsigned NameTableKind;
2071 bool IsOptimized;
2072 bool SplitDebugInlining;
2074 bool RangesBaseAddress;
2075
2077 DISourceLanguageName SourceLanguage, bool IsOptimized,
2078 unsigned RuntimeVersion, unsigned EmissionKind, uint64_t DWOId,
2080 unsigned NameTableKind, bool RangesBaseAddress,
2082 ~DICompileUnit() = default;
2083
2084 static DICompileUnit *
2085 getImpl(LLVMContext &Context, DISourceLanguageName SourceLanguage,
2088 unsigned EmissionKind, DICompositeTypeArray EnumTypes,
2089 DIScopeArray RetainedTypes,
2090 DIGlobalVariableExpressionArray GlobalVariables,
2091 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
2094 StringRef SDK, StorageType Storage, bool ShouldCreate = true) {
2095 return getImpl(
2096 Context, SourceLanguage, File, getCanonicalMDString(Context, Producer),
2099 EnumTypes.get(), RetainedTypes.get(), GlobalVariables.get(),
2102 getCanonicalMDString(Context, SysRoot),
2103 getCanonicalMDString(Context, SDK), Storage, ShouldCreate);
2104 }
2105 LLVM_ABI static DICompileUnit *
2106 getImpl(LLVMContext &Context, DISourceLanguageName SourceLanguage,
2107 Metadata *File, MDString *Producer, bool IsOptimized, MDString *Flags,
2108 unsigned RuntimeVersion, MDString *SplitDebugFilename,
2112 bool DebugInfoForProfiling, unsigned NameTableKind,
2113 bool RangesBaseAddress, MDString *SysRoot, MDString *SDK,
2114 StorageType Storage, bool ShouldCreate = true);
2115
2116 TempDICompileUnit cloneImpl() const {
2117 return getTemporary(
2124 }
2125
2126public:
2127 static void get() = delete;
2128 static void getIfExists() = delete;
2129
2131 DICompileUnit,
2133 bool IsOptimized, StringRef Flags, unsigned RuntimeVersion,
2135 DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
2136 DIGlobalVariableExpressionArray GlobalVariables,
2137 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
2138 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
2139 DebugNameTableKind NameTableKind, bool RangesBaseAddress,
2141 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
2143 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
2144 DebugInfoForProfiling, (unsigned)NameTableKind, RangesBaseAddress,
2145 SysRoot, SDK))
2147 DICompileUnit,
2149 bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
2153 bool SplitDebugInlining, bool DebugInfoForProfiling,
2154 unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot,
2156 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
2158 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining,
2159 DebugInfoForProfiling, NameTableKind, RangesBaseAddress, SysRoot, SDK))
2160
2161 TempDICompileUnit clone() const { return cloneImpl(); }
2162
2163 DISourceLanguageName getSourceLanguage() const { return SourceLanguage; }
2164 bool isOptimized() const { return IsOptimized; }
2165 bool isDebugInfoForProfiling() const { return DebugInfoForProfiling; }
2166 unsigned getRuntimeVersion() const { return RuntimeVersion; }
2168 return (DebugEmissionKind)EmissionKind;
2169 }
2170 // Return true if this CU was compiled with debug info disabled
2171 bool isNoDebug() const { return EmissionKind == NoDebug; }
2173 return EmissionKind == DebugDirectivesOnly;
2174 }
2175 bool getDebugInfoForProfiling() const { return DebugInfoForProfiling; }
2177 return (DebugNameTableKind)NameTableKind;
2178 }
2179 bool getRangesBaseAddress() const { return RangesBaseAddress; }
2181 StringRef getFlags() const { return getStringOperand(2); }
2183 DICompositeTypeArray getEnumTypes() const {
2185 }
2186 DIScopeArray getRetainedTypes() const {
2188 }
2189 DIGlobalVariableExpressionArray getGlobalVariables() const {
2191 }
2192 DIImportedEntityArray getImportedEntities() const {
2194 }
2195 DIMacroNodeArray getMacros() const {
2197 }
2198 uint64_t getDWOId() const { return DWOId; }
2199 void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
2200 bool getSplitDebugInlining() const { return SplitDebugInlining; }
2201 void setSplitDebugInlining(bool SplitDebugInlining) {
2202 this->SplitDebugInlining = SplitDebugInlining;
2203 }
2205 StringRef getSDK() const { return getStringOperand(10); }
2206 /// Target-specific language dialect for DWARF.
2207 uint16_t getDialect() const { return SourceLanguage.getDialect(); }
2208
2214 Metadata *getRawEnumTypes() const { return getOperand(4); }
2218 Metadata *getRawMacros() const { return getOperand(8); }
2221 /// Replace arrays.
2222 ///
2223 /// If this \a isUniqued() and not \a isResolved(), it will be RAUW'ed and
2224 /// deleted on a uniquing collision. In practice, uniquing collisions on \a
2225 /// DICompileUnit should be fairly rare.
2226 /// @{
2227 void replaceEnumTypes(DICompositeTypeArray N) {
2228 replaceOperandWith(4, N.get());
2229 }
2230 void replaceRetainedTypes(DITypeArray N) { replaceOperandWith(5, N.get()); }
2231 void replaceGlobalVariables(DIGlobalVariableExpressionArray N) {
2232 replaceOperandWith(6, N.get());
2233 }
2234 void replaceImportedEntities(DIImportedEntityArray N) {
2235 replaceOperandWith(7, N.get());
2236 }
2237 void replaceMacros(DIMacroNodeArray N) { replaceOperandWith(8, N.get()); }
2238 /// @}
2239
2240 static bool classof(const Metadata *MD) {
2241 return MD->getMetadataID() == DICompileUnitKind;
2242 }
2243};
2244
2245/// A scope for locals.
2246///
2247/// A legal scope for lexical blocks, local variables, and debug info
2248/// locations. Subclasses are \a DISubprogram, \a DILexicalBlock, and \a
2249/// DILexicalBlockFile.
2250class DILocalScope : public DIScope {
2251protected:
2255 ~DILocalScope() = default;
2256
2257public:
2258 /// Get the subprogram for this scope.
2259 ///
2260 /// Return this if it's an \a DISubprogram; otherwise, look up the scope
2261 /// chain.
2263
2264 /// Traverses the scope chain rooted at RootScope until it hits a Subprogram,
2265 /// recreating the chain with "NewSP" instead.
2266 LLVM_ABI static DILocalScope *
2268 LLVMContext &Ctx,
2270
2271 /// Get the first non DILexicalBlockFile scope of this scope.
2272 ///
2273 /// Return this if it's not a \a DILexicalBlockFIle; otherwise, look up the
2274 /// scope chain.
2276
2277 static bool classof(const Metadata *MD) {
2278 return MD->getMetadataID() == DISubprogramKind ||
2279 MD->getMetadataID() == DILexicalBlockKind ||
2280 MD->getMetadataID() == DILexicalBlockFileKind;
2281 }
2282};
2283
2284/// Subprogram description. Uses SubclassData1.
2285class DISubprogram : public DILocalScope {
2286 friend class LLVMContextImpl;
2287 friend class MDNode;
2288
2289 unsigned Line;
2290 unsigned ScopeLine;
2291 unsigned VirtualIndex;
2292
2293 /// In the MS ABI, the implicit 'this' parameter is adjusted in the prologue
2294 /// of method overrides from secondary bases by this amount. It may be
2295 /// negative.
2296 int ThisAdjustment;
2297
2298public:
2299 /// Debug info subprogram flags.
2301#define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID,
2302#define DISP_FLAG_LARGEST_NEEDED
2303#include "llvm/IR/DebugInfoFlags.def"
2304 SPFlagNonvirtual = SPFlagZero,
2305 SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual,
2306 LLVM_MARK_AS_BITMASK_ENUM(SPFlagLargest)
2307 };
2308
2309 LLVM_ABI static DISPFlags getFlag(StringRef Flag);
2310 LLVM_ABI static StringRef getFlagString(DISPFlags Flag);
2311
2312 /// Split up a flags bitfield for easier printing.
2313 ///
2314 /// Split \c Flags into \c SplitFlags, a vector of its components. Returns
2315 /// any remaining (unrecognized) bits.
2316 LLVM_ABI static DISPFlags splitFlags(DISPFlags Flags,
2317 SmallVectorImpl<DISPFlags> &SplitFlags);
2318
2319 // Helper for converting old bitfields to new flags word.
2320 LLVM_ABI static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition,
2321 bool IsOptimized,
2322 unsigned Virtuality = SPFlagNonvirtual,
2323 bool IsMainSubprogram = false);
2324
2325private:
2326 DIFlags Flags;
2327 DISPFlags SPFlags;
2328
2329 DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
2330 unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
2331 DIFlags Flags, DISPFlags SPFlags, bool UsesKeyInstructions,
2333 ~DISubprogram() = default;
2334
2335 static DISubprogram *
2336 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
2337 StringRef LinkageName, DIFile *File, unsigned Line,
2339 unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
2340 DISPFlags SPFlags, DICompileUnit *Unit,
2341 DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
2342 DINodeArray RetainedNodes, DITypeArray ThrownTypes,
2345 bool ShouldCreate = true) {
2346 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
2347 getCanonicalMDString(Context, LinkageName), File, Line, Type,
2349 Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
2350 RetainedNodes.get(), ThrownTypes.get(), Annotations.get(),
2352 UsesKeyInstructions, Storage, ShouldCreate);
2353 }
2354
2355 LLVM_ABI static DISubprogram *
2356 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
2357 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
2358 unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
2359 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
2362 MDString *TargetFuncName, bool UsesKeyInstructions,
2363 StorageType Storage, bool ShouldCreate = true);
2364
2365 TempDISubprogram cloneImpl() const {
2367 getFile(), getLine(), getType(), getScopeLine(),
2368 getContainingType(), getVirtualIndex(),
2369 getThisAdjustment(), getFlags(), getSPFlags(),
2370 getUnit(), getTemplateParams(), getDeclaration(),
2371 getRetainedNodes(), getThrownTypes(), getAnnotations(),
2372 getTargetFuncName(), getKeyInstructionsEnabled());
2373 }
2374
2375public:
2377 DISubprogram,
2379 unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
2380 DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
2381 DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
2382 DITemplateParameterArray TemplateParams = nullptr,
2383 DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
2384 DITypeArray ThrownTypes = nullptr, DINodeArray Annotations = nullptr,
2385 StringRef TargetFuncName = "", bool UsesKeyInstructions = false),
2386 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
2387 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
2390
2392 DISubprogram,
2394 unsigned Line, Metadata *Type, unsigned ScopeLine,
2395 Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
2396 DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
2400 bool UsesKeyInstructions = false),
2401 (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
2402 VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
2405
2406 TempDISubprogram clone() const { return cloneImpl(); }
2407
2408 /// Returns a new temporary DISubprogram with updated Flags
2409 TempDISubprogram cloneWithFlags(DIFlags NewFlags) const {
2410 auto NewSP = clone();
2411 NewSP->Flags = NewFlags;
2412 return NewSP;
2413 }
2414
2415 bool getKeyInstructionsEnabled() const { return SubclassData1; }
2416
2417public:
2418 unsigned getLine() const { return Line; }
2419 unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; }
2420 unsigned getVirtualIndex() const { return VirtualIndex; }
2421 int getThisAdjustment() const { return ThisAdjustment; }
2422 unsigned getScopeLine() const { return ScopeLine; }
2423 void setScopeLine(unsigned L) {
2424 assert(isDistinct());
2425 ScopeLine = L;
2426 }
2427 DIFlags getFlags() const { return Flags; }
2428 DISPFlags getSPFlags() const { return SPFlags; }
2429 bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; }
2430 bool isDefinition() const { return getSPFlags() & SPFlagDefinition; }
2431 bool isOptimized() const { return getSPFlags() & SPFlagOptimized; }
2432 bool isMainSubprogram() const { return getSPFlags() & SPFlagMainSubprogram; }
2433
2434 bool isArtificial() const { return getFlags() & FlagArtificial; }
2435 bool isPrivate() const {
2436 return (getFlags() & FlagAccessibility) == FlagPrivate;
2437 }
2438 bool isProtected() const {
2439 return (getFlags() & FlagAccessibility) == FlagProtected;
2440 }
2441 bool isPublic() const {
2442 return (getFlags() & FlagAccessibility) == FlagPublic;
2443 }
2444 bool isExplicit() const { return getFlags() & FlagExplicit; }
2445 bool isPrototyped() const { return getFlags() & FlagPrototyped; }
2446 bool isNameSimplified() const { return getFlags() & FlagNameIsSimplified; }
2447 bool areAllCallsDescribed() const {
2448 return getFlags() & FlagAllCallsDescribed;
2449 }
2450 bool isPure() const { return getSPFlags() & SPFlagPure; }
2451 bool isElemental() const { return getSPFlags() & SPFlagElemental; }
2452 bool isRecursive() const { return getSPFlags() & SPFlagRecursive; }
2453 bool isObjCDirect() const { return getSPFlags() & SPFlagObjCDirect; }
2454
2455 /// Check if this is deleted member function.
2456 ///
2457 /// Return true if this subprogram is a C++11 special
2458 /// member function declared deleted.
2459 bool isDeleted() const { return getSPFlags() & SPFlagDeleted; }
2460
2461 /// Check if this is reference-qualified.
2462 ///
2463 /// Return true if this subprogram is a C++11 reference-qualified non-static
2464 /// member function (void foo() &).
2465 bool isLValueReference() const { return getFlags() & FlagLValueReference; }
2466
2467 /// Check if this is rvalue-reference-qualified.
2468 ///
2469 /// Return true if this subprogram is a C++11 rvalue-reference-qualified
2470 /// non-static member function (void foo() &&).
2471 bool isRValueReference() const { return getFlags() & FlagRValueReference; }
2472
2473 /// Check if this is marked as noreturn.
2474 ///
2475 /// Return true if this subprogram is C++11 noreturn or C11 _Noreturn
2476 bool isNoReturn() const { return getFlags() & FlagNoReturn; }
2477
2478 // Check if this routine is a compiler-generated thunk.
2479 //
2480 // Returns true if this subprogram is a thunk generated by the compiler.
2481 bool isThunk() const { return getFlags() & FlagThunk; }
2482
2483 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
2484
2485 StringRef getName() const { return getStringOperand(2); }
2486 StringRef getLinkageName() const { return getStringOperand(3); }
2487 /// Only used by clients of CloneFunction, and only right after the cloning.
2488 void replaceLinkageName(MDString *LN) { replaceOperandWith(3, LN); }
2489
2490 DISubroutineType *getType() const {
2491 return cast_or_null<DISubroutineType>(getRawType());
2492 }
2493 DIType *getContainingType() const {
2494 return cast_or_null<DIType>(getRawContainingType());
2495 }
2496 void replaceType(DISubroutineType *Ty) {
2497 assert(isDistinct() && "Only distinct nodes can mutate");
2498 replaceOperandWith(4, Ty);
2499 }
2500
2501 DICompileUnit *getUnit() const {
2502 return cast_or_null<DICompileUnit>(getRawUnit());
2503 }
2504 void replaceUnit(DICompileUnit *CU) { replaceOperandWith(5, CU); }
2505 DITemplateParameterArray getTemplateParams() const {
2506 return cast_or_null<MDTuple>(getRawTemplateParams());
2507 }
2508 DISubprogram *getDeclaration() const {
2509 return cast_or_null<DISubprogram>(getRawDeclaration());
2510 }
2511 void replaceDeclaration(DISubprogram *Decl) { replaceOperandWith(6, Decl); }
2512 DINodeArray getRetainedNodes() const {
2513 return cast_or_null<MDTuple>(getRawRetainedNodes());
2514 }
2515 DITypeArray getThrownTypes() const {
2516 return cast_or_null<MDTuple>(getRawThrownTypes());
2517 }
2518 DINodeArray getAnnotations() const {
2519 return cast_or_null<MDTuple>(getRawAnnotations());
2520 }
2521 StringRef getTargetFuncName() const {
2522 return (getRawTargetFuncName()) ? getStringOperand(12) : StringRef();
2523 }
2524
2525 Metadata *getRawScope() const { return getOperand(1); }
2526 MDString *getRawName() const { return getOperandAs<MDString>(2); }
2527 MDString *getRawLinkageName() const { return getOperandAs<MDString>(3); }
2528 Metadata *getRawType() const { return getOperand(4); }
2529 Metadata *getRawUnit() const { return getOperand(5); }
2530 Metadata *getRawDeclaration() const { return getOperand(6); }
2531 Metadata *getRawRetainedNodes() const { return getOperand(7); }
2532 Metadata *getRawContainingType() const {
2533 return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr;
2534 }
2535 Metadata *getRawTemplateParams() const {
2536 return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr;
2537 }
2538 Metadata *getRawThrownTypes() const {
2539 return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr;
2540 }
2541 Metadata *getRawAnnotations() const {
2542 return getNumOperands() > 11 ? getOperandAs<Metadata>(11) : nullptr;
2543 }
2544 MDString *getRawTargetFuncName() const {
2545 return getNumOperands() > 12 ? getOperandAs<MDString>(12) : nullptr;
2546 }
2547
2548 void replaceRawLinkageName(MDString *LinkageName) {
2550 }
2551 void replaceRetainedNodes(DINodeArray N) {
2552 replaceOperandWith(7, N.get());
2553 }
2554
2555 /// For the given retained node of DISubprogram, applies one of the
2556 /// given functions depending on the type of the node.
2557 template <typename T, typename MetadataT, typename FuncLVT,
2558 typename FuncLabelT, typename FuncImportedEntityT,
2559 typename FuncTypeT, typename FuncUnknownT>
2560 static T visitRetainedNode(MetadataT *N, FuncLVT &&FuncLV,
2561 FuncLabelT &&FuncLabel,
2562 FuncImportedEntityT &&FuncIE, FuncTypeT &&FuncType,
2563 FuncUnknownT &&FuncUnknown) {
2564 static_assert(std::is_base_of_v<Metadata, MetadataT>,
2565 "N must point to Metadata or const Metadata");
2566
2567 if (auto *LV = dyn_cast<DILocalVariable>(N))
2568 return FuncLV(LV);
2569 if (auto *L = dyn_cast<DILabel>(N))
2570 return FuncLabel(L);
2571 if (auto *IE = dyn_cast<DIImportedEntity>(N))
2572 return FuncIE(IE);
2573 if (auto *Ty = dyn_cast<DIType>(N))
2574 return FuncType(Ty);
2575 return FuncUnknown(N);
2576 }
2577
2578 /// Returns the scope of subprogram's retainedNodes.
2579 static const DILocalScope *getRetainedNodeScope(const MDNode *N);
2581 // For use in Verifier.
2582 static const DIScope *getRawRetainedNodeScope(const MDNode *N);
2584
2585 /// For each retained node, applies one of the given functions depending
2586 /// on the type of a node.
2587 template <typename FuncLVT, typename FuncLabelT, typename FuncImportedEntityT,
2588 typename FuncTypeT>
2589 void forEachRetainedNode(FuncLVT &&FuncLV, FuncLabelT &&FuncLabel,
2590 FuncImportedEntityT &&FuncIE, FuncTypeT &&FuncType) {
2591 for (MDNode *N : getRetainedNodes())
2592 visitRetainedNode<void>(
2593 N, FuncLV, FuncLabel, FuncIE, FuncType,
2594 [](auto *N) { llvm_unreachable("Unexpected retained node!"); });
2595 }
2596
2597 /// When IR modules are merged, typically during LTO, the merged module
2598 /// may contain several types having the same linkageName. They are
2599 /// supposed to represent the same type included by multiple source code
2600 /// files from a single header file.
2601 ///
2602 /// DebugTypeODRUniquing feature uniques (deduplicates) such types
2603 /// based on their linkageName during metadata loading, to speed up
2604 /// compilation and reduce debug info size.
2605 ///
2606 /// However, since function-local types are tracked in DISubprogram's
2607 /// retainedNodes field, a single local type may be referenced by multiple
2608 /// DISubprograms via retainedNodes as the result of DebugTypeODRUniquing.
2609 /// But retainedNodes field of a DISubprogram is meant to hold only
2610 /// subprogram's own local entities, therefore such references may
2611 /// cause crashes.
2612 ///
2613 /// To address this problem, this method is called for each new subprogram
2614 /// after module loading. It removes references to types belonging
2615 /// to other DISubprograms from a subprogram's retainedNodes list.
2616 /// If a corresponding IR function refers to local scopes from another
2617 /// subprogram, emitted debug info (e.g. DWARF) should rely
2618 /// on cross-subprogram references (and cross-CU references, as subprograms
2619 /// may belong to different compile units). This is also a drawback:
2620 /// when a subprogram refers to types that are local to another subprogram,
2621 /// it is more complicated for debugger to properly discover local types
2622 /// of a current scope for expression evaluation.
2623 void cleanupRetainedNodes();
2624
2625 /// Calls SP->cleanupRetainedNodes() for a range of DISubprograms.
2626 template <typename RangeT>
2627 static void cleanupRetainedNodes(const RangeT &NewDistinctSPs) {
2628 for (DISubprogram *SP : NewDistinctSPs)
2629 SP->cleanupRetainedNodes();
2630 }
2631
2632 /// Check if this subprogram describes the given function.
2633 ///
2634 /// FIXME: Should this be looking through bitcasts?
2635 LLVM_ABI bool describes(const Function *F) const;
2636
2637 static bool classof(const Metadata *MD) {
2638 return MD->getMetadataID() == DISubprogramKind;
2639 }
2640};
2641
2642/// Debug location.
2643///
2644/// A debug location in source code, used for debug info and otherwise.
2645///
2646/// Uses the SubclassData1, SubclassData16 and SubclassData32
2647/// Metadata slots.
2648
2649class DILocation : public MDNode {
2650 friend class LLVMContextImpl;
2651 friend class MDNode;
2652 uint64_t AtomGroup : 61;
2653 uint64_t AtomRank : 3;
2654
2655 DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
2656 unsigned Column, uint64_t AtomGroup, uint8_t AtomRank,
2658 ~DILocation() { dropAllReferences(); }
2659
2660 LLVM_ABI static DILocation *
2661 getImpl(LLVMContext &Context, unsigned Line, unsigned Column, Metadata *Scope,
2663 uint8_t AtomRank, StorageType Storage, bool ShouldCreate = true);
2664 static DILocation *getImpl(LLVMContext &Context, unsigned Line,
2665 unsigned Column, DILocalScope *Scope,
2668 StorageType Storage, bool ShouldCreate = true) {
2669 return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope),
2670 static_cast<Metadata *>(InlinedAt), ImplicitCode, AtomGroup,
2671 AtomRank, Storage, ShouldCreate);
2672 }
2673
2674 TempDILocation cloneImpl() const {
2675 // Get the raw scope/inlinedAt since it is possible to invoke this on
2676 // a DILocation containing temporary metadata.
2677 return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
2678 getRawInlinedAt(), isImplicitCode(), getAtomGroup(),
2679 getAtomRank());
2680 }
2681
2682public:
2683 uint64_t getAtomGroup() const { return AtomGroup; }
2684 uint8_t getAtomRank() const { return AtomRank; }
2685
2686 const DILocation *getWithoutAtom() const {
2687 if (!getAtomGroup() && !getAtomRank())
2688 return this;
2689 return get(getContext(), getLine(), getColumn(), getScope(), getInlinedAt(),
2690 isImplicitCode());
2691 }
2692
2693 // Disallow replacing operands.
2694 void replaceOperandWith(unsigned I, Metadata *New) = delete;
2695
2697 (unsigned Line, unsigned Column, Metadata *Scope,
2698 Metadata *InlinedAt = nullptr, bool ImplicitCode = false,
2699 uint64_t AtomGroup = 0, uint8_t AtomRank = 0),
2700 (Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
2701 AtomRank))
2702 DEFINE_MDNODE_GET(DILocation,
2703 (unsigned Line, unsigned Column, DILocalScope *Scope,
2704 DILocation *InlinedAt = nullptr, bool ImplicitCode = false,
2705 uint64_t AtomGroup = 0, uint8_t AtomRank = 0),
2706 (Line, Column, Scope, InlinedAt, ImplicitCode, AtomGroup,
2707 AtomRank))
2708
2709 /// Return a (temporary) clone of this.
2710 TempDILocation clone() const { return cloneImpl(); }
2711
2712 unsigned getLine() const { return SubclassData32; }
2713 unsigned getColumn() const { return SubclassData16; }
2714 DILocalScope *getScope() const { return cast<DILocalScope>(getRawScope()); }
2715
2716 /// Return the linkage name of Subprogram. If the linkage name is empty,
2717 /// return scope name (the demangled name).
2718 StringRef getSubprogramLinkageName() const {
2719 DISubprogram *SP = getScope()->getSubprogram();
2720 if (!SP)
2721 return "";
2722 auto Name = SP->getLinkageName();
2723 if (!Name.empty())
2724 return Name;
2725 return SP->getName();
2726 }
2727
2728 DILocation *getInlinedAt() const {
2730 }
2731
2732 /// Check if the location corresponds to an implicit code.
2733 /// When the ImplicitCode flag is true, it means that the Instruction
2734 /// with this DILocation has been added by the front-end but it hasn't been
2735 /// written explicitly by the user (e.g. cleanup stuff in C++ put on a closing
2736 /// bracket). It's useful for code coverage to not show a counter on "empty"
2737 /// lines.
2738 bool isImplicitCode() const { return SubclassData1; }
2739 void setImplicitCode(bool ImplicitCode) { SubclassData1 = ImplicitCode; }
2740
2741 DIFile *getFile() const { return getScope()->getFile(); }
2742 StringRef getFilename() const { return getScope()->getFilename(); }
2743 StringRef getDirectory() const { return getScope()->getDirectory(); }
2744 std::optional<StringRef> getSource() const { return getScope()->getSource(); }
2745
2746 /// Walk through \a getInlinedAt() and return the \a DILocation of the
2747 /// outermost call site in the inlining chain.
2748 const DILocation *getInlinedAtLocation() const {
2749 const DILocation *Current = this;
2750 while (const DILocation *Next = Current->getInlinedAt())
2751 Current = Next;
2752 return Current;
2753 }
2754
2755 // Return the \a DILocalScope of the outermost call site in the inlining
2756 // chain.
2757 DILocalScope *getInlinedAtScope() const {
2758 return getInlinedAtLocation()->getScope();
2759 }
2760
2761 /// Get the DWARF discriminator.
2762 ///
2763 /// DWARF discriminators distinguish identical file locations between
2764 /// instructions that are on different basic blocks.
2765 ///
2766 /// There are 3 components stored in discriminator, from lower bits:
2767 ///
2768 /// Base discriminator: assigned by AddDiscriminators pass to identify IRs
2769 /// that are defined by the same source line, but
2770 /// different basic blocks.
2771 /// Duplication factor: assigned by optimizations that will scale down
2772 /// the execution frequency of the original IR.
2773 /// Copy Identifier: assigned by optimizations that clones the IR.
2774 /// Each copy of the IR will be assigned an identifier.
2775 ///
2776 /// Encoding:
2777 ///
2778 /// The above 3 components are encoded into a 32bit unsigned integer in
2779 /// order. If the lowest bit is 1, the current component is empty, and the
2780 /// next component will start in the next bit. Otherwise, the current
2781 /// component is non-empty, and its content starts in the next bit. The
2782 /// value of each components is either 5 bit or 12 bit: if the 7th bit
2783 /// is 0, the bit 2~6 (5 bits) are used to represent the component; if the
2784 /// 7th bit is 1, the bit 2~6 (5 bits) and 8~14 (7 bits) are combined to
2785 /// represent the component. Thus, the number of bits used for a component
2786 /// is either 0 (if it and all the next components are empty); 1 - if it is
2787 /// empty; 7 - if its value is up to and including 0x1f (lsb and msb are both
2788 /// 0); or 14, if its value is up to and including 0x1ff. Note that the last
2789 /// component is also capped at 0x1ff, even in the case when both first
2790 /// components are 0, and we'd technically have 29 bits available.
2791 ///
2792 /// For precise control over the data being encoded in the discriminator,
2793 /// use encodeDiscriminator/decodeDiscriminator.
2794
2795 inline unsigned getDiscriminator() const;
2796
2797 // For the regular discriminator, it stands for all empty components if all
2798 // the lowest 3 bits are non-zero and all higher 29 bits are unused(zero by
2799 // default). Here we fully leverage the higher 29 bits for pseudo probe use.
2800 // This is the format:
2801 // [2:0] - 0x7
2802 // [31:3] - pseudo probe fields guaranteed to be non-zero as a whole
2803 // So if the lower 3 bits is non-zero and the others has at least one
2804 // non-zero bit, it guarantees to be a pseudo probe discriminator
2805 inline static bool isPseudoProbeDiscriminator(unsigned Discriminator) {
2806 return ((Discriminator & 0x7) == 0x7) && (Discriminator & 0xFFFFFFF8);
2807 }
2808
2809 /// Returns a new DILocation with updated \p Discriminator.
2810 inline const DILocation *cloneWithDiscriminator(unsigned Discriminator) const;
2811
2812 /// Returns a new DILocation with updated base discriminator \p BD. Only the
2813 /// base discriminator is set in the new DILocation, the other encoded values
2814 /// are elided.
2815 /// If the discriminator cannot be encoded, the function returns std::nullopt.
2816 inline std::optional<const DILocation *>
2817 cloneWithBaseDiscriminator(unsigned BD) const;
2818
2819 /// Returns the duplication factor stored in the discriminator, or 1 if no
2820 /// duplication factor (or 0) is encoded.
2821 inline unsigned getDuplicationFactor() const;
2822
2823 /// Returns the copy identifier stored in the discriminator.
2824 inline unsigned getCopyIdentifier() const;
2825
2826 /// Returns the base discriminator stored in the discriminator.
2827 inline unsigned getBaseDiscriminator() const;
2828
2829 /// Returns a new DILocation with duplication factor \p DF * current
2830 /// duplication factor encoded in the discriminator. The current duplication
2831 /// factor is as defined by getDuplicationFactor().
2832 /// Returns std::nullopt if encoding failed.
2833 inline std::optional<const DILocation *>
2835
2836 /// Attempts to merge \p LocA and \p LocB into a single location; see
2837 /// DebugLoc::getMergedLocation for more details.
2838 /// NB: When merging the locations of instructions, prefer to use
2839 /// DebugLoc::getMergedLocation(), as an instruction's DebugLoc may contain
2840 /// additional metadata that will not be preserved when merging the unwrapped
2841 /// DILocations.
2843 DILocation *LocB);
2844
2845 /// Try to combine the vector of locations passed as input in a single one.
2846 /// This function applies getMergedLocation() repeatedly left-to-right.
2847 /// NB: When merging the locations of instructions, prefer to use
2848 /// DebugLoc::getMergedLocations(), as an instruction's DebugLoc may contain
2849 /// additional metadata that will not be preserved when merging the unwrapped
2850 /// DILocations.
2851 ///
2852 /// \p Locs: The locations to be merged.
2854
2855 /// Return the masked discriminator value for an input discrimnator value D
2856 /// (i.e. zero out the (B+1)-th and above bits for D (B is 0-base).
2857 // Example: an input of (0x1FF, 7) returns 0xFF.
2858 static unsigned getMaskedDiscriminator(unsigned D, unsigned B) {
2859 return (D & getN1Bits(B));
2860 }
2861
2862 /// Return the bits used for base discriminators.
2863 static unsigned getBaseDiscriminatorBits() { return getBaseFSBitEnd(); }
2864
2865 /// Returns the base discriminator for a given encoded discriminator \p D.
2866 static unsigned
2868 bool IsFSDiscriminator = false) {
2869 // Extract the dwarf base discriminator if it's encoded in the pseudo probe
2870 // discriminator.
2872 auto DwarfBaseDiscriminator =
2874 if (DwarfBaseDiscriminator)
2875 return *DwarfBaseDiscriminator;
2876 // Return the probe id instead of zero for a pseudo probe discriminator.
2877 // This should help differenciate callsites with same line numbers to
2878 // achieve a decent AutoFDO profile under -fpseudo-probe-for-profiling,
2879 // where the original callsite dwarf discriminator is overwritten by
2880 // callsite probe information.
2882 }
2883
2884 if (IsFSDiscriminator)
2887 }
2888
2889 /// Raw encoding of the discriminator. APIs such as cloneWithDuplicationFactor
2890 /// have certain special case behavior (e.g. treating empty duplication factor
2891 /// as the value '1').
2892 /// This API, in conjunction with cloneWithDiscriminator, may be used to
2893 /// encode the raw values provided.
2894 ///
2895 /// \p BD: base discriminator
2896 /// \p DF: duplication factor
2897 /// \p CI: copy index
2898 ///
2899 /// The return is std::nullopt if the values cannot be encoded in 32 bits -
2900 /// for example, values for BD or DF larger than 12 bits. Otherwise, the
2901 /// return is the encoded value.
2902 LLVM_ABI static std::optional<unsigned>
2903 encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI);
2904
2905 /// Raw decoder for values in an encoded discriminator D.
2906 LLVM_ABI static void decodeDiscriminator(unsigned D, unsigned &BD,
2907 unsigned &DF, unsigned &CI);
2908
2909 /// Returns the duplication factor for a given encoded discriminator \p D, or
2910 /// 1 if no value or 0 is encoded.
2911 static unsigned getDuplicationFactorFromDiscriminator(unsigned D) {
2913 return 1;
2915 unsigned Ret = getUnsignedFromPrefixEncoding(D);
2916 if (Ret == 0)
2917 return 1;
2918 return Ret;
2919 }
2920
2921 /// Returns the copy identifier for a given encoded discriminator \p D.
2926
2927 Metadata *getRawScope() const { return getOperand(0); }
2929 if (getNumOperands() == 2)
2930 return getOperand(1);
2931 return nullptr;
2932 }
2933
2934 static bool classof(const Metadata *MD) {
2935 return MD->getMetadataID() == DILocationKind;
2936 }
2937};
2938
2940protected:
2944
2945public:
2947
2948 Metadata *getRawScope() const { return getOperand(1); }
2949
2950 void replaceScope(DIScope *Scope) {
2951 assert(!isUniqued());
2952 setOperand(1, Scope);
2953 }
2954
2955 static bool classof(const Metadata *MD) {
2956 return MD->getMetadataID() == DILexicalBlockKind ||
2957 MD->getMetadataID() == DILexicalBlockFileKind;
2958 }
2959};
2960
2961/// Debug lexical block.
2962///
2963/// Uses the SubclassData32 Metadata slot.
2964class DILexicalBlock : public DILexicalBlockBase {
2965 friend class LLVMContextImpl;
2966 friend class MDNode;
2967
2968 uint16_t Column;
2969
2970 DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line,
2971 unsigned Column, ArrayRef<Metadata *> Ops)
2972 : DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops),
2973 Column(Column) {
2975 assert(Column < (1u << 16) && "Expected 16-bit column");
2976 }
2977 ~DILexicalBlock() = default;
2978
2979 static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope,
2980 DIFile *File, unsigned Line, unsigned Column,
2982 bool ShouldCreate = true) {
2983 return getImpl(Context, static_cast<Metadata *>(Scope),
2984 static_cast<Metadata *>(File), Line, Column, Storage,
2985 ShouldCreate);
2986 }
2987
2988 LLVM_ABI static DILexicalBlock *getImpl(LLVMContext &Context, Metadata *Scope,
2989 Metadata *File, unsigned Line,
2990 unsigned Column, StorageType Storage,
2991 bool ShouldCreate = true);
2992
2993 TempDILexicalBlock cloneImpl() const {
2995 getColumn());
2996 }
2997
2998public:
2999 DEFINE_MDNODE_GET(DILexicalBlock,
3000 (DILocalScope * Scope, DIFile *File, unsigned Line,
3001 unsigned Column),
3002 (Scope, File, Line, Column))
3003 DEFINE_MDNODE_GET(DILexicalBlock,
3005 unsigned Column),
3006 (Scope, File, Line, Column))
3007
3008 TempDILexicalBlock clone() const { return cloneImpl(); }
3009
3010 unsigned getLine() const { return SubclassData32; }
3011 unsigned getColumn() const { return Column; }
3012
3013 static bool classof(const Metadata *MD) {
3014 return MD->getMetadataID() == DILexicalBlockKind;
3015 }
3016};
3017
3018class DILexicalBlockFile : public DILexicalBlockBase {
3019 friend class LLVMContextImpl;
3020 friend class MDNode;
3021
3022 DILexicalBlockFile(LLVMContext &C, StorageType Storage,
3024 : DILexicalBlockBase(C, DILexicalBlockFileKind, Storage, Ops) {
3026 }
3027 ~DILexicalBlockFile() = default;
3028
3029 static DILexicalBlockFile *getImpl(LLVMContext &Context, DILocalScope *Scope,
3030 DIFile *File, unsigned Discriminator,
3032 bool ShouldCreate = true) {
3033 return getImpl(Context, static_cast<Metadata *>(Scope),
3034 static_cast<Metadata *>(File), Discriminator, Storage,
3035 ShouldCreate);
3036 }
3037
3038 LLVM_ABI static DILexicalBlockFile *getImpl(LLVMContext &Context,
3039 Metadata *Scope, Metadata *File,
3040 unsigned Discriminator,
3042 bool ShouldCreate = true);
3043
3044 TempDILexicalBlockFile cloneImpl() const {
3045 return getTemporary(getContext(), getScope(), getFile(),
3047 }
3048
3049public:
3050 DEFINE_MDNODE_GET(DILexicalBlockFile,
3052 unsigned Discriminator),
3054 DEFINE_MDNODE_GET(DILexicalBlockFile,
3057
3058 TempDILexicalBlockFile clone() const { return cloneImpl(); }
3059 unsigned getDiscriminator() const { return SubclassData32; }
3060
3061 static bool classof(const Metadata *MD) {
3062 return MD->getMetadataID() == DILexicalBlockFileKind;
3063 }
3064};
3065
3066unsigned DILocation::getDiscriminator() const {
3067 if (auto *F = dyn_cast<DILexicalBlockFile>(getScope()))
3068 return F->getDiscriminator();
3069 return 0;
3070}
3071
3072const DILocation *
3073DILocation::cloneWithDiscriminator(unsigned Discriminator) const {
3074 DIScope *Scope = getScope();
3075 // Skip all parent DILexicalBlockFile that already have a discriminator
3076 // assigned. We do not want to have nested DILexicalBlockFiles that have
3077 // multiple discriminators because only the leaf DILexicalBlockFile's
3078 // dominator will be used.
3079 for (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope);
3080 LBF && LBF->getDiscriminator() != 0;
3082 Scope = LBF->getScope();
3083 DILexicalBlockFile *NewScope =
3084 DILexicalBlockFile::get(getContext(), Scope, getFile(), Discriminator);
3085 return DILocation::get(getContext(), getLine(), getColumn(), NewScope,
3086 getInlinedAt(), isImplicitCode(), getAtomGroup(),
3087 getAtomRank());
3088}
3089
3091 return getBaseDiscriminatorFromDiscriminator(getDiscriminator(),
3093}
3094
3096 return getDuplicationFactorFromDiscriminator(getDiscriminator());
3097}
3098
3100 return getCopyIdentifierFromDiscriminator(getDiscriminator());
3101}
3102
3103std::optional<const DILocation *>
3105 // Do not interfere with pseudo probes. Pseudo probe at a callsite uses
3106 // the dwarf discriminator to store pseudo probe related information,
3107 // such as the probe id.
3108 if (isPseudoProbeDiscriminator(getDiscriminator()))
3109 return this;
3110
3111 unsigned BD, DF, CI;
3112
3114 BD = getBaseDiscriminator();
3115 if (D == BD)
3116 return this;
3117 return cloneWithDiscriminator(D);
3118 }
3119
3120 decodeDiscriminator(getDiscriminator(), BD, DF, CI);
3121 if (D == BD)
3122 return this;
3123 if (std::optional<unsigned> Encoded = encodeDiscriminator(D, DF, CI))
3124 return cloneWithDiscriminator(*Encoded);
3125 return std::nullopt;
3126}
3127
3128std::optional<const DILocation *>
3130 assert(!EnableFSDiscriminator && "FSDiscriminator should not call this.");
3131 // Do no interfere with pseudo probes. Pseudo probe doesn't need duplication
3132 // factor support as samples collected on cloned probes will be aggregated.
3133 // Also pseudo probe at a callsite uses the dwarf discriminator to store
3134 // pseudo probe related information, such as the probe id.
3135 if (isPseudoProbeDiscriminator(getDiscriminator()))
3136 return this;
3137
3139 if (DF <= 1)
3140 return this;
3141
3142 unsigned BD = getBaseDiscriminator();
3143 unsigned CI = getCopyIdentifier();
3144 if (std::optional<unsigned> D = encodeDiscriminator(BD, DF, CI))
3145 return cloneWithDiscriminator(*D);
3146 return std::nullopt;
3147}
3148
3149/// Debug lexical block.
3150///
3151/// Uses the SubclassData1 Metadata slot.
3152class DINamespace : public DIScope {
3153 friend class LLVMContextImpl;
3154 friend class MDNode;
3155
3156 DINamespace(LLVMContext &Context, StorageType Storage, bool ExportSymbols,
3158 ~DINamespace() = default;
3159
3160 static DINamespace *getImpl(LLVMContext &Context, DIScope *Scope,
3162 StorageType Storage, bool ShouldCreate = true) {
3163 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
3164 ExportSymbols, Storage, ShouldCreate);
3165 }
3166 LLVM_ABI static DINamespace *getImpl(LLVMContext &Context, Metadata *Scope,
3169 bool ShouldCreate = true);
3170
3171 TempDINamespace cloneImpl() const {
3172 return getTemporary(getContext(), getScope(), getName(),
3174 }
3175
3176public:
3180 DEFINE_MDNODE_GET(DINamespace,
3183
3184 TempDINamespace clone() const { return cloneImpl(); }
3185
3186 bool getExportSymbols() const { return SubclassData1; }
3188 StringRef getName() const { return getStringOperand(2); }
3189
3190 Metadata *getRawScope() const { return getOperand(1); }
3192
3193 static bool classof(const Metadata *MD) {
3194 return MD->getMetadataID() == DINamespaceKind;
3195 }
3196};
3197
3198/// Represents a module in the programming language, for example, a Clang
3199/// module, or a Fortran module.
3200///
3201/// Uses the SubclassData1 and SubclassData32 Metadata slots.
3202class DIModule : public DIScope {
3203 friend class LLVMContextImpl;
3204 friend class MDNode;
3205
3206 DIModule(LLVMContext &Context, StorageType Storage, unsigned LineNo,
3207 bool IsDecl, ArrayRef<Metadata *> Ops);
3208 ~DIModule() = default;
3209
3210 static DIModule *getImpl(LLVMContext &Context, DIFile *File, DIScope *Scope,
3213 unsigned LineNo, bool IsDecl, StorageType Storage,
3214 bool ShouldCreate = true) {
3215 return getImpl(Context, File, Scope, getCanonicalMDString(Context, Name),
3218 getCanonicalMDString(Context, APINotesFile), LineNo, IsDecl,
3219 Storage, ShouldCreate);
3220 }
3221 LLVM_ABI static DIModule *
3222 getImpl(LLVMContext &Context, Metadata *File, Metadata *Scope, MDString *Name,
3224 MDString *APINotesFile, unsigned LineNo, bool IsDecl,
3225 StorageType Storage, bool ShouldCreate = true);
3226
3227 TempDIModule cloneImpl() const {
3229 getConfigurationMacros(), getIncludePath(),
3230 getAPINotesFile(), getLineNo(), getIsDecl());
3231 }
3232
3233public:
3237 StringRef APINotesFile, unsigned LineNo,
3238 bool IsDecl = false),
3240 APINotesFile, LineNo, IsDecl))
3241 DEFINE_MDNODE_GET(DIModule,
3245 bool IsDecl = false),
3247 APINotesFile, LineNo, IsDecl))
3248
3249 TempDIModule clone() const { return cloneImpl(); }
3250
3251 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
3252 StringRef getName() const { return getStringOperand(2); }
3253 StringRef getConfigurationMacros() const { return getStringOperand(3); }
3254 StringRef getIncludePath() const { return getStringOperand(4); }
3255 StringRef getAPINotesFile() const { return getStringOperand(5); }
3256 unsigned getLineNo() const { return SubclassData32; }
3257 bool getIsDecl() const { return SubclassData1; }
3258
3259 Metadata *getRawScope() const { return getOperand(1); }
3260 MDString *getRawName() const { return getOperandAs<MDString>(2); }
3261 MDString *getRawConfigurationMacros() const {
3262 return getOperandAs<MDString>(3);
3263 }
3264 MDString *getRawIncludePath() const { return getOperandAs<MDString>(4); }
3265 MDString *getRawAPINotesFile() const { return getOperandAs<MDString>(5); }
3266
3267 static bool classof(const Metadata *MD) {
3268 return MD->getMetadataID() == DIModuleKind;
3269 }
3270};
3271
3272/// Base class for template parameters.
3273///
3274/// Uses the SubclassData1 Metadata slot.
3276protected:
3278 unsigned Tag, bool IsDefault, ArrayRef<Metadata *> Ops)
3279 : DINode(Context, ID, Storage, Tag, Ops) {
3280 SubclassData1 = IsDefault;
3281 }
3283
3284public:
3285 StringRef getName() const { return getStringOperand(0); }
3287
3289 Metadata *getRawType() const { return getOperand(1); }
3290 bool isDefault() const { return SubclassData1; }
3291
3292 static bool classof(const Metadata *MD) {
3293 return MD->getMetadataID() == DITemplateTypeParameterKind ||
3294 MD->getMetadataID() == DITemplateValueParameterKind;
3295 }
3296};
3297
3298class DITemplateTypeParameter : public DITemplateParameter {
3299 friend class LLVMContextImpl;
3300 friend class MDNode;
3301
3302 DITemplateTypeParameter(LLVMContext &Context, StorageType Storage,
3304 ~DITemplateTypeParameter() = default;
3305
3306 static DITemplateTypeParameter *getImpl(LLVMContext &Context, StringRef Name,
3307 DIType *Type, bool IsDefault,
3309 bool ShouldCreate = true) {
3310 return getImpl(Context, getCanonicalMDString(Context, Name), Type,
3311 IsDefault, Storage, ShouldCreate);
3312 }
3314 getImpl(LLVMContext &Context, MDString *Name, Metadata *Type, bool IsDefault,
3315 StorageType Storage, bool ShouldCreate = true);
3316
3317 TempDITemplateTypeParameter cloneImpl() const {
3318 return getTemporary(getContext(), getName(), getType(), isDefault());
3319 }
3320
3321public:
3322 DEFINE_MDNODE_GET(DITemplateTypeParameter,
3324 (Name, Type, IsDefault))
3325 DEFINE_MDNODE_GET(DITemplateTypeParameter,
3328
3329 TempDITemplateTypeParameter clone() const { return cloneImpl(); }
3330
3331 static bool classof(const Metadata *MD) {
3332 return MD->getMetadataID() == DITemplateTypeParameterKind;
3333 }
3334};
3335
3336class DITemplateValueParameter : public DITemplateParameter {
3337 friend class LLVMContextImpl;
3338 friend class MDNode;
3339
3340 DITemplateValueParameter(LLVMContext &Context, StorageType Storage,
3341 unsigned Tag, bool IsDefault,
3343 : DITemplateParameter(Context, DITemplateValueParameterKind, Storage, Tag,
3344 IsDefault, Ops) {}
3345 ~DITemplateValueParameter() = default;
3346
3347 static DITemplateValueParameter *getImpl(LLVMContext &Context, unsigned Tag,
3349 bool IsDefault, Metadata *Value,
3351 bool ShouldCreate = true) {
3352 return getImpl(Context, Tag, getCanonicalMDString(Context, Name), Type,
3353 IsDefault, Value, Storage, ShouldCreate);
3354 }
3355 LLVM_ABI static DITemplateValueParameter *
3356 getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *Type,
3357 bool IsDefault, Metadata *Value, StorageType Storage,
3358 bool ShouldCreate = true);
3359
3360 TempDITemplateValueParameter cloneImpl() const {
3361 return getTemporary(getContext(), getTag(), getName(), getType(),
3362 isDefault(), getValue());
3363 }
3364
3365public:
3366 DEFINE_MDNODE_GET(DITemplateValueParameter,
3367 (unsigned Tag, StringRef Name, DIType *Type, bool IsDefault,
3368 Metadata *Value),
3369 (Tag, Name, Type, IsDefault, Value))
3370 DEFINE_MDNODE_GET(DITemplateValueParameter,
3374
3375 TempDITemplateValueParameter clone() const { return cloneImpl(); }
3376
3377 Metadata *getValue() const { return getOperand(2); }
3378
3379 static bool classof(const Metadata *MD) {
3380 return MD->getMetadataID() == DITemplateValueParameterKind;
3381 }
3382};
3383
3384/// Base class for variables.
3385///
3386/// Uses the SubclassData32 Metadata slot.
3387class DIVariable : public DINode {
3388 unsigned Line;
3389
3390protected:
3392 signed Line, ArrayRef<Metadata *> Ops,
3393 uint32_t AlignInBits = 0);
3394 ~DIVariable() = default;
3395
3396public:
3397 unsigned getLine() const { return Line; }
3399 StringRef getName() const { return getStringOperand(1); }
3403 uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
3404 /// Determines the size of the variable's type.
3405 LLVM_ABI std::optional<uint64_t> getSizeInBits() const;
3406
3407 /// Return the signedness of this variable's type, or std::nullopt if this
3408 /// type is neither signed nor unsigned.
3409 std::optional<DIBasicType::Signedness> getSignedness() const {
3410 if (auto *BT = dyn_cast<DIBasicType>(getType()))
3411 return BT->getSignedness();
3412 return std::nullopt;
3413 }
3414
3416 if (auto *F = getFile())
3417 return F->getFilename();
3418 return "";
3419 }
3420
3422 if (auto *F = getFile())
3423 return F->getDirectory();
3424 return "";
3425 }
3426
3427 std::optional<StringRef> getSource() const {
3428 if (auto *F = getFile())
3429 return F->getSource();
3430 return std::nullopt;
3431 }
3432
3433 Metadata *getRawScope() const { return getOperand(0); }
3435 Metadata *getRawFile() const { return getOperand(2); }
3436 Metadata *getRawType() const { return getOperand(3); }
3437
3438 static bool classof(const Metadata *MD) {
3439 return MD->getMetadataID() == DILocalVariableKind ||
3440 MD->getMetadataID() == DIGlobalVariableKind;
3441 }
3442};
3443
3444/// DWARF expression.
3445///
3446/// This is (almost) a DWARF expression that modifies the location of a
3447/// variable, or the location of a single piece of a variable, or (when using
3448/// DW_OP_stack_value) is the constant variable value.
3449///
3450/// TODO: Co-allocate the expression elements.
3451/// TODO: Separate from MDNode, or otherwise drop Distinct and Temporary
3452/// storage types.
3453class DIExpression : public MDNode {
3454 friend class LLVMContextImpl;
3455 friend class MDNode;
3456
3457 std::vector<uint64_t> Elements;
3458
3459 DIExpression(LLVMContext &C, StorageType Storage, ArrayRef<uint64_t> Elements)
3460 : MDNode(C, DIExpressionKind, Storage, {}),
3461 Elements(Elements.begin(), Elements.end()) {}
3462 ~DIExpression() = default;
3463
3464 LLVM_ABI static DIExpression *getImpl(LLVMContext &Context,
3465 ArrayRef<uint64_t> Elements,
3467 bool ShouldCreate = true);
3468
3469 TempDIExpression cloneImpl() const {
3470 return getTemporary(getContext(), getElements());
3471 }
3472
3473public:
3474 DEFINE_MDNODE_GET(DIExpression, (ArrayRef<uint64_t> Elements), (Elements))
3475
3476 TempDIExpression clone() const { return cloneImpl(); }
3477
3478 ArrayRef<uint64_t> getElements() const { return Elements; }
3479
3480 unsigned getNumElements() const { return Elements.size(); }
3481
3482 uint64_t getElement(unsigned I) const {
3483 assert(I < Elements.size() && "Index out of range");
3484 return Elements[I];
3485 }
3486
3488 /// Determine whether this represents a constant value, if so
3489 // return it's sign information.
3490 LLVM_ABI std::optional<SignedOrUnsignedConstant> isConstant() const;
3491
3492 /// Return the number of unique location operands referred to (via
3493 /// DW_OP_LLVM_arg) in this expression; this is not necessarily the number of
3494 /// instances of DW_OP_LLVM_arg within the expression.
3495 /// For example, for the expression:
3496 /// (DW_OP_LLVM_arg 0, DW_OP_LLVM_arg 1, DW_OP_plus,
3497 /// DW_OP_LLVM_arg 0, DW_OP_mul)
3498 /// This function would return 2, as there are two unique location operands
3499 /// (0 and 1).
3501
3503
3506
3507 /// A lightweight wrapper around an expression operand.
3508 ///
3509 /// TODO: Store arguments directly and change \a DIExpression to store a
3510 /// range of these.
3512 const uint64_t *Op = nullptr;
3513
3514 public:
3515 ExprOperand() = default;
3516 explicit ExprOperand(const uint64_t *Op) : Op(Op) {}
3517
3518 const uint64_t *get() const { return Op; }
3519
3520 /// Get the operand code.
3521 uint64_t getOp() const { return *Op; }
3522
3523 /// Get an argument to the operand.
3524 ///
3525 /// Never returns the operand itself.
3526 uint64_t getArg(unsigned I) const { return Op[I + 1]; }
3527
3528 unsigned getNumArgs() const { return getSize() - 1; }
3529
3530 /// Return the size of the operand.
3531 ///
3532 /// Return the number of elements in the operand (1 + args).
3533 LLVM_ABI unsigned getSize() const;
3534
3535 /// Append the elements of this operand to \p V.
3537 V.append(get(), get() + getSize());
3538 }
3539 };
3540
3541 /// An iterator for expression operands.
3543 ExprOperand Op;
3544
3545 public:
3546 using iterator_category = std::input_iterator_tag;
3548 using difference_type = std::ptrdiff_t;
3551
3552 expr_op_iterator() = default;
3554
3555 element_iterator getBase() const { return Op.get(); }
3556 const ExprOperand &operator*() const { return Op; }
3557 const ExprOperand *operator->() const { return &Op; }
3558
3560 increment();
3561 return *this;
3562 }
3564 expr_op_iterator T(*this);
3565 increment();
3566 return T;
3567 }
3568
3569 /// Get the next iterator.
3570 ///
3571 /// \a std::next() doesn't work because this is technically an
3572 /// input_iterator, but it's a perfectly valid operation. This is an
3573 /// accessor to provide the same functionality.
3574 expr_op_iterator getNext() const { return ++expr_op_iterator(*this); }
3575
3576 bool operator==(const expr_op_iterator &X) const {
3577 return getBase() == X.getBase();
3578 }
3579 bool operator!=(const expr_op_iterator &X) const {
3580 return getBase() != X.getBase();
3581 }
3582
3583 private:
3584 void increment() { Op = ExprOperand(getBase() + Op.getSize()); }
3585 };
3586
3587 /// Visit the elements via ExprOperand wrappers.
3588 ///
3589 /// These range iterators visit elements through \a ExprOperand wrappers.
3590 /// This is not guaranteed to be a valid range unless \a isValid() gives \c
3591 /// true.
3592 ///
3593 /// \pre \a isValid() gives \c true.
3594 /// @{
3604 /// @}
3605
3606 LLVM_ABI bool isValid() const;
3607
3608 static bool classof(const Metadata *MD) {
3609 return MD->getMetadataID() == DIExpressionKind;
3610 }
3611
3612 /// Return whether the first element a DW_OP_deref.
3613 LLVM_ABI bool startsWithDeref() const;
3614
3615 /// Return whether there is exactly one operator and it is a DW_OP_deref;
3616 LLVM_ABI bool isDeref() const;
3617
3619
3620 /// Return the number of bits that have an active value, i.e. those that
3621 /// aren't known to be zero/sign (depending on the type of Var) and which
3622 /// are within the size of this fragment (if it is one). If we can't deduce
3623 /// anything from the expression this will return the size of Var.
3624 LLVM_ABI std::optional<uint64_t> getActiveBits(DIVariable *Var);
3625
3626 /// Retrieve the details of this fragment expression.
3627 LLVM_ABI static std::optional<FragmentInfo>
3629
3630 /// Retrieve the details of this fragment expression.
3631 std::optional<FragmentInfo> getFragmentInfo() const {
3633 }
3634
3635 /// Return whether this is a piece of an aggregate variable.
3636 bool isFragment() const { return getFragmentInfo().has_value(); }
3637
3638 /// Return whether this is an implicit location description.
3639 LLVM_ABI bool isImplicit() const;
3640
3641 /// Return whether the location is computed on the expression stack, meaning
3642 /// it cannot be a simple register location.
3643 LLVM_ABI bool isComplex() const;
3644
3645 /// Return whether the evaluated expression makes use of a single location at
3646 /// the start of the expression, i.e. if it contains only a single
3647 /// DW_OP_LLVM_arg op as its first operand, or if it contains none.
3649
3650 /// Returns a reference to the elements contained in this expression, skipping
3651 /// past the leading `DW_OP_LLVM_arg, 0` if one is present.
3652 /// Similar to `convertToNonVariadicExpression`, but faster and cheaper - it
3653 /// does not check whether the expression is a single-location expression, and
3654 /// it returns elements rather than creating a new DIExpression.
3655 LLVM_ABI std::optional<ArrayRef<uint64_t>>
3657
3658 /// Removes all elements from \p Expr that do not apply to an undef debug
3659 /// value, which includes every operator that computes the value/location on
3660 /// the DWARF stack, including any DW_OP_LLVM_arg elements (making the result
3661 /// of this function always a single-location expression) while leaving
3662 /// everything that defines what the computed value applies to, i.e. the
3663 /// fragment information.
3664 LLVM_ABI static const DIExpression *
3666
3667 /// If \p Expr is a non-variadic expression (i.e. one that does not contain
3668 /// DW_OP_LLVM_arg), returns \p Expr converted to variadic form by adding a
3669 /// leading [DW_OP_LLVM_arg, 0] to the expression; otherwise returns \p Expr.
3670 LLVM_ABI static const DIExpression *
3672
3673 /// If \p Expr is a valid single-location expression, i.e. it refers to only a
3674 /// single debug operand at the start of the expression, then return that
3675 /// expression in a non-variadic form by removing DW_OP_LLVM_arg from the
3676 /// expression if it is present; otherwise returns std::nullopt.
3677 /// See also `getSingleLocationExpressionElements` above, which skips
3678 /// checking `isSingleLocationExpression` and returns a list of elements
3679 /// rather than a DIExpression.
3680 LLVM_ABI static std::optional<const DIExpression *>
3682
3683 /// Inserts the elements of \p Expr into \p Ops modified to a canonical form,
3684 /// which uses DW_OP_LLVM_arg (i.e. is a variadic expression) and folds the
3685 /// implied derefence from the \p IsIndirect flag into the expression. This
3686 /// allows us to check equivalence between expressions with differing
3687 /// directness or variadicness.
3689 const DIExpression *Expr,
3690 bool IsIndirect);
3691
3692 /// Determines whether two debug values should produce equivalent DWARF
3693 /// expressions, using their DIExpressions and directness, ignoring the
3694 /// differences between otherwise identical expressions in variadic and
3695 /// non-variadic form and not considering the debug operands.
3696 /// \p FirstExpr is the DIExpression for the first debug value.
3697 /// \p FirstIndirect should be true if the first debug value is indirect; in
3698 /// IR this should be true for dbg.declare intrinsics and false for
3699 /// dbg.values, and in MIR this should be true only for DBG_VALUE instructions
3700 /// whose second operand is an immediate value.
3701 /// \p SecondExpr and \p SecondIndirect have the same meaning as the prior
3702 /// arguments, but apply to the second debug value.
3703 LLVM_ABI static bool isEqualExpression(const DIExpression *FirstExpr,
3704 bool FirstIndirect,
3705 const DIExpression *SecondExpr,
3706 bool SecondIndirect);
3707
3708 /// Append \p Ops with operations to apply the \p Offset.
3710 int64_t Offset);
3711
3712 LLVM_ABI static bool
3713 extractLeadingOffset(ArrayRef<uint64_t> Ops, int64_t &OffsetInBytes,
3714 SmallVectorImpl<uint64_t> &RemainingOps);
3715
3716 /// If this is a constant offset, extract it. If there is no expression,
3717 /// return true with an offset of zero.
3718 LLVM_ABI bool extractIfOffset(int64_t &Offset) const;
3719
3720 /// Assuming that the expression operates on an address, extract a constant
3721 /// offset and the successive ops. Return false if the expression contains
3722 /// any incompatible ops (including non-zero DW_OP_LLVM_args - only a single
3723 /// address operand to the expression is permitted).
3724 ///
3725 /// We don't try very hard to interpret the expression because we assume that
3726 /// foldConstantMath has canonicalized the expression.
3727 LLVM_ABI bool
3728 extractLeadingOffset(int64_t &OffsetInBytes,
3729 SmallVectorImpl<uint64_t> &RemainingOps) const;
3730
3731 /// Returns true iff this DIExpression contains at least one instance of
3732 /// `DW_OP_LLVM_arg, n` for all n in [0, N).
3733 LLVM_ABI bool hasAllLocationOps(unsigned N) const;
3734
3735 /// Checks if the last 4 elements of the expression are DW_OP_constu <DWARF
3736 /// Address Space> DW_OP_swap DW_OP_xderef and extracts the <DWARF Address
3737 /// Space>.
3738 LLVM_ABI static const DIExpression *
3739 extractAddressClass(const DIExpression *Expr, unsigned &AddrClass);
3740
3741 /// Used for DIExpression::prepend.
3744 DerefBefore = 1 << 0,
3745 DerefAfter = 1 << 1,
3746 StackValue = 1 << 2,
3747 EntryValue = 1 << 3
3748 };
3749
3750 /// Prepend \p DIExpr with a deref and offset operation and optionally turn it
3751 /// into a stack value or/and an entry value.
3752 LLVM_ABI static DIExpression *prepend(const DIExpression *Expr, uint8_t Flags,
3753 int64_t Offset = 0);
3754
3755 /// Prepend \p DIExpr with the given opcodes and optionally turn it into a
3756 /// stack value.
3759 bool StackValue = false,
3760 bool EntryValue = false);
3761
3762 /// Append the opcodes \p Ops to \p DIExpr. Unlike \ref appendToStack, the
3763 /// returned expression is a stack value only if \p DIExpr is a stack value.
3764 /// If \p DIExpr describes a fragment, the returned expression will describe
3765 /// the same fragment.
3766 LLVM_ABI static DIExpression *append(const DIExpression *Expr,
3768
3769 /// Convert \p DIExpr into a stack value if it isn't one already by appending
3770 /// DW_OP_deref if needed, and appending \p Ops to the resulting expression.
3771 /// If \p DIExpr describes a fragment, the returned expression will describe
3772 /// the same fragment.
3773 LLVM_ABI static DIExpression *appendToStack(const DIExpression *Expr,
3775
3776 /// Create a copy of \p Expr by appending the given list of \p Ops to each
3777 /// instance of the operand `DW_OP_LLVM_arg, \p ArgNo`. This is used to
3778 /// modify a specific location used by \p Expr, such as when salvaging that
3779 /// location.
3782 unsigned ArgNo,
3783 bool StackValue = false);
3784
3785 /// Create a copy of \p Expr with each instance of
3786 /// `DW_OP_LLVM_arg, \p OldArg` replaced with `DW_OP_LLVM_arg, \p NewArg`,
3787 /// and each instance of `DW_OP_LLVM_arg, Arg` with `DW_OP_LLVM_arg, Arg - 1`
3788 /// for all Arg > \p OldArg.
3789 /// This is used when replacing one of the operands of a debug value list
3790 /// with another operand in the same list and deleting the old operand.
3791 LLVM_ABI static DIExpression *replaceArg(const DIExpression *Expr,
3792 uint64_t OldArg, uint64_t NewArg);
3793
3794 /// Create a DIExpression to describe one part of an aggregate variable that
3795 /// is fragmented across multiple Values. The DW_OP_LLVM_fragment operation
3796 /// will be appended to the elements of \c Expr. If \c Expr already contains
3797 /// a \c DW_OP_LLVM_fragment \c OffsetInBits is interpreted as an offset
3798 /// into the existing fragment.
3799 ///
3800 /// \param OffsetInBits Offset of the piece in bits.
3801 /// \param SizeInBits Size of the piece in bits.
3802 /// \return Creating a fragment expression may fail if \c Expr
3803 /// contains arithmetic operations that would be
3804 /// truncated.
3805 LLVM_ABI static std::optional<DIExpression *>
3806 createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits,
3807 unsigned SizeInBits);
3808
3809 /// Determine the relative position of the fragments passed in.
3810 /// Returns -1 if this is entirely before Other, 0 if this and Other overlap,
3811 /// 1 if this is entirely after Other.
3812 static int fragmentCmp(const FragmentInfo &A, const FragmentInfo &B) {
3813 uint64_t l1 = A.OffsetInBits;
3814 uint64_t l2 = B.OffsetInBits;
3815 uint64_t r1 = l1 + A.SizeInBits;
3816 uint64_t r2 = l2 + B.SizeInBits;
3817 if (r1 <= l2)
3818 return -1;
3819 else if (r2 <= l1)
3820 return 1;
3821 else
3822 return 0;
3823 }
3824
3825 /// Computes a fragment, bit-extract operation if needed, and new constant
3826 /// offset to describe a part of a variable covered by some memory.
3827 ///
3828 /// The memory region starts at:
3829 /// \p SliceStart + \p SliceOffsetInBits
3830 /// And is size:
3831 /// \p SliceSizeInBits
3832 ///
3833 /// The location of the existing variable fragment \p VarFrag is:
3834 /// \p DbgPtr + \p DbgPtrOffsetInBits + \p DbgExtractOffsetInBits.
3835 ///
3836 /// It is intended that these arguments are derived from a debug record:
3837 /// - \p DbgPtr is the (single) DIExpression operand.
3838 /// - \p DbgPtrOffsetInBits is the constant offset applied to \p DbgPtr.
3839 /// - \p DbgExtractOffsetInBits is the offset from a
3840 /// DW_OP_LLVM_bit_extract_[sz]ext operation.
3841 ///
3842 /// Results and return value:
3843 /// - Return false if the result can't be calculated for any reason.
3844 /// - \p Result is set to nullopt if the intersect equals \p VarFarg.
3845 /// - \p Result contains a zero-sized fragment if there's no intersect.
3846 /// - \p OffsetFromLocationInBits is set to the difference between the first
3847 /// bit of the variable location and the first bit of the slice. The
3848 /// magnitude of a negative value therefore indicates the number of bits
3849 /// into the variable fragment that the memory region begins.
3850 ///
3851 /// We don't pass in a debug record directly to get the constituent parts
3852 /// and offsets because different debug records store the information in
3853 /// different places (dbg_assign has two DIExpressions - one contains the
3854 /// fragment info for the entire intrinsic).
3856 const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits,
3857 uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits,
3858 int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag,
3859 std::optional<DIExpression::FragmentInfo> &Result,
3860 int64_t &OffsetFromLocationInBits);
3861
3862 using ExtOps = std::array<uint64_t, 6>;
3863
3864 /// Returns the ops for a zero- or sign-extension in a DIExpression.
3865 LLVM_ABI static ExtOps getExtOps(unsigned FromSize, unsigned ToSize,
3866 bool Signed);
3867
3868 /// Append a zero- or sign-extension to \p Expr. Converts the expression to a
3869 /// stack value if it isn't one already.
3870 LLVM_ABI static DIExpression *appendExt(const DIExpression *Expr,
3871 unsigned FromSize, unsigned ToSize,
3872 bool Signed);
3873
3874 /// Check if fragments overlap between a pair of FragmentInfos.
3875 static bool fragmentsOverlap(const FragmentInfo &A, const FragmentInfo &B) {
3876 return fragmentCmp(A, B) == 0;
3877 }
3878
3879 /// Determine the relative position of the fragments described by this
3880 /// DIExpression and \p Other. Calls static fragmentCmp implementation.
3881 int fragmentCmp(const DIExpression *Other) const {
3882 auto Fragment1 = *getFragmentInfo();
3883 auto Fragment2 = *Other->getFragmentInfo();
3884 return fragmentCmp(Fragment1, Fragment2);
3885 }
3886
3887 /// Check if fragments overlap between this DIExpression and \p Other.
3888 bool fragmentsOverlap(const DIExpression *Other) const {
3889 if (!isFragment() || !Other->isFragment())
3890 return true;
3891 return fragmentCmp(Other) == 0;
3892 }
3893
3894 /// Check if the expression consists of exactly one entry value operand.
3895 /// (This is the only configuration of entry values that is supported.)
3896 LLVM_ABI bool isEntryValue() const;
3897
3898 /// Try to shorten an expression with an initial constant operand.
3899 /// Returns a new expression and constant on success, or the original
3900 /// expression and constant on failure.
3901 LLVM_ABI std::pair<DIExpression *, const ConstantInt *>
3902 constantFold(const ConstantInt *CI);
3903
3904 /// Try to shorten an expression with constant math operations that can be
3905 /// evaluated at compile time. Returns a new expression on success, or the old
3906 /// expression if there is nothing to be reduced.
3908};
3909
3912 return std::tie(A.SizeInBits, A.OffsetInBits) ==
3913 std::tie(B.SizeInBits, B.OffsetInBits);
3914}
3915
3918 return std::tie(A.SizeInBits, A.OffsetInBits) <
3919 std::tie(B.SizeInBits, B.OffsetInBits);
3920}
3921
3922template <> struct DenseMapInfo<DIExpression::FragmentInfo> {
3924 static const uint64_t MaxVal = std::numeric_limits<uint64_t>::max();
3925
3926 static inline FragInfo getEmptyKey() { return {MaxVal, MaxVal}; }
3927
3928 static inline FragInfo getTombstoneKey() { return {MaxVal - 1, MaxVal - 1}; }
3929
3930 static unsigned getHashValue(const FragInfo &Frag) {
3931 return (Frag.SizeInBits & 0xffff) << 16 | (Frag.OffsetInBits & 0xffff);
3932 }
3933
3934 static bool isEqual(const FragInfo &A, const FragInfo &B) { return A == B; }
3935};
3936
3937/// Holds a DIExpression and keeps track of how many operands have been consumed
3938/// so far.
3941
3942public:
3944 if (!Expr) {
3945 assert(Start == End);
3946 return;
3947 }
3948 Start = Expr->expr_op_begin();
3949 End = Expr->expr_op_end();
3950 }
3951
3953 : Start(Expr.begin()), End(Expr.end()) {}
3954
3956
3957 /// Consume one operation.
3958 std::optional<DIExpression::ExprOperand> take() {
3959 if (Start == End)
3960 return std::nullopt;
3961 return *(Start++);
3962 }
3963
3964 /// Consume N operations.
3965 void consume(unsigned N) { std::advance(Start, N); }
3966
3967 /// Return the current operation.
3968 std::optional<DIExpression::ExprOperand> peek() const {
3969 if (Start == End)
3970 return std::nullopt;
3971 return *(Start);
3972 }
3973
3974 /// Return the next operation.
3975 std::optional<DIExpression::ExprOperand> peekNext() const {
3976 if (Start == End)
3977 return std::nullopt;
3978
3979 auto Next = Start.getNext();
3980 if (Next == End)
3981 return std::nullopt;
3982
3983 return *Next;
3984 }
3985
3986 std::optional<DIExpression::ExprOperand> peekNextN(unsigned N) const {
3987 if (Start == End)
3988 return std::nullopt;
3990 for (unsigned I = 0; I < N; I++) {
3991 Nth = Nth.getNext();
3992 if (Nth == End)
3993 return std::nullopt;
3994 }
3995 return *Nth;
3996 }
3997
3999 this->Start = DIExpression::expr_op_iterator(Expr.begin());
4000 this->End = DIExpression::expr_op_iterator(Expr.end());
4001 }
4002
4003 /// Determine whether there are any operations left in this expression.
4004 operator bool() const { return Start != End; }
4005
4006 DIExpression::expr_op_iterator begin() const { return Start; }
4007 DIExpression::expr_op_iterator end() const { return End; }
4008
4009 /// Retrieve the fragment information, if any.
4010 std::optional<DIExpression::FragmentInfo> getFragmentInfo() const {
4011 return DIExpression::getFragmentInfo(Start, End);
4012 }
4013};
4014
4015/// Global variables.
4016///
4017/// TODO: Remove DisplayName. It's always equal to Name.
4018class DIGlobalVariable : public DIVariable {
4019 friend class LLVMContextImpl;
4020 friend class MDNode;
4021
4022 bool IsLocalToUnit;
4023 bool IsDefinition;
4024
4025 DIGlobalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
4026 bool IsLocalToUnit, bool IsDefinition, uint32_t AlignInBits,
4028 : DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits),
4029 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
4030 ~DIGlobalVariable() = default;
4031
4032 static DIGlobalVariable *
4033 getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
4034 StringRef LinkageName, DIFile *File, unsigned Line, DIType *Type,
4035 bool IsLocalToUnit, bool IsDefinition,
4038 bool ShouldCreate = true) {
4039 return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
4040 getCanonicalMDString(Context, LinkageName), File, Line, Type,
4043 Annotations.get(), Storage, ShouldCreate);
4044 }
4045 LLVM_ABI static DIGlobalVariable *
4046 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
4047 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
4048 bool IsLocalToUnit, bool IsDefinition,
4051 bool ShouldCreate = true);
4052
4053 TempDIGlobalVariable cloneImpl() const {
4058 getAnnotations());
4059 }
4060
4061public:
4063 DIGlobalVariable,
4065 unsigned Line, DIType *Type, bool IsLocalToUnit, bool IsDefinition,
4067 uint32_t AlignInBits, DINodeArray Annotations),
4068 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
4071 DIGlobalVariable,
4073 unsigned Line, Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
4076 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
4078
4079 TempDIGlobalVariable clone() const { return cloneImpl(); }
4080
4081 bool isLocalToUnit() const { return IsLocalToUnit; }
4082 bool isDefinition() const { return IsDefinition; }
4088 DINodeArray getAnnotations() const {
4090 }
4091
4096 Metadata *getRawAnnotations() const { return getOperand(8); }
4097
4098 static bool classof(const Metadata *MD) {
4099 return MD->getMetadataID() == DIGlobalVariableKind;
4100 }
4101};
4102
4103/// Debug common block.
4104///
4105/// Uses the SubclassData32 Metadata slot.
4106class DICommonBlock : public DIScope {
4107 friend class LLVMContextImpl;
4108 friend class MDNode;
4109
4110 DICommonBlock(LLVMContext &Context, StorageType Storage, unsigned LineNo,
4112
4113 static DICommonBlock *getImpl(LLVMContext &Context, DIScope *Scope,
4115 DIFile *File, unsigned LineNo,
4116 StorageType Storage, bool ShouldCreate = true) {
4117 return getImpl(Context, Scope, Decl, getCanonicalMDString(Context, Name),
4118 File, LineNo, Storage, ShouldCreate);
4119 }
4120 LLVM_ABI static DICommonBlock *getImpl(LLVMContext &Context, Metadata *Scope,
4122 Metadata *File, unsigned LineNo,
4124 bool ShouldCreate = true);
4125
4126 TempDICommonBlock cloneImpl() const {
4128 getFile(), getLineNo());
4129 }
4130
4131public:
4132 DEFINE_MDNODE_GET(DICommonBlock,
4134 DIFile *File, unsigned LineNo),
4135 (Scope, Decl, Name, File, LineNo))
4136 DEFINE_MDNODE_GET(DICommonBlock,
4138 Metadata *File, unsigned LineNo),
4140
4141 TempDICommonBlock clone() const { return cloneImpl(); }
4142
4147 StringRef getName() const { return getStringOperand(2); }
4149 unsigned getLineNo() const { return SubclassData32; }
4150
4151 Metadata *getRawScope() const { return getOperand(0); }
4152 Metadata *getRawDecl() const { return getOperand(1); }
4154 Metadata *getRawFile() const { return getOperand(3); }
4155
4156 static bool classof(const Metadata *MD) {
4157 return MD->getMetadataID() == DICommonBlockKind;
4158 }
4159};
4160
4161/// Local variable.
4162///
4163/// TODO: Split up flags.
4164class DILocalVariable : public DIVariable {
4165 friend class LLVMContextImpl;
4166 friend class MDNode;
4167
4168 unsigned Arg : 16;
4169 DIFlags Flags;
4170
4171 DILocalVariable(LLVMContext &C, StorageType Storage, unsigned Line,
4172 unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
4174 : DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits),
4175 Arg(Arg), Flags(Flags) {
4176 assert(Arg < (1 << 16) && "DILocalVariable: Arg out of range");
4177 }
4178 ~DILocalVariable() = default;
4179
4180 static DILocalVariable *getImpl(LLVMContext &Context, DIScope *Scope,
4181 StringRef Name, DIFile *File, unsigned Line,
4182 DIType *Type, unsigned Arg, DIFlags Flags,
4183 uint32_t AlignInBits, DINodeArray Annotations,
4185 bool ShouldCreate = true) {
4186 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
4187 Line, Type, Arg, Flags, AlignInBits, Annotations.get(),
4188 Storage, ShouldCreate);
4189 }
4190 LLVM_ABI static DILocalVariable *
4191 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, Metadata *File,
4192 unsigned Line, Metadata *Type, unsigned Arg, DIFlags Flags,
4194 bool ShouldCreate = true);
4195
4196 TempDILocalVariable cloneImpl() const {
4198 getLine(), getType(), getArg(), getFlags(),
4200 }
4201
4202public:
4203 DEFINE_MDNODE_GET(DILocalVariable,
4205 unsigned Line, DIType *Type, unsigned Arg, DIFlags Flags,
4206 uint32_t AlignInBits, DINodeArray Annotations),
4207 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
4208 Annotations))
4209 DEFINE_MDNODE_GET(DILocalVariable,
4211 unsigned Line, Metadata *Type, unsigned Arg, DIFlags Flags,
4213 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits,
4214 Annotations))
4215
4216 TempDILocalVariable clone() const { return cloneImpl(); }
4217
4218 /// Get the local scope for this variable.
4219 ///
4220 /// Variables must be defined in a local scope.
4224
4225 bool isParameter() const { return Arg; }
4226 unsigned getArg() const { return Arg; }
4227 DIFlags getFlags() const { return Flags; }
4228
4229 DINodeArray getAnnotations() const {
4231 }
4232 Metadata *getRawAnnotations() const { return getOperand(4); }
4233
4234 bool isArtificial() const { return getFlags() & FlagArtificial; }
4235 bool isObjectPointer() const { return getFlags() & FlagObjectPointer; }
4236
4237 /// Check that a location is valid for this variable.
4238 ///
4239 /// Check that \c DL exists, is in the same subprogram, and has the same
4240 /// inlined-at location as \c this. (Otherwise, it's not a valid attachment
4241 /// to a \a DbgInfoIntrinsic.)
4243 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
4244 }
4245
4246 static bool classof(const Metadata *MD) {
4247 return MD->getMetadataID() == DILocalVariableKind;
4248 }
4249};
4250
4251/// Label.
4252///
4253/// Uses the SubclassData32 Metadata slot.
4254class DILabel : public DINode {
4255 friend class LLVMContextImpl;
4256 friend class MDNode;
4257
4258 unsigned Column;
4259 std::optional<unsigned> CoroSuspendIdx;
4260 bool IsArtificial;
4261
4262 DILabel(LLVMContext &C, StorageType Storage, unsigned Line, unsigned Column,
4263 bool IsArtificial, std::optional<unsigned> CoroSuspendIdx,
4265 ~DILabel() = default;
4266
4267 static DILabel *getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
4268 DIFile *File, unsigned Line, unsigned Column,
4269 bool IsArtificial,
4270 std::optional<unsigned> CoroSuspendIdx,
4271 StorageType Storage, bool ShouldCreate = true) {
4272 return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
4273 Line, Column, IsArtificial, CoroSuspendIdx, Storage,
4274 ShouldCreate);
4275 }
4276 LLVM_ABI static DILabel *
4277 getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, Metadata *File,
4278 unsigned Line, unsigned Column, bool IsArtificial,
4279 std::optional<unsigned> CoroSuspendIdx, StorageType Storage,
4280 bool ShouldCreate = true);
4281
4282 TempDILabel cloneImpl() const {
4286 }
4287
4288public:
4291 unsigned Line, unsigned Column, bool IsArtificial,
4292 std::optional<unsigned> CoroSuspendIdx),
4293 (Scope, Name, File, Line, Column, IsArtificial,
4294 CoroSuspendIdx))
4295 DEFINE_MDNODE_GET(DILabel,
4297 unsigned Line, unsigned Column, bool IsArtificial,
4298 std::optional<unsigned> CoroSuspendIdx),
4299 (Scope, Name, File, Line, Column, IsArtificial,
4300 CoroSuspendIdx))
4301
4302 TempDILabel clone() const { return cloneImpl(); }
4303
4304 /// Get the local scope for this label.
4305 ///
4306 /// Labels must be defined in a local scope.
4310 unsigned getLine() const { return SubclassData32; }
4311 unsigned getColumn() const { return Column; }
4312 StringRef getName() const { return getStringOperand(1); }
4314 bool isArtificial() const { return IsArtificial; }
4315 std::optional<unsigned> getCoroSuspendIdx() const { return CoroSuspendIdx; }
4316
4317 Metadata *getRawScope() const { return getOperand(0); }
4319 Metadata *getRawFile() const { return getOperand(2); }
4320
4321 /// Check that a location is valid for this label.
4322 ///
4323 /// Check that \c DL exists, is in the same subprogram, and has the same
4324 /// inlined-at location as \c this. (Otherwise, it's not a valid attachment
4325 /// to a \a DbgInfoIntrinsic.)
4327 return DL && getScope()->getSubprogram() == DL->getScope()->getSubprogram();
4328 }
4329
4330 static bool classof(const Metadata *MD) {
4331 return MD->getMetadataID() == DILabelKind;
4332 }
4333};
4334
4335class DIObjCProperty : public DINode {
4336 friend class LLVMContextImpl;
4337 friend class MDNode;
4338
4339 unsigned Line;
4340 unsigned Attributes;
4341
4342 DIObjCProperty(LLVMContext &C, StorageType Storage, unsigned Line,
4343 unsigned Attributes, ArrayRef<Metadata *> Ops);
4344 ~DIObjCProperty() = default;
4345
4346 static DIObjCProperty *
4347 getImpl(LLVMContext &Context, StringRef Name, DIFile *File, unsigned Line,
4348 StringRef GetterName, StringRef SetterName, unsigned Attributes,
4349 DIType *Type, StorageType Storage, bool ShouldCreate = true) {
4350 return getImpl(Context, getCanonicalMDString(Context, Name), File, Line,
4352 getCanonicalMDString(Context, SetterName), Attributes, Type,
4353 Storage, ShouldCreate);
4354 }
4355 LLVM_ABI static DIObjCProperty *
4356 getImpl(LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
4357 MDString *GetterName, MDString *SetterName, unsigned Attributes,
4358 Metadata *Type, StorageType Storage, bool ShouldCreate = true);
4359
4360 TempDIObjCProperty cloneImpl() const {
4361 return getTemporary(getContext(), getName(), getFile(), getLine(),
4363 getType());
4364 }
4365
4366public:
4367 DEFINE_MDNODE_GET(DIObjCProperty,
4368 (StringRef Name, DIFile *File, unsigned Line,
4370 unsigned Attributes, DIType *Type),
4371 (Name, File, Line, GetterName, SetterName, Attributes,
4372 Type))
4373 DEFINE_MDNODE_GET(DIObjCProperty,
4374 (MDString * Name, Metadata *File, unsigned Line,
4376 unsigned Attributes, Metadata *Type),
4377 (Name, File, Line, GetterName, SetterName, Attributes,
4378 Type))
4379
4380 TempDIObjCProperty clone() const { return cloneImpl(); }
4381
4382 unsigned getLine() const { return Line; }
4383 unsigned getAttributes() const { return Attributes; }
4384 StringRef getName() const { return getStringOperand(0); }
4389
4391 if (auto *F = getFile())
4392 return F->getFilename();
4393 return "";
4394 }
4395
4397 if (auto *F = getFile())
4398 return F->getDirectory();
4399 return "";
4400 }
4401
4403 Metadata *getRawFile() const { return getOperand(1); }
4406 Metadata *getRawType() const { return getOperand(4); }
4407
4408 static bool classof(const Metadata *MD) {
4409 return MD->getMetadataID() == DIObjCPropertyKind;
4410 }
4411};
4412
4413/// An imported module (C++ using directive or similar).
4414///
4415/// Uses the SubclassData32 Metadata slot.
4416class DIImportedEntity : public DINode {
4417 friend class LLVMContextImpl;
4418 friend class MDNode;
4419
4420 DIImportedEntity(LLVMContext &C, StorageType Storage, unsigned Tag,
4421 unsigned Line, ArrayRef<Metadata *> Ops)
4422 : DINode(C, DIImportedEntityKind, Storage, Tag, Ops) {
4424 }
4425 ~DIImportedEntity() = default;
4426
4427 static DIImportedEntity *getImpl(LLVMContext &Context, unsigned Tag,
4428 DIScope *Scope, DINode *Entity, DIFile *File,
4429 unsigned Line, StringRef Name,
4430 DINodeArray Elements, StorageType Storage,
4431 bool ShouldCreate = true) {
4432 return getImpl(Context, Tag, Scope, Entity, File, Line,
4433 getCanonicalMDString(Context, Name), Elements.get(), Storage,
4434 ShouldCreate);
4435 }
4436 LLVM_ABI static DIImportedEntity *
4437 getImpl(LLVMContext &Context, unsigned Tag, Metadata *Scope, Metadata *Entity,
4438 Metadata *File, unsigned Line, MDString *Name, Metadata *Elements,
4439 StorageType Storage, bool ShouldCreate = true);
4440
4441 TempDIImportedEntity cloneImpl() const {
4442 return getTemporary(getContext(), getTag(), getScope(), getEntity(),
4443 getFile(), getLine(), getName(), getElements());
4444 }
4445
4446public:
4447 DEFINE_MDNODE_GET(DIImportedEntity,
4448 (unsigned Tag, DIScope *Scope, DINode *Entity, DIFile *File,
4449 unsigned Line, StringRef Name = "",
4450 DINodeArray Elements = nullptr),
4451 (Tag, Scope, Entity, File, Line, Name, Elements))
4452 DEFINE_MDNODE_GET(DIImportedEntity,
4455 Metadata *Elements = nullptr),
4456 (Tag, Scope, Entity, File, Line, Name, Elements))
4457
4458 TempDIImportedEntity clone() const { return cloneImpl(); }
4459
4460 unsigned getLine() const { return SubclassData32; }
4461 DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
4462 DINode *getEntity() const { return cast_or_null<DINode>(getRawEntity()); }
4463 StringRef getName() const { return getStringOperand(2); }
4464 DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
4465 DINodeArray getElements() const {
4466 return cast_or_null<MDTuple>(getRawElements());
4467 }
4468
4469 Metadata *getRawScope() const { return getOperand(0); }
4470 Metadata *getRawEntity() const { return getOperand(1); }
4471 MDString *getRawName() const { return getOperandAs<MDString>(2); }
4472 Metadata *getRawFile() const { return getOperand(3); }
4473 Metadata *getRawElements() const { return getOperand(4); }
4474
4475 static bool classof(const Metadata *MD) {
4476 return MD->getMetadataID() == DIImportedEntityKind;
4477 }
4478};
4479
4480/// A pair of DIGlobalVariable and DIExpression.
4481class DIGlobalVariableExpression : public MDNode {
4482 friend class LLVMContextImpl;
4483 friend class MDNode;
4484
4485 DIGlobalVariableExpression(LLVMContext &C, StorageType Storage,
4487 : MDNode(C, DIGlobalVariableExpressionKind, Storage, Ops) {}
4488 ~DIGlobalVariableExpression() = default;
4489
4491 getImpl(LLVMContext &Context, Metadata *Variable, Metadata *Expression,
4492 StorageType Storage, bool ShouldCreate = true);
4493
4494 TempDIGlobalVariableExpression cloneImpl() const {
4496 }
4497
4498public:
4499 DEFINE_MDNODE_GET(DIGlobalVariableExpression,
4500 (Metadata * Variable, Metadata *Expression),
4501 (Variable, Expression))
4502
4503 TempDIGlobalVariableExpression clone() const { return cloneImpl(); }
4504
4505 Metadata *getRawVariable() const { return getOperand(0); }
4506
4510
4511 Metadata *getRawExpression() const { return getOperand(1); }
4512
4516
4517 static bool classof(const Metadata *MD) {
4518 return MD->getMetadataID() == DIGlobalVariableExpressionKind;
4519 }
4520};
4521
4522/// Macro Info DWARF-like metadata node.
4523///
4524/// A metadata node with a DWARF macro info (i.e., a constant named
4525/// \c DW_MACINFO_*, defined in llvm/BinaryFormat/Dwarf.h). Called \a
4526/// DIMacroNode
4527/// because it's potentially used for non-DWARF output.
4528///
4529/// Uses the SubclassData16 Metadata slot.
4530class DIMacroNode : public MDNode {
4531 friend class LLVMContextImpl;
4532 friend class MDNode;
4533
4534protected:
4535 DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType,
4537 : MDNode(C, ID, Storage, Ops1, Ops2) {
4538 assert(MIType < 1u << 16);
4539 SubclassData16 = MIType;
4540 }
4541 ~DIMacroNode() = default;
4542
4543 template <class Ty> Ty *getOperandAs(unsigned I) const {
4544 return cast_or_null<Ty>(getOperand(I));
4545 }
4546
4547 StringRef getStringOperand(unsigned I) const {
4548 if (auto *S = getOperandAs<MDString>(I))
4549 return S->getString();
4550 return StringRef();
4551 }
4552
4554 if (S.empty())
4555 return nullptr;
4556 return MDString::get(Context, S);
4557 }
4558
4559public:
4560 unsigned getMacinfoType() const { return SubclassData16; }
4561
4562 static bool classof(const Metadata *MD) {
4563 switch (MD->getMetadataID()) {
4564 default:
4565 return false;
4566 case DIMacroKind:
4567 case DIMacroFileKind:
4568 return true;
4569 }
4570 }
4571};
4572
4573/// Macro
4574///
4575/// Uses the SubclassData32 Metadata slot.
4576class DIMacro : public DIMacroNode {
4577 friend class LLVMContextImpl;
4578 friend class MDNode;
4579
4580 DIMacro(LLVMContext &C, StorageType Storage, unsigned MIType, unsigned Line,
4582 : DIMacroNode(C, DIMacroKind, Storage, MIType, Ops) {
4584 }
4585 ~DIMacro() = default;
4586
4587 static DIMacro *getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
4589 bool ShouldCreate = true) {
4590 return getImpl(Context, MIType, Line, getCanonicalMDString(Context, Name),
4591 getCanonicalMDString(Context, Value), Storage, ShouldCreate);
4592 }
4593 LLVM_ABI static DIMacro *getImpl(LLVMContext &Context, unsigned MIType,
4594 unsigned Line, MDString *Name,
4595 MDString *Value, StorageType Storage,
4596 bool ShouldCreate = true);
4597
4598 TempDIMacro cloneImpl() const {
4600 getValue());
4601 }
4602
4603public:
4605 (unsigned MIType, unsigned Line, StringRef Name,
4606 StringRef Value = ""),
4607 (MIType, Line, Name, Value))
4608 DEFINE_MDNODE_GET(DIMacro,
4609 (unsigned MIType, unsigned Line, MDString *Name,
4612
4613 TempDIMacro clone() const { return cloneImpl(); }
4614
4615 unsigned getLine() const { return SubclassData32; }
4616
4617 StringRef getName() const { return getStringOperand(0); }
4618 StringRef getValue() const { return getStringOperand(1); }
4619
4622
4623 static bool classof(const Metadata *MD) {
4624 return MD->getMetadataID() == DIMacroKind;
4625 }
4626};
4627
4628/// Macro file
4629///
4630/// Uses the SubclassData32 Metadata slot.
4631class DIMacroFile : public DIMacroNode {
4632 friend class LLVMContextImpl;
4633 friend class MDNode;
4634
4635 DIMacroFile(LLVMContext &C, StorageType Storage, unsigned MIType,
4636 unsigned Line, ArrayRef<Metadata *> Ops)
4637 : DIMacroNode(C, DIMacroFileKind, Storage, MIType, Ops) {
4639 }
4640 ~DIMacroFile() = default;
4641
4642 static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
4643 unsigned Line, DIFile *File,
4644 DIMacroNodeArray Elements, StorageType Storage,
4645 bool ShouldCreate = true) {
4646 return getImpl(Context, MIType, Line, static_cast<Metadata *>(File),
4647 Elements.get(), Storage, ShouldCreate);
4648 }
4649
4650 LLVM_ABI static DIMacroFile *getImpl(LLVMContext &Context, unsigned MIType,
4651 unsigned Line, Metadata *File,
4653 bool ShouldCreate = true);
4654
4655 TempDIMacroFile cloneImpl() const {
4657 getElements());
4658 }
4659
4660public:
4662 (unsigned MIType, unsigned Line, DIFile *File,
4663 DIMacroNodeArray Elements),
4664 (MIType, Line, File, Elements))
4665 DEFINE_MDNODE_GET(DIMacroFile,
4666 (unsigned MIType, unsigned Line, Metadata *File,
4669
4670 TempDIMacroFile clone() const { return cloneImpl(); }
4671
4672 void replaceElements(DIMacroNodeArray Elements) {
4673#ifndef NDEBUG
4674 for (DIMacroNode *Op : getElements())
4675 assert(is_contained(Elements->operands(), Op) &&
4676 "Lost a macro node during macro node list replacement");
4677#endif
4678 replaceOperandWith(1, Elements.get());
4679 }
4680
4681 unsigned getLine() const { return SubclassData32; }
4683
4684 DIMacroNodeArray getElements() const {
4686 }
4687
4688 Metadata *getRawFile() const { return getOperand(0); }
4689 Metadata *getRawElements() const { return getOperand(1); }
4690
4691 static bool classof(const Metadata *MD) {
4692 return MD->getMetadataID() == DIMacroFileKind;
4693 }
4694};
4695
4696/// List of ValueAsMetadata, to be used as an argument to a dbg.value
4697/// intrinsic.
4698class DIArgList : public Metadata, ReplaceableMetadataImpl {
4700 friend class LLVMContextImpl;
4702
4704
4705 DIArgList(LLVMContext &Context, ArrayRef<ValueAsMetadata *> Args)
4706 : Metadata(DIArgListKind, Uniqued), ReplaceableMetadataImpl(Context),
4707 Args(Args) {
4708 track();
4709 }
4710 ~DIArgList() { untrack(); }
4711
4712 LLVM_ABI void track();
4713 LLVM_ABI void untrack();
4714 void dropAllReferences(bool Untrack);
4715
4716public:
4717 LLVM_ABI static DIArgList *get(LLVMContext &Context,
4719
4720 ArrayRef<ValueAsMetadata *> getArgs() const { return Args; }
4721
4722 iterator args_begin() { return Args.begin(); }
4723 iterator args_end() { return Args.end(); }
4724
4725 static bool classof(const Metadata *MD) {
4726 return MD->getMetadataID() == DIArgListKind;
4727 }
4728
4732
4733 LLVM_ABI void handleChangedOperand(void *Ref, Metadata *New);
4734};
4735
4736/// Identifies a unique instance of a variable.
4737///
4738/// Storage for identifying a potentially inlined instance of a variable,
4739/// or a fragment thereof. This guarantees that exactly one variable instance
4740/// may be identified by this class, even when that variable is a fragment of
4741/// an aggregate variable and/or there is another inlined instance of the same
4742/// source code variable nearby.
4743/// This class does not necessarily uniquely identify that variable: it is
4744/// possible that a DebugVariable with different parameters may point to the
4745/// same variable instance, but not that one DebugVariable points to multiple
4746/// variable instances.
4748 using FragmentInfo = DIExpression::FragmentInfo;
4749
4750 const DILocalVariable *Variable;
4751 std::optional<FragmentInfo> Fragment;
4752 const DILocation *InlinedAt;
4753
4754 /// Fragment that will overlap all other fragments. Used as default when
4755 /// caller demands a fragment.
4756 LLVM_ABI static const FragmentInfo DefaultFragment;
4757
4758public:
4760
4762 std::optional<FragmentInfo> FragmentInfo,
4763 const DILocation *InlinedAt)
4764 : Variable(Var), Fragment(FragmentInfo), InlinedAt(InlinedAt) {}
4765
4766 DebugVariable(const DILocalVariable *Var, const DIExpression *DIExpr,
4767 const DILocation *InlinedAt)
4768 : Variable(Var),
4769 Fragment(DIExpr ? DIExpr->getFragmentInfo() : std::nullopt),
4770 InlinedAt(InlinedAt) {}
4771
4772 const DILocalVariable *getVariable() const { return Variable; }
4773 std::optional<FragmentInfo> getFragment() const { return Fragment; }
4774 const DILocation *getInlinedAt() const { return InlinedAt; }
4775
4776 FragmentInfo getFragmentOrDefault() const {
4777 return Fragment.value_or(DefaultFragment);
4778 }
4779
4780 static bool isDefaultFragment(const FragmentInfo F) {
4781 return F == DefaultFragment;
4782 }
4783
4784 bool operator==(const DebugVariable &Other) const {
4785 return std::tie(Variable, Fragment, InlinedAt) ==
4786 std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
4787 }
4788
4789 bool operator<(const DebugVariable &Other) const {
4790 return std::tie(Variable, Fragment, InlinedAt) <
4791 std::tie(Other.Variable, Other.Fragment, Other.InlinedAt);
4792 }
4793};
4794
4795template <> struct DenseMapInfo<DebugVariable> {
4797
4798 /// Empty key: no key should be generated that has no DILocalVariable.
4799 static inline DebugVariable getEmptyKey() {
4800 return DebugVariable(nullptr, std::nullopt, nullptr);
4801 }
4802
4803 /// Difference in tombstone is that the Optional is meaningful.
4805 return DebugVariable(nullptr, {{0, 0}}, nullptr);
4806 }
4807
4808 static unsigned getHashValue(const DebugVariable &D) {
4809 unsigned HV = 0;
4810 const std::optional<FragmentInfo> Fragment = D.getFragment();
4811 if (Fragment)
4813
4814 return hash_combine(D.getVariable(), HV, D.getInlinedAt());
4815 }
4816
4817 static bool isEqual(const DebugVariable &A, const DebugVariable &B) {
4818 return A == B;
4819 }
4820};
4821
4822/// Identifies a unique instance of a whole variable (discards/ignores fragment
4823/// information).
4830
4831template <>
4833 : public DenseMapInfo<DebugVariable> {};
4834} // end namespace llvm
4835
4836#undef DEFINE_MDNODE_GET_UNPACK_IMPL
4837#undef DEFINE_MDNODE_GET_UNPACK
4838#undef DEFINE_MDNODE_GET
4839
4840#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:853
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
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
const_pointer iterator
Definition ArrayRef.h:47
iterator begin() const
Definition ArrayRef.h:129
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'.
DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag, unsigned LineNo, 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 Encoding
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags
TempDIBasicType cloneImpl() const
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 StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned uint32_t uint32_t DataSizeInBits
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 StringRef DIFile * File
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 StringRef DIFile unsigned DIScope * Scope
~DIBasicType()=default
static bool classof(const Metadata *MD)
static DIBasicType * getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, DIFile *File, unsigned LineNo, DIScope *Scope, 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
DEFINE_MDNODE_GET(DIBasicType,(unsigned Tag, StringRef Name),(Tag, Name, nullptr, 0, nullptr, 0, 0, 0, 0, 0, FlagZero)) DEFINE_MDNODE_GET(DIBasicType
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, unsigned LineNo, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, ArrayRef< Metadata * > Ops)
static DIBasicType * getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File, unsigned LineNo, DIScope *Scope, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, StorageType Storage, bool ShouldCreate=true)
unsigned StringRef Name
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t AlignInBits
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 StringRef DIFile unsigned LineNo
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)
uint16_t getDialect() const
Target-specific language dialect for DWARF.
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 bool extractLeadingOffset(ArrayRef< uint64_t > Ops, int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps)
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 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
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI const char * fixedPointKindString(FixedPointKind)
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags unsigned int APInt Numerator
const APInt & getNumeratorRaw() const
static bool classof(const Metadata *MD)
unsigned StringRef DIFile unsigned LineNo
const APInt & getDenominator() const
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned Encoding
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags unsigned int APInt APInt Denominator
unsigned StringRef DIFile unsigned DIScope uint64_t SizeInBits
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t AlignInBits
LLVM_ABI bool isSigned() const
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags unsigned int Factor
@ FixedPointBinary
Scale factor 2^Factor.
@ FixedPointDecimal
Scale factor 10^Factor.
@ FixedPointRational
Arbitrary rational scale factor.
DEFINE_MDNODE_GET(DIFixedPointType,(unsigned Tag, MDString *Name, DIFile *File, unsigned LineNo, DIScope *Scope, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, DIFlags Flags, unsigned Kind, int Factor, APInt Numerator, APInt Denominator),(Tag, Name, File, LineNo, Scope, SizeInBits, AlignInBits, Encoding, Flags, Kind, Factor, Numerator, Denominator)) DEFINE_MDNODE_GET(DIFixedPointType
FixedPointKind getKind() const
unsigned StringRef DIFile unsigned DIScope * Scope
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags Flags
const APInt & getNumerator() const
unsigned StringRef DIFile * File
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 source language identity metadata that includes language name,...
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, uint16_t Dialect=0)
DISourceLanguageName(uint16_t Lang, uint32_t Version, uint16_t Dialect=0)
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
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:558
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:2142
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:1946
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:325
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:874
#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