On Wed, Feb 27, 2013 at 10:56 AM, Marek Polacek <pola...@redhat.com> wrote: > 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?
Wouldn't it be better to simply pass this using the variable size handling code? Thus, initialize args_size.var for too large constant size instead? Also args_size.constant is HOST_WIDE_INT, so I'm not sure where you derive the magic number 1<<30 from. I'd expect it to be sth like if (!host_integer_p (bit-size, 1)) init variable-size this has the advantage to move the error to runtime instead of compile-time which is better than rejecting valid C code that will work when it is not executed at runtime. Richard. > 2013-02-27 Marek Polacek <pola...@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