@@ -569,7 +569,8 @@ OwnedAddress irgen::projectPhysicalClassMemberAddress(IRGenFunction &IGF,
569
569
llvm::Value *base,
570
570
SILType baseType,
571
571
SILType fieldType,
572
- VarDecl *field) {
572
+ VarDecl *field,
573
+ GenericSignature fnSig) {
573
574
// If the field is empty, its address doesn't matter.
574
575
auto &fieldTI = IGF.getTypeInfo (fieldType);
575
576
if (fieldTI.isKnownEmpty (ResilienceExpansion::Maximal)) {
@@ -603,7 +604,7 @@ OwnedAddress irgen::projectPhysicalClassMemberAddress(IRGenFunction &IGF,
603
604
}
604
605
605
606
case FieldAccess::ConstantIndirect: {
606
- auto metadata = emitHeapMetadataRefForHeapObject (IGF, base, baseType);
607
+ auto metadata = emitHeapMetadataRefForHeapObject (IGF, base, baseType, fnSig );
607
608
auto offset = emitClassFieldOffset (IGF, baseClass, field, metadata);
608
609
return emitAddressAtOffset (IGF, baseType, base, offset, field);
609
610
}
@@ -644,8 +645,9 @@ irgen::getPhysicalClassMemberAccessStrategy(IRGenModule &IGM,
644
645
}
645
646
646
647
Address irgen::emitTailProjection (IRGenFunction &IGF, llvm::Value *Base,
647
- SILType ClassType,
648
- SILType TailType) {
648
+ SILType ClassType,
649
+ SILType TailType,
650
+ GenericSignature fnSig) {
649
651
const ClassTypeInfo &classTI = IGF.getTypeInfo (ClassType).as <ClassTypeInfo>();
650
652
651
653
llvm::Value *Offset = nullptr ;
@@ -661,7 +663,8 @@ Address irgen::emitTailProjection(IRGenFunction &IGF, llvm::Value *Base,
661
663
Align = HeapObjAlign.alignmentAtOffset (ClassSize);
662
664
} else {
663
665
llvm::Value *metadata = emitHeapMetadataRefForHeapObject (IGF, Base,
664
- ClassType);
666
+ ClassType,
667
+ fnSig);
665
668
Offset = emitClassResilientInstanceSizeAndAlignMask (IGF,
666
669
ClassType.getClassOrBoundGenericClass (),
667
670
metadata).first ;
@@ -876,6 +879,7 @@ static void getInstanceSizeAndAlignMask(IRGenFunction &IGF,
876
879
SILType selfType,
877
880
ClassDecl *selfClass,
878
881
llvm::Value *selfValue,
882
+ GenericSignature fnSig,
879
883
llvm::Value *&size,
880
884
llvm::Value *&alignMask) {
881
885
// Try to determine the size of the object we're deallocating.
@@ -892,7 +896,7 @@ static void getInstanceSizeAndAlignMask(IRGenFunction &IGF,
892
896
893
897
// Otherwise, get them from the metadata.
894
898
llvm::Value *metadata =
895
- emitHeapMetadataRefForHeapObject (IGF, selfValue, selfType);
899
+ emitHeapMetadataRefForHeapObject (IGF, selfValue, selfType, fnSig );
896
900
std::tie (size, alignMask)
897
901
= emitClassResilientInstanceSizeAndAlignMask (IGF, selfClass, metadata);
898
902
}
@@ -902,8 +906,10 @@ static llvm::Value *emitCastToHeapObject(IRGenFunction &IGF,
902
906
return IGF.Builder .CreateBitCast (value, IGF.IGM .RefCountedPtrTy );
903
907
}
904
908
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) {
907
913
auto *theClass = selfType.getClassOrBoundGenericClass ();
908
914
909
915
// We want to deallocate default actors or potential default
@@ -934,7 +940,7 @@ void irgen::emitClassDeallocation(IRGenFunction &IGF, SILType selfType,
934
940
}
935
941
936
942
llvm::Value *size, *alignMask;
937
- getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue,
943
+ getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue, fnSig,
938
944
size, alignMask);
939
945
940
946
selfValue = emitCastToHeapObject (IGF, selfValue);
@@ -944,12 +950,13 @@ void irgen::emitClassDeallocation(IRGenFunction &IGF, SILType selfType,
944
950
void irgen::emitPartialClassDeallocation (IRGenFunction &IGF,
945
951
SILType selfType,
946
952
llvm::Value *selfValue,
947
- llvm::Value *metadataValue) {
953
+ llvm::Value *metadataValue,
954
+ GenericSignature fnSig) {
948
955
auto *theClass = selfType.getClassOrBoundGenericClass ();
949
956
assert (theClass->getForeignClassKind () == ClassDecl::ForeignKind::Normal);
950
957
951
958
llvm::Value *size, *alignMask;
952
- getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue,
959
+ getInstanceSizeAndAlignMask (IGF, selfType, theClass, selfValue, fnSig,
953
960
size, alignMask);
954
961
955
962
selfValue = IGF.Builder .CreateBitCast (selfValue, IGF.IGM .RefCountedPtrTy );
@@ -2815,6 +2822,7 @@ irgen::emitVirtualMethodValue(IRGenFunction &IGF,
2815
2822
SILType baseType,
2816
2823
SILDeclRef method,
2817
2824
CanSILFunctionType methodType,
2825
+ GenericSignature fnSig,
2818
2826
bool useSuperVTable) {
2819
2827
// Find the metadata.
2820
2828
llvm::Value *metadata;
@@ -2833,7 +2841,7 @@ irgen::emitVirtualMethodValue(IRGenFunction &IGF,
2833
2841
metadata = base;
2834
2842
} else {
2835
2843
// 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,
2837
2845
/* suppress cast*/ true );
2838
2846
}
2839
2847
}
0 commit comments