xref: /llvm-project/clang/test/CodeGen/AArch64/fmv-resolver-emission.c (revision 207e5ccceec8d3cc3f32723e78f2a142bc61b07d)
1*207e5cccSFangrui Song // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s
2*207e5cccSFangrui Song 
3*207e5cccSFangrui Song // CHECK: @used_before_default_def = weak_odr ifunc void (), ptr @used_before_default_def.resolver
4*207e5cccSFangrui Song // CHECK: @used_after_default_def = weak_odr ifunc void (), ptr @used_after_default_def.resolver
5*207e5cccSFangrui Song // CHECK-NOT: @used_before_default_decl = weak_odr ifunc void (), ptr @used_before_default_decl.resolver
6*207e5cccSFangrui Song // CHECK-NOT: @used_after_default_decl = weak_odr ifunc void (), ptr @used_after_default_decl.resolver
7*207e5cccSFangrui Song // CHECK-NOT: @used_no_default = weak_odr ifunc void (), ptr @used_no_default.resolver
8*207e5cccSFangrui Song // CHECK-NOT: @not_used_no_default = weak_odr ifunc void (), ptr @not_used_no_default.resolver
9*207e5cccSFangrui Song // CHECK: @not_used_with_default = weak_odr ifunc void (), ptr @not_used_with_default.resolver
10*207e5cccSFangrui Song 
11*207e5cccSFangrui Song 
12*207e5cccSFangrui Song // Test that an ifunc is generated and used when the default
13*207e5cccSFangrui Song // version is defined after the first use of the function.
14*207e5cccSFangrui Song //
15*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_before_default_def(void) {}
16*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_before_default_def._Maes(
17*207e5cccSFangrui Song //
18*207e5cccSFangrui Song void call_before_def(void) { used_before_default_def(); }
19*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_before_def(
20*207e5cccSFangrui Song // CHECK: call void @used_before_default_def()
21*207e5cccSFangrui Song //
22*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_before_default_def(void) {}
23*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_before_default_def.default(
24*207e5cccSFangrui Song //
25*207e5cccSFangrui Song // CHECK-NOT: declare void @used_before_default_def(
26*207e5cccSFangrui Song 
27*207e5cccSFangrui Song 
28*207e5cccSFangrui Song // Test that an ifunc is generated and used when the default
29*207e5cccSFangrui Song // version is defined before the first use of the function.
30*207e5cccSFangrui Song //
31*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_after_default_def(void) {}
32*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_after_default_def._Maes(
33*207e5cccSFangrui Song //
34*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_after_default_def(void) {}
35*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_after_default_def.default(
36*207e5cccSFangrui Song //
37*207e5cccSFangrui Song void call_after_def(void) { used_after_default_def(); }
38*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_after_def(
39*207e5cccSFangrui Song // CHECK: call void @used_after_default_def()
40*207e5cccSFangrui Song //
41*207e5cccSFangrui Song // CHECK-NOT: declare void @used_after_default_def(
42*207e5cccSFangrui Song 
43*207e5cccSFangrui Song 
44*207e5cccSFangrui Song // Test that an unmagled declaration is generated and used when the
45*207e5cccSFangrui Song // default version is declared after the first use of the function.
46*207e5cccSFangrui Song //
47*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_before_default_decl(void) {}
48*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_before_default_decl._Maes(
49*207e5cccSFangrui Song //
50*207e5cccSFangrui Song void call_before_decl(void) { used_before_default_decl(); }
51*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_before_decl(
52*207e5cccSFangrui Song // CHECK: call void @used_before_default_decl()
53*207e5cccSFangrui Song //
54*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_before_default_decl(void);
55*207e5cccSFangrui Song // CHECK: declare void @used_before_default_decl()
56*207e5cccSFangrui Song 
57*207e5cccSFangrui Song 
58*207e5cccSFangrui Song // Test that an unmagled declaration is generated and used when the
59*207e5cccSFangrui Song // default version is declared before the first use of the function.
60*207e5cccSFangrui Song //
61*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_after_default_decl(void) {}
62*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_after_default_decl._Maes(
63*207e5cccSFangrui Song //
64*207e5cccSFangrui Song __attribute__((target_version("default"))) void used_after_default_decl(void);
65*207e5cccSFangrui Song // CHECK: declare void @used_after_default_decl()
66*207e5cccSFangrui Song //
67*207e5cccSFangrui Song void call_after_decl(void) { used_after_default_decl(); }
68*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_after_decl(
69*207e5cccSFangrui Song // CHECK: call void @used_after_default_decl()
70*207e5cccSFangrui Song 
71*207e5cccSFangrui Song 
72*207e5cccSFangrui Song // Test that an unmagled declaration is generated and used when
73*207e5cccSFangrui Song // the default version is not present.
74*207e5cccSFangrui Song //
75*207e5cccSFangrui Song __attribute__((target_version("aes"))) void used_no_default(void) {}
76*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @used_no_default._Maes(
77*207e5cccSFangrui Song //
78*207e5cccSFangrui Song void call_no_default(void) { used_no_default(); }
79*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @call_no_default(
80*207e5cccSFangrui Song // CHECK: call void @used_no_default()
81*207e5cccSFangrui Song //
82*207e5cccSFangrui Song // CHECK: declare void @used_no_default()
83*207e5cccSFangrui Song 
84*207e5cccSFangrui Song 
85*207e5cccSFangrui Song // Test that neither an ifunc nor a declaration is generated if the default
86*207e5cccSFangrui Song // definition is missing since the versioned function is not used.
87*207e5cccSFangrui Song //
88*207e5cccSFangrui Song __attribute__((target_version("aes"))) void not_used_no_default(void) {}
89*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @not_used_no_default._Maes(
90*207e5cccSFangrui Song //
91*207e5cccSFangrui Song // CHECK-NOT: declare void @not_used_no_default(
92*207e5cccSFangrui Song 
93*207e5cccSFangrui Song 
94*207e5cccSFangrui Song // Test that an ifunc is generated if the default version is defined but not used.
95*207e5cccSFangrui Song //
96*207e5cccSFangrui Song __attribute__((target_version("aes"))) void not_used_with_default(void) {}
97*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @not_used_with_default._Maes(
98*207e5cccSFangrui Song //
99*207e5cccSFangrui Song __attribute__((target_version("default"))) void not_used_with_default(void) {}
100*207e5cccSFangrui Song // CHECK-LABEL: define dso_local void @not_used_with_default.default(
101*207e5cccSFangrui Song //
102*207e5cccSFangrui Song // CHECK-NOT: declare void @not_used_with_default(
103*207e5cccSFangrui Song 
104*207e5cccSFangrui Song 
105*207e5cccSFangrui Song // CHECK: define weak_odr ptr @used_before_default_def.resolver()
106*207e5cccSFangrui Song // CHECK: define weak_odr ptr @used_after_default_def.resolver()
107*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @used_before_default_decl.resolver(
108*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @used_after_default_decl.resolver(
109*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @used_no_default.resolver(
110*207e5cccSFangrui Song // CHECK-NOT: define weak_odr ptr @not_used_no_default.resolver(
111*207e5cccSFangrui Song // CHECK: define weak_odr ptr @not_used_with_default.resolver()
112