From 107b1f6fc600d496e7858d2a360db999b8e0f0f8 Mon Sep 17 00:00:00 2001 From: kenner Date: Mon, 20 Jan 1997 02:19:04 +0000 Subject: [PATCH] (set_float_handler): Set up signal catcher on first call in case a front end has disabled it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@13534 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/toplev.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/gcc/toplev.c b/gcc/toplev.c index 34e695de5c9..1828ecb3ad1 100644 --- a/gcc/toplev.c +++ b/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 -- 2.11.0