On Tue, Apr 25, 2017 at 01:29:06PM +0100, Richard Earnshaw (lists) wrote:
> > /* C.8 if the argument has an alignment of 16 then the NGRN is
> > rounded up to the next even number. */
> > - if (nregs == 2 && alignment == 16 * BITS_PER_UNIT && ncrn % 2)
> > + if (nregs == 2 && ncrn % 2)
> > {
> > - ++ncrn;
> > - gcc_assert (ncrn + nregs <= NUM_ARG_REGS);
> > + struct aarch64_fn_arg_alignment aa
> > + = aarch64_function_arg_alignment (mode, type);
> > +
> > + if (aa.warn_alignment == 16 * BITS_PER_UNIT
>
> I was caught out (again) when reviewing this as to why the test was for
> exactly 16 bytes and not >= 16. I'd forgotten that anything with higher
> alignment would have a size larger than 16 and thus be passed by
I admit I didn't know why it has been written that way, I was just trying
to write something that would do the same as before if ignoring the
non-FIELD_DECL alignments and warn for the cases that changed ABI;
as there was originally alignment == 16 * BITS_PER_UNIT, I kept using that.
For structs/classes indeed I think alignment of any fields > 16
bytes implies struct size of > 16. The ARRAY_TYPE case is for some
languages I'm not familiar with, in C/C++/Fortran that doesn't happen, so I
can't guess what those languages can do. And otherwise it uses mode
alignment or alignment of main variant of scalar/vector/complex types and
I believe those should never be over-aligned.
> reference to a copy. Could you please add a comment to that effect as
> it's not obvious at this point.
Ok.
Jakub