[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