This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR56344
On Tue, Feb 26, 2013 at 11:17:22PM +0000, Joseph S. Myers wrote:
> On Tue, 26 Feb 2013, Marek Polacek wrote:
>
> > + /* We don't allow passing huge (> 2^30 B) arguments
> > + by value. It would cause an overflow later on. */
> > + if (adjusted_args_size.constant >= (1 << 30))
> > + {
> > + error ("passing too large argument on stack");
> > + continue;
>
> This should be sorry () not error (), as a compiler limitation rather than
> a defect in the user's program. (And is input_location set to something
> useful here so the diagnostic points to the argument in question rather
> than e.g. to the end of the function containing the problem call?)
Okay, changed back to sorry (). I'd think that input_location is fine
here, for e.g.
struct S { unsigned char s[1 << 30]; } s;
extern void foo (struct S);
void
bar (void)
{
foo (s);
}
we get:
pr56344.c: In function âbarâ:
pr56344.c:7:7: sorry, unimplemented: passing too large argument on stack
foo (s);
^
Ok now?
2013-02-27 Marek Polacek <polacek@redhat.com>
PR middle-end/56344
* calls.c (expand_call): Disallow passing huge arguments
by value.
--- gcc/calls.c.mp 2013-02-26 17:04:33.159555349 +0100
+++ gcc/calls.c 2013-02-27 10:44:02.254461200 +0100
@@ -3037,6 +3037,14 @@ expand_call (tree exp, rtx target, int i
{
rtx before_arg = get_last_insn ();
+ /* We don't allow passing huge (> 2^30 B) arguments
+ by value. It would cause an overflow later on. */
+ if (adjusted_args_size.constant >= (1 << 30))
+ {
+ sorry ("passing too large argument on stack");
+ continue;
+ }
+
if (store_one_arg (&args[i], argblock, flags,
adjusted_args_size.var != 0,
reg_parm_stack_space)
Marek