1 /* Test epilogue of a realigned interrupt handler. */
3 /* { dg-options "-mthumb -Os" } */
4 /* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
5 /* { dg-require-effective-target arm_cortex_m } */
6 /* { dg-require-effective-target arm_eabi } */
8 extern __attribute__((noreturn
)) void abort(void);
9 extern int snprintf(char *, int, const char *, ...);
14 char *get_buffer(void)
19 void __attribute__((interrupt
)) foo(void)
21 char *msg
= get_buffer();
22 snprintf(msg
, BUFF_LEN
, "%d %p", 1, buff
+BUFF_LEN
);
25 volatile void * save_sp
;
28 register volatile void * sp
asm("sp");
29 /* Check stack pointer before/after calling the interrupt
30 * handler. Not equal means that handler doesn't restore
34 /* Abort here instead of return non-zero. Due to wrong sp, lr value,
35 * returning from main may not work. */