File: handler-align.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A8-2019-q3-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 571,828 kB
  • sloc: ansic: 2,937,651; cpp: 881,644; ada: 597,189; makefile: 65,528; asm: 56,499; xml: 46,621; exp: 24,747; sh: 19,684; python: 7,256; pascal: 4,370; awk: 3,497; perl: 2,695; yacc: 316; ml: 285; f90: 234; lex: 198; objc: 194; haskell: 119
file content (42 lines) | stat: -rw-r--r-- 1,039 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* Test epilogue of a realigned interrupt handler. */
/* { dg-do run } */
/* { dg-options "-mthumb -Os" } */
/* { 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;
}