Skip to content

Commit d7b44f4

Browse files
authored
Merge pull request #80718 from j-hui/fix-interop-private-debug-symbols-6.2
2 parents 942eddf + bafcb9d commit d7b44f4

File tree

4 files changed

+169
-11
lines changed

4 files changed

+169
-11
lines changed

lib/IRGen/IRGenDebugInfo.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2577,8 +2577,13 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
25772577

25782578
// Scope outermost fileprivate decls in an inline private discriminator
25792579
// namespace.
2580+
//
2581+
// We need to don't do this for decls imported from Clang modules because
2582+
// the scopes of C/C++ symbols are not restricted to a particular file unit.
25802583
if (auto *Decl = DbgTy.getDecl())
2581-
if (Decl->isOutermostPrivateOrFilePrivateScope())
2584+
if (Decl->isOutermostPrivateOrFilePrivateScope() &&
2585+
!isa<ClangModuleUnit>(
2586+
Decl->getDeclContext()->getModuleScopeContext()))
25822587
Scope = getFilePrivateScope(Scope, Decl);
25832588

25842589
return Scope;

test/Interop/Cxx/class/access/Inputs/non-public.h

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,26 @@ __attribute__((__swift_attr__("private_fileid:main/blessed.swift"))) MyClass {
2121
void publMethod(void) const {}
2222
void publMutatingMethod(void) {}
2323
int publVar;
24-
static void publStaticFunc(void);
25-
static int publStaticVar;
24+
static void publStaticFunc(void) {};
25+
static inline int publStaticVar = 0;
2626

2727
typedef int publTypedef;
28-
struct publStruct {};
28+
publTypedef publTypedefMake(void) const { return 42; }
29+
void publTypedefTake(publTypedef x) const { }
30+
31+
struct publStruct { int x; };
32+
publStruct publStructMake(void) const { return publStruct{}; }
33+
void publStructTake(publStruct x) const { }
2934

3035
enum publEnum { variantPublEnum };
31-
enum { publEnumAnonValue1 };
36+
publEnum publEnumMake(void) const { return variantPublEnum; }
37+
void publEnumTake(publEnum x) const { }
38+
3239
enum class publEnumClass { variantPublEnumClass };
40+
publEnumClass publEnumClassMake(void) const { return publEnumClass::variantPublEnumClass; }
41+
void publEnumClassTake(publEnumClass x) const { }
42+
43+
enum { publEnumAnonValue1 };
3344
enum publEnumClosed {
3445
variantPublEnumClosed
3546
} __attribute__((enum_extensibility(closed)));
@@ -42,15 +53,26 @@ __attribute__((__swift_attr__("private_fileid:main/blessed.swift"))) MyClass {
4253
void privMethod(void) const {}
4354
void privMutatingMethod(void) {}
4455
int privVar;
45-
static void privStaticFunc(void);
46-
static int privStaticVar;
56+
static void privStaticFunc(void) {};
57+
static inline int privStaticVar = 0;
4758

4859
typedef int privTypedef;
49-
struct privStruct {};
60+
privTypedef privTypedefMake(void) const { return 42; }
61+
void privTypedefTake(privTypedef x) const { }
62+
63+
struct privStruct { int x; };
64+
privStruct privStructMake(void) const { return privStruct{}; }
65+
void privStructTake(privStruct x) const { }
5066

5167
enum privEnum { variantPrivEnum };
52-
enum { privEnumAnonValue1 };
68+
privEnum privEnumMake(void) const { return variantPrivEnum; }
69+
void privEnumTake(privEnum x) const { }
70+
5371
enum class privEnumClass { variantPrivEnumClass };
72+
privEnumClass privEnumClassMake(void) const { return privEnumClass::variantPrivEnumClass; }
73+
void privEnumClassTake(privEnumClass x) const { }
74+
75+
enum { privEnumAnonValue1 };
5476
enum privEnumClosed {
5577
variantPrivEnumClosed
5678
} __attribute__((enum_extensibility(closed)));
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
//--- blessed.swift
2+
// RUN: split-file %s %t
3+
// RUN: %target-swift-frontend -emit-ir -module-name main %t/blessed.swift -I %S/Inputs -cxx-interoperability-mode=default -Onone | %FileCheck %s
4+
// RUN: %target-swift-frontend -emit-ir -module-name main %t/blessed.swift -I %S/Inputs -cxx-interoperability-mode=default -Onone -g | %FileCheck %s
5+
6+
import NonPublic
7+
8+
// These extension methods are just here to make it clear what we are doing to
9+
// each Int32-typed member.
10+
extension Int32 {
11+
func read() { }
12+
mutating func write() { }
13+
}
14+
15+
extension MyClass {
16+
public func extMethod() {
17+
publMethod()
18+
privMethod()
19+
}
20+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extMethod{{.*}}"
21+
// CHECK: {{invoke|call}} void @{{.*}}publMethod{{.*}}
22+
// CHECK: {{invoke|call}} void @{{.*}}privMethod{{.*}}
23+
24+
public mutating func extMutatingMethod() {
25+
publMutatingMethod()
26+
privMutatingMethod()
27+
}
28+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extMutatingMethod{{.*}}"
29+
// CHECK: {{invoke|call}} void @{{.*}}publMutatingMethod{{.*}}
30+
// CHECK: {{invoke|call}} void @{{.*}}privMutatingMethod{{.*}}
31+
32+
public func extVarRead() {
33+
publVar.read()
34+
privVar.read()
35+
}
36+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extVarRead{{.*}}"
37+
38+
public mutating func extVarWrite() {
39+
publVar.write()
40+
privVar.write()
41+
}
42+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extVarWrite{{.*}}"
43+
44+
public func extStaticFunc() {
45+
MyClass.publStaticFunc()
46+
MyClass.privStaticFunc()
47+
}
48+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticFunc{{.*}}"
49+
// CHECK: {{invoke|call}} void @{{.*}}publStaticFunc
50+
// CHECK: {{invoke|call}} void @{{.*}}privStaticFunc
51+
52+
public func extStaticVarRead() {
53+
MyClass.publStaticVar.read()
54+
MyClass.privStaticVar.read()
55+
}
56+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticVarRead{{.*}}"
57+
58+
public func extStaticVarWrite() {
59+
MyClass.publStaticVar.write()
60+
MyClass.privStaticVar.write()
61+
}
62+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticVarWrite{{.*}}"
63+
64+
public func extTypedef() {
65+
let u: publTypedef = publTypedefMake()
66+
publTypedefTake(u)
67+
let i: privTypedef = privTypedefMake()
68+
privTypedefTake(i)
69+
}
70+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extTypedef{{.*}}"
71+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publTypedefMake{{.*}}
72+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publTypedefTake{{.*}}
73+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privTypedefMake{{.*}}
74+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privTypedefTake{{.*}}
75+
76+
public func extStruct() {
77+
let u: publStruct = publStructMake()
78+
publStructTake(u)
79+
let i: privStruct = privStructMake()
80+
privStructTake(i)
81+
}
82+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStruct{{.*}}"
83+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publStructMake{{.*}}
84+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publStructTake{{.*}}
85+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privStructMake{{.*}}
86+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privStructTake{{.*}}
87+
88+
public func extEnum() {
89+
let u: publEnum = publEnumMake()
90+
publEnumTake(u)
91+
let i: privEnum = privEnumMake()
92+
privEnumTake(i)
93+
}
94+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extEnum{{.*}}"
95+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumMake{{.*}}
96+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumTake{{.*}}
97+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumMake{{.*}}
98+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumTake{{.*}}
99+
100+
// If we call this extEnumClass, the name gets mangled to something else.
101+
public func extEnumCls() {
102+
let u: publEnumClass = publEnumClassMake()
103+
publEnumClassTake(u)
104+
let i: privEnumClass = privEnumClassMake()
105+
privEnumClassTake(i)
106+
}
107+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extEnumCls{{.*}}"
108+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumClassMake{{.*}}
109+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumClassTake{{.*}}
110+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumClassMake{{.*}}
111+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumClassTake{{.*}}
112+
}

test/Interop/Cxx/class/access/private-fileid-typecheck.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,27 @@ extension MyClass {
120120
let _ = privEnumOpen.variantPrivEnumOpen
121121
}
122122

123-
func fcutd(_ _: publTypedef) { }
124-
private func fcitd(_ _: privTypedef) { }
123+
// Make sure these types are usable in type signatures too
124+
func publTypedefFunc(_ _: publTypedef) { }
125+
private func privTypedefFunc(_ _: privTypedef) { }
126+
127+
func publStructFunc(_ _: publStruct) { }
128+
private func privStructFunc(_ _: privStruct) { }
129+
130+
func publEnumFunc(_ _: publEnum) { }
131+
private func privEnumFunc(_ _: privEnum) { }
132+
133+
func publEnumClassFunc(_ _: publEnumClass) { }
134+
private func privEnumClassFunc(_ _: privEnumClass) { }
135+
136+
func publEnumClosedFunc(_ _: publEnumClosed) { }
137+
private func privEnumClosedFunc(_ _: privEnumClosed) { }
138+
139+
func publEnumOpenFunc(_ _: publEnumOpen) { }
140+
private func privEnumOpenFunc(_ _: privEnumOpen) { }
141+
142+
func publEnumFlagFunc(_ _: publEnumFlag) { }
143+
private func privEnumFlagFunc(_ _: privEnumFlag) { }
125144
}
126145

127146
func notExt(_ c: inout MyClass) {

0 commit comments

Comments
 (0)