Skip to content

Commit 1f39128

Browse files
committed
wip
1 parent b627eb1 commit 1f39128

16 files changed

+144
-62
lines changed

include/swift/SIL/TypeLowering.h

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,7 @@ class TypeConverter {
748748
/// Lowers a Swift type to a SILType, and returns the SIL TypeLowering
749749
/// for that type.
750750
const TypeLowering &
751-
getTypeLowering(Type t, ResilienceExpansion forExpansion =
752-
ResilienceExpansion::Minimal) {
751+
getTypeLowering(Type t, ResilienceExpansion forExpansion) {
753752
AbstractionPattern pattern(getCurGenericContext(), t->getCanonicalType());
754753
return getTypeLowering(pattern, t, forExpansion);
755754
}
@@ -758,33 +757,28 @@ class TypeConverter {
758757
/// patterns of the given original type.
759758
const TypeLowering &getTypeLowering(AbstractionPattern origType,
760759
Type substType,
761-
ResilienceExpansion forExpansion =
762-
ResilienceExpansion::Minimal);
760+
ResilienceExpansion forExpansion);
763761

764762
/// Returns the SIL TypeLowering for an already lowered SILType. If the
765763
/// SILType is an address, returns the TypeLowering for the pointed-to
766764
/// type.
767765
const TypeLowering &
768-
getTypeLowering(SILType t, ResilienceExpansion forExpansion =
769-
ResilienceExpansion::Minimal);
766+
getTypeLowering(SILType t, ResilienceExpansion forExpansion);
770767

771768
// Returns the lowered SIL type for a Swift type.
772-
SILType getLoweredType(Type t, ResilienceExpansion forExpansion
773-
= ResilienceExpansion::Minimal) {
769+
SILType getLoweredType(Type t, ResilienceExpansion forExpansion) {
774770
return getTypeLowering(t, forExpansion).getLoweredType();
775771
}
776772

777773
// Returns the lowered SIL type for a Swift type.
778774
SILType getLoweredType(AbstractionPattern origType, Type substType,
779-
ResilienceExpansion forExpansion =
780-
ResilienceExpansion::Minimal) {
775+
ResilienceExpansion forExpansion) {
781776
return getTypeLowering(origType, substType, forExpansion)
782777
.getLoweredType();
783778
}
784779

785780
SILType getLoweredLoadableType(Type t,
786-
ResilienceExpansion forExpansion =
787-
ResilienceExpansion::Minimal) {
781+
ResilienceExpansion forExpansion) {
788782
const TypeLowering &ti = getTypeLowering(t, forExpansion);
789783
assert(
790784
(ti.isLoadable() || !SILModuleConventions(M).useLoweredAddresses()) &&

lib/IRGen/GenKeyPath.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1150,7 +1150,9 @@ emitKeyPathComponent(IRGenModule &IGM,
11501150
case KeyPathPatternComponent::Kind::TupleElement:
11511151
assert(baseTy->is<TupleType>() && "not a tuple");
11521152

1153-
SILType loweredTy = IGM.getSILTypes().getLoweredType(baseTy);
1153+
// FIXME: Expansion
1154+
SILType loweredTy = IGM.getSILTypes().getLoweredType(baseTy,
1155+
ResilienceExpansion::Minimal);
11541156

11551157
// Tuple with fixed layout
11561158
//

lib/IRGen/GenType.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,12 +1434,16 @@ const TypeInfo &IRGenFunction::getTypeInfo(SILType T) {
14341434

14351435
/// Return the SIL-lowering of the given type.
14361436
SILType IRGenModule::getLoweredType(AbstractionPattern orig, Type subst) {
1437-
return getSILTypes().getLoweredType(orig, subst);
1437+
// FIXME: Expansion
1438+
return getSILTypes().getLoweredType(orig, subst,
1439+
ResilienceExpansion::Minimal);
14381440
}
14391441

14401442
/// Return the SIL-lowering of the given type.
14411443
SILType IRGenModule::getLoweredType(Type subst) {
1442-
return getSILTypes().getLoweredType(subst);
1444+
// FIXME: Expansion
1445+
return getSILTypes().getLoweredType(subst,
1446+
ResilienceExpansion::Minimal);
14431447
}
14441448

14451449
/// Get a pointer to the storage type for the given type. Note that,

lib/SIL/Bridging.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ using namespace swift::Lowering;
3232
SILType TypeConverter::getLoweredTypeOfGlobal(VarDecl *var) {
3333
AbstractionPattern origType = getAbstractionPattern(var);
3434
assert(!origType.isTypeParameter());
35-
return getLoweredType(origType, origType.getType()).getObjectType();
35+
return getLoweredType(origType, origType.getType(),
36+
ResilienceExpansion::Minimal).getObjectType();
3637
}
3738

3839
AnyFunctionType::Param

lib/SIL/SILFunctionType.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,8 @@ class DestructureResults {
315315
return;
316316
}
317317

318-
auto &substResultTL = M.Types.getTypeLowering(origType, substType);
318+
auto &substResultTL = M.Types.getTypeLowering(origType, substType,
319+
ResilienceExpansion::Minimal);
319320

320321
// Determine the result convention.
321322
ResultConvention convention;
@@ -590,7 +591,8 @@ class DestructureInputs {
590591

591592
unsigned origParamIndex = NextOrigParamIndex++;
592593

593-
auto &substTL = M.Types.getTypeLowering(origType, substType);
594+
auto &substTL = M.Types.getTypeLowering(origType, substType,
595+
ResilienceExpansion::Minimal);
594596
ParameterConvention convention;
595597
if (ownership == ValueOwnership::InOut) {
596598
convention = ParameterConvention::Indirect_Inout;
@@ -627,7 +629,8 @@ class DestructureInputs {
627629
return false;
628630

629631
auto foreignErrorTy =
630-
M.Types.getLoweredType(Foreign.Error->getErrorParameterType());
632+
M.Types.getLoweredType(Foreign.Error->getErrorParameterType(),
633+
ResilienceExpansion::Minimal);
631634

632635
// Assume the error parameter doesn't have interesting lowering.
633636
Inputs.push_back(SILParameterInfo(foreignErrorTy.getASTType(),
@@ -749,7 +752,8 @@ lowerCaptureContextParameters(SILModule &M, AnyFunctionRef function,
749752
auto canType = type->getCanonicalType(origGenericSig);
750753

751754
auto &loweredTL =
752-
Types.getTypeLowering(AbstractionPattern(genericSig, canType), canType);
755+
Types.getTypeLowering(AbstractionPattern(genericSig, canType), canType,
756+
ResilienceExpansion::Minimal);
753757
auto loweredTy = loweredTL.getLoweredType();
754758
switch (Types.getDeclCaptureKind(capture)) {
755759
case CaptureKind::None:
@@ -806,7 +810,8 @@ static void destructureYieldsForReadAccessor(SILModule &M,
806810
return;
807811
}
808812

809-
auto &tl = M.Types.getTypeLowering(origType, valueType);
813+
auto &tl = M.Types.getTypeLowering(origType, valueType,
814+
ResilienceExpansion::Minimal);
810815
auto convention = [&] {
811816
if (isFormallyPassedIndirectly(M, origType, valueType, tl))
812817
return ParameterConvention::Indirect_In_Guaranteed;
@@ -857,7 +862,9 @@ static void destructureYieldsForCoroutine(SILModule &M,
857862

858863
// 'modify' yields an inout of the target type.
859864
if (accessor->getAccessorKind() == AccessorKind::Modify) {
860-
auto loweredValueTy = M.Types.getLoweredType(origType, canValueType);
865+
// FIXME: Category is not used here
866+
auto loweredValueTy = M.Types.getLoweredType(origType, canValueType,
867+
ResilienceExpansion::Minimal);
861868
yields.push_back(SILYieldInfo(loweredValueTy.getASTType(),
862869
ParameterConvention::Indirect_Inout));
863870
return;
@@ -2411,7 +2418,11 @@ class SILTypeSubstituter :
24112418
}
24122419

24132420
AbstractionPattern abstraction(Sig, origType);
2414-
return TheSILModule.Types.getLoweredType(abstraction, substType)
2421+
2422+
// Note that by calling getASTType(), we're erasing the object/address
2423+
// distinction, so the resilience expansion we pass in does not matter.
2424+
return TheSILModule.Types.getLoweredType(abstraction, substType,
2425+
ResilienceExpansion::Minimal)
24152426
.getASTType();
24162427
}
24172428
};

lib/SIL/SILType.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ SILType SILType::getFieldType(VarDecl *field, SILModule &M) const {
138138
baseTy->getTypeOfMember(M.getSwiftModule(),
139139
field, nullptr)->getCanonicalType();
140140
}
141-
auto loweredTy = M.Types.getLoweredType(origFieldTy, substFieldTy);
141+
142+
// We erase the category returned by type lowering, so the resilience
143+
// expansion does not matter here.
144+
auto loweredTy = M.Types.getLoweredType(origFieldTy, substFieldTy,
145+
ResilienceExpansion::Minimal);
142146
if (isAddress() || getClassOrBoundGenericClass() != nullptr) {
143147
return loweredTy.getAddressType();
144148
} else {
@@ -162,11 +166,15 @@ SILType SILType::getEnumElementType(EnumElementDecl *elt, SILModule &M) const {
162166
getCategory());
163167
}
164168

169+
// We erase the category returned by type lowering, so the resilience
170+
// expansion does not matter here.
165171
auto substEltTy =
166172
getASTType()->getTypeOfMember(M.getSwiftModule(), elt,
167173
elt->getArgumentInterfaceType());
168174
auto loweredTy =
169-
M.Types.getLoweredType(M.Types.getAbstractionPattern(elt), substEltTy);
175+
M.Types.getLoweredType(M.Types.getAbstractionPattern(elt),
176+
substEltTy,
177+
ResilienceExpansion::Minimal);
170178

171179
return SILType(loweredTy.getASTType(), getCategory());
172180
}

lib/SIL/SILVerifier.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,15 @@ void verifyKeyPathComponent(SILModule &M,
130130
auto &C = M.getASTContext();
131131

132132
auto loweredBaseTy =
133-
M.Types.getLoweredType(AbstractionPattern::getOpaque(), baseTy);
133+
M.Types.getLoweredType(AbstractionPattern::getOpaque(),
134+
baseTy,
135+
expansion);
134136
auto componentTy = component.getComponentType().subst(patternSubs)
135137
->getCanonicalType();
136138
auto loweredComponentTy =
137-
M.Types.getLoweredType(AbstractionPattern::getOpaque(), componentTy);
139+
M.Types.getLoweredType(AbstractionPattern::getOpaque(),
140+
componentTy,
141+
expansion);
138142

139143
auto checkIndexEqualsAndHash = [&]{
140144
if (!component.getSubscriptIndices().empty()) {
@@ -1932,7 +1936,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
19321936
"Dest address should be lvalue");
19331937
require(SI->getDest()->getType() == SI->getSrc()->getType(),
19341938
"Store operand type and dest type mismatch");
1935-
require(F.getModule().isTypeABIAccessible(SI->getDest()->getType()),
1939+
require(F.getModule().isTypeABIAccessible(SI->getDest()->getType(),
1940+
F.getResilienceExpansion()),
19361941
"cannot directly copy type with inaccessible ABI");
19371942
}
19381943

@@ -2347,7 +2352,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
23472352
void checkDestroyAddrInst(DestroyAddrInst *DI) {
23482353
require(DI->getOperand()->getType().isAddress(),
23492354
"Operand of destroy_addr must be address");
2350-
require(F.getModule().isTypeABIAccessible(DI->getOperand()->getType()),
2355+
require(F.getModule().isTypeABIAccessible(DI->getOperand()->getType(),
2356+
F.getResilienceExpansion()),
23512357
"cannot directly destroy type with inaccessible ABI");
23522358
}
23532359

lib/SIL/TypeLowering.cpp

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ CaptureKind TypeConverter::getDeclCaptureKind(CapturedValue capture) {
9898
if (var->isImmutable() &&
9999
(!SILModuleConventions(M).useLoweredAddresses() ||
100100
// FIXME: Expansion
101-
!getTypeLowering(var->getType()).isAddressOnly()))
101+
!getTypeLowering(var->getType(),
102+
ResilienceExpansion::Minimal).isAddressOnly()))
102103
return CaptureKind::Constant;
103104

104105
// In-out parameters are captured by address.
@@ -852,7 +853,9 @@ namespace {
852853
for (auto elt : tupleTy.getElementTypes()) {
853854
auto silElt = SILType::getPrimitiveType(elt, silTy.getCategory());
854855
// FIXME: Expansion
855-
children.push_back(Child{index, M.Types.getTypeLowering(silElt)});
856+
children.push_back(Child{index,
857+
M.Types.getTypeLowering(silElt,
858+
ResilienceExpansion::Minimal)});
856859
++index;
857860
}
858861
}
@@ -887,7 +890,9 @@ namespace {
887890
for (auto prop : structDecl->getStoredProperties()) {
888891
SILType propTy = silTy.getFieldType(prop, M);
889892
// FIXME: Expansion
890-
children.push_back(Child{prop, M.Types.getTypeLowering(propTy)});
893+
children.push_back(Child{prop,
894+
M.Types.getTypeLowering(propTy,
895+
ResilienceExpansion::Minimal)});
891896
}
892897
}
893898
};
@@ -1359,7 +1364,10 @@ static CanTupleType getLoweredTupleType(TypeConverter &tc,
13591364
assert(Flags.getValueOwnership() == ValueOwnership::Default);
13601365
assert(!Flags.isVariadic());
13611366

1362-
SILType silType = tc.getLoweredType(origEltType, substEltType);
1367+
// We ignore the category here so the resilience expansion does not
1368+
// matter.
1369+
SILType silType = tc.getLoweredType(origEltType, substEltType,
1370+
ResilienceExpansion::Minimal);
13631371
CanType loweredSubstEltType = silType.getASTType();
13641372

13651373
changed = (changed || substEltType != loweredSubstEltType ||
@@ -1388,8 +1396,12 @@ static CanType getLoweredOptionalType(TypeConverter &tc,
13881396
CanType substObjectType) {
13891397
assert(substType.getOptionalObjectType() == substObjectType);
13901398

1399+
// We ignore the category here so the resilience expansion does not
1400+
// matter.
13911401
CanType loweredObjectType =
1392-
tc.getLoweredType(origType.getOptionalObjectType(), substObjectType)
1402+
tc.getLoweredType(origType.getOptionalObjectType(),
1403+
substObjectType,
1404+
ResilienceExpansion::Minimal)
13931405
.getASTType();
13941406

13951407
// If the object type didn't change, we don't have to rebuild anything.
@@ -1404,9 +1416,12 @@ static CanType getLoweredOptionalType(TypeConverter &tc,
14041416
static CanType getLoweredReferenceStorageType(TypeConverter &tc,
14051417
AbstractionPattern origType,
14061418
CanReferenceStorageType substType) {
1419+
// We ignore the category here so the resilience expansion does not
1420+
// matter.
14071421
CanType loweredReferentType =
14081422
tc.getLoweredType(origType.getReferenceStorageReferentType(),
1409-
substType.getReferentType())
1423+
substType.getReferentType(),
1424+
ResilienceExpansion::Minimal)
14101425
.getASTType();
14111426

14121427
if (loweredReferentType == substType.getReferentType())
@@ -1419,7 +1434,10 @@ static CanType getLoweredReferenceStorageType(TypeConverter &tc,
14191434
CanSILFunctionType
14201435
TypeConverter::getSILFunctionType(AbstractionPattern origType,
14211436
CanFunctionType substType) {
1422-
return getLoweredType(origType, substType)
1437+
// We ignore the category here so the resilience expansion does not
1438+
// matter.
1439+
return getLoweredType(origType, substType,
1440+
ResilienceExpansion::Minimal)
14231441
.castTo<SILFunctionType>();
14241442
}
14251443

@@ -1948,7 +1966,11 @@ SILType TypeConverter::getSubstitutedStorageType(AbstractStorageDecl *value,
19481966
substType = substType.getReferenceStorageReferent();
19491967
}
19501968

1951-
SILType silSubstType = getLoweredType(origType, substType).getAddressType();
1969+
// We ignore the category here so the resilience expansion does not
1970+
// matter.
1971+
SILType silSubstType = getLoweredType(origType, substType,
1972+
ResilienceExpansion::Minimal)
1973+
.getAddressType();
19521974
substType = silSubstType.getASTType();
19531975

19541976
// Type substitution preserves structural type structure, and the
@@ -2477,7 +2499,11 @@ CanSILBoxType TypeConverter::getBoxTypeForEnumElement(SILType enumType,
24772499

24782500
if (boxSignature == CanGenericSignature()) {
24792501
auto eltIntfTy = elt->getArgumentInterfaceType();
2480-
auto boxVarTy = getLoweredType(eltIntfTy).getASTType();
2502+
2503+
// We ignore the category here so the resilience expansion does not
2504+
// matter.
2505+
auto boxVarTy = getLoweredType(eltIntfTy,
2506+
ResilienceExpansion::Minimal).getASTType();
24812507
auto layout = SILLayout::get(C, nullptr, SILField(boxVarTy, true));
24822508
return SILBoxType::get(C, layout, {});
24832509
}
@@ -2488,8 +2514,12 @@ CanSILBoxType TypeConverter::getBoxTypeForEnumElement(SILType enumType,
24882514
// Lower the enum element's argument in the box's context.
24892515
auto eltIntfTy = elt->getArgumentInterfaceType();
24902516
GenericContextScope scope(*this, boxSignature);
2491-
auto boxVarTy = getLoweredType(getAbstractionPattern(elt), eltIntfTy)
2492-
.getASTType();
2517+
2518+
// We ignore the category here so the resilience expansion does not
2519+
// matter.
2520+
auto boxVarTy = getLoweredType(getAbstractionPattern(elt),
2521+
eltIntfTy,
2522+
ResilienceExpansion::Minimal).getASTType();
24932523
auto layout = SILLayout::get(C, boxSignature, SILField(boxVarTy, true));
24942524

24952525
// Instantiate the layout with enum's substitution list.

0 commit comments

Comments
 (0)