diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-11-30 14:27:49 +0100 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-11-30 14:27:49 +0100 |
commit | ba85c8c3fcb19c776f6e2209d5b0044c9e1cdd3d (patch) | |
tree | b2eb87602c8c315d1323a3da70856a653afbf967 /gcc/fortran/trans.h | |
parent | d5c50b024fbfe4255270fa4c7845b222466d2e79 (diff) | |
download | gcc-ba85c8c3fcb19c776f6e2209d5b0044c9e1cdd3d.zip gcc-ba85c8c3fcb19c776f6e2209d5b0044c9e1cdd3d.tar.gz gcc-ba85c8c3fcb19c776f6e2209d5b0044c9e1cdd3d.tar.bz2 |
libcaf.h: Add new action types for (de-)registration of allocatable components in derived...
libgfortran/ChangeLog:
2016-11-30 Andre Vehreschild <vehre@gcc.gnu.org>
* caf/libcaf.h: Add new action types for (de-)registration of
allocatable components in derived type coarrays. Add _caf_is_present
prototype.
* caf/single.c (_gfortran_caf_register): Add support for registration
only and allocation of already registered allocatable components in
derived type coarrays.
(_gfortran_caf_deregister): Add mode to deallocate but not deregister
an allocatable component in a derived type coarray.
(_gfortran_caf_is_present): New function. Query whether an
allocatable component in a derived type coarray on a remote image is
allocated.
gcc/testsuite/ChangeLog:
2016-11-30 Andre Vehreschild <vehre@gcc.gnu.org>
* gfortran.dg/coarray/alloc_comp_1.f90: Fix tree-dump scans to adhere
to the changed interfaces.
* gfortran.dg/coarray_alloc_comp_1.f08: Likewise.
* gfortran.dg/coarray_allocate_7.f08: Likewise.
* gfortran.dg/coarray_lib_alloc_1.f90: Likewise.
* gfortran.dg/coarray_lib_alloc_2.f90: Likewise.
* gfortran.dg/coarray_lib_alloc_3.f90: Likewise.
* gfortran.dg/coarray_lib_comm_1.f90: Likewise.
* gfortran.dg/coarray_lib_alloc_4.f90: New test.
gcc/fortran/ChangeLog:
2016-11-30 Andre Vehreschild <vehre@gcc.gnu.org>
* check.c (gfc_check_allocated): By pass the caf_get call and check on
the array.
* gfortran.h: Add optional flag to gfc_caf_attr.
* gfortran.texi: Document new enum values and _caf_is_present function.
* primary.c (caf_variable_attr): Add optional flag to indicate that the
expression is reffing a component.
(gfc_caf_attr): Likewise.
* trans-array.c (gfc_array_deallocate): Handle deallocation mode for
coarray deregistration.
(gfc_trans_dealloc_allocated): Likewise.
(duplicate_allocatable): Use constants instead of
creating custom constant tree node of zero or one. Use gfc_add_modify
convenience function.
(duplicate_allocatable_coarray): This function is similar to
duplicate_allocatable but tailored to handle coarrays.
(caf_enabled): Check whether in-derived-type coarray processing is
enabled.
(caf_in_coarray): Check that in-derived-type coarray processing is
enabled and currently in a derived-typed coarray.
(gfc_caf_is_dealloc_only): Return true, when deallocate only is
desired for components in derived typed coarrays.
(structure_alloc_comps): A mode for handling coarrays, that is no
longer encode in the purpose. This makes the use cases of the
routine more flexible without repeating. Allocatable components in
derived type coarrays are now registered only when nullifying an
object and allocated before copying data into them.
(gfc_nullify_alloc_comp): Use the caf_mode of structure_alloc_comps
now.
(gfc_deallocate_alloc_comp): Likewise.
(gfc_deallocate_alloc_comp_no_caf): Likewise.
(gfc_reassign_alloc_comp_caf): Likewise.
(gfc_copy_alloc_comp): Likewise.
(gfc_copy_only_alloc_comp): Likewise.
(gfc_alloc_allocatable_for_assignment): Make use to the cheaper way of
reallocating a coarray without deregistering and reregistering it.
(gfc_trans_deferred_array): Initialize the coarray token correctly for
deferred variables and tear them down on exit.
* trans-array.h: Change some prototypes to add the coarray (de-)
registration modes. Add prototype for checking if deallocate only is
selected for components in derived typed coarrays.
* trans-decl.c (gfc_build_builtin_function_decls): Generate the
declarations for the changed/new caf-lib routines.
(gfc_trans_deferred_vars): Ensure deferred variables are (de-)
registered correctly on procedure entry/exit.
(generate_coarray_sym_init): Use constants.
* trans-expr.c (gfc_conv_procedure_call): Propagate coarray allocation
modes accordingly.
(gfc_trans_alloc_subarray_assign): Likewise.
(gfc_trans_subcomponent_assign): Likewise.
(gfc_trans_structure_assign): Generate code to register the components
of a derived type coarray prior to initialization.
(gfc_conv_structure): Set flag that the structure is in a coarray.
(gfc_trans_scalar_assign): Add flag to indicate being in a coarray and
set the structure_alloc_comps modes correctly.
(gfc_trans_assignment_1): Figure being in a coarray expression.
* trans-intrinsic.c (gfc_conv_intrinsic_caf_get): Adapt to new
structure_alloc_comps interface.
(conv_caf_send): Use the old API as long as possible.
(trans_caf_is_present): Generate code to check whether an allocatable
component in a derived typed coarray is allocated on a remote image.
(caf_this_image_ref): Return true, when only reffing this image.
(gfc_conv_allocated): Convert allocated queries on allocatable
components to the library API.
(conv_intrinsic_move_alloc): Adapt to new interface of
structure_alloc_comps.
* trans-openmp.c (gfc_walk_alloc_comps): Likewise.
(gfc_omp_clause_assign_op): Likewise.
(gfc_omp_clause_dtor): Likewise.
* trans-stmt.c (gfc_trans_deallocate): Figure which mode to use when
deallocating allocatable components in derived type coarras.
* trans.c (gfc_allocate_using_lib): Renamed to
gfc_allcate_using_caf_lib.
(gfc_allocate_allocatable): Set the registration mode/type of caf-
register calls adapting to all the possible allocatable objects.
(gfc_deallocate_with_status): Add deregistration mode for allocatable
components in derived type coarrays.
(gfc_deallocate_scalar_with_status): Likewise.
* trans.h (enum gfc_coarray_type): Renamed to gfc_coarray_regtype to
avoid collision with gfc_coarray_deregtype.
From-SVN: r243021
Diffstat (limited to 'gcc/fortran/trans.h')
-rw-r--r-- | gcc/fortran/trans.h | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 02a8a56..ae1f156 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -107,7 +107,7 @@ gfc_se; /* Denotes different types of coarray. Please keep in sync with libgfortran/caf/libcaf.h. */ -enum gfc_coarray_type +enum gfc_coarray_regtype { GFC_CAF_COARRAY_STATIC, GFC_CAF_COARRAY_ALLOC, @@ -115,7 +115,22 @@ enum gfc_coarray_type GFC_CAF_LOCK_ALLOC, GFC_CAF_CRITICAL, GFC_CAF_EVENT_STATIC, - GFC_CAF_EVENT_ALLOC + GFC_CAF_EVENT_ALLOC, + GFC_CAF_COARRAY_ALLOC_REGISTER_ONLY, + GFC_CAF_COARRAY_ALLOC_ALLOCATE_ONLY +}; + + +/* Describes the action to take on _caf_deregister. Keep in sync with + gcc/fortran/trans.h. The negative values are not valid for the library and + are used by the drivers for building the correct call. */ +enum gfc_coarray_deregtype { + /* This is no coarray, i.e. build a call to a free (). */ + GFC_CAF_COARRAY_NOCOARRAY = -2, + /* The driver is to analyze which _caf_deregister ()-call to generate. */ + GFC_CAF_COARRAY_ANALYZE = -1, + GFC_CAF_COARRAY_DEREGISTER = 0, + GFC_CAF_COARRAY_DEALLOCATE_ONLY }; @@ -140,6 +155,15 @@ enum gfc_caf_array_ref_t { GFC_CAF_ARR_REF_OPEN_START }; + +/* trans-array (structure_alloc_comps) caf_mode bits. */ +enum gfc_structure_caf_mode_t { + GFC_STRUCTURE_CAF_MODE_ENABLE_COARRAY = 1 << 0, + GFC_STRUCTURE_CAF_MODE_IN_COARRAY = 1 << 1, + GFC_STRUCTURE_CAF_MODE_DEALLOC_ONLY = 1 << 2 +}; + + /* The array-specific scalarization information. The array members of this struct are indexed by actual array index, and thus can be sparse. */ @@ -506,7 +530,8 @@ int gfc_conv_procedure_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *, void gfc_conv_subref_array_arg (gfc_se *, gfc_expr *, int, sym_intent, bool); /* Generate code for a scalar assignment. */ -tree gfc_trans_scalar_assign (gfc_se *, gfc_se *, gfc_typespec, bool, bool); +tree gfc_trans_scalar_assign (gfc_se *, gfc_se *, gfc_typespec, bool, bool, + bool c = false); /* Translate COMMON blocks. */ void gfc_trans_common (gfc_namespace *); @@ -681,6 +706,10 @@ tree gfc_call_malloc (stmtblock_t *, tree, tree); /* Build a memcpy call. */ tree gfc_build_memcpy_call (tree, tree, tree); +/* Register memory with the coarray library. */ +void gfc_allocate_using_caf_lib (stmtblock_t *, tree, tree, tree, tree, tree, + tree, gfc_coarray_regtype); + /* Allocate memory for allocatable variables, with optional status variable. */ void gfc_allocate_allocatable (stmtblock_t*, tree, tree, tree, tree, tree, tree, tree, gfc_expr*, int); @@ -690,14 +719,15 @@ void gfc_allocate_using_malloc (stmtblock_t *, tree, tree, tree); /* Generate code to deallocate an array. */ tree gfc_deallocate_with_status (tree, tree, tree, tree, tree, bool, - gfc_expr *, bool); -tree gfc_deallocate_scalar_with_status (tree, tree, bool, gfc_expr*, gfc_typespec); + gfc_expr *, int); +tree gfc_deallocate_scalar_with_status (tree, tree, tree, bool, gfc_expr*, + gfc_typespec, bool c = false); /* Generate code to call realloc(). */ tree gfc_call_realloc (stmtblock_t *, tree, tree); /* Assign a derived type constructor to a variable. */ -tree gfc_trans_structure_assign (tree, gfc_expr *, bool); +tree gfc_trans_structure_assign (tree, gfc_expr *, bool, bool c = false); /* Generate code for an assignment, includes scalarization. */ tree gfc_trans_assignment (gfc_expr *, gfc_expr *, bool, bool, bool p = false, @@ -808,7 +838,7 @@ extern GTY(()) tree gfor_fndecl_co_max; extern GTY(()) tree gfor_fndecl_co_min; extern GTY(()) tree gfor_fndecl_co_reduce; extern GTY(()) tree gfor_fndecl_co_sum; - +extern GTY(()) tree gfor_fndecl_caf_is_present; /* Math functions. Many other math functions are handled in trans-intrinsic.c. */ |