Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/other/armv7m-1.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
/* { 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