On Thu, Oct 04, 2018 at 02:04:13PM +0100, Julian Brown wrote:
> gcc/
> * omp-low.c (scan_sharing_clauses): Update handling of OpenACC declare
> create, declare copyin and declare deviceptr to have local lifetimes.
> (convert_to_firstprivate_int): Handle pointer types.
> (convert_from_firstprivate_int): Likewise. Create local storage for
> the values being pointed to. Add new orig_type argument.
> (lower_omp_target): Handle GOMP_MAP_DECLARE_{ALLOCATE,DEALLOCATE}.
> Add orig_type argument to convert_from_firstprivate_int call.
> Allow pointer types with GOMP_MAP_FIRSTPRIVATE_INT. Don't privatize
> firstprivate VLAs.
> * tree-pretty-print.c (dump_omp_clause): Handle
> GOMP_MAP_DECLARE_{ALLOCATE,DEALLOCATE}.
>
> gcc/fortran/
> * gfortran.h (enum gfc_omp_map_op): Add OMP_MAP_DECLARE_ALLOCATE,
> OMP_MAP_DECLARE_DEALLOCATE.
> (gfc_omp_clauses): Add update_allocatable.
> * trans-array.c (gfc_array_allocate): Call
> gfc_trans_oacc_declare_allocate for decls that have oacc_declare_create
> attribute set.
> * trans-decl.c (add_attributes_to_decl): Enable lowering of OpenACC
> declare create, declare copyin and declare deviceptr clauses.
> (find_module_oacc_declare_clauses): Relax oacc_declare_create to
> OMP_MAP_ALLOC, and oacc_declare_copyin to OMP_MAP_TO, in order to
> match OpenACC 2.5 semantics.
> (finish_oacc_declare): Reset module_oacc_clauses before scanning each
> namespace.
> * trans-openmp.c (gfc_trans_omp_clauses): Use GOMP_MAP_ALWAYS_POINTER
> (for update directive) or GOMP_MAP_FIRSTPRIVATE_POINTER (otherwise) for
> allocatable scalar decls. Handle OMP_MAP_DECLARE_{ALLOCATE,DEALLOCATE}
> clauses.
> (gfc_trans_oacc_executable_directive): Use GOMP_MAP_ALWAYS_POINTER
> for allocatable scalar data clauses inside acc update directives.
> (gfc_trans_oacc_declare_allocate): New function.
> * trans-stmt.c (gfc_trans_allocate): Call
> gfc_trans_oacc_declare_allocate for decls with oacc_declare_create
> attribute set.
> (gfc_trans_deallocate): Likewise.
> * trans.h (gfc_trans_oacc_declare_allocate): Declare.
>
> gcc/testsuite/
> * gfortran.dg/goacc/declare-allocatable-1.f90: New test.
>
> include/
> * gomp-constants.h (enum gomp_map_kind): Define
> GOMP_MAP_DECLARE_{ALLOCATE,DEALLOCATE} and GOMP_MAP_FLAG_SPECIAL_4.
>
> libgomp/
> * oacc-mem.c (gomp_acc_declare_allocate): New function.
> * oacc-parallel.c (GOACC_enter_exit_data): Handle
> GOMP_MAP_DECLARE_{ALLOCATE,DEALLOCATE}.
> * testsuite/libgomp.oacc-fortran/allocatable-array.f90: New test.
> * testsuite/libgomp.oacc-fortran/allocatable-scalar.f90: New test.
> * testsuite/libgomp.oacc-fortran/declare-allocatable-1.f90: New test.
> * testsuite/libgomp.oacc-fortran/declare-allocatable-2.f90: New test.
> * testsuite/libgomp.oacc-fortran/declare-allocatable-3.f90: New test.
> * testsuite/libgomp.oacc-fortran/declare-allocatable-4.f90: New test.
If Thomas is ok with this, it is fine for me.
Jakub