utils.c (gnat_internal_attribute_table): Add support for noinline and noclone attributes.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 6 Jun 2016 09:51:33 +0000 (09:51 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 6 Jun 2016 09:51:33 +0000 (09:51 +0000)
* 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

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c

index 115d7079ee81761c758b8ac9321db51ca823faf1..92292bea058560a9b379f60473beae9c3b4231cc 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils.c (gnat_internal_attribute_table): Add support
+       for noinline and noclone attributes.
+       (handle_noinline_attribute): New handler.
+       (handle_noclone_attribute): Likewise.
+
 2016-06-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (process_type): Beef up comment.
index 6a55796a442487afbcdc32f71dd0c03cea0f05e3..831b6e035aa80f17d93be543c8f221737112f19c 100644 (file)
@@ -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.  */