Jakub Jelinek <ja...@redhat.com> writes: > Hi! > > On Tue, Apr 21, 2020 at 03:58:52PM +0100, Richard Sandiford wrote: >> > if (TREE_CODE (field) != FIELD_DECL) >> > continue; >> > >> > - sub_count = aapcs_vfp_sub_candidate (TREE_TYPE (field), modep); >> > + /* Ignore C++17 empty base fields, while their type indicates >> > + they do contain padding, they have zero size and thus don't >> > + contain any padding. */ >> > + if (DECL_ARTIFICIAL (field) >> > + && DECL_NAME (field) == NULL_TREE >> > + && RECORD_OR_UNION_TYPE_P (TREE_TYPE (field)) >> > + && DECL_SIZE (field) >> > + && integer_zerop (DECL_SIZE (field)) >> > + && (*avoid_c17empty_field & AVOID)) >> > + { > > As multiple targets are affected apparently, I believe at least > aarch64, arm, powerpc64le, s390{,x} and ia64, > I think we should have a middle-end predicate for this, so that if we need > to tweak it, we can do it in one spot. > > So is the following ok (of course after testing)? > > 2020-04-22 Jakub Jelinek <ja...@redhat.com> > > PR target/94383 > * calls.h (cxx17_empty_base_field_p): Declare. > * calls.c (cxx17_empty_base_field_p): Define. > > --- gcc/calls.h.jj 2020-01-12 11:54:36.214416411 +0100 > +++ gcc/calls.h 2020-04-22 11:44:09.037853379 +0200 > @@ -135,5 +135,6 @@ extern tree get_attr_nonstring_decl (tre > extern void maybe_warn_nonstring_arg (tree, tree); > extern bool get_size_range (tree, tree[2], bool = false); > extern rtx rtx_for_static_chain (const_tree, bool); > +extern bool cxx17_empty_base_field_p (const_tree); > > #endif // GCC_CALLS_H > --- gcc/calls.c.jj 2020-03-27 22:27:09.615964438 +0100 > +++ gcc/calls.c 2020-04-22 11:44:17.621722376 +0200 > @@ -6261,5 +6261,22 @@ must_pass_va_arg_in_stack (tree type) > return targetm.calls.must_pass_in_stack (arg); > } > > +/* Return true if FIELD is the C++17 empty base field that should > + be ignored for ABI calling convention decisions in order to > + maintain ABI compatibility between C++14 and earlier, which doesn't > + add this FIELD to classes with empty bases, and C++17 and later > + which does. */ > + > +bool > +cxx17_empty_base_field_p (const_tree field) > +{ > + return (TREE_CODE (field) == FIELD_DECL > + && DECL_ARTIFICIAL (field) > + && DECL_NAME (field) == NULL_TREE
Given what was said on irc about DECL_NAME not necessarily being significant for DECL_ARTIFICIAL decls, would it be better to drop this part of the check? Thanks, Richard > + && RECORD_OR_UNION_TYPE_P (TREE_TYPE (field)) > + && DECL_SIZE (field) > + && integer_zerop (DECL_SIZE (field))); > +} > + > /* Tell the garbage collector about GTY markers in this source file. */ > #include "gt-calls.h" > > > Jakub