13#ifndef LLVM_IR_DEBUGINFOMETADATA_H
14#define LLVM_IR_DEBUGINFOMETADATA_H
39#define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__
40#define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS
41#define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) \
42 static CLASS *getDistinct(LLVMContext &Context, \
43 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
44 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \
46 static Temp##CLASS getTemporary(LLVMContext &Context, \
47 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
49 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \
51#define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \
52 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
53 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \
55 static CLASS *getIfExists(LLVMContext &Context, \
56 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
57 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \
60 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
68class DbgVariableIntrinsic;
69class DbgVariableRecord;
80 explicit operator bool()
const {
return get(); }
88 unsigned size()
const {
return N ?
N->getNumOperands() : 0u; }
90 return cast_or_null<DIType>(
N->getOperand(
I));
153 if (
auto *S = getOperandAs<MDString>(
I))
154 return S->getString();
175#define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
176#define DI_FLAG_LARGEST_NEEDED
177#include "llvm/IR/DebugInfoFlags.def"
180 FlagVirtualInheritance,
198 case GenericDINodeKind:
200 case DIEnumeratorKind:
201 case DIBasicTypeKind:
202 case DIStringTypeKind:
203 case DIDerivedTypeKind:
204 case DICompositeTypeKind:
205 case DISubroutineTypeKind:
207 case DICompileUnitKind:
208 case DISubprogramKind:
209 case DILexicalBlockKind:
210 case DILexicalBlockFileKind:
211 case DINamespaceKind:
212 case DICommonBlockKind:
213 case DITemplateTypeParameterKind:
214 case DITemplateValueParameterKind:
215 case DIGlobalVariableKind:
216 case DILocalVariableKind:
218 case DIObjCPropertyKind:
219 case DIImportedEntityKind:
221 case DIGenericSubrangeKind:
249 void recalculateHash();
251 static GenericDINode *getImpl(LLVMContext &Context,
unsigned Tag,
258 static GenericDINode *getImpl(LLVMContext &Context,
unsigned Tag,
262 TempGenericDINode cloneImpl()
const {
280 TempGenericDINode
clone()
const {
return cloneImpl(); }
319 bool ShouldCreate =
true);
328 return Context.getReplaceableUses()->getAllDbgVariableRecordUsers();
335 return TempDIAssignID(getImpl(Context,
Temporary));
358 bool ShouldCreate =
true);
362 bool ShouldCreate =
true);
367 bool ShouldCreate =
true);
369 TempDISubrange cloneImpl()
const {
371 getRawUpperBound(), getRawStride());
386 TempDISubrange
clone()
const {
return cloneImpl(); }
396 typedef PointerUnion<ConstantInt *, DIVariable *, DIExpression *> BoundType;
423 bool ShouldCreate =
true);
425 TempDIGenericSubrange cloneImpl()
const {
434 (CountNode, LowerBound, UpperBound, Stride))
436 TempDIGenericSubrange
clone()
const {
return cloneImpl(); }
478 static DIEnumerator *getImpl(LLVMContext &Context,
const APInt &Value,
482 TempDIEnumerator cloneImpl()
const {
500 TempDIEnumerator
clone()
const {
return cloneImpl(); }
531 inline std::optional<StringRef>
getSource()
const;
543 return isa<DIFile>(
this) ?
const_cast<DIScope *
>(
this)
551 case DIBasicTypeKind:
552 case DIStringTypeKind:
553 case DIDerivedTypeKind:
554 case DICompositeTypeKind:
555 case DISubroutineTypeKind:
557 case DICompileUnitKind:
558 case DISubprogramKind:
559 case DILexicalBlockKind:
560 case DILexicalBlockFileKind:
561 case DINamespaceKind:
562 case DICommonBlockKind:
610 std::optional<ChecksumInfo<MDString *>> Checksum;
615 std::optional<ChecksumInfo<MDString *>>
CS,
MDString *Src,
621 std::optional<ChecksumInfo<StringRef>>
CS,
623 bool ShouldCreate =
true) {
624 std::optional<ChecksumInfo<MDString *>> MDChecksum;
632 static DIFile *getImpl(LLVMContext &Context, MDString *
Filename,
634 std::optional<ChecksumInfo<MDString *>>
CS,
636 bool ShouldCreate =
true);
638 TempDIFile cloneImpl()
const {
647 std::optional<StringRef> Source = std::nullopt),
655 TempDIFile
clone()
const {
return cloneImpl(); }
659 std::optional<ChecksumInfo<StringRef>> getChecksum()
const {
660 std::optional<ChecksumInfo<StringRef>> StringRefChecksum;
662 StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString());
663 return StringRefChecksum;
665 std::optional<StringRef>
getSource()
const {
666 return Source ? std::optional<StringRef>(
Source->getString())
670 MDString *getRawFilename()
const {
return getOperandAs<MDString>(0); }
671 MDString *getRawDirectory()
const {
return getOperandAs<MDString>(1); }
672 std::optional<ChecksumInfo<MDString *>> getRawChecksum()
const {
675 MDString *getRawSource()
const {
return Source; }
677 static StringRef getChecksumKindAsString(
ChecksumKind CSKind);
678 static std::optional<ChecksumKind>
getChecksumKind(StringRef CSKindStr);
687 return F->getFilename();
693 return F->getDirectory();
699 return F->getSource();
723 init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
733 this->SizeInBits = SizeInBits;
735 this->OffsetInBits = OffsetInBits;
736 this->NumExtraInhabitants = NumExtraInhabitants;
745 init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
770 auto NewTy =
clone();
771 NewTy->Flags = NewFlags;
790 return getFlags() & FlagObjcClassComplete;
799 return getFlags() & FlagTypePassByReference;
809 case DIBasicTypeKind:
810 case DIStringTypeKind:
811 case DIDerivedTypeKind:
812 case DICompositeTypeKind:
813 case DISubroutineTypeKind:
835 Encoding(Encoding) {}
847 static DIBasicType *getImpl(LLVMContext &Context,
unsigned Tag,
853 TempDIBasicType cloneImpl()
const {
861 (
Tag,
Name, 0, 0, 0, 0, FlagZero))
889 TempDIBasicType
clone()
const {
return cloneImpl(); }
916 Encoding(Encoding) {}
924 bool ShouldCreate =
true) {
929 static DIStringType *getImpl(LLVMContext &Context,
unsigned Tag,
934 bool ShouldCreate =
true);
936 TempDIStringType cloneImpl()
const {
964 TempDIStringType
clone()
const {
return cloneImpl(); }
1011 bool IsaPointer,
bool AuthenticatesNullValues) {
1013 assert(Discriminator <= 0xffff);
1014 RawData = (Key << 0) | (IsDiscr ? (1 << 4) : 0) | (Discriminator << 5) |
1015 (IsaPointer ? (1 << 21) : 0) |
1016 (AuthenticatesNullValues ? (1 << 22) : 0);
1032 std::optional<unsigned> DWARFAddressSpace;
1037 std::optional<unsigned> DWARFAddressSpace,
1042 DWARFAddressSpace(DWARFAddressSpace) {
1051 std::optional<unsigned> DWARFAddressSpace,
1054 bool ShouldCreate =
true) {
1060 static DIDerivedType *
1064 std::optional<unsigned> DWARFAddressSpace,
1067 bool ShouldCreate =
true);
1069 TempDIDerivedType cloneImpl()
const {
1073 getDWARFAddressSpace(), getPtrAuthData(),
getFlags(),
1083 std::optional<unsigned> DWARFAddressSpace,
1094 std::optional<unsigned> DWARFAddressSpace,
1102 TempDIDerivedType
clone()
const {
return cloneImpl(); }
1110 std::optional<unsigned> getDWARFAddressSpace()
const {
1111 return DWARFAddressSpace;
1114 std::optional<PtrAuthData> getPtrAuthData()
const;
1143 return dyn_cast_or_null<DIObjCProperty>(
getExtraData());
1167 return !(Lhs == Rhs);
1178 unsigned RuntimeLang;
1179 std::optional<uint32_t> EnumKind;
1189 RuntimeLang(RuntimeLang), EnumKind(EnumKind) {}
1193 void mutate(
unsigned Tag,
unsigned Line,
unsigned RuntimeLang,
1199 this->RuntimeLang = RuntimeLang;
1200 this->EnumKind = EnumKind;
1205 static DICompositeType *
1210 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1215 bool ShouldCreate =
true) {
1224 static DICompositeType *
1236 TempDICompositeType cloneImpl()
const {
1253 DINodeArray
Elements,
unsigned RuntimeLang,
1282 TempDICompositeType
clone()
const {
return cloneImpl(); }
1297 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1320 unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1347 return getOperandAs<DIDerivedType>(8);
1372 if (
auto *MD = dyn_cast_or_null<ConstantAsMetadata>(
getRawRank()))
1373 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1377 return dyn_cast_or_null<DIExpression>(
getRawRank());
1399 "Lost a member during member list replacement");
1436 bool ShouldCreate =
true) {
1442 bool ShouldCreate =
true);
1444 TempDISubroutineType cloneImpl()
const {
1456 TempDISubroutineType
clone()
const {
return cloneImpl(); }
1459 auto NewTy =
clone();
1506 unsigned RuntimeVersion;
1508 unsigned EmissionKind;
1509 unsigned NameTableKind;
1511 bool SplitDebugInlining;
1512 bool DebugInfoForProfiling;
1513 bool RangesBaseAddress;
1516 bool IsOptimized,
unsigned RuntimeVersion,
1517 unsigned EmissionKind,
uint64_t DWOId,
bool SplitDebugInlining,
1518 bool DebugInfoForProfiling,
unsigned NameTableKind,
1526 unsigned EmissionKind, DICompositeTypeArray
EnumTypes,
1530 uint64_t DWOId,
bool SplitDebugInlining,
bool DebugInfoForProfiling,
1539 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
1543 static DICompileUnit *
1550 bool DebugInfoForProfiling,
unsigned NameTableKind,
1551 bool RangesBaseAddress, MDString *
SysRoot, MDString *
SDK,
1554 TempDICompileUnit cloneImpl()
const {
1576 uint64_t DWOId,
bool SplitDebugInlining,
bool DebugInfoForProfiling,
1582 DebugInfoForProfiling, (
unsigned)NameTableKind, RangesBaseAddress,
1591 bool SplitDebugInlining,
bool DebugInfoForProfiling,
1597 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
SysRoot,
SDK))
1599 TempDICompileUnit
clone()
const {
return cloneImpl(); }
1637 this->SplitDebugInlining = SplitDebugInlining;
1645 return getOperandAs<MDString>(3);
1725 unsigned VirtualIndex;
1735#define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID,
1736#define DISP_FLAG_LARGEST_NEEDED
1737#include "llvm/IR/DebugInfoFlags.def"
1757 bool IsMainSubprogram =
false);
1764 unsigned ScopeLine,
unsigned VirtualIndex,
int ThisAdjustment,
1772 unsigned VirtualIndex,
int ThisAdjustment,
DIFlags Flags,
1786 static DISubprogram *
1794 bool ShouldCreate =
true);
1796 TempDISubprogram cloneImpl()
const {
1799 getContainingType(), getVirtualIndex(),
1800 getThisAdjustment(),
getFlags(), getSPFlags(),
1801 getUnit(), getTemplateParams(), getDeclaration(),
1802 getRetainedNodes(), getThrownTypes(), getAnnotations(),
1803 getTargetFuncName());
1834 TempDISubprogram
clone()
const {
return cloneImpl(); }
1837 TempDISubprogram cloneWithFlags(
DIFlags NewFlags)
const {
1838 auto NewSP =
clone();
1839 NewSP->Flags = NewFlags;
1844 unsigned getLine()
const {
return Line; }
1846 unsigned getVirtualIndex()
const {
return VirtualIndex; }
1847 int getThisAdjustment()
const {
return ThisAdjustment; }
1848 unsigned getScopeLine()
const {
return ScopeLine; }
1849 void setScopeLine(
unsigned L) {
1854 DISPFlags getSPFlags()
const {
return SPFlags; }
1855 bool isLocalToUnit()
const {
return getSPFlags() & SPFlagLocalToUnit; }
1856 bool isDefinition()
const {
return getSPFlags() & SPFlagDefinition; }
1857 bool isOptimized()
const {
return getSPFlags() & SPFlagOptimized; }
1858 bool isMainSubprogram()
const {
return getSPFlags() & SPFlagMainSubprogram; }
1860 bool isArtificial()
const {
return getFlags() & FlagArtificial; }
1861 bool isPrivate()
const {
1864 bool isProtected()
const {
1867 bool isPublic()
const {
1870 bool isExplicit()
const {
return getFlags() & FlagExplicit; }
1871 bool isPrototyped()
const {
return getFlags() & FlagPrototyped; }
1872 bool areAllCallsDescribed()
const {
1873 return getFlags() & FlagAllCallsDescribed;
1875 bool isPure()
const {
return getSPFlags() & SPFlagPure; }
1876 bool isElemental()
const {
return getSPFlags() & SPFlagElemental; }
1877 bool isRecursive()
const {
return getSPFlags() & SPFlagRecursive; }
1878 bool isObjCDirect()
const {
return getSPFlags() & SPFlagObjCDirect; }
1884 bool isDeleted()
const {
return getSPFlags() & SPFlagDeleted; }
1890 bool isLValueReference()
const {
return getFlags() & FlagLValueReference; }
1896 bool isRValueReference()
const {
return getFlags() & FlagRValueReference; }
1901 bool isNoReturn()
const {
return getFlags() & FlagNoReturn; }
1906 bool isThunk()
const {
return getFlags() & FlagThunk; }
1908 DIScope *
getScope()
const {
return cast_or_null<DIScope>(getRawScope()); }
1915 DISubroutineType *
getType()
const {
1916 return cast_or_null<DISubroutineType>(getRawType());
1918 DIType *getContainingType()
const {
1919 return cast_or_null<DIType>(getRawContainingType());
1921 void replaceType(DISubroutineType *Ty) {
1926 DICompileUnit *getUnit()
const {
1927 return cast_or_null<DICompileUnit>(getRawUnit());
1930 DITemplateParameterArray getTemplateParams()
const {
1931 return cast_or_null<MDTuple>(getRawTemplateParams());
1933 DISubprogram *getDeclaration()
const {
1934 return cast_or_null<DISubprogram>(getRawDeclaration());
1937 DINodeArray getRetainedNodes()
const {
1938 return cast_or_null<MDTuple>(getRawRetainedNodes());
1940 DITypeArray getThrownTypes()
const {
1941 return cast_or_null<MDTuple>(getRawThrownTypes());
1943 DINodeArray getAnnotations()
const {
1944 return cast_or_null<MDTuple>(getRawAnnotations());
1946 StringRef getTargetFuncName()
const {
1951 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
1952 MDString *getRawLinkageName()
const {
return getOperandAs<MDString>(3); }
1957 Metadata *getRawContainingType()
const {
1958 return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr;
1960 Metadata *getRawTemplateParams()
const {
1961 return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr;
1963 Metadata *getRawThrownTypes()
const {
1964 return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr;
1966 Metadata *getRawAnnotations()
const {
1967 return getNumOperands() > 11 ? getOperandAs<Metadata>(11) : nullptr;
1969 MDString *getRawTargetFuncName()
const {
1970 return getNumOperands() > 12 ? getOperandAs<MDString>(12) : nullptr;
1973 void replaceRawLinkageName(MDString *
LinkageName) {
1976 void replaceRetainedNodes(DINodeArray
N) {
1983 bool describes(
const Function *
F)
const;
2018 TempDILocation cloneImpl()
const {
2040 TempDILocation
clone()
const {
return cloneImpl(); }
2044 DILocalScope *getScope()
const {
return cast<DILocalScope>(
getRawScope()); }
2048 StringRef getSubprogramLinkageName()
const {
2049 DISubprogram *SP = getScope()->getSubprogram();
2052 auto Name = SP->getLinkageName();
2055 return SP->getName();
2058 DILocation *getInlinedAt()
const {
2071 DIFile *getFile()
const {
return getScope()->getFile(); }
2072 StringRef
getFilename()
const {
return getScope()->getFilename(); }
2073 StringRef getDirectory()
const {
return getScope()->getDirectory(); }
2074 std::optional<StringRef> getSource()
const {
return getScope()->getSource(); }
2080 DILocalScope *getInlinedAtScope()
const {
2081 if (
auto *IA = getInlinedAt())
2082 return IA->getInlinedAtScope();
2120 inline unsigned getDiscriminator()
const;
2131 return ((Discriminator & 0x7) == 0x7) && (Discriminator & 0xFFFFFFF8);
2141 inline std::optional<const DILocation *>
2158 inline std::optional<const DILocation *>
2196 bool IsFSDiscriminator =
false) {
2200 auto DwarfBaseDiscriminator =
2202 if (DwarfBaseDiscriminator)
2203 return *DwarfBaseDiscriminator;
2212 if (IsFSDiscriminator)
2303 assert(Column < (1u << 16) &&
"Expected 16-bit column");
2310 bool ShouldCreate =
true) {
2316 static DILexicalBlock *getImpl(LLVMContext &Context,
Metadata *
Scope,
2320 TempDILexicalBlock cloneImpl()
const {
2335 TempDILexicalBlock
clone()
const {
return cloneImpl(); }
2359 bool ShouldCreate =
true) {
2365 static DILexicalBlockFile *getImpl(LLVMContext &Context,
Metadata *
Scope,
2368 bool ShouldCreate =
true);
2370 TempDILexicalBlockFile cloneImpl()
const {
2384 TempDILexicalBlockFile
clone()
const {
return cloneImpl(); }
2392unsigned DILocation::getDiscriminator()
const {
2393 if (
auto *
F = dyn_cast<DILexicalBlockFile>(getScope()))
2394 return F->getDiscriminator();
2405 for (
auto *LBF = dyn_cast<DILexicalBlockFile>(
Scope);
2406 LBF && LBF->getDiscriminator() != 0;
2407 LBF = dyn_cast<DILexicalBlockFile>(
Scope))
2408 Scope = LBF->getScope();
2428std::optional<const DILocation *>
2430 unsigned BD,
DF, CI;
2444 return std::nullopt;
2447std::optional<const DILocation *>
2465 return std::nullopt;
2489 TempDINamespace cloneImpl()
const {
2502 TempDINamespace
clone()
const {
return cloneImpl(); }
2532 bool ShouldCreate =
true) {
2545 TempDIModule cloneImpl()
const {
2547 getConfigurationMacros(), getIncludePath(),
2548 getAPINotesFile(), getLineNo(), getIsDecl());
2556 bool IsDecl =
false),
2563 bool IsDecl =
false),
2567 TempDIModule
clone()
const {
return cloneImpl(); }
2569 DIScope *
getScope()
const {
return cast_or_null<DIScope>(getRawScope()); }
2578 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
2579 MDString *getRawConfigurationMacros()
const {
2580 return getOperandAs<MDString>(3);
2582 MDString *getRawIncludePath()
const {
return getOperandAs<MDString>(4); }
2583 MDString *getRawAPINotesFile()
const {
return getOperandAs<MDString>(5); }
2586 return MD->getMetadataID() == DIModuleKind;
2611 return MD->
getMetadataID() == DITemplateTypeParameterKind ||
2627 bool ShouldCreate =
true) {
2634 bool ShouldCreate =
true);
2636 TempDITemplateTypeParameter cloneImpl()
const {
2648 TempDITemplateTypeParameter
clone()
const {
return cloneImpl(); }
2670 bool ShouldCreate =
true) {
2674 static DITemplateValueParameter *getImpl(LLVMContext &Context,
unsigned Tag,
2678 bool ShouldCreate =
true);
2680 TempDITemplateValueParameter cloneImpl()
const {
2695 TempDITemplateValueParameter
clone()
const {
return cloneImpl(); }
2729 if (
auto *
BT = dyn_cast<DIBasicType>(
getType()))
2730 return BT->getSignedness();
2731 return std::nullopt;
2736 return F->getFilename();
2742 return F->getDirectory();
2748 return F->getSource();
2749 return std::nullopt;
2776 std::vector<uint64_t> Elements;
2780 Elements(Elements.begin(), Elements.end()) {}
2781 ~DIExpression() =
default;
2783 static DIExpression *getImpl(LLVMContext &Context,
2785 bool ShouldCreate =
true);
2787 TempDIExpression cloneImpl()
const {
2794 TempDIExpression
clone()
const {
return cloneImpl(); }
2801 assert(
I < Elements.size() &&
"Index out of range");
2808 std::optional<SignedOrUnsignedConstant>
isConstant()
const;
2996 static std::optional<const DIExpression *>
3022 bool SecondIndirect);
3049 unsigned &AddrClass);
3113 static std::optional<DIExpression *>
3115 unsigned SizeInBits);
3165 uint64_t SliceSizeInBits,
const Value *DbgPtr, int64_t DbgPtrOffsetInBits,
3167 std::optional<DIExpression::FragmentInfo> &Result,
3168 int64_t &OffsetFromLocationInBits);
3178 unsigned ToSize,
bool Signed);
3189 auto Fragment2 = *
Other->getFragmentInfo();
3207 std::pair<DIExpression *, const ConstantInt *>
3218 return std::tie(
A.SizeInBits,
A.OffsetInBits) ==
3219 std::tie(
B.SizeInBits,
B.OffsetInBits);
3224 return std::tie(
A.SizeInBits,
A.OffsetInBits) <
3225 std::tie(
B.SizeInBits,
B.OffsetInBits);
3230 static const uint64_t MaxVal = std::numeric_limits<uint64_t>::max();
3264 std::optional<DIExpression::ExprOperand>
take() {
3266 return std::nullopt;
3274 std::optional<DIExpression::ExprOperand>
peek()
const {
3276 return std::nullopt;
3281 std::optional<DIExpression::ExprOperand>
peekNext()
const {
3283 return std::nullopt;
3285 auto Next = Start.getNext();
3287 return std::nullopt;
3292 std::optional<DIExpression::ExprOperand>
peekNextN(
unsigned N)
const {
3294 return std::nullopt;
3296 for (
unsigned I = 0;
I <
N;
I++) {
3299 return std::nullopt;
3335 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
3341 bool IsLocalToUnit,
bool IsDefinition,
3344 bool ShouldCreate =
true) {
3351 static DIGlobalVariable *
3354 bool IsLocalToUnit,
bool IsDefinition,
3357 bool ShouldCreate =
true);
3359 TempDIGlobalVariable cloneImpl()
const {
3371 unsigned Line,
DIType *
Type,
bool IsLocalToUnit,
bool IsDefinition,
3385 TempDIGlobalVariable
clone()
const {
return cloneImpl(); }
3429 bool ShouldCreate =
true);
3431 TempDICommonBlock cloneImpl()
const {
3446 TempDICommonBlock
clone()
const {
return cloneImpl(); }
3450 return cast_or_null<DIGlobalVariable>(
getRawDecl());
3480 Arg(Arg), Flags(Flags) {
3481 assert(Arg < (1 << 16) &&
"DILocalVariable: Arg out of range");
3490 bool ShouldCreate =
true) {
3495 static DILocalVariable *getImpl(LLVMContext &Context,
Metadata *
Scope,
3500 bool ShouldCreate =
true);
3502 TempDILocalVariable cloneImpl()
const {
3522 TempDILocalVariable
clone()
const {
return cloneImpl(); }
3570 bool ShouldCreate =
true) {
3576 bool ShouldCreate =
true);
3578 TempDILabel cloneImpl()
const {
3593 TempDILabel
clone()
const {
return cloneImpl(); }
3628 unsigned Attributes;
3649 TempDIObjCProperty cloneImpl()
const {
3669 TempDIObjCProperty
clone()
const {
return cloneImpl(); }
3681 return F->getFilename();
3687 return F->getDirectory();
3720 bool ShouldCreate =
true) {
3725 static DIImportedEntity *
3730 TempDIImportedEntity cloneImpl()
const {
3732 getFile(), getLine(),
getName(), getElements());
3739 DINodeArray Elements =
nullptr),
3747 TempDIImportedEntity
clone()
const {
return cloneImpl(); }
3750 DIScope *getScope()
const {
return cast_or_null<DIScope>(getRawScope()); }
3751 DINode *getEntity()
const {
return cast_or_null<DINode>(getRawEntity()); }
3753 DIFile *getFile()
const {
return cast_or_null<DIFile>(getRawFile()); }
3754 DINodeArray getElements()
const {
3755 return cast_or_null<MDTuple>(getRawElements());
3760 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
3765 return MD->getMetadataID() == DIImportedEntityKind;
3783 TempDIGlobalVariableExpression cloneImpl()
const {
3792 TempDIGlobalVariableExpression
clone()
const {
return cloneImpl(); }
3807 return MD->
getMetadataID() == DIGlobalVariableExpressionKind;
3827 assert(MIType < 1u << 16);
3837 if (
auto *S = getOperandAs<MDString>(
I))
3838 return S->getString();
3856 case DIMacroFileKind:
3878 bool ShouldCreate =
true) {
3882 static DIMacro *getImpl(LLVMContext &Context,
unsigned MIType,
unsigned Line,
3884 bool ShouldCreate =
true);
3886 TempDIMacro cloneImpl()
const {
3901 TempDIMacro
clone()
const {
return cloneImpl(); }
3933 bool ShouldCreate =
true) {
3938 static DIMacroFile *getImpl(LLVMContext &Context,
unsigned MIType,
3942 TempDIMacroFile cloneImpl()
const {
3957 TempDIMacroFile
clone()
const {
return cloneImpl(); }
3963 "Lost a macro node during macro node list replacement");
4001 void dropAllReferences(
bool Untrack);
4004 static DIArgList *
get(LLVMContext &Context, ArrayRef<ValueAsMetadata *> Args);
4037 std::optional<FragmentInfo> Fragment;
4051 : Variable(Var), Fragment(
FragmentInfo), InlinedAt(InlinedAt) {}
4056 Fragment(DIExpr ? DIExpr->getFragmentInfo() :
std::nullopt),
4057 InlinedAt(InlinedAt) {}
4064 return Fragment.value_or(DefaultFragment);
4068 return F == DefaultFragment;
4072 return std::tie(Variable, Fragment, InlinedAt) ==
4077 return std::tie(Variable, Fragment, InlinedAt) <
4097 const std::optional<FragmentInfo> Fragment =
D.getFragment();
4123#undef DEFINE_MDNODE_GET_UNPACK_IMPL
4124#undef DEFINE_MDNODE_GET_UNPACK
4125#undef DEFINE_MDNODE_GET
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static std::string getLinkageName(GlobalValue::LinkageTypes LT)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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 GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static SmallString< 128 > getFilename(const DISubprogram *SP)
Extract a filename for a DISubprogram.
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)
static void r1(uint32_t &A, uint32_t &B, uint32_t &C, uint32_t &D, uint32_t &E, int I, uint32_t *Buf)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static enum BaseType getBaseType(const Value *Val)
Return the baseType for Val which states whether Val is exclusively derived from constant/null,...
This file defines the SmallVector class.
static uint32_t getFlags(const Symbol *Sym)
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
Annotations lets you mark points and ranges inside source code, for tests:
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
ArrayRef< ValueAsMetadata * > getArgs() const
void handleChangedOperand(void *Ref, Metadata *New)
static bool classof(const Metadata *MD)
static DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static bool classof(const Metadata *MD)
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static TempDIAssignID getTemporary(LLVMContext &Context)
static DIAssignID * getDistinct(LLVMContext &Context)
void replaceOperandWith(unsigned I, Metadata *New)=delete
Basic type, like 'int' or 'float'.
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags
static bool classof(const Metadata *MD)
unsigned StringRef uint64_t SizeInBits
std::optional< Signedness > getSignedness() const
Return the signedness of this type, or std::nullopt if this type is neither signed nor unsigned.
unsigned getEncoding() const
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t NumExtraInhabitants
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t AlignInBits
DEFINE_MDNODE_GET(DIBasicType,(unsigned Tag, StringRef Name),(Tag, Name, 0, 0, 0, 0, FlagZero)) DEFINE_MDNODE_GET(DIBasicType
Metadata * getRawScope() const
Metadata Metadata MDString Metadata unsigned LineNo TempDICommonBlock clone() const
Metadata * getRawDecl() const
Metadata * getRawFile() const
Metadata Metadata MDString Metadata unsigned LineNo
Metadata Metadata MDString * Name
MDString * getRawName() 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
MDString * getRawSplitDebugFilename() const
bool getDebugInfoForProfiling() const
Metadata * getRawRetainedTypes() const
static const char * nameTableKindString(DebugNameTableKind PK)
static const char * emissionKindString(DebugEmissionKind EK)
void setSplitDebugInlining(bool SplitDebugInlining)
DICompositeTypeArray getEnumTypes() const
DebugEmissionKind getEmissionKind() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata * Macros
unsigned Metadata MDString bool MDString * Flags
bool isDebugDirectivesOnly() const
StringRef getFlags() const
MDString * getRawProducer() const
void replaceEnumTypes(DICompositeTypeArray N)
Replace arrays.
MDString * getRawSysRoot() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata * EnumTypes
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata * RetainedTypes
static void getIfExists()=delete
bool getRangesBaseAddress() const
DIMacroNodeArray getMacros() const
unsigned getRuntimeVersion() const
Metadata * getRawMacros() const
void replaceRetainedTypes(DITypeArray N)
static bool classof(const Metadata *MD)
void replaceGlobalVariables(DIGlobalVariableExpressionArray N)
void replaceMacros(DIMacroNodeArray N)
bool getSplitDebugInlining() const
StringRef getSysRoot() const
DebugNameTableKind getNameTableKind() const
MDString * getRawSDK() const
MDString * getRawFlags() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata * GlobalVariables
DIImportedEntityArray getImportedEntities() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString MDString * SDK
unsigned Metadata MDString * Producer
Metadata * getRawEnumTypes() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString * SysRoot
StringRef getProducer() const
unsigned Metadata MDString bool MDString unsigned MDString * SplitDebugFilename
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata * ImportedEntities
void setDWOId(uint64_t DwoId)
DIScopeArray getRetainedTypes() const
void replaceImportedEntities(DIImportedEntityArray N)
Metadata * getRawGlobalVariables() const
DIGlobalVariableExpressionArray getGlobalVariables() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString MDString SDK TempDICompileUnit clone() const
unsigned getSourceLanguage() const
Metadata * getRawImportedEntities() const
uint64_t getDWOId() const
StringRef getSplitDebugFilename() const
DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(DICompileUnit,(unsigned 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
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t AlignInBits
Metadata * getRawVTableHolder() const
DIExpression * getRankExp() const
static DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t 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)
Build a DICompositeType with the given ODR identifier.
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
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 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 DICompositeType * getODRTypeIfExists(LLVMContext &Context, MDString &Identifier)
DIVariable * getAssociated() const
DIDerivedType * getDiscriminator() const
DIVariable * getDataLocation() const
unsigned getRuntimeLang() const
DIType * getSpecification() const
Metadata * getRawElements() const
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 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.
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),(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, Specification, NumExtraInhabitants, Flags, Elements, RuntimeLang, EnumKind, VTableHolder, TemplateParams, Identifier, Discriminator, DataLocation, Associated, Allocated, Rank, Annotations)) DEFINE_MDNODE_GET(DICompositeType
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 * getRawBaseType() const
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
DIType * getBaseType() const
Metadata * getRawExtraData() const
DINodeArray getAnnotations() const
Get annotations associated with this derived type.
unsigned StringRef DIFile unsigned DIScope DIType uint64_t uint32_t uint64_t std::optional< unsigned > std::optional< PtrAuthData > DIFlags Metadata * ExtraData
unsigned StringRef DIFile unsigned DIScope DIType uint64_t SizeInBits
Metadata * getExtraData() const
Get extra data associated with this derived type.
unsigned StringRef DIFile unsigned DIScope DIType uint64_t uint32_t uint64_t std::optional< unsigned > std::optional< PtrAuthData > DIFlags Metadata DINodeArray Annotations
DITemplateParameterArray getTemplateParams() const
Get the template parameters from a template alias.
unsigned StringRef DIFile * File
unsigned StringRef DIFile unsigned DIScope DIType uint64_t uint32_t uint64_t OffsetInBits
DIObjCProperty * getObjCProperty() const
unsigned StringRef DIFile unsigned DIScope DIType uint64_t uint32_t AlignInBits
unsigned StringRef DIFile unsigned DIScope * Scope
Metadata * getRawAnnotations() const
DIType * getClassType() const
Get casted version of extra data.
static bool classof(const Metadata *MD)
Constant * getConstant() const
Constant * getStorageOffsetInBits() const
Constant * getDiscriminantValue() const
uint32_t getVBPtrOffset() const
unsigned StringRef DIFile unsigned DIScope DIType uint64_t uint32_t uint64_t std::optional< unsigned > std::optional< PtrAuthData > DIFlags Flags
unsigned StringRef DIFile unsigned Line
DEFINE_MDNODE_GET(DIDerivedType,(unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t 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
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
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
Holds a DIExpression and keeps track of how many operands have been consumed so far.
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.
unsigned getSize() const
Return the size of the operand.
ExprOperand(const uint64_t *Op)
uint64_t getArg(unsigned I) const
Get an argument to the operand.
unsigned getNumArgs() const
uint64_t getOp() const
Get the operand code.
const uint64_t * get() const
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
std::input_iterator_tag iterator_category
expr_op_iterator & operator++()
const ExprOperand * operator->() const
bool operator!=(const expr_op_iterator &X) const
expr_op_iterator(element_iterator I)
std::ptrdiff_t difference_type
element_iterator getBase() const
const ExprOperand & operator*() const
expr_op_iterator getNext() const
Get the next iterator.
expr_op_iterator operator++(int)
expr_op_iterator()=default
element_iterator elements_end() const
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 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 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.
bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
static 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.
bool startsWithDeref() const
Return whether the first element a DW_OP_deref.
static 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
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 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
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 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.
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.
DIExpression * foldConstantMath()
Try to shorten an expression with constant math operations that can be evaluated at compile time.
static std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
std::pair< DIExpression *, const ConstantInt * > constantFold(const ConstantInt *CI)
Try to shorten an expression with an initial constant operand.
bool isDeref() const
Return whether there is exactly one operator and it is a DW_OP_deref;.
static const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
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 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)
std::optional< uint64_t > getActiveBits(DIVariable *Var)
Return the number of bits that have an active value, i.e.
static 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 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 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 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 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 DIExpression * appendExt(const DIExpression *Expr, unsigned FromSize, unsigned ToSize, bool Signed)
Append a zero- or sign-extension to Expr.
std::optional< ArrayRef< uint64_t > > getSingleLocationExpressionElements() const
Returns a reference to the elements contained in this expression, skipping past the leading DW_OP_LLV...
bool isSingleLocationExpression() const
Return whether the evaluated expression makes use of a single location at the start of the expression...
bool extractLeadingOffset(int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps) const
Assuming that the expression operates on an address, extract a constant offset and the successive ops...
std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
static const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the last 4 elements of the expression are DW_OP_constu <DWARF Address Space> DW_OP_swap DW_...
static 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
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
static std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
MDString MDString std::optional< ChecksumInfo< MDString * > > CS
Metadata * getRawLowerBound() const
Metadata * getRawCountNode() const
Metadata * getRawStride() const
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)
BoundType getCount() const
BoundType getUpperBound() const
BoundType getStride() const
A pair of DIGlobalVariable and DIExpression.
DEFINE_MDNODE_GET(DIGlobalVariableExpression,(Metadata *Variable, Metadata *Expression),(Variable, Expression)) TempDIGlobalVariableExpression clone() const
Metadata * getRawExpression() const
DIGlobalVariable * getVariable() const
static bool classof(const Metadata *MD)
Metadata * getRawVariable() const
DIExpression * getExpression() const
Metadata * getRawAnnotations() const
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata * TemplateParams
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
MDTuple * getTemplateParams() const
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata * StaticDataMemberDeclaration
bool isLocalToUnit() const
Metadata * getRawStaticDataMemberDeclaration() const
Metadata MDString MDString * LinkageName
MDString * getRawLinkageName() const
StringRef getLinkageName() const
static bool classof(const Metadata *MD)
StringRef getDisplayName() const
bool isDefinition() const
Metadata MDString MDString Metadata * File
DINodeArray getAnnotations() const
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
StringRef getName() const
static bool classof(const Metadata *MD)
Metadata MDString Metadata unsigned Line TempDILabel clone() const
DEFINE_MDNODE_GET(DILabel,(DILocalScope *Scope, StringRef Name, DIFile *File, unsigned Line),(Scope, Name, File, Line)) DEFINE_MDNODE_GET(DILabel
Metadata * getRawFile() const
DILocalScope * getScope() const
Get the local scope for this label.
MDString * getRawName() const
Metadata MDString Metadata unsigned Line
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this label.
Metadata * getRawScope() const
Metadata MDString Metadata * File
static bool classof(const Metadata *MD)
void replaceScope(DIScope *Scope)
~DILexicalBlockBase()=default
Metadata * getRawScope() const
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
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)
unsigned getColumn() const
Metadata Metadata unsigned unsigned Column TempDILexicalBlock clone() const
DISubprogram * getSubprogram() const
Get the subprogram for this scope.
DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
static bool classof(const Metadata *MD)
static 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.
bool isObjectPointer() const
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
bool isArtificial() const
unsigned unsigned DILocalScope * Scope
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 getDuplicationFactor() const
Returns the duplication factor stored in the discriminator, or 1 if no duplication factor (or 0) is e...
static DILocation * getMergedLocations(ArrayRef< DILocation * > Locs)
Try to combine the vector of locations passed as input in a single one.
DEFINE_MDNODE_GET(DILocation,(unsigned Line, unsigned Column, Metadata *Scope, Metadata *InlinedAt=nullptr, bool ImplicitCode=false),(Line, Column, Scope, InlinedAt, ImplicitCode)) DEFINE_MDNODE_GET(DILocation
static unsigned getBaseDiscriminatorBits()
Return the bits used for base discriminators.
static 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 void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF, unsigned &CI)
Raw decoder for values in an encoded discriminator D.
static DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
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.
Metadata * getRawInlinedAt() const
unsigned unsigned DILocalScope DILocation * InlinedAt
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.
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 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 Metadata Metadata * Elements
Metadata * getRawFile() const
static bool classof(const Metadata *MD)
void replaceElements(DIMacroNodeArray Elements)
unsigned unsigned Metadata Metadata Elements TempDIMacroFile clone() const
DIMacroNodeArray getElements() const
Macro Info DWARF-like metadata node.
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)
Ty * getOperandAs(unsigned I) 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
DEFINE_MDNODE_GET(DIMacro,(unsigned MIType, unsigned Line, StringRef Name, StringRef Value=""),(MIType, Line, Name, Value)) DEFINE_MDNODE_GET(DIMacro
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
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
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
bool getExportSymbols() const
Metadata * getRawScope() const
Tagged DWARF-like metadata node.
dwarf::Tag getTag() const
static MDString * getCanonicalMDString(LLVMContext &Context, StringRef S)
static DIFlags getFlag(StringRef Flag)
static 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
static bool classof(const Metadata *MD)
static StringRef getFlagString(DIFlags Flag)
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
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.
StringRef getFilename() const
StringRef getName() const
static bool classof(const Metadata *MD)
StringRef getDirectory() const
std::optional< StringRef > getSource() const
DIScope * getScope() const
Metadata * getRawFile() const
Return the raw underlying file.
DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
String type, Fortran CHARACTER(n)
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
DIExpression * getStringLengthExp() const
unsigned MDString Metadata Metadata * StringLengthExp
Metadata * getRawStringLengthExp() const
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
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 * Annotations
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
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString * TargetFuncName
static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata * ThrownTypes
static DISPFlags getFlag(StringRef Flag)
Metadata MDString MDString Metadata * File
static 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 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
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=""),(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName)) DEFINE_MDNODE_GET(DISubprogram
DISPFlags
Debug info subprogram flags.
static bool classof(const Metadata *MD)
BoundType getUpperBound() const
BoundType getStride() const
BoundType getLowerBound() const
DEFINE_MDNODE_GET(DISubrange,(int64_t Count, int64_t LowerBound=0),(Count, LowerBound)) DEFINE_MDNODE_GET(DISubrange
BoundType getCount() const
Metadata int64_t LowerBound
Type array for a subprogram.
TempDISubroutineType cloneWithCC(uint8_t CC) const
DEFINE_MDNODE_GET(DISubroutineType,(DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray),(Flags, CC, TypeArray)) DEFINE_MDNODE_GET(DISubroutineType
DIFlags uint8_t Metadata * TypeArray
static bool classof(const Metadata *MD)
Metadata * getRawTypeArray() const
DITypeRefArray getTypeArray() const
DIFlags uint8_t Metadata TypeArray TempDISubroutineType clone() const
Base class for template parameters.
Metadata * getRawType() const
static bool classof(const Metadata *MD)
DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage, unsigned Tag, bool IsDefault, ArrayRef< Metadata * > Ops)
StringRef getName() const
MDString * getRawName() const
~DITemplateParameter()=default
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
Metadata * getValue() const
unsigned MDString Metadata bool IsDefault
unsigned MDString Metadata bool Metadata * Value
bool operator!=(const iterator &X) const
DIType * operator*() const
bool operator==(const iterator &X) const
std::input_iterator_tag iterator_category
std::ptrdiff_t difference_type
iterator(MDNode::op_iterator I)
DIType * operator[](unsigned I) const
MDTuple & operator*() const
MDTuple * operator->() const
DITypeRefArray(const MDTuple *N)
bool isLittleEndian() const
uint32_t getNumExtraInhabitants() const
bool isLValueReference() const
bool isStaticMember() const
TempDIType cloneWithFlags(DIFlags NewFlags) const
Returns a new temporary DIType with updated Flags.
bool isObjcClassComplete() const
MDString * getRawName() const
DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags, ArrayRef< Metadata * > Ops)
bool isAppleBlockExtension() const
uint64_t getOffsetInBits() const
bool isObjectPointer() const
Metadata * getRawScope() const
StringRef getName() const
bool isForwardDecl() const
bool isTypePassByValue() const
uint64_t getSizeInBits() const
static bool classof(const Metadata *MD)
uint32_t getAlignInBytes() const
uint32_t getAlignInBits() const
void mutate(unsigned Tag, unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags)
Change fields in place.
void init(unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags)
bool isRValueReference() const
bool isArtificial() const
bool getExportSymbols() const
DIScope * getScope() const
bool isTypePassByReference() 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
MDString * getRawName() const
uint32_t getAlignInBytes() const
DIScope * getScope() const
StringRef getDirectory() const
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)
StringRef getName() const
Metadata * getRawScope() const
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
This is the common base class for debug info intrinsics for variables.
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).
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
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.
dwarf::Tag getTag() const
StringRef getHeader() const
MDString * getRawHeader() const
const MDOperand & getDwarfOperand(unsigned I) 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.
void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
const MDOperand & getOperand(unsigned I) const
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
op_iterator op_end() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
iterator_range< op_iterator > op_range
TempMDNode clone() const
Create a (temporary) clone of this.
void setOperand(unsigned I, Metadata *New)
Set an operand.
op_iterator op_begin() const
LLVMContext & getContext() const
Tracking metadata reference owned by Metadata.
static MDString * get(LLVMContext &Context, StringRef Str)
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::iterator iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
A range adaptor for a pair of iterators.
unsigned getVirtuality(StringRef VirtualityString)
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
bool operator<(int64_t V1, const APSInt &V2)
bool operator!=(uint64_t V1, const APInt &V2)
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
cl::opt< bool > EnableFSDiscriminator
static unsigned getBaseFSBitEnd()
@ Ref
The access may reference the value stored in memory.
@ LLVM_MARK_AS_BITMASK_ENUM
static unsigned getN1Bits(int N)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Implement std::hash so that hash_code can be used in STL containers.
Pointer authentication (__ptrauth) metadata.
bool authenticatesNullValues()
PtrAuthData(unsigned FromRawData)
bool isAddressDiscriminated()
PtrAuthData(unsigned Key, bool IsDiscr, unsigned Discriminator, bool IsaPointer, bool AuthenticatesNullValues)
unsigned extraDiscriminator()
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 FragInfo getTombstoneKey()
static unsigned getHashValue(const FragInfo &Frag)
static FragInfo getEmptyKey()
static unsigned getHashValue(const DebugVariable &D)
static DebugVariable getEmptyKey()
Empty key: no key should be generated that has no DILocalVariable.
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)
static std::optional< uint32_t > extractDwarfBaseDiscriminator(uint32_t Value)