Clarify FP exception documentation and messages
authorJanne Blomqvist <jb@gcc.gnu.org>
Fri, 20 May 2011 12:55:45 +0000 (15:55 +0300)
committerJanne Blomqvist <jb@gcc.gnu.org>
Fri, 20 May 2011 12:55:45 +0000 (15:55 +0300)
From-SVN: r173944

gcc/fortran/ChangeLog
gcc/fortran/gfortran.texi
gcc/fortran/invoke.texi
gcc/fortran/libgfortran.h
gcc/fortran/options.c
libgfortran/ChangeLog
libgfortran/config/fpu-387.h
libgfortran/config/fpu-aix.h
libgfortran/config/fpu-generic.h
libgfortran/config/fpu-glibc.h
libgfortran/config/fpu-sysv.h

index a6fffdfd4d0a0655ac1ec190d00fd8731d514a09..5677c4c48fad9c7755a44aad8341cc7210acc2bb 100644 (file)
@@ -1,4 +1,12 @@
-2011-06-19  Tobias Burnus  <burnus@net-b.de>
+2011-05-20  Janne Blomqvist  <jb@gcc.gnu.org>
+
+        * gfortran.texi (set_fpe): Update documentation.
+        * invoke.texi (-ffpe-trap): Likewise.
+        * libgfortran.h (GFC_FPE_PRECISION): Rename to GFC_FPE_INEXACT.
+        * options.c (gfc_handle_fpe_trap_option): Handle inexact and make
+        precision an alias for it.
+
+2011-05-19  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/18918
        * trans-types.c (gfc_get_element_type): Handle scalar coarrays.
index 995d9d8eab80b0f428fd3bb0d9ff1aa535c3a8de..4db506c5391192082a61108586f9b2c42d754c1b 100644 (file)
@@ -2718,16 +2718,15 @@ int main (int argc, char *argv[])
 
 
 @node _gfortran_set_fpe
-@subsection @code{_gfortran_set_fpe} --- Set when a Floating Point Exception should be raised
+@subsection @code{_gfortran_set_fpe} --- Enable floating point exception traps
 @fnindex _gfortran_set_fpe
 @cindex libgfortran initialization, set_fpe
 
 @table @asis
 @item @emph{Description}:
-@code{_gfortran_set_fpe} sets the IEEE exceptions for which a
-Floating Point Exception (FPE) should be raised.  On most systems,
-this will result in a SIGFPE signal being sent and the program
-being interrupted.
+@code{_gfortran_set_fpe} enables floating point exception traps for
+the specified exceptions.  On most systems, this will result in a
+SIGFPE signal being sent and the program being aborted.
 
 @item @emph{Syntax}:
 @code{void _gfortran_set_fpe (int val)}
@@ -2738,7 +2737,7 @@ being interrupted.
 (bitwise or-ed) zero (0, default) no trapping,
 @code{GFC_FPE_INVALID} (1), @code{GFC_FPE_DENORMAL} (2),
 @code{GFC_FPE_ZERO} (4), @code{GFC_FPE_OVERFLOW} (8),
-@code{GFC_FPE_UNDERFLOW} (16), and @code{GFC_FPE_PRECISION} (32).
+@code{GFC_FPE_UNDERFLOW} (16), and @code{GFC_FPE_INEXACT} (32).
 @end multitable
 
 @item @emph{Example}:
index ab45072efadc0d2dc97ec26b5b92e56618424ab9..41fee670a6c72fdb4274c50a03ce9c8a4c48e409 100644 (file)
@@ -919,21 +919,31 @@ GNU Fortran compiler itself.  This option is deprecated; use
 
 @item -ffpe-trap=@var{list}
 @opindex @code{ffpe-trap=}@var{list}
-Specify a list of IEEE exceptions when a Floating Point Exception
-(FPE) should be raised.  On most systems, this will result in a SIGFPE
-signal being sent and the program being interrupted, producing a core
-file useful for debugging.  @var{list} is a (possibly empty) comma-separated
-list of the following IEEE exceptions: @samp{invalid} (invalid floating
-point operation, such as @code{SQRT(-1.0)}), @samp{zero} (division by
-zero), @samp{overflow} (overflow in a floating point operation),
-@samp{underflow} (underflow in a floating point operation),
-@samp{precision} (loss of precision during operation) and @samp{denormal}
-(operation produced a denormal value).
-
-Some of the routines in the Fortran runtime library, like
-@samp{CPU_TIME}, are likely to trigger floating point exceptions when
-@code{ffpe-trap=precision} is used. For this reason, the use of 
-@code{ffpe-trap=precision} is not recommended.
+Specify a list of floating point exception traps to enable.  On most
+systems, if a floating point exception occurs and the trap for that
+exception is enabled, a SIGFPE signal will be sent and the program
+being aborted, producing a core file useful for debugging.  @var{list}
+is a (possibly empty) comma-separated list of the following
+exceptions: @samp{invalid} (invalid floating point operation, such as
+@code{SQRT(-1.0)}), @samp{zero} (division by zero), @samp{overflow}
+(overflow in a floating point operation), @samp{underflow} (underflow
+in a floating point operation), @samp{inexact} (loss of precision
+during operation), and @samp{denormal} (operation performed on a
+denormal value).  The first five exceptions correspond to the five
+IEEE 754 exceptions, whereas the last one (@samp{denormal}) is not
+part of the IEEE 754 standard but is available on some common
+architectures such as x86.
+
+The first three exceptions (@samp{invalid}, @samp{zero}, and
+@samp{overflow}) often indicate serious errors, and unless the program
+has provisions for dealing with these exceptions, enabling traps for
+these three exceptions is probably a good idea.
+
+Many, if not most, floating point operations incur loss of precision
+due to rounding, and hence the @code{ffpe-trap=inexact} is likely to
+be uninteresting in practice.
+
+By default no exception traps are enabled.
 
 @item -fno-backtrace
 @opindex @code{fno-backtrace}
index 035a32a75077507223cf9ba4f177a60cc9ab7bea..b2137bbf80fb072d44960f9885861107af1bbd89 100644 (file)
@@ -42,7 +42,7 @@ along with GCC; see the file COPYING3.  If not see
 #define GFC_FPE_ZERO       (1<<2)
 #define GFC_FPE_OVERFLOW   (1<<3)
 #define GFC_FPE_UNDERFLOW  (1<<4)
-#define GFC_FPE_PRECISION  (1<<5)
+#define GFC_FPE_INEXACT    (1<<5)
 
 
 /* Bitmasks for the various runtime checks that can be enabled.  */
index 920b95f33fe4d1ec69206921826a7b77263ec813..4c59bd59eeb7ccdde0fcfa02c314ab3023810381 100644 (file)
@@ -492,12 +492,14 @@ static void
 gfc_handle_fpe_trap_option (const char *arg)
 {
   int result, pos = 0, n;
+  /* precision is a backwards compatibility alias for inexact.  */
   static const char * const exception[] = { "invalid", "denormal", "zero",
                                            "overflow", "underflow",
-                                           "precision", NULL };
+                                           "inexact", "precision", NULL };
   static const int opt_exception[] = { GFC_FPE_INVALID, GFC_FPE_DENORMAL,
                                       GFC_FPE_ZERO, GFC_FPE_OVERFLOW,
-                                      GFC_FPE_UNDERFLOW, GFC_FPE_PRECISION,
+                                      GFC_FPE_UNDERFLOW, GFC_FPE_INEXACT,
+                                      GFC_FPE_INEXACT,
                                       0 };
  
   while (*arg)
index a17ec2dd8ab0203a076f0152928708a1833ee263..9147014a21af7bc2a2b9f364273a80eb8c8e1955 100644 (file)
@@ -1,3 +1,14 @@
+2011-05-20  Janne Blomqvist  <jb@gcc.gnu.org>
+
+        * config/fpu-387.h (set_fpu): Use renamed inexact macro.
+        * config/fpu-aix.h (set_fpu): Clarify error messages, use renamed
+        inexact macro, set TRP_INEXACT for inexact exception instead of
+        TRP_UNDERFLOW.
+        * config/fpu-generic.h (set_fpu): Clarify error messages, use
+        renamed inexact macro.
+        * config/fpu-glibc.h (set_fpu): Likewise.
+        * config/fpu-sysv.h (set_fpu): Likewise.
+
 2011-05-14  Tobias Burnus  <burnus@net-b.de>
 
        * runtime/stop.c (error_stop_string, error_stop_numeric):
index 2bd9efb55124619dd0a0043644836e7ce03141f2..c3e57cba39bae6d13e76e15c372b1afe2cb72a33 100644 (file)
@@ -110,7 +110,7 @@ void set_fpu (void)
   if (options.fpe & GFC_FPE_ZERO) cw &= ~_FPU_MASK_ZM;
   if (options.fpe & GFC_FPE_OVERFLOW) cw &= ~_FPU_MASK_OM;
   if (options.fpe & GFC_FPE_UNDERFLOW) cw &= ~_FPU_MASK_UM;
-  if (options.fpe & GFC_FPE_PRECISION) cw &= ~_FPU_MASK_PM;
+  if (options.fpe & GFC_FPE_INEXACT) cw &= ~_FPU_MASK_PM;
 
   asm volatile ("fldcw %0" : : "m" (cw));
 
@@ -129,7 +129,7 @@ void set_fpu (void)
       if (options.fpe & GFC_FPE_ZERO) cw_sse &= ~(_FPU_MASK_ZM << 7);
       if (options.fpe & GFC_FPE_OVERFLOW) cw_sse &= ~(_FPU_MASK_OM << 7);
       if (options.fpe & GFC_FPE_UNDERFLOW) cw_sse &= ~(_FPU_MASK_UM << 7);
-      if (options.fpe & GFC_FPE_PRECISION) cw_sse &= ~(_FPU_MASK_PM << 7);
+      if (options.fpe & GFC_FPE_INEXACT) cw_sse &= ~(_FPU_MASK_PM << 7);
 
       asm volatile ("ldmxcsr %0" : : "m" (cw_sse));
     }
index 262557b6d010a2292393873b8abe2a63858b8fbf..1348976c33113139fdb0ed0bb4b0d16e411d8317 100644 (file)
@@ -43,7 +43,7 @@ set_fpu (void)
 #endif
 
   if (options.fpe & GFC_FPE_DENORMAL)
-    estr_write ("Fortran runtime warning: IEEE 'denormal number' "
+    estr_write ("Fortran runtime warning: Floating point 'denormal operand' "
                "exception not supported.\n");
 
   if (options.fpe & GFC_FPE_ZERO)
@@ -70,11 +70,11 @@ set_fpu (void)
                "exception not supported.\n");
 #endif
 
-  if (options.fpe & GFC_FPE_PRECISION)
-#ifdef TRP_UNDERFLOW
-    mode |= TRP_UNDERFLOW;
+  if (options.fpe & GFC_FPE_INEXACT)
+#ifdef TRP_INEXACT
+    mode |= TRP_INEXACT;
 #else
-    estr_write ("Fortran runtime warning: IEEE 'loss of precision' "
+    estr_write ("Fortran runtime warning: IEEE 'inexact' "
                "exception not supported.\n");
 #endif
 
index 72de91b28c750efb6893423c735830b037797f0b..b64f90cc58433c18b2317f6b7b62585e1d12a03e 100644 (file)
@@ -35,7 +35,7 @@ set_fpu (void)
     estr_write ("Fortran runtime warning: IEEE 'invalid operation' "
                "exception not supported.\n");
   if (options.fpe & GFC_FPE_DENORMAL)
-    estr_write ("Fortran runtime warning: IEEE 'denormal number' "
+    estr_write ("Fortran runtime warning: Floating point 'denormal operand' "
                "exception not supported.\n");
   if (options.fpe & GFC_FPE_ZERO)
     estr_write ("Fortran runtime warning: IEEE 'division by zero' "
@@ -46,7 +46,7 @@ set_fpu (void)
   if (options.fpe & GFC_FPE_UNDERFLOW)
     estr_write ("Fortran runtime warning: IEEE 'underflow' "
                "exception not supported.\n");
-  if (options.fpe & GFC_FPE_PRECISION)
-    estr_write ("Fortran runtime warning: IEEE 'loss of precision' "
+  if (options.fpe & GFC_FPE_INEXACT)
+    estr_write ("Fortran runtime warning: IEEE 'inexact' "
                "exception not supported.\n");
 }
index 669b7ad98c132f647f76207297d7cf2894e3a533..7bdb7b76af67ae587bc27e8ec41d061aae1de8cf 100644 (file)
@@ -49,7 +49,7 @@ void set_fpu (void)
 #ifdef FE_DENORMAL
     feenableexcept (FE_DENORMAL);
 #else
-    estr_write ("Fortran runtime warning: IEEE 'denormal number' "
+    estr_write ("Fortran runtime warning: Floating point 'denormal operand' "
                "exception not supported.\n");
 #endif
 
@@ -77,11 +77,11 @@ void set_fpu (void)
                "exception not supported.\n");
 #endif
 
-  if (options.fpe & GFC_FPE_PRECISION)
+  if (options.fpe & GFC_FPE_INEXACT)
 #ifdef FE_INEXACT
     feenableexcept (FE_INEXACT);
 #else
-    estr_write ("Fortran runtime warning: IEEE 'loss of precision' "
+    estr_write ("Fortran runtime warning: IEEE 'inexact' "
                "exception not supported.\n");
 #endif
 }
index 477008968baff1b303ec50fa3a06a53e88ea525b..8838f13016cf5ddaadb802224d6351fa3788231e 100644 (file)
@@ -42,7 +42,7 @@ set_fpu (void)
 #ifdef FP_X_DNML
     cw |= FP_X_DNML;
 #else
-    estr_write ("Fortran runtime warning: IEEE 'denormal number' "
+    estr_write ("Fortran runtime warning: Floating point 'denormal operand' "
                "exception not supported.\n");
 #endif
 
@@ -70,11 +70,11 @@ set_fpu (void)
                "exception not supported.\n");
 #endif
 
-  if (options.fpe & GFC_FPE_PRECISION)
+  if (options.fpe & GFC_FPE_INEXACT)
 #ifdef FP_X_IMP
     cw |= FP_X_IMP;
 #else
-    estr_write ("Fortran runtime warning: IEEE 'loss of precision' "
+    estr_write ("Fortran runtime warning: IEEE 'inexact' "
                "exception not supported.\n");
 #endif