On 20/07/12 11:35, Julian Brown wrote: > Hi, > > On several architectures, the test gcc.c-torture/execute/20101011-1.c > tests the raising of a signal when a division by zero occurs, but at > present the test is simply skipped on ARM. We can make the test > slightly more useful by using the EABI-provided ability to define a > division-by-zero handling function which raises SIGFPE -- thus > mimicking the behaviour of other targets, and allowing us to run the > test as intended. > > If the target has hardware integer division instructions, the test is > still skipped. > > The new test passes for a bare-metal config. OK to apply? >
Which permutations (CPU, ARM, Thumb) did you test? R. > Thanks, > > Julian > > ChangeLog > > gcc/testsuite/ > * gcc.c-torture/execute/20101011-1.c (__aeabi_idiv0): Define for > ARM. > (DO_TEST): Define to 1 for appropriate ARM targets. > > > div-by-zero-trapping-2.diff > > > Index: gcc/testsuite/gcc.c-torture/execute/20101011-1.c > =================================================================== > --- gcc/testsuite/gcc.c-torture/execute/20101011-1.c (revision 189656) > +++ gcc/testsuite/gcc.c-torture/execute/20101011-1.c (working copy) > @@ -15,9 +15,6 @@ > #elif defined (__TMS320C6X__) > /* On TI C6X division by zero does not trap. */ > # define DO_TEST 0 > -#elif defined (__arm__) > - /* We cannot rely on division by zero generating a trap. */ > -# define DO_TEST 0 > #elif defined (__mips__) && !defined(__linux__) > /* MIPS divisions do trap by default, but libgloss targets do not > intercept the trap and raise a SIGFPE. The same is probably > @@ -36,6 +33,24 @@ > /* Attempting to trap division-by-zero in this way isn't likely to work on > bare-metal m68k systems. */ > # define DO_TEST 0 > +#elif defined (__arm__) && defined (__ARM_EABI__) > +# ifdef __ARM_ARCH_EXT_IDIV__ > + /* Hardware division instructions may not trap, and handle trapping > + differently anyway. Skip the test if we have those instructions. */ > +# define DO_TEST 0 > +# else > +# include <signal.h> > + /* ARM division-by-zero behaviour is to call a helper function, which > + can do several different things, depending on requirements. Emulate > + the behaviour of other targets here by raising SIGFPE. */ > +int __attribute__((used)) > +__aeabi_idiv0 (int return_value) > +{ > + raise (SIGFPE); > + return return_value; > +} > +# define DO_TEST 1 > +# endif > #else > # define DO_TEST 1 > #endif >