Skip to content

Commit 09efe03

Browse files
authored
Merge pull request swiftlang#78188 from tshortli/silgen-name-linkage-6.1
[6.1] SIL: Always give `@_silgen_name` forward declarations public linkage
2 parents 0a22dd0 + 0619a83 commit 09efe03

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

lib/SIL/IR/SILDeclRef.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,14 @@ SILLinkage SILDeclRef::getDefinitionLinkage() const {
651651
effectiveAccess = std::max(effectiveAccess, AccessLevel::Internal);
652652
}
653653

654+
// Declarations with a @_silgen_name attribute and no body may be forward
655+
// declarations of functions defined in another module. Therefore they must
656+
// always have external (public) linkage, regardless of declared access level.
657+
if (auto afd = getAbstractFunctionDecl()) {
658+
if (!afd->hasBody() && afd->getAttrs().hasAttribute<SILGenNameAttr>())
659+
effectiveAccess = AccessLevel::Public;
660+
}
661+
654662
switch (effectiveAccess) {
655663
case AccessLevel::Private:
656664
case AccessLevel::FilePrivate:

test/IRGen/silgen_name_linkage.swift

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// RUN: %target-swift-frontend -parse-as-library -emit-ir %s | %FileCheck %s
2+
3+
// Since this test depends on weak linking based on availability, it only
4+
// applies to Apple platforms.
5+
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=visionos
6+
7+
@available(SwiftStdlib 9999, *)
8+
@_silgen_name("privateForwardDecl")
9+
private func privateForwardDecl()
10+
11+
@available(SwiftStdlib 9999, *)
12+
@_silgen_name("internalForwardDecl")
13+
internal func internalForwardDecl()
14+
15+
@available(SwiftStdlib 9999, *)
16+
@_silgen_name("publicForwardDecl")
17+
public func publicForwardDecl()
18+
19+
@available(SwiftStdlib 9999, *)
20+
@_silgen_name("privateDefined")
21+
private func privateDefined() {}
22+
23+
// CHECK: define internal swiftcc void @privateDefined()
24+
25+
@available(SwiftStdlib 9999, *)
26+
@_silgen_name("internalDefined")
27+
internal func internalDefined() {}
28+
29+
// CHECK: define hidden swiftcc void @internalDefined()
30+
31+
@available(SwiftStdlib 9999, *)
32+
@_silgen_name("publicDefined")
33+
public func publicDefined() {}
34+
35+
// CHECK: define swiftcc void @publicDefined()
36+
37+
public func test() {
38+
guard #available(SwiftStdlib 9999, *) else { return }
39+
privateForwardDecl()
40+
internalForwardDecl()
41+
publicForwardDecl()
42+
privateDefined()
43+
internalDefined()
44+
publicDefined()
45+
}
46+
47+
// CHECK: declare extern_weak swiftcc void @privateForwardDecl()
48+
// CHECK: declare extern_weak swiftcc void @internalForwardDecl()
49+
// CHECK: declare extern_weak swiftcc void @publicForwardDecl()

0 commit comments

Comments
 (0)