Skip to content

Commit af1df92

Browse files
committed
IRGen: Avoid emitting resilient tag indices for unavailable enum cases.
When `-unavailable-decl-optimization=complete` is specified, skip emission of resilient tag indices for enum cases that are marked unavailable with `@available`. Resolves rdar://109805050
1 parent 77a6690 commit af1df92

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

lib/IRGen/GenDecl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5494,13 +5494,17 @@ static Address getAddrOfSimpleVariable(IRGenModule &IGM,
54945494
/// The result is always a GlobalValue.
54955495
Address IRGenModule::getAddrOfFieldOffset(VarDecl *var,
54965496
ForDefinition_t forDefinition) {
5497+
assert(!Lowering::shouldSkipLowering(var));
5498+
54975499
LinkEntity entity = LinkEntity::forFieldOffset(var);
54985500
return getAddrOfSimpleVariable(*this, GlobalVars, entity,
54995501
forDefinition);
55005502
}
55015503

55025504
Address IRGenModule::getAddrOfEnumCase(EnumElementDecl *Case,
55035505
ForDefinition_t forDefinition) {
5506+
assert(!Lowering::shouldSkipLowering(Case));
5507+
55045508
LinkEntity entity = LinkEntity::forEnumCase(Case);
55055509
auto addr = getAddrOfSimpleVariable(*this, GlobalVars, entity, forDefinition);
55065510

lib/IRGen/GenEnum.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ EnumImplStrategy::getTagIndex(EnumElementDecl *Case) const {
263263
static void emitResilientTagIndex(IRGenModule &IGM,
264264
const EnumImplStrategy *strategy,
265265
EnumElementDecl *Case) {
266+
if (Lowering::shouldSkipLowering(Case))
267+
return;
268+
266269
auto resilientIdx = strategy->getTagIndex(Case);
267270
auto *global = cast<llvm::GlobalVariable>(
268271
IGM.getAddrOfEnumCase(Case, ForDefinition).getAddress());

test/IRGen/unavailable_decl_optimization_complete_enum.swift

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
11
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-NO-STRIP
2+
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -enable-library-evolution %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-NO-STRIP,CHECK-RESILIENT,CHECK-NO-STRIP-RESILIENT
23

34
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -unavailable-decl-optimization=complete %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-STRIP
5+
// RUN: %target-swift-frontend -parse-as-library -module-name Test -validate-tbd-against-ir=missing -enable-library-evolution -unavailable-decl-optimization=complete %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-STRIP,CHECK-RESILIENT,CHECK-STRIP-RESILIENT
46

57
// CHECK: private constant [27 x i8] c"availableEnumAvailableCase\00"
68

79
// FIXME: Should this reflection metadata for an unavailable case be stripped?
810
// CHECK: private constant [29 x i8] c"availableEnumUnavailableCase\00"
911

12+
// CHECK-NO-STRIP-RESILIENT: @"$s4Test13AvailableEnumO09availableC34UnavailableCaseWithAssociatedValueyAcA0E6StructVcACmFWC" = {{.*}}constant
13+
// CHECK-STRIP-RESILIENT-NOT: @"$s4Test13AvailableEnumO09availableC34UnavailableCaseWithAssociatedValueyAcA0E6StructVcACmFWC" =
14+
15+
// CHECK-RESILIENT: @"$s4Test13AvailableEnumO09availablecB4CaseyA2CmFWC" = {{.*}}constant
16+
17+
// CHECK-NO-STRIP-RESILIENT: @"$s4Test13AvailableEnumO09availableC15UnavailableCaseyA2CmFWC" = {{.*}}constant
18+
// CHECK-STRIP-RESILIENT-NOT: @"$s4Test13AvailableEnumO09availableC15UnavailableCaseyA2CmFWC" =
19+
1020
// CHECK-NO-STRIP: private constant [25 x i8] c"unavailableEnumFirstCase\00"
1121
// CHECK-STRIP-NOT: private constant [25 x i8] c"unavailableEnumFirstCase\00"
1222

23+
// CHECK-NO-STRIP-RESILIENT: @"$s4Test15UnavailableEnumO011unavailableC9FirstCaseyA2CmFWC" = {{.*}}constant
24+
// CHECK-STRIP-RESILIENT-NOT: @"$s4Test15UnavailableEnumO011unavailableC9FirstCaseyA2CmFWC"
25+
1326
@available(*, unavailable)
1427
public struct UnavailableStruct {}
1528

@@ -38,15 +51,6 @@ public enum UnavailableEnum {
3851
// CHECK-NO-STRIP: s4Test15UnavailableEnumO6methodyyF
3952
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO6methodyyF
4053
public func method() {}
41-
42-
// CHECK-NO-STRIP: s4Test15UnavailableEnumO21__derived_enum_equalsySbAC_ACtFZ
43-
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO21__derived_enum_equalsySbAC_ACtFZ
44-
45-
// CHECK-NO-STRIP: s4Test15UnavailableEnumO4hash4intoys6HasherVz_tF
46-
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO4hash4intoys6HasherVz_tF
47-
48-
// CHECK-NO-STRIP: s4Test15UnavailableEnumO9hashValueSivg
49-
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO9hashValueSivg
5054
}
5155

5256
// CHECK: s4Test13AvailableEnumOwug

0 commit comments

Comments
 (0)