Pushed with Yangyu's suggestion :)

On Fri, Nov 8, 2024 at 3:03 PM yulong <shiyul...@iscas.ac.cn> wrote:
>
> Thanks, Kito and yangyu!
>
> 在 2024/11/8 0:35, Yangyu Chen 写道:
> > Thanks for doing this!
> >
> >> On Nov 8, 2024, at 00:19, shiyul...@iscas.ac.cn wrote:
> >>
> >> From: yulong <shiyul...@iscas.ac.cn>
> >>
> >> This patch adds norelax function attribute that be discussed in 
> >> riscv-c-api-doc PR#94.
> >> URL:https://github.com/riscv-non-isa/riscv-c-api-doc/pull/94
> >>
> >> gcc/ChangeLog:
> >>
> >>         * config/riscv/riscv.cc (riscv_declare_function_name): Add new 
> >> attribute.
> >>
> >> ---
> >> gcc/config/riscv/riscv.cc                     | 18 +++++++++++++---
> >> .../gcc.target/riscv/target-attr-norelax.c    | 21 +++++++++++++++++++
> >> 2 files changed, 36 insertions(+), 3 deletions(-)
> >> create mode 100644 gcc/testsuite/gcc.target/riscv/target-attr-norelax.c
> >>
> >> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> >> index 2e9ac280c8f2..42525ff6faa3 100644
> >> --- a/gcc/config/riscv/riscv.cc
> >> +++ b/gcc/config/riscv/riscv.cc
> >> @@ -654,6 +654,10 @@ static const attribute_spec riscv_gnu_attributes[] =
> >>       types.  */
> >>    {"riscv_rvv_vector_bits", 1, 1, false, true, false, true,
> >>     riscv_handle_rvv_vector_bits_attribute, NULL},
> >> +  /* This attribute is used to declare a function, forcing it to use the
> >> +    standard vector calling convention variant. Syntax:
> >> +    __attribute__((norelax)). */
> >> +  {"norelax", 0, 0, true, false, false, false, NULL, NULL},
> >> };
> >>
> >> static const scoped_attribute_specs riscv_gnu_attribute_table  =
> >> @@ -10051,10 +10055,17 @@ riscv_declare_function_name (FILE *stream, const 
> >> char *name, tree fndecl)
> >>    riscv_asm_output_variant_cc (stream, fndecl, name);
> >>    ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
> >>    ASM_OUTPUT_FUNCTION_LABEL (stream, name, fndecl);
> >> -  if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl))
> >> +  if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
> >> +      || lookup_attribute ("norelax", DECL_ATTRIBUTES (fndecl)))
> >>      {
> >>        fprintf (stream, "\t.option push\n");
> >> -
> >> +      if (lookup_attribute ("norelax", DECL_ATTRIBUTES (fndecl)))
> >> + {
> >> +  fprintf (stream, "\t.option norelax\n");
> >> + }
> >> +    }
> >> +  if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl))
> >> +    {
> > It's better to include the above 2 lines in the first block.
> >
> > So the whole block `if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl))`
> > will be in the true block of `if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
> > || lookup_attribute ("norelax", DECL_ATTRIBUTES (fndecl)))`.
> >
> > Don't forget to adjust the indentation.
> >
> > Otherwise, LGTM.
> >
> >>        struct cl_target_option *local_cl_target =
> >> TREE_TARGET_OPTION (DECL_FUNCTION_SPECIFIC_TARGET (fndecl));
> >>        struct cl_target_option *global_cl_target =
> >> @@ -10078,7 +10089,8 @@ riscv_declare_function_size (FILE *stream, const 
> >> char *name, tree fndecl)
> >>    if (!flag_inhibit_size_directive)
> >>      ASM_OUTPUT_MEASURED_SIZE (stream, name);
> >>
> >> -  if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl))
> >> +  if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
> >> +      || lookup_attribute ("norelax", DECL_ATTRIBUTES (fndecl)))
> >>      {
> >>        fprintf (stream, "\t.option pop\n");
> >>      }
> >> diff --git a/gcc/testsuite/gcc.target/riscv/target-attr-norelax.c 
> >> b/gcc/testsuite/gcc.target/riscv/target-attr-norelax.c
> >> new file mode 100644
> >> index 000000000000..77de6195ad1e
> >> --- /dev/null
> >> +++ b/gcc/testsuite/gcc.target/riscv/target-attr-norelax.c
> >> @@ -0,0 +1,21 @@
> >> +/* { dg-do compile } */
> >> +/* { dg-options "-march=rv32gc" { target { rv32 } } } */
> >> +/* { dg-options "-march=rv64gc" { target { rv64 } } } */
> >> +
> >> +__attribute__((norelax))
> >> +void foo1()
> >> +{}
> >> +
> >> +void foo2(void)
> >> +{}
> >> +
> >> +int main()
> >> +{
> >> +  foo1();
> >> +  foo2();
> >> +  return 0;
> >> +}
> >> +
> >> +/* { dg-final { scan-assembler-times ".option push\t" 1 } } */
> >> +/* { dg-final { scan-assembler-times ".option norelax\t" 1 } } */
> >> +/* { dg-final { scan-assembler-times ".option pop\t" 1 } } */
> >> --
> >> 2.34.1
>

Reply via email to