asb added a comment.

Thanks Eli, that saved me some time - fixed in 
https://reviews.llvm.org/rL322514 (clang-x86_64-linux-selfhost-modules-2 is now 
green).



================
Comment at: lib/CodeGen/TargetInfo.cpp:8913
+  }
+  return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
+}
----------------
efriedma wrote:
> asb wrote:
> > efriedma wrote:
> > > 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.
> > If I understand your concern correctly, it's that the RISCV backend passes 
> > a pointer to the byval copied argument rather than passing it direct on the 
> > stack? Isn't that consistent with what the Sparc, Lanai and the PPC 
> > backends do? It also seems consistent with my reading of the description of 
> > the byval attribute in the langref - a hidden copy is made. Whether that 
> > hidden copy is passed direct or a pointer to it is passed (which is 
> > consistent with the RISC-V calling convention for large values) seems an 
> > orthogonal concern.
> I can see SPARC does in fact pass byval arguments like you said (and I'll 
> assume Lanai behaves the same way).  PowerPC doesn't, though, as far as I can 
> tell (there are a bunch of PowerPC variants, but at least the 64-bit Linux 
> ABI requires byval to pass arguments directly).
> 
> Yes, how exactly arguments are passed is not visible to the optimizer, and 
> therefore is formally outside the scope of LangRef, but a byval which doesn't 
> pass arguments directly is essentially useless.
I was looking at `PPCTargetLowering::LowerCall_32SVR4`, seems it's different 
for PPC64 as you say.


Repository:
  rL LLVM

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