OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [config/] [tls.m4] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
dnl Check whether the target supports TLS.
dnl Check whether the target supports TLS.
AC_DEFUN([GCC_CHECK_TLS], [
AC_DEFUN([GCC_CHECK_TLS], [
  GCC_ENABLE(tls, yes, [], [Use thread-local storage])
  GCC_ENABLE(tls, yes, [], [Use thread-local storage])
  AC_CACHE_CHECK([whether the target supports thread-local storage],
  AC_CACHE_CHECK([whether the target supports thread-local storage],
                 gcc_cv_have_tls, [
                 gcc_cv_have_tls, [
    AC_RUN_IFELSE([__thread int a; int b; int main() { return a = b; }],
    AC_RUN_IFELSE([__thread int a; int b; int main() { return a = b; }],
      [dnl If the test case passed with dynamic linking, try again with
      [dnl If the test case passed with dynamic linking, try again with
       dnl static linking, but only if static linking is supported (not
       dnl static linking, but only if static linking is supported (not
       dnl on Solaris 10).  This fails with some older Red Hat releases.
       dnl on Solaris 10).  This fails with some older Red Hat releases.
      chktls_save_LDFLAGS="$LDFLAGS"
      chktls_save_LDFLAGS="$LDFLAGS"
      LDFLAGS="-static $LDFLAGS"
      LDFLAGS="-static $LDFLAGS"
      AC_LINK_IFELSE([int main() { return 0; }],
      AC_LINK_IFELSE([int main() { return 0; }],
        AC_RUN_IFELSE([__thread int a; int b; int main() { return a = b; }],
        AC_RUN_IFELSE([__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], [gcc_cv_have_tls=no],[]),
        [gcc_cv_have_tls=yes])
        [gcc_cv_have_tls=yes])
      LDFLAGS="$chktls_save_LDFLAGS"
      LDFLAGS="$chktls_save_LDFLAGS"
      if test $gcc_cv_have_tls = yes; then
      if test $gcc_cv_have_tls = yes; then
        dnl So far, the binutils and the compiler support TLS.
        dnl So far, the binutils and the compiler support TLS.
        dnl Also check whether the libc supports TLS, i.e. whether a variable
        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 with __thread linkage has a different address in different threads.
        dnl First, find the thread_CFLAGS necessary for linking a program that
        dnl First, find the thread_CFLAGS necessary for linking a program that
        dnl calls pthread_create.
        dnl calls pthread_create.
        chktls_save_CFLAGS="$CFLAGS"
        chktls_save_CFLAGS="$CFLAGS"
        thread_CFLAGS=failed
        thread_CFLAGS=failed
        for flag in '' '-pthread' '-lpthread'; do
        for flag in '' '-pthread' '-lpthread'; do
          CFLAGS="$flag $chktls_save_CFLAGS"
          CFLAGS="$flag $chktls_save_CFLAGS"
          AC_LINK_IFELSE(
          AC_LINK_IFELSE(
            [AC_LANG_PROGRAM(
            [AC_LANG_PROGRAM(
               [#include <pthread.h>
               [#include <pthread.h>
                void *g(void *d) { return NULL; }],
                void *g(void *d) { return NULL; }],
               [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
               [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
            [thread_CFLAGS="$flag"])
            [thread_CFLAGS="$flag"])
          if test "X$thread_CFLAGS" != Xfailed; then
          if test "X$thread_CFLAGS" != Xfailed; then
            break
            break
          fi
          fi
        done
        done
        CFLAGS="$chktls_save_CFLAGS"
        CFLAGS="$chktls_save_CFLAGS"
        if test "X$thread_CFLAGS" != Xfailed; then
        if test "X$thread_CFLAGS" != Xfailed; then
          CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
          CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
          AC_RUN_IFELSE(
          AC_RUN_IFELSE(
            [AC_LANG_PROGRAM(
            [AC_LANG_PROGRAM(
               [#include <pthread.h>
               [#include <pthread.h>
                __thread int a;
                __thread int a;
                static int *a_in_other_thread;
                static int *a_in_other_thread;
                static void *
                static void *
                thread_func (void *arg)
                thread_func (void *arg)
                {
                {
                  a_in_other_thread = &a;
                  a_in_other_thread = &a;
                  return (void *)0;
                  return (void *)0;
                }],
                }],
               [pthread_t thread;
               [pthread_t thread;
                void *thread_retval;
                void *thread_retval;
                int *a_in_main_thread;
                int *a_in_main_thread;
                if (pthread_create (&thread, (pthread_attr_t *)0,
                if (pthread_create (&thread, (pthread_attr_t *)0,
                                    thread_func, (void *)0))
                                    thread_func, (void *)0))
                  return 0;
                  return 0;
                a_in_main_thread = &a;
                a_in_main_thread = &a;
                if (pthread_join (thread, &thread_retval))
                if (pthread_join (thread, &thread_retval))
                  return 0;
                  return 0;
                return (a_in_other_thread == a_in_main_thread);])],
                return (a_in_other_thread == a_in_main_thread);])],
             [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no], [])
             [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no], [])
          CFLAGS="$chktls_save_CFLAGS"
          CFLAGS="$chktls_save_CFLAGS"
        fi
        fi
      fi],
      fi],
      [gcc_cv_have_tls=no],
      [gcc_cv_have_tls=no],
      [dnl This is the cross-compiling case. Assume libc supports TLS if the
      [dnl This is the cross-compiling case. Assume libc supports TLS if the
       dnl binutils and the compiler do.
       dnl binutils and the compiler do.
       AC_LINK_IFELSE([__thread int a; int b; int main() { return a = b; }],
       AC_LINK_IFELSE([__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], [gcc_cv_have_tls=no])
      ]
      ]
    )])
    )])
  if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then
  if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then
    AC_DEFINE(HAVE_TLS, 1,
    AC_DEFINE(HAVE_TLS, 1,
              [Define to 1 if the target supports thread-local storage.])
              [Define to 1 if the target supports thread-local storage.])
  fi])
  fi])
 
 
dnl Check whether the target assembler supports TLS.
dnl Check whether the target assembler supports TLS.
AC_DEFUN([GCC_CHECK_CC_TLS], [
AC_DEFUN([GCC_CHECK_CC_TLS], [
  GCC_ENABLE(tls, yes, [], [Use thread-local storage])
  GCC_ENABLE(tls, yes, [], [Use thread-local storage])
  AC_CACHE_CHECK([whether the target asssembler upports thread-local storage],
  AC_CACHE_CHECK([whether the target asssembler upports thread-local storage],
                 gcc_cv_have_cc_tls, [
                 gcc_cv_have_cc_tls, [
    AC_COMPILE_IFELSE([__thread int a; int b; int main() { return a = b; }],
    AC_COMPILE_IFELSE([__thread int a; int b; int main() { return a = b; }],
      [gcc_cv_have_cc_tls=yes], [gcc_cv_have_cc_tls=no])]
      [gcc_cv_have_cc_tls=yes], [gcc_cv_have_cc_tls=no])]
    )])
    )])
  if test "$enable_tls $gcc_cv_have_cc_tls" = "yes yes"; then
  if test "$enable_tls $gcc_cv_have_cc_tls" = "yes yes"; then
    AC_DEFINE(HAVE_CC_TLS, 1,
    AC_DEFINE(HAVE_CC_TLS, 1,
              [Define to 1 if the target assembler supports thread-local storage.])
              [Define to 1 if the target assembler supports thread-local storage.])
  fi])
  fi])
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.