(set_float_handler): Set up signal catcher on first call in case a
front end has disabled it. From-SVN: r13534
This commit is contained in:
parent
299b54ba04
commit
3bbfa29694
41
gcc/toplev.c
41
gcc/toplev.c
@ -1870,9 +1870,27 @@ floor_log2_wide (x)
|
||||
return log;
|
||||
}
|
||||
|
||||
static int float_handler_set;
|
||||
int float_handled;
|
||||
jmp_buf float_handler;
|
||||
|
||||
/* Signals actually come here. */
|
||||
|
||||
static void
|
||||
float_signal (signo)
|
||||
/* If this is missing, some compilers complain. */
|
||||
int signo;
|
||||
{
|
||||
if (float_handled == 0)
|
||||
abort ();
|
||||
#if defined (USG) || defined (hpux)
|
||||
signal (SIGFPE, float_signal); /* re-enable the signal catcher */
|
||||
#endif
|
||||
float_handled = 0;
|
||||
signal (SIGFPE, float_signal);
|
||||
longjmp (float_handler, 1);
|
||||
}
|
||||
|
||||
/* Specify where to longjmp to when a floating arithmetic error happens.
|
||||
If HANDLER is 0, it means don't handle the errors any more. */
|
||||
|
||||
@ -1883,6 +1901,12 @@ set_float_handler (handler)
|
||||
float_handled = (handler != 0);
|
||||
if (handler)
|
||||
bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
|
||||
|
||||
if (float_handled && ! float_handler_set)
|
||||
{
|
||||
signal (SIGFPE, float_signal);
|
||||
float_handler_set = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Specify, in HANDLER, where to longjmp to when a floating arithmetic
|
||||
@ -1917,23 +1941,6 @@ pop_float_handler (handled, handler)
|
||||
bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
|
||||
}
|
||||
|
||||
/* Signals actually come here. */
|
||||
|
||||
static void
|
||||
float_signal (signo)
|
||||
/* If this is missing, some compilers complain. */
|
||||
int signo;
|
||||
{
|
||||
if (float_handled == 0)
|
||||
abort ();
|
||||
#if defined (USG) || defined (hpux)
|
||||
signal (SIGFPE, float_signal); /* re-enable the signal catcher */
|
||||
#endif
|
||||
float_handled = 0;
|
||||
signal (SIGFPE, float_signal);
|
||||
longjmp (float_handler, 1);
|
||||
}
|
||||
|
||||
/* Handler for SIGPIPE. */
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user