2022-02-22 19:11:19 +00:00
|
|
|
From cc1e28878a228b6c4a0872e56d97ac88971b7725 Mon Sep 17 00:00:00 2001
|
|
|
|
From: =?UTF-8?q?Hugo=20Beauz=C3=A9e-Luyssen?= <hugo@beauzee.fr>
|
|
|
|
Date: Tue, 14 Sep 2021 16:41:37 +0100
|
|
|
|
Subject: [PATCH] libstdc++: Check for TLS support on mingw cross-compilers
|
|
|
|
|
|
|
|
Native mingw builds enable TLS, but crosses don't because we don't use
|
|
|
|
GCC_CHECK_TLS in the cross-compiler config.
|
|
|
|
|
|
|
|
libstdc++-v3/ChangeLog:
|
|
|
|
|
|
|
|
* crossconfig.m4: Check for TLS support on mingw.
|
|
|
|
* configure: Regenerate.
|
|
|
|
---
|
2022-04-21 22:03:38 +00:00
|
|
|
libstdc++-v3/configure | 208 ++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
libstdc++-v3/crossconfig.m4 | 1
|
2022-02-22 19:11:19 +00:00
|
|
|
2 files changed, 209 insertions(+)
|
|
|
|
|
|
|
|
--- a/libstdc++-v3/configure
|
|
|
|
+++ b/libstdc++-v3/configure
|
2023-05-09 08:14:51 +00:00
|
|
|
@@ -60390,6 +60390,214 @@
|
2022-02-22 19:11:19 +00:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ # Check whether --enable-tls was given.
|
|
|
|
+if test "${enable_tls+set}" = set; then :
|
|
|
|
+ enableval=$enable_tls;
|
|
|
|
+ case "$enableval" in
|
|
|
|
+ yes|no) ;;
|
|
|
|
+ *) as_fn_error $? "Argument to enable/disable tls must be yes or no" "$LINENO" 5 ;;
|
|
|
|
+ esac
|
|
|
|
+
|
|
|
|
+else
|
|
|
|
+ enable_tls=yes
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports thread-local storage" >&5
|
|
|
|
+$as_echo_n "checking whether the target supports thread-local storage... " >&6; }
|
|
|
|
+if ${gcc_cv_have_tls+:} false; then :
|
|
|
|
+ $as_echo_n "(cached) " >&6
|
|
|
|
+else
|
|
|
|
+
|
|
|
|
+ if test "$cross_compiling" = yes; then :
|
|
|
|
+ if test x$gcc_no_link = xyes; then
|
|
|
|
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
|
|
|
|
+fi
|
|
|
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+__thread int a; int b; int main() { return a = b; }
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_link "$LINENO"; then :
|
|
|
|
+ chktls_save_LDFLAGS="$LDFLAGS"
|
|
|
|
+ case $host in
|
|
|
|
+ *-*-linux* | -*-uclinuxfdpic*)
|
|
|
|
+ LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
|
|
|
|
+ ;;
|
|
|
|
+ esac
|
|
|
|
+ chktls_save_CFLAGS="$CFLAGS"
|
|
|
|
+ CFLAGS="-fPIC $CFLAGS"
|
|
|
|
+ if test x$gcc_no_link = xyes; then
|
|
|
|
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
|
|
|
|
+fi
|
|
|
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+int f() { return 0; }
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_link "$LINENO"; then :
|
|
|
|
+ if test x$gcc_no_link = xyes; then
|
|
|
|
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
|
|
|
|
+fi
|
|
|
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+__thread int a; int b; int f() { return a = b; }
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_link "$LINENO"; then :
|
|
|
|
+ gcc_cv_have_tls=yes
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=no
|
|
|
|
+fi
|
|
|
|
+rm -f core conftest.err conftest.$ac_objext \
|
|
|
|
+ conftest$ac_exeext conftest.$ac_ext
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=yes
|
|
|
|
+fi
|
|
|
|
+rm -f core conftest.err conftest.$ac_objext \
|
|
|
|
+ conftest$ac_exeext conftest.$ac_ext
|
|
|
|
+ CFLAGS="$chktls_save_CFLAGS"
|
|
|
|
+ LDFLAGS="$chktls_save_LDFLAGS"
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=no
|
|
|
|
+fi
|
|
|
|
+rm -f core conftest.err conftest.$ac_objext \
|
|
|
|
+ conftest$ac_exeext conftest.$ac_ext
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+else
|
|
|
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+__thread int a; int b; int main() { return a = b; }
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_run "$LINENO"; then :
|
|
|
|
+ chktls_save_LDFLAGS="$LDFLAGS"
|
|
|
|
+ LDFLAGS="-static $LDFLAGS"
|
|
|
|
+ if test x$gcc_no_link = xyes; then
|
|
|
|
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
|
|
|
|
+fi
|
|
|
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+int main() { return 0; }
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_link "$LINENO"; then :
|
|
|
|
+ if test "$cross_compiling" = yes; then :
|
|
|
|
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
|
|
|
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
|
|
|
+as_fn_error $? "cannot run test program while cross compiling
|
|
|
|
+See \`config.log' for more details" "$LINENO" 5; }
|
|
|
|
+else
|
|
|
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+__thread int a; int b; int main() { return a = b; }
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_run "$LINENO"; then :
|
|
|
|
+ gcc_cv_have_tls=yes
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=no
|
|
|
|
+fi
|
|
|
|
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
|
|
|
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=yes
|
|
|
|
+fi
|
|
|
|
+rm -f core conftest.err conftest.$ac_objext \
|
|
|
|
+ conftest$ac_exeext conftest.$ac_ext
|
|
|
|
+ LDFLAGS="$chktls_save_LDFLAGS"
|
|
|
|
+ if test $gcc_cv_have_tls = yes; then
|
|
|
|
+ chktls_save_CFLAGS="$CFLAGS"
|
|
|
|
+ thread_CFLAGS=failed
|
|
|
|
+ for flag in '' '-pthread' '-lpthread'; do
|
|
|
|
+ CFLAGS="$flag $chktls_save_CFLAGS"
|
|
|
|
+ if test x$gcc_no_link = xyes; then
|
|
|
|
+ as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
|
|
|
|
+fi
|
|
|
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+#include <pthread.h>
|
|
|
|
+ void *g(void *d) { return NULL; }
|
|
|
|
+int
|
|
|
|
+main ()
|
|
|
|
+{
|
|
|
|
+pthread_t t; pthread_create(&t,NULL,g,NULL);
|
|
|
|
+ ;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_link "$LINENO"; then :
|
|
|
|
+ thread_CFLAGS="$flag"
|
|
|
|
+fi
|
|
|
|
+rm -f core conftest.err conftest.$ac_objext \
|
|
|
|
+ conftest$ac_exeext conftest.$ac_ext
|
|
|
|
+ if test "X$thread_CFLAGS" != Xfailed; then
|
|
|
|
+ break
|
|
|
|
+ fi
|
|
|
|
+ done
|
|
|
|
+ CFLAGS="$chktls_save_CFLAGS"
|
|
|
|
+ if test "X$thread_CFLAGS" != Xfailed; then
|
|
|
|
+ CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
|
|
|
|
+ if test "$cross_compiling" = yes; then :
|
|
|
|
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
|
|
|
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
|
|
|
+as_fn_error $? "cannot run test program while cross compiling
|
|
|
|
+See \`config.log' for more details" "$LINENO" 5; }
|
|
|
|
+else
|
|
|
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
|
|
+/* end confdefs.h. */
|
|
|
|
+#include <pthread.h>
|
|
|
|
+ __thread int a;
|
|
|
|
+ static int *volatile a_in_other_thread;
|
|
|
|
+ static void *
|
|
|
|
+ thread_func (void *arg)
|
|
|
|
+ {
|
|
|
|
+ a_in_other_thread = &a;
|
|
|
|
+ return (void *)0;
|
|
|
|
+ }
|
|
|
|
+int
|
|
|
|
+main ()
|
|
|
|
+{
|
|
|
|
+pthread_t thread;
|
|
|
|
+ void *thread_retval;
|
|
|
|
+ int *volatile a_in_main_thread;
|
|
|
|
+ a_in_main_thread = &a;
|
|
|
|
+ if (pthread_create (&thread, (pthread_attr_t *)0,
|
|
|
|
+ thread_func, (void *)0))
|
|
|
|
+ return 0;
|
|
|
|
+ if (pthread_join (thread, &thread_retval))
|
|
|
|
+ return 0;
|
|
|
|
+ return (a_in_other_thread == a_in_main_thread);
|
|
|
|
+ ;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+_ACEOF
|
|
|
|
+if ac_fn_c_try_run "$LINENO"; then :
|
|
|
|
+ gcc_cv_have_tls=yes
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=no
|
|
|
|
+fi
|
|
|
|
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
|
|
|
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+ CFLAGS="$chktls_save_CFLAGS"
|
|
|
|
+ fi
|
|
|
|
+ fi
|
|
|
|
+else
|
|
|
|
+ gcc_cv_have_tls=no
|
|
|
|
+fi
|
|
|
|
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
|
|
|
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+fi
|
|
|
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_have_tls" >&5
|
|
|
|
+$as_echo "$gcc_cv_have_tls" >&6; }
|
|
|
|
+ if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then
|
|
|
|
+
|
|
|
|
+$as_echo "#define HAVE_TLS 1" >>confdefs.h
|
|
|
|
+
|
|
|
|
+ fi
|
|
|
|
;;
|
|
|
|
*-netbsd* | *-openbsd*)
|
|
|
|
SECTION_FLAGS='-ffunction-sections -fdata-sections'
|
|
|
|
--- a/libstdc++-v3/crossconfig.m4
|
|
|
|
+++ b/libstdc++-v3/crossconfig.m4
|
2022-04-21 22:03:38 +00:00
|
|
|
@@ -204,6 +204,7 @@
|
2022-02-22 19:11:19 +00:00
|
|
|
GLIBCXX_CHECK_STDLIB_SUPPORT
|
|
|
|
AC_CHECK_FUNCS(aligned_alloc posix_memalign memalign _aligned_malloc)
|
|
|
|
AC_CHECK_FUNCS(_wfopen)
|
|
|
|
+ GCC_CHECK_TLS
|
|
|
|
;;
|
|
|
|
*-netbsd* | *-openbsd*)
|
|
|
|
SECTION_FLAGS='-ffunction-sections -fdata-sections'
|