https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102024
--- Comment #28 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Xi Ruoyao from comment #27)
> (In reply to Jakub Jelinek from comment #23)
>
> > struct A { double a; int : 0; double b; };
>
> For MIPS I've done some experiment with this and the result (with N64 ABI)
> is:
>
> With GCC trunk, G++ trunk, and GCC 11.2: argument passed via FPR $f12 and
> GPR $5,
> returned via GPR $2 and $3
Ah, indeed.
The
for (; field; field = DECL_CHAIN (field))
if (TREE_CODE (field) == FIELD_DECL
&& int_bit_position (field) >= bitpos)
break;
loop will simply stop on the first field with bitpos equal or greater than
bitpos, so the zero sized bit-fields (and generally any other zero sized fields
like struct S {} s; in GNU C) will be treated as being part of the next slot.
So in struct B { int : 0; double a, b; }; it will go into GPR and FPR,
while struct C { double a; int : 0; double b; }; into FPR and GPR, and
struct D { double a, b; int : 0; } into FPR & FPR.
> With G++ 11.2: argument passed via FPR $f12 and $f13, returned via FPR $f0
> and $f2
>
> So I guess we need -Wpsabi for both mips_function_arg and
> mips_fpr_return_fields.
Is there somebody who can clarify the MIPS ABI intent?
Also, what does LLVM do?