From 81fc552558f54c6f691e7816da9ab4ad8483f7ef Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 14 Feb 2020 19:21:02 +0100 Subject: [PATCH] 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. --- 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 + + 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 * 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); -- 2.30.2