build: Fix 32-bit TLS detection with 64-bit-default gas on Solaris/x86
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Tue, 5 May 2020 08:42:23 +0000 (10:42 +0200)
committerRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Tue, 5 May 2020 08:42:23 +0000 (10:42 +0200)
I've recently tested i386-pc-solaris2.11 bootstrap on Solaris 11/x86
with only the bundled tools (using /usr/gnu/bin/as from binutils 2.30 in
this case).  It failed compiling libgo/runtime/proc.c, creating invalid
assembly:

proc.s: Assembler messages:
proc.s:2092: Error: junk at end of line, first unrecognized character is `*'

        .globl  __emutls_v.*runtime.g

and several more errors.  This is completely unexpected since Solaris
does support TLS.  It turned out that 32-bit TLS detection in
gcc/configure had failed:

configure:25145: checking assembler for thread-local storage support
configure:25158: /usr/gnu/bin/as   --fatal-warnings -o conftest.o conftest.s >&5
conftest.s: Assembler messages:
conftest.s:6: Error: relocated field and relocation type differ in signedness
conftest.s:7: Error: @TLSLDM reloc is not supported with 64-bit output format
conftest.s:7: Error: junk `@tlsldm' after expression

which isn't unexpected given that the bundled gas has been configured
for x86_64-pc-solaris2.11, i.e. 64-bit-default.

This is easily fixed by explicitly passing --32 for the 32-bit case,
matching what is done for the 64-bit test.

Tested on i386-pc-solaris2.11 with 32-bit-default and 64-bit-default gas
as well as with /usr/bin/as, always correctly detecting TLS support.

* configure.ac <i[34567]86-*-*>: Add --32 to tls_as_opt on Solaris.
* configure: Regenerate.

gcc/ChangeLog
gcc/configure
gcc/configure.ac

index 34b56d9454fbf27d2b66ccd8baeaebc31acc35ca..aa904548808047af8c8f1e254831ad477b8b9c4d 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * configure.ac <i[34567]86-*-*>: Add --32 to tls_as_opt on Solaris.
+       * configure: Regenerate.
+
 2020-05-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/94460
index f7030a2356fb93c0ff6d2858e5c6e747ef0a0269..cd3d9516fceb3d6c7572f0cddd8823edb9f39ba1 100755 (executable)
@@ -24779,6 +24779,11 @@ $as_echo "#define TLS_SECTION_ASM_FLAG 't'" >>confdefs.h
     fi
     case "$target" in
       i[34567]86-*-*)
+       if test x$on_solaris = xyes; then
+         case $gas_flag in
+           yes) tls_as_opt="$tls_as_opt --32" ;;
+         esac
+       fi
        conftest_s="$conftest_s
 foo:   .long   25
        .text
index 12297b7369ed93f1886f22af70efc26159c56d84..0de3b4bf97b784464604e79102f3f691421e051b 100644 (file)
@@ -3544,6 +3544,11 @@ changequote(,)dnl
     fi
     case "$target" in
       i[34567]86-*-*)
+       if test x$on_solaris = xyes; then
+         case $gas_flag in
+           yes) tls_as_opt="$tls_as_opt --32" ;;
+         esac
+       fi
        conftest_s="$conftest_s
 foo:   .long   25
        .text