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)
+{
+}