1
1
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=LINUX,CHECK
2
+ // RUN: %clang_cc1 -triple x86_64-apple-macos -emit-llvm %s -o - | FileCheck %s --check-prefixes=DARWIN,CHECK
2
3
// RUN: %clang_cc1 -triple x86_64-windows-pc -emit-llvm %s -o - | FileCheck %s --check-prefixes=WINDOWS,CHECK
3
4
4
5
// LINUX: $foo.resolver = comdat any
7
8
// LINUX: $foo_inline.resolver = comdat any
8
9
// LINUX: $foo_inline2.resolver = comdat any
9
10
11
+ // DARWIN-NOT: comdat any
12
+
10
13
// WINDOWS: $foo = comdat any
11
14
// WINDOWS: $foo_dupes = comdat any
12
15
// WINDOWS: $unused = comdat any
@@ -27,6 +30,12 @@ int __attribute__((target_clones("sse4.2, default"))) foo(void) { return 0; }
27
30
// LINUX: ret ptr @foo.sse4.2.0
28
31
// LINUX: ret ptr @foo.default.1
29
32
33
+ // DARWIN: define {{.*}}i32 @foo.sse4.2.0()
34
+ // DARWIN: define {{.*}}i32 @foo.default.1()
35
+ // DARWIN: define weak_odr ptr @foo.resolver() {
36
+ // DARWIN: ret ptr @foo.sse4.2.0
37
+ // DARWIN: ret ptr @foo.default.1
38
+
30
39
// WINDOWS: define dso_local i32 @foo.sse4.2.0()
31
40
// WINDOWS: define dso_local i32 @foo.default.1()
32
41
// WINDOWS: define weak_odr dso_local i32 @foo() comdat
@@ -40,6 +49,12 @@ __attribute__((target_clones("default,default ,sse4.2"))) void foo_dupes(void) {
40
49
// LINUX: ret ptr @foo_dupes.sse4.2.0
41
50
// LINUX: ret ptr @foo_dupes.default.1
42
51
52
+ // DARWIN: define {{.*}}void @foo_dupes.default.1()
53
+ // DARWIN: define {{.*}}void @foo_dupes.sse4.2.0()
54
+ // DARWIN: define weak_odr ptr @foo_dupes.resolver() {
55
+ // DARWIN: ret ptr @foo_dupes.sse4.2.0
56
+ // DARWIN: ret ptr @foo_dupes.default.1
57
+
43
58
// WINDOWS: define dso_local void @foo_dupes.default.1()
44
59
// WINDOWS: define dso_local void @foo_dupes.sse4.2.0()
45
60
// WINDOWS: define weak_odr dso_local void @foo_dupes() comdat
@@ -48,17 +63,21 @@ __attribute__((target_clones("default,default ,sse4.2"))) void foo_dupes(void) {
48
63
49
64
void bar2 (void ) {
50
65
// LINUX: define {{.*}}void @bar2()
66
+ // DARWIN: define {{.*}}void @bar2()
51
67
// WINDOWS: define dso_local void @bar2()
52
68
foo_dupes ();
53
69
// LINUX: call void @foo_dupes.ifunc()
70
+ // DARWIN: call void @foo_dupes.ifunc()
54
71
// WINDOWS: call void @foo_dupes()
55
72
}
56
73
57
74
int bar (void ) {
58
75
// LINUX: define {{.*}}i32 @bar() #[[DEF:[0-9]+]]
76
+ // DARWIN: define {{.*}}i32 @bar() #[[DEF:[0-9]+]]
59
77
// WINDOWS: define dso_local i32 @bar() #[[DEF:[0-9]+]]
60
78
return foo ();
61
79
// LINUX: call i32 @foo.ifunc()
80
+ // DARWIN: call i32 @foo.ifunc()
62
81
// WINDOWS: call i32 @foo()
63
82
}
64
83
@@ -69,6 +88,12 @@ void __attribute__((target_clones("default, arch=ivybridge"))) unused(void) {}
69
88
// LINUX: ret ptr @unused.arch_ivybridge.0
70
89
// LINUX: ret ptr @unused.default.1
71
90
91
+ // DARWIN: define {{.*}}void @unused.default.1()
92
+ // DARWIN: define {{.*}}void @unused.arch_ivybridge.0()
93
+ // DARWIN: define weak_odr ptr @unused.resolver() {
94
+ // DARWIN: ret ptr @unused.arch_ivybridge.0
95
+ // DARWIN: ret ptr @unused.default.1
96
+
72
97
// WINDOWS: define dso_local void @unused.default.1()
73
98
// WINDOWS: define dso_local void @unused.arch_ivybridge.0()
74
99
// WINDOWS: define weak_odr dso_local void @unused() comdat
@@ -83,10 +108,13 @@ foo_inline2(void);
83
108
84
109
int bar3 (void ) {
85
110
// LINUX: define {{.*}}i32 @bar3()
111
+ // DARWIN: define {{.*}}i32 @bar3()
86
112
// WINDOWS: define dso_local i32 @bar3()
87
113
return foo_inline () + foo_inline2 ();
88
114
// LINUX: call i32 @foo_inline.ifunc()
89
115
// LINUX: call i32 @foo_inline2.ifunc()
116
+ // DARWIN: call i32 @foo_inline.ifunc()
117
+ // DARWIN: call i32 @foo_inline2.ifunc()
90
118
// WINDOWS: call i32 @foo_inline()
91
119
// WINDOWS: call i32 @foo_inline2()
92
120
}
@@ -96,6 +124,11 @@ int bar3(void) {
96
124
// LINUX: ret ptr @foo_inline.sse4.2.1
97
125
// LINUX: ret ptr @foo_inline.default.2
98
126
127
+ // DARWIN: define weak_odr ptr @foo_inline.resolver() {
128
+ // DARWIN: ret ptr @foo_inline.arch_sandybridge.0
129
+ // DARWIN: ret ptr @foo_inline.sse4.2.1
130
+ // DARWIN: ret ptr @foo_inline.default.2
131
+
99
132
// WINDOWS: define weak_odr dso_local i32 @foo_inline() comdat
100
133
// WINDOWS: musttail call i32 @foo_inline.arch_sandybridge.0
101
134
// WINDOWS: musttail call i32 @foo_inline.sse4.2.1
@@ -108,6 +141,11 @@ foo_inline2(void){ return 0; }
108
141
// LINUX: ret ptr @foo_inline2.sse4.2.1
109
142
// LINUX: ret ptr @foo_inline2.default.2
110
143
144
+ // DARWIN: define weak_odr ptr @foo_inline2.resolver() {
145
+ // DARWIN: ret ptr @foo_inline2.arch_sandybridge.0
146
+ // DARWIN: ret ptr @foo_inline2.sse4.2.1
147
+ // DARWIN: ret ptr @foo_inline2.default.2
148
+
111
149
// WINDOWS: define weak_odr dso_local i32 @foo_inline2() comdat
112
150
// WINDOWS: musttail call i32 @foo_inline2.arch_sandybridge.0
113
151
// WINDOWS: musttail call i32 @foo_inline2.sse4.2.1
@@ -122,9 +160,11 @@ foo_used_no_defn(void);
122
160
123
161
int test_foo_used_no_defn (void ) {
124
162
// LINUX: define {{.*}}i32 @test_foo_used_no_defn()
163
+ // DARWIN: define {{.*}}i32 @test_foo_used_no_defn()
125
164
// WINDOWS: define dso_local i32 @test_foo_used_no_defn()
126
165
return foo_used_no_defn ();
127
166
// LINUX: call i32 @foo_used_no_defn.ifunc()
167
+ // DARWIN: call i32 @foo_used_no_defn.ifunc()
128
168
// WINDOWS: call i32 @foo_used_no_defn()
129
169
}
130
170
@@ -133,6 +173,10 @@ int test_foo_used_no_defn(void) {
133
173
// LINUX: ret ptr @foo_used_no_defn.sse4.2.0
134
174
// LINUX: ret ptr @foo_used_no_defn.default.1
135
175
176
+ // DARWIN: define weak_odr ptr @foo_used_no_defn.resolver() {
177
+ // DARWIN: ret ptr @foo_used_no_defn.sse4.2.0
178
+ // DARWIN: ret ptr @foo_used_no_defn.default.1
179
+
136
180
// WINDOWS: define weak_odr dso_local i32 @foo_used_no_defn() comdat
137
181
// WINDOWS: musttail call i32 @foo_used_no_defn.sse4.2.0
138
182
// WINDOWS: musttail call i32 @foo_used_no_defn.default.1
@@ -144,6 +188,10 @@ int test_foo_used_no_defn(void) {
144
188
// LINUX: define linkonce i32 @foo_inline.default.2() #[[DEF:[0-9]+]]
145
189
// LINUX: define linkonce i32 @foo_inline.sse4.2.1() #[[SSE42:[0-9]+]]
146
190
191
+ // DARWIN: define linkonce i32 @foo_inline.arch_sandybridge.0() #[[SB:[0-9]+]]
192
+ // DARWIN: define linkonce i32 @foo_inline.default.2() #[[DEF:[0-9]+]]
193
+ // DARWIN: define linkonce i32 @foo_inline.sse4.2.1() #[[SSE42:[0-9]+]]
194
+
147
195
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.arch_sandybridge.0() #[[SB:[0-9]+]]
148
196
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.default.2() #[[DEF]]
149
197
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.sse4.2.1() #[[SSE42:[0-9]+]]
@@ -153,6 +201,10 @@ int test_foo_used_no_defn(void) {
153
201
// LINUX: define linkonce i32 @foo_inline2.default.2() #[[DEF]]
154
202
// LINUX: define linkonce i32 @foo_inline2.sse4.2.1() #[[SSE42]]
155
203
204
+ // DARWIN: define linkonce i32 @foo_inline2.arch_sandybridge.0() #[[SB]]
205
+ // DARWIN: define linkonce i32 @foo_inline2.default.2() #[[DEF]]
206
+ // DARWIN: define linkonce i32 @foo_inline2.sse4.2.1() #[[SSE42]]
207
+
156
208
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.arch_sandybridge.0() #[[SB]]
157
209
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.default.2() #[[DEF]]
158
210
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.sse4.2.1() #[[SSE42]]
@@ -161,6 +213,9 @@ int test_foo_used_no_defn(void) {
161
213
// LINUX: declare i32 @foo_used_no_defn.default.1()
162
214
// LINUX: declare i32 @foo_used_no_defn.sse4.2.0()
163
215
216
+ // DARWIN: declare i32 @foo_used_no_defn.default.1()
217
+ // DARWIN: declare i32 @foo_used_no_defn.sse4.2.0()
218
+
164
219
// WINDOWS: declare dso_local i32 @foo_used_no_defn.default.1()
165
220
// WINDOWS: declare dso_local i32 @foo_used_no_defn.sse4.2.0()
166
221
0 commit comments