blob: 485b970540f27e1b20ce14af301829a739778a46 [file] [log] [blame]
Vlad Tsyrkleviche3446012018-04-04 01:21:16 +00001# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass shadow-call-stack -verify-machineinstrs -o - %s | FileCheck %s
2--- |
3
4 define void @no_return() #0 { ret void }
5 define void @normal_return() #0 { ret void }
6 define void @normal_return_leaf_func() #0 { ret void }
7 define void @short_leaf_func() #0 { ret void }
8 define void @normal_tail_call() #0 { ret void }
9 define void @r11_tail_call() #0 { ret void }
10 define void @conditional_tail_call() #0 { ret void }
11 define void @r10_live_in() #0 { ret void }
12
13 attributes #0 = { shadowcallstack }
14
15...
16---
17# CHECK-LABEL: name: no_return
18name: no_return
19tracksRegLiveness: true
20frameInfo:
21 adjustsStack: true # not a leaf function
22body: |
23 ; CHECK: bb.0:
24 bb.0:
25 ; CHECK-NEXT: $eax = MOV32ri 13
26 $eax = MOV32ri 13
27...
28---
29# CHECK-LABEL: name: normal_return
30name: normal_return
31tracksRegLiveness: true
32frameInfo:
33 adjustsStack: true # not a leaf function
34body: |
35 ; CHECK: bb.0:
36 bb.0:
37 ; CHECK: $r10 = MOV64rm $rsp, 1, $noreg, 0, $noreg
38 ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
39 ; CHECK-NEXT: ADD64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
40 ; CHECK-NEXT: $r11 = MOV64rm $r11, 1, $noreg, 0, $gs
41 ; CHECK-NEXT: MOV64mr $r11, 1, $noreg, 0, $gs, $r10
42 ; CHECK-NEXT: $eax = MOV32ri 13
43 $eax = MOV32ri 13
44
45 ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
46 ; CHECK-NEXT: $r10 = MOV64rm $r11, 1, $noreg, 0, $gs
47 ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
48 ; CHECK-NEXT: SUB64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
49 ; CHECK-NEXT: CMP64mr $rsp, 1, $noreg, 0, $noreg, $r10, implicit-def $eflags
50 ; CHECK-NEXT: JNE_1 %bb.1, implicit $eflags
51 ; CHECK-NEXT: RETQ $eax
52 RETQ $eax
53
54 ; CHECK: bb.1:
55 ; CHECK-NEXT; TRAP
56...
57---
58# CHECK-LABEL: name: normal_return_leaf_func
59name: normal_return_leaf_func
60tracksRegLiveness: true
61frameInfo:
62 adjustsStack: false # leaf function
63body: |
64 ; CHECK: bb.0:
65 ; CHECK: liveins: $rcx
66 bb.0:
67 liveins: $rcx
68
69 ; CHECK: $rdx = MOV64rm $rsp, 1, $noreg, 0, $noreg
70 ; CHECK-NEXT: $eax = MOV32ri 0
71 $eax = MOV32ri 0
72 ; CHECK-NEXT: CMP64ri8 $rcx, 5, implicit-def $eflags
73 CMP64ri8 $rcx, 5, implicit-def $eflags
74 ; CHECK-NEXT: JA_1 %bb.1, implicit $eflags
75 JA_1 %bb.1, implicit $eflags
76 ; CHECK-NEXT: JMP_1 %bb.2
77 JMP_1 %bb.2
78
79 ; CHECK: bb.1
80 ; CHECK: liveins: $eax, $rdx
81 bb.1:
82 liveins: $eax
83
84 ; CHECKT: $eax = MOV32ri 1
85 $eax = MOV32ri 1
86
87 ; CHECK: bb.2
88 ; CHECK: liveins: $eax, $rdx
89 bb.2:
90 liveins: $eax
91
92 ; CHECK: CMP64mr $rsp, 1, $noreg, 0, $noreg, $rdx, implicit-def $eflags
93 ; CHECK-NEXT: JNE_1 %bb.3, implicit $eflags
94 ; CHECK-NEXT: RETQ $eax
95 RETQ $eax
96
97 ; CHECK: bb.3:
98 ; CHECK-NEXT; TRAP
99...
100---
101# CHECK-LABEL: name: short_leaf_func
102name: short_leaf_func
103tracksRegLiveness: true
104frameInfo:
105 adjustsStack: false # leaf function
106body: |
107 ; CHECK: bb.0:
108 bb.0:
109 ; CHECK: $eax = MOV32ri 13
110 $eax = MOV32ri 13
111
112 ; CHECK-NEXT: RETQ $eax
113 RETQ $eax
114...
115---
116# CHECK-LABEL: name: normal_tail_call
117name: normal_tail_call
118tracksRegLiveness: true
119frameInfo:
120 adjustsStack: true # not a leaf function
121body: |
122 ; CHECK: bb.0:
123 bb.0:
124 ; CHECK: $r10 = MOV64rm $rsp, 1, $noreg, 0, $noreg
125 ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
126 ; CHECK-NEXT: ADD64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
127 ; CHECK-NEXT: $r11 = MOV64rm $r11, 1, $noreg, 0, $gs
128 ; CHECK-NEXT: MOV64mr $r11, 1, $noreg, 0, $gs, $r10
129 ; CHECK-NEXT: $eax = MOV32ri 13
130 $eax = MOV32ri 13
131
132 ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
133 ; CHECK-NEXT: $r10 = MOV64rm $r11, 1, $noreg, 0, $gs
134 ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
135 ; CHECK-NEXT: SUB64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
136 ; CHECK-NEXT: CMP64mr $rsp, 1, $noreg, 0, $noreg, $r10, implicit-def $eflags
137 ; CHECK-NEXT: JNE_1 %bb.1, implicit $eflags
138 ; CHECK-NEXT: TAILJMPr64 $rax
139 TAILJMPr64 $rax
140
141 ; CHECK: bb.1:
142 ; CHECK-NEXT; TRAP
143...
144---
145# CHECK-LABEL: name: r11_tail_call
146name: r11_tail_call
147tracksRegLiveness: true
148frameInfo:
149 adjustsStack: true # not a leaf function
150body: |
151 ; CHECK: bb.0:
152 bb.0:
153 ; CHECK: $r10 = MOV64rm $rsp, 1, $noreg, 0, $noreg
154 ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
155 ; CHECK-NEXT: ADD64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
156 ; CHECK-NEXT: $r11 = MOV64rm $r11, 1, $noreg, 0, $gs
157 ; CHECK-NEXT: MOV64mr $r11, 1, $noreg, 0, $gs, $r10
158 ; CHECK-NEXT: $eax = MOV32ri 13
159 $eax = MOV32ri 13
160
161 ; CHECK-NEXT: $r10 = XOR64rr undef $r10, undef $r10, implicit-def $eflags
162 ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
163 ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
164 ; CHECK-NEXT: SUB64mi8 $noreg, 1, $noreg, 0, $gs, 8, implicit-def $eflags
165 ; CHECK-NEXT: CMP64mr $rsp, 1, $noreg, 0, $noreg, $r10, implicit-def $eflags
166 ; CHECK-NEXT: JNE_1 %bb.1, implicit $eflags
167 ; CHECK-NEXT: TAILJMPr64 undef $r11
168 TAILJMPr64 undef $r11
169
170 ; CHECK: bb.1:
171 ; CHECK-NEXT; TRAP
172...
173---
174# CHECK-LABEL: name: conditional_tail_call
175name: conditional_tail_call
176tracksRegLiveness: true
177frameInfo:
178 adjustsStack: true # not a leaf function
179body: |
180 ; CHECK: bb.0:
181 bb.0:
182 ; CHECK: $eax = MOV32ri 13
183 $eax = MOV32ri 13
184
185 ; CHECK-NEXT: TAILJMPd64_CC @conditional_tail_call, undef $eflags
186 TAILJMPd64_CC @conditional_tail_call, undef $eflags
187...
188---
189# CHECK-LABEL: name: r10_live_in
190name: r10_live_in
191tracksRegLiveness: true
192frameInfo:
193 adjustsStack: true # not a leaf function
194body: |
195 ; CHECK: bb.0:
196 ; CHECK: liveins: $r10
197 bb.0:
198 liveins: $r10
199
200 ; CHECK: $eax = MOV32ri 13
201 $eax = MOV32ri 13
202 ; CHECK-NEXT: RETQ $eax
203 RETQ $eax
204...