14 #ifndef LLVM_IR_DEBUGINFOMETADATA_H
15 #define LLVM_IR_DEBUGINFOMETADATA_H
30 #include <type_traits>
34 #define DEFINE_MDNODE_GET_UNPACK_IMPL(...) __VA_ARGS__
35 #define DEFINE_MDNODE_GET_UNPACK(ARGS) DEFINE_MDNODE_GET_UNPACK_IMPL ARGS
36 #define DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS) \
37 static CLASS *getDistinct(LLVMContext &Context, \
38 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
39 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Distinct); \
41 static Temp##CLASS getTemporary(LLVMContext &Context, \
42 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
44 getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Temporary)); \
46 #define DEFINE_MDNODE_GET(CLASS, FORMAL, ARGS) \
47 static CLASS *get(LLVMContext &Context, DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
48 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued); \
50 static CLASS *getIfExists(LLVMContext &Context, \
51 DEFINE_MDNODE_GET_UNPACK(FORMAL)) { \
52 return getImpl(Context, DEFINE_MDNODE_GET_UNPACK(ARGS), Uniqued, \
55 DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(CLASS, FORMAL, ARGS)
59 template <
typename T>
class Optional;
77 assert((!MD || isa<T>(MD)) &&
"Expected valid type ref");
83 typename std::enable_if<std::is_convertible<U *, T *>::value>::type * =
89 T *
resolve()
const {
return const_cast<T *
>(cast_or_null<T>(MD)); }
106 explicit operator bool()
const {
return get(); }
107 explicit operator MDTuple *()
const {
return get(); }
117 class iterator : std::iterator<std::input_iterator_tag, DITypeRef,
118 std::ptrdiff_t, void, DITypeRef> {
159 :
MDNode(C, ID, Storage, Ops1, Ops2) {
170 if (
auto *S = getOperandAs<MDString>(I))
171 return S->getString();
192 #define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = ID,
193 #define DI_FLAG_LARGEST_NEEDED
194 #include "llvm/IR/DebugInfoFlags.def"
197 FlagVirtualInheritance,
215 case GenericDINodeKind:
217 case DIEnumeratorKind:
218 case DIBasicTypeKind:
219 case DIDerivedTypeKind:
220 case DICompositeTypeKind:
221 case DISubroutineTypeKind:
223 case DICompileUnitKind:
224 case DISubprogramKind:
225 case DILexicalBlockKind:
226 case DILexicalBlockFileKind:
227 case DINamespaceKind:
228 case DITemplateTypeParameterKind:
229 case DITemplateValueParameterKind:
230 case DIGlobalVariableKind:
231 case DILocalVariableKind:
232 case DIObjCPropertyKind:
233 case DIImportedEntityKind:
264 :
DINode(C, GenericDINodeKind, Storage, Tag, Ops1, Ops2) {
270 void recalculateHash();
276 DwarfOps, Storage, ShouldCreate);
279 static GenericDINode *
getImpl(LLVMContext &Context,
unsigned Tag,
280 MDString *Header, ArrayRef<Metadata *> DwarfOps,
283 TempGenericDINode cloneImpl()
const {
294 (Tag, Header, DwarfOps))
297 (Tag, Header, DwarfOps))
300 TempGenericDINode
clone()
const {
return cloneImpl(); }
338 :
DINode(C, DISubrangeKind, Storage, dwarf::DW_TAG_subrange_type,
None),
339 Count(Count), LowerBound(LowerBound) {}
344 bool ShouldCreate =
true);
346 TempDISubrange cloneImpl()
const {
354 TempDISubrange
clone()
const {
return cloneImpl(); }
376 :
DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops),
382 bool ShouldCreate =
true) {
386 static DIEnumerator *
getImpl(LLVMContext &Context, int64_t Value,
388 bool ShouldCreate =
true);
390 TempDIEnumerator cloneImpl()
const {
400 TempDIEnumerator
clone()
const {
return cloneImpl(); }
422 :
DINode(C, ID, Storage, Tag, Ops) {}
441 return isa<DIFile>(
this) ? const_cast<DIScope *>(
this)
449 case DIBasicTypeKind:
450 case DIDerivedTypeKind:
451 case DICompositeTypeKind:
452 case DISubroutineTypeKind:
454 case DICompileUnitKind:
455 case DISubprogramKind:
456 case DILexicalBlockKind:
457 case DILexicalBlockFileKind:
458 case DINamespaceKind:
486 :
DIScope(C, DIFileKind, Storage, dwarf::DW_TAG_file_type, Ops),
497 static DIFile *
getImpl(LLVMContext &Context, MDString *Filename,
501 TempDIFile cloneImpl()
const {
509 StringRef CS = StringRef()),
510 (Filename, Directory, CSK, CS))
514 (Filename, Directory, CSK, CS))
516 TempDIFile
clone()
const {
return cloneImpl(); }
522 StringRef getChecksumKindAsString()
const;
537 return F->getFilename();
543 return F->getDirectory();
556 uint64_t OffsetInBits;
561 unsigned Line, uint64_t SizeInBits,
uint32_t AlignInBits,
563 :
DIScope(C, ID, Storage, Tag, Ops) {
564 init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
569 uint64_t OffsetInBits,
DIFlags Flags) {
572 this->SizeInBits = SizeInBits;
573 this->AlignInBits = AlignInBits;
574 this->OffsetInBits = OffsetInBits;
578 void mutate(
unsigned Tag,
unsigned Line, uint64_t SizeInBits,
582 init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
625 return getFlags() & FlagObjcClassComplete;
638 case DIBasicTypeKind:
639 case DIDerivedTypeKind:
640 case DICompositeTypeKind:
641 case DISubroutineTypeKind:
660 :
DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
662 Encoding(Encoding) {}
670 SizeInBits, AlignInBits, Encoding, Storage, ShouldCreate);
672 static DIBasicType *
getImpl(LLVMContext &Context,
unsigned Tag,
673 MDString *Name, uint64_t SizeInBits,
674 uint32_t AlignInBits,
unsigned Encoding,
677 TempDIBasicType cloneImpl()
const {
684 (Tag, Name, 0, 0, 0))
687 uint32_t AlignInBits,
unsigned Encoding),
688 (Tag, Name, SizeInBits, AlignInBits, Encoding))
690 (
unsigned Tag,
MDString *Name, uint64_t SizeInBits,
691 uint32_t AlignInBits,
unsigned Encoding),
692 (Tag, Name, SizeInBits, AlignInBits, Encoding))
694 TempDIBasicType
clone()
const {
return cloneImpl(); }
714 unsigned Line, uint64_t SizeInBits,
uint32_t AlignInBits,
716 :
DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
717 AlignInBits, OffsetInBits, Flags, Ops) {}
723 uint64_t SizeInBits,
uint32_t AlignInBits,
726 bool ShouldCreate =
true) {
728 Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
729 Flags, ExtraData, Storage, ShouldCreate);
731 static DIDerivedType *
getImpl(LLVMContext &Context,
unsigned Tag,
732 MDString *Name,
Metadata *File,
unsigned Line,
734 uint64_t SizeInBits,
uint32_t AlignInBits,
735 uint64_t OffsetInBits,
DIFlags Flags,
737 bool ShouldCreate =
true);
739 TempDIDerivedType cloneImpl()
const {
748 (
unsigned Tag, MDString *Name,
Metadata *File,
750 uint64_t SizeInBits,
uint32_t AlignInBits,
751 uint64_t OffsetInBits,
DIFlags Flags,
753 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
754 AlignInBits, OffsetInBits, Flags, ExtraData))
758 uint32_t AlignInBits, uint64_t OffsetInBits,
760 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
761 AlignInBits, OffsetInBits, Flags, ExtraData))
763 TempDIDerivedType
clone()
const {
return cloneImpl(); }
776 Metadata *getExtraData()
const {
return getRawExtraData(); }
785 DIObjCProperty *getObjCProperty()
const {
786 return dyn_cast_or_null<DIObjCProperty>(getExtraData());
788 Constant *getStorageOffsetInBits()
const {
790 if (
auto *
C = cast_or_null<ConstantAsMetadata>(getExtraData()))
791 return C->getValue();
796 if (
auto *
C = cast_or_null<ConstantAsMetadata>(getExtraData()))
797 return C->getValue();
803 return MD->getMetadataID() == DIDerivedTypeKind;
815 unsigned RuntimeLang;
818 unsigned Line,
unsigned RuntimeLang, uint64_t SizeInBits,
821 :
DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits,
822 AlignInBits, OffsetInBits, Flags, Ops),
823 RuntimeLang(RuntimeLang) {}
827 void mutate(
unsigned Tag,
unsigned Line,
unsigned RuntimeLang,
828 uint64_t SizeInBits,
uint32_t AlignInBits,
829 uint64_t OffsetInBits,
DIFlags Flags) {
832 this->RuntimeLang = RuntimeLang;
833 DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
836 static DICompositeType *
837 getImpl(LLVMContext &Context,
unsigned Tag, StringRef Name,
Metadata *File,
839 uint64_t SizeInBits,
uint32_t AlignInBits, uint64_t OffsetInBits,
845 BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements.get(),
849 static DICompositeType *
850 getImpl(LLVMContext &Context,
unsigned Tag, MDString *Name,
Metadata *File,
852 uint64_t SizeInBits,
uint32_t AlignInBits, uint64_t OffsetInBits,
855 MDString *Identifier,
StorageType Storage,
bool ShouldCreate =
true);
857 TempDICompositeType cloneImpl()
const {
867 (
unsigned Tag, StringRef Name, DIFile *File,
unsigned Line,
869 uint32_t AlignInBits, uint64_t OffsetInBits,
870 DIFlags Flags, DINodeArray Elements,
unsigned RuntimeLang,
872 DITemplateParameterArray TemplateParams =
nullptr,
873 StringRef Identifier =
""),
874 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
875 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
876 VTableHolder, TemplateParams, Identifier))
880 uint64_t SizeInBits,
uint32_t AlignInBits,
882 unsigned RuntimeLang,
Metadata *VTableHolder,
885 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
886 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
887 VTableHolder, TemplateParams, Identifier))
889 TempDICompositeType
clone()
const {
return cloneImpl(); }
903 unsigned RuntimeLang,
Metadata *VTableHolder,
922 unsigned RuntimeLang,
Metadata *VTableHolder,
952 "Lost a member during member list replacement");
982 :
DIType(C, DISubroutineTypeKind, Storage, dwarf::DW_TAG_subroutine_type,
983 0, 0, 0, 0, Flags, Ops),
990 bool ShouldCreate =
true) {
993 static DISubroutineType *
getImpl(LLVMContext &Context,
DIFlags Flags,
996 bool ShouldCreate =
true);
998 TempDISubroutineType cloneImpl()
const {
1004 (
DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray),
1005 (Flags, CC, TypeArray))
1008 (Flags, CC, TypeArray))
1010 TempDISubroutineType
clone()
const {
return cloneImpl(); }
1043 unsigned RuntimeVersion;
1046 bool SplitDebugInlining;
1049 bool IsOptimized,
unsigned RuntimeVersion,
1050 unsigned EmissionKind, uint64_t DWOId,
bool SplitDebugInlining,
1052 :
DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
1053 SourceLanguage(SourceLanguage), IsOptimized(IsOptimized),
1054 RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind),
1055 DWOId(DWOId), SplitDebugInlining(SplitDebugInlining) {
1058 ~DICompileUnit() =
default;
1060 static DICompileUnit *
1062 StringRef
Producer,
bool IsOptimized, StringRef Flags,
1068 uint64_t DWOId,
bool SplitDebugInlining,
StorageType Storage,
1069 bool ShouldCreate =
true) {
1070 return getImpl(Context, SourceLanguage, File,
1074 EmissionKind, EnumTypes.get(), RetainedTypes.get(),
1075 GlobalVariables.get(), ImportedEntities.get(), Macros.get(),
1076 DWOId, SplitDebugInlining,
Storage, ShouldCreate);
1078 static DICompileUnit *
1079 getImpl(LLVMContext &Context,
unsigned SourceLanguage,
Metadata *File,
1080 MDString *Producer,
bool IsOptimized, MDString *Flags,
1081 unsigned RuntimeVersion, MDString *SplitDebugFilename,
1084 Metadata *Macros, uint64_t DWOId,
bool SplitDebugInlining,
1087 TempDICompileUnit cloneImpl()
const {
1097 static void get() =
delete;
1102 (
unsigned SourceLanguage, DIFile *File, StringRef Producer,
1103 bool IsOptimized, StringRef Flags,
unsigned RuntimeVersion,
1105 DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
1106 DIGlobalVariableExpressionArray GlobalVariables,
1107 DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
1108 uint64_t DWOId,
bool SplitDebugInlining),
1109 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
1110 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
1111 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining))
1115 bool IsOptimized,
MDString *Flags,
unsigned RuntimeVersion,
1119 bool SplitDebugInlining),
1120 (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
1121 SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
1122 GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining))
1124 TempDICompileUnit
clone()
const {
return cloneImpl(); }
1154 this->SplitDebugInlining = SplitDebugInlining;
1160 return getOperandAs<MDString>(3);
1203 :
DIScope(C, ID, Storage, Tag, Ops) {}
1240 bool ShouldCreate =
true);
1244 bool ShouldCreate =
true) {
1245 return getImpl(Context, Line, Column, static_cast<Metadata *>(Scope),
1246 static_cast<Metadata *>(InlinedAt), Storage, ShouldCreate);
1249 TempDILocation cloneImpl()
const {
1261 (
unsigned Line,
unsigned Column,
Metadata *Scope,
1263 (Line, Column, Scope, InlinedAt))
1266 DILocation *InlinedAt =
nullptr),
1267 (Line, Column, Scope, InlinedAt))
1270 TempDILocation
clone()
const {
return cloneImpl(); }
1274 DILocalScope *getScope()
const {
return cast<DILocalScope>(
getRawScope()); }
1275 DILocation *getInlinedAt()
const {
1279 DIFile *getFile()
const {
return getScope()->getFile(); }
1280 StringRef getFilename()
const {
return getScope()->getFilename(); }
1281 StringRef getDirectory()
const {
return getScope()->getDirectory(); }
1287 DILocalScope *getInlinedAtScope()
const {
1288 if (
auto *IA = getInlinedAt())
1289 return IA->getInlinedAtScope();
1298 bool canDiscriminate(
const DILocation &RHS)
const {
1299 return getLine() != RHS.getLine() ||
1300 getColumn() != RHS.getColumn() ||
1301 getDiscriminator() != RHS.getDiscriminator() ||
1302 getFilename() != RHS.getFilename() ||
1303 getDirectory() != RHS.getDirectory();
1310 inline unsigned getDiscriminator()
const;
1331 if (LocA && LocB && (LocA == LocB || !LocA->canDiscriminate(*LocB)))
1358 unsigned VirtualIndex;
1367 unsigned Virtuality : 2;
1373 unsigned IsLocalToUnit : 1;
1374 unsigned IsDefinition : 1;
1375 unsigned IsOptimized : 1;
1377 unsigned Padding : 3;
1382 unsigned ScopeLine,
unsigned Virtuality,
unsigned VirtualIndex,
1383 int ThisAdjustment,
DIFlags Flags,
bool IsLocalToUnit,
1385 :
DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram,
1387 Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
1388 ThisAdjustment(ThisAdjustment), Virtuality(Virtuality),
1389 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition),
1390 IsOptimized(IsOptimized), Flags(Flags) {
1392 assert(Virtuality < 4 &&
"Virtuality out of range");
1401 unsigned VirtualIndex,
int ThisAdjustment,
DIFlags Flags,
1405 bool ShouldCreate =
true) {
1408 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType,
1409 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1413 static DISubprogram *
1416 bool IsLocalToUnit,
bool IsDefinition,
unsigned ScopeLine,
1417 Metadata *ContainingType,
unsigned Virtuality,
unsigned VirtualIndex,
1422 TempDISubprogram cloneImpl()
const {
1425 getLine(),
getType(), isLocalToUnit(), isDefinition(), getScopeLine(),
1427 getThisAdjustment(), getFlags(), isOptimized(), getUnit(),
1433 (
DIScopeRef Scope, StringRef Name, StringRef LinkageName,
1434 DIFile *File,
unsigned Line, DISubroutineType *Type,
1435 bool IsLocalToUnit,
bool IsDefinition,
unsigned ScopeLine,
1436 DITypeRef ContainingType,
unsigned Virtuality,
1437 unsigned VirtualIndex,
int ThisAdjustment,
DIFlags Flags,
1438 bool IsOptimized, DICompileUnit *Unit,
1439 DITemplateParameterArray TemplateParams =
nullptr,
1440 DISubprogram *Declaration =
nullptr,
1441 DILocalVariableArray Variables =
nullptr),
1442 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
1443 IsDefinition, ScopeLine, ContainingType, Virtuality,
1444 VirtualIndex, ThisAdjustment, Flags, IsOptimized, Unit,
1445 TemplateParams, Declaration, Variables))
1449 unsigned Line,
Metadata *Type,
bool IsLocalToUnit,
bool IsDefinition,
1450 unsigned ScopeLine,
Metadata *ContainingType,
unsigned Virtuality,
1451 unsigned VirtualIndex,
int ThisAdjustment,
DIFlags Flags,
1454 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
1455 ScopeLine, ContainingType, Virtuality, VirtualIndex, ThisAdjustment,
1456 Flags, IsOptimized, Unit, TemplateParams, Declaration, Variables))
1458 TempDISubprogram
clone()
const {
return cloneImpl(); }
1461 unsigned getLine()
const {
return Line; }
1463 unsigned getVirtualIndex()
const {
return VirtualIndex; }
1464 int getThisAdjustment()
const {
return ThisAdjustment; }
1465 unsigned getScopeLine()
const {
return ScopeLine; }
1467 bool isLocalToUnit()
const {
return IsLocalToUnit; }
1468 bool isDefinition()
const {
return IsDefinition; }
1469 bool isOptimized()
const {
return IsOptimized; }
1471 bool isArtificial()
const {
return getFlags() & FlagArtificial; }
1472 bool isPrivate()
const {
1475 bool isProtected()
const {
1478 bool isPublic()
const {
1481 bool isExplicit()
const {
return getFlags() & FlagExplicit; }
1482 bool isPrototyped()
const {
return getFlags() & FlagPrototyped; }
1483 bool isMainSubprogram()
const {
return getFlags() & FlagMainSubprogram; }
1489 bool isLValueReference()
const {
return getFlags() & FlagLValueReference; }
1495 bool isRValueReference()
const {
return getFlags() & FlagRValueReference; }
1500 bool isNoReturn()
const {
return getFlags() & FlagNoReturn; }
1508 MDString *getRawName()
const {
return getOperandAs<MDString>(2); }
1509 MDString *getRawLinkageName()
const {
return getOperandAs<MDString>(4); }
1511 DISubroutineType *
getType()
const {
1512 return cast_or_null<DISubroutineType>(getRawType());
1515 return DITypeRef(getRawContainingType());
1518 DICompileUnit *getUnit()
const {
1519 return cast_or_null<DICompileUnit>(getRawUnit());
1521 void replaceUnit(DICompileUnit *CU) {
1524 DITemplateParameterArray getTemplateParams()
const {
1525 return cast_or_null<MDTuple>(getRawTemplateParams());
1528 return cast_or_null<DISubprogram>(getRawDeclaration());
1530 DILocalVariableArray getVariables()
const {
1531 return cast_or_null<MDTuple>(getRawVariables());
1545 bool describes(
const Function *
F)
const;
1556 :
DILocalScope(C, ID, Storage, dwarf::DW_TAG_lexical_block, Ops) {}
1581 assert(Column < (1u << 16) &&
"Expected 16-bit column");
1586 DIFile *File,
unsigned Line,
unsigned Column,
1588 bool ShouldCreate =
true) {
1589 return getImpl(Context, static_cast<Metadata *>(Scope),
1590 static_cast<Metadata *>(File), Line, Column, Storage,
1595 Metadata *File,
unsigned Line,
unsigned Column,
1598 TempDILexicalBlock cloneImpl()
const {
1605 unsigned Line,
unsigned Column),
1606 (Scope, File, Line, Column))
1608 unsigned Line,
unsigned Column),
1609 (Scope, File, Line, Column))
1611 TempDILexicalBlock
clone()
const {
return cloneImpl(); }
1625 unsigned Discriminator;
1630 Discriminator(Discriminator) {}
1634 DIFile *File,
unsigned Discriminator,
1636 bool ShouldCreate =
true) {
1637 return getImpl(Context, static_cast<Metadata *>(Scope),
1638 static_cast<Metadata *>(File), Discriminator, Storage,
1642 static DILexicalBlockFile *
getImpl(LLVMContext &Context,
Metadata *Scope,
1643 Metadata *File,
unsigned Discriminator,
1645 bool ShouldCreate =
true);
1647 TempDILexicalBlockFile cloneImpl()
const {
1654 unsigned Discriminator),
1655 (Scope, File, Discriminator))
1658 (Scope, File, Discriminator))
1660 TempDILexicalBlockFile
clone()
const {
return cloneImpl(); }
1663 unsigned getLine()
const =
delete;
1673 unsigned DILocation::getDiscriminator()
const {
1674 if (
auto *
F = dyn_cast<DILexicalBlockFile>(getScope()))
1675 return F->getDiscriminator();
1685 for (
auto *LBF = dyn_cast<DILexicalBlockFile>(Scope);
1686 LBF && LBF->getDiscriminator() != 0;
1700 unsigned ExportSymbols : 1;
1704 :
DIScope(Context, DINamespaceKind, Storage, dwarf::DW_TAG_namespace,
1706 Line(Line), ExportSymbols(ExportSymbols) {}
1712 bool ShouldCreate =
true) {
1714 Line, ExportSymbols, Storage, ShouldCreate);
1717 Metadata *File, MDString *Name,
unsigned Line,
1719 bool ShouldCreate =
true);
1721 TempDINamespace cloneImpl()
const {
1728 unsigned Line,
bool ExportSymbols),
1729 (Scope, File, Name, Line, ExportSymbols))
1732 unsigned Line,
bool ExportSymbols),
1733 (Scope, File, Name, Line, ExportSymbols))
1735 TempDINamespace
clone()
const {
return cloneImpl(); }
1757 :
DIScope(Context, DIModuleKind, Storage, dwarf::DW_TAG_module, Ops) {}
1768 Storage, ShouldCreate);
1771 MDString *Name, MDString *ConfigurationMacros,
1772 MDString *IncludePath, MDString *ISysRoot,
1775 TempDIModule cloneImpl()
const {
1783 StringRef ConfigurationMacros, StringRef IncludePath,
1784 StringRef ISysRoot),
1785 (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot))
1789 (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot))
1791 TempDIModule
clone()
const {
return cloneImpl(); }
1815 :
DINode(Context, ID, Storage, Tag, Ops) {}
1826 return MD->
getMetadataID() == DITemplateTypeParameterKind ||
1838 dwarf::DW_TAG_template_type_parameter, Ops) {}
1843 bool ShouldCreate =
true) {
1847 static DITemplateTypeParameter *
getImpl(LLVMContext &Context, MDString *Name,
1849 bool ShouldCreate =
true);
1851 TempDITemplateTypeParameter cloneImpl()
const {
1861 TempDITemplateTypeParameter
clone()
const {
return cloneImpl(); }
1881 bool ShouldCreate =
true) {
1883 Value, Storage, ShouldCreate);
1885 static DITemplateValueParameter *
getImpl(LLVMContext &Context,
unsigned Tag,
1888 bool ShouldCreate =
true);
1890 TempDITemplateValueParameter cloneImpl()
const {
1898 (Tag, Name, Type, Value))
1901 (Tag, Name, Type, Value))
1903 TempDITemplateValueParameter
clone()
const {
return cloneImpl(); }
1920 :
DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line),
1921 AlignInBits(AlignInBits) {}
1935 return F->getFilename();
1940 return F->getDirectory();
1971 std::vector<uint64_t> Elements;
1974 :
MDNode(C, DIExpressionKind, Storage,
None),
1975 Elements(Elements.
begin(), Elements.
end()) {}
1980 bool ShouldCreate =
true);
1982 TempDIExpression cloneImpl()
const {
1989 TempDIExpression
clone()
const {
return cloneImpl(); }
1995 assert(I < Elements.
size() &&
"Index out of range");
2011 const uint64_t *Op =
nullptr;
2017 const uint64_t *
get()
const {
return Op; }
2025 uint64_t
getArg(
unsigned I)
const {
return Op[I + 1]; }
2037 :
public std::iterator<std::input_iterator_tag, ExprOperand> {
2133 bool IsLocalToUnit,
bool IsDefinition,
uint32_t AlignInBits,
2135 :
DIVariable(C, DIGlobalVariableKind, Storage, Line, Ops, AlignInBits),
2136 IsLocalToUnit(IsLocalToUnit), IsDefinition(IsDefinition) {}
2142 bool IsLocalToUnit,
bool IsDefinition,
2145 bool ShouldCreate =
true) {
2148 IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration,
2149 AlignInBits, Storage, ShouldCreate);
2151 static DIGlobalVariable *
2154 bool IsLocalToUnit,
bool IsDefinition,
2158 TempDIGlobalVariable cloneImpl()
const {
2167 (DIScope * Scope, StringRef Name, StringRef LinkageName,
2168 DIFile *File,
unsigned Line,
DITypeRef Type,
2169 bool IsLocalToUnit,
bool IsDefinition,
2170 DIDerivedType *StaticDataMemberDeclaration,
2172 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
2173 IsDefinition, StaticDataMemberDeclaration, AlignInBits))
2177 bool IsLocalToUnit,
bool IsDefinition,
2178 Metadata *StaticDataMemberDeclaration,
2180 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
2181 IsDefinition, StaticDataMemberDeclaration, AlignInBits))
2183 TempDIGlobalVariable
clone()
const {
return cloneImpl(); }
2214 :
DIVariable(C, DILocalVariableKind, Storage, Line, Ops, AlignInBits),
2215 Arg(Arg), Flags(Flags) {
2216 assert(Arg < (1 << 16) &&
"DILocalVariable: Arg out of range");
2224 bool ShouldCreate =
true) {
2226 Line, Type, Arg, Flags, AlignInBits, Storage, ShouldCreate);
2228 static DILocalVariable *
getImpl(LLVMContext &Context,
Metadata *Scope,
2229 MDString *Name,
Metadata *File,
unsigned Line,
2232 bool ShouldCreate =
true);
2234 TempDILocalVariable cloneImpl()
const {
2242 (DILocalScope * Scope, StringRef Name, DIFile *File,
2243 unsigned Line,
DITypeRef Type,
unsigned Arg,
2245 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits))
2248 unsigned Line,
Metadata *Type,
unsigned Arg,
2250 (Scope, Name, File, Line, Type, Arg, Flags, AlignInBits))
2252 TempDILocalVariable
clone()
const {
return cloneImpl(); }
2287 unsigned Attributes;
2291 :
DINode(C, DIObjCPropertyKind, Storage, dwarf::DW_TAG_APPLE_property,
2293 Line(Line), Attributes(Attributes) {}
2303 Storage, ShouldCreate);
2305 static DIObjCProperty *
getImpl(LLVMContext &Context, MDString *Name,
2307 MDString *GetterName, MDString *SetterName,
2308 unsigned Attributes,
Metadata *Type,
2311 TempDIObjCProperty cloneImpl()
const {
2319 (StringRef Name, DIFile *File,
unsigned Line,
2320 StringRef GetterName, StringRef SetterName,
2322 (Name, File, Line, GetterName, SetterName, Attributes,
2327 unsigned Attributes,
Metadata *Type),
2328 (Name, File, Line, GetterName, SetterName, Attributes,
2331 TempDIObjCProperty
clone()
const {
return cloneImpl(); }
2343 return F->getFilename();
2348 return F->getDirectory();
2372 :
DINode(C, DIImportedEntityKind, Storage, Tag, Ops), Line(Line) {}
2379 bool ShouldCreate =
true) {
2380 return getImpl(Context, Tag, Scope, Entity, Line,
2383 static DIImportedEntity *
getImpl(LLVMContext &Context,
unsigned Tag,
2385 unsigned Line, MDString *Name,
2387 bool ShouldCreate =
true);
2389 TempDIImportedEntity cloneImpl()
const {
2396 (
unsigned Tag, DIScope *Scope,
DINodeRef Entity,
2397 unsigned Line, StringRef Name =
""),
2398 (Tag, Scope, Entity, Line, Name))
2402 (Tag, Scope, Entity, Line, Name))
2404 TempDIImportedEntity
clone()
const {
return cloneImpl(); }
2427 :
MDNode(C, DIGlobalVariableExpressionKind, Storage, Ops) {}
2434 TempDIGlobalVariableExpression cloneImpl()
const {
2441 (Variable, Expression))
2443 TempDIGlobalVariableExpression
clone()
const {
return cloneImpl(); }
2455 return MD->
getMetadataID() == DIGlobalVariableExpressionKind;
2471 :
MDNode(C, ID, Storage, Ops1, Ops2) {
2472 assert(MIType < 1u << 16);
2482 if (
auto *S = getOperandAs<MDString>(I))
2483 return S->getString();
2501 case DIMacroFileKind:
2515 :
DIMacroNode(C, DIMacroKind, Storage, MIType, Ops), Line(Line) {}
2520 bool ShouldCreate =
true) {
2524 static DIMacro *
getImpl(LLVMContext &Context,
unsigned MIType,
unsigned Line,
2525 MDString *Name, MDString *Value,
StorageType Storage,
2526 bool ShouldCreate =
true);
2528 TempDIMacro cloneImpl()
const {
2535 StringRef Value =
""),
2536 (MIType, Line, Name, Value))
2539 (MIType, Line, Name, Value))
2541 TempDIMacro
clone()
const {
return cloneImpl(); }
2564 :
DIMacroNode(C, DIMacroFileKind, Storage, MIType, Ops), Line(Line) {}
2568 unsigned Line,
DIFile *File,
2570 bool ShouldCreate =
true) {
2571 return getImpl(Context, MIType, Line, static_cast<Metadata *>(File),
2572 Elements.get(),
Storage, ShouldCreate);
2575 static DIMacroFile *
getImpl(LLVMContext &Context,
unsigned MIType,
2579 TempDIMacroFile cloneImpl()
const {
2586 DIMacroNodeArray Elements),
2587 (MIType, Line, File, Elements))
2590 (MIType, Line, File, Elements))
2592 TempDIMacroFile
clone()
const {
return cloneImpl(); }
2598 "Lost a macro node during macro node list replacement");
2620 #undef DEFINE_MDNODE_GET_UNPACK_IMPL
2621 #undef DEFINE_MDNODE_GET_UNPACK
2622 #undef DEFINE_MDNODE_GET
2624 #endif // LLVM_IR_DEBUGINFOMETADATA_H
MDString * getRawGetterName() const
Metadata * getRawScope() const
StringRef getName() const
unsigned getNumDwarfOperands() const
static bool classof(const Metadata *MD)
Metadata MDString MDString * ConfigurationMacros
const_iterator end(StringRef path)
Get end iterator over path.
Tracking metadata reference owned by Metadata.
MDString * getRawIncludePath() const
#define LLVM_MARK_AS_BITMASK_ENUM(LargestValue)
LLVM_MARK_AS_BITMASK_ENUM lets you opt in an individual enum type so you can perform bitwise operatio...
ArrayRef< uint64_t >::iterator element_iterator
StringRef getName() const
Metadata * getRawTemplateParams() const
StringRef getIdentifier() const
DEFINE_MDNODE_GET(DIModule,(DIScope *Scope, StringRef Name, StringRef ConfigurationMacros, StringRef IncludePath, StringRef ISysRoot),(Scope, Name, ConfigurationMacros, IncludePath, ISysRoot)) DEFINE_MDNODE_GET(DIModule
DILocalScope * getScope() const
unsigned MDString Metadata Metadata Value TempDITemplateValueParameter clone() const
unsigned getColumn() const =delete
bool isArtificial() const
unsigned Metadata Metadata * Entity
StringRef getName() const
DEFINE_MDNODE_GET(DIFile,(StringRef Filename, StringRef Directory, ChecksumKind CSK=CSK_None, StringRef CS=StringRef()),(Filename, Directory, CSK, CS)) DEFINE_MDNODE_GET(DIFile
DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2=None)
MDString Metadata unsigned MDString MDString unsigned Metadata Type TempDIObjCProperty clone() const
static DICompositeType * getODRTypeIfExists(LLVMContext &Context, MDString &Identifier)
MDString MDString * Directory
iterator_range< op_iterator > op_range
DITypeRef getType() const
uint32_t getAlignInBits() const
StringRef getFlags() const
void replaceTemplateParams(DITemplateParameterArray TemplateParams)
void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDString * get(LLVMContext &Context, StringRef Str)
uint64_t getElement(unsigned I) const
DILocalScope * getScope() const
Get the local scope for this variable.
MDString * getRawName() const
unsigned getNumOperands() const
Return number of MDNode operands.
bool isRValueReference() const
static bool classof(const Metadata *MD)
Metadata * getRawFile() const
Return the raw underlying file.
DIMacroNodeArray getElements() const
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned Metadata Metadata MDString * Identifier
TypedDINodeRef(std::nullptr_t)
DEFINE_MDNODE_GET(DITemplateTypeParameter,(StringRef Name, DITypeRef Type),(Name, Type)) DEFINE_MDNODE_GET(DITemplateTypeParameter
static bool classof(const Metadata *MD)
Metadata * getRawType() const
void setSplitDebugInlining(bool SplitDebugInlining)
StringRef getDirectory() const
DEFINE_MDNODE_GET(DICompositeType,(unsigned Tag, StringRef Name, DIFile *File, unsigned Line, DIScopeRef Scope, DITypeRef BaseType, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, DINodeArray Elements, unsigned RuntimeLang, DITypeRef VTableHolder, DITemplateParameterArray TemplateParams=nullptr, StringRef Identifier=""),(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams, Identifier)) DEFINE_MDNODE_GET(DICompositeType
DITemplateParameter(LLVMContext &Context, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
const_iterator begin(StringRef path)
Get begin iterator over path.
~DILexicalBlockBase()=default
op_iterator op_begin() const
bool getSplitDebugInlining() const
DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata uint32_t AlignInBits TempDIGlobalVariable clone() const
static bool classof(const Metadata *MD)
StringRef getName() const
DITypeRef getBaseType() const
static bool classof(const Metadata *MD)
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata * StaticDataMemberDeclaration
static bool classof(const Metadata *MD)
static bool classof(const Metadata *MD)
DIScope * getScope() const
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=None)
Return the function type for an intrinsic.
static bool classof(const Metadata *MD)
static bool classof(const Metadata *MD)
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned Metadata Metadata * TemplateParams
unsigned getVirtuality(StringRef VirtualityString)
Metadata * getRawScope() const
op_iterator op_end() const
unsigned getColumn() const
Tagged DWARF-like metadata node.
void replaceRetainedTypes(DITypeArray N)
uint64_t getDWOId() const
MDString * getRawName() const
DebugEmissionKind getEmissionKind() const
Metadata * getRawType() const
DEFINE_MDNODE_GET(DISubrange,(int64_t Count, int64_t LowerBound=0),(Count, LowerBound)) TempDISubrange clone() const
MDString * getRawName() const
DEFINE_MDNODE_GET(DITemplateValueParameter,(unsigned Tag, StringRef Name, DITypeRef Type, Metadata *Value),(Tag, Name, Type, Value)) DEFINE_MDNODE_GET(DITemplateValueParameter
DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, ArrayRef< Metadata * > Ops)
MDString * getRawDirectory() const
static bool classof(const Metadata *MD)
DIMacroNode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned MIType, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2=None)
bool isObjectPointer() const
MDString * getRawHeader() const
DIScope * getScope() const
unsigned StringRef DIFile unsigned DIScopeRef DITypeRef uint64_t uint32_t uint64_t OffsetInBits
StringRef getName() const
DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
DEFINE_MDNODE_GET(DILexicalBlock,(DILocalScope *Scope, DIFile *File, unsigned Line, unsigned Column),(Scope, File, Line, Column)) DEFINE_MDNODE_GET(DILexicalBlock
TypedDINodeRef(const TypedDINodeRef< U > &X, typename std::enable_if< std::is_convertible< U *, T * >::value >::type *=nullptr)
struct fuzzer::@269 Flags
unsigned Metadata Metadata unsigned MDString Name TempDIImportedEntity clone() const
unsigned StringRef DIFile unsigned Line
static bool classof(const Metadata *MD)
unsigned StringRef uint64_t uint32_t AlignInBits
static bool classof(const Metadata *MD)
MDString * getRawName() const
unsigned Metadata MDString * Producer
MDString * getRawConfigurationMacros() const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
static bool classof(const Metadata *MD)
Metadata * getRawRetainedTypes() const
DINodeArray getElements() const
StringRef getName() const
iterator(MDNode::op_iterator I)
DILocation * cloneWithDiscriminator(unsigned Discriminator) const
Returns a new DILocation with updated Discriminator.
uint32_t getAlignInBytes() const
unsigned Metadata MDString bool MDString unsigned MDString * SplitDebugFilename
MDString * getRawFlags() const
static const char * EmissionKindString(DebugEmissionKind EK)
bool operator==(const TypedDINodeRef< T > &X) const
TypedDINodeRef< DINode > DINodeRef
static const DILocation * getMergedLocation(const DILocation *LocA, const DILocation *LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
StringRef getFilename() const
bool isAppleBlockExtension() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata * GlobalVariables
unsigned getMacinfoType() const
Holds a subclass of DINode.
~DITemplateParameter()=default
bool getExportSymbols() const
StringRef getName() const
DITypeRefArray getTypeArray() const
Metadata * getRawFile() const
Metadata * getRawStaticDataMemberDeclaration() const
TypedDINodeRef(const T *MD)
bool isExternalTypeRef() const
unsigned StringRef DIFile unsigned DIScopeRef DITypeRef BaseType
Holds the characteristics of one fragment of a larger variable.
DIFlags uint8_t Metadata TypeArray TempDISubroutineType clone() const
unsigned StringRef DIFile * File
unsigned MDString ArrayRef< Metadata * > DwarfOps
expr_op_iterator expr_op_begin() const
Visit the elements via ExprOperand wrappers.
DEFINE_MDNODE_GET(DIEnumerator,(int64_t Value, StringRef Name),(Value, Name)) DEFINE_MDNODE_GET(DIEnumerator
DITypeRef operator*() const
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
unsigned StringRef DIFile unsigned DIScopeRef DITypeRef uint64_t uint32_t uint64_t DIFlags Flags
DIScopeRef getScope() const
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=None)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
StringRef getConfigurationMacros() const
Metadata * getRawEnumTypes() const
MDString * getRawName() const
element_iterator elements_begin() const
DEFINE_MDNODE_GET(DIMacro,(unsigned MIType, unsigned Line, StringRef Name, StringRef Value=""),(MIType, Line, Name, Value)) DEFINE_MDNODE_GET(DIMacro
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata * Elements
DIScopeRef getScope() const
size_t size() const
size - Get the array size.
bool isFragment() const
Return whether this is a piece of an aggregate variable.
StringRef getDirectory() const
DIScope * getScope() const
MDString * getRawChecksum() const
unsigned unsigned DILocalScope DILocation * InlinedAt
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, DIFlags Flags, Metadata *ExtraData=nullptr),(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, ExtraData)) DEFINE_MDNODE_GET(DIDerivedType
Flag
These should be considered private to the implementation of the MCInstrDesc class.
Metadata * getRawScope() const
op_iterator dwarf_op_end() const
MDString * getRawName() const
unsigned getRuntimeVersion() const
static bool classof(const Metadata *MD)
unsigned getRuntimeLang() const
static ChecksumKind getChecksumKind(StringRef CSKindStr)
ExprOperand(const uint64_t *Op)
static StringRef getFlagString(DIFlags Flag)
void replaceVTableHolder(DITypeRef VTableHolder)
Metadata * getRawExpression() const
StringRef getIncludePath() const
MDString * getRawSplitDebugFilename() const
DITypeRef getType() const
element_iterator elements_end() const
bool operator!=(const TypedDINodeRef< T > &X) const
element_iterator getBase() const
MDString * getRawFilename() const
Metadata * getRawFile() const
unsigned getNumElements() const
DITypeRef operator[](unsigned I) const
expr_op_iterator(element_iterator I)
StringRef getName() const
static bool classof(const Metadata *MD)
Metadata MDString MDString MDString MDString * ISysRoot
Metadata * getRawMacros() const
MDString * getRawValue() const
The instances of the Type class are immutable: once they are created, they are never changed...
static void getIfExists()=delete
This is an important class for using LLVM in a threaded context.
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t AlignInBits TempDILocalVariable clone() const
op_range dwarf_operands() const
static bool classof(const Metadata *MD)
unsigned MDString * Header
void replaceDwarfOperandWith(unsigned I, Metadata *New)
MDString Metadata Type TempDITemplateTypeParameter clone() 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, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder, Metadata *TemplateParams)
Build a DICompositeType with the given ODR identifier.
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),(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining)) DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(DICompileUnit
const ExprOperand & operator*() const
Metadata * getRawType() const
expr_op_iterator & operator++()
expr_op_iterator getNext() const
Get the next iterator.
DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Line, ArrayRef< Metadata * > Ops, uint32_t AlignInBits=0)
DEFINE_MDNODE_GET(DISubprogram,(DIScopeRef Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned Line, DISubroutineType *Type, bool IsLocalToUnit, bool IsDefinition, unsigned ScopeLine, DITypeRef ContainingType, unsigned Virtuality, unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags, bool IsOptimized, DICompileUnit *Unit, DITemplateParameterArray TemplateParams=nullptr, DISubprogram *Declaration=nullptr, DILocalVariableArray Variables=nullptr),(Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, Unit, TemplateParams, Declaration, Variables)) DEFINE_MDNODE_GET(DISubprogram
bool isLocalToUnit() const
unsigned getSize() const
Return the size of the operand.
Base class for template parameters.
unsigned StringRef DIFile unsigned DIScopeRef Scope
unsigned getSourceLanguage() const
DIFlags uint8_t Metadata * TypeArray
A lightweight wrapper around an expression operand.
bool operator!=(const iterator &X) const
A pair of DIGlobalVariable and DIExpression.
uint64_t getArg(unsigned I) const
Get an argument to the operand.
StringRef getStringOperand(unsigned I) const
Metadata * getRawElements() const
static MDString * getCanonicalMDString(LLVMContext &Context, StringRef S)
void replaceEnumTypes(DICompositeTypeArray N)
Replace arrays.
DIScope * getScope() const
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
bool operator!=(const expr_op_iterator &X) const
void mutate(unsigned Tag, unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags)
Change fields in place.
MDString * getRawISysRoot() const
static const unsigned End
Metadata MDString MDString * LinkageName
DIMacroNodeArray getMacros() const
Metadata * getValue() const
uint32_t getAlignInBits() const
Base class for variables.
unsigned getEncoding() const
void init(unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags)
uint64_t getOffsetInBits() const
unsigned getAttributes() const
uint32_t getAlignInBytes() const
StringRef getGetterName() const
MDString Metadata unsigned MDString * GetterName
static bool classof(const Metadata *MD)
DINodeRef getEntity() const
bool isObjectPointer() const
TempMDNode clone() const
Create a (temporary) clone of this.
bool isLValueReference() const
Metadata Metadata MDString unsigned bool ExportSymbols TempDINamespace clone() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata * RetainedTypes
MDTuple & operator*() const
static bool classof(const Metadata *MD)
static bool classof(const Metadata *MD)
Metadata MDString MDString Metadata unsigned Metadata bool bool unsigned Metadata unsigned unsigned int DIFlags bool Metadata Metadata Metadata * Declaration
static bool classof(const Metadata *MD)
DITypeRef getType() const
An imported module (C++ using directive or similar).
Base class for scope-like contexts.
DIScopeArray getRetainedTypes() const
Ty * getOperandAs(unsigned I) const
expr_op_iterator operator++(int)
TypedDINodeRef< DIScope > DIScopeRef
StringRef getDisplayName() const
void setTag(unsigned Tag)
Allow subclasses to mutate the tag.
StringRef getDirectory() const
bool startsWithDeref() const
Is the first element a DW_OP_deref?.
expr_op_iterator()=default
Metadata * getRawScope() const
DIExpression * getExpression() const
ArrayRef< uint64_t > getElements() const
unsigned MDString ArrayRef< Metadata * > DwarfOps TempGenericDINode clone() const
Return a (temporary) clone of this.
StringRef getFilename() const
MDTuple * operator->() const
static SimpleType getSimplifiedValue(const TypedDINodeRef< T > &MD)
StringRef getISysRoot() const
static bool classof(const Metadata *MD)
DIImportedEntityArray getImportedEntities() const
Metadata Metadata unsigned unsigned Column TempDILexicalBlock clone() const
const MDOperand & getOperand(unsigned I) const
Metadata * getRawBaseType() const
void setDWOId(uint64_t DwoId)
SourceLanguage
These values correspond to the CV_CFL_LANG enumeration, and are documented here: https://msdn.microsoft.com/en-us/library/bw3aekw6.aspx.
static MDString * getCanonicalMDString(LLVMContext &Context, StringRef S)
bool operator==(const iterator &X) const
MDString * getRawName() const
Metadata * getRawVariable() const
static bool classof(const Metadata *MD)
DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops)
void replaceOperandWith(unsigned I, Metadata *New)=delete
DEFINE_MDNODE_GET(DIObjCProperty,(StringRef Name, DIFile *File, unsigned Line, StringRef GetterName, StringRef SetterName, unsigned Attributes, DITypeRef Type),(Name, File, Line, GetterName, SetterName, Attributes, Type)) DEFINE_MDNODE_GET(DIObjCProperty
Metadata * getRawInlinedAt() const
MDString MDString ChecksumKind MDString * CS
const uint64_t * get() const
static bool classof(const Metadata *MD)
static DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
MDString * getRawLinkageName() const
static bool classof(const Metadata *MD)
TypedDINodeRef(const Metadata *MD)
StringRef getName() const
const ExprOperand * operator->() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool SplitDebugInlining TempDICompileUnit clone() const
DEFINE_MDNODE_GET(DIImportedEntity,(unsigned Tag, DIScope *Scope, DINodeRef Entity, unsigned Line, StringRef Name=""),(Tag, Scope, Entity, Line, Name)) DEFINE_MDNODE_GET(DIImportedEntity
void setFlags(DIFlags NewFlags)
Metadata * getRawEntity() const
Optional< FragmentInfo > getFragmentInfo() const
Retrieve the details of this fragment expression.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack","Very portable GC for uncooperative code generators")
StringRef getFilename() const
Metadata MDString MDString Metadata unsigned Metadata bool bool unsigned Metadata * ContainingType
bool isBlockByrefStruct() const
A range adaptor for a pair of iterators.
static DIFlags getFlag(StringRef Flag)
unsigned getDiscriminator() const
unsigned getLine() const =delete
unsigned StringRef uint64_t SizeInBits
DIGlobalVariableExpressionArray getGlobalVariables() const
A (clang) module that has been imported by the compile unit.
StringRef getHeader() const
bool isForwardDecl() const
bool isStaticMember() const
unsigned unsigned DILocalScope * Scope
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Metadata MDString MDString Metadata unsigned Metadata bool bool unsigned Metadata unsigned unsigned int DIFlags bool Metadata * Unit
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata * EnumTypes
Generic tagged DWARF-like metadata node.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
bool isArtificial() const
MDString MDString ChecksumKind CSK
DEFINE_MDNODE_GET(DIGlobalVariable,(DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned Line, DITypeRef Type, bool IsLocalToUnit, bool IsDefinition, DIDerivedType *StaticDataMemberDeclaration, uint32_t AlignInBits),(Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition, StaticDataMemberDeclaration, AlignInBits)) DEFINE_MDNODE_GET(DIGlobalVariable
DEFINE_MDNODE_GET(DISubroutineType,(DIFlags Flags, uint8_t CC, DITypeRefArray TypeArray),(Flags, CC, TypeArray)) DEFINE_MDNODE_GET(DISubroutineType
unsigned unsigned MDString MDString Value TempDIMacro clone() const
Type array for a subprogram.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Metadata * getRawImportedEntities() const
static bool classof(const Metadata *MD)
Metadata * getRawScope() const
Metadata * getRawScope() const
DEFINE_MDNODE_GET(DINamespace,(DIScope *Scope, DIFile *File, StringRef Name, unsigned Line, bool ExportSymbols),(Scope, File, Name, Line, ExportSymbols)) DEFINE_MDNODE_GET(DINamespace
Macro Info DWARF-like metadata node.
static bool classof(const Metadata *MD)
DITemplateParameterArray getTemplateParams() const
Metadata Metadata unsigned Discriminator TempDILexicalBlockFile clone() const
bool operator==(const expr_op_iterator &X) const
DIGlobalVariable * getVariable() const
static bool classof(const Metadata *MD)
MDString Metadata unsigned MDString MDString * SetterName
const MDOperand & getDwarfOperand(unsigned I) const
Metadata * getRawElements() const
Metadata MDString MDString MDString * IncludePath
MDString * getRawIdentifier() const
uint64_t getSizeInBits() const
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
LLVMContext & getContext() const
Metadata MDString MDString Metadata unsigned Metadata bool bool unsigned Metadata unsigned unsigned int DIFlags bool Metadata Metadata Metadata Metadata * Variables
Metadata MDString MDString MDString MDString ISysRoot TempDIModule clone() const
DITypeRefArray(const MDTuple *N)
DITypeRef getVTableHolder() const
StringRef getSetterName() const
bool isConstant() const
Determine whether this represents a standalone constant value.
DEFINE_MDNODE_GET(DIBasicType,(unsigned Tag, StringRef Name),(Tag, Name, 0, 0, 0)) DEFINE_MDNODE_GET(DIBasicType
Metadata * getRawFile() const
bool isObjcClassComplete() const
Metadata * getRawScope() const
DEFINE_MDNODE_GET(DILexicalBlockFile,(DILocalScope *Scope, DIFile *File, unsigned Discriminator),(Scope, File, Discriminator)) DEFINE_MDNODE_GET(DILexicalBlockFile
static bool classof(const Metadata *MD)
int64_t MDString Name TempDIEnumerator clone() const
DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned Metadata * VTableHolder
MDString * getRawName() const
DICompositeTypeArray getEnumTypes() const
StringRef getName() const
LLVM Value Representation.
static bool classof(const Metadata *MD)
DIDerivedType * getStaticDataMemberDeclaration() const
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata * ImportedEntities
unsigned getNumArgs() const
void replaceGlobalVariables(DIGlobalVariableExpressionArray N)
bool isDefinition() const
An iterator for expression operands.
StringRef getStringOperand(unsigned I) const
uint64_t getOp() const
Get the operand code.
void replaceMacros(DIMacroNodeArray N)
std::string Hash(const Unit &U)
DEFINE_MDNODE_GET(DILocalVariable,(DILocalScope *Scope, StringRef Name, DIFile *File, unsigned Line, DITypeRef Type, unsigned Arg, DIFlags Flags, uint32_t AlignInBits),(Scope, Name, File, Line, Type, Arg, Flags, AlignInBits)) DEFINE_MDNODE_GET(DILocalVariable
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this variable.
Ty * getOperandAs(unsigned I) const
StringRef - Represent a constant reference to a string, i.e.
MDString * getRawName() const
op_iterator dwarf_op_begin() const
int64_t getLowerBound() const
MDString * getRawSetterName() const
DEFINE_MDNODE_GET(GenericDINode,(unsigned Tag, StringRef Header, ArrayRef< Metadata * > DwarfOps),(Tag, Header, DwarfOps)) DEFINE_MDNODE_GET(GenericDINode
static LazyValueInfoImpl & getImpl(void *&PImpl, AssumptionCache *AC, const DataLayout *DL, DominatorTree *DT=nullptr)
This lazily constructs the LazyValueInfoImpl.
DISubprogram * getSubprogram() const
Get the subprogram for this scope.
void replaceElements(DINodeArray Elements)
Replace operands.
TypedDINodeRef< DIType > DITypeRef
DEFINE_MDNODE_GET(DIGlobalVariableExpression,(Metadata *Variable, Metadata *Expression),(Variable, Expression)) TempDIGlobalVariableExpression clone() const
expr_op_iterator expr_op_end() const
DEFINE_MDNODE_GET(DILocation,(unsigned Line, unsigned Column, Metadata *Scope, Metadata *InlinedAt=nullptr),(Line, Column, Scope, InlinedAt)) DEFINE_MDNODE_GET(DILocation
StringRef getProducer() const
StringRef getLinkageName() const
unsigned unsigned Metadata Metadata Elements TempDIMacroFile clone() const
DEFINE_MDNODE_GET(DIMacroFile,(unsigned MIType, unsigned Line, DIFile *File, DIMacroNodeArray Elements),(MIType, Line, File, Elements)) DEFINE_MDNODE_GET(DIMacroFile
static bool classof(const Metadata *MD)
void replaceElements(DIMacroNodeArray Elements)
unsigned Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata * Macros
static bool classof(const Metadata *MD)
static bool classof(const Metadata *MD)
MDString * getRawProducer() const
void replaceImportedEntities(DIImportedEntityArray N)
DEFINE_MDNODE_GET(DIExpression,(ArrayRef< uint64_t > Elements),(Elements)) TempDIExpression clone() const
StringRef getValue() const
Metadata * getRawGlobalVariables() const
Basic type, like 'int' or 'float'.
Metadata * getRawTypeArray() const
bool is_contained(R &&Range, const E &Element)
Wrapper function around std::find to detect if an element exists in a container.
StringRef getSplitDebugFilename() const
Metadata * getRawVTableHolder() const