diff options
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 59 |
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) |