Blame SOURCES/gcc48-rh1468546.patch

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