blob: 8d28b0a847c20ed2edb0317f23963abcfe23668b [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\tr0, " #REG "\n\tbeq\t1f\n"
asm (
" .data\n"
" .align 3\n"
" .globl stack_chk_guard_ptr\n"
"stack_chk_guard_ptr:\n"
" .word __stack_chk_guard\n"
" .weak __stack_chk_guard\n"
"__stack_chk_guard:\n"
" .word 0xdead4321\n"
" .text\n"
" .globl main\n"
" .type main, %function\n"
"main:\n"
" bl get_ptr\n"
" sub sp, sp, #8\n"
" str r0, [sp]\n"
" bl f\n"
" str r0, [sp, #4]\n"
" ldr r0, [sp]\n"
" ldr r0, [r0]\n"
CHECK (r1)
CHECK (r2)
CHECK (r3)
CHECK (r4)
CHECK (r5)
CHECK (r6)
CHECK (r7)
CHECK (r8)
CHECK (r9)
CHECK (r10)
CHECK (r11)
CHECK (r12)
CHECK (r14)
" ldr r1, [sp, #4]\n"
CHECK (r1)
" mov r0, #0\n"
" b exit\n"
"1:\n"
" b abort\n"
" .size main, .-main"
);