@@ -154,6 +154,13 @@ Projection::Projection(SingleValueInstruction *I) : Value() {
154154 }
155155 break ;
156156 }
157+ case SILInstructionKind::ProjectBlockStorageInst: {
158+ auto *Ty = I->getType ().getASTType ().getPointer ();
159+ assert (Ty->isCanonical ());
160+ Value = ValueTy (ProjectionKind::BlockStorageCast, Ty);
161+ assert (getKind () == ProjectionKind::BlockStorageCast);
162+ break ;
163+ }
157164 case SILInstructionKind::UpcastInst: {
158165 auto *Ty = I->getType ().getASTType ().getPointer ();
159166 assert (Ty->isCanonical ());
@@ -199,6 +206,7 @@ SILType Projection::getType(SILType BaseType, SILModule &M,
199206 case ProjectionKind::Tuple:
200207 return BaseType.getTupleElementType (getIndex ());
201208 case ProjectionKind::Upcast:
209+ case ProjectionKind::BlockStorageCast:
202210 case ProjectionKind::RefCast:
203211 case ProjectionKind::BitwiseCast:
204212 case ProjectionKind::TailElems:
@@ -238,6 +246,8 @@ Projection::createObjectProjection(SILBuilder &B, SILLocation Loc,
238246 return nullptr ;
239247 case ProjectionKind::Box:
240248 return nullptr ;
249+ case ProjectionKind::BlockStorageCast:
250+ return nullptr ;
241251 case ProjectionKind::Upcast:
242252 return B.createUpcast (Loc, Base, getCastType (BaseTy));
243253 case ProjectionKind::RefCast:
@@ -285,6 +295,8 @@ Projection::createAddressProjection(SILBuilder &B, SILLocation Loc,
285295 return B.createRefTailAddr (Loc, Base, getCastType (BaseTy));
286296 case ProjectionKind::Box:
287297 return B.createProjectBox (Loc, Base, getIndex ());
298+ case ProjectionKind::BlockStorageCast:
299+ return B.createProjectBlockStorage (Loc, Base);
288300 case ProjectionKind::Upcast:
289301 return B.createUpcast (Loc, Base, getCastType (BaseTy));
290302 case ProjectionKind::RefCast:
@@ -600,6 +612,10 @@ void Projection::print(raw_ostream &os, SILType baseType) const {
600612 os << " Box over" ;
601613 break ;
602614 }
615+ case ProjectionKind::BlockStorageCast: {
616+ os << " BlockStorageCast" ;
617+ break ;
618+ }
603619 case ProjectionKind::Upcast: {
604620 os << " UpCast" ;
605621 break ;
@@ -872,6 +888,7 @@ SILValue Projection::getOperandForAggregate(SILInstruction *I) const {
872888 case ProjectionKind::Class:
873889 case ProjectionKind::TailElems:
874890 case ProjectionKind::Box:
891+ case ProjectionKind::BlockStorageCast:
875892 case ProjectionKind::Upcast:
876893 case ProjectionKind::RefCast:
877894 case ProjectionKind::BitwiseCast:
@@ -931,6 +948,7 @@ static bool isSupportedProjection(const Projection &p) {
931948 case ProjectionKind::Enum:
932949 case ProjectionKind::Box:
933950 case ProjectionKind::Upcast:
951+ case ProjectionKind::BlockStorageCast:
934952 case ProjectionKind::RefCast:
935953 case ProjectionKind::BitwiseCast:
936954 case ProjectionKind::TailElems:
0 commit comments