Hi Peter,

on 2024/7/10 05:39, Peter Bergner wrote:
> Hi Kewen,
> 
> Here is that promised cleanup patch we discussed in the previous patch review.
> I'll note this patch is dependent on the previous patch you approved.  I have
> not pushed that yet (in case you looked) since I'm waiting on Segher to 
> approve
> the updated patch for not disabling shrink-wrapping for leaf-functions in the
> presence of -mrop-protect first.
> 
> 
> We currently silently ignore the -mrop-protect option for old CPUs we don't
> support with the ROP hash insns, but we throw an error for unsupported ABIs.
> This patch treats unsupported CPUs and ABIs similarly by throwing an error
> for both.  This matches clang behavior and allows us to simplify our ROP
> tests in the code that generates our prologue and epilogue code.
> 
> This passed bootstrap and regtesting on powerpc64le-linux and powerpc64-linux
> with no regressions.  Ok for trunk?
> 
> I'll note I did not create a test case for unsupported ABIs, since I'll be
> working on adding ROP support for powerpc-linux and powerpc64-linux next.
> 
> Peter
> 
> 
> 
> 2024-06-26  Peter Bergner  <berg...@linux.ibm.com>
> 
> gcc/
>       PR target/114759
>       * config/rs6000/rs6000.cc (rs6000_override_options_after_change):
>       Disallow CPUs and ABIs that do no support the ROP protection insns.
>       * config/rs6000/rs6000-logue.cc (rs6000_stack_info): Remove now
>       unneeded tests.
>       (rs6000_emit_prologue): Likewise.
>       Remove unneeded gcc_assert.
>       (rs6000_emit_epilogue): Likewise.
>       * config/rs6000/rs6000.md: Likewise.
> 
> gcc/testsuite/
>       PR target/114759
>       * gcc.target/powerpc/pr114759-3.c: New test.
> ---
>  gcc/config/rs6000/rs6000.cc                   | 11 ++++++++++
>  gcc/config/rs6000/rs6000-logue.cc             | 22 +++++--------------
>  gcc/config/rs6000/rs6000.md                   |  4 ++--
>  gcc/testsuite/gcc.target/powerpc/pr114759-3.c | 19 ++++++++++++++++
>  4 files changed, 38 insertions(+), 18 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/pr114759-3.c
> 
> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
> index fd6e013c346..e9642fd5310 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -3427,6 +3427,17 @@ rs6000_override_options_after_change (void)
>      }
>    else if (!OPTION_SET_P (flag_cunroll_grow_size))
>      flag_cunroll_grow_size = flag_peel_loops || optimize >= 3;
> +
> +  if (rs6000_rop_protect)
> +    {
> +      /* Disallow CPU targets we don't support.  */
> +      if (!TARGET_POWER8)
> +     error ("%<-mrop-protect%> requires %<-mcpu=power8%> or later");
> +
> +      /* Disallow ABI targets we don't support.  */
> +      if (DEFAULT_ABI != ABI_ELFv2)
> +     error ("%<-mrop-protect%> requires the ELFv2 ABI");
> +    }

I wonder if there is some reason to put this hunk here.  IMHO we want the hunk
in rs6000_option_override_internal instead since no optimization options can
affect cpu type and DEFAULT_ABI?  And we probably want to unset 
rs6000_rop_protect
to align with the handlings on other options?

The others look good to me, thanks!

BR,
Kewen

>  }
>  
>  #ifdef TARGET_USES_LINUX64_OPT
> diff --git a/gcc/config/rs6000/rs6000-logue.cc 
> b/gcc/config/rs6000/rs6000-logue.cc
> index bd363b625a4..fdb6414f486 100644
> --- a/gcc/config/rs6000/rs6000-logue.cc
> +++ b/gcc/config/rs6000/rs6000-logue.cc
> @@ -716,17 +716,11 @@ rs6000_stack_info (void)
>    info->calls_p = (!crtl->is_leaf || cfun->machine->ra_needs_full_frame);
>    info->rop_hash_size = 0;
>  
> -  if (TARGET_POWER8
> -      && info->calls_p
> -      && DEFAULT_ABI == ABI_ELFv2
> -      && rs6000_rop_protect)
> +  /* If we want ROP protection and this function makes a call, indicate
> +     we need to create a stack slot to save the hashed return address in.  */
> +  if (rs6000_rop_protect
> +      && info->calls_p)
>      info->rop_hash_size = 8;
> -  else if (rs6000_rop_protect && DEFAULT_ABI != ABI_ELFv2)
> -    {
> -      /* We can't check this in rs6000_option_override_internal since
> -      DEFAULT_ABI isn't established yet.  */
> -      error ("%qs requires the ELFv2 ABI", "-mrop-protect");
> -    }
>  
>    /* Determine if we need to save the condition code registers.  */
>    if (save_reg_p (CR2_REGNO)
> @@ -3277,9 +3271,8 @@ rs6000_emit_prologue (void)
>    /* NOTE: The hashst isn't needed if we're going to do a sibcall,
>       but there's no way to know that here.  Harmless except for
>       performance, of course.  */
> -  if (TARGET_POWER8 && rs6000_rop_protect && info->rop_hash_size != 0)
> +  if (info->rop_hash_size)
>      {
> -      gcc_assert (DEFAULT_ABI == ABI_ELFv2);
>        rtx stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
>        rtx addr = gen_rtx_PLUS (Pmode, stack_ptr,
>                              GEN_INT (info->rop_hash_save_offset));
> @@ -5056,12 +5049,9 @@ rs6000_emit_epilogue (enum epilogue_type epilogue_type)
>  
>    /* The ROP hash check must occur after the stack pointer is restored
>       (since the hash involves r1), and is not performed for a sibcall.  */
> -  if (TARGET_POWER8
> -      && rs6000_rop_protect
> -      && info->rop_hash_size != 0
> +  if (info->rop_hash_size
>        && epilogue_type != EPILOGUE_TYPE_SIBCALL)
>      {
> -      gcc_assert (DEFAULT_ABI == ABI_ELFv2);
>        rtx stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
>        rtx addr = gen_rtx_PLUS (Pmode, stack_ptr,
>                              GEN_INT (info->rop_hash_save_offset));
> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
> index 694076e311f..75fe51b8d43 100644
> --- a/gcc/config/rs6000/rs6000.md
> +++ b/gcc/config/rs6000/rs6000.md
> @@ -15810,7 +15810,7 @@ (define_insn "hashst"
>    [(set (match_operand:DI 0 "simple_offsettable_mem_operand" "=m")
>       (unspec_volatile:DI [(match_operand:DI 1 "int_reg_operand" "r")]
>                           UNSPEC_HASHST))]
> -  "TARGET_POWER8 && rs6000_rop_protect"
> +  "rs6000_rop_protect"
>  {
>    static char templ[32];
>    const char *p = rs6000_privileged ? "p" : "";
> @@ -15823,7 +15823,7 @@ (define_insn "hashchk"
>    [(unspec_volatile [(match_operand:DI 0 "int_reg_operand" "r")
>                    (match_operand:DI 1 "simple_offsettable_mem_operand" "m")]
>                   UNSPEC_HASHCHK)]
> -  "TARGET_POWER8 && rs6000_rop_protect"
> +  "rs6000_rop_protect"
>  {
>    static char templ[32];
>    const char *p = rs6000_privileged ? "p" : "";
> diff --git a/gcc/testsuite/gcc.target/powerpc/pr114759-3.c 
> b/gcc/testsuite/gcc.target/powerpc/pr114759-3.c
> new file mode 100644
> index 00000000000..6770a9aec3b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pr114759-3.c
> @@ -0,0 +1,19 @@
> +/* PR target/114759 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=power7 -mrop-protect" } */
> +
> +/* Verify we emit an error if we use -mrop-protect with an unsupported cpu.  
> */
> +
> +extern void foo (void);
> +
> +int
> +bar (void)
> +{
> +  foo ();
> +  return 5;
> +}
> +
> +/* The correct line number is in the preamble to the error message, not
> +   in the final line (which is all that dg-error inspects). Hence, we have
> +   to tell dg-error to ignore the line number.  */
> +/* { dg-error "'-mrop-protect' requires '-mcpu=power8'" "PR114759" { target 
> *-*-* } 0 } */

Reply via email to