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 <ja...@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 <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)