------- Comment #15 from matz at gcc dot gnu dot org  2008-03-18 15:37 -------
We can either force expanding the call address before the arguments (if
it overlaps with them) or simply validate the thing after the fact. 
Validating seems a bit easier (and is in line with what is done already for
the expansion of overlapping arguments).  Proof of concept patch:

Index: calls.c
===================================================================
--- calls.c     (revision 133304)
+++ calls.c     (working copy)
@@ -2756,8 +2756,15 @@ expand_call (tree exp, rtx target, int i
            use_reg (&call_fusage, struct_value);
        }

-      funexp = prepare_call_address (funexp, static_chain_value,
+       {
+         rtx before_arg = get_last_insn ();
+
+         funexp = prepare_call_address (funexp, static_chain_value,
                                     &call_fusage, reg_parm_seen, pass == 0);
+         if (pass == 0
+             && check_sibcall_argument_overlap (before_arg, 0, 0))
+           sibcall_failure = 1;
+       }

       load_register_parameters (args, num_actuals, &call_fusage, flags,
                                pass == 0, &sibcall_failure);


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35616

Reply via email to