1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/* { dg-options "-fnon-call-exceptions" } */
/* With -fnon-call-exceptions 0 / 0 should not be eliminated. */
/* { dg-additional-options "-DSIGNAL_SUPPRESS" { target { ! signal } } } */
/* { dg-additional-options "-mcheck-zero-division" { target { loongarch*-*-* } } } */
#ifdef SIGNAL_SUPPRESS
# define DO_TEST 0
#elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (__POWERPC__) || defined (__ppc)
/* On PPC division by zero does not trap. */
# define DO_TEST 0
#elif defined (__riscv)
/* On RISC-V division by zero does not trap. */
# define DO_TEST 0
#elif defined (__sh__)
/* On SH division by zero does not trap. */
# define DO_TEST 0
#elif defined (__v850__)
/* On V850 division by zero does not trap. */
# define DO_TEST 0
#elif defined (__MSP430__)
/* On MSP430 division by zero does not trap. */
# define DO_TEST 0
#elif defined (__RL78__)
/* On RL78 division by zero does not trap. */
# define DO_TEST 0
#elif defined (__RX__)
/* On RX division by zero does not trap. */
# define DO_TEST 0
#elif defined (__aarch64__)
/* On AArch64 integer division by zero does not trap. */
# define DO_TEST 0
#elif defined (__TMS320C6X__)
/* On TI C6X division by zero does not trap. */
# define DO_TEST 0
#elif defined (__VISIUM__)
/* On Visium division by zero does not 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
true of other bare-metal environments, so restrict the test to
systems that use the Linux kernel. */
# define DO_TEST 0
#elif defined (__mips16) && defined(__linux__)
/* Not all Linux kernels deal correctly the breakpoints generated by
MIPS16 divisions by zero. They show up as a SIGTRAP instead. */
# define DO_TEST 0
#elif defined (__MICROBLAZE__)
/* We cannot rely on division by zero generating a trap. */
# define DO_TEST 0
#elif defined (__epiphany__)
/* Epiphany does not have hardware division, and the software implementation
has truly undefined behavior for division by 0. */
# define DO_TEST 0
#elif defined (__m68k__) && !defined(__linux__)
/* 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 (__CRIS__)
/* No SIGFPE for CRIS integer division. */
# define DO_TEST 0
#elif defined (__MMIX__)
/* By default we emit a sequence with DIVU, which "never signals an
exceptional condition, even when dividing by zero". */
# define DO_TEST 0
#elif defined (__arc__)
/* No SIGFPE for ARC integer division. */
# 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 behavior is to call a helper function, which
can do several different things, depending on requirements. Emulate
the behavior 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
#elif defined (__nios2__)
/* Nios II requires both hardware support and user configuration to
raise an exception on divide by zero. */
# define DO_TEST 0
#elif defined (__nvptx__)
/* There isn't even a signal function. */
# define DO_TEST 0
#elif defined (__csky__)
/* This presently doesn't raise SIGFPE even on csky-linux-gnu, much
less bare metal. See the implementation of __divsi3 in libgcc. */
# define DO_TEST 0
#elif defined (__moxie__)
/* Not all moxie configurations may raise exceptions. */
# define DO_TEST 0
#elif defined (__or1k__)
/* On OpenRISC division by zero does not trap. */
# define DO_TEST 0
#elif defined (__pru__)
/* There isn't even a signal function. */
# define DO_TEST 0
#else
# define DO_TEST 1
#endif
extern void abort (void);
extern void exit (int);
#if DO_TEST
#include <signal.h>
void
sigfpe (int signum __attribute__ ((unused)))
{
exit (0);
}
#endif
/* When optimizing, the compiler is smart enough to constant fold the
static unset variables i and j to produce 0 / 0, but it can't
eliminate the assignment to the global k. */
static int i;
static int j;
int k __attribute__ ((used));
int
main ()
{
#if DO_TEST
signal (SIGFPE, sigfpe);
k = i / j;
abort ();
#else
exit (0);
#endif
}
|