在 2023/5/24 下午2:45, Xi Ruoyao 写道:
On Wed, 2023-05-24 at 14:04 +0800, Lulu Cheng wrote:
An empty struct type that is not non-trivial for the purposes of calls
will be treated as though it were the following C type:

struct {
   char c;
};

Before this patch was added, a structure parameter containing an empty 
structure and
less than three floating-point members was passed through one or two 
floating-point
registers, while nested empty structures are ignored. Which did not conform to 
the
calling convention.
No, it's a deliberate decision I've made in
https://gcc.gnu.org/r12-8294.  And we already agreed "the ABI needs to
be updated" when we applied r12-8294, but I've never improved my English
skill to revise the ABI myself :(.

We are also using the same "de-facto" ABI throwing away the empty struct
for Clang++ (https://reviews.llvm.org/D132285).  So we should update the
spec here, instead of changing every implementation.

The C++ standard treats the empty struct as size 1 for ensuring the
semantics of pointer comparison operations.  When we pass it through the
registers, there is no need to really consider the empty field because
there is no pointers to registers.

I think that the rules for passing parameters to empty structures or nested empty structures should be unified,

but the current implementation in gcc is as follows(in C++):

Compare the two structures,the current implementation is as follows:

struct st1
{
  struct empty {} e1;
  long a;
  long b;
};

passed by reference.


struct st2
{
  struct empty {} e1;
  double f0;
  double f1;
};

passed through two floating-point registers.

Judging from the size of the structure, the size of st2 is already larger than 2xGRLEN, should be passed by reference.



Reply via email to