On Wed, Sep 22, 2021 at 05:02:15PM +0200, Jakub Jelinek via Gcc-patches wrote:
> > > > @@ -6298,7 +6298,8 @@ rs6000_aggregate_candidate (const_tree type,
> > > > machine_mode *modep,
> > > > return -1;
> > > > count = rs6000_aggregate_candidate (TREE_TYPE (type), modep,
> > > > - empty_base_seen);
> > > > + empty_base_seen,
> > > > + zero_width_bf_seen);
> > > > if (count == -1
> > > > || !index
> > > > || !TYPE_MAX_VALUE (index)
> > > > @@ -6336,6 +6337,12 @@ rs6000_aggregate_candidate (const_tree type,
> > > > machine_mode *modep,
> > > > if (TREE_CODE (field) != FIELD_DECL)
> > > > continue;
> > > > + if (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (field))
> > > > + {
> > > > + *zero_width_bf_seen = 1;
> > > > + continue;
> > > > + }
>
> So, from what you wrote, :0 in the ppc* psABIs the intent is that :0 is not
> ignored, right?
> In that case I don't really understand the above (the continue in
> particular). Because the continue means it is ignored for C++ and not
> ignored for C, so basically you return to the 4.5-11 ABI incompatibility
> between C and C++.
> C++ :0 will have DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD set, C :0 will not...
To be more precise, I'd expect what most targets want to do for the
actual ABI decisions not to use DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD at all.
I.e. do:
if (TREE_CODE (field) != FIELD_DECL)
continue;
if (DECL_BIT_FIELD (field) && integer_zerop (DECL_SIZE (field)))
{
// :0
// in some psABIs, ignore it, i.e. continue;
// in others psABIs, take them into account, i.e. do nothing.
}
and use DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD only for the -Wpsabi purposes.
The only exception would be for targets that decide to keep GCC 4.5-11
compatibility with the C incompatible with C++.
Jakub