@@ -97,6 +97,7 @@ CaptureKind TypeConverter::getDeclCaptureKind(CapturedValue capture) {
97
97
// by its address (like a var) instead.
98
98
if (var->isImmutable () &&
99
99
(!SILModuleConventions (M).useLoweredAddresses () ||
100
+ // FIXME: Expansion
100
101
!getTypeLowering (var->getType ()).isAddressOnly ()))
101
102
return CaptureKind::Constant;
102
103
@@ -323,7 +324,7 @@ namespace {
323
324
auto concreteType = getConcreteReferenceStorageReferent (referentType); \
324
325
auto &ctx = M.getASTContext (); \
325
326
if (Name##StorageType::get (concreteType, ctx) \
326
- ->isLoadable (ResilienceExpansion::Maximal )) { \
327
+ ->isLoadable (Expansion )) { \
327
328
return asImpl ().visitLoadable ##Name##StorageType (type); \
328
329
} else { \
329
330
return asImpl ().visitAddressOnly ##Name##StorageType (type); \
@@ -458,14 +459,14 @@ namespace {
458
459
459
460
// Consult the type lowering.
460
461
type = getSubstitutedTypeForTypeLowering (type);
461
- auto &lowering = M.Types .getTypeLowering (type);
462
+ auto &lowering = M.Types .getTypeLowering (type, Expansion );
462
463
return handleClassificationFromLowering (type, lowering);
463
464
}
464
465
465
466
RecursiveProperties visitAnyStructType (CanType type, StructDecl *D) {
466
467
// Consult the type lowering.
467
468
type = getSubstitutedTypeForTypeLowering (type);
468
- auto &lowering = M.Types .getTypeLowering (type);
469
+ auto &lowering = M.Types .getTypeLowering (type, Expansion );
469
470
return handleClassificationFromLowering (type, lowering);
470
471
}
471
472
@@ -850,6 +851,7 @@ namespace {
850
851
unsigned index = 0 ;
851
852
for (auto elt : tupleTy.getElementTypes ()) {
852
853
auto silElt = SILType::getPrimitiveType (elt, silTy.getCategory ());
854
+ // FIXME: Expansion
853
855
children.push_back (Child{index, M.Types .getTypeLowering (silElt)});
854
856
++index;
855
857
}
@@ -884,6 +886,7 @@ namespace {
884
886
885
887
for (auto prop : structDecl->getStoredProperties ()) {
886
888
SILType propTy = silTy.getFieldType (prop, M);
889
+ // FIXME: Expansion
887
890
children.push_back (Child{prop, M.Types .getTypeLowering (propTy)});
888
891
}
889
892
}
@@ -1161,7 +1164,7 @@ namespace {
1161
1164
}
1162
1165
1163
1166
TypeLowering *handleAddressOnly (CanType type,
1164
- RecursiveProperties properties) {
1167
+ RecursiveProperties properties) {
1165
1168
if (SILModuleConventions (M).useLoweredAddresses ()) {
1166
1169
auto silType = SILType::getPrimitiveAddressType (type);
1167
1170
return new (TC, Dependent) AddressOnlyTypeLowering (silType, properties);
@@ -1187,7 +1190,7 @@ namespace {
1187
1190
TypeLowering *visitTupleType (CanTupleType tupleType) {
1188
1191
RecursiveProperties properties;
1189
1192
for (auto eltType : tupleType.getElementTypes ()) {
1190
- auto &lowering = TC.getTypeLowering (eltType);
1193
+ auto &lowering = TC.getTypeLowering (eltType, Expansion );
1191
1194
properties.addSubobject (lowering.getRecursiveProperties ());
1192
1195
}
1193
1196
@@ -1258,7 +1261,7 @@ namespace {
1258
1261
1259
1262
template <class LoadableLoweringClass >
1260
1263
TypeLowering *handleAggregateByProperties (CanType type,
1261
- RecursiveProperties props) {
1264
+ RecursiveProperties props) {
1262
1265
if (props.isAddressOnly ()) {
1263
1266
return handleAddressOnly (type, props);
1264
1267
}
@@ -1422,7 +1425,8 @@ TypeConverter::getSILFunctionType(AbstractionPattern origType,
1422
1425
1423
1426
const TypeLowering &
1424
1427
TypeConverter::getTypeLowering (AbstractionPattern origType,
1425
- Type origSubstType) {
1428
+ Type origSubstType,
1429
+ ResilienceExpansion forExpansion) {
1426
1430
CanType substType = origSubstType->getCanonicalType ();
1427
1431
auto key = getTypeKey (origType, substType);
1428
1432
@@ -1431,7 +1435,7 @@ TypeConverter::getTypeLowering(AbstractionPattern origType,
1431
1435
assert (!substType->is <InOutType>());
1432
1436
1433
1437
if (auto existing = find (key))
1434
- return * existing;
1438
+ return getTypeLoweringForExpansion (key, forExpansion, existing) ;
1435
1439
1436
1440
// Lower the type.
1437
1441
CanType loweredSubstType =
@@ -1441,7 +1445,7 @@ TypeConverter::getTypeLowering(AbstractionPattern origType,
1441
1445
// point in re-checking the table, so just construct a type lowering
1442
1446
// and cache it.
1443
1447
if (loweredSubstType == substType && key.isCacheable ()) {
1444
- return getTypeLoweringForUncachedLoweredType (key);
1448
+ return getTypeLoweringForUncachedLoweredType (key, forExpansion );
1445
1449
}
1446
1450
1447
1451
// Otherwise, check the table at a key that would be used by the
@@ -1452,7 +1456,7 @@ TypeConverter::getTypeLowering(AbstractionPattern origType,
1452
1456
auto loweredKey = getTypeKey (origTypeForCaching, loweredSubstType);
1453
1457
1454
1458
auto &lowering = getTypeLoweringForLoweredType (loweredKey,
1455
- ResilienceExpansion::Minimal );
1459
+ forExpansion );
1456
1460
insert (key, &lowering);
1457
1461
return lowering;
1458
1462
}
@@ -1582,17 +1586,22 @@ TypeConverter::getTypeLoweringForLoweredType(TypeKey key,
1582
1586
assert (type->isLegalSILType () && " type is not lowered!" );
1583
1587
(void )type;
1584
1588
1585
- // Re-using uncurry level 0 is reasonable because our uncurrying
1586
- // transforms are idempotent at this level. This means we don't
1587
- // need a ton of redundant entries in the map.
1588
1589
const TypeLowering *lowering = find (key);
1589
- if (!lowering) {
1590
- lowering = &getTypeLoweringForUncachedLoweredType (key);
1591
- }
1592
- assert (lowering-> forExpansion == ResilienceExpansion::Minimal &&
1593
- " the first lowering in the list must be for minimal expansion " );
1590
+ if (!lowering)
1591
+ lowering = &getTypeLoweringForUncachedLoweredType (key, forExpansion );
1592
+
1593
+ return getTypeLoweringForExpansion (key, forExpansion, lowering);
1594
+ }
1594
1595
1595
- if (key.isDependent () || !lowering->isResilient ()) {
1596
+ // / When we've found a type lowering for one resilience expansion,
1597
+ // / check if its the one we want; if not, walk the list until we
1598
+ // / find the right one, or create a new lowering and add it to
1599
+ // / the end of the list.
1600
+ const TypeLowering & TypeConverter::
1601
+ getTypeLoweringForExpansion (TypeKey key,
1602
+ ResilienceExpansion forExpansion,
1603
+ const TypeLowering *lowering) {
1604
+ if (!lowering->isResilient ()) {
1596
1605
// Don't try to refine the lowering for other resilience expansions if
1597
1606
// we don't expect to get a different lowering anyway.
1598
1607
return *lowering;
@@ -1622,8 +1631,9 @@ TypeConverter::getTypeLoweringForLoweredType(TypeKey key,
1622
1631
1623
1632
// / Do type-lowering for a lowered type which is not already in the cache,
1624
1633
// / then insert it into the cache.
1625
- const TypeLowering &
1626
- TypeConverter::getTypeLoweringForUncachedLoweredType (TypeKey key) {
1634
+ const TypeLowering & TypeConverter::
1635
+ getTypeLoweringForUncachedLoweredType (TypeKey key,
1636
+ ResilienceExpansion forExpansion) {
1627
1637
assert (!find (key) && " re-entrant or already cached" );
1628
1638
assert (key.SubstType ->isLegalSILType () && " type is not already lowered" );
1629
1639
@@ -1632,12 +1642,13 @@ TypeConverter::getTypeLoweringForUncachedLoweredType(TypeKey key) {
1632
1642
insert (key, nullptr );
1633
1643
#endif
1634
1644
1635
- // FIXME: Get expansion from SILFunction
1636
1645
auto *theInfo = LowerType (*this ,
1637
1646
CanGenericSignature (),
1638
- ResilienceExpansion::Minimal ,
1647
+ forExpansion ,
1639
1648
key.isDependent ()).visit (key.SubstType );
1640
1649
1650
+ theInfo->forExpansion = forExpansion;
1651
+
1641
1652
if (key.OrigType .isForeign ()) {
1642
1653
assert (theInfo->isLoadable () && " Cannot lower address-only type with "
1643
1654
" foreign abstraction pattern" );
@@ -2492,6 +2503,7 @@ CanSILBoxType TypeConverter::getBoxTypeForEnumElement(SILType enumType,
2492
2503
static void countNumberOfInnerFields (unsigned &fieldsCount, SILModule &Module,
2493
2504
SILType Ty) {
2494
2505
if (auto *structDecl = Ty.getStructOrBoundGenericStruct ()) {
2506
+ // FIXME: Expansion
2495
2507
assert (!structDecl->isResilient (Module.getSwiftModule (),
2496
2508
ResilienceExpansion::Minimal) &&
2497
2509
" FSO should not be trying to explode resilient (ie address-only) "
@@ -2519,6 +2531,7 @@ static void countNumberOfInnerFields(unsigned &fieldsCount, SILModule &Module,
2519
2531
if (enumDecl->isIndirect ()) {
2520
2532
return ;
2521
2533
}
2534
+ // FIXME: Expansion
2522
2535
assert (!enumDecl->isResilient (Module.getSwiftModule (),
2523
2536
ResilienceExpansion::Minimal) &&
2524
2537
" FSO should not be trying to explode resilient (ie address-only) "
0 commit comments