re PR target/18788 ("-pthreads" option with "-shared" does not cause libpthread.so...
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Fri, 23 Jul 2010 17:58:57 +0000 (17:58 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Fri, 23 Jul 2010 17:58:57 +0000 (17:58 +0000)
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

29 files changed:
gcc/ChangeLog
gcc/config.in
gcc/config/sol2.h
gcc/configure
gcc/configure.ac
gcc/doc/install.texi
gcc/doc/sourcebuild.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tls/static-1.C
gcc/testsuite/g++.dg/tls/static-1a.cc
gcc/testsuite/gcc.dg/lto/20090210_0.c
gcc/testsuite/gcc.dg/tls/emutls-1.c
gcc/testsuite/gcc.dg/tls/opt-11.c
gcc/testsuite/gcc.dg/tls/opt-12.c
gcc/testsuite/gcc.dg/tls/pr24428-2.c
gcc/testsuite/gcc.dg/tls/pr24428.c
gcc/testsuite/lib/target-supports.exp
gcc/testsuite/obj-c++.dg/tls/static-1.mm
gcc/testsuite/obj-c++.dg/torture/tls/thr-init-1.mm
gcc/testsuite/obj-c++.dg/torture/tls/thr-init-2.mm
gcc/testsuite/obj-c++.dg/torture/tls/thr-init-3.mm
gcc/testsuite/objc.dg/torture/tls/thr-init-2.m
gcc/testsuite/objc.dg/torture/tls/thr-init-3.m
gcc/testsuite/objc.dg/torture/tls/thr-init.m
libgomp/ChangeLog
libgomp/configure.tgt
libjava/ChangeLog
libjava/configure
libjava/configure.ac

index 1d9c977..61abdeb 100644 (file)
@@ -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.
index e140a71..c451c53 100644 (file)
 #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
 #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
index 7b7ce2b..805b32f 100644 (file)
@@ -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"
index bf537ec..fedfaa7 100755 (executable)
@@ -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
index 57aeac6..143db7e 100644 (file)
@@ -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.
index 7580dee..648f097 100644 (file)
@@ -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
index 33f2389..e78158f 100644 (file)
@@ -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
index 578b4d0..59cd074 100644 (file)
@@ -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.
index 027a942..506b0fc 100644 (file)
@@ -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 ();
index 47a7a27..1c6109f 100644 (file)
@@ -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
index c588e8a..2c858a6 100644 (file)
@@ -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;
index a0dea50..3b3577c 100644 (file)
@@ -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.  */
index 3739645..0069c48 100644 (file)
@@ -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__);
index 7c6e734..7b9e498 100644 (file)
@@ -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);
index a0ceecc..b147f60 100644 (file)
@@ -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 ()
index ecb747e..6439698 100644 (file)
@@ -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 ()
index 9fb18d1..b312344 100644 (file)
@@ -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 {} {
index 2d20b88..6d58010 100644 (file)
@@ -1,5 +1,6 @@
 // { dg-do run }
 // { dg-require-effective-target tls }
+// { dg-add-options tls }
 // { dg-additional-sources "static-1a.mm" }
 
 extern "C" {
index 0560737..1ec8623 100644 (file)
@@ -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 ();
index 233cf20..4e5baac 100644 (file)
@@ -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
+}
index e106a9f..1515d25 100644 (file)
@@ -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" } */
index b637e25..9a946bb 100644 (file)
@@ -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);
index f30315d..6ac977c 100644 (file)
@@ -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" } */
index 6c3bad1..286a470 100644 (file)
@@ -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);
index 4ac37eb..127b500 100644 (file)
@@ -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.
index 427d8d3..16bb888 100644 (file)
@@ -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"
        ;;
index de24a9e..7d01621 100644 (file)
@@ -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 ...
index 89d5b6c..8ccfa24 100755 (executable)
@@ -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
index 477766a..125e9ce 100644 (file)
@@ -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