From 76d9b8c15ce5136d21f8564a6d0bda3f1a1d69b8 Mon Sep 17 00:00:00 2001 From: ivanka2012 Date: Tue, 22 Feb 2022 20:11:19 +0100 Subject: [PATCH] Fix MinGW libstdc++ TLS functionality Backport of https://github.com/gcc-mirror/gcc/commit/cc1e28878a228b6c4a0872e56d97ac88971b7725 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kittenberger Iván --- ...r-TLS-support-on-mingw-cross-compile.patch | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 packages/gcc/11.2.0/0010-libstdc-Check-for-TLS-support-on-mingw-cross-compile.patch diff --git a/packages/gcc/11.2.0/0010-libstdc-Check-for-TLS-support-on-mingw-cross-compile.patch b/packages/gcc/11.2.0/0010-libstdc-Check-for-TLS-support-on-mingw-cross-compile.patch new file mode 100644 index 00000000..a4b4ec25 --- /dev/null +++ b/packages/gcc/11.2.0/0010-libstdc-Check-for-TLS-support-on-mingw-cross-compile.patch @@ -0,0 +1,251 @@ +From cc1e28878a228b6c4a0872e56d97ac88971b7725 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Hugo=20Beauz=C3=A9e-Luyssen?= +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. +--- + libstdc++-v3/configure | 208 ++++++++++++++++++++++++++++++++++++ + libstdc++-v3/crossconfig.m4 | 1 + + 2 files changed, 209 insertions(+) + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index 13d52eb0c0e..c1aea827070 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -60242,6 +60242,214 @@ _ACEOF + 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 ++ 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 ++ __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' +diff --git a/libstdc++-v3/crossconfig.m4 b/libstdc++-v3/crossconfig.m4 +index ff44d5ae019..ae5283b7ad3 100644 +--- a/libstdc++-v3/crossconfig.m4 ++++ b/libstdc++-v3/crossconfig.m4 +@@ -204,6 +204,7 @@ case "${host}" in + 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' +-- +2.33.0.windows.2 +