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. --- 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" } } */ + +/* Test the placement of the .LPFE0 label. */ + +void +foo (void) +{ +} -- 2.20.1