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

Reply via email to