@@ -1095,6 +1095,9 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
10951095 auto valueTy = getLoweredTypeAndTypeInfo (IGF.IGM ,
10961096 substitutions.getReplacementTypes ()[0 ]);
10971097
1098+ // In Embedded Swift we don't have metadata and witness tables, so we can't
1099+ // just use TypeInfo's destroyArray, which needs metadata to emit a call to
1100+ // swift_arrayDestroy. Emit a loop to destroy elements directly instead.
10981101 if (IGF.IGM .Context .LangOpts .hasFeature (Feature::Embedded)) {
10991102 SILType elemTy = valueTy.first ;
11001103 const TypeInfo &elemTI = valueTy.second ;
@@ -1105,7 +1108,7 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11051108
11061109 llvm::Value *firstElem =
11071110 IGF.Builder .CreatePtrToInt (IGF.Builder .CreateBitCast (
1108- ptr, elemTI.getStorageType ()->getPointerTo ()));
1111+ ptr, elemTI.getStorageType ()->getPointerTo ()), IGF. IGM . IntPtrTy );
11091112
11101113 auto *origBB = IGF.Builder .GetInsertBlock ();
11111114 auto *headerBB = IGF.createBasicBlock (" loop_header" );
@@ -1173,6 +1176,9 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11731176 llvm::Value *src = args.claimNext ();
11741177 llvm::Value *count = args.claimNext ();
11751178
1179+ // In Embedded Swift we don't have metadata and witness tables, so we can't
1180+ // just use TypeInfo's initialize... and assign... APIs, which need
1181+ // metadata to emit calls. Emit a loop to process elements directly instead.
11761182 if (IGF.IGM .Context .LangOpts .hasFeature (Feature::Embedded)) {
11771183 auto tyPair = getLoweredTypeAndTypeInfo (
11781184 IGF.IGM , substitutions.getReplacementTypes ()[0 ]);
@@ -1188,10 +1194,14 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11881194 return ;
11891195 }
11901196
1191- llvm::Value *firstSrcElem = IGF.Builder .CreateBitCast (
1192- src, elemTI.getStorageType ()->getPointerTo ());
1193- llvm::Value *firstDestElem = IGF.Builder .CreateBitCast (
1194- dest, elemTI.getStorageType ()->getPointerTo ());
1197+ llvm::Value *firstSrcElem = IGF.Builder .CreatePtrToInt (
1198+ IGF.Builder .CreateBitCast (src,
1199+ elemTI.getStorageType ()->getPointerTo ()),
1200+ IGF.IGM .IntPtrTy );
1201+ llvm::Value *firstDestElem = IGF.Builder .CreatePtrToInt (
1202+ IGF.Builder .CreateBitCast (dest,
1203+ elemTI.getStorageType ()->getPointerTo ()),
1204+ IGF.IGM .IntPtrTy );
11951205
11961206 auto *origBB = IGF.Builder .GetInsertBlock ();
11971207 auto *headerBB = IGF.createBasicBlock (" loop_header" );
@@ -1219,10 +1229,16 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
12191229 break ;
12201230 }
12211231
1222- auto *srcElem = IGF.Builder .CreateInBoundsGEP (elemTI.getStorageType (),
1223- firstSrcElem, idx);
1224- auto *destElem = IGF.Builder .CreateInBoundsGEP (elemTI.getStorageType (),
1225- firstDestElem, idx);
1232+ llvm::Value *offset =
1233+ IGF.Builder .CreateMul (idx, elemTI.getStaticStride (IGF.IGM ));
1234+
1235+ llvm::Value *srcAdded = IGF.Builder .CreateAdd (firstSrcElem, offset);
1236+ auto *srcElem = IGF.Builder .CreateIntToPtr (
1237+ srcAdded, elemTI.getStorageType ()->getPointerTo ());
1238+ llvm::Value *dstAdded = IGF.Builder .CreateAdd (firstDestElem, offset);
1239+ auto *destElem = IGF.Builder .CreateIntToPtr (
1240+ dstAdded, elemTI.getStorageType ()->getPointerTo ());
1241+
12261242 Address destAddr = elemTI.getAddressForPointer (destElem);
12271243 Address srcAddr = elemTI.getAddressForPointer (srcElem);
12281244
0 commit comments