diff options
author | Paul Brook <paul@codesourcery.com> | 2012-07-23 14:24:31 +0000 |
---|---|---|
committer | Julian Brown <jules@gcc.gnu.org> | 2012-07-23 14:24:31 +0000 |
commit | 87d84e1eb6830abc45c9df8418b2213a6447351d (patch) | |
tree | ea5096fb2161e76988eb3e635d7a9b1067aeceec | |
parent | afa6353225e54c18154b3a144e3d3596f2169d77 (diff) | |
download | gcc-87d84e1eb6830abc45c9df8418b2213a6447351d.zip gcc-87d84e1eb6830abc45c9df8418b2213a6447351d.tar.gz gcc-87d84e1eb6830abc45c9df8418b2213a6447351d.tar.bz2 |
armv7m-1.c: New test.
gcc/testsuite/
* g++.dg/other/armv7m-1.c: New test.
From-SVN: r189784
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/armv7m-1.C | 69 |
2 files changed, 73 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9b87996..40576ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-07-23 Paul Brook <paul@codesourcery.com> + + * g++.dg/other/armv7m-1.c: New test. + 2012-07-23 Julian Brown <julian@codesourcery.com> * gcc.c-torture/execute/20101011-1.c (__aeabi_idiv0): Define for diff --git a/gcc/testsuite/g++.dg/other/armv7m-1.C b/gcc/testsuite/g++.dg/other/armv7m-1.C new file mode 100644 index 0000000..6aa686b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/armv7m-1.C @@ -0,0 +1,69 @@ +/* { dg-do run { target arm*-*-* } } */ +/* Test Armv7m interrupt routines. */ +#include <stdlib.h> + +#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 |