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? 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.
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