[committed] hppa: Fix support for -fpatchtable-function-entry on hppa-linux

Message ID 7116a4ab-3cc4-8187-7564-4dd656fdfff3@bell.net
State New
Headers show
Series
  • [committed] hppa: Fix support for -fpatchtable-function-entry on hppa-linux
Related show

Commit Message

John David Anglin June 8, 2019, 12:32 a.m.
Sven Schnelle has implemented dynamic ftrace support for parisc linux:
https://lore.kernel.org/linux-parisc/20190605203222.6194-1-svens@stackframe.org/T/#t

It uses -fpatchtable-function-entry to allocate a set of nops before each function.  This
patch fixes this option on hppa-linux.  The main change needed was to output the function
label and associated callinfo data using ASM_DECLARE_FUNCTION_NAME instead of
TARGET_ASM_FUNCTION_PROLOGUE.

Tested on hppa-unknown-linux-gnu and hppa2.0w-hp-hpux11.11.  Committed to trunk, gcc-9
and gcc-8.

Dave
-- 
John David Anglin  dave.anglin@bell.net

2019-06-07  John David Anglin  <danglin@gcc.gnu.orig>

	PR target/90751
	* config/pa/pa-linux.h (ASM_DECLARE_FUNCTION_NAME): Update comment.
	Call pa_output_function_label.
	(TARGET_ASM_FUNCTION_PROLOGUE): define.
	* config/pa/pa-protos.h (pa_output_function_label): Declare.
	* config/pa/pa.c (pa_output_function_prologue): Add ATTRIBUTE_UNUSED
	to declaration.
	(pa_linux_output_function_prologue): Declare.
	(TARGET_ASM_FUNCTION_PROLOGUE): Delete define.
	(pa_output_function_label): New.
	(pa_output_function_prologue): Revise to use pa_output_function_label.
	(pa_linux_output_function_prologue): New.
	* config/pa/pa.h (TARGET_ASM_FUNCTION_PROLOGUE): Define.

Patch

Index: config/pa/pa-linux.h
===================================================================
--- config/pa/pa-linux.h	(revision 271889)
+++ config/pa/pa-linux.h	(working copy)
@@ -101,7 +102,7 @@ 

 /* FIXME: Hacked from the <elfos.h> one so that we avoid multiple
    labels in a function declaration (since pa.c seems determined to do
-   it differently)  */
+   it differently).  */

 #undef ASM_DECLARE_FUNCTION_NAME
 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)		\
@@ -109,9 +110,14 @@ 
     {								\
       ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");	\
       ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));		\
+      pa_output_function_label (FILE);				\
     }								\
   while (0)

+/* Output function prologue for linux.  */
+#undef TARGET_ASM_FUNCTION_PROLOGUE
+#define TARGET_ASM_FUNCTION_PROLOGUE pa_linux_output_function_prologue
+
 /* As well as globalizing the label, we need to encode the label
    to ensure a plabel is generated in an indirect call.  */

Index: config/pa/pa-protos.h
===================================================================
--- config/pa/pa-protos.h	(revision 271889)
+++ config/pa/pa-protos.h	(working copy)
@@ -108,6 +108,7 @@ 
 extern void pa_hpux_asm_output_external (FILE *, tree, const char *);
 extern HOST_WIDE_INT pa_initial_elimination_offset (int, int);
 extern HOST_WIDE_INT pa_function_arg_size (machine_mode, const_tree);
+extern void pa_output_function_label (FILE *);

 extern const int pa_magic_milli[];

Index: config/pa/pa.c
===================================================================
--- config/pa/pa.c	(revision 271889)
+++ config/pa/pa.c	(working copy)
@@ -118,7 +118,8 @@ 
 static rtx pa_function_value (const_tree, const_tree, bool);
 static rtx pa_libcall_value (machine_mode, const_rtx);
 static bool pa_function_value_regno_p (const unsigned int);
-static void pa_output_function_prologue (FILE *);
+static void pa_output_function_prologue (FILE *) ATTRIBUTE_UNUSED;
+static void pa_linux_output_function_prologue (FILE *) ATTRIBUTE_UNUSED;
 static void update_total_code_bytes (unsigned int);
 static void pa_output_function_epilogue (FILE *);
 static int pa_adjust_cost (rtx_insn *, int, rtx_insn *, int, unsigned int);
@@ -262,8 +263,6 @@ 
 #undef TARGET_ASM_INTEGER
 #define TARGET_ASM_INTEGER pa_assemble_integer

-#undef TARGET_ASM_FUNCTION_PROLOGUE
-#define TARGET_ASM_FUNCTION_PROLOGUE pa_output_function_prologue
 #undef TARGET_ASM_FUNCTION_EPILOGUE
 #define TARGET_ASM_FUNCTION_EPILOGUE pa_output_function_epilogue

@@ -3842,16 +3841,10 @@ 
 	  & ~(PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT - 1));
 }

-/* On HP-PA, move-double insns between fpu and cpu need an 8-byte block
-   of memory.  If any fpu reg is used in the function, we allocate
-   such a block here, at the bottom of the frame, just in case it's needed.
+/* Output function label, and associated .PROC and .CALLINFO statements.  */

-   If this function is a leaf procedure, then we may choose not
-   to do a "save" insn.  The decision about whether or not
-   to do this is made in regclass.c.  */
-
-static void
-pa_output_function_prologue (FILE *file)
+void
+pa_output_function_label (FILE *file)
 {
   /* The function's label and associated .PROC must never be
      separated and must be output *after* any profiling declarations
@@ -3897,10 +3890,25 @@ 
     fprintf (file, ",ENTRY_FR=%d", fr_saved + 11);

   fputs ("\n\t.ENTRY\n", file);
+}

+/* Output function prologue.  */
+
+static void
+pa_output_function_prologue (FILE *file)
+{
+  pa_output_function_label (file);
   remove_useless_addtr_insns (0);
 }

+/* The label is output by ASM_DECLARE_FUNCTION_NAME on linux.  */
+
+static void
+pa_linux_output_function_prologue (FILE *file ATTRIBUTE_UNUSED)
+{
+  remove_useless_addtr_insns (0);
+}
+
 void
 pa_expand_prologue (void)
 {
Index: config/pa/pa.h
===================================================================
--- config/pa/pa.h	(revision 271889)
+++ config/pa/pa.h	(working copy)
@@ -1305,3 +1305,6 @@ 

 /* Target CPU versions for D.  */
 #define TARGET_D_CPU_VERSIONS pa_d_target_versions
+
+/* Output default function prologue for hpux.  */
+#define TARGET_ASM_FUNCTION_PROLOGUE pa_output_function_prologue