From 57b4d355a187943b042ca3e9a86bccf74c0e0d84 Mon Sep 17 00:00:00 2001 From: Janne Blomqvist Date: Fri, 20 May 2011 15:55:45 +0300 Subject: [PATCH] Clarify FP exception documentation and messages From-SVN: r173944 --- gcc/fortran/ChangeLog | 10 +++++++- gcc/fortran/gfortran.texi | 11 ++++----- gcc/fortran/invoke.texi | 40 ++++++++++++++++++++------------ gcc/fortran/libgfortran.h | 2 +- gcc/fortran/options.c | 6 +++-- libgfortran/ChangeLog | 11 +++++++++ libgfortran/config/fpu-387.h | 4 ++-- libgfortran/config/fpu-aix.h | 10 ++++---- libgfortran/config/fpu-generic.h | 6 ++--- libgfortran/config/fpu-glibc.h | 6 ++--- libgfortran/config/fpu-sysv.h | 6 ++--- 11 files changed, 71 insertions(+), 41 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a6fffdfd4d0..5677c4c48fa 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,12 @@ -2011-06-19 Tobias Burnus +2011-05-20 Janne Blomqvist + + * 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 PR fortran/18918 * trans-types.c (gfc_get_element_type): Handle scalar coarrays. diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index 995d9d8eab8..4db506c5391 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -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}: diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index ab45072efad..41fee670a6c 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -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} diff --git a/gcc/fortran/libgfortran.h b/gcc/fortran/libgfortran.h index 035a32a7507..b2137bbf80f 100644 --- a/gcc/fortran/libgfortran.h +++ b/gcc/fortran/libgfortran.h @@ -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. */ diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c index 920b95f33fe..4c59bd59eeb 100644 --- a/gcc/fortran/options.c +++ b/gcc/fortran/options.c @@ -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) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index a17ec2dd8ab..9147014a21a 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,14 @@ +2011-05-20 Janne Blomqvist + + * 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 * runtime/stop.c (error_stop_string, error_stop_numeric): diff --git a/libgfortran/config/fpu-387.h b/libgfortran/config/fpu-387.h index 2bd9efb5512..c3e57cba39b 100644 --- a/libgfortran/config/fpu-387.h +++ b/libgfortran/config/fpu-387.h @@ -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)); } diff --git a/libgfortran/config/fpu-aix.h b/libgfortran/config/fpu-aix.h index 262557b6d01..1348976c331 100644 --- a/libgfortran/config/fpu-aix.h +++ b/libgfortran/config/fpu-aix.h @@ -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 diff --git a/libgfortran/config/fpu-generic.h b/libgfortran/config/fpu-generic.h index 72de91b28c7..b64f90cc584 100644 --- a/libgfortran/config/fpu-generic.h +++ b/libgfortran/config/fpu-generic.h @@ -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"); } diff --git a/libgfortran/config/fpu-glibc.h b/libgfortran/config/fpu-glibc.h index 669b7ad98c1..7bdb7b76af6 100644 --- a/libgfortran/config/fpu-glibc.h +++ b/libgfortran/config/fpu-glibc.h @@ -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 } diff --git a/libgfortran/config/fpu-sysv.h b/libgfortran/config/fpu-sysv.h index 477008968ba..8838f13016c 100644 --- a/libgfortran/config/fpu-sysv.h +++ b/libgfortran/config/fpu-sysv.h @@ -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 -- 2.30.2