http://gcc.gnu.org/ml/gcc-patches/2006-03/msg00038.html * g++.dg/other/armv7m-1.C: New. 2010-07-26 Julian Brown Merge from Sourcery G++ 4.4: http://gcc.gnu.org/ml/gcc-patches/2006-04/msg00811.html === added file 'gcc/testsuite/g++.dg/other/armv7m-1.C' --- old/gcc/testsuite/g++.dg/other/armv7m-1.C 1970-01-01 00:00:00 +0000 +++ new/gcc/testsuite/g++.dg/other/armv7m-1.C 2010-08-05 16:23:43 +0000 @@ -0,0 +1,69 @@ +/* { dg-do run { target arm*-*-* } } */ +/* Test Armv7m interrupt routines. */ +#include + +#ifdef __ARM_ARCH_7M__ +void __attribute__((interrupt)) +foo(void) +{ + long long n; + long p; + asm volatile ("" : "=r" (p) : "0" (&n)); + if (p & 4) + abort (); + return; +} + +void __attribute__((interrupt)) +bar(void) +{ + throw 42; +} + +int main() +{ + int a; + int before; + int after; + volatile register int sp asm("sp"); + + asm volatile ("mov %0, sp\n" + "blx %2\n" + "mov %1, sp\n" + : "=&r" (before), "=r" (after) : "r" (foo) + : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr"); + if (before != after) + abort(); + asm volatile ("mov %0, sp\n" + "sub sp, sp, #4\n" + "blx %2\n" + "add sp, sp, #4\n" + "mov %1, sp\n" + : "=&r" (before), "=r" (after) : "r" (foo) + : "memory", "cc", "r0", "r1", "r2", "r3", "ip", "lr"); + if (before != after) + abort(); + before = sp; + try + { + bar(); + } + catch (int i) + { + if (i != 42) + abort(); + } + catch (...) + { + abort(); + } + if (before != sp) + abort(); + exit(0); +} +#else +int main() +{ + exit (0); +} +#endif