Skip to content

Commit 63459aa

Browse files
committed
[embedded] Fix array processing stride/size bug in init/assign, too
1 parent f5db67c commit 63459aa

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

lib/IRGen/GenBuiltin.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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");
@@ -1162,6 +1165,9 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11621165
llvm::Value *src = args.claimNext();
11631166
llvm::Value *count = args.claimNext();
11641167

1168+
// In Embedded Swift we don't have metadata and witness tables, so we can't
1169+
// just use TypeInfo's initialize... and assign... APIs, which need
1170+
// metadata to emit calls. Emit a loop to process elements directly instead.
11651171
if (IGF.IGM.Context.LangOpts.hasFeature(Feature::Embedded)) {
11661172
auto tyPair = getLoweredTypeAndTypeInfo(
11671173
IGF.IGM, substitutions.getReplacementTypes()[0]);
@@ -1177,10 +1183,14 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11771183
return;
11781184
}
11791185

1180-
llvm::Value *firstSrcElem = IGF.Builder.CreateBitCast(
1181-
src, elemTI.getStorageType()->getPointerTo());
1182-
llvm::Value *firstDestElem = IGF.Builder.CreateBitCast(
1183-
dest, elemTI.getStorageType()->getPointerTo());
1186+
llvm::Value *firstSrcElem = IGF.Builder.CreatePtrToInt(
1187+
IGF.Builder.CreateBitCast(src,
1188+
elemTI.getStorageType()->getPointerTo()),
1189+
IGF.IGM.IntPtrTy);
1190+
llvm::Value *firstDestElem = IGF.Builder.CreatePtrToInt(
1191+
IGF.Builder.CreateBitCast(dest,
1192+
elemTI.getStorageType()->getPointerTo()),
1193+
IGF.IGM.IntPtrTy);
11841194

11851195
auto *origBB = IGF.Builder.GetInsertBlock();
11861196
auto *headerBB = IGF.createBasicBlock("loop_header");
@@ -1208,10 +1218,16 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
12081218
break;
12091219
}
12101220

1211-
auto *srcElem = IGF.Builder.CreateInBoundsGEP(elemTI.getStorageType(),
1212-
firstSrcElem, idx);
1213-
auto *destElem = IGF.Builder.CreateInBoundsGEP(elemTI.getStorageType(),
1214-
firstDestElem, idx);
1221+
llvm::Value *offset =
1222+
IGF.Builder.CreateMul(idx, elemTI.getStaticStride(IGF.IGM));
1223+
1224+
llvm::Value *srcAdded = IGF.Builder.CreateAdd(firstSrcElem, offset);
1225+
auto *srcElem = IGF.Builder.CreateIntToPtr(
1226+
srcAdded, elemTI.getStorageType()->getPointerTo());
1227+
llvm::Value *dstAdded = IGF.Builder.CreateAdd(firstDestElem, offset);
1228+
auto *destElem = IGF.Builder.CreateIntToPtr(
1229+
dstAdded, elemTI.getStorageType()->getPointerTo());
1230+
12151231
Address destAddr = elemTI.getAddressForPointer(destElem);
12161232
Address srcAddr = elemTI.getAddressForPointer(srcElem);
12171233

0 commit comments

Comments
 (0)