Skip to content

Commit 109112f

Browse files
authored
Merge pull request #21322 from harlanhaskins/impartiality-5.0
[5.0] [Serialization] Only serialize inlinable body text in partial modules
2 parents 63c7992 + eef07a1 commit 109112f

File tree

4 files changed

+114
-84
lines changed

4 files changed

+114
-84
lines changed

lib/Serialization/Serialization.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,9 +1345,15 @@ void Serializer::writeGenericRequirements(ArrayRef<Requirement> requirements,
13451345
void Serializer::writeInlinableBodyTextIfNeeded(
13461346
const AbstractFunctionDecl *AFD) {
13471347
using namespace decls_block;
1348+
// Only serialize the text for an inlinable function body if we're emitting
1349+
// a partial module. It's not needed in the final module file, but it's
1350+
// needed in partial modules so you can emit a parseable interface after
1351+
// merging them.
1352+
if (!SF) return;
13481353

13491354
if (AFD->getResilienceExpansion() != swift::ResilienceExpansion::Minimal)
13501355
return;
1356+
13511357
if (!AFD->hasInlinableBodyText()) return;
13521358
SmallString<128> scratch;
13531359
auto body = AFD->getInlinableBodyText(scratch);

test/ParseableInterface/fixed-layout-property-initializers.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
// RUN: %empty-directory(%t)
22

33
// RUN: %target-swift-frontend -typecheck -emit-parseable-module-interface-path %t.swiftinterface %s
4-
// RUN: %FileCheck %s < %t.swiftinterface
4+
// RUN: %FileCheck %s --check-prefix FROMSOURCE --check-prefix CHECK < %t.swiftinterface
55

66
// RUN: %target-swift-frontend -typecheck -emit-parseable-module-interface-path %t-resilient.swiftinterface -enable-resilience %s
7-
// RUN: %FileCheck %s < %t-resilient.swiftinterface
7+
// RUN: %FileCheck %s --check-prefix FROMSOURCE --check-prefix CHECK < %t-resilient.swiftinterface
88

99
// RUN: %target-swift-frontend -emit-module -o %t/Test.swiftmodule %t.swiftinterface -disable-objc-attr-requires-foundation-module
10-
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -module-name Test -emit-parseable-module-interface-path - | %FileCheck %s
10+
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -module-name Test -emit-parseable-module-interface-path - | %FileCheck %s --check-prefix FROMMODULE --check-prefix CHECK
1111

1212
// RUN: %target-swift-frontend -emit-module -o %t/TestResilient.swiftmodule -enable-resilience %t-resilient.swiftinterface -disable-objc-attr-requires-foundation-module
13-
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/TestResilient.swiftmodule -module-name TestResilient -enable-resilience -emit-parseable-module-interface-path - | %FileCheck %s
13+
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/TestResilient.swiftmodule -module-name TestResilient -enable-resilience -emit-parseable-module-interface-path - | %FileCheck %s --check-prefix FROMMODULE --check-prefix CHECK
1414

1515
// CHECK: @_fixed_layout public struct MyStruct {
1616
@_fixed_layout
@@ -34,7 +34,8 @@ public struct MyStruct {
3434
// CHECK: @_hasInitialValue public static var staticVar: [[BOOL]]
3535
public static var staticVar: Bool = Bool(true && false)
3636

37-
// CHECK: @inlinable internal init() {}
37+
// FROMSOURCE: @inlinable internal init() {}
38+
// FROMMODULE: @inlinable internal init(){{$}}
3839
@inlinable init() {}
3940
}
4041

@@ -57,7 +58,8 @@ public class MyClass {
5758
// CHECK: @_hasInitialValue public static var staticVar: [[BOOL]]
5859
public static var staticVar: Bool = Bool(true && false)
5960

60-
// CHECK: @inlinable internal init() {}
61+
// FROMSOURCE: @inlinable internal init() {}
62+
// FROMMODULE: @inlinable internal init(){{$}}
6163
@inlinable init() {}
6264
}
6365

test/ParseableInterface/inlinable-function.swift

Lines changed: 86 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %target-swift-frontend -emit-module -o %t/Test.swiftmodule -emit-parseable-module-interface-path %t/Test.swiftinterface -module-name Test %s
3-
// RUN: %FileCheck %s < %t/Test.swiftinterface
4-
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -disable-objc-attr-requires-foundation-module -emit-parseable-module-interface-path - -module-name Test | %FileCheck %s
3+
// RUN: %FileCheck %s --check-prefix FROMSOURCE --check-prefix CHECK < %t/Test.swiftinterface
4+
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -disable-objc-attr-requires-foundation-module -emit-parseable-module-interface-path %t/TestFromModule.swiftinterface -module-name Test
5+
// RUN: %FileCheck %s --check-prefix FROMMODULE --check-prefix CHECK < %t/TestFromModule.swiftinterface
56

67
// CHECK: public struct Foo : Hashable {
78
public struct Foo: Hashable {
89
// CHECK: public var inlinableGetPublicSet: [[INT:(Swift.)?Int]] {
910
public var inlinableGetPublicSet: Int {
10-
// CHECK: @inlinable get {
11-
// CHECK-NEXT: return 3
12-
// CHECK-NEXT: }
11+
// FROMSOURCE: @inlinable get {
12+
// FROMMODULE: @inlinable get{{$}}
13+
// FROMSOURCE-NEXT: return 3
14+
// FROMSOURCE-NEXT: }
1315
@inlinable
1416
get {
1517
return 3
@@ -35,11 +37,11 @@ public struct Foo: Hashable {
3537
// CHECK-NEXT: {{^}} }
3638
}
3739

38-
3940
// CHECK: @_transparent public var transparent: [[INT]] {
40-
// CHECK-NEXT: get {
41-
// CHECK-NEXT: return 34
42-
// CHECK-NEXT: }
41+
// FROMMODULE-NEXT: get{{$}}
42+
// FROMSOURCE-NEXT: get {
43+
// FROMSOURCE-NEXT: return 34
44+
// FROMSOURCE-NEXT: }
4345
// CHECK-NEXT: }
4446
@_transparent
4547
public var transparent: Int {
@@ -52,17 +54,18 @@ public struct Foo: Hashable {
5254
get {
5355
return 34
5456
}
55-
// CHECK-NEXT: @_transparent set[[NEWVALUE]] {
56-
// CHECK-NOT: #if false
57-
// CHECK-NOT: print("I should not appear")
58-
// CHECK-NOT: #else
59-
// CHECK-NOT: #if false
60-
// CHECK-NOT: print("I also should not")
61-
// CHECK-NOT: #else
62-
// CHECK: print("I am set to \(newValue)")
63-
// CHECK-NOT: #endif
64-
// CHECK-NOT: #endif
65-
// CHECK-NEXT: }
57+
// FROMMODULE-NEXT: @_transparent set[[NEWVALUE]]{{$}}
58+
// FROMSOURCE-NEXT: @_transparent set[[NEWVALUE]] {
59+
// FROMSOURCE-NOT: #if false
60+
// FROMSOURCE-NOT: print("I should not appear")
61+
// FROMSOURCE-NOT: #else
62+
// FROMSOURCE-NOT: #if false
63+
// FROMSOURCE-NOT: print("I also should not")
64+
// FROMSOURCE-NOT: #else
65+
// FROMSOURCE: print("I am set to \(newValue)")
66+
// FROMSOURCE-NOT: #endif
67+
// FROMSOURCE-NOT: #endif
68+
// FROMSOURCE-NEXT: }
6669
@_transparent
6770
set {
6871
#if false
@@ -80,20 +83,22 @@ public struct Foo: Hashable {
8083
// CHECK: @inlinable public var inlinableProperty: [[INT]] {
8184
@inlinable
8285
public var inlinableProperty: Int {
83-
// CHECK: get {
84-
// CHECK: return 32
85-
// CHECK: }
86+
// FROMMODULE: get{{$}}
87+
// FROMSOURCE: get {
88+
// FROMSOURCE-NEXT: return 32
89+
// FROMSOURCE-NEXT: }
8690
get {
8791
return 32
8892
}
8993

90-
// CHECK: set[[NEWVALUE]] {
91-
// CHECK-NOT: #if true
92-
// CHECK: print("I am set to \(newValue)")
93-
// CHECK-NOT: #else
94-
// CHECK-NOT: print("I should not appear")
95-
// CHECK-NOT #endif
96-
// CHECK: }
94+
// FROMMODULE: set[[NEWVALUE]]{{$}}
95+
// FROMSOURCE: set[[NEWVALUE]] {
96+
// FROMSOURCE-NOT: #if true
97+
// FROMSOURCE: print("I am set to \(newValue)")
98+
// FROMSOURCE-NOT: #else
99+
// FROMSOURCE-NOT: print("I should not appear")
100+
// FROMSOURCE-NOT #endif
101+
// FROMSOURCE: }
97102
set {
98103
#if true
99104
print("I am set to \(newValue)")
@@ -107,16 +112,18 @@ public struct Foo: Hashable {
107112
// CHECK: @inlinable public var inlinableReadAndModify: [[INT]] {
108113
@inlinable
109114
public var inlinableReadAndModify: Int {
110-
// CHECK: _read {
111-
// CHECK-NEXT: yield 0
112-
// CHECK-NEXT: }
115+
// FROMMODULE: _read{{$}}
116+
// FROMSOURCE: _read {
117+
// FROMSOURCE-NEXT: yield 0
118+
// FROMSOURCE-NEXT: }
113119
_read {
114120
yield 0
115121
}
116-
// CHECK: _modify {
117-
// CHECK-NEXT: var x = 0
118-
// CHECK-NEXT: yield &x
119-
// CHECK-NEXT: }
122+
// FROMMODULE: _modify{{$}}
123+
// FROMSOURCE: _modify {
124+
// FROMSOURCE-NEXT: var x = 0
125+
// FROMSOURCE-NEXT: yield &x
126+
// FROMSOURCE-NEXT: }
120127
_modify {
121128
var x = 0
122129
yield &x
@@ -126,9 +133,10 @@ public struct Foo: Hashable {
126133

127134
// CHECK: public var inlinableReadNormalModify: [[INT]] {
128135
public var inlinableReadNormalModify: Int {
129-
// CHECK: @inlinable _read {
130-
// CHECK-NEXT: yield 0
131-
// CHECK-NEXT: }
136+
// FROMMODULE: @inlinable _read{{$}}
137+
// FROMSOURCE: @inlinable _read {
138+
// FROMSOURCE-NEXT: yield 0
139+
// FROMSOURCE-NEXT: }
132140
@inlinable _read {
133141
yield 0
134142
}
@@ -153,10 +161,11 @@ public struct Foo: Hashable {
153161
yield 0
154162
}
155163

156-
// CHECK: @inlinable _modify {
157-
// CHECK-NEXT: var x = 0
158-
// CHECK-NEXT: yield &x
159-
// CHECK-NEXT: }
164+
// FROMMODULE: @inlinable _modify{{$}}
165+
// FROMSOURCE: @inlinable _modify {
166+
// FROMSOURCE-NEXT: var x = 0
167+
// FROMSOURCE-NEXT: yield &x
168+
// FROMSOURCE-NEXT: }
160169
@inlinable _modify {
161170
var x = 0
162171
yield &x
@@ -176,12 +185,13 @@ public struct Foo: Hashable {
176185
// CHECK-NEXT: }
177186
}
178187

179-
// CHECK: @inlinable public func inlinableMethod() {
180-
// CHECK-NOT: #if NO
181-
// CHECK-NOT: print("Hello, world!")
182-
// CHECK-NOT: #endif
183-
// CHECK: print("Goodbye, world!")
184-
// CHECK-NEXT: }
188+
// FROMMODULE: @inlinable public func inlinableMethod(){{$}}
189+
// FROMSOURCE: @inlinable public func inlinableMethod() {
190+
// FROMSOURCE-NOT: #if NO
191+
// FROMSOURCE-NOT: print("Hello, world!")
192+
// FROMSOURCE-NOT: #endif
193+
// FROMSOURCE: print("Goodbye, world!")
194+
// FROMSOURCE-NEXT: }
185195
@inlinable
186196
public func inlinableMethod() {
187197
#if NO
@@ -191,9 +201,10 @@ public struct Foo: Hashable {
191201
}
192202

193203

194-
// CHECK: @_transparent [[ATTRS:(mutating public|public mutating)]] func transparentMethod() {
195-
// CHECK-NEXT: inlinableProperty = 4
196-
// CHECK-NEXT: }
204+
// FROMMODULE: @_transparent [[ATTRS:(mutating public|public mutating)]] func transparentMethod(){{$}}
205+
// FROMSOURCE: @_transparent [[ATTRS:(mutating public|public mutating)]] func transparentMethod() {
206+
// FROMSOURCE-NEXT: inlinableProperty = 4
207+
// FROMSOURCE-NEXT: }
197208
@_transparent
198209
mutating public func transparentMethod() {
199210
inlinableProperty = 4
@@ -207,15 +218,17 @@ public struct Foo: Hashable {
207218

208219
// CHECK: public subscript(i: [[INT]]) -> [[INT]] {
209220
// CHECK-NEXT: get{{$}}
210-
// CHECK-NEXT: @inlinable set[[NEWVALUE]] { print("set") }
221+
// FROMSOURCE-NEXT: @inlinable set[[NEWVALUE]] { print("set") }
222+
// FROMMODULE-NEXT: @inlinable set[[NEWVALUE]]{{$}}
211223
// CHECK-NEXT: }
212224
public subscript(i: Int) -> Int {
213225
get { return 0 }
214226
@inlinable set { print("set") }
215227
}
216228

217229
// CHECK: public subscript(j: [[INT]], k: [[INT]]) -> [[INT]] {
218-
// CHECK-NEXT: @inlinable get { return 0 }
230+
// FROMMODULE-NEXT: @inlinable get{{$}}
231+
// FROMSOURCE-NEXT: @inlinable get { return 0 }
219232
// CHECK-NEXT: set[[NEWVALUE]]{{$}}
220233
// CHECK-NEXT: }
221234
public subscript(j: Int, k: Int) -> Int {
@@ -224,20 +237,23 @@ public struct Foo: Hashable {
224237
}
225238

226239
// CHECK: @inlinable public subscript(l: [[INT]], m: [[INT]], n: [[INT]]) -> [[INT]] {
227-
// CHECK-NEXT: get { return 0 }
228-
// CHECK-NEXT: set[[NEWVALUE]] { print("set") }
240+
// FROMMODULE-NEXT: get{{$}}
241+
// FROMSOURCE-NEXT: get { return 0 }
242+
// FROMMODULE-NEXT: set[[NEWVALUE]]{{$}}
243+
// FROMSOURCE-NEXT: set[[NEWVALUE]] { print("set") }
229244
// CHECK-NEXT: }
230245
@inlinable
231246
public subscript(l: Int, m: Int, n: Int) -> Int {
232247
get { return 0 }
233248
set { print("set") }
234249
}
235250

236-
// CHECK: public init(value: [[INT]]) {
237-
// CHECK-NEXT: topLevelUsableFromInline()
238-
// CHECK-NEXT: noAccessors = value
239-
// CHECK-NEXT: hasDidSet = value
240-
// CHECK-NEXT: }
251+
// FROMMODULE: @inlinable public init(value: [[INT]]){{$}}
252+
// FROMSOURCE: @inlinable public init(value: [[INT]]) {
253+
// FROMSOURCE-NEXT: topLevelUsableFromInline()
254+
// FROMSOURCE-NEXT: noAccessors = value
255+
// FROMSOURCE-NEXT: hasDidSet = value
256+
// FROMSOURCE-NEXT: }
241257
@inlinable public init(value: Int) {
242258
topLevelUsableFromInline()
243259
noAccessors = value
@@ -266,9 +282,10 @@ internal func topLevelUsableFromInline() {
266282
topLevelPrivate()
267283
}
268284

269-
// CHECK: @inlinable public func topLevelInlinable() {
270-
// CHECK-NEXT: topLevelUsableFromInline()
271-
// CHECK-NEXT: }
285+
// FROMMODULE: @inlinable public func topLevelInlinable(){{$}}
286+
// FROMSOURCE: @inlinable public func topLevelInlinable() {
287+
// FROMSOURCE-NEXT: topLevelUsableFromInline()
288+
// FROMSOURCE-NEXT: }
272289
@inlinable public func topLevelInlinable() {
273290
topLevelUsableFromInline()
274291
}
@@ -278,9 +295,10 @@ public class HasInlinableDeinit {
278295
// CHECK: public init(){{$}}
279296
public init() {}
280297

281-
// CHECK: [[OBJC:(@objc )?]]@inlinable deinit {
282-
// CHECK-NEXT: print("goodbye")
283-
// CHECK-NEXT: }
298+
// FROMMODULE: [[OBJC:(@objc )?]]@inlinable deinit{{$}}
299+
// FROMSOURCE: [[OBJC:(@objc )?]]@inlinable deinit {
300+
// FROMSOURCE-NEXT: print("goodbye")
301+
// FROMSOURCE-NEXT: }
284302
@inlinable deinit {
285303
print("goodbye")
286304
}

test/ParseableInterface/modifiers.swift

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %target-swift-frontend -emit-module -o %t/Test.swiftmodule -emit-parseable-module-interface-path %t/Test.swiftinterface -module-name Test -disable-objc-attr-requires-foundation-module -enable-objc-interop %s
3-
// RUN: %FileCheck %s < %t/Test.swiftinterface
4-
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -disable-objc-attr-requires-foundation-module -emit-parseable-module-interface-path - -module-name Test -enable-objc-interop | %FileCheck %s
3+
// RUN: %FileCheck %s --check-prefix FROMSOURCE --check-prefix CHECK < %t/Test.swiftinterface
4+
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -disable-objc-attr-requires-foundation-module -emit-parseable-module-interface-path - -module-name Test -enable-objc-interop | %FileCheck %s --check-prefix FROMMODULE --check-prefix CHECK
55

66
// CHECK-LABEL: final public class FinalClass {
77
public final class FinalClass {
88
// CHECK: @inlinable final public class var a: [[INT:(Swift.)?Int]] {
9-
// CHECK-NEXT: {{^}} get {
10-
// CHECK-NEXT: return 3
11-
// CHECK-NEXT: }
9+
// FROMSOURCE-NEXT: {{^}} get {
10+
// FROMSOURCE-NEXT: return 3
11+
// FROMSOURCE-NEXT: }
12+
// FROMMODULE-NEXT: get{{$}}
1213
// CHECK-NEXT: }
1314
@inlinable
1415
public final class var a: Int {
1516
return 3
1617
}
1718

1819
// CHECK: final public class var b: [[INT]] {
19-
// CHECK-NEXT: {{^}} @inlinable get {
20-
// CHECK-NEXT: return 3
21-
// CHECK-NEXT: }
20+
// FROMSOURCE-NEXT: {{^}} @inlinable get {
21+
// FROMSOURCE-NEXT: return 3
22+
// FROMSOURCE-NEXT: }
23+
// FROMMODULE-NEXT: {{^}} @inlinable get{{$}}
2224
// CHECK-NEXT: set[[NEWVALUE:(\(newValue\))?]]{{$}}
2325
// CHECK-NEXT: }
2426
public final class var b: Int {
@@ -32,7 +34,8 @@ public final class FinalClass {
3234

3335
// CHECK: public static var c: [[INT]] {
3436
// CHECK-NEXT: {{^}} get
35-
// CHECK-NEXT: @inlinable set[[NEWVALUE]] {}
37+
// FROMSOURCE-NEXT: @inlinable set[[NEWVALUE]] {}
38+
// FROMMODULE-NEXT: @inlinable set[[NEWVALUE]]{{$}}
3639
// CHECK-NEXT: }
3740
public static var c: Int {
3841
get {
@@ -85,7 +88,8 @@ public class SubExplicit: Base {
8588
public struct MyStruct {
8689
// CHECK: public var e: [[INT]] {
8790
// CHECK-NEXT: {{^}} mutating get{{$}}
88-
// CHECK-NEXT: {{^}} @inlinable nonmutating set[[NEWVALUE]] {}
91+
// FROMSOURCE-NEXT: {{^}} @inlinable nonmutating set[[NEWVALUE]] {}
92+
// FROMMODULE-NEXT: {{^}} @inlinable nonmutating set[[NEWVALUE]]{{$}}
8993
// CHECK-NEXT: }
9094
public var e: Int {
9195
mutating get { return 0 }

0 commit comments

Comments
 (0)