Skip to content

Commit ec89cdf

Browse files
committed
IRGen: Handle on-heap packs in bindMetadataAtIndex() and bindWitnessTableAtIndex()
1 parent f0ebda0 commit ec89cdf

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

lib/IRGen/GenPack.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,13 @@ static llvm::Value *bindMetadataAtIndex(IRGenFunction &IGF,
217217
if (auto response = IGF.tryGetLocalTypeMetadata(elementArchetype, request))
218218
return response.getMetadata();
219219

220+
// If the pack is on the heap, the LSB is set, so mask it off.
220221
patternPack =
221-
IGF.Builder.CreatePointerCast(patternPack, IGF.IGM.TypeMetadataPtrPtrTy);
222+
IGF.Builder.CreatePtrToInt(patternPack, IGF.IGM.SizeTy);
223+
patternPack =
224+
IGF.Builder.CreateAnd(patternPack, llvm::ConstantInt::get(IGF.IGM.SizeTy, -2));
225+
patternPack =
226+
IGF.Builder.CreateIntToPtr(patternPack, IGF.IGM.TypeMetadataPtrPtrTy);
222227

223228
Address patternPackAddress(patternPack, IGF.IGM.TypeMetadataPtrTy,
224229
IGF.IGM.getPointerAlignment());
@@ -245,8 +250,14 @@ static llvm::Value *bindWitnessTableAtIndex(IRGenFunction &IGF,
245250
auto key = LocalTypeDataKind::forProtocolWitnessTable(conf);
246251
if (auto *wtable = IGF.tryGetLocalTypeData(elementArchetype, key))
247252
return wtable;
253+
254+
// If the pack is on the heap, the LSB is set, so mask it off.
255+
wtablePack =
256+
IGF.Builder.CreatePtrToInt(wtablePack, IGF.IGM.SizeTy);
257+
wtablePack =
258+
IGF.Builder.CreateAnd(wtablePack, llvm::ConstantInt::get(IGF.IGM.SizeTy, -2));
248259
wtablePack =
249-
IGF.Builder.CreatePointerCast(wtablePack, IGF.IGM.WitnessTablePtrPtrTy);
260+
IGF.Builder.CreateIntToPtr(wtablePack, IGF.IGM.WitnessTablePtrPtrTy);
250261

251262
Address patternPackAddress(wtablePack, IGF.IGM.WitnessTablePtrTy,
252263
IGF.IGM.getPointerAlignment());

0 commit comments

Comments
 (0)