@@ -569,7 +569,8 @@ OwnedAddress irgen::projectPhysicalClassMemberAddress(IRGenFunction &IGF,
569569 llvm::Value *base,
570570 SILType baseType,
571571 SILType fieldType,
572- VarDecl *field) {
572+ VarDecl *field,
573+ GenericSignature fnSig) {
573574 // If the field is empty, its address doesn't matter.
574575 auto &fieldTI = IGF.getTypeInfo (fieldType);
575576 if (fieldTI.isKnownEmpty (ResilienceExpansion::Maximal)) {
@@ -603,7 +604,7 @@ OwnedAddress irgen::projectPhysicalClassMemberAddress(IRGenFunction &IGF,
603604 }
604605
605606 case FieldAccess::ConstantIndirect: {
606- auto metadata = emitHeapMetadataRefForHeapObject (IGF, base, baseType);
607+ auto metadata = emitHeapMetadataRefForHeapObject (IGF, base, baseType, fnSig );
607608 auto offset = emitClassFieldOffset (IGF, baseClass, field, metadata);
608609 return emitAddressAtOffset (IGF, baseType, base, offset, field);
609610 }
@@ -644,8 +645,9 @@ irgen::getPhysicalClassMemberAccessStrategy(IRGenModule &IGM,
644645}
645646
646647Address irgen::emitTailProjection (IRGenFunction &IGF, llvm::Value *Base,
647- SILType ClassType,
648- SILType TailType) {
648+ SILType ClassType,
649+ SILType TailType,
650+ GenericSignature fnSig) {
649651 const ClassTypeInfo &classTI = IGF.getTypeInfo (ClassType).as <ClassTypeInfo>();
650652
651653 llvm::Value *Offset = nullptr ;
@@ -661,7 +663,8 @@ Address irgen::emitTailProjection(IRGenFunction &IGF, llvm::Value *Base,
661663 Align = HeapObjAlign.alignmentAtOffset (ClassSize);
662664 } else {
663665 llvm::Value *metadata = emitHeapMetadataRefForHeapObject (IGF, Base,
664- ClassType);
666+ ClassType,
667+ fnSig);
665668 Offset = emitClassResilientInstanceSizeAndAlignMask (IGF,
666669 ClassType.getClassOrBoundGenericClass (),
667670 metadata).first ;
@@ -876,6 +879,7 @@ static void getInstanceSizeAndAlignMask(IRGenFunction &IGF,
876879 SILType selfType,
877880 ClassDecl *selfClass,
878881 llvm::Value *selfValue,
882+ GenericSignature fnSig,
879883 llvm::Value *&size,
880884 llvm::Value *&alignMask) {
881885 // Try to determine the size of the object we're deallocating.
@@ -892,7 +896,7 @@ static void getInstanceSizeAndAlignMask(IRGenFunction &IGF,
892896
893897 // Otherwise, get them from the metadata.
894898 llvm::Value *metadata =
895- emitHeapMetadataRefForHeapObject (IGF, selfValue, selfType);
899+ emitHeapMetadataRefForHeapObject (IGF, selfValue, selfType, fnSig );
896900 std::tie (size, alignMask)
897901 = emitClassResilientInstanceSizeAndAlignMask (IGF, selfClass, metadata);
898902}
@@ -902,8 +906,10 @@ static llvm::Value *emitCastToHeapObject(IRGenFunction &IGF,
902906 return IGF.Builder .CreateBitCast (value, IGF.IGM .RefCountedPtrTy );
903907}
904908
905- void irgen::emitClassDeallocation (IRGenFunction &IGF, SILType selfType,
906- llvm::Value *selfValue) {
909+ void irgen::emitClassDeallocation (IRGenFunction &IGF,
910+ SILType selfType,
911+ llvm::Value *selfValue,
912+ GenericSignature fnSig) {
907913 auto *theClass = selfType.getClassOrBoundGenericClass ();
908914
909915 // We want to deallocate default actors or potential default
@@ -934,7 +940,7 @@ void irgen::emitClassDeallocation(IRGenFunction &IGF, SILType selfType,
934940 }
935941
936942 llvm::Value *size, *alignMask;
937- getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue,
943+ getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue, fnSig,
938944 size, alignMask);
939945
940946 selfValue = emitCastToHeapObject (IGF, selfValue);
@@ -944,12 +950,13 @@ void irgen::emitClassDeallocation(IRGenFunction &IGF, SILType selfType,
944950void irgen::emitPartialClassDeallocation (IRGenFunction &IGF,
945951 SILType selfType,
946952 llvm::Value *selfValue,
947- llvm::Value *metadataValue) {
953+ llvm::Value *metadataValue,
954+ GenericSignature fnSig) {
948955 auto *theClass = selfType.getClassOrBoundGenericClass ();
949956 assert (theClass->getForeignClassKind () == ClassDecl::ForeignKind::Normal);
950957
951958 llvm::Value *size, *alignMask;
952- getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue,
959+ getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue, fnSig,
953960 size, alignMask);
954961
955962 selfValue = IGF.Builder .CreateBitCast (selfValue, IGF.IGM .RefCountedPtrTy );
@@ -2815,6 +2822,7 @@ irgen::emitVirtualMethodValue(IRGenFunction &IGF,
28152822 SILType baseType,
28162823 SILDeclRef method,
28172824 CanSILFunctionType methodType,
2825+ GenericSignature fnSig,
28182826 bool useSuperVTable) {
28192827 // Find the metadata.
28202828 llvm::Value *metadata;
@@ -2833,7 +2841,7 @@ irgen::emitVirtualMethodValue(IRGenFunction &IGF,
28332841 metadata = base;
28342842 } else {
28352843 // Otherwise, load the class metadata from the 'self' value's isa pointer.
2836- metadata = emitHeapMetadataRefForHeapObject (IGF, base, baseType,
2844+ metadata = emitHeapMetadataRefForHeapObject (IGF, base, baseType, fnSig,
28372845 /* suppress cast*/ true );
28382846 }
28392847 }
0 commit comments