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 >