Define HAVE_ for math long double functions declared in vxworks headers
Jonathan Wakely
jwakely@redhat.com
Fri Jan 3 15:27:00 GMT 2020
On 25/12/19 03:40 -0300, Alexandre Oliva wrote:
>
>When cross-building for vxworks, test for declarations of long double
>functions in math.h. We don't normally test for these functions when
>cross compiling, because link tests don't work, or ever really, but
>not defining them as available causes replacements to be defined in
>ways that may cause duplicate definition linker errors if the units
>defining both the replacement and the actual implementation are
>brought in because of other symbols.
>
>Tested on trunk by checking configure results of libstdc++-v3 for an
>affected target, and also building natively on x86_64-linux-gnu. Also
>tested for various cross configurations far more thoroughly on trees not
>matching trunk so closely. I'm checking this in.
>
>
>libstdc++-v3/
> * crossconfig.m4 (GLIBCXX_CROSSCONFIG) [*-vxworks*]: Define
> long double functions as available if declared by math.h.
> (GLIBCXX_CHECK_MATH_DECL, GLIBCXX_CHECK_MATH_DECLS): New.
> * configure: Rebuild.
>---
> libstdc++-v3/configure | 1104 +++++++++++++++++++++++++++++++++++++++++++
> libstdc++-v3/crossconfig.m4 | 62 ++
> 2 files changed, 1166 insertions(+)
>
>diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
>[omitted]
>diff --git a/libstdc++-v3/crossconfig.m4 b/libstdc++-v3/crossconfig.m4
>index 5e24889..2a0cb04 100644
>--- a/libstdc++-v3/crossconfig.m4
>+++ b/libstdc++-v3/crossconfig.m4
>@@ -291,9 +291,71 @@ case "${host}" in
> AC_DEFINE(HAVE_SQRTF)
> AC_DEFINE(HAVE_TANF)
> AC_DEFINE(HAVE_TANHF)
>+
>+dnl # Different versions and execution modes implement different
>+dnl # subsets of these functions. Instead of hard-coding, test for C
>+dnl # declarations in headers. The C primitives could be defined as
>+dnl # macros, in which case the tests might fail, and we might have to
>+dnl # switch to more elaborate tests.
>+ GLIBCXX_CHECK_MATH_DECLS([
>+ acosl asinl atan2l atanl ceill cosl coshl expl fabsl floorl fmodl
>+ frexpl ldexpl log10l logl modfl powl sinl sinhl sqrtl tanl tanhl])
>+dnl # sincosl is the only one missing here, compared with the *l
>+dnl # functions in the list guarded by
>+dnl # long_double_math_on_this_cpu in configure.ac, right after
>+dnl # the expansion of the present macro.
> ;;
> *)
> AC_MSG_ERROR([No support for this host/target combination.])
> ;;
> esac
> ])
>+
>+
>+dnl
>+dnl Check to see if the (math function) argument passed is
>+dnl declared when using the c compiler
>+dnl
>+dnl Define HAVE_CARGF etc if "cargf" is declared
>+dnl
>+dnl argument 1 is name of function to check
>+dnl
>+dnl ASSUMES argument is a math function
>+dnl
>+dnl GLIBCXX_CHECK_MATH_DECL
>+AC_DEFUN([GLIBCXX_CHECK_MATH_DECL], [
>+ AC_CACHE_CHECK([for $1 declaration],
>+ [glibcxx_cv_func_$1_use], [
>+ AC_LANG_SAVE
>+ AC_LANG_C
>+ AC_TRY_COMPILE([
>+#include <math.h>
>+#ifdef HAVE_IEEEFP_H
>+# include <ieeefp.h>
>+#endif
>+], [
>+ void (*f)(void) = (void (*)(void))$1;
I wondered whether using ($1) here instead of just $1 would give any
benefit. It would mean that function-like macros are ignored.
Maybe it would be better to just do #undef $1 before the test, so that
all macros are ignored. That would match the actual usage, as <cmath>
does a #undef for each function.
More information about the Libstdc++
mailing list