Skip to content

Commit bbb67d1

Browse files
committed
[IRGen] Prevent CVW from being emitted for non-copyable types
rdar://138028500 In some cases CVW were emitted for non-copyable types, which should not happen.
1 parent 95e0a79 commit bbb67d1

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

lib/IRGen/GenMeta.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3391,15 +3391,18 @@ static void emitInitializeValueMetadata(IRGenFunction &IGF,
33913391
MetadataDependencyCollector *collector) {
33923392
auto &IGM = IGF.IGM;
33933393
auto loweredTy = IGM.getLoweredType(nominalDecl->getDeclaredTypeInContext());
3394+
auto &concreteTI = IGM.getTypeInfo(loweredTy);
3395+
33943396
bool useLayoutStrings =
33953397
layoutStringsEnabled(IGM) &&
33963398
IGM.Context.LangOpts.hasFeature(
33973399
Feature::LayoutStringValueWitnessesInstantiation) &&
3398-
IGM.getOptions().EnableLayoutStringValueWitnessesInstantiation;
3400+
IGM.getOptions().EnableLayoutStringValueWitnessesInstantiation &&
3401+
concreteTI.isCopyable(ResilienceExpansion::Maximal);
33993402

34003403
if (auto sd = dyn_cast<StructDecl>(nominalDecl)) {
3401-
auto &fixedTI = IGM.getTypeInfo(loweredTy);
3402-
if (isa<FixedTypeInfo>(fixedTI)) return;
3404+
if (isa<FixedTypeInfo>(concreteTI))
3405+
return;
34033406

34043407
// Use a different runtime function to initialize the value witness table
34053408
// if the struct has a raw layout. The existing swift_initStructMetadata

lib/IRGen/GenValueWitness.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
10591059
return addFunction(getNoOpVoidFunction(IGM));
10601060
} else if (concreteTI.isSingleSwiftRetainablePointer(ResilienceExpansion::Maximal)) {
10611061
return addFunction(getDestroyStrongFunction(IGM));
1062-
} else if (layoutStringsEnabled(IGM)) {
1062+
} else if (layoutStringsEnabled(IGM) &&
1063+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
10631064
auto ty = boundGenericCharacteristics ? boundGenericCharacteristics->concreteType : concreteType;
10641065
auto &typeInfo = boundGenericCharacteristics ? *boundGenericCharacteristics->TI : concreteTI;
10651066
if (auto *typeLayoutEntry =
@@ -1083,7 +1084,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
10831084
}
10841085
}
10851086

1086-
if (layoutStringsEnabled(IGM)) {
1087+
if (layoutStringsEnabled(IGM) &&
1088+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
10871089
auto ty = boundGenericCharacteristics
10881090
? boundGenericCharacteristics->concreteType
10891091
: concreteType;
@@ -1106,7 +1108,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
11061108
case ValueWitness::InitializeWithTake:
11071109
if (concreteTI.isBitwiseTakable(ResilienceExpansion::Maximal)) {
11081110
return addFunction(getMemCpyFunction(IGM, concreteTI));
1109-
} else if (layoutStringsEnabled(IGM)) {
1111+
} else if (layoutStringsEnabled(IGM) &&
1112+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
11101113
auto ty = boundGenericCharacteristics ? boundGenericCharacteristics->concreteType : concreteType;
11111114
auto &typeInfo = boundGenericCharacteristics ? *boundGenericCharacteristics->TI : concreteTI;
11121115
if (auto *typeLayoutEntry =
@@ -1126,7 +1129,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
11261129
return addFunction(getMemCpyFunction(IGM, concreteTI));
11271130
} else if (concreteTI.isSingleSwiftRetainablePointer(ResilienceExpansion::Maximal)) {
11281131
return addFunction(getAssignWithCopyStrongFunction(IGM));
1129-
} else if (layoutStringsEnabled(IGM)) {
1132+
} else if (layoutStringsEnabled(IGM) &&
1133+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
11301134
auto ty = boundGenericCharacteristics ? boundGenericCharacteristics->concreteType : concreteType;
11311135
auto &typeInfo = boundGenericCharacteristics ? *boundGenericCharacteristics->TI : concreteTI;
11321136
if (auto *typeLayoutEntry =
@@ -1146,7 +1150,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
11461150
return addFunction(getMemCpyFunction(IGM, concreteTI));
11471151
} else if (concreteTI.isSingleSwiftRetainablePointer(ResilienceExpansion::Maximal)) {
11481152
return addFunction(getAssignWithTakeStrongFunction(IGM));
1149-
} else if (layoutStringsEnabled(IGM)) {
1153+
} else if (layoutStringsEnabled(IGM) &&
1154+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
11501155
auto ty = boundGenericCharacteristics ? boundGenericCharacteristics->concreteType : concreteType;
11511156
auto &typeInfo = boundGenericCharacteristics ? *boundGenericCharacteristics->TI : concreteTI;
11521157
if (auto *typeLayoutEntry =
@@ -1166,7 +1171,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
11661171
return addFunction(getMemCpyFunction(IGM, concreteTI));
11671172
} else if (concreteTI.isSingleSwiftRetainablePointer(ResilienceExpansion::Maximal)) {
11681173
return addFunction(getInitWithCopyStrongFunction(IGM));
1169-
} else if (layoutStringsEnabled(IGM)) {
1174+
} else if (layoutStringsEnabled(IGM) &&
1175+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
11701176
auto ty = boundGenericCharacteristics ? boundGenericCharacteristics->concreteType : concreteType;
11711177
auto &typeInfo = boundGenericCharacteristics ? *boundGenericCharacteristics->TI : concreteTI;
11721178
if (auto *typeLayoutEntry =
@@ -1233,7 +1239,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
12331239
case ValueWitness::GetEnumTag: {
12341240
assert(concreteType.getEnumOrBoundGenericEnum());
12351241

1236-
if (layoutStringsEnabled(IGM)) {
1242+
if (layoutStringsEnabled(IGM) &&
1243+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
12371244
auto ty = boundGenericCharacteristics
12381245
? boundGenericCharacteristics->concreteType
12391246
: concreteType;
@@ -1255,7 +1262,8 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B,
12551262
}
12561263
case ValueWitness::DestructiveInjectEnumTag: {
12571264
assert(concreteType.getEnumOrBoundGenericEnum());
1258-
if (layoutStringsEnabled(IGM)) {
1265+
if (layoutStringsEnabled(IGM) &&
1266+
concreteTI.isCopyable(ResilienceExpansion::Maximal)) {
12591267
auto ty = boundGenericCharacteristics
12601268
? boundGenericCharacteristics->concreteType
12611269
: concreteType;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %target-swift-frontend -enable-experimental-feature LayoutStringValueWitnesses -enable-experimental-feature LayoutStringValueWitnessesInstantiation -enable-layout-string-value-witnesses -enable-layout-string-value-witnesses-instantiation -emit-ir -module-name Foo %s | %FileCheck %s
2+
3+
// CHECK-NOT: @"$s3Foo7GenericVWV" = {{.*}}ptr @swift_generic{{.*$}}
4+
struct Generic<T: ~Copyable>: ~Copyable {
5+
let x: T
6+
let y: Int
7+
}
8+
9+
// CHECK-NOT: @"$s3Foo13SinglePayloadOWV" = {{.*}}ptr @swift_generic{{.*$}}
10+
enum SinglePayload: ~Copyable {
11+
case x(AnyObject)
12+
case y
13+
}
14+
15+
// CHECK-NOT: @"$s3Foo12MultiPayloadOWV" = {{.*}}ptr @swift_generic{{.*$}}
16+
enum MultiPayload: ~Copyable {
17+
case x(AnyObject)
18+
case y(AnyObject)
19+
}
20+
21+
// CHECK-NOT: @"$s3Foo20SinglePayloadGenericOWV" = {{.*}}ptr @swift_generic{{.*$}}
22+
enum SinglePayloadGeneric<T>: ~Copyable {
23+
case x(T)
24+
case y
25+
}
26+
27+
// CHECK-NOT: @"$s3Foo19MultiPayloadGenericOWV" = {{.*}}ptr @swift_generic{{.*$}}
28+
enum MultiPayloadGeneric<T>: ~Copyable {
29+
case x(T)
30+
case y(T)
31+
}

0 commit comments

Comments
 (0)