mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Only foreign thunks need to be serialized, not foreign definitions
This eliminates a SIL verification error with `@c` functions, which provide definitions for foreign entrypoints. We were serializing @c definitions when we shouldn't be, which would cause problems down the line if those @c definitions referenced something internal that they shouldn't.
This commit is contained in:
@@ -1025,7 +1025,8 @@ SerializedKind_t SILDeclRef::getSerializedKind() const {
|
||||
// @objc thunks for top-level functions are serializable since they're
|
||||
// referenced from @convention(c) conversions inside inlinable
|
||||
// functions.
|
||||
return IsSerialized;
|
||||
if (isThunk())
|
||||
return IsSerialized;
|
||||
}
|
||||
|
||||
// Declarations imported from Clang modules are serialized if
|
||||
|
||||
@@ -6,4 +6,4 @@ func zerome(ptr: UnsafeMutablePointer<Int>) {
|
||||
}
|
||||
|
||||
// Verify that the asmname is "memset", not a C++-mangled version
|
||||
// CHECK: sil [serialized] [asmname "memset"] [clang memset] @$sSo6memsetySvSgAB_s5Int32VSitFTo : $@convention(c) (Optional<UnsafeMutableRawPointer>, Int32, Int) -> Optional<UnsafeMutableRawPointer>
|
||||
// CHECK: sil [asmname "memset"] [clang memset] @$sSo6memsetySvSgAB_s5Int32VSitFTo : $@convention(c) (Optional<UnsafeMutableRawPointer>, Int32, Int) -> Optional<UnsafeMutableRawPointer>
|
||||
|
||||
@@ -35,4 +35,4 @@ public func test() {
|
||||
|
||||
// CHECK-LABEL: sil {{.*}}[asmname "{{.*}}test{{.*}}"] [clang DeletedSpecialMembers.test] @$sSo21DeletedSpecialMembersV4tests5Int32VyFTo : $@convention(cxx_method) (DeletedSpecialMembers) -> Int32
|
||||
|
||||
// CHECK-LABEL: sil [serialized] [asmname "{{.*}}mutate{{.*}}"] [clang mutateIt] @$sSo8mutateItyySo21DeletedSpecialMembersVFTo : $@convention(c) (DeletedSpecialMembers) -> ()
|
||||
// CHECK-LABEL: sil [asmname "{{.*}}mutate{{.*}}"] [clang mutateIt] @$sSo8mutateItyySo21DeletedSpecialMembersVFTo : $@convention(c) (DeletedSpecialMembers) -> ()
|
||||
|
||||
@@ -33,7 +33,7 @@ func requiresThunk() {
|
||||
acceptSwiftFunc(orange)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil [serialized] [asmname "cauliflower"] [ossa] @$s5cdecl8broccoliyS2iFTo : $@convention(c) (Int) -> Int {
|
||||
// CHECK-LABEL: sil [asmname "cauliflower"] [ossa] @$s5cdecl8broccoliyS2iFTo : $@convention(c) (Int) -> Int {
|
||||
// CHECK-NOT: apply
|
||||
// CHECK: return
|
||||
@c(cauliflower)
|
||||
|
||||
@@ -10,7 +10,7 @@ func withCName(_ x: Int) -> Int
|
||||
@_extern(c, "take_c_func_ptr")
|
||||
func takeCFuncPtr(_ f: @convention(c) (Int) -> Int)
|
||||
|
||||
// CHECK-DAG: sil [serialized] [asmname "public_visible"] @$s8extern_c16publicVisibilityyS2iFTo : $@convention(c) (Int) -> Int
|
||||
// CHECK-DAG: sil [asmname "public_visible"] @$s8extern_c16publicVisibilityyS2iFTo : $@convention(c) (Int) -> Int
|
||||
@_extern(c, "public_visible")
|
||||
public func publicVisibility(_ x: Int) -> Int
|
||||
|
||||
|
||||
@@ -26,9 +26,6 @@
|
||||
// Never referenced.
|
||||
// LIBRARY-IR-NOT: @"$es23_swiftEmptyArrayStorageSi_S3itvp" = linkonce_odr {{(protected |dllexport )?}}global
|
||||
|
||||
// Note: referenced by swift_allocEmptyBox.
|
||||
// LIBRARY-IR: @"$es16_emptyBoxStorageSi_Sitvp" = linkonce_odr {{(protected |dllexport )?}}global
|
||||
|
||||
// LIBRARY-IR-NOT: define {{.*}}@"$e7Library5helloSaySiGyF"()
|
||||
public func hello() -> [Int] {
|
||||
getArray()
|
||||
|
||||
32
test/embedded/serialization.swift
Normal file
32
test/embedded/serialization.swift
Normal file
@@ -0,0 +1,32 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: split-file %s %t
|
||||
|
||||
// Library module
|
||||
|
||||
// SIL checking
|
||||
// RUN: %target-swift-frontend %t/Library.swift -parse-as-library -entry-point-function-name Library_main -enable-experimental-feature Embedded -enable-experimental-feature DeferredCodeGen -emit-sil -emit-module-path %t/Modules/Library.swiftmodule -o - | %FileCheck -check-prefix LIBRARY-SIL %s
|
||||
|
||||
// RUN: %target-swift-frontend %t/Application.swift -I %t/Modules -parse-as-library -entry-point-function-name Application_main -enable-experimental-feature Embedded -emit-sil -o - | %FileCheck -check-prefix APPLICATION-SIL %s
|
||||
|
||||
// REQUIRES: swift_in_compiler
|
||||
// REQUIRES: swift_feature_Embedded
|
||||
// REQUIRES: swift_feature_DeferredCodeGen
|
||||
|
||||
//--- Library.swift
|
||||
|
||||
func internalFunc() { }
|
||||
|
||||
// LIBRARY-SIL: sil [asmname "swift_dosomething"] @$e7Library17swift_dosomethingyyFTo : $@convention(c) () -> () {
|
||||
@c
|
||||
public func swift_dosomething() {
|
||||
internalFunc()
|
||||
}
|
||||
|
||||
//--- Application.swift
|
||||
import Library
|
||||
|
||||
// APPLICATION-SIL-LABEL: sil @$e11Application4testyyF : $@convention(thin) () -> ()
|
||||
public func test() {
|
||||
// CHECK: function_ref @$e7Library17swift_dosomethingyyFTo : $@convention(c) () -> ()
|
||||
swift_dosomething()
|
||||
}
|
||||
Reference in New Issue
Block a user