56d343
2014-05-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
56d343
56d343
	* target.def: Add new target hook.
56d343
	* doc/tm.texi: Regenerate.
56d343
	* targhooks.h (default_keep_leaf_when_profiled): Add prototype.
56d343
	* targhooks.c (default_keep_leaf_when_profiled): New function.
56d343
56d343
2015-04-23  Anton Blanchard  <anton@samba.org>
56d343
56d343
	* config/rs6000/rs6000.c (rs6000_output_function_prologue): No
56d343
	need for -mprofile-kernel to save LR to stack.
56d343
56d343
2016-01-21  Anton Blanchard  <anton@samba.org>
56d343
	    Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
56d343
56d343
	PR target/63354
56d343
	* config/rs6000/linux64.h (TARGET_KEEP_LEAF_WHEN_PROFILED): New
56d343
	#define.
56d343
	* config/rs6000/rs6000.c (rs6000_keep_leaf_when_profiled): New
56d343
	function.
56d343
56d343
	* gcc.target/powerpc/pr63354.c:  New test.
56d343
56d343
--- gcc/doc/tm.texi
56d343
+++ gcc/doc/tm.texi
56d343
@@ -4953,6 +4953,10 @@ Define this macro if the code for function profiling should come before
56d343
 the function prologue.  Normally, the profiling code comes after.
56d343
 @end defmac
56d343
 
56d343
+@deftypefn {Target Hook} bool TARGET_KEEP_LEAF_WHEN_PROFILED (void)
56d343
+This target hook returns true if the target wants the leaf flag for the current function to stay true even if it calls mcount.  This might make sense for targets using the leaf flag only to determine whether a stack frame needs to be generated or not and for which the call to mcount is generated before the function prologue.
56d343
+@end deftypefn
56d343
+
56d343
 @node Tail Calls
56d343
 @subsection Permitting tail calls
56d343
 @cindex tail calls
56d343
--- gcc/doc/tm.texi.in
56d343
+++ gcc/doc/tm.texi.in
56d343
@@ -3963,6 +3963,8 @@ Define this macro if the code for function profiling should come before
56d343
 the function prologue.  Normally, the profiling code comes after.
56d343
 @end defmac
56d343
 
56d343
+@hook TARGET_KEEP_LEAF_WHEN_PROFILED
56d343
+
56d343
 @node Tail Calls
56d343
 @subsection Permitting tail calls
56d343
 @cindex tail calls
56d343
--- gcc/final.c
56d343
+++ gcc/final.c
56d343
@@ -4241,7 +4241,9 @@ leaf_function_p (void)
56d343
 {
56d343
   rtx insn;
56d343
 
56d343
-  if (crtl->profile || profile_arc_flag)
56d343
+  /* Some back-ends (e.g. s390) want leaf functions to stay leaf
56d343
+     functions even if they call mcount.  */
56d343
+  if (crtl->profile && !targetm.keep_leaf_when_profiled ())
56d343
     return 0;
56d343
 
56d343
   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
56d343
--- gcc/target.def
56d343
+++ gcc/target.def
56d343
@@ -2658,6 +2658,18 @@ The default version of this hook use the target macro\n\
56d343
  bool, (void),
56d343
  default_profile_before_prologue)
56d343
 
56d343
+/* Return true if a leaf function should stay leaf even with profiling
56d343
+   enabled.  */
56d343
+DEFHOOK
56d343
+(keep_leaf_when_profiled,
56d343
+ "This target hook returns true if the target wants the leaf flag for\
56d343
+ the current function to stay true even if it calls mcount.  This might\
56d343
+ make sense for targets using the leaf flag only to determine whether a\
56d343
+ stack frame needs to be generated or not and for which the call to\
56d343
+ mcount is generated before the function prologue.",
56d343
+ bool, (void),
56d343
+ default_keep_leaf_when_profiled)
56d343
+
56d343
 /* Modify and return the identifier of a DECL's external name,
56d343
    originally identified by ID, as required by the target,
56d343
    (eg, append @nn to windows32 stdcall function names).
56d343
--- gcc/targhooks.c
56d343
+++ gcc/targhooks.c
56d343
@@ -1447,6 +1447,15 @@ default_get_reg_raw_mode (int regno)
56d343
   return reg_raw_mode[regno];
56d343
 }
56d343
 
56d343
+/* Return true if a leaf function should stay leaf even with profiling
56d343
+   enabled.  */
56d343
+
56d343
+bool
56d343
+default_keep_leaf_when_profiled ()
56d343
+{
56d343
+  return false;
56d343
+}
56d343
+
56d343
 /* Return true if the state of option OPTION should be stored in PCH files
56d343
    and checked by default_pch_valid_p.  Store the option's current state
56d343
    in STATE if so.  */
56d343
--- gcc/targhooks.h
56d343
+++ gcc/targhooks.h
56d343
@@ -188,6 +188,7 @@ extern section * default_function_sectio
56d343
 					  bool startup, bool exit);
56d343
 extern enum machine_mode default_dwarf_frame_reg_mode (int);
56d343
 extern enum machine_mode default_get_reg_raw_mode(int);
56d343
+extern bool default_keep_leaf_when_profiled ();
56d343
 
56d343
 extern void *default_get_pch_validity (size_t *);
56d343
 extern const char *default_pch_valid_p (const void *, size_t);
56d343
--- gcc/config/rs6000/rs6000.c
56d343
+++ gcc/config/rs6000/rs6000.c
56d343
@@ -24433,7 +24433,6 @@ rs6000_output_function_prologue (FILE *file,
56d343
       gcc_assert (!TARGET_32BIT);
56d343
 
56d343
       asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
56d343
-      asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
56d343
 
56d343
       /* In the ELFv2 ABI we have no compiler stack word.  It must be
56d343
 	 the resposibility of _mcount to preserve the static chain
56d343
--- gcc/config/rs6000/linux64.h
56d343
+++ gcc/config/rs6000/linux64.h
56d343
@@ -59,6 +59,9 @@ extern int dot_symbols;
56d343
 
56d343
 #define TARGET_PROFILE_KERNEL profile_kernel
56d343
 
56d343
+#undef TARGET_KEEP_LEAF_WHEN_PROFILED
56d343
+#define TARGET_KEEP_LEAF_WHEN_PROFILED rs6000_keep_leaf_when_profiled
56d343
+
56d343
 #define TARGET_USES_LINUX64_OPT 1
56d343
 #ifdef HAVE_LD_LARGE_TOC
56d343
 #undef TARGET_CMODEL
56d343
--- gcc/config/rs6000/rs6000.c
56d343
+++ gcc/config/rs6000/rs6000.c
56d343
@@ -26237,6 +26237,14 @@ rs6000_output_function_prologue (FILE *file,
56d343
   rs6000_pic_labelno++;
56d343
 }
56d343
 
56d343
+/* -mprofile-kernel code calls mcount before the function prolog,
56d343
+   so a profiled leaf function should stay a leaf function.  */
56d343
+static bool
56d343
+rs6000_keep_leaf_when_profiled ()
56d343
+{
56d343
+  return TARGET_PROFILE_KERNEL;
56d343
+}
56d343
+
56d343
 /* Non-zero if vmx regs are restored before the frame pop, zero if
56d343
    we restore after the pop when possible.  */
56d343
 #define ALWAYS_RESTORE_ALTIVEC_BEFORE_POP 0
56d343
--- /dev/null
56d343
+++ gcc/testsuite/gcc.target/powerpc/pr63354.c
56d343
@@ -0,0 +1,12 @@
56d343
+/* Verify that we don't stack a frame for leaf functions when using
56d343
+   -pg -mprofile-kernel.  */
56d343
+
56d343
+/* { dg-do compile { target { powerpc64*-*-* } } } */
56d343
+/* { dg-options "-O2 -pg -mprofile-kernel" } */
56d343
+/* { dg-require-effective-target lp64 } */
56d343
+/* { dg-final { scan-assembler-not "mtlr" } } */
56d343
+
56d343
+int foo(void)
56d343
+{
56d343
+  return 1;
56d343
+}