Disable local dynamic TLS model on Solaris/x86 if as/ld cannot handle it
authorro <ro@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Mar 2014 11:30:40 +0000 (11:30 +0000)
committerro <ro@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Mar 2014 11:30:40 +0000 (11:30 +0000)
* configure.ac (TLS_SECTION_ASM_FLAG): Save as tls_section_flag.
(LIB_TLS_SPEC): Save as ld_tls_libs.
(HAVE_AS_IX86_TLSLDMPLT): Define as 1/0.
(HAVE_AS_IX86_TLSLDM): New test.
* configure, config.in: Regenerate.
* config/i386/i386.c (legitimize_tls_address): Fall back to
TLS_MODEL_GLOBAL_DYNAMIC on 32-bit Solaris/x86 if tool chain
cannot support TLS_MODEL_LOCAL_DYNAMIC.
* config/i386/i386.md (*tls_local_dynamic_base_32_gnu): Use if
instead of #ifdef in HAVE_AS_IX86_TLSLDMPLT test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208398 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config.in
gcc/config/i386/i386.c
gcc/config/i386/i386.md
gcc/configure
gcc/configure.ac

index dca1085..feef2ce 100644 (file)
@@ -1,3 +1,16 @@
+2014-03-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * configure.ac (TLS_SECTION_ASM_FLAG): Save as tls_section_flag.
+       (LIB_TLS_SPEC): Save as ld_tls_libs.
+       (HAVE_AS_IX86_TLSLDMPLT): Define as 1/0.
+       (HAVE_AS_IX86_TLSLDM): New test.
+       * configure, config.in: Regenerate.
+       * config/i386/i386.c (legitimize_tls_address): Fall back to
+       TLS_MODEL_GLOBAL_DYNAMIC on 32-bit Solaris/x86 if tool chain
+       cannot support TLS_MODEL_LOCAL_DYNAMIC.
+       * config/i386/i386.md (*tls_local_dynamic_base_32_gnu): Use if
+       instead of #ifdef in HAVE_AS_IX86_TLSLDMPLT test.
+
 2014-03-07  Paulo Matos  <paulo@matos-sorge.com>
 
        * common.opt (fira-loop-pressure): Mark as optimization.
index 5aa3221..af02866 100644 (file)
 #endif
 
 
-/* Define if your assembler and linker support @tlsldmplt. */
+/* Define to 1 if your assembler and linker support @tlsldm. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_AS_IX86_TLSLDM
+#endif
+
+
+/* Define to 1 if your assembler and linker support @tlsldmplt. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_AS_IX86_TLSLDMPLT
 #endif
index 38b41a9..9e33d53 100644 (file)
@@ -13396,6 +13396,13 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
   enum machine_mode tp_mode = Pmode;
   int type;
 
+  /* Fall back to global dynamic model if tool chain cannot support local
+     dynamic.  */
+  if (TARGET_SUN_TLS && !TARGET_64BIT
+      && !HAVE_AS_IX86_TLSLDMPLT && !HAVE_AS_IX86_TLSLDM
+      && model == TLS_MODEL_LOCAL_DYNAMIC)
+    model = TLS_MODEL_GLOBAL_DYNAMIC;
+
   switch (model)
     {
     case TLS_MODEL_GLOBAL_DYNAMIC:
index 4ccb3a5..ea1d85f 100644 (file)
   output_asm_insn
     ("lea{l}\t{%&@tlsldm(%1), %0|%0, %&@tlsldm[%1]}", operands);
   if (TARGET_SUN_TLS)
-#ifdef HAVE_AS_IX86_TLSLDMPLT
-    return "call\t%&@tlsldmplt";
-#else
-    return "call\t%p2@plt";
-#endif
+    {
+      if (HAVE_AS_IX86_TLSLDMPLT)
+       return "call\t%&@tlsldmplt";
+      else
+       return "call\t%p2@plt";
+    }
   return "call\t%P2";
 }
   [(set_attr "type" "multi")
index cab3e92..297238d 100755 (executable)
@@ -10970,6 +10970,10 @@ else
     force_sjlj_exceptions=yes
     enableval=yes
     ;;
+  lm32*-*-*)
+     force_sjlj_exceptions=yes
+     enableval=yes
+     ;;
   *)
     force_sjlj_exceptions=no
     ;;
@@ -17923,7 +17927,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 17926 "configure"
+#line 17930 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18029,7 +18033,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18032 "configure"
+#line 18036 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -23298,6 +23302,7 @@ foo:    .long   25
        .section .tdata,"awt",@progbits'
       tls_first_major=0
       tls_first_minor=0
+      tls_section_flag=t
 
 $as_echo "#define TLS_SECTION_ASM_FLAG 't'" >>confdefs.h
 
@@ -23306,6 +23311,7 @@ $as_echo "#define TLS_SECTION_ASM_FLAG 't'" >>confdefs.h
        .section ".tdata","awT",@progbits'
       tls_first_major=2
       tls_first_minor=14
+      tls_section_flag=T
       tls_as_opt="--fatal-warnings"
     fi
     conftest_s="$conftest_s
@@ -23336,6 +23342,7 @@ foo:    .long   25
        movq    $foo@TPOFF, %rax'
        tls_first_major=2
        tls_first_minor=14
+       tls_section_flag=T
        tls_as_opt=--fatal-warnings
        ;;
   ia64-*-*)
@@ -23782,6 +23789,7 @@ else
   set_have_as_tls=no
 fi
 
+    ld_tls_libs="$LIBS"
     # Clear LIBS if we cannot support TLS.
     if test $set_have_as_tls = no; then
       LIBS=
@@ -25205,11 +25213,73 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_ix86_tlsldmplt" >&5
 $as_echo "$gcc_cv_as_ix86_tlsldmplt" >&6; }
-if test $gcc_cv_as_ix86_tlsldmplt = yes; then
 
-$as_echo "#define HAVE_AS_IX86_TLSLDMPLT 1" >>confdefs.h
 
+cat >>confdefs.h <<_ACEOF
+#define HAVE_AS_IX86_TLSLDMPLT `if test $gcc_cv_as_ix86_tlsldmplt = yes; then echo 1; else echo 0; fi`
+_ACEOF
+
+
+    # Enforce 32-bit output with gas and gld.
+    if test x$gas = xyes; then
+      as_ix86_tls_ldm_opt="--32"
+    fi
+    if echo "$ld_ver" | grep GNU > /dev/null; then
+      if $gcc_cv_ld -V 2>/dev/null | grep elf_i386_sol2 > /dev/null; then
+        ld_ix86_tls_ldm_opt="-melf_i386_sol2"
+      else
+        ld_ix86_tls_ldm_opt="-melf_i386"
+      fi
+    fi
+    conftest_s='
+       .section .text,"ax",@progbits
+        .globl  _start
+        .type   _start, @function
+_start:
+       leal    value@tlsldm(%ebx), %eax
+       call    ___tls_get_addr@plt
+
+        .section .tdata,"aw'$tls_section_flag'",@progbits
+        .type  value, @object
+value:'
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for R_386_TLS_LDM reloc" >&5
+$as_echo_n "checking assembler for R_386_TLS_LDM reloc... " >&6; }
+if test "${gcc_cv_as_ix86_tlsldm+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  gcc_cv_as_ix86_tlsldm=no
+  if test x$gcc_cv_as != x; then
+    $as_echo "$conftest_s" > conftest.s
+    if { ac_try='$gcc_cv_as $gcc_cv_as_flags $as_ix86_tls_ldm_opt -o conftest.o conftest.s >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+    then
+       if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
+           && $gcc_cv_ld $ld_ix86_tls_ldm_opt -o conftest conftest.o $ld_tls_libs -lc > /dev/null 2>&1; then
+          if $gcc_cv_objdump -d conftest 2>/dev/null | grep nop > /dev/null \
+             || dis conftest 2>/dev/null | grep nop > /dev/null; then
+            gcc_cv_as_ix86_tlsldm=yes
+          fi
+        fi
+        rm -f conftest
+    else
+      echo "configure: failed program was" >&5
+      cat conftest.s >&5
+    fi
+    rm -f conftest.o conftest.s
+  fi
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_ix86_tlsldm" >&5
+$as_echo "$gcc_cv_as_ix86_tlsldm" >&6; }
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_AS_IX86_TLSLDM `if test $gcc_cv_as_ix86_tlsldm = yes; then echo 1; else echo 0; fi`
+_ACEOF
+
 
     ;;
 
index 3d7a5c8..156d46c 100644 (file)
@@ -2973,6 +2973,7 @@ foo:      .long   25
        .section .tdata,"awt",@progbits'
       tls_first_major=0
       tls_first_minor=0
+      tls_section_flag=t
 changequote([,])dnl
       AC_DEFINE(TLS_SECTION_ASM_FLAG, 't',
 [Define to the flag used to mark TLS sections if the default (`T') doesn't work.])
@@ -2982,6 +2983,7 @@ changequote(,)dnl
        .section ".tdata","awT",@progbits'
       tls_first_major=2
       tls_first_minor=14
+      tls_section_flag=T
       tls_as_opt="--fatal-warnings"
     fi
     conftest_s="$conftest_s
@@ -3012,6 +3014,7 @@ foo:      .long   25
        movq    $foo@TPOFF, %rax'
        tls_first_major=2
        tls_first_minor=14
+       tls_section_flag=T
        tls_as_opt=--fatal-warnings
        ;;
   ia64-*-*)
@@ -3368,6 +3371,7 @@ case "$target" in
     # (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])
+    ld_tls_libs="$LIBS"
     # Clear LIBS if we cannot support TLS.
     if test $set_have_as_tls = no; then
       LIBS=
@@ -3924,9 +3928,48 @@ foo:     nop
         && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1; then
           gcc_cv_as_ix86_tlsldmplt=yes
         fi
-        rm -f conftest],
-      [AC_DEFINE(HAVE_AS_IX86_TLSLDMPLT, 1,
-        [Define if your assembler and linker support @tlsldmplt.])])
+        rm -f conftest])
+    AC_DEFINE_UNQUOTED(HAVE_AS_IX86_TLSLDMPLT,
+      [`if test $gcc_cv_as_ix86_tlsldmplt = yes; then echo 1; else echo 0; fi`],
+      [Define to 1 if your assembler and linker support @tlsldmplt.])
+
+    # Enforce 32-bit output with gas and gld.
+    if test x$gas = xyes; then
+      as_ix86_tls_ldm_opt="--32"
+    fi
+    if echo "$ld_ver" | grep GNU > /dev/null; then
+      if $gcc_cv_ld -V 2>/dev/null | grep elf_i386_sol2 > /dev/null; then
+        ld_ix86_tls_ldm_opt="-melf_i386_sol2"
+      else
+        ld_ix86_tls_ldm_opt="-melf_i386"
+      fi
+    fi
+    conftest_s='
+       .section .text,"ax",@progbits
+        .globl  _start
+        .type   _start, @function
+_start:      
+       leal    value@tlsldm(%ebx), %eax
+       call    ___tls_get_addr@plt
+
+        .section .tdata,"aw'$tls_section_flag'",@progbits
+        .type  value, @object
+value:'
+    gcc_GAS_CHECK_FEATURE([R_386_TLS_LDM reloc],
+        gcc_cv_as_ix86_tlsldm,,
+       [$as_ix86_tls_ldm_opt],
+       [$conftest_s],
+       [if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
+           && $gcc_cv_ld $ld_ix86_tls_ldm_opt -o conftest conftest.o $ld_tls_libs -lc > /dev/null 2>&1; then
+          if $gcc_cv_objdump -d conftest 2>/dev/null | grep nop > /dev/null \
+             || dis conftest 2>/dev/null | grep nop > /dev/null; then
+            gcc_cv_as_ix86_tlsldm=yes
+          fi
+        fi
+        rm -f conftest])
+    AC_DEFINE_UNQUOTED(HAVE_AS_IX86_TLSLDM,
+      [`if test $gcc_cv_as_ix86_tlsldm = yes; then echo 1; else echo 0; fi`],
+      [Define to 1 if your assembler and linker support @tlsldm.])
 
     ;;