diff mbox series

[RS6000] Implement -mno-pltseq

Message ID 20190107022402.GJ3170@bubble.grove.modra.org
State New
Headers show
Series [RS6000] Implement -mno-pltseq | expand

Commit Message

Alan Modra Jan. 7, 2019, 2:24 a.m. UTC
Since the last patch untangled inline PLT and TLS marker support there
now isn't a way of requesting the older long call sequences on a
compiler built with inline PLT support.  This patch adds support for
a new -mno-pltseq option.

Bootstrapped etc. powerpc64le-linux and powerpc64-linux.  OK?

	* config/rs6000/rs6000.opt (mpltseq): New option.
	* config/rs6000/rs6000.h (TARGET_PLTSEQ): Define.
	* config/rs6000/rs6000.c (rs6000_option_override_internal): Error
	if given -mpltseq when assembler support is lacking.
	(rs6000_indirect_call_template_1, rs6000_longcall_ref),
	(rs6000_call_aix, rs6000_call_sysv, rs6000_sibcall_sysv): Replace
	uses of HAVE_AS_PLTSEQ with TARGET_PLTSEQ.
	* config/rs6000/rs6000.md (pltseq_tocsave_<mode>),
	(pltseq_plt16_ha_<mode>, pltseq_plt16_lo_<mode>),
	(pltseq_mtctr_<mode>): Likewise.

Comments

Segher Boessenkool Jan. 10, 2019, 11:09 a.m. UTC | #1
On Mon, Jan 07, 2019 at 12:54:02PM +1030, Alan Modra wrote:
> Since the last patch untangled inline PLT and TLS marker support there
> now isn't a way of requesting the older long call sequences on a
> compiler built with inline PLT support.  This patch adds support for
> a new -mno-pltseq option.

Is this a useful option to have?

It needs documentation (in the manual), then.


Segher
Alan Modra Jan. 10, 2019, 12:04 p.m. UTC | #2
On Thu, Jan 10, 2019 at 05:09:06AM -0600, Segher Boessenkool wrote:
> On Mon, Jan 07, 2019 at 12:54:02PM +1030, Alan Modra wrote:
> > Since the last patch untangled inline PLT and TLS marker support there
> > now isn't a way of requesting the older long call sequences on a
> > compiler built with inline PLT support.  This patch adds support for
> > a new -mno-pltseq option.
> 
> Is this a useful option to have?

I figure the most use it will get is by gcc maintainers and others
investigating bug reports.  You get a bug report and can't reproduce
the failure even though compiler flags and gcc version are well
specified.  -mno-pltseq gives you a way of quickly trying out
something that might be different in their auto-host.h to yours.

> It needs documentation (in the manual), then.

OK, will do.
diff mbox series

Patch

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index c126734d3e6..e846e676810 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4513,6 +4513,9 @@  rs6000_option_override_internal (bool global_init_p)
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
     rs6000_print_isa_options (stderr, 0, "after subtarget", rs6000_isa_flags);
 
+  if (global_options_set.x_rs6000_pltseq && TARGET_PLTSEQ != rs6000_pltseq)
+    error ("%qs not supported by your assembler", "-mpltseq");
+
   rs6000_always_hint = (rs6000_tune != PROCESSOR_POWER4
 			&& rs6000_tune != PROCESSOR_POWER5
 			&& rs6000_tune != PROCESSOR_POWER6
@@ -21613,7 +21616,7 @@  rs6000_indirect_call_template_1 (rtx *operands, unsigned int funop,
 		    || (REG_P (operands[funop])
 			&& REGNO (operands[funop]) == LR_REGNO));
 
-  if (!TARGET_MACHO && HAVE_AS_PLTSEQ && GET_CODE (operands[funop]) == UNSPEC)
+  if (!TARGET_MACHO && TARGET_PLTSEQ && GET_CODE (operands[funop]) == UNSPEC)
     {
       const char *rel64 = TARGET_64BIT ? "64" : "";
       char tls[29];
@@ -32767,7 +32770,7 @@  rs6000_longcall_ref (rtx call_ref, rtx arg)
       call_ref = gen_rtx_SYMBOL_REF (VOIDmode, IDENTIFIER_POINTER (node));
     }
 
-  if (HAVE_AS_PLTSEQ
+  if (TARGET_PLTSEQ
       && (DEFAULT_ABI == ABI_ELFv2 || DEFAULT_ABI == ABI_V4))
     {
       rtx base = const0_rtx;
@@ -37765,7 +37768,7 @@  rs6000_call_aix (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
 					     gen_rtx_PLUS (Pmode, stack_ptr,
 							   stack_toc_offset));
 	  MEM_VOLATILE_P (stack_toc_mem) = 1;
-	  if (HAVE_AS_PLTSEQ
+	  if (TARGET_PLTSEQ
 	      && DEFAULT_ABI == ABI_ELFv2
 	      && GET_CODE (func_desc) == SYMBOL_REF)
 	    {
@@ -37789,7 +37792,7 @@  rs6000_call_aix (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
 	     calls via LR, so move the address there.  Needed to mark
 	     this insn for linker plt sequence editing too.  */
 	  func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
-	  if (HAVE_AS_PLTSEQ
+	  if (TARGET_PLTSEQ
 	      && GET_CODE (func_desc) == SYMBOL_REF)
 	    {
 	      rtvec v = gen_rtvec (3, abi_reg, func_desc, tlsarg);
@@ -37930,7 +37933,7 @@  rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
       func = rs6000_longcall_ref (func_desc, tlsarg);
       /* If the longcall was implemented using PLT16 relocs, then r11
 	 needs to be valid at the call for lazy linking.  */
-      if (HAVE_AS_PLTSEQ)
+      if (TARGET_PLTSEQ)
 	abi_reg = func;
     }
 
@@ -37943,7 +37946,7 @@  rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
 	 calls via LR, so move the address there.  Needed to mark
 	 this insn for linker plt sequence editing too.  */
       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
-      if (HAVE_AS_PLTSEQ
+      if (TARGET_PLTSEQ
 	  && GET_CODE (func_desc) == SYMBOL_REF)
 	{
 	  rtvec v = gen_rtvec (3, func, func_desc, tlsarg);
@@ -38000,7 +38003,7 @@  rs6000_sibcall_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
       func = rs6000_longcall_ref (func_desc, tlsarg);
       /* If the longcall was implemented using PLT16 relocs, then r11
 	 needs to be valid at the call for lazy linking.  */
-      if (HAVE_AS_PLTSEQ)
+      if (TARGET_PLTSEQ)
 	abi_reg = func;
     }
 
@@ -38012,7 +38015,7 @@  rs6000_sibcall_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
       /* Indirect sibcalls must go via CTR.  Needed to mark
 	 this insn for linker plt sequence editing too.  */
       func_addr = gen_rtx_REG (Pmode, CTR_REGNO);
-      if (HAVE_AS_PLTSEQ
+      if (TARGET_PLTSEQ
 	  && GET_CODE (func_desc) == SYMBOL_REF)
 	{
 	  rtvec v = gen_rtvec (3, func, func_desc, tlsarg);
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 9c0cc8de2b6..5ffa55e562c 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -226,6 +226,12 @@  extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define HAVE_AS_PLTSEQ 0
 #endif
 
+#if !HAVE_AS_PLTSEQ
+#define TARGET_PLTSEQ 0
+#else
+#define TARGET_PLTSEQ rs6000_pltseq
+#endif
+
 #ifndef TARGET_LINK_STACK
 #define TARGET_LINK_STACK 0
 #endif
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 58070447639..b028b48aacc 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -10250,7 +10250,7 @@  (define_insn "*pltseq_tocsave_<mode>"
 		   (match_operand:P 2 "symbol_ref_operand" "s")
 		   (match_operand:P 3 "" "")]
 		  UNSPEC_PLTSEQ))]
-  "HAVE_AS_PLTSEQ
+  "TARGET_PLTSEQ
    && DEFAULT_ABI == ABI_ELFv2"
 {
   return rs6000_pltseq_template (operands, 0);
@@ -10262,7 +10262,7 @@  (define_insn "*pltseq_plt16_ha_<mode>"
 		   (match_operand:P 2 "symbol_ref_operand" "s")
 		   (match_operand:P 3 "" "")]
 		  UNSPEC_PLT16_HA))]
-  "HAVE_AS_PLTSEQ
+  "TARGET_PLTSEQ
    && (DEFAULT_ABI == ABI_ELFv2 || DEFAULT_ABI == ABI_V4)"
 {
   return rs6000_pltseq_template (operands, 1);
@@ -10274,7 +10274,7 @@  (define_insn "*pltseq_plt16_lo_<mode>"
 		   (match_operand:P 2 "symbol_ref_operand" "s")
 		   (match_operand:P 3 "" "")]
 		  UNSPEC_PLT16_LO))]
-  "HAVE_AS_PLTSEQ
+  "TARGET_PLTSEQ
    && (DEFAULT_ABI == ABI_ELFv2 || DEFAULT_ABI == ABI_V4)"
 {
   return rs6000_pltseq_template (operands, 2);
@@ -10287,7 +10287,7 @@  (define_insn "*pltseq_mtctr_<mode>"
 		   (match_operand:P 2 "symbol_ref_operand" "s")
 		   (match_operand:P 3 "" "")]
 		  UNSPEC_PLTSEQ))]
-  "HAVE_AS_PLTSEQ
+  "TARGET_PLTSEQ
    && (DEFAULT_ABI == ABI_ELFv2 || DEFAULT_ABI == ABI_V4)"
 {
   return rs6000_pltseq_template (operands, 3);
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 2e90bf37747..3f94bb7671c 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -405,6 +405,10 @@  mlongcall
 Target Report Var(rs6000_default_long_calls) Save
 Avoid all range limits on call instructions.
 
+mpltseq
+Target Report Var(rs6000_pltseq) Init(1) Save
+Use inline plt sequences to implement long calls.
+
 ; This option existed in the past, but now is always on.
 mgen-cell-microcode
 Target RejectNegative Undocumented Ignore