Ping.

On 2020/11/13 9:13 PM, Chung-Lin Tang wrote:
Hi Jakub,
there was a first version of this patch here:
https://gcc.gnu.org/pipermail/gcc-patches/2020-September/554087.html

The attached patch here is a v2 version  that adds implementation of
this part in the this[:1] functionality description in the OpenMP 5.0 spec:

  "if the [member] variable [accessed in a target region] is of a type pointer
   or reference to pointer, it is also treated as if it has appeared in a map
   clause as a zero-length array section."

Basically, referencing a pointer member 'ptr' automatically maps it with the
equivalent of 'map(this->ptr[:0])'

To achieve this, two new map kinds GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION,
and GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION were added, which are
basically split from GOMP_MAP_ATTACH and GOMP_MAP_POINTER, except now allowing
the pointer target to be NULL.

This patch has been tested for gcc, g++, gfortran (C and Fortran are not really
affected, but since omp-low.c was slightly touched, tested along for 
completeness)
and libgomp on x86_64-linux with nvptx offloading, all without regressions.

Is this okay for trunk?

Thanks,
Chung-Lin

2020-11-13  Chung-Lin Tang  <clt...@codesourcery.com>

     PR middle-end/92120

     gcc/cp/
     * cp-tree.h (finish_omp_target): New declaration.
     (set_omp_target_this_expr): Likewise.
     * lambda.c (lambda_expr_this_capture): Add call to
     set_omp_target_this_expr.
     * parser.c (cp_parser_omp_target): Factor out code, change to call
     finish_omp_target, add re-initing call to set_omp_target_this_expr.
     * semantics.c (omp_target_this_expr): New static variable.
     (omp_target_ptr_members_accessed): New static hash_map for tracking
     accessed non-static pointer-type members.
     (finish_non_static_data_member): Add call to set_omp_target_this_expr.
     Add recording of non-static pointer-type members access.
     (finish_this_expr): Add call to set_omp_target_this_expr.
     (set_omp_target_this_expr): New function to set omp_target_this_expr.
     (finish_omp_target): New function with code merged from
     cp_parser_omp_target, plus code to implement this[:1] and __closure map
     clauses    for OpenMP.

     gcc/
     * omp-low.c (lower_omp_target):
     Handle GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION, and
     GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION map kinds.
     * tree-pretty-print.c (dump_omp_clause): Likewise.

     include/
     * gomp-constants.h (enum gomp_map_kind):
     Add GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION, and
     GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION map kinds.
     (GOMP_MAP_POINTER_P):
     Include GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION.

     libgomp/
     * libgomp.h (gomp_attach_pointer): Add bool parameter.
     * oacc-mem.c (acc_attach_async): Update call to gomp_attach_pointer.
     (goacc_enter_data_internal): Likewise.
     * target.c (gomp_map_vars_existing): Update assert condition to
     include GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION.
     (gomp_map_pointer): Add 'bool allow_zero_length_array_sections'
     parameter, add support for mapping a pointer with NULL target.
     (gomp_attach_pointer): Add 'bool allow_zero_length_array_sections'
     parameter, add support for attaching a pointer with NULL target.
     (gomp_map_vars_internal): Update calls to gomp_map_pointer and
     gomp_attach_pointer, add handling for
     GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION, and
     GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION cases.

     gcc/testsuite/
     * g++.dg/gomp/target-this-1.C: New testcase.
     * g++.dg/gomp/target-this-2.C: New testcase.
     * g++.dg/gomp/target-this-3.C: New testcase.
     * g++.dg/gomp/target-this-4.C: New testcase.

     libgomp/
     * testsuite/libgomp.c++/target-this-1.C: New testcase.
     * testsuite/libgomp.c++/target-this-2.C: New testcase.
     * testsuite/libgomp.c++/target-this-3.C: New testcase.
     * testsuite/libgomp.c++/target-this-4.C: New testcase.

Reply via email to