aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/20101011-1.c
blob: d2c0f9ab7ece33bb1facce45028e93bc368ee453 (plain)
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
}