Skip to content

Commit 7d50b6a

Browse files
committed
[ClosureSpecializer] use shared linkage for new functions.
This avoids unresolved-symbol errors in case the original function has external linkage.
1 parent 27fad7d commit 7d50b6a

File tree

4 files changed

+16
-10
lines changed

4 files changed

+16
-10
lines changed

lib/SILOptimizer/IPO/ClosureSpecializer.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,12 @@ ClosureSpecCloner::initCloned(const CallSiteDescriptor &CallSiteDesc,
547547
// We make this function bare so we don't have to worry about decls in the
548548
// SILArgument.
549549
auto *Fn = M.getOrCreateFunction(
550-
ClosureUser->getLinkage(), ClonedName, ClonedTy,
550+
// It's important to use a shared linkage for the specialized function
551+
// and not the original linkage.
552+
// Otherwise the new function could have an external linkage (in case the
553+
// original function was de-serialized) and would not be code-gen'd.
554+
getSpecializedLinkage(ClosureUser, ClosureUser->getLinkage()),
555+
ClonedName, ClonedTy,
551556
ClosureUser->getContextGenericParams(), ClosureUser->getLocation(),
552557
IsBare, ClosureUser->isTransparent(), ClosureUser->isFragile(),
553558
ClosureUser->isThunk(), ClosureUser->getClassVisibility(),

test/SILOptimizer/closure_specialize.sil

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import Builtin
44
import Swift
55

6-
// CHECK-LABEL: sil [noinline] @_TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TF7specgen12take_closureFFTSiSi_T_T_ : $@convention(thin) (Int) -> () {
6+
// CHECK-LABEL: sil shared [noinline] @_TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TF7specgen12take_closureFFTSiSi_T_T_ : $@convention(thin) (Int) -> () {
77
// CHECK: bb0(%0 : $Int)
88
// CHECK: function_ref @_TFF7specgen6callerFSiT_U_FTSiSi_T_
99
// CHECK: partial_apply
1010

11-
// CHECK-LABEL: sil [noinline] @_TTSf1cl27_TF7specgen6calleeFTSiSi_T____TF7specgen12take_closureFFTSiSi_T_T_ : $@convention(thin) () -> () {
11+
// CHECK-LABEL: sil shared [noinline] @_TTSf1cl27_TF7specgen6calleeFTSiSi_T____TF7specgen12take_closureFFTSiSi_T_T_ : $@convention(thin) () -> () {
1212
// CHECK-NEXT: bb0:
1313
// CHECK: [[FUN:%.*]] = function_ref @_TF7specgen6calleeFTSiSi_T_ : $@convention(thin) (Int, Int) -> ()
1414
// CHECK: thin_to_thick_function [[FUN]] : $@convention(thin) (Int, Int) -> () to $@callee_owned (Int, Int) -> ()
@@ -24,12 +24,12 @@ bb0(%0 : $@callee_owned (Int, Int) -> ()):
2424
return %9999 : $()
2525
}
2626

27-
// CHECK-LABEL: sil [noinline] @_TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TF7specgen13take_closure2FFTSiSi_T_T_ : $@convention(thin) (Int) -> () {
27+
// CHECK-LABEL: sil shared [noinline] @_TTSf1cl35_TFF7specgen6callerFSiT_U_FTSiSi_T_Si___TF7specgen13take_closure2FFTSiSi_T_T_ : $@convention(thin) (Int) -> () {
2828
// CHECK: bb0(%0 : $Int)
2929
// CHECK: [[FUN:%.*]] = function_ref @_TFF7specgen6callerFSiT_U_FTSiSi_T_
3030
// CHECK: partial_apply [[FUN]](
3131

32-
// CHECK-LABEL: sil [noinline] @_TTSf1cl27_TF7specgen6calleeFTSiSi_T____TF7specgen13take_closure2FFTSiSi_T_T_ : $@convention(thin) () -> () {
32+
// CHECK-LABEL: sil shared [noinline] @_TTSf1cl27_TF7specgen6calleeFTSiSi_T____TF7specgen13take_closure2FFTSiSi_T_T_ : $@convention(thin) () -> () {
3333
// CHECK-NEXT: bb0:
3434
// CHECK: [[FUN:%.*]] = function_ref @_TF7specgen6calleeFTSiSi_T_ : $@convention(thin) (Int, Int) -> ()
3535
// CHECK: thin_to_thick_function [[FUN]] : $@convention(thin) (Int, Int) -> () to $@callee_owned (Int, Int) -> ()
@@ -163,6 +163,7 @@ bb0(%0 : $A, %1 : $A):
163163
return %4 : $()
164164
}
165165

166+
// CHECK-LABEL: sil shared {{.*}} @_TTS{{.*}}use_closure : $@convention(thin) (@owned A) -> () {
166167
sil hidden [noinline] @use_closure : $@convention(thin) (@owned @callee_owned (@owned A) -> ()) -> () {
167168
bb0(%0 : $@callee_owned (@owned A) -> ()):
168169
%1 = alloc_ref $A

test/SILOptimizer/closure_specialize_consolidated.sil

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.Int32, %2 : $Builtin.NativeObject,
8787
return %9999 : $()
8888
}
8989

90-
// CHECK-LABEL: sil @_TTSf1cl20large_closure_calleeBoBi32_BoBo_n_n_n_n__owned_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject, @owned Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @owned Builtin.NativeObject) -> () {
90+
// CHECK-LABEL: sil shared @_TTSf1cl20large_closure_calleeBoBi32_BoBo_n_n_n_n__owned_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject, @owned Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @owned Builtin.NativeObject) -> () {
9191
// CHECK: bb0
9292
// CHECK: [[FUN:%.*]] = function_ref @large_closure_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject, Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> ()
9393
// CHECK: [[CLOSURE:%.*]] = partial_apply [[FUN]](
9494
// CHECK: apply [[CLOSURE]](
9595
// CHECK: release_value [[CLOSURE]]
9696

97-
// CHECK-LABEL: sil @_TTSf1cl20small_closure_callee_n_n_n_n__owned_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> () {
97+
// CHECK-LABEL: sil shared @_TTSf1cl20small_closure_callee_n_n_n_n__owned_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> () {
9898
// CHECK: bb0
9999
// CHECK: [[FUN:%.*]] = function_ref @small_closure_callee
100100
// CHECK: [[CLOSURE:%.*]] = thin_to_thick_function [[FUN]] : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> () to $@callee_owned (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> ()
@@ -112,14 +112,14 @@ bb0(%0 : $@callee_owned (Builtin.NativeObject, Builtin.Int32, @owned Builtin.Nat
112112
return %9999 : $()
113113
}
114114

115-
// CHECK-LABEL: sil @_TTSf1cl20large_closure_calleeBoBi32_BoBo_n_n_n_n__guaranteed_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject, @owned Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @owned Builtin.NativeObject) -> () {
115+
// CHECK-LABEL: sil shared @_TTSf1cl20large_closure_calleeBoBi32_BoBo_n_n_n_n__guaranteed_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject, @owned Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @owned Builtin.NativeObject) -> () {
116116
// CHECK: bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.Int32, %2 : $Builtin.NativeObject, %3 : $Builtin.NativeObject, %4 : $Builtin.NativeObject, %5 : $Builtin.Int32, %6 : $Builtin.NativeObject, %7 : $Builtin.NativeObject):
117117
// CHECK: [[FUN:%.*]] = function_ref @large_closure_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject, Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> ()
118118
// CHECK: [[CLOSURE:%.*]] = partial_apply [[FUN]](
119119
// CHECK: apply [[CLOSURE]](
120120
// CHECK: release_value [[CLOSURE]]
121121

122-
// CHECK-LABEL: sil @_TTSf1cl20small_closure_callee_n_n_n_n__guaranteed_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> () {
122+
// CHECK-LABEL: sil shared @_TTSf1cl20small_closure_callee_n_n_n_n__guaranteed_apply_callee : $@convention(thin) (Builtin.NativeObject, Builtin.Int32, @owned Builtin.NativeObject, @guaranteed Builtin.NativeObject) -> () {
123123
// CHECK: bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.Int32, %2 : $Builtin.NativeObject, %3 : $Builtin.NativeObject):
124124
// CHECK: [[FUN:%.*]] = function_ref @small_closure_callee
125125
// CHECK: [[CLOSURE:%.*]] = thin_to_thick_function [[FUN]] :

test/SILOptimizer/closure_specialize_simple.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Swift
55

66
sil @simple_partial_apply_fun : $@convention(thin) (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
77

8-
// CHECK-LABEL: sil @_TTSf1cl24simple_partial_apply_funBi1___simple_partial_apply_caller : $@convention(thin) (Builtin.Int1) -> Builtin.Int1 {
8+
// CHECK-LABEL: sil shared @_TTSf1cl24simple_partial_apply_funBi1___simple_partial_apply_caller : $@convention(thin) (Builtin.Int1) -> Builtin.Int1 {
99
// CHECK: bb0([[CAPTURED_ARG:%.*]] : $Builtin.Int1):
1010
// CHECK: [[CLOSED_OVER_FUN:%.*]] = function_ref @simple_partial_apply_fun :
1111
// CHECK: [[NEW_PAI:%.*]] = partial_apply [[CLOSED_OVER_FUN]]

0 commit comments

Comments
 (0)