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
> 




Reply via email to