Skip to content

Commit 89849b7

Browse files
committed
[embedded] Fix array processing stride/size bug in init/assign, too
1 parent 7d5acd3 commit 89849b7

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");
@@ -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

Comments
 (0)