DavidKreitzer added a comment.

Denis, can you please explain your rationale for choosing to return 0-sized 
aggregates in memory for MCU? It doesn't match gcc behavior.  For example,
  int g;
  union U {} u;
  union U f(int a, int b, int c) { g = a + b + c; return u; }
  void f1() { f(1, 2, 3); }

Produces this, where all three incoming arguments are in registers. With your 
patch, %eax will be used for the return value pointer.

  f:
        addl    %eax, %edx
        subl    $4, %esp
        addl    %edx, %ecx
        movl    %ecx, g
        popl    %eax
        ret

(Using i586-intel-elfiamcu-gcc 5.2.1 20150820)

HJ, even though a strict reading of the ABI suggests that a 0-size aggregate 
should be returned in register, it would be a good idea to make this more 
explicit in the ABI here, by adding the underlined text, for example.

> **Returning Values**

>  Table 2.4 lists the location used to return a value for each fundamental 
> data type.

>  Aggregate types (structs and unions) are returned as follows:

>  • Short aggregate types no larger than 8 bytes, __including 0-length 
> aggregate types,__ are returned in %edx:%eax.

>  The most significant 32 bits are returned in %edx. The least significant 32

>  bits are returned in %eax.

>  • Other aggregate types are returned in memory.





http://reviews.llvm.org/D16808



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

Reply via email to