Excerpts from Richard Sandiford via Gcc-patches's message of September 8, 2023 
6:29 pm:
> Currently there are four static sources of attributes:
> 
> - LANG_HOOKS_ATTRIBUTE_TABLE
> - LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
> - LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE
> - TARGET_ATTRIBUTE_TABLE
> 
> All of the attributes in these tables go in the "gnu" namespace.
> This means that they can use the traditional GNU __attribute__((...))
> syntax and the standard [[gnu::...]] syntax.
> 
> Standard attributes are registered dynamically with a null namespace.
> There are no supported attributes in other namespaces (clang, vendor
> namespaces, etc.).
> 
> This patch tries to generalise things by making the namespace
> part of the attribute specification.
> 
> It's usual for multiple attributes to be defined in the same namespace,
> so rather than adding the namespace to each individual definition,
> it seemed better to group attributes in the same namespace together.
> This would also allow us to reuse the same table for clang attributes
> that are written with the GNU syntax, or other similar situations
> where the attribute can be accessed via multiple "spellings".
> 
> The patch therefore adds a scoped_attribute_specs that contains
> a namespace and a list of attributes in that namespace.
> 

Changes to the D front-end in this patch look reasonable to me.

Regards,
Iain.

> 
> 
> gcc/d/
>       * d-tree.h (d_langhook_attribute_table): Replace with...
>       (d_langhook_gnu_attribute_table): ...this.
>       (d_langhook_common_attribute_table): Change type to
>       scoped_attribute_specs.
>       * d-attribs.cc (d_langhook_common_attribute_table): Change type to
>       scoped_attribute_specs, using...
>       (d_langhook_common_attributes): ...this as the underlying array.
>       (d_langhook_attribute_table): Replace with...
>       (d_langhook_gnu_attributes, d_langhook_gnu_attribute_table): ...these
>       new globals.
>       (uda_attribute_p): Update accordingly, and update for new
>       targetm.attribute_table type.
>       * d-lang.cc (d_langhook_attribute_table): New global.
>       (LANG_HOOKS_COMMON_ATTRIBUTE_TABLE): Delete.
> 
> ---
>  gcc/d/d-attribs.cc                  |  35 ++---
>  gcc/d/d-lang.cc                     |   8 +-
>  gcc/d/d-tree.h                      |   4 +-
> 
> diff --git a/gcc/d/d-attribs.cc b/gcc/d/d-attribs.cc
> index cc46220ddc2..78215bc88bc 100644
> --- a/gcc/d/d-attribs.cc
> +++ b/gcc/d/d-attribs.cc
> @@ -162,7 +162,7 @@ extern const struct attribute_spec::exclusions 
> attr_cold_hot_exclusions[] =
>  
>  /* Table of machine-independent attributes.
>     For internal use (marking of built-ins) only.  */
> -const attribute_spec d_langhook_common_attribute_table[] =
> +static const attribute_spec d_langhook_common_attributes[] =
>  {
>    ATTR_SPEC ("noreturn", 0, 0, true, false, false, false,
>            handle_noreturn_attribute, attr_noreturn_exclusions),
> @@ -190,11 +190,15 @@ const attribute_spec 
> d_langhook_common_attribute_table[] =
>            handle_fnspec_attribute, NULL),
>    ATTR_SPEC ("omp declare simd", 0, -1, true,  false, false, false,
>            handle_omp_declare_simd_attribute, NULL),
> -  ATTR_SPEC (NULL, 0, 0, false, false, false, false, NULL, NULL),
> +};
> +
> +const scoped_attribute_specs d_langhook_common_attribute_table =
> +{
> +  "gnu", d_langhook_common_attributes
>  };
>  
>  /* Table of D language attributes exposed by `gcc.attribute' UDAs.  */
> -const attribute_spec d_langhook_attribute_table[] =
> +static const attribute_spec d_langhook_gnu_attributes[] =
>  {
>    ATTR_SPEC ("noinline", 0, 0, true, false, false, false,
>            d_handle_noinline_attribute, attr_noinline_exclusions),
> @@ -238,9 +242,12 @@ const attribute_spec d_langhook_attribute_table[] =
>            d_handle_used_attribute, NULL),
>    ATTR_SPEC ("visibility", 1, 1, false, false, false, false,
>            d_handle_visibility_attribute, NULL),
> -  ATTR_SPEC (NULL, 0, 0, false, false, false, false, NULL, NULL),
>  };
>  
> +const scoped_attribute_specs d_langhook_gnu_attribute_table =
> +{
> +  "gnu", d_langhook_gnu_attributes
> +};
>  
>  /* Insert the type attribute ATTRNAME with value VALUE into TYPE.
>     Returns a new variant of the original type declaration.  */
> @@ -283,20 +290,14 @@ uda_attribute_p (const char *name)
>  
>    /* Search both our language, and target attribute tables.
>       Common and format attributes are kept internal.  */
> -  for (const attribute_spec *p = d_langhook_attribute_table; p->name; p++)
> -    {
> -      if (get_identifier (p->name) == ident)
> -     return true;
> -    }
> +  for (const attribute_spec &p : d_langhook_gnu_attributes)
> +    if (get_identifier (p.name) == ident)
> +      return true;
>  
> -  if (targetm.attribute_table)
> -    {
> -      for (const attribute_spec *p = targetm.attribute_table; p->name; p++)
> -     {
> -       if (get_identifier (p->name) == ident)
> -         return true;
> -     }
> -    }
> +  for (auto scoped_attributes : targetm.attribute_table)
> +    for (const attribute_spec &p : scoped_attributes->attributes)
> +      if (get_identifier (p.name) == ident)
> +     return true;
>  
>    return false;
>  }
> diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc
> index 10b9000119e..90699f6d36b 100644
> --- a/gcc/d/d-lang.cc
> +++ b/gcc/d/d-lang.cc
> @@ -1919,6 +1919,12 @@ d_get_sarif_source_language (const char *)
>    return "d";
>  }
>  
> +const scoped_attribute_specs *const d_langhook_attribute_table[] =
> +{
> +  &d_langhook_gnu_attribute_table,
> +  &d_langhook_common_attribute_table,
> +};
> +
>  /* Definitions for our language-specific hooks.  */
>  
>  #undef LANG_HOOKS_NAME
> @@ -1930,7 +1936,6 @@ d_get_sarif_source_language (const char *)
>  #undef LANG_HOOKS_HANDLE_OPTION
>  #undef LANG_HOOKS_POST_OPTIONS
>  #undef LANG_HOOKS_PARSE_FILE
> -#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
>  #undef LANG_HOOKS_ATTRIBUTE_TABLE
>  #undef LANG_HOOKS_GET_ALIAS_SET
>  #undef LANG_HOOKS_TYPES_COMPATIBLE_P
> @@ -1963,7 +1968,6 @@ d_get_sarif_source_language (const char *)
>  #define LANG_HOOKS_HANDLE_OPTION         d_handle_option
>  #define LANG_HOOKS_POST_OPTIONS                  d_post_options
>  #define LANG_HOOKS_PARSE_FILE                    d_parse_file
> -#define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE   d_langhook_common_attribute_table
>  #define LANG_HOOKS_ATTRIBUTE_TABLE       d_langhook_attribute_table
>  #define LANG_HOOKS_GET_ALIAS_SET         d_get_alias_set
>  #define LANG_HOOKS_TYPES_COMPATIBLE_P            d_types_compatible_p
> diff --git a/gcc/d/d-tree.h b/gcc/d/d-tree.h
> index b64a6fb46f9..021d3409b0a 100644
> --- a/gcc/d/d-tree.h
> +++ b/gcc/d/d-tree.h
> @@ -508,8 +508,8 @@ extern tree insert_decl_attribute (tree, const char *, 
> tree = NULL_TREE);
>  extern void apply_user_attributes (Dsymbol *, tree);
>  
>  /* In d-builtins.cc.  */
> -extern const attribute_spec d_langhook_attribute_table[];
> -extern const attribute_spec d_langhook_common_attribute_table[];
> +extern const struct scoped_attribute_specs d_langhook_gnu_attribute_table;
> +extern const struct scoped_attribute_specs d_langhook_common_attribute_table;
>  extern Type *build_frontend_type (tree);
>  
>  extern tree d_builtin_function (tree);
> -- 
> 2.25.1
> 
> 

Reply via email to