This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH 5/6] [RS6000] Use standard call patterns for __tls_get_addr calls
On Tue, Nov 27, 2018 at 10:29:29AM -0600, Segher Boessenkool wrote:
Thanks for the review!
> > +(define_insn "*tls_gdld_aix<P:bits>"
> > + [(match_parallel 3 ""
> A match_parallel without predicate... Does this work?!
Yes. In fact, rs6000/predicates.md any_parallel_operand is useless
except as documentation. The only thing it checks is that its operand
is a parallel, but that has already been checked.
> Does this not
> accidentally pick up the wrong things?
No. The purpose of the predicate is to match anything beyond the
vector of expressions. So tls_gdld_aix* matches insns that look like:
(set (match_operand:P 0 "gpc_reg_operand" "=b")
(call (mem:SI (match_operand:P 1))
(match_operand:P 2 "unspec_tls")))
This is sufficiently different from other calls, by virtue of the
Incidentally, I think tls_gdld_aix and tls_gdld_sysv could be merged
at the expense of complicating the length attribute expression.
> Do you think we should to deprecate -mtls-markers in GCC 9?
Support for the TLS marker relocs was added to binutils in 2009 (git
commit 727fc41e077), so yes, the option is not likely to be useful
> Please test with -mtls-markers, too, if you can, and test on AIX.
Presumably you mean -mno-tls-markers. -mtls-markers is the default.
> Looks fine. Thank you for the cleanup! Okay for trunk, but please do the
> extra testing.
Huh, local testing of -mno-tls-markers showed a lack of a
TARGET_TLS_MARKERS check in rs6000_call_template_1. Likely this would
blow up on AIX. I'll test with the following delta.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 56ca117a0a0..5f4fcee3b33 100644
@@ -8622,7 +8622,7 @@ edit_tls_call_insn (rtx arg)
/* Passes the tls arg value for global dynamic and local dynamic
- emit_library_call_value in rs6000_legitimize_Tls_address to
+ emit_library_call_value in rs6000_legitimize_tls_address to
rs6000_call_aix and rs6000_call_sysv. This is used to emit the
marker relocs put on __tls_get_addr calls. */
static rtx global_tlsarg;
@@ -21429,7 +21429,7 @@ rs6000_call_template_1 (rtx *operands, unsigned int funop, bool sibcall)
arg = 0;
- if (GET_CODE (operands[funop + 1]) == UNSPEC)
+ if (TARGET_TLS_MARKERS && GET_CODE (operands[funop + 1]) == UNSPEC)
if (XINT (operands[funop + 1], 1) == UNSPEC_TLSGD)
sprintf (arg, "(%%%u@tlsgd)", funop + 1);
Australia Development Lab, IBM