Commit d56a43a0 by Andreas Krebbel Committed by Andreas Krebbel

target.def: Add new target hook.

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
parent f668cd6f
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> 2014-05-05 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/60363 PR tree-optimization/60363
......
...@@ -10160,6 +10160,14 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, ...@@ -10160,6 +10160,14 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
return const0_rtx; 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 /* Output assembly code for the trampoline template to
stdio stream FILE. stdio stream FILE.
...@@ -12163,6 +12171,9 @@ s390_option_override (void) ...@@ -12163,6 +12171,9 @@ s390_option_override (void)
#undef TARGET_LIBCALL_VALUE #undef TARGET_LIBCALL_VALUE
#define TARGET_LIBCALL_VALUE s390_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 #undef TARGET_FIXED_CONDITION_CODE_REGS
#define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs #define TARGET_FIXED_CONDITION_CODE_REGS s390_fixed_condition_code_regs
......
...@@ -4953,6 +4953,10 @@ Define this macro if the code for function profiling should come before ...@@ -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. the function prologue. Normally, the profiling code comes after.
@end defmac @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 @node Tail Calls
@subsection Permitting tail calls @subsection Permitting tail calls
@cindex tail calls @cindex tail calls
......
...@@ -3963,6 +3963,8 @@ Define this macro if the code for function profiling should come before ...@@ -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. the function prologue. Normally, the profiling code comes after.
@end defmac @end defmac
@hook TARGET_KEEP_LEAF_WHEN_PROFILED
@node Tail Calls @node Tail Calls
@subsection Permitting tail calls @subsection Permitting tail calls
@cindex tail calls @cindex tail calls
......
...@@ -4241,7 +4241,9 @@ leaf_function_p (void) ...@@ -4241,7 +4241,9 @@ leaf_function_p (void)
{ {
rtx insn; 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; return 0;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
......
...@@ -2658,6 +2658,18 @@ The default version of this hook use the target macro\n\ ...@@ -2658,6 +2658,18 @@ The default version of this hook use the target macro\n\
bool, (void), bool, (void),
default_profile_before_prologue) 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, /* Modify and return the identifier of a DECL's external name,
originally identified by ID, as required by the target, originally identified by ID, as required by the target,
(eg, append @nn to windows32 stdcall function names). (eg, append @nn to windows32 stdcall function names).
......
...@@ -1447,6 +1447,15 @@ default_get_reg_raw_mode (int regno) ...@@ -1447,6 +1447,15 @@ default_get_reg_raw_mode (int regno)
return reg_raw_mode[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 /* 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 and checked by default_pch_valid_p. Store the option's current state
in STATE if so. */ in STATE if so. */
......
...@@ -195,6 +195,7 @@ extern int default_jump_align_max_skip (rtx); ...@@ -195,6 +195,7 @@ extern int default_jump_align_max_skip (rtx);
extern section * default_function_section(tree decl, enum node_frequency freq, extern section * default_function_section(tree decl, enum node_frequency freq,
bool startup, bool exit); bool startup, bool exit);
extern enum machine_mode default_get_reg_raw_mode (int); 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 void *default_get_pch_validity (size_t *);
extern const char *default_pch_valid_p (const void *, size_t); extern const char *default_pch_valid_p (const void *, size_t);
......
2014-05-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> 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. * gcc.dg/hoist-register-pressure-1.c: Replace int with long.
Disable asm scan for s390. Disable asm scan for s390.
* gcc.dg/hoist-register-pressure-2.c: Likewise. * gcc.dg/hoist-register-pressure-2.c: Likewise.
......
/* { 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-*-* } } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment