Re: [PATCH] arm: Warn if IRQ handler is not compiled with -mgeneral-regs-only [PR target/94743]

2020-07-01 Thread Christophe Lyon via Gcc-patches
On Tue, 30 Jun 2020 at 15:34, Kyrylo Tkachov  wrote:
>
>
>
> > -Original Message-
> > From: Christophe Lyon 
> > Sent: 30 June 2020 14:32
> > To: Kyrylo Tkachov 
> > Cc: gcc-patches@gcc.gnu.org
> > Subject: Re: [PATCH] arm: Warn if IRQ handler is not compiled with -
> > mgeneral-regs-only [PR target/94743]
> >
> > On Tue, 30 Jun 2020 at 15:16, Kyrylo Tkachov 
> > wrote:
> > >
> > > Hi Christophe,
> > >
> > > Sorry for the delay.
> > >
> > > > -Original Message-
> > > > From: Gcc-patches  On Behalf Of
> > > > Christophe Lyon via Gcc-patches
> > > > Sent: 29 April 2020 16:19
> > > > To: gcc-patches@gcc.gnu.org
> > > > Subject: [PATCH] arm: Warn if IRQ handler is not compiled with -
> > mgeneral-
> > > > regs-only [PR target/94743]
> > > >
> > > > The interrupt attribute does not guarantee that the FP registers are
> > > > saved, which can result in problems difficult to debug.
> > > >
> > > > Saving the FP registers and status registers can be a large penalty,
> > > > so it's probably not desirable to do that all the time.
> > > >
> > > > If the handler calls other functions, we'd likely need to save all of
> > > > them, for lack of knowledge of which registers they actually use.
> > > >
> > > > This is even more obscure for the end-user when the compiler inserts
> > > > calls to helper functions such as memcpy (some multilibs do use FP
> > > > registers to speed it up).
> > > >
> > > > In the PR, we discussed adding routines in libgcc to save the FP
> > > > context and saving only locally-clobbered FP registers, but I think
> > > > this is too intrusive for stage 4.
> > > >
> > > > In the mean time, emit a warning to suggest re-compiling with
> > > > -mgeneral-regs-only. Note that this can lead to errors if the code
> > > > uses floating-point and -mfloat-abi=hard, eg:
> > > > argument of type 'double' not permitted with -mgeneral-regs-only
> > > >
> > > > This can be troublesome for the user, but at least this would make
> > > > them aware of the latent issue.
> > > >
> > > > The patch adds two testcases:
> > > > - pr94734-1.c checks that a warning is emitted. One function can make
> > > >   implicit calls to runtime floating-point routines, the other one
> > > >   doesn't. We can improve the diagnostic later not to warn in the
> > > >   second case.
> > > >
> > > > - pr94734-2.c checks that no warning is emitted when using
> > > >   -mgeneral-regs-only.
> > > >
> > > > 2020-04-29  Christophe Lyon  
> > > >
> > > >   PR target/94743
> > > >   gcc/
> > > >   * config/arm/arm.c (arm_handle_isr_attribute): Warn if
> > > >   -mgeneral-regs-only is not used.
> > > >
> > > >   gcc/testsuite/
> > > >   * gcc.target/arm/pr94743-1.c: New test.
> > > >   * gcc.target/arm/pr94743-2.c: New test.
> > > > ---
> > > >  gcc/config/arm/arm.c |  5 +
> > > >  gcc/testsuite/gcc.target/arm/pr94743-1.c | 20 
> > > >  gcc/testsuite/gcc.target/arm/pr94743-2.c | 17 +
> > > >  3 files changed, 42 insertions(+)
> > > >  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-1.c
> > > >  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-2.c
> > > >
> > > > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> > > > index 6a6e804..34aad1d 100644
> > > > --- a/gcc/config/arm/arm.c
> > > > +++ b/gcc/config/arm/arm.c
> > > > @@ -7176,6 +7176,11 @@ arm_handle_isr_attribute (tree *node, tree
> > name,
> > > > tree args, int flags,
> > > >  name);
> > > > *no_add_attrs = true;
> > > >   }
> > > > +  else if (TARGET_VFP_BASE)
> > > > + {
> > > > +   warning (OPT_Wattributes, "FP registers might be clobbered
> > > > despite %qE attribute: compile with -mgeneral-regs-only",
> > > > +name);
> > > > + }
> > >
> > > Let's use %< and %> to quote -mgeneral-regs-only properly.
> > > Ok with that change.
> >
> > Hi Kyrill,
> >
> > Thanks for the review, however I have posted v2 here:
> > https://gcc.gnu.org/pipermail/gcc-patches/2020-May/545747.html
> > (you approved v1)
> >
> > It includes a few more testcases and updates to existing ones.
> >
> > Is v2 OK with the quotation marks fixed?
> >
>
> Oops, sorry. Yes that looks ok too (with the quotation fixed).
> Kyrill
>

Thanks, pushed as r11-1732.
There were two follow-ups: r11-1752 because I forgot to update the
expected warning message in the testcases after I changed the
quotation)
and r11-1759 because I missed that gcc.target/arm/handler-align.c has
to be compiled with -mgeneral-regs-only like other testcases.

Sorry for the noise,

Christophe

> > Thanks
> >
> > Christophe
> >
> > > Thanks,
> > > Kyrill
> > >
> > > >/* FIXME: the argument if any is checked for type attributes;
> > > >should it be checked for decl ones?  */
> > > >  }
> > > > diff --git a/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > > > b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > > > new file mode 100644
> > > > index 

RE: [PATCH] arm: Warn if IRQ handler is not compiled with -mgeneral-regs-only [PR target/94743]

2020-06-30 Thread Kyrylo Tkachov


> -Original Message-
> From: Christophe Lyon 
> Sent: 30 June 2020 14:32
> To: Kyrylo Tkachov 
> Cc: gcc-patches@gcc.gnu.org
> Subject: Re: [PATCH] arm: Warn if IRQ handler is not compiled with -
> mgeneral-regs-only [PR target/94743]
> 
> On Tue, 30 Jun 2020 at 15:16, Kyrylo Tkachov 
> wrote:
> >
> > Hi Christophe,
> >
> > Sorry for the delay.
> >
> > > -Original Message-
> > > From: Gcc-patches  On Behalf Of
> > > Christophe Lyon via Gcc-patches
> > > Sent: 29 April 2020 16:19
> > > To: gcc-patches@gcc.gnu.org
> > > Subject: [PATCH] arm: Warn if IRQ handler is not compiled with -
> mgeneral-
> > > regs-only [PR target/94743]
> > >
> > > The interrupt attribute does not guarantee that the FP registers are
> > > saved, which can result in problems difficult to debug.
> > >
> > > Saving the FP registers and status registers can be a large penalty,
> > > so it's probably not desirable to do that all the time.
> > >
> > > If the handler calls other functions, we'd likely need to save all of
> > > them, for lack of knowledge of which registers they actually use.
> > >
> > > This is even more obscure for the end-user when the compiler inserts
> > > calls to helper functions such as memcpy (some multilibs do use FP
> > > registers to speed it up).
> > >
> > > In the PR, we discussed adding routines in libgcc to save the FP
> > > context and saving only locally-clobbered FP registers, but I think
> > > this is too intrusive for stage 4.
> > >
> > > In the mean time, emit a warning to suggest re-compiling with
> > > -mgeneral-regs-only. Note that this can lead to errors if the code
> > > uses floating-point and -mfloat-abi=hard, eg:
> > > argument of type 'double' not permitted with -mgeneral-regs-only
> > >
> > > This can be troublesome for the user, but at least this would make
> > > them aware of the latent issue.
> > >
> > > The patch adds two testcases:
> > > - pr94734-1.c checks that a warning is emitted. One function can make
> > >   implicit calls to runtime floating-point routines, the other one
> > >   doesn't. We can improve the diagnostic later not to warn in the
> > >   second case.
> > >
> > > - pr94734-2.c checks that no warning is emitted when using
> > >   -mgeneral-regs-only.
> > >
> > > 2020-04-29  Christophe Lyon  
> > >
> > >   PR target/94743
> > >   gcc/
> > >   * config/arm/arm.c (arm_handle_isr_attribute): Warn if
> > >   -mgeneral-regs-only is not used.
> > >
> > >   gcc/testsuite/
> > >   * gcc.target/arm/pr94743-1.c: New test.
> > >   * gcc.target/arm/pr94743-2.c: New test.
> > > ---
> > >  gcc/config/arm/arm.c |  5 +
> > >  gcc/testsuite/gcc.target/arm/pr94743-1.c | 20 
> > >  gcc/testsuite/gcc.target/arm/pr94743-2.c | 17 +
> > >  3 files changed, 42 insertions(+)
> > >  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-1.c
> > >  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-2.c
> > >
> > > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> > > index 6a6e804..34aad1d 100644
> > > --- a/gcc/config/arm/arm.c
> > > +++ b/gcc/config/arm/arm.c
> > > @@ -7176,6 +7176,11 @@ arm_handle_isr_attribute (tree *node, tree
> name,
> > > tree args, int flags,
> > >  name);
> > > *no_add_attrs = true;
> > >   }
> > > +  else if (TARGET_VFP_BASE)
> > > + {
> > > +   warning (OPT_Wattributes, "FP registers might be clobbered
> > > despite %qE attribute: compile with -mgeneral-regs-only",
> > > +name);
> > > + }
> >
> > Let's use %< and %> to quote -mgeneral-regs-only properly.
> > Ok with that change.
> 
> Hi Kyrill,
> 
> Thanks for the review, however I have posted v2 here:
> https://gcc.gnu.org/pipermail/gcc-patches/2020-May/545747.html
> (you approved v1)
> 
> It includes a few more testcases and updates to existing ones.
> 
> Is v2 OK with the quotation marks fixed?
> 

Oops, sorry. Yes that looks ok too (with the quotation fixed).
Kyrill

> Thanks
> 
> Christophe
> 
> > Thanks,
> > Kyrill
> >
> > >/* FIXME: the argument if any is checked for type attributes;
> > >should it be checked for decl ones?  */
> > >  }
> > > diff --git a/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > > b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > > new file mode 100644
> > > index 000..67700c6
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > > @@ -0,0 +1,20 @@
> > > +/* PR target/94743 */
> > > +/* { dg-do compile } */
> > > +
> > > +typedef struct {
> > > +  double fpdata[32];
> > > +} dummy_t;
> > > +
> > > +dummy_t global_d;
> > > +dummy_t global_d1;
> > > +
> > > +__attribute__ ((interrupt("IRQ"))) void IRQ_HDLR_Test(void)
> > > +{ /* { dg-warning { FP registers might be clobbered despite 'interrupt'
> > > attribute: compile with -mgeneral-regs-only} "" { target *-*-* } . } */
> > > +  global_d.fpdata[3] += global_d.fpdata[3] * global_d1.fpdata[3];
> > > +}
> > > +
> > > +
> > > 

Re: [PATCH] arm: Warn if IRQ handler is not compiled with -mgeneral-regs-only [PR target/94743]

2020-06-30 Thread Christophe Lyon via Gcc-patches
On Tue, 30 Jun 2020 at 15:16, Kyrylo Tkachov  wrote:
>
> Hi Christophe,
>
> Sorry for the delay.
>
> > -Original Message-
> > From: Gcc-patches  On Behalf Of
> > Christophe Lyon via Gcc-patches
> > Sent: 29 April 2020 16:19
> > To: gcc-patches@gcc.gnu.org
> > Subject: [PATCH] arm: Warn if IRQ handler is not compiled with -mgeneral-
> > regs-only [PR target/94743]
> >
> > The interrupt attribute does not guarantee that the FP registers are
> > saved, which can result in problems difficult to debug.
> >
> > Saving the FP registers and status registers can be a large penalty,
> > so it's probably not desirable to do that all the time.
> >
> > If the handler calls other functions, we'd likely need to save all of
> > them, for lack of knowledge of which registers they actually use.
> >
> > This is even more obscure for the end-user when the compiler inserts
> > calls to helper functions such as memcpy (some multilibs do use FP
> > registers to speed it up).
> >
> > In the PR, we discussed adding routines in libgcc to save the FP
> > context and saving only locally-clobbered FP registers, but I think
> > this is too intrusive for stage 4.
> >
> > In the mean time, emit a warning to suggest re-compiling with
> > -mgeneral-regs-only. Note that this can lead to errors if the code
> > uses floating-point and -mfloat-abi=hard, eg:
> > argument of type 'double' not permitted with -mgeneral-regs-only
> >
> > This can be troublesome for the user, but at least this would make
> > them aware of the latent issue.
> >
> > The patch adds two testcases:
> > - pr94734-1.c checks that a warning is emitted. One function can make
> >   implicit calls to runtime floating-point routines, the other one
> >   doesn't. We can improve the diagnostic later not to warn in the
> >   second case.
> >
> > - pr94734-2.c checks that no warning is emitted when using
> >   -mgeneral-regs-only.
> >
> > 2020-04-29  Christophe Lyon  
> >
> >   PR target/94743
> >   gcc/
> >   * config/arm/arm.c (arm_handle_isr_attribute): Warn if
> >   -mgeneral-regs-only is not used.
> >
> >   gcc/testsuite/
> >   * gcc.target/arm/pr94743-1.c: New test.
> >   * gcc.target/arm/pr94743-2.c: New test.
> > ---
> >  gcc/config/arm/arm.c |  5 +
> >  gcc/testsuite/gcc.target/arm/pr94743-1.c | 20 
> >  gcc/testsuite/gcc.target/arm/pr94743-2.c | 17 +
> >  3 files changed, 42 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-1.c
> >  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-2.c
> >
> > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> > index 6a6e804..34aad1d 100644
> > --- a/gcc/config/arm/arm.c
> > +++ b/gcc/config/arm/arm.c
> > @@ -7176,6 +7176,11 @@ arm_handle_isr_attribute (tree *node, tree name,
> > tree args, int flags,
> >  name);
> > *no_add_attrs = true;
> >   }
> > +  else if (TARGET_VFP_BASE)
> > + {
> > +   warning (OPT_Wattributes, "FP registers might be clobbered
> > despite %qE attribute: compile with -mgeneral-regs-only",
> > +name);
> > + }
>
> Let's use %< and %> to quote -mgeneral-regs-only properly.
> Ok with that change.

Hi Kyrill,

Thanks for the review, however I have posted v2 here:
https://gcc.gnu.org/pipermail/gcc-patches/2020-May/545747.html
(you approved v1)

It includes a few more testcases and updates to existing ones.

Is v2 OK with the quotation marks fixed?

Thanks

Christophe

> Thanks,
> Kyrill
>
> >/* FIXME: the argument if any is checked for type attributes;
> >should it be checked for decl ones?  */
> >  }
> > diff --git a/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > new file mode 100644
> > index 000..67700c6
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> > @@ -0,0 +1,20 @@
> > +/* PR target/94743 */
> > +/* { dg-do compile } */
> > +
> > +typedef struct {
> > +  double fpdata[32];
> > +} dummy_t;
> > +
> > +dummy_t global_d;
> > +dummy_t global_d1;
> > +
> > +__attribute__ ((interrupt("IRQ"))) void IRQ_HDLR_Test(void)
> > +{ /* { dg-warning { FP registers might be clobbered despite 'interrupt'
> > attribute: compile with -mgeneral-regs-only} "" { target *-*-* } . } */
> > +  global_d.fpdata[3] += global_d.fpdata[3] * global_d1.fpdata[3];
> > +}
> > +
> > +
> > +__attribute__ ((interrupt("IRQ"))) void IRQ_HDLR_Test2(void)
> > +{ /* { dg-warning { FP registers might be clobbered despite 'interrupt'
> > attribute: compile with -mgeneral-regs-only} "" { target *-*-* } . } */
> > +  global_d.fpdata[3] = 1.0;
> > +}
> > diff --git a/gcc/testsuite/gcc.target/arm/pr94743-2.c
> > b/gcc/testsuite/gcc.target/arm/pr94743-2.c
> > new file mode 100644
> > index 000..745fd36
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/pr94743-2.c
> > @@ -0,0 +1,17 @@
> > +/* PR target/94743 */
> > +/* { dg-do compile } */
> > +/* { dg-options 

RE: [PATCH] arm: Warn if IRQ handler is not compiled with -mgeneral-regs-only [PR target/94743]

2020-06-30 Thread Kyrylo Tkachov
Hi Christophe,

Sorry for the delay.

> -Original Message-
> From: Gcc-patches  On Behalf Of
> Christophe Lyon via Gcc-patches
> Sent: 29 April 2020 16:19
> To: gcc-patches@gcc.gnu.org
> Subject: [PATCH] arm: Warn if IRQ handler is not compiled with -mgeneral-
> regs-only [PR target/94743]
> 
> The interrupt attribute does not guarantee that the FP registers are
> saved, which can result in problems difficult to debug.
> 
> Saving the FP registers and status registers can be a large penalty,
> so it's probably not desirable to do that all the time.
> 
> If the handler calls other functions, we'd likely need to save all of
> them, for lack of knowledge of which registers they actually use.
> 
> This is even more obscure for the end-user when the compiler inserts
> calls to helper functions such as memcpy (some multilibs do use FP
> registers to speed it up).
> 
> In the PR, we discussed adding routines in libgcc to save the FP
> context and saving only locally-clobbered FP registers, but I think
> this is too intrusive for stage 4.
> 
> In the mean time, emit a warning to suggest re-compiling with
> -mgeneral-regs-only. Note that this can lead to errors if the code
> uses floating-point and -mfloat-abi=hard, eg:
> argument of type 'double' not permitted with -mgeneral-regs-only
> 
> This can be troublesome for the user, but at least this would make
> them aware of the latent issue.
> 
> The patch adds two testcases:
> - pr94734-1.c checks that a warning is emitted. One function can make
>   implicit calls to runtime floating-point routines, the other one
>   doesn't. We can improve the diagnostic later not to warn in the
>   second case.
> 
> - pr94734-2.c checks that no warning is emitted when using
>   -mgeneral-regs-only.
> 
> 2020-04-29  Christophe Lyon  
> 
>   PR target/94743
>   gcc/
>   * config/arm/arm.c (arm_handle_isr_attribute): Warn if
>   -mgeneral-regs-only is not used.
> 
>   gcc/testsuite/
>   * gcc.target/arm/pr94743-1.c: New test.
>   * gcc.target/arm/pr94743-2.c: New test.
> ---
>  gcc/config/arm/arm.c |  5 +
>  gcc/testsuite/gcc.target/arm/pr94743-1.c | 20 
>  gcc/testsuite/gcc.target/arm/pr94743-2.c | 17 +
>  3 files changed, 42 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-1.c
>  create mode 100644 gcc/testsuite/gcc.target/arm/pr94743-2.c
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index 6a6e804..34aad1d 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -7176,6 +7176,11 @@ arm_handle_isr_attribute (tree *node, tree name,
> tree args, int flags,
>  name);
> *no_add_attrs = true;
>   }
> +  else if (TARGET_VFP_BASE)
> + {
> +   warning (OPT_Wattributes, "FP registers might be clobbered
> despite %qE attribute: compile with -mgeneral-regs-only",
> +name);
> + }

Let's use %< and %> to quote -mgeneral-regs-only properly.
Ok with that change.
Thanks,
Kyrill

>/* FIXME: the argument if any is checked for type attributes;
>should it be checked for decl ones?  */
>  }
> diff --git a/gcc/testsuite/gcc.target/arm/pr94743-1.c
> b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> new file mode 100644
> index 000..67700c6
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/pr94743-1.c
> @@ -0,0 +1,20 @@
> +/* PR target/94743 */
> +/* { dg-do compile } */
> +
> +typedef struct {
> +  double fpdata[32];
> +} dummy_t;
> +
> +dummy_t global_d;
> +dummy_t global_d1;
> +
> +__attribute__ ((interrupt("IRQ"))) void IRQ_HDLR_Test(void)
> +{ /* { dg-warning { FP registers might be clobbered despite 'interrupt'
> attribute: compile with -mgeneral-regs-only} "" { target *-*-* } . } */
> +  global_d.fpdata[3] += global_d.fpdata[3] * global_d1.fpdata[3];
> +}
> +
> +
> +__attribute__ ((interrupt("IRQ"))) void IRQ_HDLR_Test2(void)
> +{ /* { dg-warning { FP registers might be clobbered despite 'interrupt'
> attribute: compile with -mgeneral-regs-only} "" { target *-*-* } . } */
> +  global_d.fpdata[3] = 1.0;
> +}
> diff --git a/gcc/testsuite/gcc.target/arm/pr94743-2.c
> b/gcc/testsuite/gcc.target/arm/pr94743-2.c
> new file mode 100644
> index 000..745fd36
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/pr94743-2.c
> @@ -0,0 +1,17 @@
> +/* PR target/94743 */
> +/* { dg-do compile } */
> +/* { dg-options "-mgeneral-regs-only" } */
> +
> +typedef struct {
> +  /* Do not use floating-point types, which are not be compatible with
> + -mgeneral-regs-only under -mfloat-abi=hard */
> +  int fpdata[32];
> +} dummy_t;
> +
> +dummy_t global_d;
> +dummy_t global_d1;
> +
> +__attribute__ ((interrupt("IRQ"))) void IRQ_HDLR_Test(void)
> +{
> +  global_d.fpdata[3] += global_d.fpdata[3] * global_d1.fpdata[3];
> +}
> --
> 2.7.4