1/* { dg-do run { target arm*-*-* } } */ 2/* Test Armv7m interrupt routines. */ 3#include <stdlib.h> 4 5#ifdef __ARM_ARCH_7M__ 6void __attribute__((interrupt)) 7foo(void) 8{ 9 long long n; 10 long p; 11 asm volatile ("" : "=r" (p) : "0" (&n)); 12 if (p & 4) 13 abort (); 14 return; 15} 16 17void __attribute__((interrupt)) 18bar(void) 19{ 20 throw 42; 21} 22 23int main() 24{ 25 int a; 26 int before; 27 int after; 28 volatile register int sp asm("sp"); 29 30 asm volatile ("mov %0, sp\n" 31 "blx %2\n" 32 "mov %1, sp\n" 33 : "=&r" (before), "=r" (after) : "r" (foo) 34 : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr"); 35 if (before != after) 36 abort(); 37 asm volatile ("mov %0, sp\n" 38 "sub sp, sp, #4\n" 39 "blx %2\n" 40 "add sp, sp, #4\n" 41 "mov %1, sp\n" 42 : "=&r" (before), "=r" (after) : "r" (foo) 43 : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr"); 44 if (before != after) 45 abort(); 46 before = sp; 47 try 48 { 49 bar(); 50 } 51 catch (int i) 52 { 53 if (i != 42) 54 abort(); 55 } 56 catch (...) 57 { 58 abort(); 59 } 60 if (before != sp) 61 abort(); 62 exit(0); 63} 64#else 65int main() 66{ 67 exit (0); 68} 69#endif 70