aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/utils.cc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-03-18 11:16:06 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-19 14:05:33 +0000
commitcfc07102ef2ff3675cb193e4f0e61c9d2d5b368e (patch)
treecd9c1052024ec33f5ac201abee05eec8b322b9e9 /gcc/ada/gcc-interface/utils.cc
parentdb6734819f777dbbf9eea464baa7fc60a953dc8a (diff)
downloadgcc-cfc07102ef2ff3675cb193e4f0e61c9d2d5b368e.zip
gcc-cfc07102ef2ff3675cb193e4f0e61c9d2d5b368e.tar.gz
gcc-cfc07102ef2ff3675cb193e4f0e61c9d2d5b368e.tar.bz2
[Ada] Add support for "simd" function attribute
gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Function>: Also call process_attributes for built-in functions. (prepend_one_attribute_pragma): Deal with "simd" attribute. * gcc-interface/utils.cc (handle_simd_attribute): New function. (gnat_internal_attribute_table): Add entry for "simd" attribute.
Diffstat (limited to 'gcc/ada/gcc-interface/utils.cc')
-rw-r--r--gcc/ada/gcc-interface/utils.cc51
1 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ada/gcc-interface/utils.cc b/gcc/ada/gcc-interface/utils.cc
index 98bcb70..d747c63 100644
--- a/gcc/ada/gcc-interface/utils.cc
+++ b/gcc/ada/gcc-interface/utils.cc
@@ -107,6 +107,7 @@ static tree handle_flatten_attribute (tree *, tree, tree, int, bool *);
static tree handle_used_attribute (tree *, tree, tree, int, bool *);
static tree handle_cold_attribute (tree *, tree, tree, int, bool *);
static tree handle_hot_attribute (tree *, tree, tree, int, bool *);
+static tree handle_simd_attribute (tree *, tree, tree, int, bool *);
static tree handle_target_attribute (tree *, tree, tree, int, bool *);
static tree handle_target_clones_attribute (tree *, tree, tree, int, bool *);
static tree handle_vector_size_attribute (tree *, tree, tree, int, bool *);
@@ -185,6 +186,8 @@ const struct attribute_spec gnat_internal_attribute_table[] =
handle_cold_attribute, attr_cold_hot_exclusions },
{ "hot", 0, 0, true, false, false, false,
handle_hot_attribute, attr_cold_hot_exclusions },
+ { "simd", 0, 1, true, false, false, false,
+ handle_simd_attribute, NULL },
{ "target", 1, -1, true, false, false, false,
handle_target_attribute, NULL },
{ "target_clones",1, -1, true, false, false, false,
@@ -6880,6 +6883,54 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
return NULL_TREE;
}
+/* Handle a "simd" attribute. */
+
+static tree
+handle_simd_attribute (tree *node, tree name, tree args, int, bool *no_add_attrs)
+{
+ if (TREE_CODE (*node) == FUNCTION_DECL)
+ {
+ tree t = get_identifier ("omp declare simd");
+ tree attr = NULL_TREE;
+ if (args)
+ {
+ tree id = TREE_VALUE (args);
+
+ if (TREE_CODE (id) != STRING_CST)
+ {
+ error ("attribute %qE argument not a string", name);
+ *no_add_attrs = true;
+ return NULL_TREE;
+ }
+
+ if (strcmp (TREE_STRING_POINTER (id), "notinbranch") == 0)
+ attr = build_omp_clause (DECL_SOURCE_LOCATION (*node),
+ OMP_CLAUSE_NOTINBRANCH);
+ else if (strcmp (TREE_STRING_POINTER (id), "inbranch") == 0)
+ attr = build_omp_clause (DECL_SOURCE_LOCATION (*node),
+ OMP_CLAUSE_INBRANCH);
+ else
+ {
+ error ("only %<inbranch%> and %<notinbranch%> flags are "
+ "allowed for %<__simd__%> attribute");
+ *no_add_attrs = true;
+ return NULL_TREE;
+ }
+ }
+
+ DECL_ATTRIBUTES (*node)
+ = tree_cons (t, build_tree_list (NULL_TREE, attr),
+ DECL_ATTRIBUTES (*node));
+ }
+ else
+ {
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
+ *no_add_attrs = true;
+ }
+
+ return NULL_TREE;
+}
+
/* Handle a "target" attribute. */
static tree