@@ -519,8 +519,9 @@ namespace {
519
519
class LoadableTypeLowering : public TypeLowering {
520
520
protected:
521
521
LoadableTypeLowering (SILType type, RecursiveProperties properties,
522
- IsReferenceCounted_t isRefCounted)
523
- : TypeLowering(type, properties, isRefCounted) {}
522
+ IsReferenceCounted_t isRefCounted,
523
+ ResilienceExpansion forExpansion)
524
+ : TypeLowering(type, properties, isRefCounted, forExpansion) {}
524
525
525
526
public:
526
527
void emitDestroyAddress (SILBuilder &B, SILLocation loc,
@@ -545,9 +546,9 @@ namespace {
545
546
// / A class for trivial, fixed-layout, loadable types.
546
547
class TrivialTypeLowering final : public LoadableTypeLowering {
547
548
public:
548
- TrivialTypeLowering (SILType type)
549
+ TrivialTypeLowering (SILType type, ResilienceExpansion forExpansion )
549
550
: LoadableTypeLowering(type, {IsTrivial, IsFixedABI, IsNotAddressOnly},
550
- IsNotReferenceCounted) {}
551
+ IsNotReferenceCounted, forExpansion ) {}
551
552
552
553
SILValue emitLoadOfCopy (SILBuilder &B, SILLocation loc, SILValue addr,
553
554
IsTake_t isTake) const override {
@@ -609,16 +610,18 @@ namespace {
609
610
class NonTrivialLoadableTypeLowering : public LoadableTypeLowering {
610
611
public:
611
612
NonTrivialLoadableTypeLowering (SILType type,
612
- IsReferenceCounted_t isRefCounted)
613
+ IsReferenceCounted_t isRefCounted,
614
+ ResilienceExpansion forExpansion)
613
615
: NonTrivialLoadableTypeLowering(type,
614
616
{IsNotTrivial, IsFixedABI, IsNotAddressOnly},
615
- isRefCounted) {}
617
+ isRefCounted, forExpansion ) {}
616
618
617
619
// / This constructor is necessary because of opaque-values.
618
620
NonTrivialLoadableTypeLowering (SILType type,
619
621
RecursiveProperties properties,
620
- IsReferenceCounted_t isRefCounted)
621
- : LoadableTypeLowering(type, properties, isRefCounted) {
622
+ IsReferenceCounted_t isRefCounted,
623
+ ResilienceExpansion forExpansion)
624
+ : LoadableTypeLowering(type, properties, isRefCounted, forExpansion) {
622
625
assert (!properties.isTrivial ());
623
626
}
624
627
@@ -709,9 +712,9 @@ namespace {
709
712
const = 0;
710
713
711
714
public:
712
- LoadableAggTypeLowering (CanType type)
715
+ LoadableAggTypeLowering (CanType type, ResilienceExpansion forExpansion )
713
716
: NonTrivialLoadableTypeLowering(SILType::getPrimitiveObjectType(type),
714
- IsNotReferenceCounted) {
717
+ IsNotReferenceCounted, forExpansion ) {
715
718
}
716
719
717
720
virtual SILValue rebuildAggregate (SILBuilder &B, SILLocation loc,
@@ -826,8 +829,8 @@ namespace {
826
829
class LoadableTupleTypeLowering final
827
830
: public LoadableAggTypeLowering<LoadableTupleTypeLowering, unsigned > {
828
831
public:
829
- LoadableTupleTypeLowering (CanType type)
830
- : LoadableAggTypeLowering(type) {}
832
+ LoadableTupleTypeLowering (CanType type, ResilienceExpansion forExpansion )
833
+ : LoadableAggTypeLowering(type, forExpansion ) {}
831
834
832
835
SILValue emitRValueProject (SILBuilder &B, SILLocation loc,
833
836
SILValue tupleValue, unsigned index,
@@ -862,8 +865,8 @@ namespace {
862
865
class LoadableStructTypeLowering final
863
866
: public LoadableAggTypeLowering<LoadableStructTypeLowering, VarDecl*> {
864
867
public:
865
- LoadableStructTypeLowering (CanType type)
866
- : LoadableAggTypeLowering(type) {}
868
+ LoadableStructTypeLowering (CanType type, ResilienceExpansion forExpansion )
869
+ : LoadableAggTypeLowering(type, forExpansion ) {}
867
870
868
871
SILValue emitRValueProject (SILBuilder &B, SILLocation loc,
869
872
SILValue structValue, VarDecl *field,
@@ -895,9 +898,10 @@ namespace {
895
898
// / A lowering for loadable but non-trivial enum types.
896
899
class LoadableEnumTypeLowering final : public NonTrivialLoadableTypeLowering {
897
900
public:
898
- LoadableEnumTypeLowering (CanType type)
901
+ LoadableEnumTypeLowering (CanType type, ResilienceExpansion forExpansion )
899
902
: NonTrivialLoadableTypeLowering(SILType::getPrimitiveObjectType(type),
900
- IsNotReferenceCounted) {}
903
+ IsNotReferenceCounted,
904
+ forExpansion) {}
901
905
902
906
SILValue emitCopyValue (SILBuilder &B, SILLocation loc,
903
907
SILValue value) const override {
@@ -935,8 +939,10 @@ namespace {
935
939
class LeafLoadableTypeLowering : public NonTrivialLoadableTypeLowering {
936
940
public:
937
941
LeafLoadableTypeLowering (SILType type, RecursiveProperties properties,
938
- IsReferenceCounted_t isRefCounted)
939
- : NonTrivialLoadableTypeLowering(type, properties, isRefCounted) {}
942
+ IsReferenceCounted_t isRefCounted,
943
+ ResilienceExpansion forExpansion)
944
+ : NonTrivialLoadableTypeLowering(type, properties, isRefCounted,
945
+ forExpansion) {}
940
946
941
947
SILValue emitLoweredCopyValue (SILBuilder &B, SILLocation loc,
942
948
SILValue value,
@@ -954,9 +960,9 @@ namespace {
954
960
// / loadable.
955
961
class ReferenceTypeLowering : public LeafLoadableTypeLowering {
956
962
public:
957
- ReferenceTypeLowering (SILType type)
963
+ ReferenceTypeLowering (SILType type, ResilienceExpansion forExpansion )
958
964
: LeafLoadableTypeLowering(type, RecursiveProperties::forReference(),
959
- IsReferenceCounted) {}
965
+ IsReferenceCounted, forExpansion ) {}
960
966
961
967
SILValue emitCopyValue (SILBuilder &B, SILLocation loc,
962
968
SILValue value) const override {
@@ -985,9 +991,11 @@ namespace {
985
991
#define ALWAYS_OR_SOMETIMES_LOADABLE_CHECKED_REF_STORAGE (Name, ...) \
986
992
class Loadable ##Name##TypeLowering final : public LeafLoadableTypeLowering { \
987
993
public: \
988
- Loadable##Name##TypeLowering(SILType type) \
994
+ Loadable##Name##TypeLowering(SILType type, \
995
+ ResilienceExpansion forExpansion) \
989
996
: LeafLoadableTypeLowering(type, RecursiveProperties::forReference(), \
990
- IsReferenceCounted) {} \
997
+ IsReferenceCounted, \
998
+ forExpansion) {} \
991
999
SILValue emitCopyValue (SILBuilder &B, SILLocation loc, \
992
1000
SILValue value) const override { \
993
1001
if (B.getFunction ().hasOwnership ()) \
@@ -1009,8 +1017,10 @@ namespace {
1009
1017
// / A class for non-trivial, address-only types.
1010
1018
class AddressOnlyTypeLowering : public TypeLowering {
1011
1019
public:
1012
- AddressOnlyTypeLowering (SILType type, RecursiveProperties properties)
1013
- : TypeLowering(type, properties, IsNotReferenceCounted)
1020
+ AddressOnlyTypeLowering (SILType type, RecursiveProperties properties,
1021
+ ResilienceExpansion forExpansion)
1022
+ : TypeLowering(type, properties, IsNotReferenceCounted,
1023
+ forExpansion)
1014
1024
{}
1015
1025
1016
1026
void emitCopyInto (SILBuilder &B, SILLocation loc,
@@ -1078,9 +1088,11 @@ namespace {
1078
1088
// / to catch obviously broken attempts to copy or destroy the buffer.
1079
1089
class UnsafeValueBufferTypeLowering : public AddressOnlyTypeLowering {
1080
1090
public:
1081
- UnsafeValueBufferTypeLowering (SILType type)
1091
+ UnsafeValueBufferTypeLowering (SILType type,
1092
+ ResilienceExpansion forExpansion)
1082
1093
: AddressOnlyTypeLowering(type,
1083
- {IsNotTrivial, IsFixedABI, IsAddressOnly}) {}
1094
+ {IsNotTrivial, IsFixedABI, IsAddressOnly},
1095
+ forExpansion) {}
1084
1096
1085
1097
void emitCopyInto (SILBuilder &B, SILLocation loc,
1086
1098
SILValue src, SILValue dest, IsTake_t isTake,
@@ -1106,8 +1118,10 @@ namespace {
1106
1118
// / FIXME: When you remove an unreachable, just delete the method.
1107
1119
class OpaqueValueTypeLowering : public LeafLoadableTypeLowering {
1108
1120
public:
1109
- OpaqueValueTypeLowering (SILType type, RecursiveProperties properties)
1110
- : LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted) {}
1121
+ OpaqueValueTypeLowering (SILType type, RecursiveProperties properties,
1122
+ ResilienceExpansion forExpansion)
1123
+ : LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
1124
+ forExpansion) {}
1111
1125
1112
1126
void emitCopyInto (SILBuilder &B, SILLocation loc,
1113
1127
SILValue src, SILValue dest, IsTake_t isTake,
@@ -1152,45 +1166,49 @@ namespace {
1152
1166
: TypeClassifierBase(TC.M, Sig, Expansion),
1153
1167
TC (TC), Dependent(Dependent) {}
1154
1168
1155
- TypeLowering *
1156
- handleTrivial (CanType type) {
1169
+ TypeLowering *handleTrivial (CanType type) {
1157
1170
auto silType = SILType::getPrimitiveObjectType (type);
1158
- return new (TC, Dependent) TrivialTypeLowering (silType);
1171
+ return new (TC, Dependent) TrivialTypeLowering (silType, Expansion );
1159
1172
}
1160
1173
1161
1174
TypeLowering *handleReference (CanType type) {
1162
1175
auto silType = SILType::getPrimitiveObjectType (type);
1163
- return new (TC, Dependent) ReferenceTypeLowering (silType);
1176
+ return new (TC, Dependent) ReferenceTypeLowering (silType, Expansion );
1164
1177
}
1165
1178
1166
1179
TypeLowering *handleAddressOnly (CanType type,
1167
1180
RecursiveProperties properties) {
1168
1181
if (SILModuleConventions (M).useLoweredAddresses ()) {
1169
1182
auto silType = SILType::getPrimitiveAddressType (type);
1170
- return new (TC, Dependent) AddressOnlyTypeLowering (silType, properties);
1183
+ return new (TC, Dependent) AddressOnlyTypeLowering (silType, properties,
1184
+ Expansion);
1171
1185
}
1172
1186
auto silType = SILType::getPrimitiveObjectType (type);
1173
- return new (TC, Dependent) OpaqueValueTypeLowering (silType, properties);
1187
+ return new (TC, Dependent) OpaqueValueTypeLowering (silType, properties,
1188
+ Expansion);
1174
1189
}
1175
1190
1176
1191
#define ALWAYS_LOADABLE_CHECKED_REF_STORAGE (Name, ...) \
1177
1192
TypeLowering * \
1178
1193
visit##Name##StorageType(Can##Name##StorageType type) { \
1179
1194
return new (TC, Dependent) Loadable##Name##TypeLowering ( \
1180
- SILType::getPrimitiveObjectType (type)); \
1195
+ SILType::getPrimitiveObjectType (type), \
1196
+ Expansion); \
1181
1197
}
1182
1198
#define SOMETIMES_LOADABLE_CHECKED_REF_STORAGE (Name, ...) \
1183
1199
TypeLowering * \
1184
1200
visitLoadable##Name##StorageType(Can##Name##StorageType type) { \
1185
1201
return new (TC, Dependent) Loadable##Name##TypeLowering ( \
1186
- SILType::getPrimitiveObjectType (type)); \
1202
+ SILType::getPrimitiveObjectType (type), \
1203
+ Expansion); \
1187
1204
}
1188
1205
#include " swift/AST/ReferenceStorage.def"
1189
1206
1190
1207
TypeLowering *
1191
1208
visitBuiltinUnsafeValueBufferType (CanBuiltinUnsafeValueBufferType type) {
1192
1209
auto silType = SILType::getPrimitiveAddressType (type);
1193
- return new (TC, Dependent) UnsafeValueBufferTypeLowering (silType);
1210
+ return new (TC, Dependent) UnsafeValueBufferTypeLowering (silType,
1211
+ Expansion);
1194
1212
}
1195
1213
1196
1214
TypeLowering *visitTupleType (CanTupleType tupleType) {
@@ -1237,7 +1255,7 @@ namespace {
1237
1255
// is still address only, because we don't know how many bits
1238
1256
// are used for the discriminator.
1239
1257
if (D->isIndirect ()) {
1240
- return new (TC, Dependent) LoadableEnumTypeLowering (enumType);
1258
+ return new (TC, Dependent) LoadableEnumTypeLowering (enumType, Expansion );
1241
1259
}
1242
1260
1243
1261
// Accumulate the properties of all direct payloads.
@@ -1275,7 +1293,7 @@ namespace {
1275
1293
if (props.isTrivial ()) {
1276
1294
return handleTrivial (type);
1277
1295
}
1278
- return new (TC, Dependent) LoadableLoweringClass (type);
1296
+ return new (TC, Dependent) LoadableLoweringClass (type, Expansion );
1279
1297
}
1280
1298
};
1281
1299
} // end anonymous namespace
@@ -1615,11 +1633,11 @@ getTypeLoweringForExpansion(TypeKey key,
1615
1633
1616
1634
// Search for a matching lowering in the linked list of lowerings.
1617
1635
while (true ) {
1618
- if (lowering->forExpansion == forExpansion)
1636
+ if (lowering->getResilienceExpansion () == forExpansion)
1619
1637
return *lowering;
1620
- if (lowering->nextExpansion ) {
1638
+ if (lowering->NextExpansion ) {
1621
1639
// Continue searching.
1622
- lowering = lowering->nextExpansion ;
1640
+ lowering = lowering->NextExpansion ;
1623
1641
continue ;
1624
1642
}
1625
1643
@@ -1629,8 +1647,7 @@ getTypeLoweringForExpansion(TypeKey key,
1629
1647
forExpansion,
1630
1648
key.isDependent ()).visit (key.SubstType );
1631
1649
1632
- lowering->nextExpansion = theInfo;
1633
- theInfo->forExpansion = forExpansion;
1650
+ lowering->NextExpansion = theInfo;
1634
1651
return *theInfo;
1635
1652
}
1636
1653
}
@@ -1653,8 +1670,6 @@ getTypeLoweringForUncachedLoweredType(TypeKey key,
1653
1670
forExpansion,
1654
1671
key.isDependent ()).visit (key.SubstType );
1655
1672
1656
- theInfo->forExpansion = forExpansion;
1657
-
1658
1673
if (key.OrigType .isForeign ()) {
1659
1674
assert (theInfo->isLoadable () && " Cannot lower address-only type with "
1660
1675
" foreign abstraction pattern" );
0 commit comments