aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-decl.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r--gcc/fortran/trans-decl.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 5bae8ca..1bab5d5 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -135,6 +135,9 @@ tree gfor_fndecl_caf_deregister;
tree gfor_fndecl_caf_get;
tree gfor_fndecl_caf_send;
tree gfor_fndecl_caf_sendget;
+tree gfor_fndecl_caf_get_by_ref;
+tree gfor_fndecl_caf_send_by_ref;
+tree gfor_fndecl_caf_sendget_by_ref;
tree gfor_fndecl_caf_sync_all;
tree gfor_fndecl_caf_sync_memory;
tree gfor_fndecl_caf_sync_images;
@@ -3560,12 +3563,12 @@ gfc_build_builtin_function_decls (void)
2, integer_type_node, integer_type_node);
gfor_fndecl_caf_register = gfc_build_library_function_decl_with_spec (
- get_identifier (PREFIX("caf_register")), "...WWW", pvoid_type_node, 6,
- size_type_node, integer_type_node, ppvoid_type_node, pint_type,
- pchar_type_node, integer_type_node);
+ get_identifier (PREFIX("caf_register")), "RRWWWWR", void_type_node, 7,
+ size_type_node, integer_type_node, ppvoid_type_node, pvoid_type_node,
+ pint_type, pchar_type_node, integer_type_node);
gfor_fndecl_caf_deregister = gfc_build_library_function_decl_with_spec (
- get_identifier (PREFIX("caf_deregister")), ".WWW", void_type_node, 4,
+ get_identifier (PREFIX("caf_deregister")), "WWWR", void_type_node, 4,
ppvoid_type_node, pint_type, pchar_type_node, integer_type_node);
gfor_fndecl_caf_get = gfc_build_library_function_decl_with_spec (
@@ -3581,11 +3584,31 @@ gfc_build_builtin_function_decls (void)
boolean_type_node, pint_type);
gfor_fndecl_caf_sendget = gfc_build_library_function_decl_with_spec (
- get_identifier (PREFIX("caf_sendget")), ".R.RRRR.RRR", void_type_node,
- 13, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node,
- pvoid_type_node, pvoid_type_node, size_type_node, integer_type_node,
- pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node,
- boolean_type_node);
+ get_identifier (PREFIX("caf_sendget")), ".R.RRRR.RRRRRR",
+ void_type_node, 14, pvoid_type_node, size_type_node, integer_type_node,
+ pvoid_type_node, pvoid_type_node, pvoid_type_node, size_type_node,
+ integer_type_node, pvoid_type_node, pvoid_type_node, integer_type_node,
+ integer_type_node, boolean_type_node, integer_type_node);
+
+ gfor_fndecl_caf_get_by_ref = gfc_build_library_function_decl_with_spec (
+ get_identifier (PREFIX("caf_get_by_ref")), ".RWRRRRRW", void_type_node,
+ 9, pvoid_type_node, integer_type_node, pvoid_type_node, pvoid_type_node,
+ integer_type_node, integer_type_node, boolean_type_node,
+ boolean_type_node, pint_type);
+
+ gfor_fndecl_caf_send_by_ref = gfc_build_library_function_decl_with_spec (
+ get_identifier (PREFIX("caf_send_by_ref")), ".RRRRRRRW", void_type_node,
+ 9, pvoid_type_node, integer_type_node, pvoid_type_node, pvoid_type_node,
+ integer_type_node, integer_type_node, boolean_type_node,
+ boolean_type_node, pint_type);
+
+ gfor_fndecl_caf_sendget_by_ref
+ = gfc_build_library_function_decl_with_spec (
+ get_identifier (PREFIX("caf_sendget_by_ref")), ".RR.RRRRRWW",
+ void_type_node, 11, pvoid_type_node, integer_type_node,
+ pvoid_type_node, pvoid_type_node, integer_type_node,
+ pvoid_type_node, integer_type_node, integer_type_node,
+ boolean_type_node, pint_type, pint_type);
gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
get_identifier (PREFIX("caf_sync_all")), ".WW", void_type_node,
@@ -5002,9 +5025,11 @@ gfc_emit_parameter_debug_info (gfc_symbol *sym)
static void
generate_coarray_sym_init (gfc_symbol *sym)
{
- tree tmp, size, decl, token;
+ tree tmp, size, decl, token, desc;
bool is_lock_type, is_event_type;
int reg_type;
+ gfc_se se;
+ symbol_attribute attr;
if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
|| sym->attr.use_assoc || !sym->attr.referenced
@@ -5055,12 +5080,20 @@ generate_coarray_sym_init (gfc_symbol *sym)
reg_type = GFC_CAF_EVENT_STATIC;
else
reg_type = GFC_CAF_COARRAY_STATIC;
- tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 6, size,
+
+ gfc_init_se (&se, NULL);
+ desc = gfc_conv_scalar_to_descriptor (&se, decl, attr);
+ gfc_add_block_to_block (&caf_init_block, &se.pre);
+
+ tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 7, size,
build_int_cst (integer_type_node, reg_type),
- token, null_pointer_node, /* token, stat. */
+ token, gfc_build_addr_expr (pvoid_type_node, desc),
+ null_pointer_node, /* stat. */
null_pointer_node, /* errgmsg, errmsg_len. */
build_int_cst (integer_type_node, 0));
- gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl), tmp));
+ gfc_add_expr_to_block (&caf_init_block, tmp);
+ gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl),
+ gfc_conv_descriptor_data_get (desc)));
/* Handle "static" initializer. */
if (sym->value)