This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: Something like this for PR15960? (was: Re: finite() question)
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- To: stevenb at suse dot de (Steven Bosscher)
- Cc: sje at cup dot hp dot com, danglin at gcc dot gnu dot org, paul at codesourcery dot com, toon at moene dot indiv dot nluug dot nl, roger at eyesopen dot com, gcc-patches at gcc dot gnu dot org, fortran at gcc dot gnu dot org
- Date: Mon, 22 Nov 2004 21:07:08 -0500 (EST)
- Subject: Re: Something like this for PR15960? (was: Re: finite() question)
> On Nov 22, 2004 03:24 PM, John David Anglin <dave@hiauly1.hia.nrc.ca> wrote:
>
> > > Can you commit it along with the updated config.h.in and configure.in?
> >
> > Ok, I'll try to do this tonight if you don't beat me.
>
> I won't, I don't have any gcc CVS trees around until at least
> next Friday :-/
Committed. For the record, this was tested on hppa2.0w-hp-hpux11.11
and hppa64-hp-hpux11.11.
Dave
--
J. David Anglin dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6602)
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.
Index: config.h.in
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/config.h.in,v
retrieving revision 1.12
diff -u -3 -p -r1.12 config.h.in
--- config.h.in 20 Nov 2004 13:15:14 -0000 1.12
+++ config.h.in 23 Nov 2004 01:31:24 -0000
@@ -45,6 +45,9 @@
/* libm includes expf */
#undef HAVE_EXPF
+/* libm includes finite */
+#undef HAVE_FINITE
+
/* libm includes floorf */
#undef HAVE_FLOORF
Index: configure
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/configure,v
retrieving revision 1.20
diff -u -3 -p -r1.20 configure
--- configure 20 Nov 2004 13:15:14 -0000 1.20
+++ configure 23 Nov 2004 01:31:25 -0000
@@ -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
Index: configure.ac
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/configure.ac,v
retrieving revision 1.15
diff -u -3 -p -r1.15 configure.ac
--- configure.ac 20 Nov 2004 13:15:15 -0000 1.15
+++ configure.ac 23 Nov 2004 01:31:26 -0000
@@ -210,6 +210,9 @@ AC_CHECK_LIB([m],[y1f],[AC_DEFINE([HAVE_
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]),
Index: libgfortran.h
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/libgfortran.h,v
retrieving revision 1.14
diff -u -3 -p -r1.14 libgfortran.h
--- libgfortran.h 20 Nov 2004 13:15:15 -0000 1.14
+++ libgfortran.h 23 Nov 2004 01:31:26 -0000
@@ -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_DI
#define size0 prefix(size0)
index_type size0 (const array_t * array);
-#endif
+#endif /* LIBGFOR_H */
Index: intrinsics/c99_functions.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/intrinsics/c99_functions.c,v
retrieving revision 1.5
diff -u -3 -p -r1.5 c99_functions.c
--- intrinsics/c99_functions.c 26 Sep 2004 14:52:04 -0000 1.5
+++ intrinsics/c99_functions.c 23 Nov 2004 01:31:26 -0000
@@ -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);
Index: io/write.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/write.c,v
retrieving revision 1.18
diff -u -3 -p -r1.18 write.c
--- io/write.c 21 Nov 2004 05:08:14 -0000 1.18
+++ io/write.c 23 Nov 2004 01:31:26 -0000
@@ -654,7 +654,7 @@ write_float (fnode *f, const char *sourc
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;