xref: /llvm-project/llvm/test/CodeGen/AArch64/stack-guard-sysreg.ll (revision 7ba4896ecfef8445ddb6f5e4facf03a399ba14da)
1; RUN: split-file %s %t
2; RUN: cat %t/main.ll %t/a.ll > %t/a2.ll
3; RUN: cat %t/main.ll %t/b.ll > %t/b2.ll
4; RUN: cat %t/main.ll %t/c.ll > %t/c2.ll
5; RUN: cat %t/main.ll %t/d.ll > %t/d2.ll
6; RUN: cat %t/main.ll %t/e.ll > %t/e2.ll
7; RUN: cat %t/main.ll %t/f.ll > %t/f2.ll
8; RUN: cat %t/main.ll %t/g.ll > %t/g2.ll
9; RUN: cat %t/main.ll %t/h.ll > %t/h2.ll
10; RUN: cat %t/main.ll %t/i.ll > %t/i2.ll
11; RUN: cat %t/main.ll %t/j.ll > %t/j2.ll
12; RUN: llc %t/a2.ll -verify-machineinstrs -o - | \
13; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NO-OFFSET %s
14; RUN: llc %t/b2.ll -verify-machineinstrs -o - | \
15; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-POSITIVE-OFFSET %s
16; RUN: llc %t/c2.ll -verify-machineinstrs -o - | \
17; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NEGATIVE-OFFSET %s
18; RUN: llc %t/d2.ll -verify-machineinstrs -o - | \
19; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NPOT-OFFSET %s
20; RUN: llc %t/e2.ll -verify-machineinstrs -o - | \
21; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NPOT-NEG-OFFSET %s
22; RUN: llc %t/f2.ll -verify-machineinstrs -o - | \
23; RUN: FileCheck --check-prefix=CHECK-ADD --check-prefix=CHECK-257-OFFSET %s
24; RUN: llc %t/g2.ll -verify-machineinstrs -o - | \
25; RUN: FileCheck --check-prefix=CHECK-ADD --check-prefix=CHECK-MINUS-257-OFFSET %s
26
27; XFAIL
28; RUN: not --crash llc %t/h2.ll -o - 2>&1 | \
29; RUN: FileCheck --check-prefix=CHECK-BAD-OFFSET %s
30; RUN: not --crash llc %t/i2.ll -o - 2>&1 | \
31; RUN: FileCheck --check-prefix=CHECK-BAD-OFFSET %s
32; RUN: not --crash llc %t/j2.ll -o - 2>&1 | \
33; RUN: FileCheck --check-prefix=CHECK-BAD-OFFSET %s
34
35;--- main.ll
36
37target triple = "aarch64-unknown-linux-gnu"
38
39; Verify that we `mrs` from `SP_EL0` twice, rather than load from
40; __stack_chk_guard.
41define dso_local void @foo(i64 %t) local_unnamed_addr #0 {
42; CHECK-LABEL: foo:                                    // @foo
43; CHECK:         .cfi_startproc
44; CHECK: // %bb.0:                               // %entry
45; CHECK-NEXT:    stp     x29, x30, [sp, #-16]!           // 16-byte Folded Spill
46; CHECK-NEXT:    .cfi_def_cfa_offset 16
47; CHECK-NEXT:    mov     x29, sp
48; CHECK-NEXT:    .cfi_def_cfa w29, 16
49; CHECK-NEXT:    .cfi_offset w30, -8
50; CHECK-NEXT:    .cfi_offset w29, -16
51; CHECK-NEXT:    .cfi_remember_state
52; CHECK-NEXT:    sub     sp, sp, #16
53; CHECK-NEXT:    mrs     x8, SP_EL0
54; CHECK-NEXT:    lsl     x9, x0, #2
55; CHECK-NO-OFFSET: ldr     x8, [x8]
56; CHECK-POSITIVE-OFFSET: ldr x8, [x8, #8]
57; CHECK-NEGATIVE-OFFSET: ldur x8, [x8, #-8]
58; CHECK-NPOT-OFFSET:     ldur x8, [x8, #1]
59; CHECK-NPOT-NEG-OFFSET: ldur x8, [x8, #-1]
60; CHECK-NEXT:    add     x9, x9, #15
61; CHECK-NEXT:    stur    x8, [x29, #-8]
62; CHECK-NEXT     mov     x8, sp
63; CHECK-NEXT     and     x9, x9, #0xfffffffffffffff0
64; CHECK-NEXT     sub     x0, x8, x9
65; CHECK-NEXT     mov     sp, x0
66; CHECK-NEXT     bl      baz
67; CHECK-NEXT     mrs     x8, SP_EL0
68; CHECK-NO-OFFSET:       ldr x8, [x8]
69; CHECK-POSITIVE-OFFSET: ldr x8, [x8, #8]
70; CHECK-NEGATIVE-OFFSET: ldur x8, [x8, #-8]
71; CHECK-NPOT-OFFSET:     ldur x8, [x8, #1]
72; CHECK-NPOT-NEG-OFFSET: ldur x8, [x8, #-1]
73; CHECK-NEXT:          ldur    x9, [x29, #-8]
74; CHECK-NEXT:          cmp     x8, x9
75; CHECK-NEXT:          b.ne    .LBB0_2
76; CHECK-NEXT: // %bb.1:                               // %entry
77; CHECK-NEXT:         mov     sp, x29
78; CHECK-NEXT:         .cfi_def_cfa wsp, 16
79; CHECK-NEXT:         ldp     x29, x30, [sp], #16             // 16-byte Folded Reload
80; CHECK-NEXT:         .cfi_def_cfa_offset 0
81; CHECK-NEXT:         .cfi_restore w30
82; CHECK-NEXT:         .cfi_restore w29
83; CHECK-NEXT:         ret
84; CHECK-NEXT: .LBB0_2:                                // %entry
85; CHECK-NEXT:         .cfi_restore_state
86; CHECK-NEXT:         bl      __stack_chk_fail
87; CHECK-NEXT: .Lfunc_end0:
88; CHECK-NEXT:         .size   foo, .Lfunc_end0-foo
89; CHECK-NEXT:         .cfi_endproc
90; CHECK-NEXT:                                        // -- End function
91; CHECK-NEXT:        .section        ".note.GNU-stack","",@progbits
92
93
94; CHECK-ADD:        stp     x29, x30, [sp, #-16]!           // 16-byte Folded Spill
95; CHECK-ADD-NEXT:        .cfi_def_cfa_offset 16
96; CHECK-ADD-NEXT:        mov     x29, sp
97; CHECK-ADD-NEXT:        .cfi_def_cfa w29, 16
98; CHECK-ADD-NEXT:        .cfi_offset w30, -8
99; CHECK-ADD-NEXT:        .cfi_offset w29, -16
100; CHECK-ADD-NEXT:        .cfi_remember_state
101; CHECK-ADD-NEXT:        sub     sp, sp, #16
102; CHECK-ADD-NEXT:        mrs     x8, SP_EL0
103; CHECK-ADD-NEXT:        lsl     x9, x0, #2
104; CHECK-MINUS-257-OFFSET: sub     x8, x8, #257
105; CHECK-257-OFFSET:      add     x8, x8, #257
106; CHECK-ADD-NEXT:        ldr     x8, [x8]
107; CHECK-ADD-NEXT:        add     x9, x9, #15
108; CHECK-ADD-NEXT:        and     x9, x9, #0xfffffffffffffff0
109; CHECK-ADD-NEXT:        stur    x8, [x29, #-8]
110; CHECK-ADD-NEXT:        mov     x8, sp
111; CHECK-ADD-NEXT:        sub     x0, x8, x9
112; CHECK-ADD-NEXT:        mov     sp, x0
113; CHECK-ADD-NEXT:        bl      baz
114; CHECK-ADD-NEXT:        mrs     x8, SP_EL0
115; CHECK-257-OFFSET:      add     x8, x8, #257
116; CHECK-MINUS-257-OFFSET: sub     x8, x8, #257
117; CHECK-ADD-NEXT:         ldr     x8, [x8]
118; CHECK-ADD-NEXT:         ldur    x9, [x29, #-8]
119; CHECK-ADD-NEXT:         cmp     x8, x9
120; CHECK-ADD-NEXT:         b.ne    .LBB0_2
121; CHECK-ADD-NEXT: // %bb.1:                               // %entry
122; CHECK-ADD-NEXT:         mov     sp, x29
123; CHECK-ADD-NEXT:         .cfi_def_cfa wsp, 16
124; CHECK-ADD-NEXT:         ldp     x29, x30, [sp], #16             // 16-byte Folded Reload
125; CHECK-ADD-NEXT:         .cfi_def_cfa_offset 0
126; CHECK-ADD-NEXT:         .cfi_restore w30
127; CHECK-ADD-NEXT:         .cfi_restore w29
128; CHECK-ADD-NEXT:         ret
129; CHECK-ADD-NEXT: .LBB0_2:                                // %entry
130; CHECK-ADD-NEXT:         .cfi_restore_state
131; CHECK-ADD-NEXT:         bl      __stack_chk_fail
132; CHECK-ADD-NEXT: .Lfunc_end0:
133; CHECK-ADD-NEXT:         .size   foo, .Lfunc_end0-foo
134; CHECK-ADD-NEXT:         .cfi_endproc
135; CHECK-ADD-NEXT:                                         // -- End function
136; CHECK-ADD-NEXT:         .section        ".note.GNU-stack","",@progbits
137entry:
138  %vla = alloca i32, i64 %t, align 4
139  call void @baz(ptr nonnull %vla)
140  ret void
141}
142
143declare void @baz(ptr)
144
145; CHECK-BAD-OFFSET: LLVM ERROR: Unable to encode Stack Protector Guard Offset
146
147attributes #0 = { sspstrong uwtable }
148!llvm.module.flags = !{!1, !2, !3}
149
150!1 = !{i32 2, !"stack-protector-guard", !"sysreg"}
151!2 = !{i32 2, !"stack-protector-guard-reg", !"sp_el0"}
152
153;--- a.ll
154!3 = !{i32 2, !"stack-protector-guard-offset", i32 0}
155;--- b.ll
156!3 = !{i32 2, !"stack-protector-guard-offset", i32 8}
157;--- c.ll
158!3 = !{i32 2, !"stack-protector-guard-offset", i32 -8}
159;--- d.ll
160!3 = !{i32 2, !"stack-protector-guard-offset", i32 1}
161;--- e.ll
162!3 = !{i32 2, !"stack-protector-guard-offset", i32 -1}
163;--- f.ll
164!3 = !{i32 2, !"stack-protector-guard-offset", i32 257}
165;--- g.ll
166!3 = !{i32 2, !"stack-protector-guard-offset", i32 -257}
167;--- h.ll
168!3 = !{i32 2, !"stack-protector-guard-offset", i32 32761}
169;--- i.ll
170!3 = !{i32 2, !"stack-protector-guard-offset", i32 -4096}
171;--- j.ll
172!3 = !{i32 2, !"stack-protector-guard-offset", i32 4097}
173