13 #ifndef LLVM_IR_DEBUGINFOMETADATA_H
14 #define LLVM_IR_DEBUGINFOMETADATA_H
38 #define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__
39 #define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS
40 #define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) \
41 static CLASS *getDistinct(LLVMContext &Context, \
42 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
43 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \
45 static Temp##CLASS getTemporary(LLVMContext &Context, \
46 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
48 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \
50 #define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \
51 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
52 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \
54 static CLASS *getIfExists(LLVMContext &Context, \
55 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
56 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \
59 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
76 explicit operator bool()
const {
return get(); }
84 unsigned size()
const {
return N ?
N->getNumOperands() : 0u; }
86 return cast_or_null<DIType>(
N->getOperand(
I));
147 if (
auto *
S = getOperandAs<MDString>(
I))
148 return S->getString();
169 #define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
170 #define DI_FLAG_LARGEST_NEEDED
171 #include "llvm/IR/DebugInfoFlags.def"
174 FlagVirtualInheritance,
192 case GenericDINodeKind:
194 case DIEnumeratorKind:
195 case DIBasicTypeKind:
196 case DIStringTypeKind:
197 case DIDerivedTypeKind:
198 case DICompositeTypeKind:
199 case DISubroutineTypeKind:
201 case DICompileUnitKind:
202 case DISubprogramKind:
203 case DILexicalBlockKind:
204 case DILexicalBlockFileKind:
205 case DINamespaceKind:
206 case DICommonBlockKind:
207 case DITemplateTypeParameterKind:
208 case DITemplateValueParameterKind:
209 case DIGlobalVariableKind:
210 case DILocalVariableKind:
212 case DIObjCPropertyKind:
213 case DIImportedEntityKind:
215 case DIGenericSubrangeKind:
240 void recalculateHash();
253 TempGenericDINode cloneImpl()
const {
271 TempGenericDINode
clone()
const {
return cloneImpl(); }
310 bool ShouldCreate =
true);
314 bool ShouldCreate =
true);
319 bool ShouldCreate =
true);
321 TempDISubrange cloneImpl()
const {
323 getRawUpperBound(), getRawStride());
338 TempDISubrange
clone()
const {
return cloneImpl(); }
348 typedef PointerUnion<ConstantInt *, DIVariable *, DIExpression *> BoundType;
375 bool ShouldCreate =
true);
377 TempDIGenericSubrange cloneImpl()
const {
386 (CountNode, LowerBound, UpperBound, Stride))
388 TempDIGenericSubrange
clone()
const {
return cloneImpl(); }
434 TempDIEnumerator cloneImpl()
const {
452 TempDIEnumerator
clone()
const {
return cloneImpl(); }
495 return isa<DIFile>(
this) ?
const_cast<DIScope *
>(
this)
503 case DIBasicTypeKind:
504 case DIStringTypeKind:
505 case DIDerivedTypeKind:
506 case DICompositeTypeKind:
507 case DISubroutineTypeKind:
509 case DICompileUnitKind:
510 case DISubprogramKind:
511 case DILexicalBlockKind:
512 case DILexicalBlockFileKind:
513 case DINamespaceKind:
514 case DICommonBlockKind:
574 bool ShouldCreate =
true) {
585 static DIFile *getImpl(LLVMContext &Context, MDString *
Filename,
589 bool ShouldCreate =
true);
591 TempDIFile cloneImpl()
const {
600 Optional<StringRef> Source =
None),
608 TempDIFile
clone()
const {
return cloneImpl(); }
612 Optional<ChecksumInfo<StringRef>> getChecksum()
const {
613 Optional<ChecksumInfo<StringRef>> StringRefChecksum;
615 StringRefChecksum.emplace(Checksum->Kind, Checksum->Value->getString());
616 return StringRefChecksum;
619 return Source ? Optional<StringRef>((*Source)->getString()) :
None;
622 MDString *getRawFilename()
const {
return getOperandAs<MDString>(0); }
623 MDString *getRawDirectory()
const {
return getOperandAs<MDString>(1); }
624 Optional<ChecksumInfo<MDString *>> getRawChecksum()
const {
return Checksum; }
625 Optional<MDString *> getRawSource()
const {
return Source; }
627 static StringRef getChecksumKindAsString(
ChecksumKind CSKind);
637 return F->getFilename();
643 return F->getDirectory();
649 return F->getSource();
670 init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
678 this->SizeInBits = SizeInBits;
679 this->AlignInBits = AlignInBits;
680 this->OffsetInBits = OffsetInBits;
688 init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
711 auto NewTy =
clone();
712 NewTy->Flags = NewFlags;
731 return getFlags() & FlagObjcClassComplete;
740 return getFlags() & FlagTypePassByReference;
750 case DIBasicTypeKind:
751 case DIStringTypeKind:
752 case DIDerivedTypeKind:
753 case DICompositeTypeKind:
754 case DISubroutineTypeKind:
775 Encoding(Encoding) {}
782 bool ShouldCreate =
true) {
791 bool ShouldCreate =
true);
793 TempDIBasicType cloneImpl()
const {
800 (
Tag,
Name, 0, 0, 0, FlagZero))
816 TempDIBasicType
clone()
const {
return cloneImpl(); }
843 Encoding(Encoding) {}
851 bool ShouldCreate =
true) {
861 bool ShouldCreate =
true);
863 TempDIStringType cloneImpl()
const {
891 TempDIStringType
clone()
const {
return cloneImpl(); }
938 DWARFAddressSpace(DWARFAddressSpace) {}
947 bool ShouldCreate =
true) {
953 static DIDerivedType *
959 bool ShouldCreate =
true);
961 TempDIDerivedType cloneImpl()
const {
965 getDWARFAddressSpace(),
getFlags(), getExtraData(), getAnnotations());
989 TempDIDerivedType
clone()
const {
return cloneImpl(); }
997 Optional<unsigned> getDWARFAddressSpace()
const {
return DWARFAddressSpace; }
1007 Metadata *getExtraData()
const {
return getRawExtraData(); }
1011 DINodeArray getAnnotations()
const {
1012 return cast_or_null<MDTuple>(getRawAnnotations());
1018 DIType *getClassType()
const;
1021 return dyn_cast_or_null<DIObjCProperty>(getExtraData());
1046 unsigned RuntimeLang;
1054 RuntimeLang(RuntimeLang) {}
1058 void mutate(
unsigned Tag,
unsigned Line,
unsigned RuntimeLang,
1063 this->RuntimeLang = RuntimeLang;
1067 static DICompositeType *
1076 bool ShouldCreate =
true) {
1084 static DICompositeType *
1094 TempDICompositeType cloneImpl()
const {
1135 TempDICompositeType
clone()
const {
return cloneImpl(); }
1195 return getOperandAs<DIDerivedType>(8);
1220 if (
auto *MD = dyn_cast_or_null<ConstantAsMetadata>(
getRawRank()))
1221 return dyn_cast_or_null<ConstantInt>(MD->getValue());
1225 return dyn_cast_or_null<DIExpression>(
getRawRank());
1243 "Lost a member during member list replacement");
1280 bool ShouldCreate =
true) {
1286 bool ShouldCreate =
true);
1288 TempDISubroutineType cloneImpl()
const {
1300 TempDISubroutineType
clone()
const {
return cloneImpl(); }
1303 auto NewTy =
clone();
1350 unsigned RuntimeVersion;
1351 unsigned EmissionKind;
1353 bool SplitDebugInlining;
1354 bool DebugInfoForProfiling;
1355 unsigned NameTableKind;
1356 bool RangesBaseAddress;
1359 bool IsOptimized,
unsigned RuntimeVersion,
1360 unsigned EmissionKind,
uint64_t DWOId,
bool SplitDebugInlining,
1361 bool DebugInfoForProfiling,
unsigned NameTableKind,
1369 unsigned EmissionKind, DICompositeTypeArray
EnumTypes,
1373 uint64_t DWOId,
bool SplitDebugInlining,
bool DebugInfoForProfiling,
1382 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
1386 static DICompileUnit *
1387 getImpl(LLVMContext &Context,
unsigned SourceLanguage,
Metadata *
File,
1393 bool DebugInfoForProfiling,
unsigned NameTableKind,
1394 bool RangesBaseAddress, MDString *
SysRoot, MDString *
SDK,
1397 TempDICompileUnit cloneImpl()
const {
1408 static void get() =
delete;
1413 (
unsigned SourceLanguage, DIFile *
File, StringRef
Producer,
1414 bool IsOptimized, StringRef
Flags,
unsigned RuntimeVersion,
1419 uint64_t DWOId,
bool SplitDebugInlining,
bool DebugInfoForProfiling,
1425 DebugInfoForProfiling, (
unsigned)NameTableKind, RangesBaseAddress,
1434 bool SplitDebugInlining,
bool DebugInfoForProfiling,
1440 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
SysRoot,
SDK))
1442 TempDICompileUnit
clone()
const {
return cloneImpl(); }
1480 this->SplitDebugInlining = SplitDebugInlining;
1488 return getOperandAs<MDString>(3);
1578 TempDILocation cloneImpl()
const {
1600 TempDILocation
clone()
const {
return cloneImpl(); }
1606 DILocation *getInlinedAt()
const {
1619 DIFile *getFile()
const {
return getScope()->getFile(); }
1621 StringRef getDirectory()
const {
return getScope()->getDirectory(); }
1622 Optional<StringRef> getSource()
const {
return getScope()->getSource(); }
1628 DILocalScope *getInlinedAtScope()
const {
1629 if (
auto *IA = getInlinedAt())
1630 return IA->getInlinedAtScope();
1668 inline unsigned getDiscriminator()
const;
1679 return ((Discriminator & 0x7) == 0x7) && (Discriminator & 0xFFFFFFF8);
1746 bool IsFSDiscriminator =
false) {
1747 if (IsFSDiscriminator)
1809 unsigned VirtualIndex;
1819 #define HANDLE_DISP_FLAG(ID, NAME) SPFlag##NAME = ID,
1820 #define DISP_FLAG_LARGEST_NEEDED
1821 #include "llvm/IR/DebugInfoFlags.def"
1841 bool IsMainSubprogram =
false);
1848 unsigned ScopeLine,
unsigned VirtualIndex,
int ThisAdjustment,
1856 unsigned VirtualIndex,
int ThisAdjustment,
DIFlags Flags,
1870 static DISubprogram *
1878 bool ShouldCreate =
true);
1880 TempDISubprogram cloneImpl()
const {
1883 getContainingType(), getVirtualIndex(),
1884 getThisAdjustment(),
getFlags(), getSPFlags(),
1886 getRetainedNodes(), getThrownTypes(), getAnnotations(),
1887 getTargetFuncName());
1894 unsigned Line, DISubroutineType *
Type,
unsigned ScopeLine,
1895 DIType *
ContainingType,
unsigned VirtualIndex,
int ThisAdjustment,
1918 TempDISubprogram
clone()
const {
return cloneImpl(); }
1921 TempDISubprogram cloneWithFlags(
DIFlags NewFlags)
const {
1922 auto NewSP =
clone();
1923 NewSP->Flags = NewFlags;
1928 unsigned getLine()
const {
return Line; }
1930 unsigned getVirtualIndex()
const {
return VirtualIndex; }
1931 int getThisAdjustment()
const {
return ThisAdjustment; }
1932 unsigned getScopeLine()
const {
return ScopeLine; }
1933 void setScopeLine(
unsigned L) {
1938 DISPFlags getSPFlags()
const {
return SPFlags; }
1939 bool isLocalToUnit()
const {
return getSPFlags() & SPFlagLocalToUnit; }
1940 bool isDefinition()
const {
return getSPFlags() & SPFlagDefinition; }
1941 bool isOptimized()
const {
return getSPFlags() & SPFlagOptimized; }
1942 bool isMainSubprogram()
const {
return getSPFlags() & SPFlagMainSubprogram; }
1944 bool isArtificial()
const {
return getFlags() & FlagArtificial; }
1945 bool isPrivate()
const {
1948 bool isProtected()
const {
1951 bool isPublic()
const {
1954 bool isExplicit()
const {
return getFlags() & FlagExplicit; }
1955 bool isPrototyped()
const {
return getFlags() & FlagPrototyped; }
1956 bool areAllCallsDescribed()
const {
1957 return getFlags() & FlagAllCallsDescribed;
1959 bool isPure()
const {
return getSPFlags() & SPFlagPure; }
1960 bool isElemental()
const {
return getSPFlags() & SPFlagElemental; }
1961 bool isRecursive()
const {
return getSPFlags() & SPFlagRecursive; }
1962 bool isObjCDirect()
const {
return getSPFlags() & SPFlagObjCDirect; }
1968 bool isDeleted()
const {
return getSPFlags() & SPFlagDeleted; }
1974 bool isLValueReference()
const {
return getFlags() & FlagLValueReference; }
1980 bool isRValueReference()
const {
return getFlags() & FlagRValueReference; }
1985 bool isNoReturn()
const {
return getFlags() & FlagNoReturn; }
1990 bool isThunk()
const {
return getFlags() & FlagThunk; }
1992 DIScope *
getScope()
const {
return cast_or_null<DIScope>(getRawScope()); }
1999 DISubroutineType *
getType()
const {
2000 return cast_or_null<DISubroutineType>(getRawType());
2002 DIType *getContainingType()
const {
2003 return cast_or_null<DIType>(getRawContainingType());
2005 void replaceType(DISubroutineType *Ty) {
2010 DICompileUnit *getUnit()
const {
2011 return cast_or_null<DICompileUnit>(getRawUnit());
2014 DITemplateParameterArray getTemplateParams()
const {
2015 return cast_or_null<MDTuple>(getRawTemplateParams());
2018 return cast_or_null<DISubprogram>(getRawDeclaration());
2020 DINodeArray getRetainedNodes()
const {
2021 return cast_or_null<MDTuple>(getRawRetainedNodes());
2023 DITypeArray getThrownTypes()
const {
2024 return cast_or_null<MDTuple>(getRawThrownTypes());
2026 DINodeArray getAnnotations()
const {
2027 return cast_or_null<MDTuple>(getRawAnnotations());
2029 StringRef getTargetFuncName()
const {
2034 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
2035 MDString *getRawLinkageName()
const {
return getOperandAs<MDString>(3); }
2040 Metadata *getRawContainingType()
const {
2041 return getNumOperands() > 8 ? getOperandAs<Metadata>(8) : nullptr;
2043 Metadata *getRawTemplateParams()
const {
2044 return getNumOperands() > 9 ? getOperandAs<Metadata>(9) : nullptr;
2046 Metadata *getRawThrownTypes()
const {
2047 return getNumOperands() > 10 ? getOperandAs<Metadata>(10) : nullptr;
2049 Metadata *getRawAnnotations()
const {
2050 return getNumOperands() > 11 ? getOperandAs<Metadata>(11) : nullptr;
2052 MDString *getRawTargetFuncName()
const {
2053 return getNumOperands() > 12 ? getOperandAs<MDString>(12) : nullptr;
2056 void replaceRawLinkageName(MDString *
LinkageName) {
2063 bool describes(
const Function *
F)
const;
2098 assert(Column < (1u << 16) &&
"Expected 16-bit column");
2103 DIFile *
File,
unsigned Line,
unsigned Column,
2105 bool ShouldCreate =
true) {
2115 TempDILexicalBlock cloneImpl()
const {
2130 TempDILexicalBlock
clone()
const {
return cloneImpl(); }
2144 unsigned Discriminator;
2149 Discriminator(Discriminator) {}
2155 bool ShouldCreate =
true) {
2164 bool ShouldCreate =
true);
2166 TempDILexicalBlockFile cloneImpl()
const {
2174 unsigned Discriminator),
2180 TempDILexicalBlockFile
clone()
const {
return cloneImpl(); }
2188 unsigned DILocation::getDiscriminator()
const {
2189 if (
auto *
F = dyn_cast<DILexicalBlockFile>(
getScope()))
2190 return F->getDiscriminator();
2201 for (
auto *LBF = dyn_cast<DILexicalBlockFile>(
Scope);
2202 LBF && LBF->getDiscriminator() != 0;
2203 LBF = dyn_cast<DILexicalBlockFile>(
Scope))
2226 unsigned BD,
DF, CI;
2262 unsigned ExportSymbols : 1;
2272 ExportSymbols,
Storage, ShouldCreate);
2278 TempDINamespace cloneImpl()
const {
2291 TempDINamespace
clone()
const {
return cloneImpl(); }
2321 bool ShouldCreate =
true) {
2334 TempDIModule cloneImpl()
const {
2336 getConfigurationMacros(), getIncludePath(),
2337 getAPINotesFile(), getLineNo(), getIsDecl());
2345 bool IsDecl =
false),
2352 bool IsDecl =
false),
2356 TempDIModule
clone()
const {
return cloneImpl(); }
2358 DIScope *
getScope()
const {
return cast_or_null<DIScope>(getRawScope()); }
2363 unsigned getLineNo()
const {
return LineNo; }
2364 bool getIsDecl()
const {
return IsDecl; }
2367 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
2368 MDString *getRawConfigurationMacros()
const {
2369 return getOperandAs<MDString>(3);
2371 MDString *getRawIncludePath()
const {
return getOperandAs<MDString>(4); }
2372 MDString *getRawAPINotesFile()
const {
return getOperandAs<MDString>(5); }
2375 return MD->getMetadataID() == DIModuleKind;
2398 return MD->
getMetadataID() == DITemplateTypeParameterKind ||
2414 bool ShouldCreate =
true) {
2421 bool ShouldCreate =
true);
2423 TempDITemplateTypeParameter cloneImpl()
const {
2435 TempDITemplateTypeParameter
clone()
const {
return cloneImpl(); }
2457 bool ShouldCreate =
true) {
2465 bool ShouldCreate =
true);
2467 TempDITemplateValueParameter cloneImpl()
const {
2482 TempDITemplateValueParameter
clone()
const {
return cloneImpl(); }
2515 if (
auto *
BT = dyn_cast<DIBasicType>(
getType()))
2516 return BT->getSignedness();
2522 return F->getFilename();
2528 return F->getDirectory();
2534 return F->getSource();
2562 std::vector<uint64_t> Elements;
2566 Elements(Elements.
begin(), Elements.
end()) {}
2571 bool ShouldCreate =
true);
2573 TempDIExpression cloneImpl()
const {
2580 TempDIExpression
clone()
const {
return cloneImpl(); }
2587 assert(
I < Elements.
size() &&
"Index out of range");
2759 unsigned &AddrClass);
2773 int64_t Offset = 0);
2825 unsigned SizeInBits);
2851 unsigned ToSize,
bool Signed);
2862 auto Fragment2 = *
Other->getFragmentInfo();
2880 std::pair<DIExpression *, const ConstantInt *>
2886 return std::tie(A.SizeInBits, A.OffsetInBits) ==
2887 std::tie(
B.SizeInBits,
B.OffsetInBits);
2892 return std::tie(A.SizeInBits, A.OffsetInBits) <
2893 std::tie(
B.SizeInBits,
B.OffsetInBits);
2925 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
2931 bool IsLocalToUnit,
bool IsDefinition,
2934 bool ShouldCreate =
true) {
2941 static DIGlobalVariable *
2944 bool IsLocalToUnit,
bool IsDefinition,
2947 bool ShouldCreate =
true);
2949 TempDIGlobalVariable cloneImpl()
const {
2961 unsigned Line, DIType *
Type,
bool IsLocalToUnit,
bool IsDefinition,
2975 TempDIGlobalVariable
clone()
const {
return cloneImpl(); }
3018 bool ShouldCreate =
true);
3020 TempDICommonBlock cloneImpl()
const {
3028 DIFile *
File,
unsigned LineNo),
3035 TempDICommonBlock
clone()
const {
return cloneImpl(); }
3039 return cast_or_null<DIGlobalVariable>(
getRawDecl());
3070 assert(
Arg < (1 << 16) &&
"DILocalVariable: Arg out of range");
3079 bool ShouldCreate =
true) {
3089 bool ShouldCreate =
true);
3091 TempDILocalVariable cloneImpl()
const {
3111 TempDILocalVariable
clone()
const {
return cloneImpl(); }
3160 bool ShouldCreate =
true) {
3166 bool ShouldCreate =
true);
3168 TempDILabel cloneImpl()
const {
3183 TempDILabel
clone()
const {
return cloneImpl(); }
3239 TempDIObjCProperty cloneImpl()
const {
3247 (StringRef
Name, DIFile *
File,
unsigned Line,
3259 TempDIObjCProperty
clone()
const {
return cloneImpl(); }
3271 return F->getFilename();
3277 return F->getDirectory();
3308 bool ShouldCreate =
true) {
3313 static DIImportedEntity *
3318 TempDIImportedEntity cloneImpl()
const {
3320 getFile(), getLine(),
getName(), getElements());
3326 unsigned Line, StringRef
Name =
"",
3327 DINodeArray Elements =
nullptr),
3335 TempDIImportedEntity
clone()
const {
return cloneImpl(); }
3337 unsigned getLine()
const {
return Line; }
3338 DIScope *
getScope()
const {
return cast_or_null<DIScope>(getRawScope()); }
3339 DINode *getEntity()
const {
return cast_or_null<DINode>(getRawEntity()); }
3341 DIFile *getFile()
const {
return cast_or_null<DIFile>(getRawFile()); }
3342 DINodeArray getElements()
const {
3343 return cast_or_null<MDTuple>(getRawElements());
3348 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
3353 return MD->getMetadataID() == DIImportedEntityKind;
3371 TempDIGlobalVariableExpression cloneImpl()
const {
3380 TempDIGlobalVariableExpression
clone()
const {
return cloneImpl(); }
3395 return MD->
getMetadataID() == DIGlobalVariableExpressionKind;
3413 assert(MIType < 1u << 16);
3423 if (
auto *
S = getOperandAs<MDString>(
I))
3424 return S->getString();
3442 case DIMacroFileKind:
3461 bool ShouldCreate =
true) {
3467 bool ShouldCreate =
true);
3469 TempDIMacro cloneImpl()
const {
3476 (
unsigned MIType,
unsigned Line, StringRef
Name,
3477 StringRef
Value =
""),
3484 TempDIMacro
clone()
const {
return cloneImpl(); }
3513 bool ShouldCreate =
true) {
3522 TempDIMacroFile cloneImpl()
const {
3529 (
unsigned MIType,
unsigned Line, DIFile *
File,
3537 TempDIMacroFile
clone()
const {
return cloneImpl(); }
3543 "Lost a macro node during macro node list replacement");
3581 ArrayRef<ValueAsMetadata *>
Args,
3584 TempDIArgList cloneImpl()
const {
3590 void dropAllReferences();
3595 TempDIArgList
clone()
const {
return cloneImpl(); }
3634 : Variable(Var), Fragment(
FragmentInfo), InlinedAt(InlinedAt) {}
3639 Fragment(DIExpr ? DIExpr->getFragmentInfo() :
NoneType()),
3640 InlinedAt(InlinedAt) {}
3647 return Fragment.value_or(DefaultFragment);
3651 return F == DefaultFragment;
3655 return std::tie(Variable, Fragment, InlinedAt) ==
3660 return std::tie(Variable, Fragment, InlinedAt) <
3694 #undef DEFINE_MDNODE_GET_UNPACK_IMPL
3695 #undef DEFINE_MDNODE_GET_UNPACK
3696 #undef DEFINE_MDNODE_GET
3698 #endif // LLVM_IR_DEBUGINFOMETADATA_H