As reported in the PR, gcc/configure currently fails to detect native TLS support on x86_64-*-solaris2* with a 64-bit gas since it feeds it 32-bit TLS code. I haden't noticed this so far since I've been using a 32-bit gas here (no idea why).
The following patch fixes this by making sure 64-bit code is both used for 64-bit-default configurations and the necessary assembler flags passed. I've chosen to merge the i?86 and x86_64 cases to avoid duplicating considerable amounts of code. When using the native Solaris assembler, the relocs need to be in lower case as already done for 32-bit. Tested by configuring for x86_64-pc-solaris2.11 with 32-bit gas, 64-bit gas, /bin/as, i386-pc-solaris2.11 with 32-bit gas and /bin/as, x86_64-unknown-linux-gnu, and i686-unknown-linux-gnu and checking that native TLS support is detected correctly. Ok for mainline or should I rather bootstrap the change on a couple of those configurations? Thanks. Rainer 2014-04-15 Rainer Orth <r...@cebitec.uni-bielefeld.de> PR target/60817 * configure.ac (set_have_as_tls): Merge i[34567]86-*-* and x86_64-*-* cases. Pass necessary as flags on 64-bit Solaris/x86. Use lowercase relocs for x86_64-*-*. * configure: Regenerate.
diff --git a/gcc/configure.ac b/gcc/configure.ac --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -2959,7 +2959,7 @@ foo: .long 25 tls_first_major=2 tls_first_minor=17 ;; - i[34567]86-*-* | x86_64-*-solaris2.1[0-9]*) + i[34567]86-*-* | x86_64-*-*) case "$target" in i[34567]86-*-solaris2.*) on_solaris=yes @@ -2991,6 +2991,8 @@ changequote(,)dnl tls_section_flag=T tls_as_opt="--fatal-warnings" fi + case "$target" in + i[34567]86-*-*) conftest_s="$conftest_s foo: .long 25 .text @@ -3007,20 +3009,23 @@ foo: .long 25 leal foo@ntpoff(%ecx), %eax" ;; x86_64-*-*) - conftest_s=' - .section ".tdata","awT",@progbits + if test x$on_solaris = xyes; then + case $gas_flag in + yes) tls_as_opt="$tls_as_opt --64" ;; + no) tls_as_opt="$tls_as_opt -xarch=amd64" ;; + esac + fi + conftest_s="$conftest_s foo: .long 25 .text movq %fs:0, %rax - leaq foo@TLSGD(%rip), %rdi - leaq foo@TLSLD(%rip), %rdi - leaq foo@DTPOFF(%rax), %rdx - movq foo@GOTTPOFF(%rip), %rax - movq $foo@TPOFF, %rax' - tls_first_major=2 - tls_first_minor=14 - tls_section_flag=T - tls_as_opt=--fatal-warnings + leaq foo@tlsgd(%rip), %rdi + leaq foo@tlsld(%rip), %rdi + leaq foo@dtpoff(%rax), %rdx + movq foo@gottpoff(%rip), %rax + movq \$foo@tpoff, %rax" + ;; + esac ;; ia64-*-*) conftest_s='
-- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University