On 09-01-14 15:41, Richard Earnshaw wrote:
On 30/03/13 16:10, Tom de Vries wrote:
On 29/03/13 13:54, Tom de Vries wrote:
I split the patch up into 10 patches, to facilitate further review:
...
0001-Add-command-line-option.patch
0002-Add-new-reg-note-REG_CALL_DECL.patch
0003-Add-implicit-parameter-to-find_all_hard_reg_sets.patch
0004-Add-TARGET_FN_OTHER_HARD_REG_USAGE-hook.patch
0005-Implement-TARGET_FN_OTHER_HARD_REG_USAGE-hook-for-ARM.patch
0006-Collect-register-usage-information.patch
0007-Use-collected-register-usage-information.patch
0008-Enable-by-default-at-O2-and-higher.patch
0009-Add-documentation.patch
0010-Add-test-case.patch
...
I'll post these in reply to this email.
Something went wrong with those emails, which were generated.
I tested the emails by sending them to my work email, where they looked fine.
I managed to reproduce the problem by sending them to my private email.
It seems the problem was inconsistent EOL format.
I've written a python script to handle composing the email, and posted it here
using that script: http://gcc.gnu.org/ml/gcc-patches/2013-03/msg01311.html.
Given that that email looks ok, I think I've addressed the problems now.
I'll repost the patches. Sorry about the noise.
Thanks,
- Tom
It's unfortunate that this feature doesn't fail safe when a port has not
explicitly defined what should happen.
Richard,
Attached tentative patch (an update of patch 4 in the series) changes the hook
in the way you propose.
Is this patch OK for stage1 (after proper retesting)?
Consequently, you'll need to add a patch for AArch64 which has two
registers clobbered by PLT-based calls.
Thanks for pointing that out. That's r16 and r17, right? I can propose the hook
for AArch64, once we all agree on how the hook should look.
Thanks,
- Tom
R.
2013-04-29 Radovan Obradovic <robrado...@mips.com>
Tom de Vries <t...@codesourcery.com>
* hooks.c (hook_bool_hard_reg_set_containerp_false): New function.
* hooks.h (hook_bool_hard_reg_set_containerp_false): Declare.
* target.def (fn_other_hard_reg_usage): New DEFHOOK.
* doc/tm.texi.in (@node Stack and Calling): Add Miscellaneous Register
Hooks to @menu.
(@node Miscellaneous Register Hooks): New node.
(@hook TARGET_FN_OTHER_HARD_REG_USAGE): New hook.
* doc/tm.texi: Regenerate.
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index f204936..1bae6bb 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -3091,6 +3091,7 @@ This describes the stack layout and calling conventions.
* Profiling::
* Tail Calls::
* Stack Smashing Protection::
+* Miscellaneous Register Hooks::
@end menu
@node Frame Layout
@@ -5016,6 +5017,14 @@ normally defined in @file{libgcc2.c}.
Whether this target supports splitting the stack when the options described in @var{opts} have been passed. This is called after options have been parsed, so the target may reject splitting the stack in some configurations. The default version of this hook returns false. If @var{report} is true, this function may issue a warning or error; if @var{report} is false, it must simply return a value
@end deftypefn
+@node Miscellaneous Register Hooks
+@subsection Miscellaneous register hooks
+@cindex miscellaneous register hooks
+
+@deftypefn {Target Hook} bool TARGET_FN_OTHER_HARD_REG_USAGE (struct hard_reg_set_container *@var{regs})
+Add any hard registers to @var{regs} that are set or clobbered by a call to the function. This hook only needs to add registers that cannot be found by examination of the final RTL representation of a function. This hook returns true if it managed to determine which registers need to be added. The default version of this hook returns false.
+@end deftypefn
+
@node Varargs
@section Implementing the Varargs Macros
@cindex varargs implementation
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 50f412c..bf75446 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -2720,6 +2720,7 @@ This describes the stack layout and calling conventions.
* Profiling::
* Tail Calls::
* Stack Smashing Protection::
+* Miscellaneous Register Hooks::
@end menu
@node Frame Layout
@@ -3985,6 +3986,12 @@ the function prologue. Normally, the profiling code comes after.
@hook TARGET_SUPPORTS_SPLIT_STACK
+@node Miscellaneous Register Hooks
+@subsection Miscellaneous register hooks
+@cindex miscellaneous register hooks
+
+@hook TARGET_FN_OTHER_HARD_REG_USAGE
+
@node Varargs
@section Implementing the Varargs Macros
@cindex varargs implementation
diff --git a/gcc/hooks.c b/gcc/hooks.c
index 1c67bdf..44f1d06 100644
--- a/gcc/hooks.c
+++ b/gcc/hooks.c
@@ -467,3 +467,12 @@ void
hook_void_gcc_optionsp (struct gcc_options *opts ATTRIBUTE_UNUSED)
{
}
+
+/* Generic hook that takes a struct hard_reg_set_container * and returns
+ false. */
+
+bool
+hook_bool_hard_reg_set_containerp_false (struct hard_reg_set_container *regs ATTRIBUTE_UNUSED)
+{
+ return false;
+}
diff --git a/gcc/hooks.h b/gcc/hooks.h
index 896b41d..f0afdbd 100644
--- a/gcc/hooks.h
+++ b/gcc/hooks.h
@@ -73,6 +73,7 @@ extern void hook_void_tree (tree);
extern void hook_void_tree_treeptr (tree, tree *);
extern void hook_void_int_int (int, int);
extern void hook_void_gcc_optionsp (struct gcc_options *);
+extern bool hook_bool_hard_reg_set_containerp_false (struct hard_reg_set_container *);
extern int hook_int_uint_mode_1 (unsigned int, enum machine_mode);
extern int hook_int_const_tree_0 (const_tree);
diff --git a/gcc/target.def b/gcc/target.def
index 3a64cd1..8bee4c3 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -5130,6 +5130,19 @@ FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.",
void, (bitmap regs),
hook_void_bitmap)
+/* Targets should define this target hook to mark which registers are clobbered
+ on entry to the function. They should should set their bits in the struct
+ hard_reg_set_container passed in, and return true. */
+DEFHOOK
+(fn_other_hard_reg_usage,
+ "Add any hard registers to @var{regs} that are set or clobbered by a call to\
+ the function. This hook only needs to add registers that cannot be found by\
+ examination of the final RTL representation of a function. This hook returns\
+ true if it managed to determine which registers need to be added. The\
+ default version of this hook returns false.",
+ bool, (struct hard_reg_set_container *regs),
+ hook_bool_hard_reg_set_containerp_false)
+
/* Fill in additional registers set up by prologue into a regset. */
DEFHOOK
(set_up_by_prologue,