1 /* { dg-do run } */
2 /* { dg-require-effective-target fstack_protector } */
3 /* { dg-options "-fstack-protector-all -O2" } */
4
5 extern volatile long *stack_chk_guard_ptr;
6
7 volatile long *
8 get_ptr (void)
9 {
10 return stack_chk_guard_ptr;
11 }
12
13 void __attribute__ ((noipa))
14 f (void)
15 {
16 volatile int x;
17 x = 1;
18 x += 1;
19 }
20
21 #define CHECK(REG) "\tcmp\tx0, " #REG "\n\tbeq\t1f\n"
22
23 asm (
24 " .pushsection .data\n"
25 " .align 3\n"
26 " .globl stack_chk_guard_ptr\n"
27 "stack_chk_guard_ptr:\n"
28 #if __ILP32__
29 " .word __stack_chk_guard\n"
30 #else
31 " .xword __stack_chk_guard\n"
32 #endif
33 " .weak __stack_chk_guard\n"
34 "__stack_chk_guard:\n"
35 " .word 0xdead4321\n"
36 " .word 0xbeef8765\n"
37 " .text\n"
38 " .globl main\n"
39 " .type main, %function\n"
40 "main:\n"
41 " bl get_ptr\n"
42 " str x0, [sp, #-16]!\n"
43 " bl f\n"
44 " str x0, [sp, #8]\n"
45 " ldr x0, [sp]\n"
46 #if __ILP32__
47 " ldr w0, [x0]\n"
48 #else
49 " ldr x0, [x0]\n"
50 #endif
51 CHECK (x1)
52 CHECK (x2)
53 CHECK (x3)
54 CHECK (x4)
55 CHECK (x5)
56 CHECK (x6)
57 CHECK (x7)
58 CHECK (x8)
59 CHECK (x9)
60 CHECK (x10)
61 CHECK (x11)
62 CHECK (x12)
63 CHECK (x13)
64 CHECK (x14)
65 CHECK (x15)
66 CHECK (x16)
67 CHECK (x17)
68 CHECK (x18)
69 CHECK (x19)
70 CHECK (x20)
71 CHECK (x21)
72 CHECK (x22)
73 CHECK (x23)
74 CHECK (x24)
75 CHECK (x25)
76 CHECK (x26)
77 CHECK (x27)
78 CHECK (x28)
79 CHECK (x29)
80 CHECK (x30)
81 " ldr x1, [sp]\n"
82 CHECK (x1)
83 " mov x0, #0\n"
84 " b exit\n"
85 "1:\n"
86 " b abort\n"
87 " .size main, .-main\n"
88 " .popsection"
89 );