3
3
; RUN: | FileCheck %s --check-prefix=RV32
4
4
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5
5
; RUN: | FileCheck %s --check-prefix=RV64
6
+ ; RUN: llc -mtriple=riscv32 -mattr=+experimental-zicfiss < %s \
7
+ ; RUN: -verify-machineinstrs | FileCheck %s --check-prefix=RV32-ZICFISS
8
+ ; RUN: llc -mtriple=riscv64 -mattr=+experimental-zicfiss < %s \
9
+ ; RUN: -verify-machineinstrs | FileCheck %s --check-prefix=RV64-ZICFISS
10
+ ; RUN: llc -mtriple=riscv32 -mattr=+experimental-zicfiss,forced-sw-shadow-stack \
11
+ ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV32
12
+ ; RUN: llc -mtriple=riscv64 -mattr=+experimental-zicfiss,forced-sw-shadow-stack \
13
+ ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=RV64
6
14
7
15
define void @f1 () shadowcallstack {
8
16
; RV32-LABEL: f1:
@@ -12,6 +20,14 @@ define void @f1() shadowcallstack {
12
20
; RV64-LABEL: f1:
13
21
; RV64: # %bb.0:
14
22
; RV64-NEXT: ret
23
+ ;
24
+ ; RV32-ZICFISS-LABEL: f1:
25
+ ; RV32-ZICFISS: # %bb.0:
26
+ ; RV32-ZICFISS-NEXT: ret
27
+ ;
28
+ ; RV64-ZICFISS-LABEL: f1:
29
+ ; RV64-ZICFISS: # %bb.0:
30
+ ; RV64-ZICFISS-NEXT: ret
15
31
ret void
16
32
}
17
33
@@ -25,6 +41,14 @@ define void @f2() shadowcallstack {
25
41
; RV64-LABEL: f2:
26
42
; RV64: # %bb.0:
27
43
; RV64-NEXT: tail foo
44
+ ;
45
+ ; RV32-ZICFISS-LABEL: f2:
46
+ ; RV32-ZICFISS: # %bb.0:
47
+ ; RV32-ZICFISS-NEXT: tail foo
48
+ ;
49
+ ; RV64-ZICFISS-LABEL: f2:
50
+ ; RV64-ZICFISS: # %bb.0:
51
+ ; RV64-ZICFISS-NEXT: tail foo
28
52
tail call void @foo ()
29
53
ret void
30
54
}
@@ -65,6 +89,32 @@ define i32 @f3() shadowcallstack {
65
89
; RV64-NEXT: addi gp, gp, -8
66
90
; RV64-NEXT: .cfi_restore gp
67
91
; RV64-NEXT: ret
92
+ ;
93
+ ; RV32-ZICFISS-LABEL: f3:
94
+ ; RV32-ZICFISS: # %bb.0:
95
+ ; RV32-ZICFISS-NEXT: sspush ra
96
+ ; RV32-ZICFISS-NEXT: addi sp, sp, -16
97
+ ; RV32-ZICFISS-NEXT: .cfi_def_cfa_offset 16
98
+ ; RV32-ZICFISS-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
99
+ ; RV32-ZICFISS-NEXT: .cfi_offset ra, -4
100
+ ; RV32-ZICFISS-NEXT: call bar
101
+ ; RV32-ZICFISS-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
102
+ ; RV32-ZICFISS-NEXT: addi sp, sp, 16
103
+ ; RV32-ZICFISS-NEXT: sspopchk ra
104
+ ; RV32-ZICFISS-NEXT: ret
105
+ ;
106
+ ; RV64-ZICFISS-LABEL: f3:
107
+ ; RV64-ZICFISS: # %bb.0:
108
+ ; RV64-ZICFISS-NEXT: sspush ra
109
+ ; RV64-ZICFISS-NEXT: addi sp, sp, -16
110
+ ; RV64-ZICFISS-NEXT: .cfi_def_cfa_offset 16
111
+ ; RV64-ZICFISS-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
112
+ ; RV64-ZICFISS-NEXT: .cfi_offset ra, -8
113
+ ; RV64-ZICFISS-NEXT: call bar
114
+ ; RV64-ZICFISS-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
115
+ ; RV64-ZICFISS-NEXT: addi sp, sp, 16
116
+ ; RV64-ZICFISS-NEXT: sspopchk ra
117
+ ; RV64-ZICFISS-NEXT: ret
68
118
%res = call i32 @bar ()
69
119
%res1 = add i32 %res , 1
70
120
ret i32 %res
@@ -140,6 +190,68 @@ define i32 @f4() shadowcallstack {
140
190
; RV64-NEXT: addi gp, gp, -8
141
191
; RV64-NEXT: .cfi_restore gp
142
192
; RV64-NEXT: ret
193
+ ;
194
+ ; RV32-ZICFISS-LABEL: f4:
195
+ ; RV32-ZICFISS: # %bb.0:
196
+ ; RV32-ZICFISS-NEXT: sspush ra
197
+ ; RV32-ZICFISS-NEXT: addi sp, sp, -16
198
+ ; RV32-ZICFISS-NEXT: .cfi_def_cfa_offset 16
199
+ ; RV32-ZICFISS-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
200
+ ; RV32-ZICFISS-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
201
+ ; RV32-ZICFISS-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
202
+ ; RV32-ZICFISS-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
203
+ ; RV32-ZICFISS-NEXT: .cfi_offset ra, -4
204
+ ; RV32-ZICFISS-NEXT: .cfi_offset s0, -8
205
+ ; RV32-ZICFISS-NEXT: .cfi_offset s1, -12
206
+ ; RV32-ZICFISS-NEXT: .cfi_offset s2, -16
207
+ ; RV32-ZICFISS-NEXT: call bar
208
+ ; RV32-ZICFISS-NEXT: mv s0, a0
209
+ ; RV32-ZICFISS-NEXT: call bar
210
+ ; RV32-ZICFISS-NEXT: mv s1, a0
211
+ ; RV32-ZICFISS-NEXT: call bar
212
+ ; RV32-ZICFISS-NEXT: mv s2, a0
213
+ ; RV32-ZICFISS-NEXT: call bar
214
+ ; RV32-ZICFISS-NEXT: add s0, s0, s1
215
+ ; RV32-ZICFISS-NEXT: add a0, s2, a0
216
+ ; RV32-ZICFISS-NEXT: add a0, s0, a0
217
+ ; RV32-ZICFISS-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
218
+ ; RV32-ZICFISS-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
219
+ ; RV32-ZICFISS-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
220
+ ; RV32-ZICFISS-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
221
+ ; RV32-ZICFISS-NEXT: addi sp, sp, 16
222
+ ; RV32-ZICFISS-NEXT: sspopchk ra
223
+ ; RV32-ZICFISS-NEXT: ret
224
+ ;
225
+ ; RV64-ZICFISS-LABEL: f4:
226
+ ; RV64-ZICFISS: # %bb.0:
227
+ ; RV64-ZICFISS-NEXT: sspush ra
228
+ ; RV64-ZICFISS-NEXT: addi sp, sp, -32
229
+ ; RV64-ZICFISS-NEXT: .cfi_def_cfa_offset 32
230
+ ; RV64-ZICFISS-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
231
+ ; RV64-ZICFISS-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
232
+ ; RV64-ZICFISS-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
233
+ ; RV64-ZICFISS-NEXT: sd s2, 0(sp) # 8-byte Folded Spill
234
+ ; RV64-ZICFISS-NEXT: .cfi_offset ra, -8
235
+ ; RV64-ZICFISS-NEXT: .cfi_offset s0, -16
236
+ ; RV64-ZICFISS-NEXT: .cfi_offset s1, -24
237
+ ; RV64-ZICFISS-NEXT: .cfi_offset s2, -32
238
+ ; RV64-ZICFISS-NEXT: call bar
239
+ ; RV64-ZICFISS-NEXT: mv s0, a0
240
+ ; RV64-ZICFISS-NEXT: call bar
241
+ ; RV64-ZICFISS-NEXT: mv s1, a0
242
+ ; RV64-ZICFISS-NEXT: call bar
243
+ ; RV64-ZICFISS-NEXT: mv s2, a0
244
+ ; RV64-ZICFISS-NEXT: call bar
245
+ ; RV64-ZICFISS-NEXT: add s0, s0, s1
246
+ ; RV64-ZICFISS-NEXT: add a0, s2, a0
247
+ ; RV64-ZICFISS-NEXT: addw a0, s0, a0
248
+ ; RV64-ZICFISS-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
249
+ ; RV64-ZICFISS-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
250
+ ; RV64-ZICFISS-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
251
+ ; RV64-ZICFISS-NEXT: ld s2, 0(sp) # 8-byte Folded Reload
252
+ ; RV64-ZICFISS-NEXT: addi sp, sp, 32
253
+ ; RV64-ZICFISS-NEXT: sspopchk ra
254
+ ; RV64-ZICFISS-NEXT: ret
143
255
%res1 = call i32 @bar ()
144
256
%res2 = call i32 @bar ()
145
257
%res3 = call i32 @bar ()
@@ -176,6 +288,28 @@ define i32 @f5() shadowcallstack nounwind {
176
288
; RV64-NEXT: ld ra, -8(gp)
177
289
; RV64-NEXT: addi gp, gp, -8
178
290
; RV64-NEXT: ret
291
+ ;
292
+ ; RV32-ZICFISS-LABEL: f5:
293
+ ; RV32-ZICFISS: # %bb.0:
294
+ ; RV32-ZICFISS-NEXT: sspush ra
295
+ ; RV32-ZICFISS-NEXT: addi sp, sp, -16
296
+ ; RV32-ZICFISS-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
297
+ ; RV32-ZICFISS-NEXT: call bar
298
+ ; RV32-ZICFISS-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
299
+ ; RV32-ZICFISS-NEXT: addi sp, sp, 16
300
+ ; RV32-ZICFISS-NEXT: sspopchk ra
301
+ ; RV32-ZICFISS-NEXT: ret
302
+ ;
303
+ ; RV64-ZICFISS-LABEL: f5:
304
+ ; RV64-ZICFISS: # %bb.0:
305
+ ; RV64-ZICFISS-NEXT: sspush ra
306
+ ; RV64-ZICFISS-NEXT: addi sp, sp, -16
307
+ ; RV64-ZICFISS-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
308
+ ; RV64-ZICFISS-NEXT: call bar
309
+ ; RV64-ZICFISS-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
310
+ ; RV64-ZICFISS-NEXT: addi sp, sp, 16
311
+ ; RV64-ZICFISS-NEXT: sspopchk ra
312
+ ; RV64-ZICFISS-NEXT: ret
179
313
%res = call i32 @bar ()
180
314
%res1 = add i32 %res , 1
181
315
ret i32 %res
0 commit comments