Blame SOURCES/gcc48-rh1468546.patch

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