From: Bruno Haible Date: Sat, 10 Mar 2012 01:48:48 +0000 (+0100) Subject: logl: Work around OSF/1 5.1 bug. X-Git-Tag: v0.1~893 X-Git-Url: http://erislabs.net/gitweb/?p=gnulib.git;a=commitdiff_plain;h=72983fb6b5bd6c7de54465eea29464bb9c0276cf logl: Work around OSF/1 5.1 bug. * lib/math.in.h (logl): Override if REPLACE_LOGL is 1. * lib/logl.c (logl): If logf exists, use it and provide just the workaround. * m4/logl.m4 (gl_FUNC_LOGL_WORKS): New macro. (gl_FUNC_LOGL): Invoke it. Set REPLACE_LOGL. * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_LOGL. * modules/math (Makefile.am): Substitute REPLACE_LOGL. * modules/logl (configure.ac): Consider REPLACE_LOGL. (Depends-on): Update conditions. * doc/posix-functions/logl.texi: Mention the OSF/1 5.1 problem. --- diff --git a/ChangeLog b/ChangeLog index 43402579e..65843d8c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2012-03-09 Bruno Haible + logl: Work around OSF/1 5.1 bug. + * lib/math.in.h (logl): Override if REPLACE_LOGL is 1. + * lib/logl.c (logl): If logf exists, use it and provide just the + workaround. + * m4/logl.m4 (gl_FUNC_LOGL_WORKS): New macro. + (gl_FUNC_LOGL): Invoke it. Set REPLACE_LOGL. + * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_LOGL. + * modules/math (Makefile.am): Substitute REPLACE_LOGL. + * modules/logl (configure.ac): Consider REPLACE_LOGL. + (Depends-on): Update conditions. + * doc/posix-functions/logl.texi: Mention the OSF/1 5.1 problem. + +2012-03-09 Bruno Haible + logf: Work around OSF/1 5.1 bug. * lib/math.in.h (logf): Override if REPLACE_LOGF is 1. * lib/logf.c (logf): If logf exists, use it and provide just the diff --git a/doc/posix-functions/logl.texi b/doc/posix-functions/logl.texi index 93fc86115..33be3e95b 100644 --- a/doc/posix-functions/logl.texi +++ b/doc/posix-functions/logl.texi @@ -20,6 +20,9 @@ MacOS X 10.3. @item This function returns wrong results on some platforms: glibc 2.7 on Linux/SPARC64. +@item +This function returns a wrong value for a minus zero argument on some platforms: +OSF/1 5.1. @end itemize Portability problems not fixed by Gnulib: diff --git a/lib/logl.c b/lib/logl.c index 84e355029..0c00a2b22 100644 --- a/lib/logl.c +++ b/lib/logl.c @@ -26,6 +26,19 @@ logl (long double x) return log (x); } +#elif HAVE_LOGL + +long double +logl (long double x) +# undef logl +{ + /* Work around the OSF/1 5.1 bug. */ + if (x == 0.0L) + /* Return -Infinity. */ + return -1.0L / 0.0L; + return logl (x); +} + #else /* Code based on glibc/sysdeps/ieee754/ldbl-128/e_logl.c. */ diff --git a/lib/math.in.h b/lib/math.in.h index daf7a8229..2e1d32259 100644 --- a/lib/math.in.h +++ b/lib/math.in.h @@ -1166,11 +1166,20 @@ _GL_WARN_ON_USE (log, "log has portability problems - " #endif #if @GNULIB_LOGL@ -# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ -# undef logl +# if @REPLACE_LOGL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef logl +# define logl rpl_logl +# endif +_GL_FUNCDECL_RPL (logl, long double, (long double x)); +_GL_CXXALIAS_RPL (logl, long double, (long double x)); +# else +# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ +# undef logl _GL_FUNCDECL_SYS (logl, long double, (long double x)); -# endif +# endif _GL_CXXALIAS_SYS (logl, long double, (long double x)); +# endif _GL_CXXALIASWARN (logl); #elif defined GNULIB_POSIXCHECK # undef logl diff --git a/m4/logl.m4 b/m4/logl.m4 index 874f58858..f29f3d501 100644 --- a/m4/logl.m4 +++ b/m4/logl.m4 @@ -1,4 +1,4 @@ -# logl.m4 serial 7 +# logl.m4 serial 8 dnl Copyright (C) 2010-2012 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -58,33 +58,77 @@ AC_DEFUN([gl_FUNC_LOGL], dnl Also check whether it's declared. dnl MacOS X 10.3 has logl() in libc but doesn't declare it in . AC_CHECK_DECL([logl], , [HAVE_DECL_LOGL=0], [[#include ]]) + save_LIBS="$LIBS" + LIBS="$LIBS $LOGL_LIBM" + gl_FUNC_LOGL_WORKS + LIBS="$save_LIBS" + case "$gl_cv_func_logl_works" in + *yes) ;; + *) REPLACE_LOGL=1 ;; + esac else - HAVE_DECL_LOGL=0 HAVE_LOGL=0 + HAVE_DECL_LOGL=0 + fi + if test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; then dnl Find libraries needed to link lib/logl.c. if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then AC_REQUIRE([gl_FUNC_LOG]) LOGL_LIBM="$LOG_LIBM" else - AC_REQUIRE([gl_FUNC_FREXPL]) - AC_REQUIRE([gl_FUNC_ISNANL]) - AC_REQUIRE([gl_FUNC_FLOORL]) - dnl Append $FREXPL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates. - case " $LOGL_LIBM " in - *" $FREXPL_LIBM "*) ;; - *) LOGL_LIBM="$LOGL_LIBM $FREXPL_LIBM" ;; - esac - dnl Append $ISNANL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates. - case " $LOGL_LIBM " in - *" $ISNANL_LIBM "*) ;; - *) LOGL_LIBM="$LOGL_LIBM $ISNANL_LIBM" ;; - esac - dnl Append $FLOORL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates. - case " $LOGL_LIBM " in - *" $FLOORL_LIBM "*) ;; - *) LOGL_LIBM="$LOGL_LIBM $FLOORL_LIBM" ;; - esac + if test $HAVE_LOGL = 0; then + AC_REQUIRE([gl_FUNC_FREXPL]) + AC_REQUIRE([gl_FUNC_ISNANL]) + AC_REQUIRE([gl_FUNC_FLOORL]) + dnl Append $FREXPL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates. + case " $LOGL_LIBM " in + *" $FREXPL_LIBM "*) ;; + *) LOGL_LIBM="$LOGL_LIBM $FREXPL_LIBM" ;; + esac + dnl Append $ISNANL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates. + case " $LOGL_LIBM " in + *" $ISNANL_LIBM "*) ;; + *) LOGL_LIBM="$LOGL_LIBM $ISNANL_LIBM" ;; + esac + dnl Append $FLOORL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates. + case " $LOGL_LIBM " in + *" $FLOORL_LIBM "*) ;; + *) LOGL_LIBM="$LOGL_LIBM $FLOORL_LIBM" ;; + esac + fi fi fi AC_SUBST([LOGL_LIBM]) ]) + +dnl Test whether logl() works. +dnl On OSF/1 5.1, logl(-0.0L) is NaN. +AC_DEFUN([gl_FUNC_LOGL_WORKS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether logl works], [gl_cv_func_logl_works], + [ + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include +volatile long double x; +long double y; +int main () +{ + x = -0.0L; + y = logl (x); + if (!(y + y == y)) + return 1; + return 0; +} +]])], + [gl_cv_func_logl_works=yes], + [gl_cv_func_logl_works=no], + [case "$host_os" in + osf*) gl_cv_func_logl_works="guessing no";; + *) gl_cv_func_logl_works="guessing yes";; + esac + ]) + ]) +]) diff --git a/m4/math_h.m4 b/m4/math_h.m4 index 8d9d9075c..7b93ad970 100644 --- a/m4/math_h.m4 +++ b/m4/math_h.m4 @@ -1,4 +1,4 @@ -# math_h.m4 serial 94 +# math_h.m4 serial 95 dnl Copyright (C) 2007-2012 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -262,6 +262,7 @@ AC_DEFUN([gl_MATH_H_DEFAULTS], REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL]) REPLACE_LOG=0; AC_SUBST([REPLACE_LOG]) REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF]) + REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL]) REPLACE_MODF=0; AC_SUBST([REPLACE_MODF]) REPLACE_MODFF=0; AC_SUBST([REPLACE_MODFF]) REPLACE_MODFL=0; AC_SUBST([REPLACE_MODFL]) diff --git a/modules/logl b/modules/logl index 1f0a95688..450b039ed 100644 --- a/modules/logl +++ b/modules/logl @@ -8,14 +8,14 @@ m4/logl.m4 Depends-on: math extensions -log [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1] -frexpl [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0] -isnanl [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0] -floorl [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0] +log [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1] +frexpl [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0] +isnanl [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0] +floorl [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0] configure.ac: gl_FUNC_LOGL -if test $HAVE_LOGL = 0; then +if test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; then AC_LIBOBJ([logl]) fi gl_MATH_MODULE_INDICATOR([logl]) diff --git a/modules/math b/modules/math index 9419a875a..705e0b07e 100644 --- a/modules/math +++ b/modules/math @@ -231,6 +231,7 @@ math.h: math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $( -e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \ -e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \ -e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \ + -e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \ -e 's|@''REPLACE_MODF''@|$(REPLACE_MODF)|g' \ -e 's|@''REPLACE_MODFF''@|$(REPLACE_MODFF)|g' \ -e 's|@''REPLACE_MODFL''@|$(REPLACE_MODFL)|g' \