]> git.ipfire.org Git - thirdparty/gcc.git/blame - config/tls.m4
Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856).
[thirdparty/gcc.git] / config / tls.m4
CommitLineData
e1e73e8d
TT
1dnl Check whether the target supports TLS.
2AC_DEFUN([GCC_CHECK_TLS], [
396b7fa4 3 AC_REQUIRE([AC_CANONICAL_HOST])
2fb31455 4 GCC_ENABLE(tls, yes, [], [Use thread-local storage])
e1e73e8d 5 AC_CACHE_CHECK([whether the target supports thread-local storage],
3afcaaf4 6 gcc_cv_have_tls, [
22e05272 7 AC_RUN_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
e1e73e8d 8 [dnl If the test case passed with dynamic linking, try again with
aad741f4
EB
9 dnl static linking, but only if static linking is supported (not
10 dnl on Solaris 10). This fails with some older Red Hat releases.
78e075d4 11 chktls_save_LDFLAGS="$LDFLAGS"
e1e73e8d 12 LDFLAGS="-static $LDFLAGS"
22e05272
JM
13 AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 0; }])],
14 [AC_RUN_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
1b3b24c2 15 [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no],[])],
3afcaaf4 16 [gcc_cv_have_tls=yes])
78e075d4 17 LDFLAGS="$chktls_save_LDFLAGS"
3afcaaf4 18 if test $gcc_cv_have_tls = yes; then
78e075d4
JJ
19 dnl So far, the binutils and the compiler support TLS.
20 dnl Also check whether the libc supports TLS, i.e. whether a variable
21 dnl with __thread linkage has a different address in different threads.
22 dnl First, find the thread_CFLAGS necessary for linking a program that
23 dnl calls pthread_create.
24 chktls_save_CFLAGS="$CFLAGS"
25 thread_CFLAGS=failed
26 for flag in '' '-pthread' '-lpthread'; do
27 CFLAGS="$flag $chktls_save_CFLAGS"
28 AC_LINK_IFELSE(
29 [AC_LANG_PROGRAM(
30 [#include <pthread.h>
31 void *g(void *d) { return NULL; }],
32 [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
33 [thread_CFLAGS="$flag"])
34 if test "X$thread_CFLAGS" != Xfailed; then
35 break
36 fi
37 done
38 CFLAGS="$chktls_save_CFLAGS"
39 if test "X$thread_CFLAGS" != Xfailed; then
40 CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
dbd34b89
IS
41 dnl Test for an old glibc bug that violated the __thread property.
42 dnl Use volatile to ensure the compiler won't optimize away pointer
43 dnl accesses it might otherwise assume to be redundant, or reorder
44 dnl them and reuse storage, which might lead to them pointing to
45 dnl the same location.
78e075d4
JJ
46 AC_RUN_IFELSE(
47 [AC_LANG_PROGRAM(
48 [#include <pthread.h>
49 __thread int a;
dbd34b89 50 static int *volatile a_in_other_thread;
78e075d4
JJ
51 static void *
52 thread_func (void *arg)
53 {
54 a_in_other_thread = &a;
55 return (void *)0;
56 }],
57 [pthread_t thread;
58 void *thread_retval;
dbd34b89
IS
59 int *volatile a_in_main_thread;
60 a_in_main_thread = &a;
78e075d4
JJ
61 if (pthread_create (&thread, (pthread_attr_t *)0,
62 thread_func, (void *)0))
63 return 0;
78e075d4
JJ
64 if (pthread_join (thread, &thread_retval))
65 return 0;
66 return (a_in_other_thread == a_in_main_thread);])],
3afcaaf4 67 [gcc_cv_have_tls=yes], [gcc_cv_have_tls=no], [])
78e075d4
JJ
68 CFLAGS="$chktls_save_CFLAGS"
69 fi
70 fi],
3afcaaf4 71 [gcc_cv_have_tls=no],
78e075d4
JJ
72 [dnl This is the cross-compiling case. Assume libc supports TLS if the
73 dnl binutils and the compiler do.
22e05272 74 AC_LINK_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
396b7fa4
JM
75 [chktls_save_LDFLAGS="$LDFLAGS"
76 dnl Shared library options may depend on the host; this check
77 dnl is only known to be needed for GNU/Linux.
78 case $host in
79 *-*-linux*)
80 LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
81 ;;
82 esac
83 chktls_save_CFLAGS="$CFLAGS"
84 CFLAGS="-fPIC $CFLAGS"
85 dnl If -shared works, test if TLS works in a shared library.
22e05272
JM
86 AC_LINK_IFELSE([AC_LANG_SOURCE([int f() { return 0; }])],
87 [AC_LINK_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int f() { return a = b; }])],
396b7fa4 88 [gcc_cv_have_tls=yes],
e7d5b5b9 89 [gcc_cv_have_tls=no])],
396b7fa4
JM
90 [gcc_cv_have_tls=yes])
91 CFLAGS="$chktls_save_CFLAGS"
92 LDFLAGS="$chktls_save_LDFLAGS"], [gcc_cv_have_tls=no])
78e075d4 93 ]
e1e73e8d 94 )])
3afcaaf4 95 if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then
e1e73e8d
TT
96 AC_DEFINE(HAVE_TLS, 1,
97 [Define to 1 if the target supports thread-local storage.])
98 fi])
6f461e76
L
99
100dnl Check whether the target assembler supports TLS.
101AC_DEFUN([GCC_CHECK_CC_TLS], [
102 GCC_ENABLE(tls, yes, [], [Use thread-local storage])
10fbe77a 103 AC_CACHE_CHECK([whether the target assembler supports thread-local storage],
3afcaaf4 104 gcc_cv_have_cc_tls, [
22e05272 105 AC_COMPILE_IFELSE([AC_LANG_SOURCE([__thread int a; int b; int main() { return a = b; }])],
3afcaaf4 106 [gcc_cv_have_cc_tls=yes], [gcc_cv_have_cc_tls=no])]
6f461e76 107 )])
3afcaaf4 108 if test "$enable_tls $gcc_cv_have_cc_tls" = "yes yes"; then
6f461e76
L
109 AC_DEFINE(HAVE_CC_TLS, 1,
110 [Define to 1 if the target assembler supports thread-local storage.])
111 fi])
5cf9cc96
JZ
112
113dnl Check whether TLS is emulated.
114AC_DEFUN([GCC_CHECK_EMUTLS], [
115 AC_CACHE_CHECK([whether the thread-local storage support is from emutls],
116 gcc_cv_use_emutls, [
117 gcc_cv_use_emutls=no
118 echo '__thread int a; int b; int main() { return a = b; }' > conftest.c
119 if AC_TRY_COMMAND(${CC-cc} -Werror -S -o conftest.s conftest.c 1>&AS_MESSAGE_LOG_FD); then
120 if grep __emutls_get_address conftest.s > /dev/null; then
121 gcc_cv_use_emutls=yes
122 fi
123 fi
124 rm -f conftest.*
125 ])
126 if test "$gcc_cv_use_emutls" = "yes" ; then
127 AC_DEFINE(USE_EMUTLS, 1,
128 [Define to 1 if the target use emutls for thread-local storage.])
129 fi])