aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2020-02-14 19:21:02 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2020-02-14 19:24:33 +0100
commit81fc552558f54c6f691e7816da9ab4ad8483f7ef (patch)
tree1ff990a0e49d5dffd2b9157fd108360f5e157bbb
parentd8305a03b4f0bb081dd9c88917cc8c48def22a80 (diff)
downloadgcc-81fc552558f54c6f691e7816da9ab4ad8483f7ef.zip
gcc-81fc552558f54c6f691e7816da9ab4ad8483f7ef.tar.gz
gcc-81fc552558f54c6f691e7816da9ab4ad8483f7ef.tar.bz2
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.
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sparc/sparc.c7
2 files changed, 8 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2080b73..e6eb6ab 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 7e05e1a..aefced8 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);