diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-09-19 15:45:40 +0200 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2016-09-19 15:45:40 +0200 |
commit | 3c9f5092c6d30a459e06b7db3f0796a1175e2ecc (patch) | |
tree | 9a8705f914f9ecf3d0ee2ae64c50f68a5472a893 /gcc/fortran/trans.c | |
parent | e79e6763c68224a1b0d272d32697702faee7e427 (diff) | |
download | gcc-3c9f5092c6d30a459e06b7db3f0796a1175e2ecc.zip gcc-3c9f5092c6d30a459e06b7db3f0796a1175e2ecc.tar.gz gcc-3c9f5092c6d30a459e06b7db3f0796a1175e2ecc.tar.bz2 |
libcaf.h: Add caf_reference_type.
libgfortran/ChangeLog:
2016-09-19 Andre Vehreschild <vehre@gcc.gnu.org>
* caf/libcaf.h: Add caf_reference_type.
* caf/mpi.c: Adapted signature of caf_register().
* caf/single.c (struct caf_single_token): Added to keep the pointer
to the memory registered and array descriptor.
(caf_internal_error): Added convenience interface.
(_gfortran_caf_register): Adapted to work with caf_single_token and
return memory in the array descriptor.
(_gfortran_caf_deregister): Same.
(assign_char1_from_char4): Fixed style.
(convert_type): Fixed incorrect conversion.
(_gfortran_caf_get): Adapted to work with caf_single_token.
(_gfortran_caf_send): Same.
(_gfortran_caf_sendget): Same.
(copy_data): Added to stop repeating it in all _by_ref functions.
(get_for_ref): Recursive getting of coarray data using a chain of
references.
(_gfortran_caf_get_by_ref): Driver for computing the memory needed for
the get and checking properties of the operation.
(send_by_ref): Same as get_for_ref but for sending data.
(_gfortran_caf_send_by_ref): Same like caf_get_by_ref but for sending.
(_gfortran_caf_sendget_by_ref): Uses get_by_ref and send_by_ref to
implement sendget for reference chains.
(_gfortran_caf_atomic_define): Adapted to work with caf_single_token.
(_gfortran_caf_atomic_ref): Likewise.
(_gfortran_caf_atomic_cas): Likewise.
(_gfortran_caf_atomic_op): Likewise.
(_gfortran_caf_event_post): Likewise.
(_gfortran_caf_event_wait): Likewise.
(_gfortran_caf_event_query): Likewise.
(_gfortran_caf_lock): Likewise.
(_gfortran_caf_unlock): Likewise.
gcc/testsuite/ChangeLog:
2016-09-19 Andre Vehreschild <vehre@gcc.gnu.org>
* gfortran.dg/coarray/alloc_comp_4.f90: New test.
* gfortran.dg/coarray_38.f90:
* gfortran.dg/coarray_alloc_comp_1.f08: New test.
* gfortran.dg/coarray_alloc_comp_2.f08: New test.
* gfortran.dg/coarray_allocate_7.f08: New test.
* gfortran.dg/coarray_allocate_8.f08: New test.
* gfortran.dg/coarray_allocate_9.f08: New test.
* gfortran.dg/coarray_lib_alloc_1.f90: Adapted scan-tree-dumps to expect
new caf_register.
* gfortran.dg/coarray_lib_alloc_2.f90: Same.
* gfortran.dg/coarray_lib_alloc_3.f90: Same.
* gfortran.dg/coarray_lib_comm_1.f90: Adapted scan-tree-dumps to expect
get_by_refs.
* gfortran.dg/coarray_lib_token_3.f90: Same as for coarray_lib_alloc2.
* gfortran.dg/coarray_lock_7.f90: Same.
* gfortran.dg/coarray_poly_5.f90: Same.
* gfortran.dg/coarray_poly_6.f90: Same.
* gfortran.dg/coarray_poly_7.f90: Same.
* gfortran.dg/coarray_poly_8.f90: Same.
* gfortran.dg/coindexed_1.f90: Changed errors expected.
gcc/fortran/ChangeLog:
2016-09-19 Andre Vehreschild <vehre@gcc.gnu.org>
* expr.c (gfc_check_assign): Added flag to control whether datatype
conversion is allowed.
* gfortran.h: Added caf-token-tree to gfc_component. Changed
prototypes mostly to add whether datatype conversion is allowed.
* gfortran.texi: Added documentation for the caf_reference_t and the
caf_*_by_ref function.
* primary.c (caf_variable_attr): Similar to gfc_variable_attr but
focused on the needs of coarrays.
(gfc_caf_attr): Same.
* resolve.c (resolve_ordinary_assign): Set the conversion allowed
flag when not in a coarray.
* trans-array.c (gfc_array_init_size): Moved setting of array
descriptor's datatype before the alloc, because caf_register needs it.
(gfc_array_allocate): Changed notion of whether an array is a coarray.
(gfc_array_deallocate): Same.
(gfc_alloc_allocatable_for_assignment): Added setting of coarray's
array descriptor datatype before the register. And using deregister/
register to mimmick a realloc for coarrays.
* trans-decl.c (gfc_build_builtin_function_decls): Corrected signatures
of old caf-functions and added signature definitions of the _by_ref
ones.
(generate_coarray_sym_init): Adapted to new caf_register signature.
* trans-expr.c (gfc_conv_scalar_to_descriptor): Make sure a constant
is translated to an lvalue expression before use in an array
descriptor.
(gfc_get_ultimate_alloc_ptr_comps_caf_token): New function. Get the
last allocatable component's coarray token.
(gfc_get_tree_for_caf_expr): For top-level object get the coarray
token and check for unsupported features.
(gfc_get_caf_token_offset): Getting the offset might procude new
statements, which now are stored in the pre and post of the current se.
(gfc_caf_get_image_index): For this image return a call to
caf_this_image.
(expr_may_alias_variables): Check that the result is set for testing
its properties.
(alloc_scalar_allocatable_for_assignment): Added auto allocation of
coarray components.
(gfc_trans_assignment_1): Rewrite an assign to a coarray object to
be a sendget.
* trans-intrinsic.c (conv_caf_vector_subscript_elem): Corrected
wrong comment.
(compute_component_offset): Compute the correct offset a structure
member.
(conv_expr_ref_to_caf_ref): Convert to a chain of refs into
caf_references.
(gfc_conv_intrinsic_caf_get): Call caf_get_by_ref instead of caf_get.
(conv_caf_send): Call caf_*_by_ref for coarrays that need
reallocation.
(gfc_conv_intrinsic_function): Adapted to new signuature of the caf
drivers.
(conv_intrinsic_atomic_op): Add pre and post statements correctly.
(conv_intrinsic_atomic_ref): Same.
(conv_intrinsic_atomic_cas): Same.
(conv_intrinsic_event_query): Same.
* trans-stmt.c (gfc_trans_lock_unlock): Same.
(gfc_trans_event_post_wait): Same.
(gfc_trans_allocate): Support allocation of allocatable coarrays.
(gfc_trans_deallocate): And there deallocation.
* trans-types.c (gfc_typenode_for_spec): Added flag to control whether
a component is part of coarray. When so, then add space to store a
coarray token.
(gfc_build_array_type): Same.
(gfc_get_array_descriptor_base): Same.
(gfc_get_array_type_bounds): Same.
(gfc_sym_type): Same.
(gfc_get_derived_type): Same.
(gfc_get_caf_reference_type): Declare the caf_reference_type.
* trans-types.h: Prototype changes only.
* trans.c (gfc_allocate_using_lib): Use the updated caf_register
signature.
(gfc_allocate_allocatable): Same.
(gfc_deallocate_with_status): Same.
* trans.h: Defined the runtime types for caf_reference_t and the enums.
From-SVN: r240231
Diffstat (limited to 'gcc/fortran/trans.c')
-rw-r--r-- | gcc/fortran/trans.c | 60 |
1 files changed, 46 insertions, 14 deletions
diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index 28d1341..9210e0f 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -734,7 +734,7 @@ gfc_allocate_using_lib (stmtblock_t * block, tree pointer, tree size, size = fold_convert (size_type_node, size); tmp = build_call_expr_loc (input_location, - gfor_fndecl_caf_register, 6, + gfor_fndecl_caf_register, 7, fold_build2_loc (input_location, MAX_EXPR, size_type_node, size, build_int_cst (size_type_node, 1)), @@ -742,11 +742,9 @@ gfc_allocate_using_lib (stmtblock_t * block, tree pointer, tree size, lock_var ? GFC_CAF_LOCK_ALLOC : event_var ? GFC_CAF_EVENT_ALLOC : GFC_CAF_COARRAY_ALLOC), - token, pstat, errmsg, errlen); + token, gfc_build_addr_expr (pvoid_type_node, pointer), + pstat, errmsg, errlen); - tmp = fold_build2_loc (input_location, MODIFY_EXPR, - TREE_TYPE (pointer), pointer, - fold_convert ( TREE_TYPE (pointer), tmp)); gfc_add_expr_to_block (block, tmp); /* It guarantees memory consistency within the same segment */ @@ -782,13 +780,15 @@ gfc_allocate_using_lib (stmtblock_t * block, tree pointer, tree size, expr must be set to the original expression being allocated for its locus and variable name in case a runtime error has to be printed. */ void -gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, - tree status, tree errmsg, tree errlen, tree label_finish, - gfc_expr* expr) +gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, + tree token, tree status, tree errmsg, tree errlen, + tree label_finish, gfc_expr* expr, int corank) { stmtblock_t alloc_block; tree tmp, null_mem, alloc, error; tree type = TREE_TYPE (mem); + symbol_attribute caf_attr; + bool need_assign = false; size = fold_convert (size_type_node, size); null_mem = gfc_unlikely (fold_build2_loc (input_location, NE_EXPR, @@ -800,8 +800,11 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, gfc_allocate_using_lib. */ gfc_start_block (&alloc_block); + if (flag_coarray == GFC_FCOARRAY_LIB) + caf_attr = gfc_caf_attr (expr, true); + if (flag_coarray == GFC_FCOARRAY_LIB - && gfc_expr_attr (expr).codimension) + && (corank > 0 || caf_attr.codimension)) { tree cond; bool lock_var = expr->ts.type == BT_DERIVED @@ -814,6 +817,33 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, == INTMOD_ISO_FORTRAN_ENV && expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE; + gfc_se se; + gfc_init_se (&se, NULL); + + tree sub_caf_tree = gfc_get_ultimate_alloc_ptr_comps_caf_token (&se, + expr); + if (sub_caf_tree == NULL_TREE) + sub_caf_tree = token; + + /* When mem is an array ref, then strip the .data-ref. */ + if (TREE_CODE (mem) == COMPONENT_REF + && !(GFC_ARRAY_TYPE_P (TREE_TYPE (mem)))) + tmp = TREE_OPERAND (mem, 0); + else + tmp = mem; + + if (!(GFC_ARRAY_TYPE_P (TREE_TYPE (tmp)) + && TYPE_LANG_SPECIFIC (TREE_TYPE (tmp))->corank == 0) + && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp))) + { + symbol_attribute attr; + + gfc_clear_attr (&attr); + tmp = gfc_conv_scalar_to_descriptor (&se, mem, attr); + need_assign = true; + } + gfc_add_block_to_block (&alloc_block, &se.pre); + /* In the front end, we represent the lock variable as pointer. However, the FE only passes the pointer around and leaves the actual representation to the library. Hence, we have to convert back to the @@ -822,9 +852,11 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, size = fold_build2_loc (input_location, TRUNC_DIV_EXPR, size_type_node, size, TYPE_SIZE_UNIT (ptr_type_node)); - gfc_allocate_using_lib (&alloc_block, mem, size, token, status, - errmsg, errlen, lock_var, event_var); - + gfc_allocate_using_lib (&alloc_block, tmp, size, sub_caf_tree, + status, errmsg, errlen, lock_var, event_var); + if (need_assign) + gfc_add_modify (&alloc_block, mem, fold_convert (TREE_TYPE (mem), + gfc_conv_descriptor_data_get (tmp))); if (status != NULL_TREE) { TREE_USED (label_finish) = 1; @@ -1362,8 +1394,8 @@ gfc_deallocate_with_status (tree pointer, tree status, tree errmsg, token = gfc_build_addr_expr (NULL_TREE, token); tmp = build_call_expr_loc (input_location, - gfor_fndecl_caf_deregister, 4, - token, pstat, errmsg, errlen); + gfor_fndecl_caf_deregister, 4, + token, pstat, errmsg, errlen); gfc_add_expr_to_block (&non_null, tmp); /* It guarantees memory consistency within the same segment */ |