On Fri, 2025-05-09 at 10:14 +0800, Lulu Cheng wrote: > From: ChengLulu <chengl...@loongson.cn> > > PR target/99217 > > gcc/ChangeLog: > > * config/mips/mips.cc (mips_start_function_definition): > Implements the functionality of '-fpatchable-function-entry='. > (mips_print_patchable_function_entry): Define empty function. > (TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY): Define macro. > > gcc/testsuite/ChangeLog: > > * gcc.target/mips/pr99217.c: New test. > > --- > v1 -> v2: > Add testsuite.
CC'ing Jie Mei as he also participated in the review. > --- > gcc/config/mips/mips.cc | 33 +++++++++++++++++++++++++ > gcc/testsuite/gcc.target/mips/pr99217.c | 10 ++++++++ > 2 files changed, 43 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/mips/pr99217.c > > diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc > index 24a28dcf817..f4ec59713b4 100644 > --- a/gcc/config/mips/mips.cc > +++ b/gcc/config/mips/mips.cc > @@ -7478,6 +7478,9 @@ static void > mips_start_function_definition (const char *name, bool mips16_p, > tree decl ATTRIBUTE_UNUSED) > { > + unsigned HOST_WIDE_INT patch_area_size = crtl->patch_area_size; > + unsigned HOST_WIDE_INT patch_area_entry = crtl->patch_area_entry; > + > if (mips16_p) > fprintf (asm_out_file, "\t.set\tmips16\n"); > else > @@ -7490,6 +7493,10 @@ mips_start_function_definition (const char *name, bool > mips16_p, > fprintf (asm_out_file, "\t.set\tnomicromips\n"); > #endif > > + /* Emit the patching area before the entry label, if any. */ > + if (patch_area_entry > 0) > + default_print_patchable_function_entry (asm_out_file, > + patch_area_entry, true); > if (!flag_inhibit_size_directive) > { > fputs ("\t.ent\t", asm_out_file); > @@ -7501,6 +7508,13 @@ mips_start_function_definition (const char *name, bool > mips16_p, > > /* Start the definition proper. */ > ASM_OUTPUT_FUNCTION_LABEL (asm_out_file, name, decl); > + > + /* And the area after the label. Record it if we haven't done so yet. */ > + if (patch_area_size > patch_area_entry) > + default_print_patchable_function_entry (asm_out_file, > + patch_area_size > + - patch_area_entry, > + patch_area_entry == 0); > } > > /* End a function definition started by mips_start_function_definition. */ > @@ -23338,6 +23352,21 @@ mips_bit_clear_p (enum machine_mode mode, unsigned > HOST_WIDE_INT m) > return false; > } > > +/* define TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY */ > + > +/* The MIPS function start is implemented in the prologue function. > + TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY needs to be inserted > + before or after the function name, so this function does not > + use a public implementation. This function is implemented in > + mips_start_function_definition. */ > + > +void > +mips_print_patchable_function_entry (FILE *file ATTRIBUTE_UNUSED, > + unsigned HOST_WIDE_INT > + patch_area_size ATTRIBUTE_UNUSED, > + bool record_p ATTRIBUTE_UNUSED) > +{} > + > /* Initialize the GCC target structure. */ > #undef TARGET_ASM_ALIGNED_HI_OP > #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" > @@ -23651,6 +23680,10 @@ mips_bit_clear_p (enum machine_mode mode, unsigned > HOST_WIDE_INT m) > #undef TARGET_DOCUMENTATION_NAME > #define TARGET_DOCUMENTATION_NAME "MIPS" > > +#undef TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY > +#define TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY \ > +mips_print_patchable_function_entry > + > struct gcc_target targetm = TARGET_INITIALIZER; > > #include "gt-mips.h" > diff --git a/gcc/testsuite/gcc.target/mips/pr99217.c > b/gcc/testsuite/gcc.target/mips/pr99217.c > new file mode 100644 > index 00000000000..f5851bb1606 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/mips/pr99217.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-fpatchable-function-entry=1" } */ > +/* { dg-final { scan-assembler > "foo:*.*.LPFE0:\n\t.set\tnoreorder\n\tnop\n\t.set\treorder" } } */ Typo? Should be: /* { dg-final { scan-assembler "foo:\n.*.LPFE0:\n\t.set\tnoreorder\n\tnop\n\t.set\treorder" } } */ ( foo:*.* => foo:\n.* ) > +/* Test the placement of the .LPFE0 label. */ > + > +void > +foo (void) > +{ > +} Otherwise LGTM and to Jie Mei. Thanks, Rong