]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP: Unify representation of name-list properties.
authorSandra Loosemore <sandra@codesourcery.com>
Sun, 19 Nov 2023 05:31:41 +0000 (05:31 +0000)
committerSandra Loosemore <sandra@codesourcery.com>
Tue, 19 Dec 2023 20:07:13 +0000 (20:07 +0000)
Previously, name-list properties specified as identifiers were stored
in the TREE_PURPOSE/OMP_TP_NAME slot, while those specified as strings
were stored in the TREE_VALUE/OMP_TP_VALUE slot.  This patch puts both
representations in OMP_TP_VALUE with a magic cookie in OMP_TP_NAME.

gcc/ChangeLog
* omp-general.h (OMP_TP_NAMELIST_NODE): New.
* omp-general.cc (omp_context_name_list_prop): Move earlier
in the file, and adjust for new representation.
(omp_check_context_selector): Adjust this too.
(omp_context_selector_props_compare): Likewise.

gcc/c/ChangeLog
* c-parser.cc (c_parser_omp_context_selector): Adjust for new
namelist property representation.

gcc/cp/ChangeLog
* parser.cc (cp_parser_omp_context_selector): Adjust for new
namelist property representation.
* pt.cc (tsubst_attribute): Likewise.

gcc/fortran/ChangeLog
* trans-openmp.cc (gfc_trans_omp_declare_varaint): Adjust for
new namelist property representation.

gcc/c/c-parser.cc
gcc/cp/parser.cc
gcc/cp/pt.cc
gcc/fortran/trans-openmp.cc
gcc/omp-general.cc
gcc/omp-general.h

index a61381e887ff44bc430415fdcad0f042dffd9879..b5bed5ee276b62acbce563dedfabf6dd43e41d90 100644 (file)
@@ -24571,11 +24571,12 @@ c_parser_omp_context_selector (c_parser *parser, tree set, tree parms)
            case CTX_PROPERTY_NAME_LIST:
              do
                {
-                 tree prop = NULL_TREE, value = NULL_TREE;
+                 tree prop = OMP_TP_NAMELIST_NODE;
+                 tree value = NULL_TREE;
                  if (c_parser_next_token_is (parser, CPP_KEYWORD)
                      || c_parser_next_token_is (parser, CPP_NAME))
                    {
-                     prop = c_parser_peek_token (parser)->value;
+                     value = c_parser_peek_token (parser)->value;
                      c_parser_consume_token (parser);
                    }
                  else if (c_parser_next_token_is (parser, CPP_STRING))
index 5a916374ccf22b3fc3c6134632f841977e62bf98..3250b0bda6d7d4dd9a5c350c3f9d04881354d1cb 100644 (file)
@@ -47630,11 +47630,12 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
            case CTX_PROPERTY_NAME_LIST:
              do
                {
-                 tree prop = NULL_TREE, value = NULL_TREE;
+                 tree prop = OMP_TP_NAMELIST_NODE;
+                 tree value = NULL_TREE;
                  if (cp_lexer_next_token_is (parser->lexer, CPP_KEYWORD)
                      || cp_lexer_next_token_is (parser->lexer, CPP_NAME))
                    {
-                     prop = cp_lexer_peek_token (parser->lexer)->u.value;
+                     value = cp_lexer_peek_token (parser->lexer)->u.value;
                      cp_lexer_consume_token (parser->lexer);
                    }
                  else if (cp_lexer_next_token_is (parser->lexer, CPP_STRING))
index a752dcf76b8742a8466cba85fda4946d0a1ccff5..ef280e417d4162b2dbea6ad81205739944bf4db6 100644 (file)
@@ -11939,7 +11939,9 @@ tsubst_attribute (tree t, tree *decl_p, tree args,
                    }
                  properties = copy_list (OMP_TS_PROPERTIES (ts));
                  for (tree p = properties; p; p = TREE_CHAIN (p))
-                   if (OMP_TP_VALUE (p))
+                   if (OMP_TP_NAME (p) == OMP_TP_NAMELIST_NODE)
+                     continue;
+                   else if (OMP_TP_VALUE (p))
                      {
                        bool allow_string
                          = (OMP_TS_ID (ts) != condition || set[0] != 'u');
index 55f85d582b57a2e1c34bd7fdca96ff61a060192b..93f75162a2a7aeb912b2f237269d6606cfbf1eec 100644 (file)
@@ -8428,9 +8428,10 @@ gfc_trans_omp_declare_variant (gfc_namespace *ns)
                      break;
                    case CTX_PROPERTY_NAME_LIST:
                      {
-                       tree prop = NULL_TREE, value = NULL_TREE;
+                       tree prop = OMP_TP_NAMELIST_NODE;
+                       tree value = NULL_TREE;
                        if (otp->is_name)
-                         prop = get_identifier (otp->name);
+                         value = get_identifier (otp->name);
                        else
                          value = gfc_conv_constant_to_tree (otp->expr);
 
index c95873b5524335efe389c66b8cb4b4b225635964..285bc788836559d285cd7a056570ecdc3b574d55 100644 (file)
@@ -1116,6 +1116,30 @@ omp_maybe_offloaded (void)
   return false;
 }
 
+/* Return a name from PROP, a property in selectors accepting
+   name lists.  */
+
+static const char *
+omp_context_name_list_prop (tree prop)
+{
+  gcc_assert (OMP_TP_NAME (prop) == OMP_TP_NAMELIST_NODE);
+  tree val = OMP_TP_VALUE (prop);
+  switch (TREE_CODE (val))
+    {
+    case IDENTIFIER_NODE:
+      return IDENTIFIER_POINTER (val);
+    case STRING_CST:
+      {
+       const char *ret = TREE_STRING_POINTER (val);
+       if ((size_t) TREE_STRING_LENGTH (val)
+           == strlen (ret) + (lang_GNU_Fortran () ? 0 : 1))
+         return ret;
+       return NULL;
+      }
+    default:
+      return NULL;
+    }
+}
 
 /* Diagnose errors in an OpenMP context selector, return CTX if
    it is correct or error_mark_node otherwise.  */
@@ -1200,23 +1224,29 @@ omp_check_context_selector (location_t loc, tree ctx)
                                    "atomic_default_mem_order");
                          return error_mark_node;
                        }
+                     else if (OMP_TP_NAME (p) == OMP_TP_NAMELIST_NODE
+                              && (TREE_CODE (OMP_TP_VALUE (p)) == STRING_CST))
+                       warning_at (loc, 0,
+                                   "unknown property %qE of %qs selector",
+                                   OMP_TP_VALUE (p),
+                                   props[i].selector);
+                     else if (OMP_TP_NAME (p) == OMP_TP_NAMELIST_NODE)
+                       warning_at (loc, 0,
+                                   "unknown property %qs of %qs selector",
+                                   omp_context_name_list_prop (p),
+                                   props[i].selector);
                      else if (OMP_TP_NAME (p))
                        warning_at (loc, OPT_Wopenmp,
                                    "unknown property %qs of %qs selector",
                                    IDENTIFIER_POINTER (OMP_TP_NAME (p)),
                                    props[i].selector);
-                     else
-                       warning_at (loc, OPT_Wopenmp,
-                                   "unknown property %qE of %qs selector",
-                                   OMP_TP_VALUE (p), props[i].selector);
                      break;
                    }
-                 else if (OMP_TP_NAME (p) == NULL_TREE)
+                 else if (OMP_TP_NAME (p) == OMP_TP_NAMELIST_NODE)
+                   /* Property-list traits.  */
                    {
-                     const char *str = TREE_STRING_POINTER (OMP_TP_VALUE (p));
-                     if (!strcmp (str, props[i].props[j])
-                         && ((size_t) TREE_STRING_LENGTH (OMP_TP_VALUE (p))
-                             == strlen (str) + (lang_GNU_Fortran () ? 0 : 1)))
+                     const char *str = omp_context_name_list_prop (p);
+                     if (str && !strcmp (str, props[i].props[j]))
                        break;
                    }
                  else if (!strcmp (IDENTIFIER_POINTER (OMP_TP_NAME (p)),
@@ -1279,24 +1309,6 @@ make_trait_property (tree name, tree value, tree chain)
   return tree_cons (name, value, chain);
 }
 
-/* Return a name from PROP, a property in selectors accepting
-   name lists.  */
-
-static const char *
-omp_context_name_list_prop (tree prop)
-{
-  if (OMP_TP_NAME (prop))
-    return IDENTIFIER_POINTER (OMP_TP_NAME (prop));
-  else
-    {
-      const char *ret = TREE_STRING_POINTER (OMP_TP_VALUE (prop));
-      if ((size_t) TREE_STRING_LENGTH (OMP_TP_VALUE (prop))
-         == strlen (ret) + (lang_GNU_Fortran () ? 0 : 1))
-       return ret;
-      return NULL;
-    }
-}
-
 /* Return 1 if context selector matches the current OpenMP context, 0
    if it does not and -1 if it is unknown and need to be determined later.
    Some properties can be checked right away during parsing (this routine),
@@ -1795,18 +1807,18 @@ omp_context_selector_props_compare (const char *set, const char *sel,
                  if (simple_cst_equal (OMP_TP_VALUE (p1), OMP_TP_VALUE (p2)))
                    break;
                }
+             else if (OMP_TP_NAME (p1) == OMP_TP_NAMELIST_NODE)
+               {
+                 /* Handle string constant vs identifier comparison for
+                    name-list properties.  */
+                 const char *n1 = omp_context_name_list_prop (p1);
+                 const char *n2 = omp_context_name_list_prop (p2);
+                 if (n1 && n2 && !strcmp (n1, n2))
+                   break;
+               }
              else
                break;
            }
-         else
-           {
-             /* Handle string constant vs identifier comparison for
-                name-list properties.  */
-             const char *n1 = omp_context_name_list_prop (p1);
-             const char *n2 = omp_context_name_list_prop (p2);
-             if (n1 && n2 && !strcmp (n1, n2))
-               break;
-           }
        if (p2 == NULL_TREE)
          {
            int r = pass ? -1 : 1;
index 4bd187bd8603ec1b6782054014767d5ba70a7e54..40ede66568bdb2c444cee93cccbaa7fff6c74a8e 100644 (file)
@@ -112,6 +112,7 @@ struct omp_for_data
    OMP_TS_SCORE_NODE.  */
 
 #define OMP_TS_SCORE_NODE integer_minus_one_node
+#define OMP_TP_NAMELIST_NODE integer_one_node
 
 #define OMP_TSS_ID(NODE) \
   TREE_PURPOSE (NODE)