Hi, this patch contains basic fixup of the fnspec strings for caf, however I am quite sure I need help on this (short of dropping them all).
I first assumed that we have missing "." for return values since most strings had as many letters as parametrs, but it is not true. I tried to check the strings with reality. For example: void _gfortran_caf_co_sum (gfc_descriptor_t *a __attribute__ ((unused)), int result_image __attribute__ ((unused)), int *stat, char *errmsg __attribute__ ((unused)), size_t errmsg_len __attribute__ ((unused))) { if (stat) *stat = 0; } Should have fnspec ".XXWXX" First dot represents return value, then X is for unused parameters and W is for stat pointer we write into. However I am not sure why the pointers are part ofthe API, if they are meant to be used later, we need to specify them so things remain ABI compatible. It is declared as: get_identifier (PREFIX("caf_co_sum")), "W.WW", Which correclty specifies stat as W, but I am not sure what does the else. I would apprechiate help from someone who knows the API to correct the strings. Basicaly all strings starting with "W" or "R" are wrong since they miss the return value specifier. An alternative would be to simply drop all of those if we are unsure what they do, but it seems lame. Honza diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 2be9df40d2c..59ea891915e 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -3514,8 +3514,8 @@ gfc_build_intrinsic_function_decls (void) DECL_PURE_P (gfor_fndecl_si_kind) = 1; TREE_NOTHROW (gfor_fndecl_si_kind) = 1; - gfor_fndecl_sr_kind = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("selected_real_kind2008")), ".RR", + gfor_fndecl_sr_kind = gfc_build_library_function_decl ( + get_identifier (PREFIX("selected_real_kind2008")), gfc_int4_type_node, 3, pvoid_type_node, pvoid_type_node, pvoid_type_node); DECL_PURE_P (gfor_fndecl_sr_kind) = 1; @@ -3841,50 +3841,50 @@ gfc_build_builtin_function_decls (void) get_identifier (PREFIX("caf_num_images")), integer_type_node, 2, integer_type_node, integer_type_node); - gfor_fndecl_caf_register = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_register")), "RRWWWWR", void_type_node, 7, + gfor_fndecl_caf_register = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_register")), void_type_node, 7, size_type_node, integer_type_node, ppvoid_type_node, pvoid_type_node, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_deregister = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_deregister")), "WRWWR", void_type_node, 5, + get_identifier (PREFIX("caf_deregister")), ".W.WW.", void_type_node, 5, ppvoid_type_node, integer_type_node, pint_type, pchar_type_node, size_type_node); - gfor_fndecl_caf_get = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_get")), ".R.RRWRRRW", void_type_node, 10, + gfor_fndecl_caf_get = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_get")), void_type_node, 10, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node, pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node, boolean_type_node, pint_type); - gfor_fndecl_caf_send = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_send")), ".R.RRRRRRWR", void_type_node, 11, + gfor_fndecl_caf_send = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_send")), void_type_node, 11, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node, pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node, boolean_type_node, pint_type, pvoid_type_node); - gfor_fndecl_caf_sendget = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_sendget")), ".R.RRRR.RRRRRR", + gfor_fndecl_caf_sendget = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_sendget")), 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")), ".RWRRRRRWR", void_type_node, + gfor_fndecl_caf_get_by_ref = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_get_by_ref")), void_type_node, 10, 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, integer_type_node); - gfor_fndecl_caf_send_by_ref = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_send_by_ref")), ".RRRRRRRWR", + gfor_fndecl_caf_send_by_ref = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_send_by_ref")), void_type_node, 10, 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, integer_type_node); gfor_fndecl_caf_sendget_by_ref - = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_sendget_by_ref")), ".RR.RRRRRWWRR", + = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_sendget_by_ref")), void_type_node, 13, pvoid_type_node, integer_type_node, pvoid_type_node, pvoid_type_node, integer_type_node, pvoid_type_node, integer_type_node, integer_type_node, @@ -3900,7 +3900,7 @@ gfc_build_builtin_function_decls (void) 3, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_sync_images = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_sync_images")), "..RWW.", void_type_node, + get_identifier (PREFIX("caf_sync_images")), "..RRW.", void_type_node, 5, integer_type_node, pint_type, pint_type, pchar_type_node, size_type_node); @@ -3929,49 +3929,49 @@ gfc_build_builtin_function_decls (void) TREE_THIS_VOLATILE (gfor_fndecl_caf_stop_str) = 1; gfor_fndecl_caf_atomic_def = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_atomic_define")), "R..RW", + get_identifier (PREFIX("caf_atomic_define")), ".R..RW..", void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node, pint_type, integer_type_node, integer_type_node); gfor_fndecl_caf_atomic_ref = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_atomic_ref")), "R..WW", + get_identifier (PREFIX("caf_atomic_ref")), ".R..WW..", void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node, pint_type, integer_type_node, integer_type_node); gfor_fndecl_caf_atomic_cas = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_atomic_cas")), "R..WRRW", + get_identifier (PREFIX("caf_atomic_cas")), ".R..WRRW..", void_type_node, 9, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node, pvoid_type_node, pvoid_type_node, pint_type, integer_type_node, integer_type_node); gfor_fndecl_caf_atomic_op = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_atomic_op")), ".R..RWW", + get_identifier (PREFIX("caf_atomic_op")), "..R..RWW..", void_type_node, 9, integer_type_node, pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node, pvoid_type_node, pint_type, integer_type_node, integer_type_node); gfor_fndecl_caf_lock = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_lock")), "R..WWW", + get_identifier (PREFIX("caf_lock")), ".R..WWW.", void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node, pint_type, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_unlock = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_unlock")), "R..WW", + get_identifier (PREFIX("caf_unlock")), ".R..WW.", void_type_node, 6, pvoid_type_node, size_type_node, integer_type_node, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_event_post = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_event_post")), "R..WW", + get_identifier (PREFIX("caf_event_post")), ".R..WW.", void_type_node, 6, pvoid_type_node, size_type_node, integer_type_node, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_event_wait = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_event_wait")), "R..WW", + get_identifier (PREFIX("caf_event_wait")), ".R..WW.", void_type_node, 6, pvoid_type_node, size_type_node, integer_type_node, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_event_query = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_event_query")), "R..WW", + get_identifier (PREFIX("caf_event_query")), ".R..WW", void_type_node, 5, pvoid_type_node, size_type_node, integer_type_node, pint_type, pint_type); @@ -3982,19 +3982,19 @@ gfc_build_builtin_function_decls (void) gfor_fndecl_caf_failed_images = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_failed_images")), "WRR", + get_identifier (PREFIX("caf_failed_images")), ".WR.", void_type_node, 3, pvoid_type_node, ppvoid_type_node, integer_type_node); gfor_fndecl_caf_form_team = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_form_team")), "RWR", + get_identifier (PREFIX("caf_form_team")), ".RW.", void_type_node, 3, integer_type_node, ppvoid_type_node, integer_type_node); gfor_fndecl_caf_change_team = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_change_team")), "RR", + get_identifier (PREFIX("caf_change_team")), ".R.", void_type_node, 2, ppvoid_type_node, integer_type_node); @@ -4009,43 +4009,43 @@ gfc_build_builtin_function_decls (void) gfor_fndecl_caf_sync_team = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_sync_team")), "RR", + get_identifier (PREFIX("caf_sync_team")), ".R.", void_type_node, 2, ppvoid_type_node, integer_type_node); gfor_fndecl_caf_team_number - = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_team_number")), "R", - integer_type_node, 1, integer_type_node); + = gfc_build_library_function_decl ( + get_identifier (PREFIX("caf_team_number")), + integer_type_node, 1, integer_type_node); gfor_fndecl_caf_image_status = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_image_status")), "RR", + get_identifier (PREFIX("caf_image_status")), "..R", integer_type_node, 2, integer_type_node, ppvoid_type_node); gfor_fndecl_caf_stopped_images = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_stopped_images")), "WRR", + get_identifier (PREFIX("caf_stopped_images")), ".WR.", void_type_node, 3, pvoid_type_node, ppvoid_type_node, integer_type_node); gfor_fndecl_co_broadcast = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_co_broadcast")), "W.WW", + get_identifier (PREFIX("caf_co_broadcast")), ".W.WW.", void_type_node, 5, pvoid_type_node, integer_type_node, pint_type, pchar_type_node, size_type_node); gfor_fndecl_co_max = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_co_max")), "W.WW", + get_identifier (PREFIX("caf_co_max")), ".W.WW..", void_type_node, 6, pvoid_type_node, integer_type_node, pint_type, pchar_type_node, integer_type_node, size_type_node); gfor_fndecl_co_min = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_co_min")), "W.WW", + get_identifier (PREFIX("caf_co_min")), ".W.WW..", void_type_node, 6, pvoid_type_node, integer_type_node, pint_type, pchar_type_node, integer_type_node, size_type_node); gfor_fndecl_co_reduce = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_co_reduce")), "W.R.WW", + get_identifier (PREFIX("caf_co_reduce")), ".W.R.WW..", void_type_node, 8, pvoid_type_node, build_pointer_type (build_varargs_function_type_list (void_type_node, NULL_TREE)), @@ -4053,12 +4053,12 @@ gfc_build_builtin_function_decls (void) integer_type_node, size_type_node); gfor_fndecl_co_sum = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_co_sum")), "W.WW", + get_identifier (PREFIX("caf_co_sum")), ".W.WW.", void_type_node, 5, pvoid_type_node, integer_type_node, pint_type, pchar_type_node, size_type_node); gfor_fndecl_caf_is_present = gfc_build_library_function_decl_with_spec ( - get_identifier (PREFIX("caf_is_present")), "RRR", + get_identifier (PREFIX("caf_is_present")), ".R.R", integer_type_node, 3, pvoid_type_node, integer_type_node, pvoid_type_node); }