summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2010-07-23 17:58:57 +0000
committerRainer Orth <ro@gcc.gnu.org>2010-07-23 17:58:57 +0000
commit16c9d3b171f9e89b23d58db8ab05efa3e4cea872 (patch)
tree39103be234a3e19ac19bd12912df0b40cd3fdd85
parent7a6faad6e7dd942b60d5e78de424de674144543a (diff)
downloadgcc-16c9d3b171f9e89b23d58db8ab05efa3e4cea872.tar.gz
re PR target/18788 ("-pthreads" option with "-shared" does not cause libpthread.so to be linked in.)
libjava: * configure.ac (*-*-solaris2.8): Use alternate thread library. Add libthread. (*-*-solaris2.9): Use libthread. * configure: Regenerate. libgomp: * configure.tgt (*-*-solaris2.[56]*): Removed. gcc: * configure.ac: Don't disable TLS on Solaris 8/9 by default Set tga_func for Solaris 2/x86 resp. SPARC. Remove duplicate parts of sparc*-sun-solaris2.* TLS check. (LIB_THREAD_LDFLAGS_SPEC): Define. (LIB_TLS_SPEC): Define. Check for required Sun ld version. * configure: Regenerate. * config.in: Regenerate. * config/sol2.h (LIB_SPEC): Use LIB_THREAD_LDFLAGS_SPEC with -pthread, -threads, LIB_TLS_SPEC with -pthread. * doc/install.texi (Specific, *-*-solaris2*): Document use of alternate thread libraries on Solaris 8. Document TLS patch requirements. * doc/sourcebuild.texi (Add Options): Sort alphabetically. Document tls. PR target/18788 * config/sol2.h (LIB_SPEC): Link with thread libraries even with -shared. gcc/testsuite: * lib/target-supports.exp (add_options_for_tls): New proc. * g++.dg/tls/static-1.C: Use dg-add-options tls. * g++.dg/tls/static-1a.cc: Likewise. * gcc.dg/tls/emutls-1.c: Likewise. * gcc.dg/tls/opt-11.c: Likewise. * gcc.dg/tls/opt-12.c: Likewise. * gcc.dg/tls/pr24428-2.c: Likewise. * gcc.dg/tls/pr24428.c: Likewise. * obj-c++.dg/tls/static-1.mm: Likewise. * obj-c++.dg/torture/tls/thr-init-1.mm: Likewise. * obj-c++.dg/torture/tls/thr-init-2.mm: Likewise. * obj-c++.dg/torture/tls/thr-init-3.mm: Likewise. * objc.dg/torture/tls/thr-init-2.m: Likewise. * objc.dg/torture/tls/thr-init-3.m: Likewise. * objc.dg/torture/tls/thr-init.m: Likewise. * gcc.dg/lto/20090210_0.c: Add -pthread for *-*-solaris2.[89]. From-SVN: r162478
-rw-r--r--gcc/ChangeLog22
-rw-r--r--gcc/config.in14
-rw-r--r--gcc/config/sol2.h11
-rwxr-xr-xgcc/configure212
-rw-r--r--gcc/configure.ac143
-rw-r--r--gcc/doc/install.texi23
-rw-r--r--gcc/doc/sourcebuild.texi21
-rw-r--r--gcc/testsuite/ChangeLog19
-rw-r--r--gcc/testsuite/g++.dg/tls/static-1.C1
-rw-r--r--gcc/testsuite/g++.dg/tls/static-1a.cc1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20090210_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/tls/emutls-1.c1
-rw-r--r--gcc/testsuite/gcc.dg/tls/opt-11.c1
-rw-r--r--gcc/testsuite/gcc.dg/tls/opt-12.c1
-rw-r--r--gcc/testsuite/gcc.dg/tls/pr24428-2.c1
-rw-r--r--gcc/testsuite/gcc.dg/tls/pr24428.c1
-rw-r--r--gcc/testsuite/lib/target-supports.exp18
-rw-r--r--gcc/testsuite/obj-c++.dg/tls/static-1.mm1
-rw-r--r--gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm1
-rw-r--r--gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm3
-rw-r--r--gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm1
-rw-r--r--gcc/testsuite/objc.dg/torture/tls/thr-init-2.m1
-rw-r--r--gcc/testsuite/objc.dg/torture/tls/thr-init-3.m1
-rw-r--r--gcc/testsuite/objc.dg/torture/tls/thr-init.m1
-rw-r--r--libgomp/ChangeLog4
-rw-r--r--libgomp/configure.tgt5
-rw-r--r--libjava/ChangeLog7
-rwxr-xr-xlibjava/configure13
-rw-r--r--libjava/configure.ac13
29 files changed, 431 insertions, 112 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d9c977cd5f..61abdeb8ffa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,25 @@
+2010-07-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac: Don't disable TLS on Solaris 8/9 by default
+ Set tga_func for Solaris 2/x86 resp. SPARC.
+ Remove duplicate parts of sparc*-sun-solaris2.* TLS check.
+ (LIB_THREAD_LDFLAGS_SPEC): Define.
+ (LIB_TLS_SPEC): Define.
+ Check for required Sun ld version.
+ * configure: Regenerate.
+ * config.in: Regenerate.
+ * config/sol2.h (LIB_SPEC): Use LIB_THREAD_LDFLAGS_SPEC with
+ -pthread, -threads, LIB_TLS_SPEC with -pthread.
+ * doc/install.texi (Specific, *-*-solaris2*): Document use of
+ alternate thread libraries on Solaris 8.
+ Document TLS patch requirements.
+ * doc/sourcebuild.texi (Add Options): Sort alphabetically.
+ Document tls.
+
+ PR target/18788
+ * config/sol2.h (LIB_SPEC): Link with thread libraries even with
+ -shared.
+
2010-07-23 Jakub Jelinek <jakub@redhat.com>
* tree.h (struct tree_base): Add nameless_flag bitfield.
diff --git a/gcc/config.in b/gcc/config.in
index e140a719f7e..c451c5378e0 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -449,7 +449,7 @@
#endif
-/* Define if your assembler supports thread-local storage. */
+/* Define if your assembler and linker support thread-local storage. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_TLS
#endif
@@ -1537,6 +1537,18 @@
#endif
+/* Define to the linker flags to use for -pthread. */
+#ifndef USED_FOR_TARGET
+#undef LIB_THREAD_LDFLAGS_SPEC
+#endif
+
+
+/* Define to the library containing __tls_get_addr/___tls_get_addr. */
+#ifndef USED_FOR_TARGET
+#undef LIB_TLS_SPEC
+#endif
+
+
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#ifndef USED_FOR_TARGET
diff --git a/gcc/config/sol2.h b/gcc/config/sol2.h
index 7b7ce2bfbab..805b32fe89c 100644
--- a/gcc/config/sol2.h
+++ b/gcc/config/sol2.h
@@ -124,11 +124,12 @@ along with GCC; see the file COPYING3. If not see
#undef LIB_SPEC
#define LIB_SPEC \
"%{compat-bsd:-lucb -lsocket -lnsl -lelf -laio} \
- %{!shared:\
- %{!symbolic:\
- %{pthreads|pthread:-lpthread} \
- %{!pthreads:%{!pthread:%{threads:-lthread}}} \
- %{p|pg:-ldl} -lc}}"
+ %{!symbolic:\
+ %{pthreads|pthread:" \
+ LIB_THREAD_LDFLAGS_SPEC " -lpthread " LIB_TLS_SPEC "} \
+ %{!pthreads:%{!pthread:%{threads:" \
+ LIB_THREAD_LDFLAGS_SPEC " -lthread}}} \
+ %{p|pg:-ldl} -lc}"
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
diff --git a/gcc/configure b/gcc/configure
index bf537ecf502..fedfaa7f090 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -22108,17 +22108,9 @@ foo: .long 25
;;
i[34567]86-*-*)
case "$target" in
- i[34567]86-*-solaris2.[89]*)
- # TLS was introduced in the Solaris 9 4/04 release but
- # we do not enable it by default on Solaris 9 either.
- if test "x$enable_tls" = xyes ; then
- on_solaris=yes
- else
- enable_tls=no;
- fi
- ;;
i[34567]86-*-solaris2.*)
on_solaris=yes
+ tga_func=___tls_get_addr
;;
*)
on_solaris=no
@@ -22333,17 +22325,9 @@ foo: .long 25
;;
sparc*-*-*)
case "$target" in
- sparc*-sun-solaris2.[89]*)
- # TLS was introduced in the Solaris 9 4/04 release but
- # we do not enable it by default on Solaris 9 either.
- if test "x$enable_tls" = xyes ; then
- on_solaris=yes
- else
- enable_tls=no;
- fi
- ;;
sparc*-sun-solaris2.*)
on_solaris=yes
+ tga_func=__tls_get_addr
;;
*)
on_solaris=no
@@ -22351,32 +22335,17 @@ foo: .long 25
esac
if test x$on_solaris = xyes && test x$gas_flag = xno; then
conftest_s='
- .section ".tdata",#alloc,#write,#tls
-foo: .long 25
- .text
- sethi %tgd_hi22(foo), %o0
- add %o0, %tgd_lo10(foo), %o1
- add %l7, %o1, %o0, %tgd_add(foo)
- call __tls_get_addr, %tgd_call(foo)
- sethi %tldm_hi22(foo), %l1
- add %l1, %tldm_lo10(foo), %l2
- add %l7, %l2, %o0, %tldm_add(foo)
- call __tls_get_addr, %tldm_call(foo)
- sethi %tldo_hix22(foo), %l3
- xor %l3, %tldo_lox10(foo), %l4
- add %o0, %l4, %l5, %tldo_add(foo)
- sethi %tie_hi22(foo), %o3
- add %o3, %tie_lo10(foo), %o3
- ld [%l7 + %o3], %o2, %tie_ld(foo)
- add %g7, %o2, %o4, %tie_add(foo)
- sethi %tle_hix22(foo), %l1
- xor %l1, %tle_lox10(foo), %o5
- ld [%g7 + %o5], %o1'
+ .section ".tdata",#alloc,#write,#tls'
tls_first_major=0
tls_first_minor=0
else
conftest_s='
- .section ".tdata","awT",@progbits
+ .section ".tdata","awT",@progbits'
+ tls_first_major=2
+ tls_first_minor=14
+ tls_as_opt="-32 --fatal-warnings"
+ fi
+ conftest_s="$conftest_s
foo: .long 25
.text
sethi %tgd_hi22(foo), %o0
@@ -22396,11 +22365,7 @@ foo: .long 25
add %g7, %o2, %o4, %tie_add(foo)
sethi %tle_hix22(foo), %l1
xor %l1, %tle_lox10(foo), %o5
- ld [%g7 + %o5], %o1'
- tls_first_major=2
- tls_first_minor=14
- tls_as_opt="-32 --fatal-warnings"
- fi
+ ld [%g7 + %o5], %o1"
;;
xtensa*-*-*)
conftest_s='
@@ -22455,6 +22420,163 @@ if test $gcc_cv_as_tls = yes; then
set_have_as_tls=yes
fi
fi
+case "$target" in
+ # TLS was introduced in the Solaris 9 FCS release and backported to
+ # Solaris 8 patches. Support for GNU-style TLS on x86 was only
+ # introduced in Solaris 9 4/04, replacing the earlier Sun style that Sun
+ # ld and GCC don't support any longer.
+ *-*-solaris2.*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker and ld.so.1 TLS support" >&5
+$as_echo_n "checking linker and ld.so.1 TLS support... " >&6; }
+ ld_tls_support=no
+ # Check ld and ld.so.1 TLS support.
+ if echo "$ld_ver" | grep GNU > /dev/null; then
+ # Assume all interesting versions of GNU ld have TLS support.
+ # FIXME: still need ld.so.1 support, i.e. ld version checks below.
+ ld_tls_support=yes
+ else
+ case "$target" in
+ # Solaris 8/x86 ld has GNU style TLS support since version 1.280.
+ i?86-*-solaris2.8)
+ min_tls_ld_vers_minor=280
+ ;;
+ # Solaris 8/SPARC ld has TLS support since version 1.272.
+ sparc*-*-solaris2.8)
+ min_tls_ld_vers_minor=272
+ ;;
+ # Solaris 9/x86 ld has GNU style TLS support since version 1.374.
+ i?86-*-solaris2.9)
+ min_tls_ld_vers_minor=374
+ ;;
+ # Solaris 9/SPARC and Solaris 10+ ld have TLS support since FCS.
+ sparc*-*-solaris2.9 | *-*-solaris2.1[0-9]*)
+ min_tls_ld_vers_minor=343
+ ;;
+ esac
+ if test "$ls_vers_major" -gt 1 || \
+ test "$ld_vers_minor" -ge "$min_tls_ld_vers_minor"; then
+ ld_tls_support=yes
+ else
+ set_have_as_tls=no
+ fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_tls_support" >&5
+$as_echo "$ld_tls_support" >&6; }
+
+ save_LIBS="$LIBS"
+ save_LDFLAGS="$LDFLAGS"
+ LIBS=
+ LDFLAGS=
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking alternate thread library" >&5
+$as_echo_n "checking alternate thread library... " >&6; }
+ case "$target" in
+ # TLS support was backported to Solaris 8 patches, but only lives in
+ # the alternate thread library which became the default in Solaris 9.
+ # We want to always use that, irrespective of TLS support.
+ *-*-solaris2.8)
+ # Take multilib subdir into account. There's no spec to handle
+ # this. The 64 symlink exists since Solaris 8.
+ lwp_dir=/usr/lib/lwp
+ lwp_spec="-L$lwp_dir%{m64:/64} -R$lwp_dir%{m64:/64}"
+ LDFLAGS="-L$lwp_dir -R$lwp_dir"
+ ;;
+ *-*-solaris2*)
+ lwp_dir="none"
+ lwp_spec=""
+ ;;
+ esac
+ # Always define LIB_THREAD_LDFLAGS_SPEC, even without TLS support.
+
+cat >>confdefs.h <<_ACEOF
+#define LIB_THREAD_LDFLAGS_SPEC "$lwp_spec"
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lwp_dir" >&5
+$as_echo "$lwp_dir" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking library containing $tga_func" >&5
+$as_echo_n "checking library containing $tga_func... " >&6; }
+ # Before Solaris 10, __tls_get_addr (SPARC/x64) resp. ___tls_get_addr
+ # (32-bit x86) only lived in libthread, so check for that. Keep
+ # set_have_as_tls if found, disable if not.
+ as_ac_Search=`$as_echo "ac_cv_search_$tga_func" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing $tga_func" >&5
+$as_echo_n "checking for library containing $tga_func... " >&6; }
+if { as_var=$as_ac_Search; eval "test \"\${$as_var+set}\" = set"; }; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $tga_func ();
+int
+main ()
+{
+return $tga_func ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' thread; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Search=\$ac_res"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if { as_var=$as_ac_Search; eval "test \"\${$as_var+set}\" = set"; }; then :
+ break
+fi
+done
+if { as_var=$as_ac_Search; eval "test \"\${$as_var+set}\" = set"; }; then :
+
+else
+ eval "$as_ac_Search=no"
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+eval ac_res=\$$as_ac_Search
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+eval ac_res=\$$as_ac_Search
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+ set_have_as_tls=no
+fi
+
+ # Clear LIBS if we cannot support TLS.
+ if test $set_have_as_tls = no; then
+ LIBS=
+ fi
+ # Always define LIB_TLS_SPEC, even without TLS support.
+
+cat >>confdefs.h <<_ACEOF
+#define LIB_TLS_SPEC "$LIBS"
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBS" >&5
+$as_echo "$LIBS" >&6; }
+
+ LIBS="$save_LIBS"
+ LDFLAGS="$save_LDFLAGS"
+ ;;
+esac
if test $set_have_as_tls = yes ; then
$as_echo "#define HAVE_AS_TLS 1" >>confdefs.h
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 57aeac62468..143db7e3940 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2687,17 +2687,9 @@ foo: .long 25
;;
i[34567]86-*-*)
case "$target" in
- i[34567]86-*-solaris2.[89]*)
- # TLS was introduced in the Solaris 9 4/04 release but
- # we do not enable it by default on Solaris 9 either.
- if test "x$enable_tls" = xyes ; then
- on_solaris=yes
- else
- enable_tls=no;
- fi
- ;;
i[34567]86-*-solaris2.*)
on_solaris=yes
+ tga_func=___tls_get_addr
;;
*)
on_solaris=no
@@ -2913,17 +2905,9 @@ foo: .long 25
;;
sparc*-*-*)
case "$target" in
- sparc*-sun-solaris2.[89]*)
- # TLS was introduced in the Solaris 9 4/04 release but
- # we do not enable it by default on Solaris 9 either.
- if test "x$enable_tls" = xyes ; then
- on_solaris=yes
- else
- enable_tls=no;
- fi
- ;;
sparc*-sun-solaris2.*)
on_solaris=yes
+ tga_func=__tls_get_addr
;;
*)
on_solaris=no
@@ -2931,32 +2915,17 @@ foo: .long 25
esac
if test x$on_solaris = xyes && test x$gas_flag = xno; then
conftest_s='
- .section ".tdata",#alloc,#write,#tls
-foo: .long 25
- .text
- sethi %tgd_hi22(foo), %o0
- add %o0, %tgd_lo10(foo), %o1
- add %l7, %o1, %o0, %tgd_add(foo)
- call __tls_get_addr, %tgd_call(foo)
- sethi %tldm_hi22(foo), %l1
- add %l1, %tldm_lo10(foo), %l2
- add %l7, %l2, %o0, %tldm_add(foo)
- call __tls_get_addr, %tldm_call(foo)
- sethi %tldo_hix22(foo), %l3
- xor %l3, %tldo_lox10(foo), %l4
- add %o0, %l4, %l5, %tldo_add(foo)
- sethi %tie_hi22(foo), %o3
- add %o3, %tie_lo10(foo), %o3
- ld [%l7 + %o3], %o2, %tie_ld(foo)
- add %g7, %o2, %o4, %tie_add(foo)
- sethi %tle_hix22(foo), %l1
- xor %l1, %tle_lox10(foo), %o5
- ld [%g7 + %o5], %o1'
+ .section ".tdata",#alloc,#write,#tls'
tls_first_major=0
tls_first_minor=0
else
conftest_s='
- .section ".tdata","awT",@progbits
+ .section ".tdata","awT",@progbits'
+ tls_first_major=2
+ tls_first_minor=14
+ tls_as_opt="-32 --fatal-warnings"
+ fi
+ conftest_s="$conftest_s
foo: .long 25
.text
sethi %tgd_hi22(foo), %o0
@@ -2976,11 +2945,7 @@ foo: .long 25
add %g7, %o2, %o4, %tie_add(foo)
sethi %tle_hix22(foo), %l1
xor %l1, %tle_lox10(foo), %o5
- ld [%g7 + %o5], %o1'
- tls_first_major=2
- tls_first_minor=14
- tls_as_opt="-32 --fatal-warnings"
- fi
+ ld [%g7 + %o5], %o1"
;;
xtensa*-*-*)
conftest_s='
@@ -3007,9 +2972,95 @@ else
[$tls_first_major,$tls_first_minor,0], [$tls_as_opt], [$conftest_s],,
[set_have_as_tls=yes])
fi
+case "$target" in
+ # TLS was introduced in the Solaris 9 FCS release and backported to
+ # Solaris 8 patches. Support for GNU-style TLS on x86 was only
+ # introduced in Solaris 9 4/04, replacing the earlier Sun style that Sun
+ # ld and GCC don't support any longer.
+ *-*-solaris2.*)
+ AC_MSG_CHECKING(linker and ld.so.1 TLS support)
+ ld_tls_support=no
+ # Check ld and ld.so.1 TLS support.
+ if echo "$ld_ver" | grep GNU > /dev/null; then
+ # Assume all interesting versions of GNU ld have TLS support.
+ # FIXME: still need ld.so.1 support, i.e. ld version checks below.
+ ld_tls_support=yes
+ else
+ case "$target" in
+ # Solaris 8/x86 ld has GNU style TLS support since version 1.280.
+ i?86-*-solaris2.8)
+ min_tls_ld_vers_minor=280
+ ;;
+ # Solaris 8/SPARC ld has TLS support since version 1.272.
+ sparc*-*-solaris2.8)
+ min_tls_ld_vers_minor=272
+ ;;
+ # Solaris 9/x86 ld has GNU style TLS support since version 1.374.
+ i?86-*-solaris2.9)
+ min_tls_ld_vers_minor=374
+ ;;
+ # Solaris 9/SPARC and Solaris 10+ ld have TLS support since FCS.
+ sparc*-*-solaris2.9 | *-*-solaris2.1[[0-9]]*)
+ min_tls_ld_vers_minor=343
+ ;;
+ esac
+ if test "$ls_vers_major" -gt 1 || \
+ test "$ld_vers_minor" -ge "$min_tls_ld_vers_minor"; then
+ ld_tls_support=yes
+ else
+ set_have_as_tls=no
+ fi
+ fi
+ AC_MSG_RESULT($ld_tls_support)
+
+ save_LIBS="$LIBS"
+ save_LDFLAGS="$LDFLAGS"
+ LIBS=
+ LDFLAGS=
+
+ AC_MSG_CHECKING(alternate thread library)
+ case "$target" in
+ # TLS support was backported to Solaris 8 patches, but only lives in
+ # the alternate thread library which became the default in Solaris 9.
+ # We want to always use that, irrespective of TLS support.
+ *-*-solaris2.8)
+ # Take multilib subdir into account. There's no spec to handle
+ # this. The 64 symlink exists since Solaris 8.
+ lwp_dir=/usr/lib/lwp
+ lwp_spec="-L$lwp_dir%{m64:/64} -R$lwp_dir%{m64:/64}"
+ LDFLAGS="-L$lwp_dir -R$lwp_dir"
+ ;;
+ *-*-solaris2*)
+ lwp_dir="none"
+ lwp_spec=""
+ ;;
+ esac
+ # Always define LIB_THREAD_LDFLAGS_SPEC, even without TLS support.
+ AC_DEFINE_UNQUOTED(LIB_THREAD_LDFLAGS_SPEC, "$lwp_spec",
+ [Define to the linker flags to use for -pthread.])
+ AC_MSG_RESULT($lwp_dir)
+
+ AC_MSG_CHECKING(library containing $tga_func)
+ # Before Solaris 10, __tls_get_addr (SPARC/x64) resp. ___tls_get_addr
+ # (32-bit x86) only lived in libthread, so check for that. Keep
+ # set_have_as_tls if found, disable if not.
+ AC_SEARCH_LIBS([$tga_func], [thread],, [set_have_as_tls=no])
+ # Clear LIBS if we cannot support TLS.
+ if test $set_have_as_tls = no; then
+ LIBS=
+ fi
+ # Always define LIB_TLS_SPEC, even without TLS support.
+ AC_DEFINE_UNQUOTED(LIB_TLS_SPEC, "$LIBS",
+ [Define to the library containing __tls_get_addr/___tls_get_addr.])
+ AC_MSG_RESULT($LIBS)
+
+ LIBS="$save_LIBS"
+ LDFLAGS="$save_LDFLAGS"
+ ;;
+esac
if test $set_have_as_tls = yes ; then
AC_DEFINE(HAVE_AS_TLS, 1,
- [Define if your assembler supports thread-local storage.])
+ [Define if your assembler and linker support thread-local storage.])
fi
# Target-specific assembler checks.
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 7580dee4ec1..648f0977154 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -4165,6 +4165,29 @@ There are patches for Solaris 8 (117350-12 or newer for SPARC,
117351-12 or newer for Intel) and Solaris 9 (117171-11 or newer for
SPARC, 117172-11 or newer for Intel) that address this problem.
+Solaris~8 provides an alternate implementation of the thread libraries,
+@samp{libpthread} and @samp{libthread}. They are required for TLS
+support and have been made the default in Solaris~9, so they are always
+used on Solaris~8.
+
+Thread-local storage (TLS) is supported in Solaris~8 and 9, but requires
+some patches. The @samp{libthread} patches provide the
+@code{__tls_get_addr} (SPARC, 64-bit x86) resp.@ @code{___tls_get_addr}
+(32-bit x86) functions. On Solaris~8, you need 108993-26 or newer on
+SPARC, 108994-26 or newer on Intel. On Solaris~9, the necessary support
+on SPARC is present since FCS, while 114432-05 or newer is reqired on
+Intel. Additionally, on Solaris~8, patch 109147-14 or newer on SPARC or
+109148-22 or newer on Intel are required for the Sun @command{ld} and
+runtime linker (@command{ld.so.1}) support. Again, Solaris~9/SPARC
+works since FCS, while 113986-02 is required on Intel. The linker
+patches must be installed even if GNU @command{ld} is used. Sun
+@command{as} in Solaris~8 and 9 doesn't support the necessary
+relocations, so GNU @command{as} must be used. The @command{configure}
+script checks for those prerequisites and automatically enables TLS
+support if they are met. Although those minimal patch versions should
+work, it is recommended to use the latest patch versions which include
+additional bug fixes.
+
@html
<hr />
@end html
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index 33f2389db2c..e78158ffc96 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1879,6 +1879,16 @@ The supported values of @var{feature} for directive @code{dg-add-options}
are:
@table @code
+@item arm_neon
+NEON support. Only ARM targets support this feature, and only then
+in certain modes; see the @ref{arm_neon_ok,,arm_neon_ok effective target
+keyword}.
+
+@item arm_neon_fp16
+NEON and half-precision floating point support. Only ARM targets
+support this feature, and only then in certain modes; see
+the @ref{arm_neon_ok,,arm_neon_fp16_ok effective target keyword}.
+
@item bind_pic_locally
Add the target-specific flags needed to enable functions to bind
locally when using pic/PIC passes in the testsuite.
@@ -1894,15 +1904,8 @@ compliance mode.
@code{mips16} function attributes.
Only MIPS targets support this feature, and only then in certain modes.
-@item arm_neon
-NEON support. Only ARM targets support this feature, and only then
-in certain modes; see the @ref{arm_neon_ok,,arm_neon_ok effective target
-keyword}.
-
-@item arm_neon_fp16
-NEON and half-precision floating point support. Only ARM targets
-support this feature, and only then in certain modes; see
-the @ref{arm_neon_ok,,arm_neon_fp16_ok effective target keyword}.
+@item tls
+Add the target-specific flags needed to use thread-local storage.
@end table
@node Require Support
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 578b4d0f653..59cd07429de 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,22 @@
+2010-07-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * lib/target-supports.exp (add_options_for_tls): New proc.
+ * g++.dg/tls/static-1.C: Use dg-add-options tls.
+ * g++.dg/tls/static-1a.cc: Likewise.
+ * gcc.dg/tls/emutls-1.c: Likewise.
+ * gcc.dg/tls/opt-11.c: Likewise.
+ * gcc.dg/tls/opt-12.c: Likewise.
+ * gcc.dg/tls/pr24428-2.c: Likewise.
+ * gcc.dg/tls/pr24428.c: Likewise.
+ * obj-c++.dg/tls/static-1.mm: Likewise.
+ * obj-c++.dg/torture/tls/thr-init-1.mm: Likewise.
+ * obj-c++.dg/torture/tls/thr-init-2.mm: Likewise.
+ * obj-c++.dg/torture/tls/thr-init-3.mm: Likewise.
+ * objc.dg/torture/tls/thr-init-2.m: Likewise.
+ * objc.dg/torture/tls/thr-init-3.m: Likewise.
+ * objc.dg/torture/tls/thr-init.m: Likewise.
+ * gcc.dg/lto/20090210_0.c: Add -pthread for *-*-solaris2.[89].
+
2010-07-23 Uros Bizjak <ubizjak@gmail.com>
* gcc.dg/tree-ssa/loadpre6.c: Cleanup fre dump file.
diff --git a/gcc/testsuite/g++.dg/tls/static-1.C b/gcc/testsuite/g++.dg/tls/static-1.C
index 027a9429766..506b0fcf7a0 100644
--- a/gcc/testsuite/g++.dg/tls/static-1.C
+++ b/gcc/testsuite/g++.dg/tls/static-1.C
@@ -1,6 +1,7 @@
// { dg-do run }
// { dg-options "-O2" }
// { dg-require-effective-target tls_runtime }
+// { dg-add-options tls }
// { dg-additional-sources "static-1a.cc" }
extern "C" void abort ();
diff --git a/gcc/testsuite/g++.dg/tls/static-1a.cc b/gcc/testsuite/g++.dg/tls/static-1a.cc
index 47a7a2717c0..1c6109f861e 100644
--- a/gcc/testsuite/g++.dg/tls/static-1a.cc
+++ b/gcc/testsuite/g++.dg/tls/static-1a.cc
@@ -1,6 +1,7 @@
// { dg-do run }
// { dg-options "-O2" }
// { dg-require-effective-target tls_runtime }
+// { dg-add-options tls }
// { dg-additional-sources "static-1a.cc" }
struct A
diff --git a/gcc/testsuite/gcc.dg/lto/20090210_0.c b/gcc/testsuite/gcc.dg/lto/20090210_0.c
index c588e8a2778..2c858a67d32 100644
--- a/gcc/testsuite/gcc.dg/lto/20090210_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20090210_0.c
@@ -1,5 +1,7 @@
/* { dg-lto-do run } */
/* { dg-suppress-ld-options {-fPIC} } */
+/* { dg-require-effective-target tls } */
+/* { dg-extra-ld-options "-pthread" { target *-*-solaris2.[89] } } */
int foo (int x)
{
return x;
diff --git a/gcc/testsuite/gcc.dg/tls/emutls-1.c b/gcc/testsuite/gcc.dg/tls/emutls-1.c
index a0dea509434..3b3577c895e 100644
--- a/gcc/testsuite/gcc.dg/tls/emutls-1.c
+++ b/gcc/testsuite/gcc.dg/tls/emutls-1.c
@@ -1,5 +1,6 @@
/* { dg-do run { target *-wrs-vxworks } } */
/* { dg-require-effective-target tls } */
+/* { dg-add-options tls } */
/* vxworks' TLS model requires no extra padding on the tls proxy
objects. */
diff --git a/gcc/testsuite/gcc.dg/tls/opt-11.c b/gcc/testsuite/gcc.dg/tls/opt-11.c
index 3739645257a..0069c484a2c 100644
--- a/gcc/testsuite/gcc.dg/tls/opt-11.c
+++ b/gcc/testsuite/gcc.dg/tls/opt-11.c
@@ -1,5 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target tls_runtime } */
+/* { dg-add-options tls } */
extern void abort (void);
extern void *memset (void *, int, __SIZE_TYPE__);
diff --git a/gcc/testsuite/gcc.dg/tls/opt-12.c b/gcc/testsuite/gcc.dg/tls/opt-12.c
index 7c6e73430a1..7b9e498a5a8 100644
--- a/gcc/testsuite/gcc.dg/tls/opt-12.c
+++ b/gcc/testsuite/gcc.dg/tls/opt-12.c
@@ -2,6 +2,7 @@
/* { dg-do run } */
/* { dg-options "-O2 -fpic" } */
/* { dg-require-effective-target tls_runtime } */
+/* { dg-add-options tls } */
/* { dg-require-effective-target fpic } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/tls/pr24428-2.c b/gcc/testsuite/gcc.dg/tls/pr24428-2.c
index a0ceecc0624..b147f60d6a9 100644
--- a/gcc/testsuite/gcc.dg/tls/pr24428-2.c
+++ b/gcc/testsuite/gcc.dg/tls/pr24428-2.c
@@ -1,6 +1,7 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target tls_runtime } */
+/* { dg-add-options tls } */
__thread double thrtest[81];
int main ()
diff --git a/gcc/testsuite/gcc.dg/tls/pr24428.c b/gcc/testsuite/gcc.dg/tls/pr24428.c
index ecb747ede6d..6439698775a 100644
--- a/gcc/testsuite/gcc.dg/tls/pr24428.c
+++ b/gcc/testsuite/gcc.dg/tls/pr24428.c
@@ -1,6 +1,7 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target tls_runtime } */
+/* { dg-add-options tls } */
__thread double thrtest[81];
int main ()
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 9fb18d16715..b3123442837 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -569,6 +569,24 @@ proc check_effective_target_pcc_bitfield_type_matters { } {
}]
}
+# Add to FLAGS all the target-specific flags needed to use thread-local storage.
+
+proc add_options_for_tls { flags } {
+ # On Solaris 8 and 9, __tls_get_addr/___tls_get_addr only lives in
+ # libthread, so always pass -pthread for native TLS.
+ # Need to duplicate native TLS check from
+ # check_effective_target_tls_native to avoid recursion.
+ if { [istarget *-*-solaris2.\[89\]*] &&
+ [check_no_messages_and_pattern tls_native "!emutls" assembly {
+ __thread int i;
+ int f (void) { return i; }
+ void g (int j) { i = j; }
+ }] } {
+ return "$flags -pthread"
+ }
+ return $flags
+}
+
# Return 1 if thread local storage (TLS) is supported, 0 otherwise.
proc check_effective_target_tls {} {
diff --git a/gcc/testsuite/obj-c++.dg/tls/static-1.mm b/gcc/testsuite/obj-c++.dg/tls/static-1.mm
index 2d20b8881f9..6d58010eb0c 100644
--- a/gcc/testsuite/obj-c++.dg/tls/static-1.mm
+++ b/gcc/testsuite/obj-c++.dg/tls/static-1.mm
@@ -1,5 +1,6 @@
// { dg-do run }
// { dg-require-effective-target tls }
+// { dg-add-options tls }
// { dg-additional-sources "static-1a.mm" }
extern "C" {
diff --git a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm
index 056073789a5..1ec8623f3ee 100644
--- a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm
+++ b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm
@@ -1,5 +1,6 @@
// { dg-do run }
// { dg-require-effective-target tls }
+// { dg-add-options tls }
/* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */
extern "C" {
extern void abort ();
diff --git a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm
index 233cf20e132..4e5baac790d 100644
--- a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm
+++ b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm
@@ -1,5 +1,6 @@
// { dg-do run }
// { dg-require-effective-target tls }
+// { dg-add-options tls }
/* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */
extern "C" {
@@ -42,4 +43,4 @@ int main (int ac, char *av[])
abort () ;
return 0;
-} \ No newline at end of file
+}
diff --git a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm
index e106a9fe878..1515d250057 100644
--- a/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm
+++ b/gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm
@@ -1,5 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target tls } */
+/* { dg-add-options tls } */
/* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.mm" } */
diff --git a/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m b/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m
index b637e2544e6..9a946bb444d 100644
--- a/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m
+++ b/gcc/testsuite/objc.dg/torture/tls/thr-init-2.m
@@ -1,5 +1,6 @@
// { dg-do run }
// { dg-require-effective-target tls }
+// { dg-add-options tls }
/* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */
extern void _exit(int);
diff --git a/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m b/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m
index f30315d8819..6ac977c9bae 100644
--- a/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m
+++ b/gcc/testsuite/objc.dg/torture/tls/thr-init-3.m
@@ -1,5 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target tls } */
+/* { dg-add-options tls } */
/* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-additional-sources "../../../objc-obj-c++-shared/Object1.m" } */
diff --git a/gcc/testsuite/objc.dg/torture/tls/thr-init.m b/gcc/testsuite/objc.dg/torture/tls/thr-init.m
index 6c3bad1b9bb..286a4706f06 100644
--- a/gcc/testsuite/objc.dg/torture/tls/thr-init.m
+++ b/gcc/testsuite/objc.dg/torture/tls/thr-init.m
@@ -1,5 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target tls } */
+/* { dg-add-options tls } */
/* { dg-skip-if "PR44140" { *-*-* } { "-flto" "-fwhopr" } { "" } } */
extern void _exit(int);
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 4ac37eb56c0..127b500b355 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,7 @@
+2010-07-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.tgt (*-*-solaris2.[56]*): Removed.
+
2010-07-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* acinclude.m4 (LIBGOMP_ENABLE_SYMVERS): Handle sun style.
diff --git a/libgomp/configure.tgt b/libgomp/configure.tgt
index 427d8d3772d..16bb888862e 100644
--- a/libgomp/configure.tgt
+++ b/libgomp/configure.tgt
@@ -116,11 +116,6 @@ case "${target}" in
config_path="mingw32 posix"
;;
- *-*-solaris2.[56]*)
- config_path="posix95 posix"
- XLDFLAGS="${XLDFLAGS} -lposix4"
- ;;
-
*-*-darwin*)
config_path="bsd posix"
;;
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index de24a9ece25..7d01621d390 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,10 @@
+2010-07-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac (*-*-solaris2.8): Use alternate thread library.
+ Add libthread.
+ (*-*-solaris2.9): Use libthread.
+ * configure: Regenerate.
+
2010-07-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* include/sparc-signal.h: Renamed to ...
diff --git a/libjava/configure b/libjava/configure
index 89d5b6c4a8d..8ccfa24cc12 100755
--- a/libjava/configure
+++ b/libjava/configure
@@ -20712,6 +20712,19 @@ case "$THREADS" in
THREADLIBS='-lpthread -lrt'
THREADSPEC='-lpthread -lrt'
;;
+ *-*-solaris2.8)
+ # Always use alternate thread library on Solaris 8. Need libthread
+ # for TLS support.
+ # Need -Wl,-R to get it through libtool ...
+ THREADLIBS='-L/usr/lib/lwp$(MULTISUBDIR) -Wl,-R -Wl,/usr/lib/lwp$(MULTISUBDIR) -lpthread -lthread'
+ # ... while ld only accepts -R.
+ THREADSPEC='-L/usr/lib/lwp%{m64:/64} -R/usr/lib/lwp%{m64:/64} -lpthread -lthread'
+ ;;
+ *-*-solaris2.9)
+ # As on Solaris 8, need libthread for TLS support.
+ THREADLIBS='-lpthread -lthread'
+ THREADSPEC='-lpthread -lthread'
+ ;;
*)
THREADLIBS=-lpthread
THREADSPEC=-lpthread
diff --git a/libjava/configure.ac b/libjava/configure.ac
index 477766ae1ca..125e9ce9b46 100644
--- a/libjava/configure.ac
+++ b/libjava/configure.ac
@@ -1064,6 +1064,19 @@ case "$THREADS" in
THREADLIBS='-lpthread -lrt'
THREADSPEC='-lpthread -lrt'
;;
+ *-*-solaris2.8)
+ # Always use alternate thread library on Solaris 8. Need libthread
+ # for TLS support.
+ # Need -Wl,-R to get it through libtool ...
+ THREADLIBS='-L/usr/lib/lwp$(MULTISUBDIR) -Wl,-R -Wl,/usr/lib/lwp$(MULTISUBDIR) -lpthread -lthread'
+ # ... while ld only accepts -R.
+ THREADSPEC='-L/usr/lib/lwp%{m64:/64} -R/usr/lib/lwp%{m64:/64} -lpthread -lthread'
+ ;;
+ *-*-solaris2.9)
+ # As on Solaris 8, need libthread for TLS support.
+ THREADLIBS='-lpthread -lthread'
+ THREADSPEC='-lpthread -lthread'
+ ;;
*)
THREADLIBS=-lpthread
THREADSPEC=-lpthread