blob: 93db8e2a73854dba371ba92150706c0dcadd9c2b [file] [log] [blame]
/* Test epilogue of a realigned interrupt handler. */
/* { dg-do run } */
/* { dg-options "-mthumb -Os -mgeneral-regs-only" } */
/* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
/* { dg-require-effective-target arm_cortex_m } */
/* { dg-require-effective-target arm_eabi } */
extern __attribute__((noreturn)) void abort(void);
extern int snprintf(char *, int, const char *, ...);
#define BUFF_LEN 256
char buff[BUFF_LEN];
char *get_buffer(void)
{
return buff;
}
void __attribute__((interrupt)) foo(void)
{
char *msg = get_buffer();
snprintf(msg, BUFF_LEN, "%d %p", 1, buff+BUFF_LEN);
}
volatile void * save_sp;
int main()
{
register volatile void * sp asm("sp");
/* Check stack pointer before/after calling the interrupt
* handler. Not equal means that handler doesn't restore
* stack correctly. */
save_sp = sp;
foo();
/* Abort here instead of return non-zero. Due to wrong sp, lr value,
* returning from main may not work. */
if (save_sp != sp)
{
sp = save_sp;
abort();
}
return 0;
}