[PATCH] stor-layout: Don't create DECL_BIT_FIELD_REPRESENTATIVE for QUAL_UNION_TYPE [PR101062]

Richard Biener rguenther@suse.de
Fri Jun 18 09:17:56 GMT 2021


On Fri, 18 Jun 2021, Jakub Jelinek wrote:

> On Wed, Jun 16, 2021 at 09:45:17AM +0200, Jakub Jelinek via Gcc-patches wrote:
> > The following patch does create them, but treats all such bitfields as if
> > they were in a structure where the particular bitfield is the only field.
> 
> While the patch passed bootstrap/regtest on the trunk, when trying to
> backport it to 11 branch the bootstrap failed with
> atree.ads:3844:34: size for "Node_Record" too small
> errors.  Turns out the error is not about size being too small, but actually
> about size being non-constant, and comes from:
> /* In a FIELD_DECL of a RECORD_TYPE, this is a pointer to the storage
>    representative FIELD_DECL.  */
> #define DECL_BIT_FIELD_REPRESENTATIVE(NODE) \
>   (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
> 
> /* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which
>    if nonzero, indicates that the field occupies the type.  */
> #define DECL_QUALIFIER(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
> so by setting up DECL_BIT_FIELD_REPRESENTATIVE in QUAL_UNION_TYPE we
> actually set or modify DECL_QUALIFIER and then construct size as COND_EXPRs
> with those bit field representatives (e.g. with array type) as conditions
> which doesn't fold into constant.
> 
> The following patch fixes it by not creating DECL_BIT_FIELD_REPRESENTATIVEs
> for QUAL_UNION_TYPE as there is nowhere to store them,
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux (both trunk and
> 11 branch - there on top of the earlier patch backport).  Ok for trunk and
> the backport?
> 
> Shall we change tree.h to document that DECL_BIT_FIELD_REPRESENTATIVE
> is valid also on UNION_TYPE?

I think so.

> I see:
> tree-ssa-alias.c-  if (TREE_CODE (type1) == RECORD_TYPE
> tree-ssa-alias.c:      && DECL_BIT_FIELD_REPRESENTATIVE (field1))
> tree-ssa-alias.c:    field1 = DECL_BIT_FIELD_REPRESENTATIVE (field1);
> tree-ssa-alias.c-  if (TREE_CODE (type2) == RECORD_TYPE
> tree-ssa-alias.c:      && DECL_BIT_FIELD_REPRESENTATIVE (field2))
> tree-ssa-alias.c:    field2 = DECL_BIT_FIELD_REPRESENTATIVE (field2);
> Shall we change that to || == UNION_TYPE or do we assume all fields
> are overlapping in a UNION_TYPE already?

We don't assume that - for example the Fortran FE uses union types
to lay out equivalences which have multiple members at non-zero offsets,
eventually partly overlapping.  IIRC at least.

But Fortran doesn't have bitfields (does it?).  Still I guess updating
the checks would be prefered.

> At other spots (asan, ubsan, expr.c) it is unclear what will happen
> if they see a QUAL_UNION_TYPE with a DECL_QUALIFIER (or does the Ada FE
> lower that somehow)?

I don't think we see implicit uses of DECL_QUALIFIER, instead I think
that's reflected into DECL_FIELD_OFFSET.

OK.

Richard.

> 2021-06-18  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR middle-end/101062
> 	* stor-layout.c (finish_bitfield_layout): Don't add bitfield
> 	representatives in QUAL_UNION_TYPE.
> 
> --- gcc/stor-layout.c.jj	2021-06-16 12:17:49.254221954 +0200
> +++ gcc/stor-layout.c	2021-06-17 11:36:13.011822974 +0200
> @@ -2172,6 +2172,9 @@ finish_bitfield_layout (tree t)
>    tree field, prev;
>    tree repr = NULL_TREE;
>  
> +  if (TREE_CODE (t) == QUAL_UNION_TYPE)
> +    return;
> +
>    for (prev = NULL_TREE, field = TYPE_FIELDS (t);
>         field; field = DECL_CHAIN (field))
>      {
> 
> 
> 	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