On Thu, May 22, 2025 at 12:14:34PM +1000, Nathaniel Shead wrote:
> This patch isn't currently necessary with how I've currently done the
> follow-up patches, but is needed for avoiding any potential issues in
> the future with DECL_CONTEXT'ful types getting created in the compiler
> with no names on the fields.  (For instance, this change would make much
> of r15-7342-gd3627c78be116e unnecessary.)
> 
> It does take up another flag though in the frontend though.  Another
> possible approach would be to instead do a walk through all the fields
> first to see if this is the target of a DECL_BIT_FIELD_REPRESENTATIVE;
> thoughts?  Or would you prefer to skip this patch entirely?
> 

Ping.

> -- >8 --
> 
> Modules streaming needs to handle these differently from other unnamed
> FIELD_DECLs that are streamed for internal RECORD_DECLs, and there
> doesn't seem to be a good way to detect this case otherwise.
> 
> gcc/cp/ChangeLog:
> 
>       * module.cc (trees_out::get_merge_kind): Use new flag.
> 
> gcc/ChangeLog:
> 
>       * stor-layout.cc (start_bitfield_representative): Mark with
>       DECL_BIT_FIELD_UNDERLYING_REPR_P.
>       * tree-core.h (struct tree_decl_common): Add comment.
>       * tree.h (DECL_BIT_FIELD_UNDERLYING_REPR_P): New accessor.
> 
> Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
> ---
>  gcc/cp/module.cc   | 4 +---
>  gcc/stor-layout.cc | 1 +
>  gcc/tree-core.h    | 1 +
>  gcc/tree.h         | 5 +++++
>  4 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> index 13f8770b7bd..99cbfdbf01d 100644
> --- a/gcc/cp/module.cc
> +++ b/gcc/cp/module.cc
> @@ -11131,9 +11131,7 @@ trees_out::get_merge_kind (tree decl, depset *dep)
>             return MK_named;
>           }
>  
> -       if (!DECL_NAME (decl)
> -           && !RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl))
> -           && !DECL_BIT_FIELD_REPRESENTATIVE (decl))
> +       if (!DECL_NAME (decl) && DECL_BIT_FIELD_UNDERLYING_REPR_P (decl))
>           {
>             /* The underlying storage unit for a bitfield.  We do not
>                need to dedup it, because it's only reachable through
> diff --git a/gcc/stor-layout.cc b/gcc/stor-layout.cc
> index 12071c96ca7..1f37a130e24 100644
> --- a/gcc/stor-layout.cc
> +++ b/gcc/stor-layout.cc
> @@ -2067,6 +2067,7 @@ static tree
>  start_bitfield_representative (tree field)
>  {
>    tree repr = make_node (FIELD_DECL);
> +  DECL_BIT_FIELD_UNDERLYING_REPR_P (repr) = 1;
>    DECL_FIELD_OFFSET (repr) = DECL_FIELD_OFFSET (field);
>    /* Force the representative to begin at a BITS_PER_UNIT aligned
>       boundary - C++ may use tail-padding of a base object to
> diff --git a/gcc/tree-core.h b/gcc/tree-core.h
> index bd19c99d326..2e773d7bf83 100644
> --- a/gcc/tree-core.h
> +++ b/gcc/tree-core.h
> @@ -1911,6 +1911,7 @@ struct GTY(()) tree_decl_common {
>    unsigned decl_read_flag : 1;
>    /* In a VAR_DECL or RESULT_DECL, this is DECL_NONSHAREABLE.  */
>    /* In a PARM_DECL, this is DECL_HIDDEN_STRING_LENGTH.  */
> +  /* In a FIELD_DECL, this is DECL_BIT_FIELD_UNDERLYING_REPR_P.  */
>    unsigned decl_nonshareable_flag : 1;
>  
>    /* DECL_OFFSET_ALIGN, used only for FIELD_DECLs.  */
> diff --git a/gcc/tree.h b/gcc/tree.h
> index 99f26177628..0d876234824 100644
> --- a/gcc/tree.h
> +++ b/gcc/tree.h
> @@ -3085,6 +3085,11 @@ extern void decl_value_expr_insert (tree, tree);
>  #define DECL_BIT_FIELD_REPRESENTATIVE(NODE) \
>    (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
>  
> +/* In a FIELD_DECL of a RECORD_TYPE, this indicates whether the field
> +   is used as the underlying storage unit for a bitfield.  */
> +#define DECL_BIT_FIELD_UNDERLYING_REPR_P(NODE) \
> +  (FIELD_DECL_CHECK (NODE)->decl_common.decl_nonshareable_flag)
> +
>  /* 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)
> -- 
> 2.47.0
> 

Reply via email to