From 78e075d40b285015c0a316b6c0c039a516a6117e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 7 Feb 2007 14:35:17 +0100 Subject: [multiple changes] 2007-02-07 Bruno Haible config/ PR libgomp/28468 * config/tls.m4 (GCC_CHECK_TLS): Also check whether the libc supports TLS via __thread. 2007-02-07 Jakub Jelinek {libgomp,libstdc++-v3,libmudflap,libjava}/ PR libgomp/28468 * configure: Regenerate. From-SVN: r121689 --- config/ChangeLog | 6 ++++++ config/tls.m4 | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 4 deletions(-) (limited to 'config') diff --git a/config/ChangeLog b/config/ChangeLog index 0b1dada..c4f5ded 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,9 @@ +2007-02-07 Bruno Haible + + PR libgomp/28468 + * config/tls.m4 (GCC_CHECK_TLS): Also check whether the libc supports + TLS via __thread. + 2007-01-31 Daniel Franke PR libgomp/30546 diff --git a/config/tls.m4 b/config/tls.m4 index 41f11ab..c8f3ff0 100644 --- a/config/tls.m4 +++ b/config/tls.m4 @@ -7,16 +7,67 @@ AC_DEFUN([GCC_CHECK_TLS], [ [dnl If the test case passed with dynamic linking, try again with dnl static linking, but only if static linking is supported (not dnl on Solaris 10). This fails with some older Red Hat releases. - save_LDFLAGS="$LDFLAGS" + chktls_save_LDFLAGS="$LDFLAGS" LDFLAGS="-static $LDFLAGS" AC_LINK_IFELSE([int main() { return 0; }], AC_RUN_IFELSE([__thread int a; int b; int main() { return a = b; }], [have_tls=yes], [have_tls=no],[]), [have_tls=yes]) - LDFLAGS="$save_LDFLAGS"], + LDFLAGS="$chktls_save_LDFLAGS" + if test $have_tls = yes; then + dnl So far, the binutils and the compiler support TLS. + dnl Also check whether the libc supports TLS, i.e. whether a variable + dnl with __thread linkage has a different address in different threads. + dnl First, find the thread_CFLAGS necessary for linking a program that + dnl calls pthread_create. + chktls_save_CFLAGS="$CFLAGS" + thread_CFLAGS=failed + for flag in '' '-pthread' '-lpthread'; do + CFLAGS="$flag $chktls_save_CFLAGS" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#include + void *g(void *d) { return NULL; }], + [pthread_t t; pthread_create(&t,NULL,g,NULL);])], + [thread_CFLAGS="$flag"]) + 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" + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [#include + __thread int a; + static int *a_in_other_thread; + static void * + thread_func (void *arg) + { + a_in_other_thread = &a; + return (void *)0; + }], + [pthread_t thread; + void *thread_retval; + int *a_in_main_thread; + if (pthread_create (&thread, (pthread_attr_t *)0, + thread_func, (void *)0)) + return 0; + a_in_main_thread = &a; + if (pthread_join (thread, &thread_retval)) + return 0; + return (a_in_other_thread == a_in_main_thread);])], + [have_tls=yes], [have_tls=no], []) + CFLAGS="$chktls_save_CFLAGS" + fi + fi], [have_tls=no], - [AC_LINK_IFELSE([__thread int a; int b; int main() { return a = b; }], - [have_tls=yes], [have_tls=no])] + [dnl This is the cross-compiling case. Assume libc supports TLS if the + dnl binutils and the compiler do. + AC_LINK_IFELSE([__thread int a; int b; int main() { return a = b; }], + [have_tls=yes], [have_tls=no]) + ] )]) if test "$enable_tls $have_tls" = "yes yes"; then AC_DEFINE(HAVE_TLS, 1, -- cgit v1.1