Commit 3bbfa296 by Richard Kenner

(set_float_handler): Set up signal catcher on first call in case a

front end has disabled it.

From-SVN: r13534
parent 299b54ba
...@@ -1870,9 +1870,27 @@ floor_log2_wide (x) ...@@ -1870,9 +1870,27 @@ floor_log2_wide (x)
return log; return log;
} }
static int float_handler_set;
int float_handled; int float_handled;
jmp_buf float_handler; 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. /* Specify where to longjmp to when a floating arithmetic error happens.
If HANDLER is 0, it means don't handle the errors any more. */ If HANDLER is 0, it means don't handle the errors any more. */
...@@ -1883,6 +1901,12 @@ set_float_handler (handler) ...@@ -1883,6 +1901,12 @@ set_float_handler (handler)
float_handled = (handler != 0); float_handled = (handler != 0);
if (handler) if (handler)
bcopy ((char *) handler, (char *) float_handler, sizeof (float_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 /* Specify, in HANDLER, where to longjmp to when a floating arithmetic
...@@ -1917,23 +1941,6 @@ pop_float_handler (handled, handler) ...@@ -1917,23 +1941,6 @@ pop_float_handler (handled, handler)
bcopy ((char *) handler, (char *) float_handler, sizeof (float_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. */ /* Handler for SIGPIPE. */
static void static void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment