3030#include " IRGenFunction.h"
3131#include " IRGenModule.h"
3232#include " MetadataRequest.h"
33+ #include " ResilientTypeInfo.h"
3334
3435using namespace swift ;
3536using namespace irgen ;
@@ -176,7 +177,7 @@ irgen::emitPackArchetypeMetadataRef(IRGenFunction &IGF,
176177 if (auto result = IGF.tryGetLocalTypeMetadata (type, request))
177178 return result;
178179
179- auto packType = type-> getSingletonPackType ( );
180+ auto packType = CanPackType::getSingletonPackExpansion (type );
180181 auto response = emitTypeMetadataPackRef (IGF, packType, request);
181182
182183 IGF.setScopedLocalTypeMetadata (type, response);
@@ -216,8 +217,13 @@ static llvm::Value *bindMetadataAtIndex(IRGenFunction &IGF,
216217 if (auto response = IGF.tryGetLocalTypeMetadata (elementArchetype, request))
217218 return response.getMetadata ();
218219
220+ // If the pack is on the heap, the LSB is set, so mask it off.
219221 patternPack =
220- 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 );
221227
222228 Address patternPackAddress (patternPack, IGF.IGM .TypeMetadataPtrTy ,
223229 IGF.IGM .getPointerAlignment ());
@@ -244,8 +250,14 @@ static llvm::Value *bindWitnessTableAtIndex(IRGenFunction &IGF,
244250 auto key = LocalTypeDataKind::forProtocolWitnessTable (conf);
245251 if (auto *wtable = IGF.tryGetLocalTypeData (elementArchetype, key))
246252 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 ));
247259 wtablePack =
248- IGF.Builder .CreatePointerCast (wtablePack, IGF.IGM .WitnessTablePtrPtrTy );
260+ IGF.Builder .CreateIntToPtr (wtablePack, IGF.IGM .WitnessTablePtrPtrTy );
249261
250262 Address patternPackAddress (wtablePack, IGF.IGM .WitnessTablePtrTy ,
251263 IGF.IGM .getPointerAlignment ());
0 commit comments