uclibc 0.9.30.1: add c99 long double math fix from gentoo (thx, ralph) fixes compile...
authorFelix Fietkau <nbd@openwrt.org>
Thu, 7 May 2009 13:20:47 +0000 (13:20 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 7 May 2009 13:20:47 +0000 (13:20 +0000)
SVN-Revision: 15670

toolchain/uClibc/patches-0.9.30.1/150-c99_ldbl_math.patch [new file with mode: 0644]

diff --git a/toolchain/uClibc/patches-0.9.30.1/150-c99_ldbl_math.patch b/toolchain/uClibc/patches-0.9.30.1/150-c99_ldbl_math.patch
new file mode 100644 (file)
index 0000000..f371843
--- /dev/null
@@ -0,0 +1,474 @@
+Index: uClibc-0.9.30.1/libm/ldouble_wrappers.c
+===================================================================
+--- uClibc-0.9.30.1/libm/ldouble_wrappers.c    (revision 25552)
++++ uClibc-0.9.30.1/libm/ldouble_wrappers.c    (working copy)
+@@ -13,6 +13,16 @@
+ #include "math.h"
+ #include <complex.h>
++#if defined __NO_LONG_DOUBLE_MATH
++# define int_WRAPPER_C99(func) /* not needed */
++# else
++# define int_WRAPPER_C99(func) \
++int func##l(long double x) \
++{ \
++    return func((double) x); \
++} \
++libm_hidden_def(func##l)
++#endif
+ /* Implement the following, as defined by SuSv3 */
+ #if 0
+@@ -543,46 +553,28 @@ long double truncl (long double x)
+ #endif
+-#ifdef __DO_C99_MATH__
++#if defined __DO_C99_MATH__
+ #ifdef L_fpclassifyl
+-int __fpclassifyl (long double x)
+-{
+-      return __fpclassify ( (double) x );
+-}
+-libm_hidden_def(__fpclassifyl)
++int_WRAPPER_C99(__fpclassify)
+ #endif
+ #ifdef L_finitel
+-int __finitel (long double x)
+-{
+-      return __finite ( (double)x );
+-}
+-libm_hidden_def(__finitel)
++int_WRAPPER_C99(__finite)
+ #endif
+ #ifdef L_signbitl
+-int __signbitl (long double x)
+-{
+-      return __signbitl ( (double)x );
+-}
+-libm_hidden_def(__signbitl)
++int_WRAPPER_C99(__signbit)
+ #endif
+ #ifdef L_isnanl
+-int __isnanl (long double x)
+-{
+-      return __isnan ( (double)x );
+-}
+-libm_hidden_def(__isnanl)
++int_WRAPPER_C99(__isnan)
+ #endif
+ #ifdef L_isinfl
+-int __isinfl (long double x)
+-{
+-      return __isinf ( (double)x );
+-}
+-libm_hidden_def(__isinfl)
++int_WRAPPER_C99(__isinf)
+ #endif
+-#endif
++#endif /* DO_C99_MATH */
++
++#undef int_WRAPPER_C99
+Index: uClibc-0.9.30.1/libm/nan.c
+===================================================================
+--- uClibc-0.9.30.1/libm/nan.c (revision 25552)
++++ uClibc-0.9.30.1/libm/nan.c (working copy)
+@@ -45,7 +45,7 @@ float nanf (const char *tagp)
+ }
+ libm_hidden_def(nanf)
+-#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __NO_LONG_DOUBLE_MATH
+ libm_hidden_proto(nanl)
+ long double nanl (const char *tagp)
+ {
+Index: uClibc-0.9.30.1/include/math.h
+===================================================================
+--- uClibc-0.9.30.1/include/math.h     (revision 25552)
++++ uClibc-0.9.30.1/include/math.h     (working copy)
+@@ -118,7 +118,7 @@ __BEGIN_DECLS
+ # undef       __MATH_PRECNAME
+ # if (__STDC__ - 0 || __GNUC__ - 0) \
+-     && (defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ || defined __LDBL_COMPAT)
++     && (!defined __NO_LONG_DOUBLE_MATH || defined __LDBL_COMPAT)
+ #  ifdef __LDBL_COMPAT
+ #   ifdef __USE_ISOC99
+@@ -230,7 +230,7 @@ enum
+   };
+ /* Return number of classification appropriate for X.  */
+-# ifndef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# ifdef __NO_LONG_DOUBLE_MATH
+ #  define fpclassify(x) \
+      (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
+ # else
+@@ -242,7 +242,7 @@ enum
+ # endif
+ /* Return nonzero value if sign of X is negative.  */
+-# ifndef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# ifdef __NO_LONG_DOUBLE_MATH
+ #  define signbit(x) \
+      (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
+ # else
+@@ -254,7 +254,7 @@ enum
+ # endif
+ /* Return nonzero value if X is not +-Inf or NaN.  */
+-# ifndef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# ifdef __NO_LONG_DOUBLE_MATH
+ #  define isfinite(x) \
+      (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
+ # else
+@@ -270,7 +270,7 @@ enum
+ /* Return nonzero value if X is a NaN.  We could use `fpclassify' but
+    we already have this functions `__isnan' and it is faster.  */
+-# ifndef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# ifdef __NO_LONG_DOUBLE_MATH
+ #  define isnan(x) \
+      (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
+ # else
+@@ -282,7 +282,7 @@ enum
+ # endif
+ /* Return nonzero value is X is positive or negative infinity.  */
+-# ifndef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# ifdef __NO_LONG_DOUBLE_MATH
+ #  define isinf(x) \
+      (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
+ # else
+Index: uClibc-0.9.30.1/include/tgmath.h
+===================================================================
+--- uClibc-0.9.30.1/include/tgmath.h   (revision 25552)
++++ uClibc-0.9.30.1/include/tgmath.h   (working copy)
+@@ -36,7 +36,7 @@
+ #if __GNUC_PREREQ (2, 7)
+-# ifndef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# ifdef __NO_LONG_DOUBLE_MATH
+ #  define __tgml(fct) fct
+ # else
+ #  define __tgml(fct) fct ## l
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/powerpc/bits/wordsize.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/powerpc/bits/wordsize.h (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/powerpc/bits/wordsize.h (working copy)
+@@ -7,13 +7,13 @@
+ # define __WORDSIZE   32
+ #endif
+-#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __LONG_DOUBLE_MATH_OPTIONAL
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL
+ /* Signal the glibc ABI didn't used to have a `long double'.
+    The changes all the `long double' function variants to be redirects
+    to the double functions.  */
+ # define __LONG_DOUBLE_MATH_OPTIONAL   1
+ # ifndef __LONG_DOUBLE_128__
+-#  undef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  define __NO_LONG_DOUBLE_MATH        1
+ # endif
+ #endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/powerpc/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/powerpc/bits/mathdef.h  (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/powerpc/bits/mathdef.h  (working copy)
+@@ -65,11 +65,13 @@ typedef double double_t;
+ #endif        /* ISO C99 */
+-#ifdef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#ifndef __NO_LONG_DOUBLE_MATH
+ #include <bits/wordsize.h>
+ /* Signal that we do not really have a `long double'.  The disables the
+    declaration of all the `long double' function variants.  */
+ # if __WORDSIZE == 32
+-#  undef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  define __NO_LONG_DOUBLE_MATH       1
++# elif !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  define __NO_LONG_DOUBLE_MATH       1
+ # endif  /* __WORDSIZE == 32 */
+-#endif  /* __UCLIBC_HAS_LONG_DOUBLE_MATH__ */
++#endif  /* __NO_LONG_DOUBLE_MATH */
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/arm/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/arm/bits/mathdef.h      (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/arm/bits/mathdef.h      (working copy)
+@@ -34,3 +34,11 @@ typedef double double_t;    /* `double' exp
+ # define FP_ILOGBNAN  (2147483647)
+ #endif        /* ISO C99 */
++
++#ifndef __NO_LONG_DOUBLE_MATH
++/* Signal that we do not really have a `long double'.  This disables the
++   declaration of all the `long double' function variants.  */
++/* XXX The FPA does support this but the patterns in GCC are currently
++   turned off.  */
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/m68k/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/m68k/bits/mathdef.h     (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/m68k/bits/mathdef.h     (working copy)
+@@ -36,3 +36,7 @@ typedef long double double_t;        /* `double
+ # define FP_ILOGBNAN  (2147483647)
+ #endif        /* ISO C99 */
++
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/alpha/bits/wordsize.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/alpha/bits/wordsize.h   (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/alpha/bits/wordsize.h   (working copy)
+@@ -18,13 +18,13 @@
+ #define __WORDSIZE    64
+-#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __LONG_DOUBLE_MATH_OPTIONAL
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL
+ /* Signal that we didn't used to have a `long double'. The changes all
+    the `long double' function variants to be redirects to the double
+    functions.  */
+ # define __LONG_DOUBLE_MATH_OPTIONAL  1
+ # ifndef __LONG_DOUBLE_128__
+-#  undef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  define __NO_LONG_DOUBLE_MATH               1
+ # endif
+ #endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/alpha/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/alpha/bits/mathdef.h    (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/alpha/bits/mathdef.h    (working copy)
+@@ -78,3 +78,7 @@ typedef double double_t;
+ # endif /* GNUC before 3.4 */
+ #endif /* COMPLEX_H */
++
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/common/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/common/bits/mathdef.h   (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/common/bits/mathdef.h   (working copy)
+@@ -35,3 +35,9 @@ typedef double double_t;     /* `double' exp
+ # define FP_ILOGBNAN  2147483647
+ #endif        /* ISO C99 */
++
++#ifndef __NO_LONG_DOUBLE_MATH
++/* Signal that we do not really have a `long double'.  The disables the
++   declaration of all the `long double' function variants.  */
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/i386/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/i386/bits/mathdef.h     (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/i386/bits/mathdef.h     (working copy)
+@@ -44,3 +44,7 @@ typedef long double double_t;        /* `double
+ # define FP_ILOGBNAN  (-2147483647 - 1)
+ #endif        /* ISO C99 */
++
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/nios2/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/nios2/bits/mathdef.h    (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/nios2/bits/mathdef.h    (working copy)
+@@ -34,3 +34,11 @@ typedef double double_t;    /* `double' exp
+ # define FP_ILOGBNAN  (2147483647)
+ #endif        /* ISO C99 */
++
++#ifndef __NO_LONG_DOUBLE_MATH
++/* Signal that we do not really have a `long double'.  This disables the
++   declaration of all the `long double' function variants.  */
++/* XXX The FPA does support this but the patterns in GCC are currently
++   turned off.  */
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/x86_64/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/x86_64/bits/mathdef.h   (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/x86_64/bits/mathdef.h   (working copy)
+@@ -46,3 +46,7 @@ typedef long double double_t;        /* `double
+ # define FP_ILOGBNAN  (-2147483647 - 1)
+ #endif        /* ISO C99 */
++
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/xtensa/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/xtensa/bits/mathdef.h   (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/xtensa/bits/mathdef.h   (working copy)
+@@ -36,8 +36,8 @@ typedef double double_t;     /* `double' exp
+ #endif        /* ISO C99 */
+-#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#ifndef __NO_LONG_DOUBLE_MATH
+ /* Signal that we do not really have a `long double'.  The disables the
+    declaration of all the `long double' function variants.  */
+-# undef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
+ #endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/ia64/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/ia64/bits/mathdef.h     (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/ia64/bits/mathdef.h     (working copy)
+@@ -35,3 +35,7 @@ typedef double double_t;     /* `double' exp
+ # define FP_ILOGBNAN  2147483647
+ #endif        /* ISO C99 */
++
++#if !defined __NO_LONG_DOUBLE_MATH && !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/mips/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/mips/bits/mathdef.h     (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/mips/bits/mathdef.h     (working copy)
+@@ -39,8 +39,10 @@ typedef double double_t;    /* `double' exp
+ #endif        /* ISO C99 */
+-#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && _MIPS_SIM == _ABIO32
++#if ! defined __NO_LONG_DOUBLE_MATH && _MIPS_SIM == _ABIO32
+ /* Signal that we do not really have a `long double'.  This disables the
+    declaration of all the `long double' function variants.  */
+-# error defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ and _MIPS_SIM == _ABIO32
++# define __NO_LONG_DOUBLE_MATH        1
++#elif !defined __NO_LONG_DOUBLE_MATH && !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++# define __NO_LONG_DOUBLE_MATH        1
+ #endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/nios/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/nios/bits/mathdef.h     (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/nios/bits/mathdef.h     (working copy)
+@@ -34,3 +34,11 @@ typedef double double_t;    /* `double' exp
+ # define FP_ILOGBNAN  (2147483647)
+ #endif        /* ISO C99 */
++
++#ifndef __NO_LONG_DOUBLE_MATH
++/* Signal that we do not really have a `long double'.  This disables the
++   declaration of all the `long double' function variants.  */
++/* XXX The FPA does support this but the patterns in GCC are currently
++   turned off.  */
++# define __NO_LONG_DOUBLE_MATH        1
++#endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/wordsize.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/wordsize.h   (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/wordsize.h   (working copy)
+@@ -6,7 +6,7 @@
+ # define __WORDSIZE   32
+ #endif
+-#if 0 /* uClibc: done in mathdefs.h: defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __LONG_DOUBLE_MATH_OPTIONAL*/
++#if 0 /* uClibc: done in mathdefs.h: !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL*/
+ # if __WORDSIZE == 32
+ /* Signal that in 32bit ABI we didn't used to have a `long double'.
+@@ -14,7 +14,7 @@
+    to the double functions.  */
+ #  define __LONG_DOUBLE_MATH_OPTIONAL   1
+ #  ifndef __LONG_DOUBLE_128__
+-#   undef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#   define __NO_LONG_DOUBLE_MATH        1
+ #  endif
+ # endif
+ #endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/mathdef.h    (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/mathdef.h    (working copy)
+@@ -57,13 +57,15 @@ typedef double double_t;
+ #endif        /* ISO C99 */
+-#ifdef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#ifndef __NO_LONG_DOUBLE_MATH
+ # if __WORDSIZE == 32
+ /* Signal that in 32bit ABI we do not really have a `long double'.
+    The disables the declaration of all the `long double' function
+    variants.  */
+-#  undef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  define __NO_LONG_DOUBLE_MATH       1
++# elif !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  define __NO_LONG_DOUBLE_MATH       1
+ # endif
+ #endif
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/mathinline.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/mathinline.h (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/sparc/bits/mathinline.h (working copy)
+@@ -37,7 +37,7 @@
+ # if __WORDSIZE == 32
+-#  ifdef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#  ifndef __NO_LONG_DOUBLE_MATH
+ #   define __unordered_cmp(x, y) \
+   (__extension__                                                            \
+@@ -157,7 +157,7 @@ __NTH (__signbit (double __x))
+   return __u.__i[0] < 0;
+ }
+-#    ifdef __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#    ifndef __NO_LONG_DOUBLE_MATH
+ __MATH_INLINE int
+ __NTH (__signbitl (long double __x))
+ {
+@@ -219,7 +219,7 @@ __NTH (sqrtl (long double __x))
+   _Qp_sqrt (&__r, &__x);
+   return __r;
+ }
+-#   elif defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#   elif !defined __NO_LONG_DOUBLE_MATH
+ __MATH_INLINE long double
+ sqrtl (long double __x) __THROW
+ {
+@@ -257,7 +257,7 @@ __ieee754_sqrtl (long double __x)
+   _Qp_sqrt(&__r, &__x);
+   return __r;
+ }
+-#   elif defined __UCLIBC_HAS_LONG_DOUBLE_MATH__
++#   elif !defined __NO_LONG_DOUBLE_MATH
+ __MATH_INLINE long double
+ __ieee754_sqrtl (long double __x)
+ {
+Index: uClibc-0.9.30.1/libc/sysdeps/linux/sh/bits/mathdef.h
+===================================================================
+--- uClibc-0.9.30.1/libc/sysdeps/linux/sh/bits/mathdef.h       (revision 25552)
++++ uClibc-0.9.30.1/libc/sysdeps/linux/sh/bits/mathdef.h       (working copy)
+@@ -61,3 +61,9 @@ typedef double double_t;
+ # define FP_ILOGBNAN  0x7fffffff
+ #endif        /* ISO C99 */
++
++#ifndef __NO_LONG_DOUBLE_MATH
++/* Signal that we do not really have a `long double'.  The disables the
++   declaration of all the `long double' function variants.  */
++# define __NO_LONG_DOUBLE_MATH        1
++#endif