On 4/25/22 13:57, Xi Ruoyao wrote:
Ping.
Normally we shouldn't ping a patch after only a few days, but we're
running out of time to catch GCC 12 milestone. And once GCC 12 is
released the patch will become far more complicated for a psABI warning.
And please note that the ABI difference between GCC and G++ should be
considered a bug, and it has to be fixed anyway. If you don't like the
idea of this patch, please develop another solution and apply it *before
GCC 12*.
On Wed, 2022-04-20 at 14:23 +0800, Xi Ruoyao via Gcc-patches wrote:
Currently, LoongArch ELF psABI is not clear on the handling of zero-
sized fields in aggregates arguments or return values [1]. The behavior
of GCC trunk is puzzling considering the following cases:
struct test1
{
double a[0];
float x;
};
struct test2
{
float a[0];
float x;
};
GCC trunk passes test1::x via GPR, but test2::x via FPR. I believe no
rational Homo Sapiens can understand (or even expect) this.
And, to make things even worse, test1 behaves differently in C and C++.
GCC trunk passes test1::x via GPR, but G++ trunk passes test1::x via
FPR.
I've write a paragraph about current GCC behavior for the psABI [2], but
I think it's cleaner to just ignore all zero-sized fields in the ABI.
This will require only a two-line change in GCC (this patch), and an
one-line change in the ABI doc.
If there is not any better idea I'd like to see this reviewed and
applied ASAP. If we finally have to apply this patch after GCC 12
release, we'll need to add a lot more boring code to emit a -Wpsabi
inform [3]. That will be an unnecessary burden for both us, and the
users using the compiler (as the compiler will spend CPU time only for
checking if a warning should be informed).
[1]:https://github.com/loongson/LoongArch-Documentation/issues/48
[2]:https://github.com/loongson/LoongArch-Documentation/pull/49
[3]:https://gcc.gnu.org/PR102024
gcc/
* config/loongarch/loongarch.cc
(loongarch_flatten_aggregate_field): Ignore empty fields for
RECORD_TYPE.
gcc/testsuite/
* gcc.target/loongarch/zero-size-field-pass.c: New test.
* gcc.target/loongarch/zero-size-field-ret.c: New test.
---
gcc/config/loongarch/loongarch.cc | 3 ++
.../loongarch/zero-size-field-pass.c | 30 +++++++++++++++++++
.../loongarch/zero-size-field-ret.c | 28 +++++++++++++++++
3 files changed, 61 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/loongarch/zero-size-field-pass.c
create mode 100644 gcc/testsuite/gcc.target/loongarch/zero-size-field-ret.c
Agreed; this is urgent. While I haven't personally got around to testing
this yet, I have looked at the linked LoongArch psABI spec change and
agree with the present approach.