@@ -1942,6 +1942,10 @@ namespace {
19421942 // / Lower address only types as opaque values.
19431943 class OpaqueValueTypeLowering : public LeafLoadableTypeLowering {
19441944 public:
1945+ void setLoweredAddresses () const override {
1946+ LoweredType = LoweredType.getAddressType ();
1947+ }
1948+
19451949 OpaqueValueTypeLowering (SILType type, RecursiveProperties properties,
19461950 TypeExpansionContext forExpansion)
19471951 : LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
@@ -2009,6 +2013,10 @@ namespace {
20092013 : LeafLoadableTypeLowering(type, properties, IsNotReferenceCounted,
20102014 forExpansion) {}
20112015
2016+ void setLoweredAddresses () const override {
2017+ LoweredType = LoweredType.getAddressType ();
2018+ }
2019+
20122020 void emitCopyInto (SILBuilder &B, SILLocation loc, SILValue src,
20132021 SILValue dest, IsTake_t isTake,
20142022 IsInitialization_t isInit) const override {
@@ -2046,9 +2054,13 @@ namespace {
20462054 class LowerType
20472055 : public TypeClassifierBase<LowerType, TypeLowering *>
20482056 {
2057+ bool loweredAddresses;
2058+
20492059 public:
2050- LowerType (TypeConverter &TC, TypeExpansionContext Expansion)
2051- : TypeClassifierBase(TC, Expansion) {}
2060+ LowerType (TypeConverter &TC, TypeExpansionContext Expansion,
2061+ bool loweredAddresses)
2062+ : TypeClassifierBase(TC, Expansion),
2063+ loweredAddresses (loweredAddresses) {}
20522064
20532065 TypeLowering *handleTrivial (CanType type) {
20542066 return handleTrivial (type, RecursiveProperties::forTrivial ());
@@ -2105,7 +2117,9 @@ namespace {
21052117 return new (TC) AddressOnlyTypeLowering (silType, properties,
21062118 Expansion);
21072119 }
2108- auto silType = SILType::getPrimitiveObjectType (type);
2120+ auto silType = SILType::getPrimitiveType (
2121+ type, loweredAddresses ? SILValueCategory::Address
2122+ : SILValueCategory::Object);
21092123 return new (TC) OpaqueValueTypeLowering (silType, properties, Expansion);
21102124 }
21112125
@@ -2399,9 +2413,8 @@ namespace {
23992413 };
24002414} // end anonymous namespace
24012415
2402- TypeConverter::TypeConverter (ModuleDecl &m)
2403- : M(m), Context(m.getASTContext()) {
2404- }
2416+ TypeConverter::TypeConverter (ModuleDecl &m, bool loweredAddresses)
2417+ : LoweredAddresses(loweredAddresses), M(m), Context(m.getASTContext()) {}
24052418
24062419TypeConverter::~TypeConverter () {
24072420 // The bump pointer allocator destructor will deallocate but not destroy all
@@ -2602,7 +2615,7 @@ TypeConverter::getTypeLowering(AbstractionPattern origType,
26022615 // and cache it.
26032616 if (loweredSubstType == substType && key.isCacheable ()) {
26042617 lowering =
2605- LowerType (*this , forExpansion)
2618+ LowerType (*this , forExpansion, LoweredAddresses )
26062619 .visit (key.SubstType , key.OrigType , isTypeExpansionSensitive);
26072620
26082621 // Otherwise, check the table at a key that would be used by the
@@ -3064,9 +3077,8 @@ const TypeLowering &TypeConverter::getTypeLoweringForLoweredType(
30643077 forExpansion, origType, loweredType);
30653078 }
30663079
3067- lowering =
3068- LowerType (*this , forExpansion)
3069- .visit (loweredType, origType, isTypeExpansionSensitive);
3080+ lowering = LowerType (*this , forExpansion, LoweredAddresses)
3081+ .visit (loweredType, origType, isTypeExpansionSensitive);
30703082
30713083 if (!lowering->isResilient () && !lowering->isTypeExpansionSensitive ())
30723084 insert (key.getKeyForMinimalExpansion (), lowering);
@@ -4363,6 +4375,14 @@ void TypeConverter::setCaptureTypeExpansionContext(SILDeclRef constant,
43634375 }
43644376}
43654377
4378+ void TypeConverter::setLoweredAddresses () {
4379+ assert (!LoweredAddresses);
4380+ for (auto &pair : this ->LoweredTypes ) {
4381+ pair.getSecond ()->setLoweredAddresses ();
4382+ }
4383+ LoweredAddresses = true ;
4384+ }
4385+
43664386static void countNumberOfInnerFields (unsigned &fieldsCount, TypeConverter &TC,
43674387 SILType Ty,
43684388 TypeExpansionContext expansion) {
0 commit comments