On 2021/5/11 4:57 PM, Julian Brown wrote:
This work-in-progress patch tries to get
GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION to behave more like
GOMP_MAP_ATTACH_DETACH -- in that the mapping is made to form groups
to be processed by build_struct_group/build_struct_comp_map.  I think
that's important to integrate with how groups of mappings for array
sections are handled in other cases.

This patch isn't sufficient by itself to fix a couple of broken test cases
at present (libgomp.c++/target-lambda-1.C, libgomp.c++/target-this-4.C),
though.

No, GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION is supposed to be just a slightly
different behavior version of GOMP_MAP_ATTACH; it tolerates an unmapped
pointer-target and assigns NULL on the device, instead of just gomp_fatal().
(see its handling in libgomp/target.c)

In case OpenACC can have the same such zero-length array section behavior,
we can just share one GOMP_MAP_ATTACH map. For now it is treated as separate
cases.

Chung-Lin

2021-05-11  Julian Brown  <jul...@codesourcery.com>

gcc/
        * gimplify.c (build_struct_comp_nodes): Add
        GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION handling.
        (build_struct_group): Process GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION
        as part of pointer group.
        (gimplify_scan_omp_clauses): Update prev_list_p such that
        GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION will form part of pointer
        group.
---
  gcc/gimplify.c | 16 ++++++++++++----
  1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 6d204908c82..c5cb486aa23 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -8298,7 +8298,9 @@ build_struct_comp_nodes (enum tree_code code, tree 
grp_start, tree grp_end,
    if (grp_mid
        && OMP_CLAUSE_CODE (grp_mid) == OMP_CLAUSE_MAP
        && (OMP_CLAUSE_MAP_KIND (grp_mid) == GOMP_MAP_ALWAYS_POINTER
-         || OMP_CLAUSE_MAP_KIND (grp_mid) == GOMP_MAP_ATTACH_DETACH))
+         || OMP_CLAUSE_MAP_KIND (grp_mid) == GOMP_MAP_ATTACH_DETACH
+         || (OMP_CLAUSE_MAP_KIND (grp_mid)
+             == GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION)))
      {
        tree c3
        = build_omp_clause (OMP_CLAUSE_LOCATION (grp_end), OMP_CLAUSE_MAP);
@@ -8774,12 +8776,14 @@ build_struct_group (struct gimplify_omp_ctx *ctx,
         ? splay_tree_lookup (ctx->variables, (splay_tree_key) decl)
         : NULL);
    bool ptr = (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ALWAYS_POINTER);
-  bool attach_detach = (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH_DETACH);
+  bool attach_detach = (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH_DETACH
+                       || (OMP_CLAUSE_MAP_KIND (c)
+                           == GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION));
    bool attach = (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
                 || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH);
    bool has_attachments = false;
    /* For OpenACC, pointers in structs should trigger an attach action.  */
-  if (attach_detach
+  if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH_DETACH
        && ((region_type & (ORT_ACC | ORT_TARGET | ORT_TARGET_DATA))
          || code == OMP_TARGET_ENTER_DATA
          || code == OMP_TARGET_EXIT_DATA))
@@ -9784,6 +9788,8 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
*pre_p,
              if (!remove
                  && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_ALWAYS_POINTER
                  && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_ATTACH_DETACH
+                 && (OMP_CLAUSE_MAP_KIND (c)
+                     != GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION)
                  && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_TO_PSET
                  && OMP_CLAUSE_CHAIN (c)
                  && OMP_CLAUSE_CODE (OMP_CLAUSE_CHAIN (c)) == OMP_CLAUSE_MAP
@@ -9792,7 +9798,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
*pre_p,
                      || (OMP_CLAUSE_MAP_KIND (OMP_CLAUSE_CHAIN (c))
                          == GOMP_MAP_ATTACH_DETACH)
                      || (OMP_CLAUSE_MAP_KIND (OMP_CLAUSE_CHAIN (c))
-                         == GOMP_MAP_TO_PSET)))
+                         == GOMP_MAP_TO_PSET)
+                     || (OMP_CLAUSE_MAP_KIND (OMP_CLAUSE_CHAIN (c))
+                         == GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION)))
                prev_list_p = list_p;
break;

Reply via email to