diff options
author | Joseph Myers <jsm28@gcc.gnu.org> | 2007-03-07 13:04:15 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2007-03-07 13:04:15 +0000 |
commit | a566d0500260adef9bbf1a11a4995cd55602d480 (patch) | |
tree | 519234808030de5a62518b53c312f9e9c19e836a /gcc/testsuite | |
parent | ef6727554227774efb21cf1053472f6d419d3ace (diff) | |
download | gcc-a566d0500260adef9bbf1a11a4995cd55602d480.zip gcc-a566d0500260adef9bbf1a11a4995cd55602d480.tar.gz gcc-a566d0500260adef9bbf1a11a4995cd55602d480.tar.bz2 |
libunwind.S: Add .arch/.object_arch for armv4 builds.
gcc:
2007-03-07 Paul Brook <paul@codesourcery.com>
* config/arm/libunwind.S: Add .arch/.object_arch for armv4 builds.
gcc:
2007-03-07 Joseph Myers <joseph@codesourcery.com>
* config/arm/unwind-arm.c (struct wmmxd_regs, struct wmmxc_regs):
New.
(phase1_vrs): Use them.
(DEMAND_SAVE_WMMXD, DEMAND_SAVE_WMMXC): New.
(__gnu_Unwind_Save_WMMXD, __gnu_Unwind_Restore_WMMXD,
__gnu_Unwind_Save_WMMXC, __gnu_Unwind_Restore_WMMXC): Declare.
(restore_non_core_regs): Call __gnu_Unwind_Restore_WMMXD and
__gnu_Unwind_Restore_WMMXC if required.
(_Unwind_VRS_Pop): Implement iWMMXt support.
* config/arm/libunwind.S (gnu_Unwind_Restore_WMMXD,
gnu_Unwind_Save_WMMXD, gnu_Unwind_Restore_WMMXC,
gnu_Unwind_Save_WMMXC): Define.
gcc/testsuite:
2007-03-07 Joseph Myers <joseph@codesourcery.com>
* g++.dg/eh/arm-iwmmxt-unwind.C: New test.
From-SVN: r122658
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C | 47 |
2 files changed, 51 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 99fcde6..7d2b323 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-03-07 Joseph Myers <joseph@codesourcery.com> + + * g++.dg/eh/arm-iwmmxt-unwind.C: New test. + 2007-03-07 Paolo Bonzini <bonzini@gnu.org> * gcc.dg/var-expand1.c: Add newline at end of file. diff --git a/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C b/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C new file mode 100644 index 0000000..109837c --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C @@ -0,0 +1,47 @@ +/* Test unwinding of iWMMXt register saves. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm32 } */ + +#ifdef __IWMMXT__ +extern "C" void abort (void); +extern "C" void exit (int); + +void +foo (void) +{ + register long long wr10 asm("wr10") = 0; + register long long wr11 asm("wr11") = 1; + register long long wr12 asm("wr12") = 2; + register long long wr14 asm("wr14") = 4; + register long long wr15 asm("wr15") = 5; + asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr14), "+y" (wr15)); + throw ""; +} + +int +main (void) +{ + register long long wr10 asm("wr10") = 10; + register long long wr11 asm("wr11") = 11; + register long long wr12 asm("wr12") = 12; + register long long wr13 asm("wr13") = 13; + register long long wr14 asm("wr14") = 14; + register long long wr15 asm("wr15") = 15; + asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr13), "+y" (wr14), "+y" (wr15)); + try { + foo (); + } catch (...) { + asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr13), "+y" (wr14), "+y" (wr15)); + if (wr10 != 10 || wr11 != 11 || wr12 != 12 || wr13 != 13 || wr14 != 14 || wr15 != 15) + abort (); + } + exit (0); +} +#else +int +main (void) +{ +} +#endif |