libstdc++-v3: do not duplicate some math functions when using newlib
When running the libstdc++ testsuite on AArch64 RTEMS, we noticed that about 25 tests are failing during the link, due to the "sqrtl" function being defined twice: - once inside RTEMS' libm; - once inside our libstdc++. One test that fails, for instance, would be 26_numerics/complex/13450.cc. In comparing libm and libstdc++, we found that libstc++ also duplicates "hypotf", and "hypotl". For "sqrtl" and "hypotl", the symbosl come a unit called from math_stubs_long_double.cc, while "hypotf" comes from the equivalent unit for the float version, called math_stubs_float.cc. Those units are always compiled in libstdc++ and provide our own version of various math routines when those are missing from the target system. The definition of those symbols is predicated on the existance of various macros provided by c++config.h, which themselves are predicated by the corresponding HAVE_xxx macros in config.h. One key element behind what's happening, here, is that the target uses newlib, and therefore GCC was configured --with-newlib. The section of libstdc++v3's configure script that handles which math functions are available has a newlib-specific section, and that section provides a hardcoded list of symbols. For "hypotf", this commit fixes the issue by doing the same as for the other routines already declared in that section. I verified by inspection in the newlib code that this function should always be present, so hardcoding it in our configure script should not be an issue. For the math routines handling doubles ("sqrtl" and "hypotl"), however, I do not believe we can assume that newlib's libm will always provide them. Therefore, this commit fixes that part of the issue by ading a compile-check for "sqrtl" and "hypotl". And while at it, we also include checks for all the other math functions that math_stubs_long_double.cc re-implements, allowing us to be resilient to future newlib enhancements adding support for more functions. libstdc++-v3/ChangeLog: * configure.ac ["x${with_newlib}" = "xyes"]: Define HAVE_HYPOTF. Add compile-checks for various long double math functions as well. * configure: Regenerate.
This commit is contained in:
parent
57446d1bc9
commit
c6c428196d
2 changed files with 1188 additions and 0 deletions
1179
libstdc++-v3/configure
vendored
1179
libstdc++-v3/configure
vendored
File diff suppressed because it is too large
Load diff
|
@ -349,6 +349,7 @@ else
|
|||
AC_DEFINE(HAVE_FLOORF)
|
||||
AC_DEFINE(HAVE_FMODF)
|
||||
AC_DEFINE(HAVE_FREXPF)
|
||||
AC_DEFINE(HAVE_HYPOTF)
|
||||
AC_DEFINE(HAVE_LDEXPF)
|
||||
AC_DEFINE(HAVE_LOG10F)
|
||||
AC_DEFINE(HAVE_LOGF)
|
||||
|
@ -360,6 +361,14 @@ else
|
|||
AC_DEFINE(HAVE_TANF)
|
||||
AC_DEFINE(HAVE_TANHF)
|
||||
|
||||
dnl # Support for the long version of some math libraries depends on
|
||||
dnl # architecture and newlib version. So test for their availability
|
||||
dnl # rather than hardcoding that information.
|
||||
GLIBCXX_CHECK_MATH_DECLS([
|
||||
acosl asinl atan2l atanl ceill coshl cosl expl fabsl floorl fmodl
|
||||
frexpl hypotl ldexpl log10l logl modfl powl sinhl sinl sqrtl
|
||||
tanhl tanl])
|
||||
|
||||
AC_DEFINE(HAVE_ICONV)
|
||||
AC_DEFINE(HAVE_MEMALIGN)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue