efriedma accepted this revision.
efriedma added a comment.

LGTM

Not sure if anyone's mentioned it yet, but there's a C ABI testing tool in 
clang/utils/ABITest/ which you'll probably want to try at some point.



================
Comment at: lib/CodeGen/TargetInfo.cpp:8913
+  }
+  return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
+}
----------------
asb wrote:
> efriedma wrote:
> > The spec says "Aggregates larger than 2✕XLEN bits are passed by reference 
> > and are replaced in the argument list with the address".  That's not byval.
> The LLVM backend lowers byval in that way. Given that at this point we have a 
> trivial data type (plain struct or similar) which is copied-by-value by C 
> semantics, the only difference is whether the generated IR indicates implicit 
> copying with 'byval' or relies on the caller explicitly doing the copy. For 
> some reason I thought 'byval' was preferred, but looking again it seems 
> uncommon to do it this way. I've changed it to false - thanks for spotting 
> this.
"byval" generally means the value is memcpy'ed into the argument list (so there 
is no pointer in the argument list). This is useful for handling C calling 
conventions which allow excessively large structs to be passed in the argument 
list, so the backend can emit a memcpy rather than expanding the operation into 
straight-line code.  The RISCV backend handling of byval is wrong, in the sense 
that it isn't consistent with what any other backend does.

This isn't relevant to the RISC-V C calling convention, but you should probably 
fix the backend at some point to avoid future confusion.


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