Fix issues with multiple inferiors
[deliverable/binutils-gdb.git] / config / tls.m4
index 4648a9098806b8b6b60a7654762e656c18b5ec0a..1a5fc59c2b4e3c2abc159a0f487e0bc4968e400b 100644 (file)
@@ -4,15 +4,15 @@ AC_DEFUN([GCC_CHECK_TLS], [
   GCC_ENABLE(tls, yes, [], [Use thread-local storage])
   AC_CACHE_CHECK([whether the target supports thread-local storage],
                 gcc_cv_have_tls, [
-    AC_RUN_IFELSE([__thread int a; int b; int main() { return a = b; }],
+    AC_RUN_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
       [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.
       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; }],
-                     [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no],[]),
+      AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 0; }])],
+       [AC_RUN_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
+                      [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no],[])],
        [gcc_cv_have_tls=yes])
       LDFLAGS="$chktls_save_LDFLAGS"
       if test $gcc_cv_have_tls = yes; then
@@ -38,11 +38,16 @@ AC_DEFUN([GCC_CHECK_TLS], [
        CFLAGS="$chktls_save_CFLAGS"
        if test "X$thread_CFLAGS" != Xfailed; then
          CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
+         dnl Test for an old glibc bug that violated the __thread property.
+         dnl Use volatile to ensure the compiler won't optimize away pointer
+         dnl accesses it might otherwise assume to be redundant, or reorder 
+         dnl them and reuse storage, which might lead to them pointing to
+         dnl the same location.
          AC_RUN_IFELSE(
            [AC_LANG_PROGRAM(
               [#include <pthread.h>
                __thread int a;
-               static int *a_in_other_thread;
+               static int *volatile a_in_other_thread;
                static void *
                thread_func (void *arg)
                {
@@ -51,11 +56,11 @@ AC_DEFUN([GCC_CHECK_TLS], [
                }],
               [pthread_t thread;
                void *thread_retval;
-               int *a_in_main_thread;
+               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;
-               a_in_main_thread = &a;
                if (pthread_join (thread, &thread_retval))
                  return 0;
                return (a_in_other_thread == a_in_main_thread);])],
@@ -66,7 +71,7 @@ AC_DEFUN([GCC_CHECK_TLS], [
       [gcc_cv_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; }],
+       AC_LINK_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
         [chktls_save_LDFLAGS="$LDFLAGS"
          dnl Shared library options may depend on the host; this check
          dnl is only known to be needed for GNU/Linux.
@@ -78,10 +83,10 @@ AC_DEFUN([GCC_CHECK_TLS], [
          chktls_save_CFLAGS="$CFLAGS"
          CFLAGS="-fPIC $CFLAGS"
          dnl If -shared works, test if TLS works in a shared library.
-         AC_LINK_IFELSE([int f() { return 0; }],
-           AC_LINK_IFELSE([__thread int a; int b; int f() { return a = b; }],
+         AC_LINK_IFELSE([AC_LANG_SOURCE([int f() { return 0; }])],
+           [AC_LINK_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int f() { return a = b; }])],
              [gcc_cv_have_tls=yes],
-             [gcc_cv_have_tls=no]),
+             [gcc_cv_have_tls=no])],
            [gcc_cv_have_tls=yes])
          CFLAGS="$chktls_save_CFLAGS"
          LDFLAGS="$chktls_save_LDFLAGS"], [gcc_cv_have_tls=no])
@@ -97,10 +102,28 @@ AC_DEFUN([GCC_CHECK_CC_TLS], [
   GCC_ENABLE(tls, yes, [], [Use thread-local storage])
   AC_CACHE_CHECK([whether the target assembler supports thread-local storage],
                 gcc_cv_have_cc_tls, [
-    AC_COMPILE_IFELSE([__thread int a; int b; int main() { return a = b; }],
+    AC_COMPILE_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
       [gcc_cv_have_cc_tls=yes], [gcc_cv_have_cc_tls=no])]
     )])
   if test "$enable_tls $gcc_cv_have_cc_tls" = "yes yes"; then
     AC_DEFINE(HAVE_CC_TLS, 1,
              [Define to 1 if the target assembler supports thread-local storage.])
   fi])
+
+dnl Check whether TLS is emulated.
+AC_DEFUN([GCC_CHECK_EMUTLS], [
+  AC_CACHE_CHECK([whether the thread-local storage support is from emutls],
+                gcc_cv_use_emutls, [
+    gcc_cv_use_emutls=no
+    echo '__thread int a; int b; int main() { return a = b; }' > conftest.c
+    if AC_TRY_COMMAND(${CC-cc} -Werror -S -o conftest.s conftest.c 1>&AS_MESSAGE_LOG_FD); then
+      if grep __emutls_get_address conftest.s > /dev/null; then
+       gcc_cv_use_emutls=yes
+      fi
+    fi
+    rm -f conftest.*
+    ])
+  if test "$gcc_cv_use_emutls" = "yes" ; then
+    AC_DEFINE(USE_EMUTLS, 1,
+             [Define to 1 if the target use emutls for thread-local storage.])
+  fi])
This page took 0.025641 seconds and 4 git commands to generate.