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