blob: 73e83bc413f6db743aab2d7f36f04ec6acdde7f6 [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target fstack_protector } */
/* { dg-options "-fstack-protector-all -O2" } */
extern volatile long *stack_chk_guard_ptr;
volatile long *
get_ptr (void)
{
return stack_chk_guard_ptr;
}
void __attribute__ ((noipa))
f (void)
{
volatile int x;
x = 1;
x += 1;
}
#define CHECK(REG) "\tcmp\tx0, " #REG "\n\tbeq\t1f\n"
asm (
" .pushsection .data\n"
" .align 3\n"
" .globl stack_chk_guard_ptr\n"
"stack_chk_guard_ptr:\n"
#if __ILP32__
" .word __stack_chk_guard\n"
#else
" .xword __stack_chk_guard\n"
#endif
" .weak __stack_chk_guard\n"
"__stack_chk_guard:\n"
" .word 0xdead4321\n"
" .word 0xbeef8765\n"
" .text\n"
" .globl main\n"
" .type main, %function\n"
"main:\n"
" bl get_ptr\n"
" str x0, [sp, #-16]!\n"
" bl f\n"
" str x0, [sp, #8]\n"
" ldr x0, [sp]\n"
#if __ILP32__
" ldr w0, [x0]\n"
#else
" ldr x0, [x0]\n"
#endif
CHECK (x1)
CHECK (x2)
CHECK (x3)
CHECK (x4)
CHECK (x5)
CHECK (x6)
CHECK (x7)
CHECK (x8)
CHECK (x9)
CHECK (x10)
CHECK (x11)
CHECK (x12)
CHECK (x13)
CHECK (x14)
CHECK (x15)
CHECK (x16)
CHECK (x17)
CHECK (x18)
CHECK (x19)
CHECK (x20)
CHECK (x21)
CHECK (x22)
CHECK (x23)
CHECK (x24)
CHECK (x25)
CHECK (x26)
CHECK (x27)
CHECK (x28)
CHECK (x29)
CHECK (x30)
" ldr x1, [sp]\n"
CHECK (x1)
" mov x0, #0\n"
" b exit\n"
"1:\n"
" b abort\n"
" .size main, .-main\n"
" .popsection"
);