rjmccall wrote:

First off, the change here actually applies to all over-aligned empty structs, 
not just to those with aligned bit-fields.  Maybe we can say that aligned 
zero-width bit-fields are ill-formed, but I don't think we can say that all 
aligned empty classes are ill-formed, among other things because I'm pretty 
sure they're explicitly allowed in C++.  So let's just set the aligned 
bit-field question aside for a moment.

Second, I don't understand why the fix is to `isEmptyRecord`.  This is a very 
general routine that affects a lot of code in a lot of targets.  And for most 
of those purposes, I think an aligned empty class should still be considered an 
empty record.  I think we need to understand why this is fixing the bug.

Third, it does look like we have a real ABI bug here.  I haven't looked at 
other targets, but at least on AArch64, a 16-byte-aligned empty class should 
definitely be taking up two registers.  For some reason, we are generating IR 
to pass this class as a single byte rather than as a number of bytes equal to 
its size.

Finally, as usual, some platforms may want to opt out of this ABI break; I'll 
ask around at Apple.

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

Reply via email to