diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4112e1e73653..4cee10604390 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2016-03-28 Alessandro Fanfarillo + + Backport from trunk. + * trans-decl.c (gfc_build_builtin_function_decls): + caf_stop_numeric and caf_stop_str definition. + * trans-stmt.c (gfc_trans_stop): invoke external functions + for stop and stop_str when coarrays are used. + * trans.h: extern for new functions. + 2016-03-09 Paul Thomas Backport from trunk. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index e046a5e8d5cd..fb44fa1177f4 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -155,6 +155,8 @@ tree gfor_fndecl_caf_sendget; tree gfor_fndecl_caf_sync_all; tree gfor_fndecl_caf_sync_memory; tree gfor_fndecl_caf_sync_images; +tree gfor_fndecl_caf_stop_str; +tree gfor_fndecl_caf_stop_numeric; tree gfor_fndecl_caf_error_stop; tree gfor_fndecl_caf_error_stop_str; tree gfor_fndecl_caf_atomic_def; @@ -3491,6 +3493,18 @@ gfc_build_builtin_function_decls (void) /* CAF's ERROR STOP doesn't return. */ TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str) = 1; + gfor_fndecl_caf_stop_numeric = gfc_build_library_function_decl_with_spec ( + get_identifier (PREFIX("caf_stop_numeric")), ".R.", + void_type_node, 1, gfc_int4_type_node); + /* CAF's STOP doesn't return. */ + TREE_THIS_VOLATILE (gfor_fndecl_caf_stop_numeric) = 1; + + gfor_fndecl_caf_stop_str = gfc_build_library_function_decl_with_spec ( + get_identifier (PREFIX("caf_stop_str")), ".R.", + void_type_node, 2, pchar_type_node, gfc_int4_type_node); + /* CAF's STOP doesn't return. */ + 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", void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node, diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 7414c0d23385..b33bad785842 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -647,7 +647,9 @@ gfc_trans_stop (gfc_code *code, bool error_stop) ? (flag_coarray == GFC_FCOARRAY_LIB ? gfor_fndecl_caf_error_stop_str : gfor_fndecl_error_stop_string) - : gfor_fndecl_stop_string, + : (flag_coarray == GFC_FCOARRAY_LIB + ? gfor_fndecl_caf_stop_str + : gfor_fndecl_stop_string), 2, build_int_cst (pchar_type_node, 0), tmp); } else if (code->expr1->ts.type == BT_INTEGER) @@ -658,7 +660,9 @@ gfc_trans_stop (gfc_code *code, bool error_stop) ? (flag_coarray == GFC_FCOARRAY_LIB ? gfor_fndecl_caf_error_stop : gfor_fndecl_error_stop_numeric) - : gfor_fndecl_stop_numeric_f08, 1, + : (flag_coarray == GFC_FCOARRAY_LIB + ? gfor_fndecl_caf_stop_numeric + : gfor_fndecl_stop_numeric_f08), 1, fold_convert (gfc_int4_type_node, se.expr)); } else @@ -669,7 +673,9 @@ gfc_trans_stop (gfc_code *code, bool error_stop) ? (flag_coarray == GFC_FCOARRAY_LIB ? gfor_fndecl_caf_error_stop_str : gfor_fndecl_error_stop_string) - : gfor_fndecl_stop_string, + : (flag_coarray == GFC_FCOARRAY_LIB + ? gfor_fndecl_caf_stop_str + : gfor_fndecl_stop_string), 2, se.expr, se.string_length); } diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index e6544f91878c..00a134b4a4f6 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -750,6 +750,8 @@ extern GTY(()) tree gfor_fndecl_caf_sendget; extern GTY(()) tree gfor_fndecl_caf_sync_all; extern GTY(()) tree gfor_fndecl_caf_sync_memory; extern GTY(()) tree gfor_fndecl_caf_sync_images; +extern GTY(()) tree gfor_fndecl_caf_stop_numeric; +extern GTY(()) tree gfor_fndecl_caf_stop_str; extern GTY(()) tree gfor_fndecl_caf_error_stop; extern GTY(()) tree gfor_fndecl_caf_error_stop_str; extern GTY(()) tree gfor_fndecl_caf_atomic_def; diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index f53de385ea1f..49a1401d8508 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2016-03-28 Alessandro Fanfarillo + + Backport from trunk. + * caf/libcaf.h: caf_stop_numeric and caf_stop_str prototype. + * caf/single.c: _gfortran_caf_stop_numeric and + _gfortran_caf_stop_str implementation. + 2016-02-17 Jerry DeLisle PR libgfortran/69651 @@ -18,7 +25,7 @@ (read_character): Remove condition testing c = '!' which is now inside the is_separator macro. Remove code related to DELIM_NONE. (parse_real): Reject '!' unless in namelist mode. (read_complex): Reject - '!' unless in namelist mode. (read_real): Likewise reject '!'. + '!' unless in namelist mode. (read_real): Likewise reject '!'. 2015-12-29 Jerry DeLisle diff --git a/libgfortran/caf/libcaf.h b/libgfortran/caf/libcaf.h index ebda579d06cb..ef86dd367e43 100644 --- a/libgfortran/caf/libcaf.h +++ b/libgfortran/caf/libcaf.h @@ -105,6 +105,10 @@ void _gfortran_caf_sync_all (int *, char *, int); void _gfortran_caf_sync_memory (int *, char *, int); void _gfortran_caf_sync_images (int, int[], int *, char *, int); +void _gfortran_caf_stop_numeric (int32_t) + __attribute__ ((noreturn)); +void _gfortran_caf_stop_str (const char *, int32_t) + __attribute__ ((noreturn)); void _gfortran_caf_error_stop_str (const char *, int32_t) __attribute__ ((noreturn)); void _gfortran_caf_error_stop (int32_t) __attribute__ ((noreturn)); diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c index 9c4b3434f5c2..e95b798902a9 100644 --- a/libgfortran/caf/single.c +++ b/libgfortran/caf/single.c @@ -204,6 +204,23 @@ _gfortran_caf_sync_images (int count __attribute__ ((unused)), *stat = 0; } +void +_gfortran_caf_stop_numeric(int32_t stop_code) +{ + fprintf (stderr, "STOP %d\n", stop_code); + exit (0); +} + +void +_gfortran_caf_stop_str(const char *string, int32_t len) +{ + fputs ("STOP ", stderr); + while (len--) + fputc (*(string++), stderr); + fputs ("\n", stderr); + + exit (0); +} void _gfortran_caf_error_stop_str (const char *string, int32_t len)