Skip to content

Commit 04ec037

Browse files
committed
Emit num_extra_inhabitants in DWARF
Swift types have the concept of "extra inhabitants". An extra inhabitant is a bit pattern that does not represent a valid value for objects of a given type. Add a new Apple DWARF extension, APPLE_num_extra_inhabitants, to encode this information in DWARF. (cherry picked from commit 89d458b)
1 parent 010557c commit 04ec037

File tree

13 files changed

+209
-112
lines changed

13 files changed

+209
-112
lines changed

llvm/include/llvm/BinaryFormat/Dwarf.def

+1
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,7 @@ HANDLE_DW_AT(0x3fed, APPLE_property, 0, APPLE)
629629
HANDLE_DW_AT(0x3fee, APPLE_objc_direct, 0, APPLE)
630630
HANDLE_DW_AT(0x3fef, APPLE_sdk, 0, APPLE)
631631
HANDLE_DW_AT(0x3ff0, APPLE_origin, 0, APPLE)
632+
HANDLE_DW_AT(0x3ff1, APPLE_num_extra_inhabitants, 0, APPLE)
632633

633634
// Attribute form encodings.
634635
HANDLE_DW_FORM(0x01, addr, 2, DWARF)

llvm/include/llvm/IR/DIBuilder.h

+10-2
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,13 @@ namespace llvm {
216216
/// \param SizeInBits Size of the type.
217217
/// \param Encoding DWARF encoding code, e.g., dwarf::DW_ATE_float.
218218
/// \param Flags Optional DWARF attributes, e.g., DW_AT_endianity.
219+
/// \param NumExtraInhabitants The number of extra inhabitants of the type.
220+
/// An extra inhabitant is a bit pattern that does not represent a valid
221+
/// value for objects of a given type.
219222
DIBasicType *createBasicType(StringRef Name, uint64_t SizeInBits,
220223
unsigned Encoding,
221-
DINode::DIFlags Flags = DINode::FlagZero);
224+
DINode::DIFlags Flags = DINode::FlagZero,
225+
uint32_t NumExtraInhabitants = 0);
222226

223227
/// Create debugging information entry for a string
224228
/// type.
@@ -455,11 +459,15 @@ namespace llvm {
455459
/// \param Elements Struct elements.
456460
/// \param RunTimeLang Optional parameter, Objective-C runtime version.
457461
/// \param UniqueIdentifier A unique identifier for the struct.
462+
/// \param NumExtraInhabitants The number of extra inhabitants of the type.
463+
/// An extra inhabitant is a bit pattern that does not represent a valid
464+
/// value for objects of a given type.
458465
DICompositeType *createStructType(
459466
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
460467
uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
461468
DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang = 0,
462-
DIType *VTableHolder = nullptr, StringRef UniqueIdentifier = "");
469+
DIType *VTableHolder = nullptr, StringRef UniqueIdentifier = "",
470+
uint32_t NumExtraInhabitants = 0);
463471

464472
/// Create debugging information entry for an union.
465473
/// \param Scope Scope in which this union is defined.

llvm/include/llvm/IR/DebugInfoMetadata.h

+74-56
Original file line numberDiff line numberDiff line change
@@ -712,31 +712,36 @@ class DIType : public DIScope {
712712
DIFlags Flags;
713713
uint64_t SizeInBits;
714714
uint64_t OffsetInBits;
715+
uint32_t NumExtraInhabitants;
715716

716717
protected:
717718
DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
718719
unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
719-
uint64_t OffsetInBits, DIFlags Flags, ArrayRef<Metadata *> Ops)
720+
uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags,
721+
ArrayRef<Metadata *> Ops)
720722
: DIScope(C, ID, Storage, Tag, Ops) {
721-
init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
723+
init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
724+
Flags);
722725
}
723726
~DIType() = default;
724727

725728
void init(unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
726-
uint64_t OffsetInBits, DIFlags Flags) {
729+
uint64_t OffsetInBits, uint32_t NumExtraInhabitants,
730+
DIFlags Flags) {
727731
this->Line = Line;
728732
this->Flags = Flags;
729733
this->SizeInBits = SizeInBits;
730734
this->SubclassData32 = AlignInBits;
731735
this->OffsetInBits = OffsetInBits;
736+
this->NumExtraInhabitants = NumExtraInhabitants;
732737
}
733738

734739
/// Change fields in place.
735740
void mutate(unsigned Tag, unsigned Line, uint64_t SizeInBits,
736-
uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags) {
741+
uint32_t AlignInBits, uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags) {
737742
assert(isDistinct() && "Only distinct nodes can mutate");
738743
setTag(Tag);
739-
init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
744+
init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants, Flags);
740745
}
741746

742747
public:
@@ -749,6 +754,7 @@ class DIType : public DIScope {
749754
uint32_t getAlignInBits() const { return SubclassData32; }
750755
uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
751756
uint64_t getOffsetInBits() const { return OffsetInBits; }
757+
uint32_t getNumExtraInhabitants() const { return NumExtraInhabitants; }
752758
DIFlags getFlags() const { return Flags; }
753759

754760
DIScope *getScope() const { return cast_or_null<DIScope>(getRawScope()); }
@@ -820,49 +826,55 @@ class DIBasicType : public DIType {
820826

821827
DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag,
822828
uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
823-
DIFlags Flags, ArrayRef<Metadata *> Ops)
829+
uint32_t NumExtraInhabitants, DIFlags Flags,
830+
ArrayRef<Metadata *> Ops)
824831
: DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
825-
Flags, Ops),
832+
NumExtraInhabitants, Flags, Ops),
826833
Encoding(Encoding) {}
827834
~DIBasicType() = default;
828835

829836
static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
830837
StringRef Name, uint64_t SizeInBits,
831838
uint32_t AlignInBits, unsigned Encoding,
832-
DIFlags Flags, StorageType Storage,
833-
bool ShouldCreate = true) {
839+
uint32_t NumExtraInhabitants, DIFlags Flags,
840+
StorageType Storage, bool ShouldCreate = true) {
834841
return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
835-
SizeInBits, AlignInBits, Encoding, Flags, Storage,
836-
ShouldCreate);
842+
SizeInBits, AlignInBits, Encoding, NumExtraInhabitants,
843+
Flags, Storage, ShouldCreate);
837844
}
838845
static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
839846
MDString *Name, uint64_t SizeInBits,
840847
uint32_t AlignInBits, unsigned Encoding,
841-
DIFlags Flags, StorageType Storage,
842-
bool ShouldCreate = true);
848+
uint32_t NumExtraInhabitants, DIFlags Flags,
849+
StorageType Storage, bool ShouldCreate = true);
843850

844851
TempDIBasicType cloneImpl() const {
845852
return getTemporary(getContext(), getTag(), getName(), getSizeInBits(),
846-
getAlignInBits(), getEncoding(), getFlags());
853+
getAlignInBits(), getEncoding(),
854+
getNumExtraInhabitants(), getFlags());
847855
}
848856

849857
public:
850858
DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name),
851-
(Tag, Name, 0, 0, 0, FlagZero))
859+
(Tag, Name, 0, 0, 0, 0, FlagZero))
852860
DEFINE_MDNODE_GET(DIBasicType,
853861
(unsigned Tag, StringRef Name, uint64_t SizeInBits),
854-
(Tag, Name, SizeInBits, 0, 0, FlagZero))
862+
(Tag, Name, SizeInBits, 0, 0, 0, FlagZero))
855863
DEFINE_MDNODE_GET(DIBasicType,
856864
(unsigned Tag, MDString *Name, uint64_t SizeInBits),
857-
(Tag, Name, SizeInBits, 0, 0, FlagZero))
865+
(Tag, Name, SizeInBits, 0, 0, 0, FlagZero))
858866
DEFINE_MDNODE_GET(DIBasicType,
859867
(unsigned Tag, StringRef Name, uint64_t SizeInBits,
860-
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
861-
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
868+
uint32_t AlignInBits, unsigned Encoding,
869+
uint32_t NumExtraInhabitants, DIFlags Flags),
870+
(Tag, Name, SizeInBits, AlignInBits, Encoding,
871+
NumExtraInhabitants, Flags))
862872
DEFINE_MDNODE_GET(DIBasicType,
863873
(unsigned Tag, MDString *Name, uint64_t SizeInBits,
864-
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
865-
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
874+
uint32_t AlignInBits, unsigned Encoding,
875+
uint32_t NumExtraInhabitants, DIFlags Flags),
876+
(Tag, Name, SizeInBits, AlignInBits, Encoding,
877+
NumExtraInhabitants, Flags))
866878

867879
TempDIBasicType clone() const { return cloneImpl(); }
868880

@@ -890,7 +902,7 @@ class DIStringType : public DIType {
890902
uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
891903
ArrayRef<Metadata *> Ops)
892904
: DIType(C, DIStringTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
893-
FlagZero, Ops),
905+
0, FlagZero, Ops),
894906
Encoding(Encoding) {}
895907
~DIStringType() = default;
896908

@@ -1012,11 +1024,12 @@ class DIDerivedType : public DIType {
10121024
DIDerivedType(LLVMContext &C, StorageType Storage, unsigned Tag,
10131025
unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
10141026
uint64_t OffsetInBits,
1015-
std::optional<unsigned> DWARFAddressSpace, std::optional<PtrAuthData> PtrAuth, DIFlags Flags,
1027+
std::optional<unsigned> DWARFAddressSpace,
1028+
std::optional<PtrAuthData> PtrAuth, DIFlags Flags,
10161029
ArrayRef<Metadata *> Ops)
10171030
: DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
1018-
AlignInBits, OffsetInBits, Flags, Ops),
1019-
DWARFAddressSpace(DWARFAddressSpace), PtrAuth(PtrAuth) { }
1031+
AlignInBits, OffsetInBits, 0, Flags, Ops),
1032+
DWARFAddressSpace(DWARFAddressSpace), PtrAuth(PtrAuth) {}
10201033
~DIDerivedType() = default;
10211034
static DIDerivedType *
10221035
getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
@@ -1157,39 +1170,43 @@ class DICompositeType : public DIType {
11571170

11581171
DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
11591172
unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits,
1160-
uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
1173+
uint32_t AlignInBits, uint64_t OffsetInBits,
1174+
uint32_t NumExtraInhabitants, DIFlags Flags,
11611175
ArrayRef<Metadata *> Ops)
11621176
: DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits,
1163-
AlignInBits, OffsetInBits, Flags, Ops),
1177+
AlignInBits, OffsetInBits, NumExtraInhabitants, Flags, Ops),
11641178
RuntimeLang(RuntimeLang) {}
11651179
~DICompositeType() = default;
11661180

11671181
/// Change fields in place.
11681182
void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang,
11691183
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1170-
DIFlags Flags) {
1184+
uint32_t NumExtraInhabitants, DIFlags Flags) {
11711185
assert(isDistinct() && "Only distinct nodes can mutate");
11721186
assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate");
11731187
this->RuntimeLang = RuntimeLang;
1174-
DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
1188+
DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits,
1189+
NumExtraInhabitants, Flags);
11751190
}
11761191

11771192
static DICompositeType *
11781193
getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
11791194
unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1180-
uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
1181-
DINodeArray Elements, unsigned RuntimeLang, DIType *VTableHolder,
1195+
uint32_t AlignInBits, uint64_t OffsetInBits,
1196+
uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1197+
unsigned RuntimeLang, DIType *VTableHolder,
11821198
DITemplateParameterArray TemplateParams, StringRef Identifier,
11831199
DIDerivedType *Discriminator, Metadata *DataLocation,
11841200
Metadata *Associated, Metadata *Allocated, Metadata *Rank,
11851201
DINodeArray Annotations, StorageType Storage,
11861202
bool ShouldCreate = true) {
1187-
return getImpl(
1188-
Context, Tag, getCanonicalMDString(Context, Name), File, Line, Scope,
1189-
BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements.get(),
1190-
RuntimeLang, VTableHolder, TemplateParams.get(),
1191-
getCanonicalMDString(Context, Identifier), Discriminator, DataLocation,
1192-
Associated, Allocated, Rank, Annotations.get(), Storage, ShouldCreate);
1203+
return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1204+
Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
1205+
Flags, Elements.get(), RuntimeLang, VTableHolder,
1206+
TemplateParams.get(),
1207+
getCanonicalMDString(Context, Identifier), Discriminator,
1208+
DataLocation, Associated, Allocated, Rank, Annotations.get(),
1209+
NumExtraInhabitants, Storage, ShouldCreate);
11931210
}
11941211
static DICompositeType *
11951212
getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
@@ -1199,7 +1216,8 @@ class DICompositeType : public DIType {
11991216
Metadata *VTableHolder, Metadata *TemplateParams,
12001217
MDString *Identifier, Metadata *Discriminator, Metadata *DataLocation,
12011218
Metadata *Associated, Metadata *Allocated, Metadata *Rank,
1202-
Metadata *Annotations, StorageType Storage, bool ShouldCreate = true);
1219+
Metadata *Annotations, uint32_t NumExtraInhabitants,
1220+
StorageType Storage, bool ShouldCreate = true);
12031221

12041222
TempDICompositeType cloneImpl() const {
12051223
return getTemporary(
@@ -1208,7 +1226,7 @@ class DICompositeType : public DIType {
12081226
getFlags(), getElements(), getRuntimeLang(), getVTableHolder(),
12091227
getTemplateParams(), getIdentifier(), getDiscriminator(),
12101228
getRawDataLocation(), getRawAssociated(), getRawAllocated(),
1211-
getRawRank(), getAnnotations());
1229+
getRawRank(), getAnnotations(), getNumExtraInhabitants());
12121230
}
12131231

12141232
public:
@@ -1222,11 +1240,11 @@ class DICompositeType : public DIType {
12221240
StringRef Identifier = "", DIDerivedType *Discriminator = nullptr,
12231241
Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
12241242
Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1225-
DINodeArray Annotations = nullptr),
1243+
DINodeArray Annotations = nullptr, uint32_t NumExtraInhabitants = 0),
12261244
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1227-
OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams,
1228-
Identifier, Discriminator, DataLocation, Associated, Allocated, Rank,
1229-
Annotations))
1245+
OffsetInBits, NumExtraInhabitants, Flags, Elements, RuntimeLang,
1246+
VTableHolder, TemplateParams, Identifier, Discriminator, DataLocation,
1247+
Associated, Allocated, Rank, Annotations))
12301248
DEFINE_MDNODE_GET(
12311249
DICompositeType,
12321250
(unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
@@ -1236,11 +1254,12 @@ class DICompositeType : public DIType {
12361254
Metadata *TemplateParams = nullptr, MDString *Identifier = nullptr,
12371255
Metadata *Discriminator = nullptr, Metadata *DataLocation = nullptr,
12381256
Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1239-
Metadata *Rank = nullptr, Metadata *Annotations = nullptr),
1257+
Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1258+
uint32_t NumExtraInhabitants = 0),
12401259
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
12411260
OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams,
12421261
Identifier, Discriminator, DataLocation, Associated, Allocated, Rank,
1243-
Annotations))
1262+
Annotations, NumExtraInhabitants))
12441263

12451264
TempDICompositeType clone() const { return cloneImpl(); }
12461265

@@ -1255,8 +1274,8 @@ class DICompositeType : public DIType {
12551274
getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
12561275
MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
12571276
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1258-
uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
1259-
unsigned RuntimeLang, Metadata *VTableHolder,
1277+
uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags,
1278+
Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder,
12601279
Metadata *TemplateParams, Metadata *Discriminator,
12611280
Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
12621281
Metadata *Rank, Metadata *Annotations);
@@ -1272,15 +1291,14 @@ class DICompositeType : public DIType {
12721291
///
12731292
/// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns
12741293
/// nullptr.
1275-
static DICompositeType *
1276-
buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1277-
MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1278-
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1279-
uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
1280-
unsigned RuntimeLang, Metadata *VTableHolder,
1281-
Metadata *TemplateParams, Metadata *Discriminator,
1282-
Metadata *DataLocation, Metadata *Associated,
1283-
Metadata *Allocated, Metadata *Rank, Metadata *Annotations);
1294+
static DICompositeType *buildODRType(
1295+
LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
1296+
Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType,
1297+
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1298+
uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements,
1299+
unsigned RuntimeLang, Metadata *VTableHolder, Metadata *TemplateParams,
1300+
Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated,
1301+
Metadata *Allocated, Metadata *Rank, Metadata *Annotations);
12841302

12851303
DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
12861304
DINodeArray getElements() const {

0 commit comments

Comments
 (0)