From 16c9d3b171f9e89b23d58db8ab05efa3e4cea872 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Fri, 23 Jul 2010 17:58:57 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 22 ++ gcc/config.in | 14 +- gcc/config/sol2.h | 11 +- gcc/configure | 212 ++++++++++++++---- gcc/configure.ac | 143 ++++++++---- gcc/doc/install.texi | 23 ++ gcc/doc/sourcebuild.texi | 21 +- gcc/testsuite/ChangeLog | 19 ++ gcc/testsuite/g++.dg/tls/static-1.C | 1 + gcc/testsuite/g++.dg/tls/static-1a.cc | 1 + gcc/testsuite/gcc.dg/lto/20090210_0.c | 2 + gcc/testsuite/gcc.dg/tls/emutls-1.c | 1 + gcc/testsuite/gcc.dg/tls/opt-11.c | 1 + gcc/testsuite/gcc.dg/tls/opt-12.c | 1 + gcc/testsuite/gcc.dg/tls/pr24428-2.c | 1 + gcc/testsuite/gcc.dg/tls/pr24428.c | 1 + gcc/testsuite/lib/target-supports.exp | 18 ++ gcc/testsuite/obj-c++.dg/tls/static-1.mm | 1 + .../obj-c++.dg/torture/tls/thr-init-1.mm | 1 + .../obj-c++.dg/torture/tls/thr-init-2.mm | 3 +- .../obj-c++.dg/torture/tls/thr-init-3.mm | 1 + .../objc.dg/torture/tls/thr-init-2.m | 1 + .../objc.dg/torture/tls/thr-init-3.m | 1 + gcc/testsuite/objc.dg/torture/tls/thr-init.m | 1 + libgomp/ChangeLog | 4 + libgomp/configure.tgt | 5 - libjava/ChangeLog | 7 + libjava/configure | 13 ++ libjava/configure.ac | 13 ++ 29 files changed, 431 insertions(+), 112 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1d9c977cd5f5..61abdeb8ffad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2010-07-23 Rainer Orth + + * 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 * tree.h (struct tree_base): Add nameless_flag bitfield. diff --git a/gcc/config.in b/gcc/config.in index e140a719f7e8..c451c5378e05 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 7b7ce2bfbab2..805b32fe89c5 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 bf537ecf502b..fedfaa7f090c 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 57aeac62468d..143db7e3940f 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 7580dee4ec14..648f0977154f 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
@end html diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 33f2389db2cb..e78158ffc96d 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 578b4d0f653c..59cd07429ded 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,22 @@ +2010-07-23 Rainer Orth + + * 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 * 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 027a94297662..506b0fcf7a0e 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 47a7a2717c0c..1c6109f861ec 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 c588e8a27789..2c858a67d326 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 a0dea5094347..3b3577c895ef 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 3739645257ab..0069c484a2c4 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 7c6e73430a18..7b9e498a5a8d 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 a0ceecc06243..b147f60d6a91 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 ecb747ede6de..6439698775a8 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 9fb18d16715a..b3123442837e 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 2d20b8881f94..6d58010eb0ca 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 056073789a58..1ec8623f3ee9 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 233cf20e132f..4e5baac790df 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 e106a9fe8780..1515d2500573 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 b637e2544e68..9a946bb444da 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 f30315d88198..6ac977c9bae6 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 6c3bad1b9bb3..286a4706f06f 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 4ac37eb56c04..127b500b355e 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,7 @@ +2010-07-23 Rainer Orth + + * configure.tgt (*-*-solaris2.[56]*): Removed. + 2010-07-05 Rainer Orth * acinclude.m4 (LIBGOMP_ENABLE_SYMVERS): Handle sun style. diff --git a/libgomp/configure.tgt b/libgomp/configure.tgt index 427d8d3772dd..16bb888862e6 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 de24a9ece25c..7d01621d3905 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2010-07-23 Rainer Orth + + * configure.ac (*-*-solaris2.8): Use alternate thread library. + Add libthread. + (*-*-solaris2.9): Use libthread. + * configure: Regenerate. + 2010-07-15 Rainer Orth * include/sparc-signal.h: Renamed to ... diff --git a/libjava/configure b/libjava/configure index 89d5b6c4a8dc..8ccfa24cc126 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 477766ae1ca0..125e9ce9b46c 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 -- 2.39.5