diff mbox series

rs6000: Add basic infrastructure for PC-relative addressing

Message ID a976c4ea-6e7e-2d5b-ba38-ff87767d23f8@linux.ibm.com
State New
Headers show
Series rs6000: Add basic infrastructure for PC-relative addressing | expand

Commit Message

Bill Schmidt May 22, 2019, 8:29 p.m. UTC
Hi,

This patch adds basic infrastructure support to enable PC-relative addressing.
It adds the -mpcrel / -mno-pcrel option (defaulted on for -mcpu=future, otherwise
off), and provides a couple of interfaces to determine whether PC-relative
addressing should be used when generating a single function.

Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions.
Is this okay for trunk?

Thanks,
Bill


2019-05-22  Bill Schmidt  <wschmidt@linux.ibm.com>
	    Michael Meissner  <meissner@linux.ibm.com>
	    Segher Boessenkool  <segher@kernel.crashing.org>

	* config/rs6000/rs6000-cpus.def (ISA_FUTURE_MASKS_SERVER): Add
	OPTION_MASK_PCREL.
	(OTHER_FUTURE_MASKS): New #define.
	(OTHER_P9_VECTOR_MASKS): Add OTHER_FUTURE_MASKS.
	(POWERPC_MASKS): Add OPTION_MASK_PCREL.
	* config/rs6000/rs6000-protos.h (rs6000_pcrel_p): New prototype.
	(rs6000_fndecl_pcrel_p): Likewise.
	* config/rs6000/rs6000.c (rs6000_option_override_internal): Report
	error if -mpcrel is requested without -mcpu=future.
	(rs6000_fndecl_pcrel_p): New function.
	(rs6000_pcrel_p): Likewise.
	* config/rs6000/rs6000.opt (mpcrel): New option.
	* doc/invoke.texi: Document -mpcrel and -mno-pcrel.

Comments

Bill Schmidt May 23, 2019, 9:09 a.m. UTC | #1
On 5/22/19 3:29 PM, Bill Schmidt wrote:
> Hi,
>
> This patch adds basic infrastructure support to enable PC-relative addressing.
> It adds the -mpcrel / -mno-pcrel option (defaulted on for -mcpu=future, otherwise
> off), and provides a couple of interfaces to determine whether PC-relative
> addressing should be used when generating a single function.
>
> Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no regressions.
> Is this okay for trunk?

In light of changes to
https://gcc.gnu.org/ml/gcc-patches/2019-05/msg01514.html, let me
withdraw this one and rework it slightly (along with the follow-up for
one missing line).

Thanks,
Bill

>
> Thanks,
> Bill
>
>
> 2019-05-22  Bill Schmidt  <wschmidt@linux.ibm.com>
> 	    Michael Meissner  <meissner@linux.ibm.com>
> 	    Segher Boessenkool  <segher@kernel.crashing.org>
>
> 	* config/rs6000/rs6000-cpus.def (ISA_FUTURE_MASKS_SERVER): Add
> 	OPTION_MASK_PCREL.
> 	(OTHER_FUTURE_MASKS): New #define.
> 	(OTHER_P9_VECTOR_MASKS): Add OTHER_FUTURE_MASKS.
> 	(POWERPC_MASKS): Add OPTION_MASK_PCREL.
> 	* config/rs6000/rs6000-protos.h (rs6000_pcrel_p): New prototype.
> 	(rs6000_fndecl_pcrel_p): Likewise.
> 	* config/rs6000/rs6000.c (rs6000_option_override_internal): Report
> 	error if -mpcrel is requested without -mcpu=future.
> 	(rs6000_fndecl_pcrel_p): New function.
> 	(rs6000_pcrel_p): Likewise.
> 	* config/rs6000/rs6000.opt (mpcrel): New option.
> 	* doc/invoke.texi: Document -mpcrel and -mno-pcrel.
>
>
> diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def
> index f32da25930d..a4e1d1a01d8 100644
> --- a/gcc/config/rs6000/rs6000-cpus.def
> +++ b/gcc/config/rs6000/rs6000-cpus.def
> @@ -74,10 +74,15 @@
>
>  /* Support for a future processor's features.  */
>  #define ISA_FUTURE_MASKS_SERVER	(ISA_3_0_MASKS_SERVER			\
> -				 | OPTION_MASK_FUTURE)
> +				 | OPTION_MASK_FUTURE			\
> +				 | OPTION_MASK_PCREL)
> +
> +/* Flags that need to be turned off if -mno-future.  */
> +#define OTHER_FUTURE_MASKS	(OPTION_MASK_PCREL)
>
>  /* Flags that need to be turned off if -mno-power9-vector.  */
> -#define OTHER_P9_VECTOR_MASKS	(OPTION_MASK_FLOAT128_HW		\
> +#define OTHER_P9_VECTOR_MASKS	(OTHER_FUTURE_MASKS			\
> +				 | OPTION_MASK_FLOAT128_HW		\
>  				 | OPTION_MASK_FUTURE			\
>  				 | OPTION_MASK_P9_MINMAX)
>
> @@ -129,6 +134,7 @@
>  				 | OPTION_MASK_P9_MINMAX		\
>  				 | OPTION_MASK_P9_MISC			\
>  				 | OPTION_MASK_P9_VECTOR		\
> +				 | OPTION_MASK_PCREL			\
>  				 | OPTION_MASK_POPCNTB			\
>  				 | OPTION_MASK_POPCNTD			\
>  				 | OPTION_MASK_POWERPC64		\
> diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
> index 9718adaa2b9..18ece005a96 100644
> --- a/gcc/config/rs6000/rs6000-protos.h
> +++ b/gcc/config/rs6000/rs6000-protos.h
> @@ -152,6 +152,8 @@ extern rtx rs6000_machopic_legitimize_pic_address (rtx, machine_mode,
>  extern rtx rs6000_allocate_stack_temp (machine_mode, bool, bool);
>  extern align_flags rs6000_loop_align (rtx);
>  extern void rs6000_split_logical (rtx [], enum rtx_code, bool, bool, bool);
> +extern bool rs6000_pcrel_p (struct function *);
> +extern bool rs6000_fndecl_pcrel_p (const_tree);
>  #endif /* RTX_CODE */
>
>  #ifdef TREE_CODE
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index 57c9eae8208..68abc81c354 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -4296,6 +4296,15 @@ rs6000_option_override_internal (bool global_init_p)
>        rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
>      }
>
> +  /* -mpcrel requires the prefixed load/store support on FUTURE systems.  */
> +  if (!TARGET_FUTURE && TARGET_PCREL)
> +    {
> +      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
> +	error ("%qs requires %qs", "-mpcrel", "-mcpu=future");
> +
> +      rs6000_isa_flags &= ~OPTION_MASK_PCREL;
> +    }
> +
>    /* Print the options after updating the defaults.  */
>    if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
>      rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags);
> @@ -38112,6 +38121,34 @@ rs6000_save_toc_in_prologue_p (void)
>    return (cfun && cfun->machine && cfun->machine->save_toc_in_prologue);
>  }
>
> +/* Return whether we should generate PC-relative code for FNDECL.  */
> +bool
> +rs6000_fndecl_pcrel_p (const_tree fndecl)
> +{
> +  if (DEFAULT_ABI != ABI_ELFv2)
> +    return false;
> +
> +  struct cl_target_option *opts = target_opts_for_fn (fndecl);
> +
> +  return ((opts->x_rs6000_isa_flags & OPTION_MASK_PCREL) != 0
> +	  && TARGET_CMODEL == CMODEL_MEDIUM);
> +}
> +
> +/* Return whether we should generate PC-relative code for *FN.  */
> +bool
> +rs6000_pcrel_p (struct function *fn)
> +{
> +  if (DEFAULT_ABI != ABI_ELFv2)
> +    return false;
> +
> +  /* Optimize usual case.  */
> +  if (fn == cfun)
> +    return ((rs6000_isa_flags & OPTION_MASK_PCREL) != 0
> +	    && TARGET_CMODEL == CMODEL_MEDIUM);
> +
> +  return rs6000_fndecl_pcrel_p (fn->decl);
> +}
> +
>  #ifdef HAVE_GAS_HIDDEN
>  # define USE_HIDDEN_LINKONCE 1
>  #else
> diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
> index 196e75d7009..43b04834746 100644
> --- a/gcc/config/rs6000/rs6000.opt
> +++ b/gcc/config/rs6000/rs6000.opt
> @@ -573,3 +573,7 @@ Target Undocumented Var(rs6000_speculate_indirect_jumps) Init(1) Save
>  mfuture
>  Target Report Mask(FUTURE) Var(rs6000_isa_flags)
>  Use instructions for a future architecture.
> +
> +mpcrel
> +Target Report Mask(PCREL) Var(rs6000_isa_flags)
> +Generate (do not generate) pc-relative memory addressing.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index fbbc4f829b7..c6ca0c7216a 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1121,7 +1121,7 @@ See RS/6000 and PowerPC Options.
>  -mfloat128  -mno-float128  -mfloat128-hardware  -mno-float128-hardware @gol
>  -mgnu-attribute  -mno-gnu-attribute @gol
>  -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{reg} @gol
> --mstack-protector-guard-offset=@var{offset}}
> +-mstack-protector-guard-offset=@var{offset} -mpcrel -mno-pcrel}
>
>  @emph{RX Options}
>  @gccoptlist{-m64bit-doubles  -m32bit-doubles  -fpu  -nofpu@gol
> @@ -25084,6 +25084,13 @@ which register to use as base register for reading the canary, and from what
>  offset from that base register. The default for those is as specified in the
>  relevant ABI.  @option{-mstack-protector-guard-symbol=@var{symbol}} overrides
>  the offset with a symbol reference to a canary in the TLS block.
> +
> +@item -mpcrel
> +@itemx -mno-pcrel
> +@opindex mpcrel
> +@opindex mno-pcrel
> +Generate (do not generate) pc-relative addressing when the option
> +@option{-mcpu=future} is used.
>  @end table
>
>  @node RX Options
>
Segher Boessenkool May 23, 2019, 9:27 a.m. UTC | #2
Hi!

On Wed, May 22, 2019 at 03:29:17PM -0500, Bill Schmidt wrote:
> +  /* -mpcrel requires the prefixed load/store support on FUTURE systems.  */
> +  if (!TARGET_FUTURE && TARGET_PCREL)
> +    {
> +      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
> +	error ("%qs requires %qs", "-mpcrel", "-mcpu=future");
> +
> +      rs6000_isa_flags &= ~OPTION_MASK_PCREL;
> +    }

The comment is confusing...  I read it as "On FUTURE, pcrel requires
prefixed load/store".  The code doesn't even mention prefix, anyway.

Just say "-mpcrel requires -mcpu=future", just like the code says?  Or just
"-mpcrel requires prefix".  Something like that.  "FUTURE is needed for
prefix support"?

> +/* Return whether we should generate PC-relative code for *FN.  */
> +bool
> +rs6000_pcrel_p (struct function *fn)
> +{
> +  if (DEFAULT_ABI != ABI_ELFv2)
> +    return false;
> +
> +  /* Optimize usual case.  */
> +  if (fn == cfun)

Maybe have a separate (helper) function for this?  Defined in the header,
if performance matters.

Looks good.  Okay for trunk.  Thanks!


Segher
Bill Schmidt May 23, 2019, 1:31 p.m. UTC | #3
On 5/23/19 4:27 AM, Segher Boessenkool wrote:
> Hi!
>
> On Wed, May 22, 2019 at 03:29:17PM -0500, Bill Schmidt wrote:
>> +  /* -mpcrel requires the prefixed load/store support on FUTURE systems.  */
>> +  if (!TARGET_FUTURE && TARGET_PCREL)
>> +    {
>> +      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
>> +	error ("%qs requires %qs", "-mpcrel", "-mcpu=future");
>> +
>> +      rs6000_isa_flags &= ~OPTION_MASK_PCREL;
>> +    }
> The comment is confusing...  I read it as "On FUTURE, pcrel requires
> prefixed load/store".  The code doesn't even mention prefix, anyway.
>
> Just say "-mpcrel requires -mcpu=future", just like the code says?  Or just
> "-mpcrel requires prefix".  Something like that.  "FUTURE is needed for
> prefix support"?

ok!

>
>> +/* Return whether we should generate PC-relative code for *FN.  */
>> +bool
>> +rs6000_pcrel_p (struct function *fn)
>> +{
>> +  if (DEFAULT_ABI != ABI_ELFv2)
>> +    return false;
>> +
>> +  /* Optimize usual case.  */
>> +  if (fn == cfun)
> Maybe have a separate (helper) function for this?  Defined in the header,
> if performance matters.

As we discussed, I'll defer this until after I finish the refactoring of
offline patches.

Thanks!
Bill
>
> Looks good.  Okay for trunk.  Thanks!
>
>
> Segher
>
diff mbox series

Patch

diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def
index f32da25930d..a4e1d1a01d8 100644
--- a/gcc/config/rs6000/rs6000-cpus.def
+++ b/gcc/config/rs6000/rs6000-cpus.def
@@ -74,10 +74,15 @@ 
 
 /* Support for a future processor's features.  */
 #define ISA_FUTURE_MASKS_SERVER	(ISA_3_0_MASKS_SERVER			\
-				 | OPTION_MASK_FUTURE)
+				 | OPTION_MASK_FUTURE			\
+				 | OPTION_MASK_PCREL)
+
+/* Flags that need to be turned off if -mno-future.  */
+#define OTHER_FUTURE_MASKS	(OPTION_MASK_PCREL)
 
 /* Flags that need to be turned off if -mno-power9-vector.  */
-#define OTHER_P9_VECTOR_MASKS	(OPTION_MASK_FLOAT128_HW		\
+#define OTHER_P9_VECTOR_MASKS	(OTHER_FUTURE_MASKS			\
+				 | OPTION_MASK_FLOAT128_HW		\
 				 | OPTION_MASK_FUTURE			\
 				 | OPTION_MASK_P9_MINMAX)
 
@@ -129,6 +134,7 @@ 
 				 | OPTION_MASK_P9_MINMAX		\
 				 | OPTION_MASK_P9_MISC			\
 				 | OPTION_MASK_P9_VECTOR		\
+				 | OPTION_MASK_PCREL			\
 				 | OPTION_MASK_POPCNTB			\
 				 | OPTION_MASK_POPCNTD			\
 				 | OPTION_MASK_POWERPC64		\
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 9718adaa2b9..18ece005a96 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -152,6 +152,8 @@  extern rtx rs6000_machopic_legitimize_pic_address (rtx, machine_mode,
 extern rtx rs6000_allocate_stack_temp (machine_mode, bool, bool);
 extern align_flags rs6000_loop_align (rtx);
 extern void rs6000_split_logical (rtx [], enum rtx_code, bool, bool, bool);
+extern bool rs6000_pcrel_p (struct function *);
+extern bool rs6000_fndecl_pcrel_p (const_tree);
 #endif /* RTX_CODE */
 
 #ifdef TREE_CODE
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 57c9eae8208..68abc81c354 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4296,6 +4296,15 @@  rs6000_option_override_internal (bool global_init_p)
       rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW;
     }
 
+  /* -mpcrel requires the prefixed load/store support on FUTURE systems.  */
+  if (!TARGET_FUTURE && TARGET_PCREL)
+    {
+      if ((rs6000_isa_flags_explicit & OPTION_MASK_PCREL) != 0)
+	error ("%qs requires %qs", "-mpcrel", "-mcpu=future");
+
+      rs6000_isa_flags &= ~OPTION_MASK_PCREL;
+    }
+
   /* Print the options after updating the defaults.  */
   if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET)
     rs6000_print_isa_options (stderr, 0, "after defaults", rs6000_isa_flags);
@@ -38112,6 +38121,34 @@  rs6000_save_toc_in_prologue_p (void)
   return (cfun && cfun->machine && cfun->machine->save_toc_in_prologue);
 }
 
+/* Return whether we should generate PC-relative code for FNDECL.  */
+bool
+rs6000_fndecl_pcrel_p (const_tree fndecl)
+{
+  if (DEFAULT_ABI != ABI_ELFv2)
+    return false;
+
+  struct cl_target_option *opts = target_opts_for_fn (fndecl);
+
+  return ((opts->x_rs6000_isa_flags & OPTION_MASK_PCREL) != 0
+	  && TARGET_CMODEL == CMODEL_MEDIUM);
+}
+
+/* Return whether we should generate PC-relative code for *FN.  */
+bool
+rs6000_pcrel_p (struct function *fn)
+{
+  if (DEFAULT_ABI != ABI_ELFv2)
+    return false;
+
+  /* Optimize usual case.  */
+  if (fn == cfun)
+    return ((rs6000_isa_flags & OPTION_MASK_PCREL) != 0
+	    && TARGET_CMODEL == CMODEL_MEDIUM);
+
+  return rs6000_fndecl_pcrel_p (fn->decl);
+}
+
 #ifdef HAVE_GAS_HIDDEN
 # define USE_HIDDEN_LINKONCE 1
 #else
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 196e75d7009..43b04834746 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -573,3 +573,7 @@  Target Undocumented Var(rs6000_speculate_indirect_jumps) Init(1) Save
 mfuture
 Target Report Mask(FUTURE) Var(rs6000_isa_flags)
 Use instructions for a future architecture.
+
+mpcrel
+Target Report Mask(PCREL) Var(rs6000_isa_flags)
+Generate (do not generate) pc-relative memory addressing.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index fbbc4f829b7..c6ca0c7216a 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1121,7 +1121,7 @@  See RS/6000 and PowerPC Options.
 -mfloat128  -mno-float128  -mfloat128-hardware  -mno-float128-hardware @gol
 -mgnu-attribute  -mno-gnu-attribute @gol
 -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{reg} @gol
--mstack-protector-guard-offset=@var{offset}}
+-mstack-protector-guard-offset=@var{offset} -mpcrel -mno-pcrel}
 
 @emph{RX Options}
 @gccoptlist{-m64bit-doubles  -m32bit-doubles  -fpu  -nofpu@gol
@@ -25084,6 +25084,13 @@  which register to use as base register for reading the canary, and from what
 offset from that base register. The default for those is as specified in the
 relevant ABI.  @option{-mstack-protector-guard-symbol=@var{symbol}} overrides
 the offset with a symbol reference to a canary in the TLS block.
+
+@item -mpcrel
+@itemx -mno-pcrel
+@opindex mpcrel
+@opindex mno-pcrel
+Generate (do not generate) pc-relative addressing when the option
+@option{-mcpu=future} is used.
 @end table
 
 @node RX Options