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 + && 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