@@ -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.
@@ -1125,12 +1124,16 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1125
1124
unsigned SizeInBits, unsigned AlignInBits, llvm::DINode::DIFlags Flags,
1126
1125
StringRef MangledName, StringRef Name) {
1127
1126
#ifndef NDEBUG
1128
- if (MangledName.empty ())
1129
- assert (!Name.empty () &&
1130
- " no mangled name and no human readable name given" );
1131
- else
1132
- assert (swift::Demangle::isMangledName (MangledName) &&
1133
- " UID is not a mangled name" );
1127
+ {
1128
+ if (MangledName.empty ())
1129
+ assert (!Name.empty () &&
1130
+ " no mangled name and no human readable name given" );
1131
+ else
1132
+ assert (swift::Demangle::isMangledName (MangledName) &&
1133
+ " UID is not a mangled name" );
1134
+ auto UID = llvm::MDString::get (IGM.getLLVMContext (), MangledName);
1135
+ assert (DIRefMap.count (UID) == 0 && " type is already cached" );
1136
+ }
1134
1137
#endif
1135
1138
auto ReplaceableType = DBuilder.createReplaceableCompositeType (
1136
1139
llvm::dwarf::DW_TAG_structure_type, " " , Scope, File, Line,
@@ -1146,6 +1149,17 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1146
1149
return FwdDecl;
1147
1150
}
1148
1151
1152
+ using TrackingDIType = llvm::TypedTrackingMDRef<llvm::DIType>;
1153
+ struct MemberDIType {
1154
+ StringRef Name;
1155
+ unsigned AlignInBits;
1156
+ TrackingDIType DIType;
1157
+ MemberDIType (StringRef Name, unsigned AlignInBits, llvm::DIType *DIType)
1158
+ : Name(Name), AlignInBits(AlignInBits), DIType(DIType) {}
1159
+ };
1160
+
1161
+ unsigned getByteSize () { return CI.getTargetInfo ().getCharWidth (); }
1162
+
1149
1163
llvm::DICompositeType *createStructType (
1150
1164
NominalOrBoundGenericNominalType *Type, NominalTypeDecl *Decl,
1151
1165
llvm::DIScope *Scope, llvm::DIFile *File, unsigned Line,
@@ -1156,28 +1170,36 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1156
1170
Type, Scope, File, Line, SizeInBits, AlignInBits, Flags, MangledName,
1157
1171
Name);
1158
1172
// Collect the members.
1159
- SmallVector<llvm::Metadata *, 16 > Elements;
1160
- unsigned OffsetInBits = 0 ;
1173
+ SmallVector<MemberDIType, 16 > MemberTypes;
1161
1174
for (VarDecl *VD : Decl->getStoredProperties ()) {
1162
1175
auto memberTy = Type->getTypeOfMember (VD);
1163
1176
if (auto DbgTy = CompletedDebugTypeInfo::getFromTypeInfo (
1164
1177
memberTy,
1165
1178
IGM.getTypeInfoForUnlowered (
1166
1179
IGM.getSILTypes ().getAbstractionPattern (VD), memberTy),
1167
1180
IGM))
1168
- Elements.push_back (createMemberType (*DbgTy, VD->getName ().str (),
1169
- OffsetInBits, Scope, File, Flags));
1181
+ MemberTypes.emplace_back (VD->getName ().str (),
1182
+ getByteSize () *
1183
+ DbgTy->getAlignment ().getValue (),
1184
+ getOrCreateType (*DbgTy));
1170
1185
else
1171
1186
// Without complete type info we can only create a forward decl.
1172
1187
return DBuilder.createForwardDecl (
1173
1188
llvm::dwarf::DW_TAG_structure_type, MangledName, Scope, File, Line,
1174
1189
llvm::dwarf::DW_LANG_Swift, SizeInBits, 0 );
1175
1190
}
1176
1191
1192
+ SmallVector<llvm::Metadata *, 16 > Members;
1193
+ unsigned OffsetInBits = 0 ;
1194
+ for (auto &Member : MemberTypes)
1195
+ Members.push_back (createMemberType (Member.DIType , Member.Name ,
1196
+ OffsetInBits, Member.AlignInBits ,
1197
+ Scope, File, Flags));
1198
+
1177
1199
llvm::DINodeArray BoundParams = collectGenericParams (Type);
1178
1200
llvm::DICompositeType *DITy = createStruct (
1179
1201
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, MangledName,
1180
- DBuilder.getOrCreateArray (Elements ), BoundParams, SpecificationOf);
1202
+ DBuilder.getOrCreateArray (Members ), BoundParams, SpecificationOf);
1181
1203
return DBuilder.replaceTemporary (std::move (FwdDecl), DITy);
1182
1204
}
1183
1205
@@ -1203,24 +1225,32 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1203
1225
DbgTy.getType (), Scope, File, Line, SizeInBits, AlignInBits, Flags,
1204
1226
UniqueID , Name);
1205
1227
// Collect the members.
1206
- SmallVector<llvm::Metadata * , 16 > Elements ;
1228
+ SmallVector<MemberDIType , 16 > MemberTypes ;
1207
1229
for (VarDecl *VD : Decl->getStoredProperties ()) {
1208
- auto memberTy =
1209
- UnsubstitutedType->getTypeOfMember (VD);
1230
+ Type memberTy = UnsubstitutedType->getTypeOfMember (VD);
1210
1231
auto DbgTy = DebugTypeInfo::getFromTypeInfo (
1211
1232
memberTy,
1212
1233
IGM.getTypeInfoForUnlowered (
1213
1234
IGM.getSILTypes ().getAbstractionPattern (VD), memberTy),
1214
1235
IGM);
1236
+ MemberTypes.emplace_back (VD->getName ().str (),
1237
+ getByteSize () * DbgTy.getAlignment ().getValue (),
1238
+ getOrCreateType (DbgTy));
1239
+ }
1240
+ SmallVector<llvm::Metadata *, 16 > Members;
1241
+ for (auto &Member : MemberTypes) {
1215
1242
unsigned OffsetInBits = 0 ;
1216
- llvm::DIType *DITy = createMemberType (DbgTy, VD->getName ().str (),
1217
- OffsetInBits, Scope, File, Flags);
1218
- Elements.push_back (DITy);
1243
+ auto *member = createMemberType (Member.DIType , Member.Name ,
1244
+ OffsetInBits, Member.AlignInBits ,
1245
+ Scope, File, Flags);
1246
+ member->dump ();
1247
+ Members.push_back (member);
1219
1248
}
1220
1249
1221
1250
llvm::DICompositeType *DITy = DBuilder.createStructType (
1222
1251
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, DerivedFrom,
1223
- DBuilder.getOrCreateArray (Elements), RuntimeLang, nullptr , UniqueID );
1252
+ DBuilder.getOrCreateArray (Members), RuntimeLang, nullptr , UniqueID );
1253
+ DITy->dump ();
1224
1254
return DBuilder.replaceTemporary (std::move (FwdDecl), DITy);
1225
1255
}
1226
1256
@@ -1290,20 +1320,15 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1290
1320
if (!Decl)
1291
1321
return nullptr ;
1292
1322
1293
- // This temporary forward decl seems to be redundant. Can it be removed?
1294
- StringRef Name = Decl->getName ().str ();
1295
- auto FwdDecl = createTemporaryReplaceableForwardDecl (
1296
- Type, Scope, File, Line, SizeInBits, AlignInBits, Flags, MangledName,
1297
- Name);
1298
-
1299
1323
auto [IsUnsubstitued, UnsubstitutedType] =
1300
1324
getUnsubstitutedType (Type, MangledName);
1301
1325
auto UnsubstitutedDbgTy = DebugTypeInfo::getFromTypeInfo (
1302
1326
UnsubstitutedType, IGM.getTypeInfoForUnlowered (UnsubstitutedType), IGM);
1303
- if (IsUnsubstitued)
1327
+ if (IsUnsubstitued) {
1304
1328
return createUnsubstitutedGenericStructOrClassType (
1305
1329
UnsubstitutedDbgTy, Decl, UnsubstitutedType, Scope, File, Line, Flags,
1306
1330
nullptr , llvm::dwarf::DW_LANG_Swift, MangledName);
1331
+ }
1307
1332
1308
1333
// Force the creation of the unsubstituted type, don't create it
1309
1334
// directly so it goes through all the caching/verification logic.
@@ -1338,7 +1363,7 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1338
1363
Scope, Decl ? Decl->getNameStr () : " " , File, Line, SizeInBits,
1339
1364
AlignInBits, Flags, MangledName, collectGenericParams (Type),
1340
1365
UnsubstitutedDITy);
1341
- return DBuilder. replaceTemporary ( std::move (FwdDecl), SpecializedDITy) ;
1366
+ return SpecializedDITy;
1342
1367
}
1343
1368
1344
1369
// / Create debug information for an enum with a raw type (enum E : Int {}).
@@ -1410,7 +1435,8 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1410
1435
auto FwdDecl = createTemporaryReplaceableForwardDecl (
1411
1436
DbgTy.getType (), Scope, File, Line, SizeInBits, AlignInBits, Flags,
1412
1437
MangledName, Name);
1413
- SmallVector<llvm::Metadata *, 16 > Elements;
1438
+
1439
+ SmallVector<MemberDIType, 16 > MemberTypes;
1414
1440
for (auto *ElemDecl : Decl->getAllElements ()) {
1415
1441
std::optional<CompletedDebugTypeInfo> ElemDbgTy;
1416
1442
if (auto PayloadTy = ElemDecl->getPayloadInterfaceType ()) {
@@ -1429,23 +1455,27 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1429
1455
llvm::dwarf::DW_TAG_structure_type, Name, Scope, File, Line,
1430
1456
llvm::dwarf::DW_LANG_Swift, SizeInBits, 0 , MangledName);
1431
1457
}
1432
- unsigned Offset = 0 ;
1433
- auto MTy =
1434
- createMemberType (*ElemDbgTy, ElemDecl->getBaseIdentifier ().str (),
1435
- Offset, Scope, File, Flags);
1436
- Elements.push_back (MTy);
1458
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (),
1459
+ getByteSize () *
1460
+ ElemDbgTy->getAlignment ().getValue (),
1461
+ TrackingDIType (getOrCreateType (*ElemDbgTy)));
1437
1462
} else {
1438
1463
// 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);
1464
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (), 0 ,
1465
+ nullptr );
1443
1466
}
1444
1467
}
1468
+ SmallVector<llvm::Metadata *, 16 > Members;
1469
+ for (auto &Member : MemberTypes) {
1470
+ unsigned Offset = 0 ;
1471
+ Members.push_back (createMemberType (Member.DIType , Member.Name , Offset,
1472
+ Member.AlignInBits , Scope, File,
1473
+ Flags));
1474
+ }
1445
1475
1446
1476
auto VPTy = DBuilder.createVariantPart (
1447
1477
Scope, {}, File, Line, SizeInBits, AlignInBits, Flags, nullptr ,
1448
- DBuilder.getOrCreateArray (Elements ), /* UniqueIdentifier=*/ " " );
1478
+ DBuilder.getOrCreateArray (Members ), /* UniqueIdentifier=*/ " " );
1449
1479
1450
1480
llvm::DICompositeType *DITy = DBuilder.createStructType (
1451
1481
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, nullptr ,
@@ -1474,31 +1504,35 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1474
1504
DbgTy.getType (), Scope, File, Line, SizeInBits, AlignInBits, Flags,
1475
1505
MangledName, Name);
1476
1506
1477
- SmallVector<llvm::Metadata * , 16 > Elements ;
1507
+ SmallVector<MemberDIType , 16 > MemberTypes ;
1478
1508
for (auto *ElemDecl : Decl->getAllElements ()) {
1479
1509
std::optional<DebugTypeInfo> ElemDbgTy;
1480
1510
if (auto PayloadTy = ElemDecl->getPayloadInterfaceType ()) {
1481
1511
// A variant case which carries a payload.
1482
1512
PayloadTy = ElemDecl->getParentEnum ()->mapTypeIntoContext (PayloadTy);
1483
1513
ElemDbgTy = DebugTypeInfo::getFromTypeInfo (
1484
1514
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);
1515
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (),
1516
+ getByteSize () *
1517
+ ElemDbgTy->getAlignment ().getValue (),
1518
+ TrackingDIType (getOrCreateType (*ElemDbgTy)));
1490
1519
} else {
1491
1520
// 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);
1521
+ MemberTypes.emplace_back (ElemDecl->getBaseIdentifier ().str (), 0 ,
1522
+ nullptr );
1496
1523
}
1497
1524
}
1525
+ SmallVector<llvm::Metadata *, 16 > Members;
1526
+ for (auto &Member : MemberTypes) {
1527
+ unsigned Offset = 0 ;
1528
+ Members.push_back (createMemberType (Member.DIType , Member.Name , Offset,
1529
+ Member.AlignInBits , Scope, File,
1530
+ Flags));
1531
+ }
1498
1532
1499
1533
auto VPTy = DBuilder.createVariantPart (Scope, {}, File, Line, SizeInBits,
1500
1534
AlignInBits, Flags, nullptr ,
1501
- DBuilder.getOrCreateArray (Elements ));
1535
+ DBuilder.getOrCreateArray (Members ));
1502
1536
1503
1537
llvm::DICompositeType *DITy = DBuilder.createStructType (
1504
1538
Scope, Name, File, Line, SizeInBits, AlignInBits, Flags, nullptr ,
@@ -1721,31 +1755,37 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
1721
1755
unsigned SizeInBits, unsigned AlignInBits,
1722
1756
llvm::DINode::DIFlags Flags,
1723
1757
StringRef MangledName) {
1758
+ auto FwdDecl = createTemporaryReplaceableForwardDecl (
1759
+ DbgTy.getType (), Scope, MainFile, 0 , SizeInBits, AlignInBits, Flags,
1760
+ MangledName, MangledName);
1761
+
1724
1762
TypeBase *BaseTy = DbgTy.getType ();
1725
1763
auto *TupleTy = BaseTy->castTo <TupleType>();
1726
1764
1727
- SmallVector<llvm::Metadata *, 16 > Elements;
1728
- unsigned OffsetInBits = 0 ;
1765
+ SmallVector<MemberDIType, 16 > MemberTypes;
1729
1766
auto genericSig = IGM.getCurGenericContext ();
1730
1767
for (auto ElemTy : TupleTy->getElementTypes ()) {
1731
1768
auto &elemTI = IGM.getTypeInfoForUnlowered (
1732
1769
AbstractionPattern (genericSig, ElemTy->getCanonicalType ()), ElemTy);
1733
1770
auto DbgTy =
1734
1771
DebugTypeInfo::getFromTypeInfo (ElemTy, elemTI, IGM);
1735
- Elements.push_back (
1736
- createMemberType (DbgTy, " " , OffsetInBits, Scope, MainFile, Flags));
1772
+ MemberTypes.emplace_back (" " ,
1773
+ getByteSize () * DbgTy.getAlignment ().getValue (),
1774
+ getOrCreateType (DbgTy));
1737
1775
}
1776
+ SmallVector<llvm::Metadata *, 16 > Members;
1777
+ unsigned OffsetInBits = 0 ;
1778
+ for (auto &Member : MemberTypes)
1779
+ Members.emplace_back (createMemberType (Member.DIType , Member.Name ,
1780
+ OffsetInBits, Member.AlignInBits ,
1781
+ Scope, MainFile, Flags));
1738
1782
// FIXME: assert that SizeInBits == OffsetInBits.
1739
1783
1740
- auto FwdDecl = createTemporaryReplaceableForwardDecl (
1741
- DbgTy.getType (), Scope, MainFile, 0 , SizeInBits, AlignInBits, Flags,
1742
- MangledName, MangledName);
1743
-
1744
1784
llvm::DICompositeType *DITy = DBuilder.createStructType (
1745
1785
Scope, MangledName, MainFile, 0 , SizeInBits, AlignInBits, Flags,
1746
1786
nullptr , // DerivedFrom
1747
- DBuilder.getOrCreateArray (Elements ), llvm::dwarf::DW_LANG_Swift,
1748
- nullptr , MangledName);
1787
+ DBuilder.getOrCreateArray (Members ), llvm::dwarf::DW_LANG_Swift, nullptr ,
1788
+ MangledName);
1749
1789
1750
1790
return DBuilder.replaceTemporary (std::move (FwdDecl), DITy);
1751
1791
}
@@ -2606,12 +2646,17 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
2606
2646
auto *DITy = cast<llvm::DIType>(CachedTy);
2607
2647
assert (sanityCheckCachedType (DbgTy, DITy));
2608
2648
return DITy;
2649
+ } else {
2650
+ UID = llvm::MDString::get (IGM.getLLVMContext (), Mangled.Canonical );
2651
+ if (llvm::Metadata *CachedTy = DIRefMap.lookup (UID))
2652
+ return cast<llvm::DIType>(CachedTy);
2609
2653
}
2610
2654
}
2611
2655
2612
2656
Scope = updateScope (Scope, DbgTy);
2613
2657
StringRef MangledName =
2614
2658
!Mangled.Sugared .empty () ? Mangled.Sugared : Mangled.Canonical ;
2659
+
2615
2660
StringRef Name = MangledName;
2616
2661
if (auto *Decl = DbgTy.getDecl ())
2617
2662
Name = Decl->getName ().str ();
@@ -2637,7 +2682,6 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
2637
2682
}
2638
2683
llvm::DIType *DITy = createType (DbgTy, MangledName, Scope, getFile (Scope));
2639
2684
2640
-
2641
2685
if (!shouldCacheDIType (DITy, DbgTy))
2642
2686
return DITy;
2643
2687
0 commit comments