[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] Fix problematic TLS sequences for the Solaris linker

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 11:03:40 GMT 2020


https://gcc.gnu.org/g:81fc552558f54c6f691e7816da9ab4ad8483f7ef

commit 81fc552558f54c6f691e7816da9ab4ad8483f7ef
Author: Eric Botcazou <ebotcazou@gcc.gnu.org>
Date:   Fri Feb 14 19:21:02 2020 +0100

    Fix problematic TLS sequences for the Solaris linker
    
    This is an old thinko pertaining to the interaction between TLS
    sequences and delay slot filling: the compiler knows that it cannot
    put instructions with TLS relocations into delay slots with the
    original Sun TLS model, but it tests TARGET_SUN_TLS in this context,
    which depends only on the assembler.  So if the compiler is configured
    with the GNU assembler and the Solaris linker, then TARGET_GNU_TLS is
    set instead and the limitation is not enforced.
    
            PR target/93704
            * config/sparc/sparc.c (eligible_for_call_delay): Test HAVE_GNU_LD
            in conjunction with TARGET_GNU_TLS in early return.

Diff:
---
 gcc/ChangeLog            | 6 ++++++
 gcc/config/sparc/sparc.c | 7 ++-----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2080b738fb6..e6eb6ab4c21 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-14  Eric Botcazou  <ebotcazou@adacore.com>
+
+	PR target/93704
+	* config/sparc/sparc.c (eligible_for_call_delay): Test HAVE_GNU_LD in
+	conjunction with TARGET_GNU_TLS in early return.
+
 2020-02-14  Alexander Monakov  <amonakov@ispras.ru>
 
 	* rtlanal.c (rtx_cost): Handle a SET up front. Avoid division if
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 7e05e1a6f82..aefced85fe1 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -3959,11 +3959,8 @@ eligible_for_call_delay (rtx_insn *trial)
   if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
     return 0;
 
-  /* Binutils allows
-       call __tls_get_addr, %tgd_call (foo)
-        add %l7, %o0, %o0, %tgd_add (foo)
-     while Sun as/ld does not.  */
-  if (TARGET_GNU_TLS || !TARGET_TLS)
+  /* The only problematic cases are TLS sequences with Sun as/ld.  */
+  if ((TARGET_GNU_TLS && HAVE_GNU_LD) || !TARGET_TLS)
     return 1;
 
   pat = PATTERN (trial);


More information about the Gcc-cvs mailing list