summaryrefslogtreecommitdiff
path: root/config/tls.m4
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2007-02-09 19:24:42 +0000
committerPaolo Bonzini <bonzini@gnu.org>2007-02-09 19:24:42 +0000
commit603dc8d8c2d0a61ecefd9635f018293b85f68f24 (patch)
tree38f44332cf4ae52d5dc516d547907620966c9ef9 /config/tls.m4
parent0ff454611d49fe503358e7b9751c2a4890ed5c7b (diff)
downloadgdb-603dc8d8c2d0a61ecefd9635f018293b85f68f24.tar.gz
2007-02-09 Paolo Bonzini <bonzini@gnu.org>
* Makefile.def: Sync with GCC. * Makefile.tpl: Sync with GCC. * Makefile.in: Regenerate. * configure: Regenerate. * config/acx.m4: Sync with GCC. * config/depstand.m4: Sync with GCC. * config/tls.m4: Sync with GCC.
Diffstat (limited to 'config/tls.m4')
-rw-r--r--config/tls.m459
1 files changed, 55 insertions, 4 deletions
diff --git a/config/tls.m4 b/config/tls.m4
index 41f11ab3ea5..c8f3ff0a373 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 <pthread.h>
+ 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 <pthread.h>
+ __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,