From cfc07102ef2ff3675cb193e4f0e61c9d2d5b368e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 18 Mar 2022 11:16:06 +0100 Subject: [PATCH] [Ada] Add support for "simd" function attribute gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) : 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. --- gcc/ada/gcc-interface/decl.cc | 5 +++- gcc/ada/gcc-interface/utils.cc | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc index af6475e7307..2d9b41f984c 100644 --- a/gcc/ada/gcc-interface/decl.cc +++ b/gcc/ada/gcc-interface/decl.cc @@ -4002,6 +4002,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) { gnu_decl = gnu_type; gnu_type = TREE_TYPE (gnu_decl); + process_attributes (&gnu_decl, &attr_list, true, gnat_entity); break; } @@ -6864,7 +6865,9 @@ prepend_one_attribute_pragma (struct attrib **attr_list, Node_Id gnat_pragma) const char *const p = TREE_STRING_POINTER (gnu_arg1); const bool string_args - = strcmp (p, "target") == 0 || strcmp (p, "target_clones") == 0; + = strcmp (p, "simd") == 0 + || strcmp (p, "target") == 0 + || strcmp (p, "target_clones") == 0; gnu_arg1 = get_identifier (p); if (IDENTIFIER_LENGTH (gnu_arg1) == 0) return; diff --git a/gcc/ada/gcc-interface/utils.cc b/gcc/ada/gcc-interface/utils.cc index 98bcb7063e3..d747c639a8f 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 % and % 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