1
1
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=LINUX,CHECK
2
2
// RUN: %clang_cc1 -triple x86_64-windows-pc -emit-llvm %s -o - | FileCheck %s --check-prefixes=WINDOWS,CHECK
3
3
4
+ // LINUX: $foo.resolver = comdat any
5
+ // LINUX: $foo_dupes.resolver = comdat any
6
+ // LINUX: $unused.resolver = comdat any
7
+ // LINUX: $foo_inline.resolver = comdat any
8
+ // LINUX: $foo_inline2.resolver = comdat any
9
+
10
+ // WINDOWS: $foo = comdat any
11
+ // WINDOWS: $foo_dupes = comdat any
12
+ // WINDOWS: $unused = comdat any
13
+ // WINDOWS: $foo_inline = comdat any
14
+ // WINDOWS: $foo_inline2 = comdat any
15
+
4
16
// LINUX: @foo.ifunc = weak_odr ifunc i32 (), i32 ()* ()* @foo.resolver
5
17
// LINUX: @foo_dupes.ifunc = weak_odr ifunc void (), void ()* ()* @foo_dupes.resolver
6
18
// LINUX: @unused.ifunc = weak_odr ifunc void (), void ()* ()* @unused.resolver
10
22
int __attribute__((target_clones ("sse4.2, default" ))) foo (void ) { return 0 ; }
11
23
// LINUX: define {{.*}}i32 @foo.sse4.2.0()
12
24
// LINUX: define {{.*}}i32 @foo.default.1()
13
- // LINUX: define i32 ()* @foo.resolver()
25
+ // LINUX: define i32 ()* @foo.resolver() comdat
14
26
// LINUX: ret i32 ()* @foo.sse4.2.0
15
27
// LINUX: ret i32 ()* @foo.default.1
16
28
17
29
// WINDOWS: define dso_local i32 @foo.sse4.2.0()
18
30
// WINDOWS: define dso_local i32 @foo.default.1()
19
- // WINDOWS: define dso_local i32 @foo()
31
+ // WINDOWS: define dso_local i32 @foo() comdat
20
32
// WINDOWS: musttail call i32 @foo.sse4.2.0
21
33
// WINDOWS: musttail call i32 @foo.default.1
22
34
23
35
__attribute__((target_clones ("default,default ,sse4.2" ))) void foo_dupes (void ) {}
24
36
// LINUX: define {{.*}}void @foo_dupes.default.1()
25
37
// LINUX: define {{.*}}void @foo_dupes.sse4.2.0()
26
- // LINUX: define void ()* @foo_dupes.resolver()
38
+ // LINUX: define void ()* @foo_dupes.resolver() comdat
27
39
// LINUX: ret void ()* @foo_dupes.sse4.2.0
28
40
// LINUX: ret void ()* @foo_dupes.default.1
29
41
30
42
// WINDOWS: define dso_local void @foo_dupes.default.1()
31
43
// WINDOWS: define dso_local void @foo_dupes.sse4.2.0()
32
- // WINDOWS: define dso_local void @foo_dupes()
44
+ // WINDOWS: define dso_local void @foo_dupes() comdat
33
45
// WINDOWS: musttail call void @foo_dupes.sse4.2.0
34
46
// WINDOWS: musttail call void @foo_dupes.default.1
35
47
@@ -52,13 +64,13 @@ int bar(void) {
52
64
void __attribute__((target_clones ("default, arch=ivybridge" ))) unused (void ) {}
53
65
// LINUX: define {{.*}}void @unused.default.1()
54
66
// LINUX: define {{.*}}void @unused.arch_ivybridge.0()
55
- // LINUX: define void ()* @unused.resolver()
67
+ // LINUX: define void ()* @unused.resolver() comdat
56
68
// LINUX: ret void ()* @unused.arch_ivybridge.0
57
69
// LINUX: ret void ()* @unused.default.1
58
70
59
71
// WINDOWS: define dso_local void @unused.default.1()
60
72
// WINDOWS: define dso_local void @unused.arch_ivybridge.0()
61
- // WINDOWS: define dso_local void @unused()
73
+ // WINDOWS: define dso_local void @unused() comdat
62
74
// WINDOWS: musttail call void @unused.arch_ivybridge.0
63
75
// WINDOWS: musttail call void @unused.default.1
64
76
@@ -79,26 +91,26 @@ int bar3(void) {
79
91
}
80
92
81
93
// Deferred emission of foo_inline, which got delayed because it is inline.
82
- // LINUX: define i32 ()* @foo_inline.resolver()
94
+ // LINUX: define i32 ()* @foo_inline.resolver() comdat
83
95
// LINUX: ret i32 ()* @foo_inline.arch_sandybridge.0
84
96
// LINUX: ret i32 ()* @foo_inline.sse4.2.1
85
97
// LINUX: ret i32 ()* @foo_inline.default.2
86
98
87
- // WINDOWS: define dso_local i32 @foo_inline()
99
+ // WINDOWS: define dso_local i32 @foo_inline() comdat
88
100
// WINDOWS: musttail call i32 @foo_inline.arch_sandybridge.0
89
101
// WINDOWS: musttail call i32 @foo_inline.sse4.2.1
90
102
// WINDOWS: musttail call i32 @foo_inline.default.2
91
103
92
104
inline int __attribute__((target_clones ("arch=sandybridge,default,sse4.2" )))
93
105
foo_inline2 (void ){ return 0 ; }
94
106
// LINUX: define linkonce i32 @foo_inline2.arch_sandybridge.0() #[[SB:[0-9]+]]
95
- // LINUX: define i32 ()* @foo_inline2.resolver()
107
+ // LINUX: define i32 ()* @foo_inline2.resolver() comdat
96
108
// LINUX: ret i32 ()* @foo_inline2.arch_sandybridge.0
97
109
// LINUX: ret i32 ()* @foo_inline2.sse4.2.1
98
110
// LINUX: ret i32 ()* @foo_inline2.default.2
99
111
100
112
// WINDOWS: define linkonce_odr dso_local i32 @foo_inline2.arch_sandybridge.0() #[[SB:[0-9]+]]
101
- // WINDOWS: define dso_local i32 @foo_inline2()
113
+ // WINDOWS: define dso_local i32 @foo_inline2() comdat
102
114
// WINDOWS: musttail call i32 @foo_inline2.arch_sandybridge.0
103
115
// WINDOWS: musttail call i32 @foo_inline2.sse4.2.1
104
116
// WINDOWS: musttail call i32 @foo_inline2.default.2
0 commit comments