majnemer added a comment.

In https://reviews.llvm.org/D40023#933466, @asb wrote:
> In https://reviews.llvm.org/D40023#933464, @majnemer wrote:
>
> > So how does something like the following work:
> >
> >   union U { float f; int i; };
> >   void f(union U u);
> >   
> >
> > The flattening described in 
> > https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md#hardware-floating-point-calling-convention
> >  makes sense for arrays and structs but I couldn't find where unions were 
> > described.
>
>
> You're right that's not currently described - I have an issue tracking this 
> here: https://github.com/riscv/riscv-elf-psabi-doc/issues/24. Last time I 
> tried to check gcc behaviour it seemed that such cases would be passed 
> according to the integer calling convention, but I'd be happier if one of the 
> GCC devs would confirm.


Should we have a test which tries to make sure our behavior matches GCC's? ISTM 
that floats in unions are always in GPRs (at least according to abicop).

How are empty unions/arrays handled? Like a function which takes no args? 
abicop seemed upset when I asked it:

  >>> m.call([Union()])
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "~/majnemer/abicop/rvcc.py", line 186, in __init__
      self.alignment = max(m.alignment for m in members)
  ValueError: max() arg is an empty sequence

It'd also be good to have a test for bool and tests for bitfields. Am I correct 
that struct S { int x : 2; int y : 2; }; would get passed in two GPRs which 
were sign extended from 2 to 32?


https://reviews.llvm.org/D40023



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to