diff options
-rw-r--r-- | libgfortran/ChangeLog | 10 | ||||
-rw-r--r-- | libgfortran/config.h.in | 3 | ||||
-rwxr-xr-x | libgfortran/configure | 79 | ||||
-rw-r--r-- | libgfortran/configure.ac | 3 | ||||
-rw-r--r-- | libgfortran/intrinsics/c99_functions.c | 6 | ||||
-rw-r--r-- | libgfortran/io/write.c | 2 | ||||
-rw-r--r-- | libgfortran/libgfortran.h | 20 |
7 files changed, 118 insertions, 5 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 8e633fcef31..1228da1357f 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,13 @@ +2004-11-22 Steven Bosscher <stevenb@suse.de> + + PR libfortran/15960 + * configure.ac: Check for finite in libm. + * libgfortran.h: Define isfinite macro if not defined. + * intrinsics/c99_functions.c: Use defined(fpclassify) instead of + HAVE_FPCLASSIFY. + * io/write.c (write_float): Use isfinite instead of finite. + * configure, config.h.in: Rebuilt. + 2004-11-20 Roger Sayle <roger@eyesopen.com> * io/write.c (write_float, list_formatted_write): Fix indentation. diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in index db4da7aaed6..3730a96d67f 100644 --- a/libgfortran/config.h.in +++ b/libgfortran/config.h.in @@ -45,6 +45,9 @@ /* libm includes expf */ #undef HAVE_EXPF +/* libm includes finite */ +#undef HAVE_FINITE + /* libm includes floorf */ #undef HAVE_FLOORF diff --git a/libgfortran/configure b/libgfortran/configure index 0e738dfde89..cfd4f175e10 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -10323,6 +10323,85 @@ _ACEOF fi +# Fallback in case isfinite is not available. +echo "$as_me:$LINENO: checking for finite in -lm" >&5 +echo $ECHO_N "checking for finite in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_finite+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +if test x$gcc_no_link = xyes; then + { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5 +echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;} + { (exit 1); exit 1; }; } +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char finite (); +int +main () +{ +finite (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_m_finite=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_finite=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_m_finite" >&5 +echo "${ECHO_T}$ac_cv_lib_m_finite" >&6 +if test $ac_cv_lib_m_finite = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FINITE 1 +_ACEOF + +fi + + # Let the user override this # Check whether --enable-cmath or --disable-cmath was given. if test "${enable_cmath+set}" = set; then diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac index f91b2604bc8..76d7ae1a722 100644 --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -210,6 +210,9 @@ AC_CHECK_LIB([m],[y1f],[AC_DEFINE([HAVE_Y1F],[1],[libm includes y1f])]) AC_CHECK_LIB([m],[yn],[AC_DEFINE([HAVE_YN],[1],[libm includes yn])]) AC_CHECK_LIB([m],[ynf],[AC_DEFINE([HAVE_YNF],[1],[libm includes ynf])]) +# Fallback in case isfinite is not available. +AC_CHECK_LIB([m],[finite],[AC_DEFINE([HAVE_FINITE],[1],[libm includes finite])]) + # Let the user override this AC_ARG_ENABLE(cmath, AC_HELP_STRING([--enable-cmath],[Include complex math functions]), diff --git a/libgfortran/intrinsics/c99_functions.c b/libgfortran/intrinsics/c99_functions.c index 8198e0093ee..2c11ceb6a89 100644 --- a/libgfortran/intrinsics/c99_functions.c +++ b/libgfortran/intrinsics/c99_functions.c @@ -254,7 +254,7 @@ powf(float x, float y) } #endif -/* Note that if HAVE_FPCLASSIFY is not defined, then NaN is not handled */ +/* Note that if fpclassify is not defined, then NaN is not handled */ /* Algorithm by Steven G. Kargl. */ @@ -266,7 +266,7 @@ double round(double x) { double t; -#ifdef HAVE_FPCLASSIFY +#if defined(fpclassify) int i; i = fpclassify(x); if (i == FP_INFINITE || i == FP_NAN) @@ -298,7 +298,7 @@ float roundf(float x) { float t; -#ifdef HAVE_FPCLASSIFY +#if defined(fpclassify) int i; i = fpclassify(x); diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 28bbd1b9426..fd4665b4542 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -654,7 +654,7 @@ write_float (fnode *f, const char *source, int len) if (f->format != FMT_B && f->format != FMT_O && f->format != FMT_Z) { - res = finite (n); + res = isfinite (n); if (res == 0) { nb = f->u.real.w; diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index e73c00a480c..508a5df019c 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -82,6 +82,24 @@ typedef off_t gfc_offset; #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) #endif +/* The isfinite macro is only available with C99, but some non-C99 + systems still provide fpclassify, and there is a `finite' function + in BSD. When isfinite is not available, try to use one of the + alternatives, or bail out. */ +#if !defined(isfinite) +static inline int +isfinite (double x) +{ +#if defined(fpclassify) + return (fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE); +#elif defined(HAVE_FINITE) + return finite (x); +#else +#error "libgfortran needs isfinite, fpclassify, or finite" +#endif +} +#endif /* !defined(isfinite) */ + /* TODO: find the C99 version of these an move into above ifdef. */ #define REALPART(z) (__real__(z)) #define IMAGPART(z) (__imag__(z)) @@ -441,5 +459,5 @@ typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) array_t; #define size0 prefix(size0) index_type size0 (const array_t * array); -#endif +#endif /* LIBGFOR_H */ |