@@ -476,6 +476,8 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
476
476
477
477
// / Return the size reported by a type.
478
478
static unsigned getSizeInBits (llvm::DIType *Ty) {
479
+ if (!Ty)
480
+ return 0 ;
479
481
// Follow derived types until we reach a type that
480
482
// reports back a size.
481
483
while (isa<llvm::DIDerivedType>(Ty) && !Ty->getSizeInBits ()) {
@@ -1103,20 +1105,17 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1103
1105
BumpAllocatedString (CanonicalName)};
1104
1106
}
1105
1107
1106
- llvm::DIDerivedType *createMemberType (DebugTypeInfo DbgTy, StringRef Name,
1107
- unsigned &OffsetInBits,
1108
- llvm::DIScope *Scope,
1109
- llvm::DIFile *File,
1110
- llvm::DINode::DIFlags Flags) {
1111
- unsigned SizeOfByte = CI.getTargetInfo ().getCharWidth ();
1112
- auto *Ty = getOrCreateType (DbgTy);
1113
- auto SizeInBits = getSizeInBits (Ty);
1114
- auto *DITy = DBuilder.createMemberType (
1115
- Scope, Name, File, 0 , SizeInBits, 0 , OffsetInBits, Flags, Ty);
1108
+ llvm::DIDerivedType *
1109
+ createMemberType (llvm::DIType *DITy, StringRef Name, unsigned &OffsetInBits,
1110
+ unsigned AlignInBits, llvm::DIScope *Scope,
1111
+ llvm::DIFile *File, llvm::DINode::DIFlags Flags) {
1112
+ auto SizeInBits = getSizeInBits (DITy);
1113
+ llvm::DIDerivedType *DIMemberTy = DBuilder.createMemberType (
1114
+ Scope, Name, File, 0 , SizeInBits, 0 , OffsetInBits, Flags, DITy);
1116
1115
OffsetInBits += SizeInBits;
1117
- OffsetInBits = llvm::alignTo (OffsetInBits,
1118
- SizeOfByte * DbgTy. getAlignment (). getValue () );
1119
- return DITy ;
1116
+ if (AlignInBits)
1117
+ OffsetInBits = llvm::alignTo (OffsetInBits, AlignInBits );
1118
+ return DIMemberTy ;
1120
1119
}
1121
1120
1122
1121
// / Creates a temporary replaceable forward decl to protect against recursion.
@@ -1146,6 +1145,17 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1146
1145
return FwdDecl;
1147
1146
}
1148
1147
1148
+ using TrackingDIType = llvm::TypedTrackingMDRef<llvm::DIType>;
1149
+ struct MemberDIType {
1150
+ StringRef Name;
1151
+ unsigned AlignInBits;
1152
+ TrackingDIType DIType;
1153
+ MemberDIType (StringRef Name, unsigned AlignInBits, llvm::DIType *DIType)
1154
+ : Name(Name), AlignInBits(AlignInBits), DIType(DIType) {}
1155
+ };
1156
+
1157
+ unsigned getByteSize () { return CI.getTargetInfo ().getCharWidth (); }
1158
+
1149
1159
llvm::DICompositeType *createStructType (
1150
1160
NominalOrBoundGenericNominalType *Type, NominalTypeDecl *Decl,
1151
1161
llvm::DIScope *Scope, llvm::DIFile *File, unsigned Line,
@@ -1156,28 +1166,36 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1156
1166
Type, Scope, File, Line, SizeInBits, AlignInBits, Flags, MangledName,
1157
1167
Name);
1158
1168
// Collect the members.
1159
- SmallVector<llvm::Metadata *, 16 > Elements;
1160
- unsigned OffsetInBits = 0 ;
1169
+ SmallVector<MemberDIType, 16 > MemberTypes;
1161
1170
for (VarDecl *VD : Decl->getStoredProperties ()) {
1162
1171
auto memberTy = Type->getTypeOfMember (VD);
1163
1172
if (auto DbgTy = CompletedDebugTypeInfo::getFromTypeInfo (
1164
1173
memberTy,
1165
1174
IGM.getTypeInfoForUnlowered (
1166
1175
IGM.getSILTypes ().getAbstractionPattern (VD), memberTy),
1167
1176
IGM))
1168
- Elements.push_back (createMemberType (*DbgTy, VD->getName ().str (),
1169
- OffsetInBits, Scope, File, Flags));
1177
+ MemberTypes.emplace_back (VD->getName ().str (),
1178
+ getByteSize () *
1179
+ DbgTy->getAlignment ().getValue (),
1180
+ getOrCreateType (*DbgTy));
1170
1181
else
1171
1182
// Without complete type info we can only create a forward decl.
1172
1183
return DBuilder.createForwardDecl (
1173
1184
llvm::dwarf::DW_TAG_structure_type, MangledName, Scope, File, Line,
1174
1185
llvm::dwarf::DW_LANG_Swift, SizeInBits, 0 );
1175
1186
}
1176
1187
1188
+ SmallVector<llvm::Metadata *, 16 > Members;
1189
+ unsigned OffsetInBits = 0 ;
1190
+ for (auto &Member : MemberTypes)
1191
+ Members.push_back (createMemberType (Member.DIType , Member.Name ,
1192
+ OffsetInBits, Member.AlignInBits ,
1193
+ Scope, File, Flags));
1194
+
1177
1195
llvm::DINodeArray BoundParams = collectGenericParams (Type);
1178
1196
llvm::DICompositeType *DITy = createStruct (
1179
1197
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, MangledName,
1180
- DBuilder.getOrCreateArray (Elements ), BoundParams, SpecificationOf);
1198
+ DBuilder.getOrCreateArray (Members ), BoundParams, SpecificationOf);
1181
1199
return DBuilder.replaceTemporary (std::move (FwdDecl), DITy);
1182
1200
}
1183
1201
@@ -1203,24 +1221,29 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1203
1221
DbgTy.getType (), Scope, File, Line, SizeInBits, AlignInBits, Flags,
1204
1222
UniqueID, Name);
1205
1223
// Collect the members.
1206
- SmallVector<llvm::Metadata * , 16 > Elements ;
1224
+ SmallVector<MemberDIType , 16 > MemberTypes ;
1207
1225
for (VarDecl *VD : Decl->getStoredProperties ()) {
1208
- auto memberTy =
1209
- UnsubstitutedType->getTypeOfMember (VD);
1226
+ Type memberTy = UnsubstitutedType->getTypeOfMember (VD);
1210
1227
auto DbgTy = DebugTypeInfo::getFromTypeInfo (
1211
1228
memberTy,
1212
1229
IGM.getTypeInfoForUnlowered (
1213
1230
IGM.getSILTypes ().getAbstractionPattern (VD), memberTy),
1214
1231
IGM);
1232
+ MemberTypes.emplace_back (VD->getName ().str (),
1233
+ getByteSize () * DbgTy.getAlignment ().getValue (),
1234
+ getOrCreateType (DbgTy));
1235
+ }
1236
+ SmallVector<llvm::Metadata *, 16 > Members;
1237
+ for (auto &Member : MemberTypes) {
1215
1238
unsigned OffsetInBits = 0 ;
1216
- llvm::DIType *DITy = createMemberType (DbgTy, VD-> getName (). str () ,
1217
- OffsetInBits, Scope, File, Flags);
1218
- Elements. push_back (DITy );
1239
+ Members. push_back ( createMemberType (Member. DIType , Member. Name ,
1240
+ OffsetInBits, Member. AlignInBits ,
1241
+ Scope, File, Flags) );
1219
1242
}
1220
1243
1221
1244
llvm::DICompositeType *DITy = DBuilder.createStructType (
1222
1245
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, DerivedFrom,
1223
- DBuilder.getOrCreateArray (Elements ), RuntimeLang, nullptr , UniqueID);
1246
+ DBuilder.getOrCreateArray (Members ), RuntimeLang, nullptr , UniqueID);
1224
1247
return DBuilder.replaceTemporary (std::move (FwdDecl), DITy);
1225
1248
}
1226
1249
@@ -1410,7 +1433,8 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1410
1433
auto FwdDecl = createTemporaryReplaceableForwardDecl (
1411
1434
DbgTy.getType (), Scope, File, Line, SizeInBits, AlignInBits, Flags,
1412
1435
MangledName, Name);
1413
- SmallVector<llvm::Metadata *, 16 > Elements;
1436
+
1437
+ SmallVector<MemberDIType, 16 > MemberTypes;
1414
1438
for (auto *ElemDecl : Decl->getAllElements ()) {
1415
1439
std::optional<CompletedDebugTypeInfo> ElemDbgTy;
1416
1440
if (auto PayloadTy = ElemDecl->getPayloadInterfaceType ()) {
@@ -1429,23 +1453,27 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1429
1453
llvm::dwarf::DW_TAG_structure_type, Name, Scope, File, Line,
1430
1454
llvm::dwarf::DW_LANG_Swift, SizeInBits, 0 , MangledName);
1431
1455
}
1432
- unsigned Offset = 0 ;
1433
- auto MTy =
1434
- createMemberType (*ElemDbgTy, ElemDecl->getBaseIdentifier ().str (),
1435
- Offset, Scope, File, Flags);
1436
- Elements.push_back (MTy);
1456
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (),
1457
+ getByteSize () *
1458
+ ElemDbgTy->getAlignment ().getValue (),
1459
+ TrackingDIType (getOrCreateType (*ElemDbgTy)));
1437
1460
} else {
1438
1461
// A variant with no payload.
1439
- auto MTy = DBuilder.createMemberType (
1440
- Scope, ElemDecl->getBaseIdentifier ().str (), File, 0 , 0 , 0 , 0 , Flags,
1441
- nullptr );
1442
- Elements.push_back (MTy);
1462
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (), 0 ,
1463
+ nullptr );
1443
1464
}
1444
1465
}
1466
+ SmallVector<llvm::Metadata *, 16 > Members;
1467
+ for (auto &Member : MemberTypes) {
1468
+ unsigned Offset = 0 ;
1469
+ Members.push_back (createMemberType (Member.DIType , Member.Name , Offset,
1470
+ Member.AlignInBits , Scope, File,
1471
+ Flags));
1472
+ }
1445
1473
1446
1474
auto VPTy = DBuilder.createVariantPart (
1447
1475
Scope, {}, File, Line, SizeInBits, AlignInBits, Flags, nullptr ,
1448
- DBuilder.getOrCreateArray (Elements ), /* UniqueIdentifier=*/ " " );
1476
+ DBuilder.getOrCreateArray (Members ), /* UniqueIdentifier=*/ " " );
1449
1477
1450
1478
llvm::DICompositeType *DITy = DBuilder.createStructType (
1451
1479
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, nullptr ,
@@ -1474,31 +1502,35 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1474
1502
DbgTy.getType (), Scope, File, Line, SizeInBits, AlignInBits, Flags,
1475
1503
MangledName, Name);
1476
1504
1477
- SmallVector<llvm::Metadata * , 16 > Elements ;
1505
+ SmallVector<MemberDIType , 16 > MemberTypes ;
1478
1506
for (auto *ElemDecl : Decl->getAllElements ()) {
1479
1507
std::optional<DebugTypeInfo> ElemDbgTy;
1480
1508
if (auto PayloadTy = ElemDecl->getPayloadInterfaceType ()) {
1481
1509
// A variant case which carries a payload.
1482
1510
PayloadTy = ElemDecl->getParentEnum ()->mapTypeIntoContext (PayloadTy);
1483
1511
ElemDbgTy = DebugTypeInfo::getFromTypeInfo (
1484
1512
PayloadTy, IGM.getTypeInfoForUnlowered (PayloadTy), IGM);
1485
- unsigned Offset = 0 ;
1486
- auto MTy =
1487
- createMemberType (*ElemDbgTy, ElemDecl->getBaseIdentifier ().str (),
1488
- Offset, Scope, File, Flags);
1489
- Elements.push_back (MTy);
1513
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (),
1514
+ getByteSize () *
1515
+ ElemDbgTy->getAlignment ().getValue (),
1516
+ TrackingDIType (getOrCreateType (*ElemDbgTy)));
1490
1517
} else {
1491
1518
// A variant with no payload.
1492
- auto MTy = DBuilder.createMemberType (
1493
- Scope, ElemDecl->getBaseIdentifier ().str (), File, 0 , 0 , 0 , 0 , Flags,
1494
- nullptr );
1495
- Elements.push_back (MTy);
1519
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (), 0 ,
1520
+ nullptr );
1496
1521
}
1497
1522
}
1523
+ SmallVector<llvm::Metadata *, 16 > Members;
1524
+ for (auto &Member : MemberTypes) {
1525
+ unsigned Offset = 0 ;
1526
+ Members.push_back (createMemberType (Member.DIType , Member.Name , Offset,
1527
+ Member.AlignInBits , Scope, File,
1528
+ Flags));
1529
+ }
1498
1530
1499
1531
auto VPTy = DBuilder.createVariantPart (Scope, {}, File, Line, SizeInBits,
1500
1532
AlignInBits, Flags, nullptr ,
1501
- DBuilder.getOrCreateArray (Elements ));
1533
+ DBuilder.getOrCreateArray (Members ));
1502
1534
1503
1535
llvm::DICompositeType *DITy = DBuilder.createStructType (
1504
1536
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, nullptr ,
@@ -1721,31 +1753,37 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1721
1753
unsigned SizeInBits, unsigned AlignInBits,
1722
1754
llvm::DINode::DIFlags Flags,
1723
1755
StringRef MangledName) {
1756
+ auto FwdDecl = createTemporaryReplaceableForwardDecl (
1757
+ DbgTy.getType (), Scope, MainFile, 0 , SizeInBits, AlignInBits, Flags,
1758
+ MangledName, MangledName);
1759
+
1724
1760
TypeBase *BaseTy = DbgTy.getType ();
1725
1761
auto *TupleTy = BaseTy->castTo <TupleType>();
1726
1762
1727
- SmallVector<llvm::Metadata *, 16 > Elements;
1728
- unsigned OffsetInBits = 0 ;
1763
+ SmallVector<MemberDIType, 16 > MemberTypes;
1729
1764
auto genericSig = IGM.getCurGenericContext ();
1730
1765
for (auto ElemTy : TupleTy->getElementTypes ()) {
1731
1766
auto &elemTI = IGM.getTypeInfoForUnlowered (
1732
1767
AbstractionPattern (genericSig, ElemTy->getCanonicalType ()), ElemTy);
1733
1768
auto DbgTy =
1734
1769
DebugTypeInfo::getFromTypeInfo (ElemTy, elemTI, IGM);
1735
- Elements.push_back (
1736
- createMemberType (DbgTy, " " , OffsetInBits, Scope, MainFile, Flags));
1770
+ MemberTypes.emplace_back (" " ,
1771
+ getByteSize () * DbgTy.getAlignment ().getValue (),
1772
+ getOrCreateType (DbgTy));
1737
1773
}
1774
+ SmallVector<llvm::Metadata *, 16 > Members;
1775
+ unsigned OffsetInBits = 0 ;
1776
+ for (auto &Member : MemberTypes)
1777
+ Members.emplace_back (createMemberType (Member.DIType , Member.Name ,
1778
+ OffsetInBits, Member.AlignInBits ,
1779
+ Scope, MainFile, Flags));
1738
1780
// FIXME: assert that SizeInBits == OffsetInBits.
1739
1781
1740
- auto FwdDecl = createTemporaryReplaceableForwardDecl (
1741
- DbgTy.getType (), Scope, MainFile, 0 , SizeInBits, AlignInBits, Flags,
1742
- MangledName, MangledName);
1743
-
1744
1782
llvm::DICompositeType *DITy = DBuilder.createStructType (
1745
1783
Scope, MangledName, MainFile, 0 , SizeInBits, AlignInBits, Flags,
1746
1784
nullptr , // DerivedFrom
1747
- DBuilder.getOrCreateArray (Elements ), llvm::dwarf::DW_LANG_Swift,
1748
- nullptr , MangledName);
1785
+ DBuilder.getOrCreateArray (Members ), llvm::dwarf::DW_LANG_Swift, nullptr ,
1786
+ MangledName);
1749
1787
1750
1788
return DBuilder.replaceTemporary (std::move (FwdDecl), DITy);
1751
1789
}
0 commit comments