]> gcc.gnu.org Git - gcc.git/commitdiff
target.def: Add new target hook.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Mon, 5 May 2014 07:55:26 +0000 (07:55 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 5 May 2014 07:55:26 +0000 (07:55 +0000)
2014-05-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* target.def: Add new target hook.
* doc/tm.texi: Regenerate.
* targhooks.h (default_keep_leaf_when_profiled): Add prototype.
* targhooks.c (default_keep_leaf_when_profiled): New function.

* config/s390/s390.c (s390_keep_leaf_when_profiled): New function.
(TARGET_KEEP_LEAF_WHEN_PROFILED): Define.

2014-05-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* gcc.target/s390/leaf-profile.c: New testcase.

From-SVN: r210061

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/final.c
gcc/target.def
gcc/targhooks.c
gcc/targhooks.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/leaf-profile.c [new file with mode: 0644]

index cd6aa9d7f016ae0ba28dcf766a0673995e818d00..66068c3baad777ddf05a5069d8400edf9a5bb750 100644 (file)
@@ -1,3 +1,13 @@
+2014-05-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * target.def: Add new target hook.
+       * doc/tm.texi: Regenerate.
+       * targhooks.h (default_keep_leaf_when_profiled): Add prototype.
+       * targhooks.c (default_keep_leaf_when_profiled): New function.
+
+       * config/s390/s390.c (s390_keep_leaf_when_profiled): New function.
+       (TARGET_KEEP_LEAF_WHEN_PROFILED): Define.
+
 2014-05-05  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/60363
index cc8f32e169c7dba9a86c5c188b3f824e84cd7f90..557f0dbc6e5d514b67c2a91dedce10ead86ab20e 100644 (file)
@@ -10160,6 +10160,14 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
     return const0_rtx;
 }
 
+/* We call mcount before the function prologue.  So a profiled leaf
+   function should stay a leaf function.  */
+
+static bool
+s390_keep_leaf_when_profiled ()
+{
+  return true;
+}
 
 /* Output assembly code for the trampoline template to
    stdio stream FILE.
@@ -12163,6 +12171,9 @@ s390_option_override (void)
 #undef TARGET_LIBCALL_VALUE
 #define TARGET_LIBCALL_VALUE s390_libcall_value
 
+#undef TARGET_KEEP_LEAF_WHEN_PROFILED
+#define TARGET_KEEP_LEAF_WHEN_PROFILED s390_keep_leaf_when_profiled
+
 #undef TARGET_FIXED_CONDITION_CODE_REGS
 #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
 
index ed35bcb235194382858328acffc1ac66216f449f..cdc272e0254bba59a043413a1cf153848be3b9c4 100644 (file)
@@ -4953,6 +4953,10 @@ Define this macro if the code for function profiling should come before
 the function prologue.  Normally, the profiling code comes after.
 @end defmac
 
+@deftypefn {Target Hook} bool TARGET_KEEP_LEAF_WHEN_PROFILED (void)
+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.
+@end deftypefn
+
 @node Tail Calls
 @subsection Permitting tail calls
 @cindex tail calls
index a5c374179271c34aa06cc4a0513f3b27222c62aa..efd49639848c85274332df2be385dd2f6b2b2fc2 100644 (file)
@@ -3963,6 +3963,8 @@ Define this macro if the code for function profiling should come before
 the function prologue.  Normally, the profiling code comes after.
 @end defmac
 
+@hook TARGET_KEEP_LEAF_WHEN_PROFILED
+
 @node Tail Calls
 @subsection Permitting tail calls
 @cindex tail calls
index 8c6f6ee682b5d074fe6571a6ff528042c3f7cbd7..cf649fbd1559d7b6689a7b936f45843291b435d1 100644 (file)
@@ -4241,7 +4241,9 @@ leaf_function_p (void)
 {
   rtx insn;
 
-  if (crtl->profile || profile_arc_flag)
+  /* Some back-ends (e.g. s390) want leaf functions to stay leaf
+     functions even if they call mcount.  */
+  if (crtl->profile && !targetm.keep_leaf_when_profiled ())
     return 0;
 
   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
index 3a64cd143022d3b5f546734f004ffb2882461b43..793f12ddfe1a1194d1a69d7c28647c4901324db5 100644 (file)
@@ -2658,6 +2658,18 @@ The default version of this hook use the target macro\n\
  bool, (void),
  default_profile_before_prologue)
 
+/* Return true if a leaf function should stay leaf even with profiling
+   enabled.  */
+DEFHOOK
+(keep_leaf_when_profiled,
+ "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.",
+ bool, (void),
+ default_keep_leaf_when_profiled)
+
 /* Modify and return the identifier of a DECL's external name,
    originally identified by ID, as required by the target,
    (eg, append @nn to windows32 stdcall function names).
index 79491c7c59ba5eeccc5c1ae543c6a8805cde593e..0be1978aa5ff1731100831935f4210dac721906e 100644 (file)
@@ -1447,6 +1447,15 @@ default_get_reg_raw_mode (int regno)
   return reg_raw_mode[regno];
 }
 
+/* Return true if a leaf function should stay leaf even with profiling
+   enabled.  */
+
+bool
+default_keep_leaf_when_profiled ()
+{
+  return false;
+}
+
 /* Return true if the state of option OPTION should be stored in PCH files
    and checked by default_pch_valid_p.  Store the option's current state
    in STATE if so.  */
index 9dd4c83d697b2b411e242237224ce9432db67a98..dbaa1dc5f5c312876efbc896ae1d8d3ffa8366d9 100644 (file)
@@ -195,6 +195,7 @@ extern int default_jump_align_max_skip (rtx);
 extern section * default_function_section(tree decl, enum node_frequency freq,
                                          bool startup, bool exit);
 extern enum machine_mode default_get_reg_raw_mode (int);
+extern bool default_keep_leaf_when_profiled ();
 
 extern void *default_get_pch_validity (size_t *);
 extern const char *default_pch_valid_p (const void *, size_t);
index d64a06f60d90ae9eb58b10e5af45459d26cbc662..ce105724f6960339343ac654723668285787741b 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * gcc.target/s390/leaf-profile.c: New testcase.
+
 2014-05-05  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * gcc.dg/hoist-register-pressure-1.c: Replace int with long.
diff --git a/gcc/testsuite/gcc.target/s390/leaf-profile.c b/gcc/testsuite/gcc.target/s390/leaf-profile.c
new file mode 100644 (file)
index 0000000..6047740
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=z900 -pg" } */
+
+int
+foo ()
+{
+}
+/* Make sure no stack frame is generated.  */
+/* { dg-final { scan-assembler-not "ahi" { target s390-*-* } } } */
+/* { dg-final { scan-assembler-not "aghi" { target s390x-*-* } } } */
This page took 0.114507 seconds and 5 git commands to generate.