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
16
19
// LINUX: @__cpu_model = external dso_local global { i32, i32, i32, [1 x i32] }
17
20
// LINUX: @__cpu_features2 = external dso_local global [3 x i32]
18
21
22
+ // DARWIN: @__cpu_model = external dso_local global { i32, i32, i32, [1 x i32] }
23
+ // DARWIN: @__cpu_features2 = external dso_local global [3 x i32]
24
+
19
25
// LINUX: @internal.ifunc = internal alias i32 (), ptr @internal
20
26
// LINUX: @foo.ifunc = weak_odr alias i32 (), ptr @foo
21
27
// LINUX: @foo_dupes.ifunc = weak_odr alias void (), ptr @foo_dupes
34
40
// LINUX: @foo_used_no_defn = weak_odr ifunc i32 (), ptr @foo_used_no_defn.resolver
35
41
// LINUX: @isa_level = weak_odr ifunc i32 (i32), ptr @isa_level.resolver
36
42
43
+
37
44
static int __attribute__((target_clones ("sse4.2, default" ))) internal (void ) { return 0 ; }
38
45
int use (void ) { return internal (); }
39
46
/// Internal linkage resolvers do not use comdat.
40
47
// LINUX: define internal ptr @internal.resolver() {
48
+ // DARWIN: define internal ptr @internal.resolver() {
41
49
// WINDOWS: define internal i32 @internal() {
42
50
43
51
int __attribute__((target_clones ("sse4.2, default" ))) foo (void ) { return 0 ; }
@@ -47,6 +55,12 @@ int __attribute__((target_clones("sse4.2, default"))) foo(void) { return 0; }
47
55
// LINUX: ret ptr @foo.sse4.2.0
48
56
// LINUX: ret ptr @foo.default.1
49
57
58
+ // DARWIN: define {{.*}}i32 @foo.sse4.2.0()
59
+ // DARWIN: define {{.*}}i32 @foo.default.1()
60
+ // DARWIN: define weak_odr ptr @foo.resolver() {
61
+ // DARWIN: ret ptr @foo.sse4.2.0
62
+ // DARWIN: ret ptr @foo.default.1
63
+
50
64
// WINDOWS: define dso_local i32 @foo.sse4.2.0()
51
65
// WINDOWS: define dso_local i32 @foo.default.1()
52
66
// WINDOWS: define weak_odr dso_local i32 @foo() comdat
@@ -60,6 +74,12 @@ __attribute__((target_clones("default,default ,sse4.2"))) void foo_dupes(void) {
60
74
// LINUX: ret ptr @foo_dupes.sse4.2.0
61
75
// LINUX: ret ptr @foo_dupes.default.1
62
76
77
+ // DARWIN: define {{.*}}void @foo_dupes.default.1()
78
+ // DARWIN: define {{.*}}void @foo_dupes.sse4.2.0()
79
+ // DARWIN: define weak_odr ptr @foo_dupes.resolver() {
80
+ // DARWIN: ret ptr @foo_dupes.sse4.2.0
81
+ // DARWIN: ret ptr @foo_dupes.default.1
82
+
63
83
// WINDOWS: define dso_local void @foo_dupes.default.1()
64
84
// WINDOWS: define dso_local void @foo_dupes.sse4.2.0()
65
85
// WINDOWS: define weak_odr dso_local void @foo_dupes() comdat
@@ -68,17 +88,21 @@ __attribute__((target_clones("default,default ,sse4.2"))) void foo_dupes(void) {
68
88
69
89
void bar2 (void ) {
70
90
// LINUX: define {{.*}}void @bar2()
91
+ // DARWIN: define {{.*}}void @bar2()
71
92
// WINDOWS: define dso_local void @bar2()
72
93
foo_dupes ();
73
94
// LINUX: call void @foo_dupes()
95
+ // DARWIN: call void @foo_dupes()
74
96
// WINDOWS: call void @foo_dupes()
75
97
}
76
98
77
99
int bar (void ) {
78
100
// LINUX: define {{.*}}i32 @bar() #[[DEF:[0-9]+]]
101
+ // DARWIN: define {{.*}}i32 @bar() #[[DEF:[0-9]+]]
79
102
// WINDOWS: define dso_local i32 @bar() #[[DEF:[0-9]+]]
80
103
return foo ();
81
104
// LINUX: call i32 @foo()
105
+ // DARWIN: call i32 @foo()
82
106
// WINDOWS: call i32 @foo()
83
107
}
84
108
@@ -89,6 +113,12 @@ void __attribute__((target_clones("default, arch=ivybridge"))) unused(void) {}
89
113
// LINUX: ret ptr @unused.arch_ivybridge.0
90
114
// LINUX: ret ptr @unused.default.1
91
115
116
+ // DARWIN: define {{.*}}void @unused.default.1()
117
+ // DARWIN: define {{.*}}void @unused.arch_ivybridge.0()
118
+ // DARWIN: define weak_odr ptr @unused.resolver() {
119
+ // DARWIN: ret ptr @unused.arch_ivybridge.0
120
+ // DARWIN: ret ptr @unused.default.1
121
+
92
122
// WINDOWS: define dso_local void @unused.default.1()
93
123
// WINDOWS: define dso_local void @unused.arch_ivybridge.0()
94
124
// WINDOWS: define weak_odr dso_local void @unused() comdat
@@ -103,10 +133,13 @@ foo_inline2(void);
103
133
104
134
int bar3 (void ) {
105
135
// LINUX: define {{.*}}i32 @bar3()
136
+ // DARWIN: define {{.*}}i32 @bar3()
106
137
// WINDOWS: define dso_local i32 @bar3()
107
138
return foo_inline () + foo_inline2 ();
108
139
// LINUX: call i32 @foo_inline()
109
140
// LINUX: call i32 @foo_inline2()
141
+ // DARWIN: call i32 @foo_inline()
142
+ // DARWIN: call i32 @foo_inline2()
110
143
// WINDOWS: call i32 @foo_inline()
111
144
// WINDOWS: call i32 @foo_inline2()
112
145
}
@@ -116,6 +149,11 @@ int bar3(void) {
116
149
// LINUX: ret ptr @foo_inline.sse4.2.1
117
150
// LINUX: ret ptr @foo_inline.default.2
118
151
152
+ // DARWIN: define weak_odr ptr @foo_inline.resolver() {
153
+ // DARWIN: ret ptr @foo_inline.arch_sandybridge.0
154
+ // DARWIN: ret ptr @foo_inline.sse4.2.1
155
+ // DARWIN: ret ptr @foo_inline.default.2
156
+
119
157
// WINDOWS: define weak_odr dso_local i32 @foo_inline() comdat
120
158
// WINDOWS: musttail call i32 @foo_inline.arch_sandybridge.0
121
159
// WINDOWS: musttail call i32 @foo_inline.sse4.2.1
@@ -128,6 +166,11 @@ foo_inline2(void){ return 0; }
128
166
// LINUX: ret ptr @foo_inline2.sse4.2.1
129
167
// LINUX: ret ptr @foo_inline2.default.2
130
168
169
+ // DARWIN: define weak_odr ptr @foo_inline2.resolver() {
170
+ // DARWIN: ret ptr @foo_inline2.arch_sandybridge.0
171
+ // DARWIN: ret ptr @foo_inline2.sse4.2.1
172
+ // DARWIN: ret ptr @foo_inline2.default.2
173
+
131
174
// WINDOWS: define weak_odr dso_local i32 @foo_inline2() comdat
132
175
// WINDOWS: musttail call i32 @foo_inline2.arch_sandybridge.0
133
176
// WINDOWS: musttail call i32 @foo_inline2.sse4.2.1
@@ -142,9 +185,11 @@ foo_used_no_defn(void);
142
185
143
186
int test_foo_used_no_defn (void ) {
144
187
// LINUX: define {{.*}}i32 @test_foo_used_no_defn()
188
+ // DARWIN: define {{.*}}i32 @test_foo_used_no_defn()
145
189
// WINDOWS: define dso_local i32 @test_foo_used_no_defn()
146
190
return foo_used_no_defn ();
147
191
// LINUX: call i32 @foo_used_no_defn()
192
+ // DARWIN: call i32 @foo_used_no_defn()
148
193
// WINDOWS: call i32 @foo_used_no_defn()
149
194
}
150
195
@@ -153,6 +198,10 @@ int test_foo_used_no_defn(void) {
153
198
// LINUX: ret ptr @foo_used_no_defn.sse4.2.0
154
199
// LINUX: ret ptr @foo_used_no_defn.default.1
155
200
201
+ // DARWIN: define weak_odr ptr @foo_used_no_defn.resolver() {
202
+ // DARWIN: ret ptr @foo_used_no_defn.sse4.2.0
203
+ // DARWIN: ret ptr @foo_used_no_defn.default.1
204
+
156
205
// WINDOWS: define weak_odr dso_local i32 @foo_used_no_defn() comdat
157
206
// WINDOWS: musttail call i32 @foo_used_no_defn.sse4.2.0
158
207
// WINDOWS: musttail call i32 @foo_used_no_defn.default.1
@@ -180,12 +229,37 @@ int isa_level(int) { return 0; }
180
229
// LINUX: ret ptr @isa_level.arch_x86-64.0
181
230
// LINUX: ret ptr @isa_level.default.4
182
231
232
+ // DARWIN: define{{.*}} i32 @isa_level.default.4(
233
+ // DARWIN: define{{.*}} i32 @isa_level.arch_x86-64.0(
234
+ // DARWIN: define{{.*}} i32 @isa_level.arch_x86-64-v2.1(
235
+ // DARWIN: define{{.*}} i32 @isa_level.arch_x86-64-v3.2(
236
+ // DARWIN: define{{.*}} i32 @isa_level.arch_x86-64-v4.3(
237
+ // DARWIN: define weak_odr ptr @isa_level.resolver() {
238
+ // DARWIN: call void @__cpu_indicator_init()
239
+ // DARWIN-NEXT: load i32, ptr getelementptr inbounds ([3 x i32], ptr @__cpu_features2, i32 0, i32 2)
240
+ // DARWIN-NEXT: and i32 %[[#]], 4
241
+ // DARWIN: ret ptr @isa_level.arch_x86-64-v4.3
242
+ // DARWIN: load i32, ptr getelementptr inbounds ([3 x i32], ptr @__cpu_features2, i32 0, i32 2)
243
+ // DARWIN-NEXT: and i32 %[[#]], 2
244
+ // DARWIN: ret ptr @isa_level.arch_x86-64-v3.2
245
+ // DARWIN: load i32, ptr getelementptr inbounds ([3 x i32], ptr @__cpu_features2, i32 0, i32 2)
246
+ // DARWIN-NEXT: and i32 %[[#]], 1
247
+ // DARWIN: ret ptr @isa_level.arch_x86-64-v2.1
248
+ // DARWIN: load i32, ptr getelementptr inbounds ([3 x i32], ptr @__cpu_features2, i32 0, i32 1)
249
+ // DARWIN-NEXT: and i32 %[[#]], -2147483648
250
+ // DARWIN: ret ptr @isa_level.arch_x86-64.0
251
+ // DARWIN: ret ptr @isa_level.default.4
252
+
183
253
// Deferred emission of inline definitions.
184
254
185
255
// LINUX: define linkonce i32 @foo_inline.arch_sandybridge.0() #[[SB:[0-9]+]]
186
256
// LINUX: define linkonce i32 @foo_inline.default.2() #[[DEF:[0-9]+]]
187
257
// LINUX: define linkonce i32 @foo_inline.sse4.2.1() #[[SSE42:[0-9]+]]
188
258
259
+ // DARWIN: define linkonce i32 @foo_inline.arch_sandybridge.0() #[[SB:[0-9]+]]
260
+ // DARWIN: define linkonce i32 @foo_inline.default.2() #[[DEF:[0-9]+]]
261
+ // DARWIN: define linkonce i32 @foo_inline.sse4.2.1() #[[SSE42:[0-9]+]]
262
+
189
263
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.arch_sandybridge.0() #[[SB:[0-9]+]]
190
264
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.default.2() #[[DEF]]
191
265
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline.sse4.2.1() #[[SSE42:[0-9]+]]
@@ -195,6 +269,10 @@ int isa_level(int) { return 0; }
195
269
// LINUX: define linkonce i32 @foo_inline2.default.2() #[[DEF]]
196
270
// LINUX: define linkonce i32 @foo_inline2.sse4.2.1() #[[SSE42]]
197
271
272
+ // DARWIN: define linkonce i32 @foo_inline2.arch_sandybridge.0() #[[SB]]
273
+ // DARWIN: define linkonce i32 @foo_inline2.default.2() #[[DEF]]
274
+ // DARWIN: define linkonce i32 @foo_inline2.sse4.2.1() #[[SSE42]]
275
+
198
276
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.arch_sandybridge.0() #[[SB]]
199
277
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.default.2() #[[DEF]]
200
278
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.sse4.2.1() #[[SSE42]]
@@ -203,6 +281,9 @@ int isa_level(int) { return 0; }
203
281
// LINUX: declare i32 @foo_used_no_defn.default.1()
204
282
// LINUX: declare i32 @foo_used_no_defn.sse4.2.0()
205
283
284
+ // DARWIN: declare i32 @foo_used_no_defn.default.1()
285
+ // DARWIN: declare i32 @foo_used_no_defn.sse4.2.0()
286
+
206
287
// WINDOWS: declare dso_local i32 @foo_used_no_defn.default.1()
207
288
// WINDOWS: declare dso_local i32 @foo_used_no_defn.sse4.2.0()
208
289
0 commit comments