On Wed, Sep 22, 2021 at 09:43:23AM -0500, Bill Schmidt wrote:
> > How previously?  is this one that will need all the backports?
> 
> No, the change happened recently on trunk.

It is actually more complex.
Both C and C++ FEs thought they were removing zero bit fields, but
neither did that, then the non-working code from C FE has been removed,
and finally in 4.5 the C++ FE has been "fixed" to remove zero bit fields
"correctly".  And 12 is going to remove the removal, but marks FIELD_DECLs
that were in 4.5-11 removed and now aren't for -Wpsabi purposes.
So, for most backends, C and C++ was ABI compatible in presence of :0
initially, then for several got incompatible in 4.5 and now is time to
decide for each backend what to do according to their psABI, if :0 should be
ignored or not during the function arg/return value passing decisions.

> > > --- a/gcc/config/rs6000/rs6000-call.c
> > > +++ b/gcc/config/rs6000/rs6000-call.c
> > > @@ -6227,7 +6227,7 @@ const struct altivec_builtin_types 
> > > altivec_overloaded_builtins[] = {
> > >   static int
> > >   rs6000_aggregate_candidate (const_tree type, machine_mode *modep,
> > > -                     int *empty_base_seen)
> > > +                     int *empty_base_seen, int *zero_width_bf_seen)
> > >   {
> > >     machine_mode mode;
> > >     HOST_WIDE_INT size;
> > > @@ -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...

        Jakub

Reply via email to