Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / linux-preemption.ll
blobab1ac2f27bc81e3bf74efe8f6cb1e8b7b1d567f4
1 ; RUN: llc -mtriple x86_64-pc-linux \
2 ; RUN:     -relocation-model=static  < %s | FileCheck --check-prefix=STATIC %s
3 ; RUN: llc -mtriple x86_64-pc-linux \
4 ; RUN:     -relocation-model=pic             < %s | FileCheck %s
5 ; RUN: llc -mtriple x86_64-pc-linux \
6 ; RUN:     -relocation-model=dynamic-no-pic  < %s | FileCheck %s
8 ; 32 bits
10 ; RUN: llc -mtriple i386-pc-linux \
11 ; RUN:     -relocation-model=pic     < %s | FileCheck --check-prefix=CHECK32 %s
13 ; globals
15 @strong_default_global = global i32 42
16 define i32* @get_strong_default_global() {
17   ret i32* @strong_default_global
19 ; CHECK: movq strong_default_global@GOTPCREL(%rip), %rax
20 ; STATIC: movl $strong_default_global, %eax
21 ; CHECK32: movl strong_default_global@GOT(%eax), %eax
23 @weak_default_global = weak global i32 42
24 define i32* @get_weak_default_global() {
25   ret i32* @weak_default_global
27 ; CHECK: movq weak_default_global@GOTPCREL(%rip), %rax
28 ; STATIC: movl $weak_default_global, %eax
29 ; CHECK32: movl weak_default_global@GOT(%eax), %eax
31 @external_default_global = external global i32
32 define i32* @get_external_default_global() {
33   ret i32* @external_default_global
35 ; CHECK: movq external_default_global@GOTPCREL(%rip), %rax
36 ; STATIC: movl $external_default_global, %eax
37 ; CHECK32: movl external_default_global@GOT(%eax), %eax
39 @strong_local_global = dso_local global i32 42
40 define i32* @get_strong_local_global() {
41   ret i32* @strong_local_global
43 ; CHECK: leaq strong_local_global(%rip), %rax
44 ; STATIC: movl $strong_local_global, %eax
45 ; CHECK32: leal strong_local_global@GOTOFF(%eax), %eax
47 @weak_local_global = weak dso_local global i32 42
48 define i32* @get_weak_local_global() {
49   ret i32* @weak_local_global
51 ; CHECK: leaq weak_local_global(%rip), %rax
52 ; STATIC: movl $weak_local_global, %eax
53 ; CHECK32: leal weak_local_global@GOTOFF(%eax), %eax
55 @external_local_global = external dso_local global i32
56 define i32* @get_external_local_global() {
57   ret i32* @external_local_global
59 ; CHECK: leaq external_local_global(%rip), %rax
60 ; STATIC: movl $external_local_global, %eax
61 ; CHECK32: leal external_local_global@GOTOFF(%eax), %eax
64 @strong_preemptable_global = dso_preemptable global i32 42
65 define i32* @get_strong_preemptable_global() {
66   ret i32* @strong_preemptable_global
68 ; CHECK: movq strong_preemptable_global@GOTPCREL(%rip), %rax
69 ; STATIC: movl $strong_preemptable_global, %eax
70 ; CHECK32: movl strong_preemptable_global@GOT(%eax), %eax
72 @weak_preemptable_global = weak dso_preemptable global i32 42
73 define i32* @get_weak_preemptable_global() {
74   ret i32* @weak_preemptable_global
76 ; CHECK ;ADD_LABEL_BACK;  movq weak_preemptable_global@GOTPCREL(%rip), %rax
77 ; STATIC ;ADD_LABEL_BACK; movq weak_preemptable_global@GOTPCREL, %rax
78 ; CHECK32 ;ADD_LABEL_BACK; movl weak_preemptable_global@GOT(%eax), %eax
80 @external_preemptable_global = external dso_preemptable global i32
81 define i32* @get_external_preemptable_global() {
82   ret i32* @external_preemptable_global
84 ; CHECK: movq external_preemptable_global@GOTPCREL(%rip), %rax
85 ; STATIC: movl $external_preemptable_global, %eax
86 ; CHECK32: movl external_preemptable_global@GOT(%eax), %eax
88 ; aliases
89 @aliasee = global i32 42
91 @strong_default_alias = alias i32, i32* @aliasee
92 define i32* @get_strong_default_alias() {
93   ret i32* @strong_default_alias
95 ; CHECK: movq strong_default_alias@GOTPCREL(%rip), %rax
96 ; STATIC: movl $strong_default_alias, %eax
97 ; CHECK32: movl strong_default_alias@GOT(%eax), %eax
99 @weak_default_alias = weak alias i32, i32* @aliasee
100 define i32* @get_weak_default_alias() {
101   ret i32* @weak_default_alias
103 ; CHECK: movq weak_default_alias@GOTPCREL(%rip), %rax
104 ; STATIC: movl $weak_default_alias, %eax
105 ; CHECK32: movl weak_default_alias@GOT(%eax), %eax
107 @strong_local_alias = dso_local alias i32, i32* @aliasee
108 define i32* @get_strong_local_alias() {
109   ret i32* @strong_local_alias
111 ; CHECK: leaq strong_local_alias(%rip), %rax
112 ; STATIC: movl $strong_local_alias, %eax
113 ; CHECK32: leal strong_local_alias@GOTOFF(%eax), %eax
115 @weak_local_alias = weak dso_local alias i32, i32* @aliasee
116 define i32* @get_weak_local_alias() {
117   ret i32* @weak_local_alias
119 ; CHECK: leaq weak_local_alias(%rip), %rax
120 ; STATIC: movl $weak_local_alias, %eax
121 ; CHECK32: leal weak_local_alias@GOTOFF(%eax), %eax
124 @strong_preemptable_alias = dso_preemptable alias i32, i32* @aliasee
125 define i32* @get_strong_preemptable_alias() {
126   ret i32* @strong_preemptable_alias
128 ; CHECK: movq strong_preemptable_alias@GOTPCREL(%rip), %rax
129 ; STATIC: movl $strong_preemptable_alias, %eax
130 ; CHECK32: movl strong_preemptable_alias@GOT(%eax), %eax
132 @weak_preemptable_alias = weak dso_preemptable alias i32, i32* @aliasee
133 define i32* @get_weak_preemptable_alias() {
134   ret i32* @weak_preemptable_alias
136 ; CHECK: movq weak_preemptable_alias@GOTPCREL(%rip), %rax
137 ; STATIC: movl $weak_preemptable_alias, %eax
138 ; CHECK32: movl weak_preemptable_alias@GOT(%eax), %eax
140 ; functions
142 define void @strong_default_function() {
143   ret void
145 define void()* @get_strong_default_function() {
146   ret void()* @strong_default_function
148 ; CHECK: movq strong_default_function@GOTPCREL(%rip), %rax
149 ; STATIC: movl $strong_default_function, %eax
150 ; CHECK32: movl strong_default_function@GOT(%eax), %eax
152 define weak void @weak_default_function() {
153   ret void
155 define void()* @get_weak_default_function() {
156   ret void()* @weak_default_function
158 ; CHECK: movq weak_default_function@GOTPCREL(%rip), %rax
159 ; STATIC: movl $weak_default_function, %eax
160 ; CHECK32: movl weak_default_function@GOT(%eax), %eax
162 declare void @external_default_function()
163 define void()* @get_external_default_function() {
164   ret void()* @external_default_function
166 ; CHECK: movq external_default_function@GOTPCREL(%rip), %rax
167 ; STATIC: movl $external_default_function, %eax
168 ; CHECK32: movl external_default_function@GOT(%eax), %eax
170 define dso_local void @strong_local_function() {
171   ret void
173 define void()* @get_strong_local_function() {
174   ret void()* @strong_local_function
176 ; CHECK: leaq strong_local_function(%rip), %rax
177 ; STATIC: movl $strong_local_function, %eax
178 ; CHECK32: leal strong_local_function@GOTOFF(%eax), %eax
180 define weak dso_local void @weak_local_function() {
181   ret void
183 define void()* @get_weak_local_function() {
184   ret void()* @weak_local_function
186 ; CHECK: leaq weak_local_function(%rip), %rax
187 ; STATIC: movl $weak_local_function, %eax
188 ; CHECK32: leal weak_local_function@GOTOFF(%eax), %eax
190 declare dso_local void @external_local_function()
191 define void()* @get_external_local_function() {
192   ret void()* @external_local_function
194 ; CHECK: leaq external_local_function(%rip), %rax
195 ; STATIC: movl $external_local_function, %eax
196 ; CHECK32: leal external_local_function@GOTOFF(%eax), %eax
199 define dso_preemptable void @strong_preemptable_function() {
200   ret void
202 define void()* @get_strong_preemptable_function() {
203   ret void()* @strong_preemptable_function
205 ; CHECK: movq strong_preemptable_function@GOTPCREL(%rip), %rax
206 ; STATIC: movl $strong_preemptable_function, %eax
207 ; CHECK32: movl strong_preemptable_function@GOT(%eax), %eax
209 define weak dso_preemptable void @weak_preemptable_function() {
210   ret void
212 define void()* @get_weak_preemptable_function() {
213   ret void()* @weak_preemptable_function
215 ; CHECK: movq weak_preemptable_function@GOTPCREL(%rip), %rax
216 ; STATIC: movl $weak_preemptable_function, %eax
217 ; CHECK32: movl weak_preemptable_function@GOT(%eax), %eax
219 declare dso_preemptable void @external_preemptable_function()
220 define void()* @get_external_preemptable_function() {
221   ret void()* @external_preemptable_function
223 ; CHECK: movq external_preemptable_function@GOTPCREL(%rip), %rax
224 ; STATIC: movl $external_preemptable_function, %eax
225 ; CHECK32: movl external_preemptable_function@GOT(%eax), %eax