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

Reply via email to