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);
}