Message ID | 20240622185557.1589179-4-ak@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | [v8,01/12] Improve must tail in RTL backend | expand |
On Sat, Jun 22, 2024 at 8:57 PM Andi Kleen <ak@linux.intel.com> wrote: > > It does nothing currently since statement attributes are handled > directly in the parser. Is this needed at all? a "'musttail' attribute ignored" diagnostic isn't much more helpful than "'foo' attribute directive ignored"? Or does stmt attribute parsing rely on this table as well? Richard. > gcc/c-family/ChangeLog: > > * c-attribs.cc (handle_musttail_attribute): Add. > * c-common.h (handle_musttail_attribute): Add. > --- > gcc/c-family/c-attribs.cc | 15 +++++++++++++++ > gcc/c-family/c-common.h | 1 + > 2 files changed, 16 insertions(+) > > diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc > index f9b229aba7fc..5adc7b775eaf 100644 > --- a/gcc/c-family/c-attribs.cc > +++ b/gcc/c-family/c-attribs.cc > @@ -340,6 +340,8 @@ const struct attribute_spec c_common_gnu_attributes[] = > { "common", 0, 0, true, false, false, false, > handle_common_attribute, > attr_common_exclusions }, > + { "musttail", 0, 0, false, false, false, > + false, handle_musttail_attribute, NULL }, > /* FIXME: logically, noreturn attributes should be listed as > "false, true, true" and apply to function types. But implementing this > would require all the places in the compiler that use TREE_THIS_VOLATILE > @@ -1222,6 +1224,19 @@ handle_common_attribute (tree *node, tree name, tree ARG_UNUSED (args), > return NULL_TREE; > } > > +/* Handle a "musttail" attribute; arguments as in > + struct attribute_spec.handler. */ > + > +tree > +handle_musttail_attribute (tree ARG_UNUSED (*node), tree name, tree ARG_UNUSED (args), > + int ARG_UNUSED (flags), bool *no_add_attrs) > +{ > + /* Currently only a statement attribute, handled directly in parser. */ > + warning (OPT_Wattributes, "%qE attribute ignored", name); > + *no_add_attrs = true; > + return NULL_TREE; > +} > + > /* Handle a "noreturn" attribute; arguments as in > struct attribute_spec.handler. */ > > diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h > index 48c89b603bcd..e84c9c47513b 100644 > --- a/gcc/c-family/c-common.h > +++ b/gcc/c-family/c-common.h > @@ -1643,6 +1643,7 @@ extern tree find_tm_attribute (tree); > extern const struct attribute_spec::exclusions attr_cold_hot_exclusions[]; > extern const struct attribute_spec::exclusions attr_noreturn_exclusions[]; > extern tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); > +extern tree handle_musttail_attribute (tree *, tree, tree, int, bool *); > extern bool has_attribute (location_t, tree, tree, tree (*)(tree)); > extern tree build_attr_access_from_parms (tree, bool); > > -- > 2.45.2 >
On Fri, Jul 05, 2024 at 12:44:47PM +0200, Richard Biener wrote: > On Sat, Jun 22, 2024 at 8:57 PM Andi Kleen <ak@linux.intel.com> wrote: > > > > It does nothing currently since statement attributes are handled > > directly in the parser. > > Is this needed at all? a "'musttail' attribute ignored" diagnostic isn't > much more helpful than "'foo' attribute directive ignored"? Or does > stmt attribute parsing rely on this table as well? It avoids an extra check in the C/C++ parser. I will clarify the commit message to say that. -Andi
diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index f9b229aba7fc..5adc7b775eaf 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -340,6 +340,8 @@ const struct attribute_spec c_common_gnu_attributes[] = { "common", 0, 0, true, false, false, false, handle_common_attribute, attr_common_exclusions }, + { "musttail", 0, 0, false, false, false, + false, handle_musttail_attribute, NULL }, /* FIXME: logically, noreturn attributes should be listed as "false, true, true" and apply to function types. But implementing this would require all the places in the compiler that use TREE_THIS_VOLATILE @@ -1222,6 +1224,19 @@ handle_common_attribute (tree *node, tree name, tree ARG_UNUSED (args), return NULL_TREE; } +/* Handle a "musttail" attribute; arguments as in + struct attribute_spec.handler. */ + +tree +handle_musttail_attribute (tree ARG_UNUSED (*node), tree name, tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + /* Currently only a statement attribute, handled directly in parser. */ + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + return NULL_TREE; +} + /* Handle a "noreturn" attribute; arguments as in struct attribute_spec.handler. */ diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 48c89b603bcd..e84c9c47513b 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -1643,6 +1643,7 @@ extern tree find_tm_attribute (tree); extern const struct attribute_spec::exclusions attr_cold_hot_exclusions[]; extern const struct attribute_spec::exclusions attr_noreturn_exclusions[]; extern tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); +extern tree handle_musttail_attribute (tree *, tree, tree, int, bool *); extern bool has_attribute (location_t, tree, tree, tree (*)(tree)); extern tree build_attr_access_from_parms (tree, bool);