Skip to content

Commit 98b4e79

Browse files
committed
IRGen: Implement 'complete' unavailable decl optimization.
Part of rdar://106674022
1 parent 6f5b804 commit 98b4e79

File tree

3 files changed

+201
-0
lines changed

3 files changed

+201
-0
lines changed

lib/IRGen/GenDecl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2458,9 +2458,13 @@ void swift::irgen::disableAddressSanitizer(IRGenModule &IGM, llvm::GlobalVariabl
24582458

24592459
/// Emit a global declaration.
24602460
void IRGenModule::emitGlobalDecl(Decl *D) {
2461+
if (Lowering::shouldSkipLowering(D))
2462+
return;
2463+
24612464
D->visitAuxiliaryDecls([&](Decl *decl) {
24622465
emitGlobalDecl(decl);
24632466
});
2467+
24642468
switch (D->getKind()) {
24652469
case DeclKind::Extension:
24662470
return emitExtension(cast<ExtensionDecl>(D));

lib/IRGen/TBDGen.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,9 @@ void TBDGenVisitor::addSymbol(StringRef name, SymbolSource source,
414414
}
415415

416416
bool TBDGenVisitor::willVisitDecl(Decl *D) {
417+
if (Lowering::shouldSkipLowering(D))
418+
return false;
419+
417420
// A @_silgen_name("...") function without a body only exists to
418421
// forward-declare a symbol from another library.
419422
if (auto AFD = dyn_cast<AbstractFunctionDecl>(D))
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
// 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+
3+
// 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
4+
5+
// CHECK-NO-STRIP: s4Test14globalConstantSbvp
6+
// CHECK-NO-STRIP: s4Test14globalConstantSbvau
7+
// CHECK-STRIP-NOT: s4Test14globalConstantSbvp
8+
// CHECK-STRIP-NOT: s4Test14globalConstantSbvau
9+
@available(*, unavailable)
10+
public let globalConstant = true
11+
12+
// CHECK-NO-STRIP: s4Test15unavailableFuncyyF
13+
// CHECK-STRIP-NOT: s4Test15unavailableFuncyyF
14+
@available(*, unavailable)
15+
public func unavailableFunc() {}
16+
17+
@available(*, unavailable)
18+
public struct UnavailableStruct<T> {
19+
// CHECK-NO-STRIP: s4Test17UnavailableStructV8propertyxvg
20+
// CHECK-NO-STRIP: s4Test17UnavailableStructV8propertyxvs
21+
// CHECK-NO-STRIP: s4Test17UnavailableStructV8propertyxvM
22+
// CHECK-STRIP-NOT: s4Test17UnavailableStructV8propertyxvg
23+
// CHECK-STRIP-NOT: s4Test17UnavailableStructV8propertyxvs
24+
// CHECK-STRIP-NOT: s4Test17UnavailableStructV8propertyxvM
25+
public var property: T
26+
27+
// CHECK-NO-STRIP: s4Test17UnavailableStructVyACyxGxcfC
28+
// CHECK-NO-STRIP: s4Test17UnavailableStructVMa
29+
// CHECK-STRIP-NOT: s4Test17UnavailableStructVyACyxGxcfC
30+
// CHECK-STRIP-NOT: s4Test17UnavailableStructVMa
31+
public init(_ t: T) {
32+
self.property = t
33+
}
34+
35+
// CHECK-NO-STRIP: s4Test17UnavailableStructV6methodyyF
36+
// CHECK-STRIP-NOT: s4Test17UnavailableStructV6methodyyF
37+
public func method() {}
38+
}
39+
40+
@available(*, unavailable)
41+
extension UnavailableStruct {
42+
// CHECK-NO-STRIP: s4Test17UnavailableStructV15extensionMethodyyF
43+
// CHECK-STRIP-NOT: s4Test17UnavailableStructV15extensionMethodyyF
44+
public func extensionMethod() {}
45+
}
46+
47+
@available(*, unavailable)
48+
public enum UnavailableEnum {
49+
case a, b
50+
51+
// CHECK-NO-STRIP: s4Test15UnavailableEnumO6methodyyF
52+
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO6methodyyF
53+
public func method() {}
54+
55+
// CHECK-NO-STRIP: s4Test15UnavailableEnumO21__derived_enum_equalsySbAC_ACtFZ
56+
// CHECK-NO-STRIP: s4Test15UnavailableEnumO4hash4intoys6HasherVz_tF
57+
// CHECK-NO-STRIP: s4Test15UnavailableEnumO9hashValueSivg
58+
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO21__derived_enum_equalsySbAC_ACtFZ
59+
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO4hash4intoys6HasherVz_tF
60+
// CHECK-STRIP-NOT: s4Test15UnavailableEnumO9hashValueSivg
61+
}
62+
63+
@available(*, unavailable)
64+
public class UnavailableClass<T> {
65+
// CHECK-NO-STRIP: s4Test16UnavailableClassC8propertyxvg
66+
// CHECK-NO-STRIP: s4Test16UnavailableClassC8propertyxvs
67+
// CHECK-NO-STRIP: s4Test16UnavailableClassC8propertyxvM
68+
// CHECK-STRIP-NOT: s4Test16UnavailableClassC8propertyxvg
69+
// CHECK-STRIP-NOT: s4Test16UnavailableClassC8propertyxvs
70+
// CHECK-STRIP-NOT: s4Test16UnavailableClassC8propertyxvM
71+
public var property: T
72+
73+
// CHECK-NO-STRIP: s4Test16UnavailableClassCyACyxGxcfC
74+
// CHECK-NO-STRIP: s4Test16UnavailableClassCyACyxGxcfc
75+
// CHECK-STRIP-NOT: s4Test16UnavailableClassCyACyxGxcfC
76+
// CHECK-STRIP-NOT: s4Test16UnavailableClassCyACyxGxcfc
77+
public init(_ t: T) {
78+
self.property = t
79+
}
80+
81+
// CHECK-NO-STRIP: s4Test16UnavailableClassCfd
82+
// CHECK-NO-STRIP: s4Test16UnavailableClassCfD
83+
// CHECK-STRIP-NOT: s4Test16UnavailableClassCfd
84+
// CHECK-STRIP-NOT: s4Test16UnavailableClassCfD
85+
deinit {}
86+
}
87+
88+
public struct S<T> {
89+
// CHECK-NO-STRIP: s4Test1SV19unavailablePropertyxvg
90+
// CHECK-NO-STRIP: s4Test1SV19unavailablePropertyxvs
91+
// CHECK-NO-STRIP: s4Test1SV19unavailablePropertyxvM
92+
// CHECK-STRIP-NOT: s4Test1SV19unavailablePropertyxvg
93+
// CHECK-STRIP-NOT: s4Test1SV19unavailablePropertyxvs
94+
// CHECK-STRIP-NOT: s4Test1SV19unavailablePropertyxvM
95+
@available(*, unavailable)
96+
public var unavailableProperty: T
97+
98+
// CHECK-NO-STRIP: s4Test1SVyACyxGxcfC
99+
// CHECK-STRIP-NOT: s4Test1SVyACyxGxcfC
100+
@available(*, unavailable)
101+
public init(_ t: T) { fatalError() }
102+
103+
// CHECK-NO-STRIP: s4Test1SV17unavailableMethodyyF
104+
// CHECK-STRIP-NOT: s4Test1SV17unavailableMethodyyF
105+
@available(*, unavailable)
106+
public func unavailableMethod() {}
107+
}
108+
109+
@available(*, unavailable)
110+
extension S {
111+
// CHECK-NO-STRIP: s4Test1SV28methodInUnavailableExtensionyyF
112+
// CHECK-STRIP-NOT: s4Test1SV28methodInUnavailableExtensionyyF
113+
public func methodInUnavailableExtension() {}
114+
}
115+
116+
public enum E {
117+
case a
118+
119+
@available(*, unavailable)
120+
case b
121+
122+
// CHECK-NO-STRIP: s4Test1EO17unavailableMethodyyF
123+
// CHECK-STRIP-NOT: s4Test1EO17unavailableMethodyyF
124+
@available(*, unavailable)
125+
public func unavailableMethod() {}
126+
}
127+
128+
public class C<T> {
129+
// CHECK-NO-STRIP: s4Test1CC19unavailablePropertyxvg
130+
// CHECK-NO-STRIP: s4Test1CC19unavailablePropertyxvs
131+
// CHECK-NO-STRIP: s4Test1CC19unavailablePropertyxvM
132+
// CHECK-STRIP-NOT: s4Test1CC19unavailablePropertyxvg
133+
// CHECK-STRIP-NOT: s4Test1CC19unavailablePropertyxvs
134+
// CHECK-STRIP-NOT: s4Test1CC19unavailablePropertyxvM
135+
@available(*, unavailable)
136+
public var unavailableProperty: T
137+
138+
// CHECK-NO-STRIP: s4Test1CCyACyxGxcfC
139+
// CHECK-NO-STRIP: s4Test1CCyACyxGxcfc
140+
// CHECK-STRIP-NOT: s4Test1CCyACyxGxcfC
141+
// CHECK-STRIP-NOT: s4Test1CCyACyxGxcfc
142+
@available(*, unavailable)
143+
public init(_ t: T) { fatalError() }
144+
145+
// CHECK: s4Test1CCfd
146+
// CHECK: s4Test1CCfD
147+
deinit {}
148+
}
149+
150+
public protocol P {
151+
func requirement()
152+
}
153+
154+
@available(*, unavailable)
155+
extension S: P {
156+
// CHECK-NO-STRIP: s4Test1SV11requirementyyF
157+
// CHECK-STRIP-NOT: s4Test1SV11requirementyyF
158+
public func requirement() {}
159+
}
160+
161+
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF
162+
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF
163+
@available(*, unavailable)
164+
public func unavailableFuncWithNestedType() {
165+
struct Nested {
166+
// s4Test29unavailableFuncWithNestedTypeyyF0E0L_V6methodyyF
167+
public func method() {}
168+
}
169+
}
170+
171+
// MARK: -
172+
173+
// MARK: UnavailableEnum
174+
175+
// CHECK-NO-STRIP: s4Test15UnavailableEnumOwug
176+
// CHECK-STRIP-NOT: s4Test15UnavailableEnumOwug
177+
178+
// CHECK-NO-STRIP: s4Test15UnavailableEnumOMa
179+
// CHECK-STRIP-NOT: s4Test15UnavailableEnumOMa
180+
181+
// MARK: UnavailableClass
182+
183+
// CHECK-NO-STRIP: s4Test16UnavailableClassCMa
184+
// CHECK-STRIP-NOT: s4Test16UnavailableClassCMa
185+
186+
// MARK: E
187+
188+
// CHECK: s4Test1EOwug
189+
// CHECK: s4Test1EOMa
190+
191+
// MARK: unavailableFuncWithNestedType().Nested
192+
193+
// CHECK-NO-STRIP: s4Test29unavailableFuncWithNestedTypeyyF0E0L_VMa
194+
// CHECK-STRIP-NOT: s4Test29unavailableFuncWithNestedTypeyyF0E0L_VMa

0 commit comments

Comments
 (0)