"H.J. Lu" <hjl.to...@gmail.com> writes:
> On Wed, Feb 5, 2020 at 2:51 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>>
>> On Wed, Feb 5, 2020 at 2:37 PM Marek Polacek <pola...@redhat.com> wrote:
>> >
>> > On Wed, Feb 05, 2020 at 02:24:48PM -0800, H.J. Lu wrote:
>> > > On Wed, Feb 5, 2020 at 12:20 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>> > > >
>> > > > On Wed, Feb 5, 2020 at 9:00 AM Richard Sandiford
>> > > > <richard.sandif...@arm.com> wrote:
>> > > > >
>> > > > > "H.J. Lu" <hjl.to...@gmail.com> writes:
>> > > > > > Currently patchable area is at the wrong place.
>> > > > >
>> > > > > Agreed :-)
>> > > > >
>> > > > > > It is placed immediately
>> > > > > > after function label and before .cfi_startproc.  A backend should 
>> > > > > > be able
>> > > > > > to add a pseudo patchable area instruction durectly into RTL.  
>> > > > > > This patch
>> > > > > > adds patch_area_size and patch_area_entry to cfun so that the 
>> > > > > > patchable
>> > > > > > area info is available in RTL passes.
>> > > > >
>> > > > > It might be better to add it to crtl, since it should only be needed
>> > > > > during rtl generation.
>> > > > >
>> > > > > > It also limits patch_area_size and patch_area_entry to 65535, 
>> > > > > > which is
>> > > > > > a reasonable maximum size for patchable area.
>> > > > > >
>> > > > > > gcc/
>> > > > > >
>> > > > > >       PR target/93492
>> > > > > >       * function.c (expand_function_start): Set 
>> > > > > > cfun->patch_area_size
>> > > > > >       and cfun->patch_area_entry.
>> > > > > >       * function.h (function): Add patch_area_size and 
>> > > > > > patch_area_entry.
>> > > > > >       * opts.c (common_handle_option): Limit
>> > > > > >       function_entry_patch_area_size and 
>> > > > > > function_entry_patch_area_start
>> > > > > >       to USHRT_MAX.  Fix a typo in error message.
>> > > > > >       * varasm.c (assemble_start_function): Use 
>> > > > > > cfun->patch_area_size
>> > > > > >       and cfun->patch_area_entry.
>> > > > > >       * doc/invoke.texi: Document the maximum value for
>> > > > > >       -fpatchable-function-entry.
>> > > > > >
>> > > > > > gcc/testsuite/
>> > > > > >
>> > > > > >       PR target/93492
>> > > > > >       * c-c++-common/patchable_function_entry-error-1.c: New test.
>> > > > > >       * c-c++-common/patchable_function_entry-error-2.c: Likewise.
>> > > > > >       * c-c++-common/patchable_function_entry-error-3.c: Likewise.
>> > > > > > ---
>> > > > > >  gcc/doc/invoke.texi                           |  1 +
>> > > > > >  gcc/function.c                                | 35 
>> > > > > > +++++++++++++++++++
>> > > > > >  gcc/function.h                                |  6 ++++
>> > > > > >  gcc/opts.c                                    |  4 ++-
>> > > > > >  .../patchable_function_entry-error-1.c        |  9 +++++
>> > > > > >  .../patchable_function_entry-error-2.c        |  9 +++++
>> > > > > >  .../patchable_function_entry-error-3.c        | 20 +++++++++++
>> > > > > >  gcc/varasm.c                                  | 30 
>> > > > > > ++--------------
>> > > > > >  8 files changed, 85 insertions(+), 29 deletions(-)
>> > > > > >  create mode 100644 
>> > > > > > gcc/testsuite/c-c++-common/patchable_function_entry-error-1.c
>> > > > > >  create mode 100644 
>> > > > > > gcc/testsuite/c-c++-common/patchable_function_entry-error-2.c
>> > > > > >  create mode 100644 
>> > > > > > gcc/testsuite/c-c++-common/patchable_function_entry-error-3.c
>> > > > > >
>> > > > > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>> > > > > > index 35b341e759f..dd4835199b0 100644
>> > > > > > --- a/gcc/doc/invoke.texi
>> > > > > > +++ b/gcc/doc/invoke.texi
>> > > > > > @@ -13966,6 +13966,7 @@ If @code{N=0}, no pad location is recorded.
>> > > > > >  The NOP instructions are inserted at---and maybe before, 
>> > > > > > depending on
>> > > > > >  @var{M}---the function entry address, even before the prologue.
>> > > > > >
>> > > > > > +The maximum value of @var{N} and @var{M} is 65535.
>> > > > > >  @end table
>> > > > > >
>> > > > > >
>> > > > > > diff --git a/gcc/function.c b/gcc/function.c
>> > > > > > index d8008f60422..badbf538eec 100644
>> > > > > > --- a/gcc/function.c
>> > > > > > +++ b/gcc/function.c
>> > > > > > @@ -5202,6 +5202,41 @@ expand_function_start (tree subr)
>> > > > > >    /* If we are doing generic stack checking, the probe should go 
>> > > > > > here.  */
>> > > > > >    if (flag_stack_check == GENERIC_STACK_CHECK)
>> > > > > >      stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
>> > > > > > +
>> > > > > > +  unsigned HOST_WIDE_INT patch_area_size = 
>> > > > > > function_entry_patch_area_size;
>> > > > > > +  unsigned HOST_WIDE_INT patch_area_entry = 
>> > > > > > function_entry_patch_area_start;
>> > > > > > +
>> > > > > > +  tree patchable_function_entry_attr
>> > > > > > +    = lookup_attribute ("patchable_function_entry",
>> > > > > > +                     DECL_ATTRIBUTES (cfun->decl));
>> > > > > > +  if (patchable_function_entry_attr)
>> > > > > > +    {
>> > > > > > +      tree pp_val = TREE_VALUE (patchable_function_entry_attr);
>> > > > > > +      tree patchable_function_entry_value1 = TREE_VALUE (pp_val);
>> > > > > > +
>> > > > > > +      patch_area_size = tree_to_uhwi 
>> > > > > > (patchable_function_entry_value1);
>> > > > > > +      patch_area_entry = 0;
>> > > > > > +      if (TREE_CHAIN (pp_val) != NULL_TREE)
>> > > > > > +     {
>> > > > > > +       tree patchable_function_entry_value2
>> > > > > > +         = TREE_VALUE (TREE_CHAIN (pp_val));
>> > > > > > +       patch_area_entry = tree_to_uhwi 
>> > > > > > (patchable_function_entry_value2);
>> > > > > > +     }
>> > > > > > +      if (patch_area_size > USHRT_MAX || patch_area_size > 
>> > > > > > USHRT_MAX)
>> > > > > > +     error ("invalid values for %<patchable_function_entry%> 
>> > > > > > attribute");
>> > > > >
>> > > > > This should probably go in handle_patchable_function_entry_attribute
>> > > > > instead.  It doesn't look like we have a clear policy about whether
>> > > > > errors or warnings are right for unrecognised arguments to known
>> > > > > attribute names, but handle_patchable_function_entry_attribute 
>> > > > > reports
>> > > > > an OPT_Wattributes warning for arguments that aren't integers.  
>> > > > > Doing the
>> > > > > same for out-of-range integers would be more consistent and means 
>> > > > > that
>> > > > > we wouldn't break existing code if we relaxed/changed the rules in 
>> > > > > future.
>> > > >
>> > > > Like this?  OK for master if there is no regression?
>> > > >
>> > >
>> > > There is a small problem.  Warnings from C and C++ frond-ends are 
>> > > different:
>> > >
>> > > [hjl@gnu-skx-1 gcc]$ cat x.c
>> > > void
>> > >  __attribute__((patchable_function_entry(65536)))
>> > > foo1 (void)
>> > > { /* { dg-warning "'patchable_function_entry' attribute argument
>> > > '65536' is out of range" } */
>> > > }
>> > > [hjl@gnu-skx-1 gcc]$ ./xgcc -B./ -S x.c
>> > > x.c:4:1: warning: ‘patchable_function_entry’ attribute argument
>> > > ‘65536’ is out of range (> 65535) [-Wattributes]
>> > >     4 | { /* { dg-warning "'patchable_function_entry' attribute
>> > > argument '65536' is out of range" } */
>> > >       | ^
>> > > [hjl@gnu-skx-1 gcc]$ ./xg++ -B./ -S x.c
>> > > x.c:3:11: warning: ‘patchable_function_entry’ attribute argument
>> > > ‘65536’ is out of range (> 65535) [-Wattributes]
>> > >     3 | foo1 (void)
>> > >       |           ^
>> > > [hjl@gnu-skx-1 gcc]$
>> > >
>> > > C warns at line 4 and C++ warns at line 3.   Do I need separate tests
>> > > for C and C++?
>> >
>> > I think better would be
>> >
>> > /* { dg-error "foo" "" { target c } } */
>> > /* { dg-error "bar" "" { target c++ } .-1 } */
>> >
>> > Marek
>> >
>>
>> It worked.
>
> Here is the patch with updated tests.   There are no regressions on
> Linux/x86-64.
> OK for master?
>
> Thanks.
>
>
> -- 
> H.J.
>
> From 8320bbb83e53f9e135fe1eca50840baacf157881 Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.to...@gmail.com>
> Date: Wed, 5 Feb 2020 04:01:59 -0800
> Subject: [PATCH] Add patch_area_size and patch_area_entry to crtl
>
> Currently patchable area is at the wrong place.  It is placed immediately
> after function label and before .cfi_startproc.  A backend should be able
> to add a pseudo patchable area instruction durectly into RTL.  This patch
> adds patch_area_size and patch_area_entry to crtl so that the patchable
> area info is available in RTL passes.
>
> It also limits patch_area_size and patch_area_entry to 65535, which is
> a reasonable maximum size for patchable area.
>
> gcc/c-family/
>
>       PR target/93492
>       * c-attribs.c (handle_patchable_function_entry_attribute): Limit
>       value to USHRT_MAX (65535).
>
> gcc/
>
>       PR target/93492
>       * cfgexpand.c (pass_expand::execute): Set crtl->patch_area_size
>       and crtl->patch_area_entry.
>       * emit-rtl.h (rtl_data): Add patch_area_size and patch_area_entry.
>       * opts.c (common_handle_option): Limit
>       function_entry_patch_area_size and function_entry_patch_area_start
>       to USHRT_MAX.  Fix a typo in error message.
>       * varasm.c (assemble_start_function): Use crtl->patch_area_size
>       and crtl->patch_area_entry.
>       * doc/invoke.texi: Document the maximum value for
>       -fpatchable-function-entry.
>
> gcc/testsuite/
>
>       PR target/93492
>       * c-c++-common/patchable_function_entry-error-1.c: New test.
>       * c-c++-common/patchable_function_entry-error-2.c: Likewise.
>       * c-c++-common/patchable_function_entry-error-3.c: Likewise.

LGTM, but an RM should have the final say on whether this is
suitable for stage 4.

Thanks,
Richard

Reply via email to