Skip to content

Commit c72abb7

Browse files
committed
test objc class and selector reference deduplication
1 parent bff2533 commit c72abb7

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed

tests/codegen-llvm/darwin-objc-abi-v1.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ pub fn get_class() -> *mut () {
2020
VAL
2121
}
2222

23+
#[no_mangle]
24+
pub fn get_class_again() -> *mut () {
25+
// Codegen should de-duplicate this class with the one from get_class above.
26+
unsafe extern "C" {
27+
#[rustc_objc_class = "MyClass"]
28+
safe static VAL: *mut ();
29+
}
30+
VAL
31+
}
32+
2333
#[no_mangle]
2434
pub fn get_selector() -> *mut () {
2535
unsafe extern "C" {
@@ -29,17 +39,59 @@ pub fn get_selector() -> *mut () {
2939
VAL
3040
}
3141

42+
#[no_mangle]
43+
pub fn get_selector_again() -> *mut () {
44+
// Codegen should de-duplicate this selector with the one from get_selector above.
45+
unsafe extern "C" {
46+
#[rustc_objc_selector = "myMethod"]
47+
safe static VAL: *mut ();
48+
}
49+
VAL
50+
}
51+
52+
#[no_mangle]
53+
pub fn get_other_class() -> *mut () {
54+
unsafe extern "C" {
55+
#[rustc_objc_class = "OtherClass"]
56+
safe static VAL: *mut ();
57+
}
58+
VAL
59+
}
60+
61+
#[no_mangle]
62+
pub fn get_other_selector() -> *mut () {
63+
unsafe extern "C" {
64+
#[rustc_objc_selector = "otherMethod"]
65+
safe static VAL: *mut ();
66+
}
67+
VAL
68+
}
69+
3270
// CHECK: %struct._objc_module = type { i32, i32, ptr, ptr }
3371

3472
// CHECK: @OBJC_CLASS_NAME_.{{[0-9]+}} = private unnamed_addr constant [8 x i8] c"MyClass\00", section "__TEXT,__cstring,cstring_literals", align 1
3573
// CHECK: @OBJC_CLASS_REFERENCES_.{{[0-9]+}} = private global ptr @OBJC_CLASS_NAME_.{{[0-9]+}}, section "__OBJC,__cls_refs,literal_pointers,no_dead_strip", align 4
74+
// CHECK-NOT: @OBJC_CLASS_NAME_
75+
// CHECK-NOT: @OBJC_CLASS_REFERENCES_
3676

3777
// CHECK: @OBJC_METH_VAR_NAME_.{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"myMethod\00", section "__TEXT,__cstring,cstring_literals", align 1
3878
// CHECK: @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}} = private externally_initialized global ptr @OBJC_METH_VAR_NAME_.{{[0-9]+}}, section "__OBJC,__message_refs,literal_pointers,no_dead_strip", align 4
79+
// CHECK-NOT: @OBJC_METH_VAR_NAME_
80+
// CHECK-NOT: @OBJC_SELECTOR_REFERENCES_
81+
82+
// CHECK: @OBJC_CLASS_NAME_.{{[0-9]+}} = private unnamed_addr constant [11 x i8] c"OtherClass\00", section "__TEXT,__cstring,cstring_literals", align 1
83+
// CHECK: @OBJC_CLASS_REFERENCES_.{{[0-9]+}} = private global ptr @OBJC_CLASS_NAME_.{{[0-9]+}}, section "__OBJC,__cls_refs,literal_pointers,no_dead_strip", align 4
84+
85+
// CHECK: @OBJC_METH_VAR_NAME_.{{[0-9]+}} = private unnamed_addr constant [12 x i8] c"otherMethod\00", section "__TEXT,__cstring,cstring_literals", align 1
86+
// CHECK: @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}} = private externally_initialized global ptr @OBJC_METH_VAR_NAME_.{{[0-9]+}}, section "__OBJC,__message_refs,literal_pointers,no_dead_strip", align 4
3987

4088
// CHECK: @OBJC_CLASS_NAME_.{{[0-9]+}} = private unnamed_addr constant [1 x i8] zeroinitializer, section "__TEXT,__cstring,cstring_literals", align 1
4189
// CHECK: @OBJC_MODULES = private global %struct._objc_module { i32 7, i32 16, ptr @OBJC_CLASS_NAME_.{{[0-9]+}}, ptr null }, section "__OBJC,__module_info,regular,no_dead_strip", align 4
4290

91+
// CHECK: @get_class_again = unnamed_addr alias ptr (), ptr @get_class
92+
// CHECK: @get_selector_again = unnamed_addr alias ptr (), ptr @get_selector
93+
// CHECK: load ptr, ptr @OBJC_CLASS_REFERENCES_.{{[0-9]+}}, align 4
94+
// CHECK: load ptr, ptr @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}}, align 4
4395
// CHECK: load ptr, ptr @OBJC_CLASS_REFERENCES_.{{[0-9]+}}, align 4
4496
// CHECK: load ptr, ptr @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}}, align 4
4597

tests/codegen-llvm/darwin-objc-abi-v2.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ pub fn get_class() -> *mut () {
3838
VAL
3939
}
4040

41+
#[no_mangle]
42+
pub fn get_class_again() -> *mut () {
43+
// Codegen should de-duplicate this class with the one from get_class above.
44+
unsafe extern "C" {
45+
#[rustc_objc_class = "MyClass"]
46+
safe static VAL: *mut ();
47+
}
48+
VAL
49+
}
50+
4151
#[no_mangle]
4252
pub fn get_selector() -> *mut () {
4353
unsafe extern "C" {
@@ -47,7 +57,36 @@ pub fn get_selector() -> *mut () {
4757
VAL
4858
}
4959

60+
#[no_mangle]
61+
pub fn get_selector_again() -> *mut () {
62+
// Codegen should de-duplicate this selector with the one from get_selector above.
63+
unsafe extern "C" {
64+
#[rustc_objc_selector = "myMethod"]
65+
safe static VAL: *mut ();
66+
}
67+
VAL
68+
}
69+
70+
#[no_mangle]
71+
pub fn get_other_class() -> *mut () {
72+
unsafe extern "C" {
73+
#[rustc_objc_class = "OtherClass"]
74+
safe static VAL: *mut ();
75+
}
76+
VAL
77+
}
78+
79+
#[no_mangle]
80+
pub fn get_other_selector() -> *mut () {
81+
unsafe extern "C" {
82+
#[rustc_objc_selector = "otherMethod"]
83+
safe static VAL: *mut ();
84+
}
85+
VAL
86+
}
87+
5088
// CHECK: %struct._class_t = type { ptr, ptr, ptr, ptr, ptr }
89+
5190
// CHECK: @"OBJC_CLASS_$_MyClass" = external global %struct._class_t
5291
// CHECK: @"OBJC_CLASSLIST_REFERENCES_$_.{{[0-9]+}}" = internal global ptr @"OBJC_CLASS_$_MyClass", section "__DATA,__objc_classrefs,regular,no_dead_strip",
5392
// x86_64_macos-SAME: align 8
@@ -57,6 +96,8 @@ pub fn get_selector() -> *mut () {
5796
// armv7s_ios-SAME: align 4
5897
// aarch64_ios-SAME: align 8
5998
// aarch64_ios_sim-SAME: align 8
99+
// CHECK-NOT: @"OBJC_CLASS_$_MyClass"
100+
// CHECK-NOT: @"OBJC_CLASSLIST_REFERENCES_$_
60101

61102
// CHECK: @OBJC_METH_VAR_NAME_.{{[0-9]+}} = private unnamed_addr constant [9 x i8] c"myMethod\00", section "__TEXT,__objc_methname,cstring_literals", align 1
62103
// CHECK: @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}} = internal externally_initialized global ptr @OBJC_METH_VAR_NAME_.{{[0-9]+}}, section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip",
@@ -67,6 +108,49 @@ pub fn get_selector() -> *mut () {
67108
// armv7s_ios-SAME: align 4
68109
// aarch64_ios-SAME: align 8
69110
// aarch64_ios_sim-SAME: align 8
111+
// CHECK-NOT: @OBJC_METH_VAR_NAME_
112+
// CHECK-NOT: @OBJC_SELECTOR_REFERENCES_
113+
114+
// CHECK: @"OBJC_CLASS_$_OtherClass" = external global %struct._class_t
115+
// CHECK: @"OBJC_CLASSLIST_REFERENCES_$_.{{[0-9]+}}" = internal global ptr @"OBJC_CLASS_$_OtherClass", section "__DATA,__objc_classrefs,regular,no_dead_strip",
116+
// x86_64_macos-SAME: align 8
117+
// aarch64_macos-SAME: align 8
118+
// i386_ios-SAME: align 4
119+
// x86_64_ios-SAME: align 8
120+
// armv7s_ios-SAME: align 4
121+
// aarch64_ios-SAME: align 8
122+
// aarch64_ios_sim-SAME: align 8
123+
124+
// CHECK: @OBJC_METH_VAR_NAME_.{{[0-9]+}} = private unnamed_addr constant [12 x i8] c"otherMethod\00", section "__TEXT,__objc_methname,cstring_literals", align 1
125+
// CHECK: @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}} = internal externally_initialized global ptr @OBJC_METH_VAR_NAME_.{{[0-9]+}}, section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip",
126+
// x86_64_macos-SAME: align 8
127+
// aarch64_macos-SAME: align 8
128+
// i386_ios-SAME: align 4
129+
// x86_64_ios-SAME: align 8
130+
// armv7s_ios-SAME: align 4
131+
// aarch64_ios-SAME: align 8
132+
// aarch64_ios_sim-SAME: align 8
133+
134+
// CHECK: @get_class_again = unnamed_addr alias ptr (), ptr @get_class
135+
// CHECK: @get_selector_again = unnamed_addr alias ptr (), ptr @get_selector
136+
137+
// CHECK: load ptr, ptr @"OBJC_CLASSLIST_REFERENCES_$_.{{[0-9]+}}",
138+
// x86_64_macos-SAME: align 8
139+
// aarch64_macos-SAME: align 8
140+
// i386_ios-SAME: align 4
141+
// x86_64_ios-SAME: align 8
142+
// armv7s_ios-SAME: align 4
143+
// aarch64_ios-SAME: align 8
144+
// aarch64_ios_sim-SAME: align 8
145+
146+
// CHECK: load ptr, ptr @OBJC_SELECTOR_REFERENCES_.{{[0-9]+}},
147+
// x86_64_macos-SAME: align 8
148+
// aarch64_macos-SAME: align 8
149+
// i386_ios-SAME: align 4
150+
// x86_64_ios-SAME: align 8
151+
// armv7s_ios-SAME: align 4
152+
// aarch64_ios-SAME: align 8
153+
// aarch64_ios_sim-SAME: align 8
70154

71155
// CHECK: load ptr, ptr @"OBJC_CLASSLIST_REFERENCES_$_.{{[0-9]+}}",
72156
// x86_64_macos-SAME: align 8

0 commit comments

Comments
 (0)