================
@@ -197,12 +206,20 @@ ABIArgInfo 
AMDGPUABIInfo::classifyKernelArgumentType(QualType Ty) const {
   return ABIArgInfo::getDirect(LTy, 0, nullptr, false);
 }
 
-ABIArgInfo AMDGPUABIInfo::classifyArgumentType(QualType Ty,
+ABIArgInfo AMDGPUABIInfo::classifyArgumentType(QualType Ty, bool Variadic,
                                                unsigned &NumRegsLeft) const {
----------------
JonChesterfield wrote:

This was subtle. Structs that aren't packed into integers and passed in 
registers fall through to default handling which sets CanBeFlattened, saying 
that it's OK to spread the struct across multiple arguments. This is then very 
difficult to reassemble robustly using the va_arg(x, type) interface - one 
needs to compute how type is likely to have been spread out across part of the 
call frame.

Noting that these values aren't being usefully passed in registers anyway, the 
`if (Variadic) {}` sets up call instructions that pass values by value (not 
byval) and declares that every value shall be exactly four byte aligned 
(including doubles, as that's something Matt suggested for amdgpu some time 
ago). This means the frame setup implementation and the case analysis for 
testing are very straightforward.

https://github.com/llvm/llvm-project/pull/93362
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to