diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2016-06-06 09:51:33 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2016-06-06 09:51:33 +0000 |
commit | 1f0b1322e0f2233122f67a86c3181f08c633e06c (patch) | |
tree | a5881ce6dffaea37772b84ad18bdf56725af502a /gcc/ada/gcc-interface/utils.c | |
parent | 5a4916beb895932ff9a68716f36fb47b4d059c49 (diff) | |
download | gcc-1f0b1322e0f2233122f67a86c3181f08c633e06c.zip gcc-1f0b1322e0f2233122f67a86c3181f08c633e06c.tar.gz gcc-1f0b1322e0f2233122f67a86c3181f08c633e06c.tar.bz2 |
utils.c (gnat_internal_attribute_table): Add support for noinline and noclone attributes.
* gcc-interface/utils.c (gnat_internal_attribute_table): Add support
for noinline and noclone attributes.
(handle_noinline_attribute): New handler.
(handle_noclone_attribute): Likewise.
From-SVN: r237127
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 6a55796..831b6e0 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -90,6 +90,8 @@ static tree handle_novops_attribute (tree *, tree, tree, int, bool *); static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *); static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *); static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); +static tree handle_noinline_attribute (tree *, tree, tree, int, bool *); +static tree handle_noclone_attribute (tree *, tree, tree, int, bool *); static tree handle_leaf_attribute (tree *, tree, tree, int, bool *); static tree handle_always_inline_attribute (tree *, tree, tree, int, bool *); static tree handle_malloc_attribute (tree *, tree, tree, int, bool *); @@ -121,6 +123,10 @@ const struct attribute_spec gnat_internal_attribute_table[] = false }, { "noreturn", 0, 0, true, false, false, handle_noreturn_attribute, false }, + { "noinline", 0, 0, true, false, false, handle_noinline_attribute, + false }, + { "noclone", 0, 0, true, false, false, handle_noclone_attribute, + false }, { "leaf", 0, 0, true, false, false, handle_leaf_attribute, false }, { "always_inline",0, 0, true, false, false, handle_always_inline_attribute, @@ -5963,6 +5969,51 @@ handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args), return NULL_TREE; } +/* Handle a "noinline" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_noinline_attribute (tree *node, tree name, + tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + if (TREE_CODE (*node) == FUNCTION_DECL) + { + if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node))) + { + warning (OPT_Wattributes, "%qE attribute ignored due to conflict " + "with attribute %qs", name, "always_inline"); + *no_add_attrs = true; + } + else + DECL_UNINLINABLE (*node) = 1; + } + else + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + +/* Handle a "noclone" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_noclone_attribute (tree *node, tree name, + tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + if (TREE_CODE (*node) != FUNCTION_DECL) + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + /* Handle a "leaf" attribute; arguments as in struct attribute_spec.handler. */ |