xref: /llvm-project/llvm/test/CodeGen/X86/dso_local_equivalent.ll (revision 79565766be94f7944278671a9f473d79ac18f7e1)
1; RUN: llc -mtriple=x86_64-linux-gnu -relocation-model=pic -data-sections -o - %s --asm-verbose=0 | FileCheck %s -check-prefixes=CHECK
2
3; Just ensure that we can write to an object file without error.
4; RUN: llc -filetype=obj -mtriple=x86_64-linux-gnu -relocation-model=pic -data-sections -o /dev/null %s
5
6declare void @extern_func()
7
8; CHECK: call_extern_func:
9; CHECK:       callq extern_func@PLT
10define void @call_extern_func() {
11  call void dso_local_equivalent @extern_func()
12  ret void
13}
14
15declare hidden void @hidden_func()
16declare protected void @protected_func()
17declare dso_local void @dso_local_func()
18define internal void @internal_func() {
19entry:
20  ret void
21}
22define private void @private_func() {
23entry:
24  ret void
25}
26
27; CHECK: call_hidden_func:
28; CHECK:   callq hidden_func{{$}}
29define void @call_hidden_func() {
30  call void dso_local_equivalent @hidden_func()
31  ret void
32}
33
34; CHECK: call_protected_func:
35; CHECK:   callq protected_func{{$}}
36define void @call_protected_func() {
37  call void dso_local_equivalent @protected_func()
38  ret void
39}
40
41; CHECK: call_dso_local_func:
42; CHECK:   callq dso_local_func{{$}}
43define void @call_dso_local_func() {
44  call void dso_local_equivalent @dso_local_func()
45  ret void
46}
47
48; CHECK: call_internal_func:
49; CHECK:   callq internal_func{{$}}
50define void @call_internal_func() {
51  call void dso_local_equivalent @internal_func()
52  ret void
53}
54
55define void @aliasee_func() {
56entry:
57  ret void
58}
59
60@alias_func = alias void (), ptr @aliasee_func
61@dso_local_alias_func = dso_local alias void (), ptr @aliasee_func
62
63; CHECK: call_alias_func:
64; CHECK:   callq alias_func@PLT
65define void @call_alias_func() {
66  call void dso_local_equivalent @alias_func()
67  ret void
68}
69
70; CHECK: call_dso_local_alias_func:
71; CHECK:   callq .Ldso_local_alias_func$local{{$}}
72define void @call_dso_local_alias_func() {
73  call void dso_local_equivalent @dso_local_alias_func()
74  ret void
75}
76
77@ifunc_func = ifunc void (), ptr @resolver
78@dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver
79
80define internal ptr @resolver() {
81entry:
82  ret ptr null
83}
84
85; If an ifunc is not dso_local already, then we should still emit a stub for it
86; to ensure it will be dso_local.
87; CHECK: call_ifunc_func:
88; CHECK:   callq ifunc_func@PLT
89define void @call_ifunc_func() {
90  call void dso_local_equivalent @ifunc_func()
91  ret void
92}
93
94; CHECK: call_dso_local_ifunc_func:
95; CHECK:   callq dso_local_ifunc_func{{$}}
96define void @call_dso_local_ifunc_func() {
97  call void dso_local_equivalent @dso_local_ifunc_func()
98  ret void
99}
100
101;; PR57815
102;; Ensure dso_local_equivalent works the exact same way as the previous
103;; examples but with forward-referenced symbols.
104
105; CHECK: call_forward_func:
106; CHECK:   callq forward_extern_func@PLT
107define void @call_forward_func() {
108  call void dso_local_equivalent @forward_extern_func()
109  ret void
110}
111
112; CHECK: call_forward_hidden_func:
113; CHECK:   callq forward_hidden_func{{$}}
114define void @call_forward_hidden_func() {
115  call void dso_local_equivalent @forward_hidden_func()
116  ret void
117}
118
119; CHECK: call_forward_protected_func:
120; CHECK:   callq forward_protected_func{{$}}
121define void @call_forward_protected_func() {
122  call void dso_local_equivalent @forward_protected_func()
123  ret void
124}
125
126; CHECK: call_forward_dso_local_func:
127; CHECK:   callq forward_dso_local_func{{$}}
128define void @call_forward_dso_local_func() {
129  call void dso_local_equivalent @forward_dso_local_func()
130  ret void
131}
132
133; CHECK: call_forward_internal_func:
134; CHECK:   callq forward_internal_func{{$}}
135define void @call_forward_internal_func() {
136  call void dso_local_equivalent @forward_internal_func()
137  ret void
138}
139
140declare hidden void @forward_hidden_func()
141declare protected void @forward_protected_func()
142declare dso_local void @forward_dso_local_func()
143define internal void @forward_internal_func() {
144entry:
145  ret void
146}
147define private void @forward_private_func() {
148entry:
149  ret void
150}
151
152; CHECK: call_forward_alias_func:
153; CHECK:   callq forward_alias_func@PLT
154define void @call_forward_alias_func() {
155  call void dso_local_equivalent @forward_alias_func()
156  ret void
157}
158
159; CHECK: call_forward_dso_local_alias_func:
160; CHECK:   callq .Lforward_dso_local_alias_func$local{{$}}
161define void @call_forward_dso_local_alias_func() {
162  call void dso_local_equivalent @forward_dso_local_alias_func()
163  ret void
164}
165
166define void @forward_aliasee_func() {
167entry:
168  ret void
169}
170
171@forward_alias_func = alias void (), ptr @forward_aliasee_func
172@forward_dso_local_alias_func = dso_local alias void (), ptr @forward_aliasee_func
173
174; If an ifunc is not dso_local already, then we should still emit a stub for it
175; to ensure it will be dso_local.
176; CHECK: call_forward_ifunc_func:
177; CHECK:   callq forward_ifunc_func@PLT
178define void @call_forward_ifunc_func() {
179  call void dso_local_equivalent @forward_ifunc_func()
180  ret void
181}
182
183; CHECK: call_forward_dso_local_ifunc_func:
184; CHECK:   callq forward_dso_local_ifunc_func{{$}}
185define void @call_forward_dso_local_ifunc_func() {
186  call void dso_local_equivalent @forward_dso_local_ifunc_func()
187  ret void
188}
189
190@forward_ifunc_func = ifunc void (), ptr @resolver
191@forward_dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver
192
193;; Test "no-named" variables
194; CHECK: call_no_name_hidden:
195; CHECK:   callq __unnamed_{{[0-9]+}}{{$}}
196define void @call_no_name_hidden() {
197  call void dso_local_equivalent @0()
198  ret void
199}
200
201; CHECK: call_no_name_extern:
202; CHECK:   callq __unnamed_{{[0-9]+}}@PLT
203define void @call_no_name_extern() {
204  call void dso_local_equivalent @1()
205  ret void
206}
207
208declare hidden void @0()
209declare void @1()
210
211;; Note that we keep this at the very end because llc emits this after all the
212;; functions.
213; CHECK: const:
214; CHECK:   .long   forward_extern_func@PLT
215@const = constant i32 trunc (i64 ptrtoint (ptr dso_local_equivalent @forward_extern_func to i64) to i32)
216
217declare void @forward_extern_func()
218