Skip to content

Commit bef3e90

Browse files
committed
[DebugInfo] Add num_extra_inhabitants to debug info
An extra inhabitant is a bit pattern that does not represent a valid value for instances of a given type. The number of extra inhabitants is the number of those bit configurations. This is used by Swift to save space when composing types. For example, because Bool only needs 2 bit patterns to represent all of its values (true and false), an Optional<Bool> only occupies 1 byte in memory by using a bit configuration that is unused by Bool. This patch adds num_extra_inhabitants to LLVM-IR debug info and in DWARF as an Apple extension.
1 parent 76173b1 commit bef3e90

File tree

15 files changed

+246
-141
lines changed

15 files changed

+246
-141
lines changed

llvm/include/llvm/BinaryFormat/Dwarf.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,7 @@ HANDLE_DW_AT(0x3fed, APPLE_property, 0, APPLE)
636636
HANDLE_DW_AT(0x3fee, APPLE_objc_direct, 0, APPLE)
637637
HANDLE_DW_AT(0x3fef, APPLE_sdk, 0, APPLE)
638638
HANDLE_DW_AT(0x3ff0, APPLE_origin, 0, APPLE)
639+
HANDLE_DW_AT(0x3ff1, APPLE_num_extra_inhabitants, 0, APPLE)
639640

640641
// Attribute form encodings.
641642
HANDLE_DW_FORM(0x01, addr, 2, DWARF)

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,13 @@ namespace llvm {
225225
/// \param SizeInBits Size of the type.
226226
/// \param Encoding DWARF encoding code, e.g., dwarf::DW_ATE_float.
227227
/// \param Flags Optional DWARF attributes, e.g., DW_AT_endianity.
228+
/// \param NumExtraInhabitants The number of extra inhabitants of the type.
229+
/// An extra inhabitant is a bit pattern that does not represent a valid
230+
/// value for instances of a given type.
228231
DIBasicType *createBasicType(StringRef Name, uint64_t SizeInBits,
229232
unsigned Encoding,
230-
DINode::DIFlags Flags = DINode::FlagZero);
233+
DINode::DIFlags Flags = DINode::FlagZero,
234+
uint32_t NumExtraInhabitants = 0);
231235

232236
/// Create debugging information entry for a string
233237
/// type.
@@ -484,11 +488,15 @@ namespace llvm {
484488
/// \param Elements Struct elements.
485489
/// \param RunTimeLang Optional parameter, Objective-C runtime version.
486490
/// \param UniqueIdentifier A unique identifier for the struct.
491+
/// \param NumExtraInhabitants The number of extra inhabitants of the type.
492+
/// An extra inhabitant is a bit pattern that does not represent a valid
493+
/// value for instances of a given type.
487494
DICompositeType *createStructType(
488495
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
489496
uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
490497
DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang = 0,
491-
DIType *VTableHolder = nullptr, StringRef UniqueIdentifier = "");
498+
DIType *VTableHolder = nullptr, StringRef UniqueIdentifier = "",
499+
uint32_t NumExtraInhabitants = 0);
492500

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

llvm/include/llvm/IR/DebugInfoMetadata.h

Lines changed: 73 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -712,31 +712,38 @@ 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,
742+
uint32_t NumExtraInhabitants, DIFlags Flags) {
737743
assert(isDistinct() && "Only distinct nodes can mutate");
738744
setTag(Tag);
739-
init(Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
745+
init(Line, SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
746+
Flags);
740747
}
741748

742749
public:
@@ -749,6 +756,7 @@ class DIType : public DIScope {
749756
uint32_t getAlignInBits() const;
750757
uint32_t getAlignInBytes() const { return getAlignInBits() / CHAR_BIT; }
751758
uint64_t getOffsetInBits() const { return OffsetInBits; }
759+
uint32_t getNumExtraInhabitants() const { return NumExtraInhabitants; }
752760
DIFlags getFlags() const { return Flags; }
753761

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

821829
DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag,
822830
uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
823-
DIFlags Flags, ArrayRef<Metadata *> Ops)
831+
uint32_t NumExtraInhabitants, DIFlags Flags,
832+
ArrayRef<Metadata *> Ops)
824833
: DIType(C, DIBasicTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
825-
Flags, Ops),
834+
NumExtraInhabitants, Flags, Ops),
826835
Encoding(Encoding) {}
827836
~DIBasicType() = default;
828837

829838
static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
830839
StringRef Name, uint64_t SizeInBits,
831840
uint32_t AlignInBits, unsigned Encoding,
832-
DIFlags Flags, StorageType Storage,
833-
bool ShouldCreate = true) {
841+
uint32_t NumExtraInhabitants, DIFlags Flags,
842+
StorageType Storage, bool ShouldCreate = true) {
834843
return getImpl(Context, Tag, getCanonicalMDString(Context, Name),
835-
SizeInBits, AlignInBits, Encoding, Flags, Storage,
836-
ShouldCreate);
844+
SizeInBits, AlignInBits, Encoding, NumExtraInhabitants,
845+
Flags, Storage, ShouldCreate);
837846
}
838847
static DIBasicType *getImpl(LLVMContext &Context, unsigned Tag,
839848
MDString *Name, uint64_t SizeInBits,
840849
uint32_t AlignInBits, unsigned Encoding,
841-
DIFlags Flags, StorageType Storage,
842-
bool ShouldCreate = true);
850+
uint32_t NumExtraInhabitants, DIFlags Flags,
851+
StorageType Storage, bool ShouldCreate = true);
843852

844853
TempDIBasicType cloneImpl() const {
845854
return getTemporary(getContext(), getTag(), getName(), getSizeInBits(),
846-
getAlignInBits(), getEncoding(), getFlags());
855+
getAlignInBits(), getEncoding(),
856+
getNumExtraInhabitants(), getFlags());
847857
}
848858

849859
public:
850860
DEFINE_MDNODE_GET(DIBasicType, (unsigned Tag, StringRef Name),
851-
(Tag, Name, 0, 0, 0, FlagZero))
861+
(Tag, Name, 0, 0, 0, 0, FlagZero))
852862
DEFINE_MDNODE_GET(DIBasicType,
853863
(unsigned Tag, StringRef Name, uint64_t SizeInBits),
854-
(Tag, Name, SizeInBits, 0, 0, FlagZero))
864+
(Tag, Name, SizeInBits, 0, 0, 0, FlagZero))
855865
DEFINE_MDNODE_GET(DIBasicType,
856866
(unsigned Tag, MDString *Name, uint64_t SizeInBits),
857-
(Tag, Name, SizeInBits, 0, 0, FlagZero))
867+
(Tag, Name, SizeInBits, 0, 0, 0, FlagZero))
858868
DEFINE_MDNODE_GET(DIBasicType,
859869
(unsigned Tag, StringRef Name, uint64_t SizeInBits,
860-
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
861-
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
870+
uint32_t AlignInBits, unsigned Encoding,
871+
uint32_t NumExtraInhabitants, DIFlags Flags),
872+
(Tag, Name, SizeInBits, AlignInBits, Encoding,
873+
NumExtraInhabitants, Flags))
862874
DEFINE_MDNODE_GET(DIBasicType,
863875
(unsigned Tag, MDString *Name, uint64_t SizeInBits,
864-
uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
865-
(Tag, Name, SizeInBits, AlignInBits, Encoding, Flags))
876+
uint32_t AlignInBits, unsigned Encoding,
877+
uint32_t NumExtraInhabitants, DIFlags Flags),
878+
(Tag, Name, SizeInBits, AlignInBits, Encoding,
879+
NumExtraInhabitants, Flags))
866880

867881
TempDIBasicType clone() const { return cloneImpl(); }
868882

@@ -890,7 +904,7 @@ class DIStringType : public DIType {
890904
uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
891905
ArrayRef<Metadata *> Ops)
892906
: DIType(C, DIStringTypeKind, Storage, Tag, 0, SizeInBits, AlignInBits, 0,
893-
FlagZero, Ops),
907+
0, FlagZero, Ops),
894908
Encoding(Encoding) {}
895909
~DIStringType() = default;
896910

@@ -1016,7 +1030,7 @@ class DIDerivedType : public DIType {
10161030
std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
10171031
ArrayRef<Metadata *> Ops)
10181032
: DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
1019-
AlignInBits, OffsetInBits, Flags, Ops),
1033+
AlignInBits, OffsetInBits, 0, Flags, Ops),
10201034
DWARFAddressSpace(DWARFAddressSpace) {
10211035
if (PtrAuthData)
10221036
SubclassData32 = PtrAuthData->RawData;
@@ -1157,39 +1171,43 @@ class DICompositeType : public DIType {
11571171

11581172
DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
11591173
unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits,
1160-
uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
1174+
uint32_t AlignInBits, uint64_t OffsetInBits,
1175+
uint32_t NumExtraInhabitants, DIFlags Flags,
11611176
ArrayRef<Metadata *> Ops)
11621177
: DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits,
1163-
AlignInBits, OffsetInBits, Flags, Ops),
1178+
AlignInBits, OffsetInBits, NumExtraInhabitants, Flags, Ops),
11641179
RuntimeLang(RuntimeLang) {}
11651180
~DICompositeType() = default;
11661181

11671182
/// Change fields in place.
11681183
void mutate(unsigned Tag, unsigned Line, unsigned RuntimeLang,
11691184
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1170-
DIFlags Flags) {
1185+
uint32_t NumExtraInhabitants, DIFlags Flags) {
11711186
assert(isDistinct() && "Only distinct nodes can mutate");
11721187
assert(getRawIdentifier() && "Only ODR-uniqued nodes should mutate");
11731188
this->RuntimeLang = RuntimeLang;
1174-
DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits, Flags);
1189+
DIType::mutate(Tag, Line, SizeInBits, AlignInBits, OffsetInBits,
1190+
NumExtraInhabitants, Flags);
11751191
}
11761192

11771193
static DICompositeType *
11781194
getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
11791195
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,
1196+
uint32_t AlignInBits, uint64_t OffsetInBits,
1197+
uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1198+
unsigned RuntimeLang, DIType *VTableHolder,
11821199
DITemplateParameterArray TemplateParams, StringRef Identifier,
11831200
DIDerivedType *Discriminator, Metadata *DataLocation,
11841201
Metadata *Associated, Metadata *Allocated, Metadata *Rank,
11851202
DINodeArray Annotations, StorageType Storage,
11861203
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);
1204+
return getImpl(Context, Tag, getCanonicalMDString(Context, Name), File,
1205+
Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
1206+
Flags, Elements.get(), RuntimeLang, VTableHolder,
1207+
TemplateParams.get(),
1208+
getCanonicalMDString(Context, Identifier), Discriminator,
1209+
DataLocation, Associated, Allocated, Rank, Annotations.get(),
1210+
NumExtraInhabitants, Storage, ShouldCreate);
11931211
}
11941212
static DICompositeType *
11951213
getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
@@ -1199,7 +1217,8 @@ class DICompositeType : public DIType {
11991217
Metadata *VTableHolder, Metadata *TemplateParams,
12001218
MDString *Identifier, Metadata *Discriminator, Metadata *DataLocation,
12011219
Metadata *Associated, Metadata *Allocated, Metadata *Rank,
1202-
Metadata *Annotations, StorageType Storage, bool ShouldCreate = true);
1220+
Metadata *Annotations, uint32_t NumExtraInhabitants,
1221+
StorageType Storage, bool ShouldCreate = true);
12031222

12041223
TempDICompositeType cloneImpl() const {
12051224
return getTemporary(
@@ -1208,7 +1227,7 @@ class DICompositeType : public DIType {
12081227
getFlags(), getElements(), getRuntimeLang(), getVTableHolder(),
12091228
getTemplateParams(), getIdentifier(), getDiscriminator(),
12101229
getRawDataLocation(), getRawAssociated(), getRawAllocated(),
1211-
getRawRank(), getAnnotations());
1230+
getRawRank(), getAnnotations(), getNumExtraInhabitants());
12121231
}
12131232

12141233
public:
@@ -1222,11 +1241,11 @@ class DICompositeType : public DIType {
12221241
StringRef Identifier = "", DIDerivedType *Discriminator = nullptr,
12231242
Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
12241243
Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1225-
DINodeArray Annotations = nullptr),
1244+
DINodeArray Annotations = nullptr, uint32_t NumExtraInhabitants = 0),
12261245
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1227-
OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams,
1228-
Identifier, Discriminator, DataLocation, Associated, Allocated, Rank,
1229-
Annotations))
1246+
OffsetInBits, NumExtraInhabitants, Flags, Elements, RuntimeLang,
1247+
VTableHolder, TemplateParams, Identifier, Discriminator, DataLocation,
1248+
Associated, Allocated, Rank, Annotations))
12301249
DEFINE_MDNODE_GET(
12311250
DICompositeType,
12321251
(unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
@@ -1236,11 +1255,12 @@ class DICompositeType : public DIType {
12361255
Metadata *TemplateParams = nullptr, MDString *Identifier = nullptr,
12371256
Metadata *Discriminator = nullptr, Metadata *DataLocation = nullptr,
12381257
Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
1239-
Metadata *Rank = nullptr, Metadata *Annotations = nullptr),
1258+
Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1259+
uint32_t NumExtraInhabitants = 0),
12401260
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
12411261
OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams,
12421262
Identifier, Discriminator, DataLocation, Associated, Allocated, Rank,
1243-
Annotations))
1263+
Annotations, NumExtraInhabitants))
12441264

12451265
TempDICompositeType clone() const { return cloneImpl(); }
12461266

@@ -1255,8 +1275,8 @@ class DICompositeType : public DIType {
12551275
getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
12561276
MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
12571277
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1258-
uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
1259-
unsigned RuntimeLang, Metadata *VTableHolder,
1278+
uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags,
1279+
Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder,
12601280
Metadata *TemplateParams, Metadata *Discriminator,
12611281
Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
12621282
Metadata *Rank, Metadata *Annotations);
@@ -1272,15 +1292,14 @@ class DICompositeType : public DIType {
12721292
///
12731293
/// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns
12741294
/// 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);
1295+
static DICompositeType *buildODRType(
1296+
LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
1297+
Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType,
1298+
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1299+
uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements,
1300+
unsigned RuntimeLang, Metadata *VTableHolder, Metadata *TemplateParams,
1301+
Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated,
1302+
Metadata *Allocated, Metadata *Rank, Metadata *Annotations);
12841303

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

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5329,12 +5329,14 @@ bool LLParser::parseDIBasicType(MDNode *&Result, bool IsDistinct) {
53295329
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
53305330
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
53315331
OPTIONAL(encoding, DwarfAttEncodingField, ); \
5332+
OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
53325333
OPTIONAL(flags, DIFlagField, );
53335334
PARSE_MD_FIELDS();
53345335
#undef VISIT_MD_FIELDS
53355336

53365337
Result = GET_OR_DISTINCT(DIBasicType, (Context, tag.Val, name.Val, size.Val,
5337-
align.Val, encoding.Val, flags.Val));
5338+
align.Val, encoding.Val,
5339+
num_extra_inhabitants.Val, flags.Val));
53385340
return false;
53395341
}
53405342

@@ -5432,7 +5434,8 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
54325434
OPTIONAL(associated, MDField, ); \
54335435
OPTIONAL(allocated, MDField, ); \
54345436
OPTIONAL(rank, MDSignedOrMDField, ); \
5435-
OPTIONAL(annotations, MDField, );
5437+
OPTIONAL(annotations, MDField, ); \
5438+
OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX));
54365439
PARSE_MD_FIELDS();
54375440
#undef VISIT_MD_FIELDS
54385441

@@ -5447,10 +5450,11 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
54475450
if (identifier.Val)
54485451
if (auto *CT = DICompositeType::buildODRType(
54495452
Context, *identifier.Val, tag.Val, name.Val, file.Val, line.Val,
5450-
scope.Val, baseType.Val, size.Val, align.Val, offset.Val, flags.Val,
5451-
elements.Val, runtimeLang.Val, vtableHolder.Val, templateParams.Val,
5452-
discriminator.Val, dataLocation.Val, associated.Val, allocated.Val,
5453-
Rank, annotations.Val)) {
5453+
scope.Val, baseType.Val, size.Val, align.Val, offset.Val,
5454+
num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
5455+
vtableHolder.Val, templateParams.Val, discriminator.Val,
5456+
dataLocation.Val, associated.Val, allocated.Val, Rank,
5457+
annotations.Val)) {
54545458
Result = CT;
54555459
return false;
54565460
}
@@ -5463,7 +5467,7 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
54635467
size.Val, align.Val, offset.Val, flags.Val, elements.Val,
54645468
runtimeLang.Val, vtableHolder.Val, templateParams.Val, identifier.Val,
54655469
discriminator.Val, dataLocation.Val, associated.Val, allocated.Val, Rank,
5466-
annotations.Val));
5470+
annotations.Val, num_extra_inhabitants.Val));
54675471
return false;
54685472
}
54695473

0 commit comments

Comments
 (0)