[PATCH] calls: Introduce cxx17_empty_base_field_p [PR94383]

Richard Biener rguenther@suse.de
Wed Apr 22 09:52:53 GMT 2020


On Wed, 22 Apr 2020, Jakub Jelinek wrote:

> 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)?

OK.

Richard.

> 2020-04-22  Jakub Jelinek  <jakub@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
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)


More information about the Gcc-patches mailing list