Browse Source

test/math/compile_test.c: "are long double functions even compile/link?" test
*: fix everything which prevents above from building

Denis Vlasenko 16 years ago
parent
commit
d0fdc959d9

+ 32 - 24
include/math.h

@@ -52,38 +52,46 @@ __BEGIN_DECLS
    so we can easily declare each function as both `name' and `__name',
    so we can easily declare each function as both `name' and `__name',
    and can declare the float versions `namef' and `__namef'.  */
    and can declare the float versions `namef' and `__namef'.  */
 
 
-#define __MATHCALL(function,suffix, args)	\
+#define __MATHDECL_1(type,function,suffix,args) \
-  __MATHDECL (_Mdouble_,function,suffix, args)
-#define __MATHDECL(type, function,suffix, args) \
-  __MATHDECL_1(type, function,suffix, args);
-
-#define __MATHCALLX(function,suffix, args, attrib)	\
-  __MATHDECLX (_Mdouble_,function,suffix, args, attrib)
-#define __MATHDECL_1(type, function,suffix, args) \
   extern type __MATH_PRECNAME(function,suffix) args __THROW
   extern type __MATH_PRECNAME(function,suffix) args __THROW
-#define __MATHDECLX(type, function,suffix, args, attrib) \
+
-  __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
+#define __MATHDECL(type,function,suffix,args) \
+  __MATHDECL_1(type,function,suffix,args);
+
+#define __MATHCALL(function,suffix,args)	\
+  __MATHDECL(_Mdouble_,function,suffix,args)
+
+#define __MATHDECLX(type,function,suffix,args,attrib) \
+  __MATHDECL_1(type,function,suffix,args) __attribute__ (attrib); \
   __MATHDECLI_MAINVARIANT(function)
   __MATHDECLI_MAINVARIANT(function)
 
 
+#define __MATHCALLX(function,suffix,args,attrib)	\
+  __MATHDECLX(_Mdouble_,function,suffix,args,attrib)
+
 /* Decls which are also used internally in libm.
 /* Decls which are also used internally in libm.
    Only the main variant is used internally, no need to try to avoid relocs
    Only the main variant is used internally, no need to try to avoid relocs
    for the {l,f} variants.  */
    for the {l,f} variants.  */
-#define __MATHCALLI(function,suffix, args)	\
+#define __MATHDECLI(type,function,suffix,args) \
-  __MATHDECLI (_Mdouble_,function,suffix, args)
+  __MATHDECL_1(type,function,suffix,args); \
-#define __MATHDECLI(type, function,suffix, args) \
-  __MATHDECL_1(type, function,suffix, args); \
   __MATHDECLI_MAINVARIANT(function)
   __MATHDECLI_MAINVARIANT(function)
+
+#define __MATHCALLI(function,suffix,args)	\
+  __MATHDECLI(_Mdouble_,function,suffix,args)
+
 /* Private helpers for purely macro impls below.
 /* Private helpers for purely macro impls below.
    Only make __foo{,f,l} visible but not (the macro-only) foo.  */
    Only make __foo{,f,l} visible but not (the macro-only) foo.  */
 #if defined _LIBC
 #if defined _LIBC
-# define __MATHDECL_PRIV(type, function,suffix, args, attrib) \
+# define __MATHDECL_PRIV(type,function,suffix,args,attrib) \
-  __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib); \
+  __MATHDECL_1(type,__CONCAT(__,function),suffix,args) __attribute__ (attrib); \
   libm_hidden_proto(__MATH_PRECNAME(__##function,suffix))
   libm_hidden_proto(__MATH_PRECNAME(__##function,suffix))
 #else
 #else
-# define __MATHDECL_PRIV(type, function,suffix, args, attrib) \
+# define __MATHDECL_PRIV(type,function,suffix,args,attrib) \
-  __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib);
+  __MATHDECL_1(type,__CONCAT(__,function),suffix,args) __attribute__ (attrib);
 #endif
 #endif
 
 
+
+/* Include the file of declarations, declaring souble versions */
+
 #if defined _LIBC
 #if defined _LIBC
 # define __MATHDECLI_MAINVARIANT(x) libm_hidden_proto(x)
 # define __MATHDECLI_MAINVARIANT(x) libm_hidden_proto(x)
 #else
 #else
@@ -124,7 +132,8 @@ __BEGIN_DECLS
 # undef _Mdouble_END_NAMESPACE
 # undef _Mdouble_END_NAMESPACE
 # undef	__MATH_PRECNAME
 # undef	__MATH_PRECNAME
 
 
-# if (__STDC__ - 0 || __GNUC__ - 0) \
+
+# if (defined __STDC__ || defined __GNUC__) \
      && (defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ || defined __LDBL_COMPAT)
      && (defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ || defined __LDBL_COMPAT)
 #  ifdef __LDBL_COMPAT
 #  ifdef __LDBL_COMPAT
 
 
@@ -147,11 +156,10 @@ extern long double __REDIRECT_NTH (nexttowardl,
    instead of `double' and appending l to each function name.  */
    instead of `double' and appending l to each function name.  */
 
 
 #   undef __MATHDECL_1
 #   undef __MATHDECL_1
-#   define __MATHDECL_2(type, function,suffix, args, alias) \
+#   define __MATHDECL_2(type,function,suffix,args,alias) \
-  extern type __REDIRECT_NTH(__MATH_PRECNAME(function,suffix), \
+  extern type __REDIRECT_NTH(__MATH_PRECNAME(function,suffix),args,alias)
-			     args, alias)
+#   define __MATHDECL_1(type,function,suffix,args) \
-#   define __MATHDECL_1(type, function,suffix, args) \
+  __MATHDECL_2(type,function,suffix,args,__CONCAT(function,suffix))
-  __MATHDECL_2(type, function,suffix, args, __CONCAT(function,suffix))
 #  endif
 #  endif
 
 
 #  ifndef _Mlong_double_
 #  ifndef _Mlong_double_

+ 7 - 0
libc/sysdeps/linux/common/bits/mathcalls.h

@@ -48,6 +48,13 @@
 #endif
 #endif
 
 
 
 
+/* __MATHCALLX includes libm_hidden_def
+ * __MATHCALLI includes libm_hidden_def too
+ * __MATHCALL  does not
+ * __MATHDECL_PRIV includes libm_hidden_def and declared only __foo, not foo
+ */
+
+
 /* Trigonometric functions.  */
 /* Trigonometric functions.  */
 
 
 _Mdouble_BEGIN_NAMESPACE
 _Mdouble_BEGIN_NAMESPACE

+ 2 - 2
libm/Makefile.in

@@ -85,10 +85,10 @@ LD_MOBJ := acoshl.o acosl.o asinhl.o asinl.o atan2l.o atanhl.o atanl.o cargl.o c
 	ceill.o copysignl.o coshl.o cosl.o erfcl.o erfl.o exp2l.o expl.o \
 	ceill.o copysignl.o coshl.o cosl.o erfcl.o erfl.o exp2l.o expl.o \
 	expm1l.o fabsl.o finitel.o fdiml.o floorl.o fmal.o fmaxl.o fminl.o fmodl.o fpclassifyl.o \
 	expm1l.o fabsl.o finitel.o fdiml.o floorl.o fmal.o fmaxl.o fminl.o fmodl.o fpclassifyl.o \
 	frexpl.o gammal.o hypotl.o ilogbl.o isinfl.o isnanl.o ldexpl.o lgammal.o llrintl.o \
 	frexpl.o gammal.o hypotl.o ilogbl.o isinfl.o isnanl.o ldexpl.o lgammal.o llrintl.o \
-	llroundl.o log10l.o log1pl.o XXXlog2l.o logbl.o logl.o lrintl.o lroundl.o \
+	llroundl.o log10l.o log1pl.o log2l.o logbl.o logl.o lrintl.o lroundl.o \
 	modfl.o nearbyintl.o nextafterl.o XXXnexttowardl.o powl.o remainderl.o \
 	modfl.o nearbyintl.o nextafterl.o XXXnexttowardl.o powl.o remainderl.o \
 	remquol.o rintl.o roundl.o scalblnl.o scalbnl.o __signbitl.o sinhl.o sinl.o sqrtl.o \
 	remquol.o rintl.o roundl.o scalblnl.o scalbnl.o __signbitl.o sinhl.o sinl.o sqrtl.o \
-	tanhl.o tanl.o tgammal.o truncl.o
+	tanhl.o tanl.o tgammal.o truncl.o significandl.o
 else
 else
 # This list of math functions was taken from POSIX/IEEE 1003.1b-1993
 # This list of math functions was taken from POSIX/IEEE 1003.1b-1993
 libm_CSRC := \
 libm_CSRC := \

+ 29 - 2
libm/ldouble_wrappers.c

@@ -309,6 +309,15 @@ long double frexpl (long double x, int *exp)
 }
 }
 #endif
 #endif
 
 
+#ifdef L_gammal
+/* WRAPPER1(gamma) won't work, tries to call __GI_xxx,
+ * and gamma() hasn't got one. */
+long double gammal(long double x)
+{
+	return (long double) gamma((double) x);
+}
+#endif
+
 #ifdef L_hypotl
 #ifdef L_hypotl
 long double hypotl (long double x, long double y)
 long double hypotl (long double x, long double y)
 {
 {
@@ -348,7 +357,11 @@ WRAPPER1(log1p)
 #endif
 #endif
 
 
 #ifdef L_log2l
 #ifdef L_log2l
-WRAPPER1(log2)
+/* WRAPPER1(log2) won't work */
+long double log2l(long double x)
+{
+	return (long double) log2((double)x);
+}
 #endif
 #endif
 
 
 #ifdef L_logbl
 #ifdef L_logbl
@@ -438,6 +451,8 @@ long double scalbnl (long double x, int exp)
 }
 }
 #endif
 #endif
 
 
+/* scalb is an obsolete function */
+
 #ifdef L_sinhl
 #ifdef L_sinhl
 WRAPPER1(sinh)
 WRAPPER1(sinh)
 #endif
 #endif
@@ -466,18 +481,30 @@ WRAPPER1(tgamma)
 WRAPPER1(trunc)
 WRAPPER1(trunc)
 #endif
 #endif
 
 
+#ifdef L_significandl
+/* WRAPPER1(significand) won't work, tries to call __GI_xxx,
+ * and significand() hasn't got one. */
+long double significandl(long double x)
+{
+	return (long double) significand((double) x);
+}
+#endif
+
 #ifdef __DO_C99_MATH__
 #ifdef __DO_C99_MATH__
 
 
 #ifdef L_fpclassifyl
 #ifdef L_fpclassifyl
-int_WRAPPER1(__fpclassify);
+int_WRAPPER1(__fpclassify)
+libm_hidden_def(__fpclassifyl)
 #endif
 #endif
 
 
 #ifdef L_finitel
 #ifdef L_finitel
 int_WRAPPER1(__finite)
 int_WRAPPER1(__finite)
+libm_hidden_def(__finitel)
 #endif
 #endif
 
 
 #ifdef L___signbitl
 #ifdef L___signbitl
 int_WRAPPER1(__signbit)
 int_WRAPPER1(__signbit)
+libm_hidden_def(__signbitl)
 #endif
 #endif
 
 
 #ifdef L_isnanl
 #ifdef L_isnanl

+ 3 - 1
test/math/Makefile

@@ -1,9 +1,11 @@
 # uClibc math tests
 # uClibc math tests
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 
 
+include ../../.config
+
 TESTS := basic-test rint tst-definitions test-fpucw test-float test-ifloat test-double test-idouble
 TESTS := basic-test rint tst-definitions test-fpucw test-float test-ifloat test-double test-idouble
 ifeq ($(strip $(UCLIBC_HAS_LONG_DOUBLE_MATH)),y)
 ifeq ($(strip $(UCLIBC_HAS_LONG_DOUBLE_MATH)),y)
-TESTS += test-ldouble test-ildouble
+TESTS += test-ldouble test-ildoubl compile_test
 else
 else
 CFLAGS_basic-test := -DNO_LONG_DOUBLE
 CFLAGS_basic-test := -DNO_LONG_DOUBLE
 endif
 endif

+ 71 - 0
test/math/compile_test.c

@@ -0,0 +1,71 @@
+#include <math.h>
+
+void testl(long double long_double_x, int int_x, long long_x)
+{
+__finitel(long_double_x);
+__fpclassifyl(long_double_x);
+__isinfl(long_double_x);
+__isnanl(long_double_x);
+__signbitl(long_double_x);
+acoshl(long_double_x);
+acosl(long_double_x);
+asinhl(long_double_x);
+asinl(long_double_x);
+atan2l(long_double_x, long_double_x);
+atanhl(long_double_x);
+atanl(long_double_x);
+cbrtl(long_double_x);
+ceill(long_double_x);
+copysignl(long_double_x, long_double_x);
+coshl(long_double_x);
+cosl(long_double_x);
+erfcl(long_double_x);
+erfl(long_double_x);
+exp2l(long_double_x);
+expl(long_double_x);
+expm1l(long_double_x);
+fabsl(long_double_x);
+fdiml(long_double_x, long_double_x);
+floorl(long_double_x);
+fmal(long_double_x, long_double_x, long_double_x);
+fmaxl(long_double_x, long_double_x);
+fminl(long_double_x, long_double_x);
+fmodl(long_double_x, long_double_x);
+frexpl(long_double_x, &int_x);
+hypotl(long_double_x, long_double_x);
+ilogbl(long_double_x);
+ldexpl(long_double_x, int_x);
+lgammal(long_double_x);
+llrintl(long_double_x);
+llroundl(long_double_x);
+log10l(long_double_x);
+log1pl(long_double_x);
+log2l(long_double_x);
+logbl(long_double_x);
+logl(long_double_x);
+lrintl(long_double_x);
+lroundl(long_double_x);
+modfl(long_double_x, &long_double_x);
+nearbyintl(long_double_x);
+nextafterl(long_double_x, long_double_x);
+nexttowardl(long_double_x, long_double_x);
+powl(long_double_x, long_double_x);
+remainderl(long_double_x, long_double_x);
+remquol(long_double_x, long_double_x, &int_x);
+rintl(long_double_x);
+roundl(long_double_x);
+scalblnl(long_double_x, long_x);
+scalbnl(long_double_x, int_x);
+sinhl(long_double_x);
+sinl(long_double_x);
+sqrtl(long_double_x);
+tanhl(long_double_x);
+tanl(long_double_x);
+tgammal(long_double_x);
+truncl(long_double_x);
+}
+
+int main(int argc, char **argv)
+{
+	return (long) &testl;
+}

+ 2 - 2
test/math/libm-test.inc

@@ -4231,8 +4231,8 @@ round_test (void)
 static void
 static void
 scalb_test (void)
 scalb_test (void)
 {
 {
-
   START (scalb);
   START (scalb);
+#ifndef TEST_LDOUBLE /* uclibc doesn't have scalbl */
 
 
   TEST_ff_f (scalb, 2.0, 0.5, nan_value, INVALID_EXCEPTION);
   TEST_ff_f (scalb, 2.0, 0.5, nan_value, INVALID_EXCEPTION);
   TEST_ff_f (scalb, 3.0, -2.5, nan_value, INVALID_EXCEPTION);
   TEST_ff_f (scalb, 3.0, -2.5, nan_value, INVALID_EXCEPTION);
@@ -4283,7 +4283,7 @@ scalb_test (void)
 
 
   TEST_ff_f (scalb, 0.8L, 4, 12.8L);
   TEST_ff_f (scalb, 0.8L, 4, 12.8L);
   TEST_ff_f (scalb, -0.854375L, 5, -27.34L);
   TEST_ff_f (scalb, -0.854375L, 5, -27.34L);
-
+#endif
   END (scalb);
   END (scalb);
 }
 }