Sven Schnelle has implemented dynamic ftrace support for parisc linux: https://lore.kernel.org/linux-parisc/20190605203222.6194-1-sv...@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.ang...@bell.net 2019-06-07 John David Anglin <dang...@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. 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