https://gcc.gnu.org/g:a25cc26884663244c3b936af785854abee8949dd
commit r15-6383-ga25cc26884663244c3b936af785854abee8949dd Author: Andre Vehreschild <ve...@gcc.gnu.org> Date: Wed Dec 18 12:43:39 2024 +0100 Fortran: Fix caf_stop_numeric and reporting exceptions from caf [PR57598] Caf_stop_numeric always exited with code 0, which is wrong. It shall behave like regular stop. Add reporting exceptions to caf's stop handlers. For this the existing library routine had to be exported. libgfortran/ChangeLog: PR fortran/57598 * caf/single.c (_gfortran_caf_stop_numeric): Report exceptions on stop. And fix send_by_ref. (_gfortran_caf_stop_str): Same. (_gfortran_caf_error_stop_str): Same. (_gfortran_caf_error_stop): Same. * gfortran.map: Add report_exception for export. * libgfortran.h (report_exception): Add to internal export. * runtime/stop.c (report_exception): Same. Diff: --- libgfortran/caf/single.c | 19 +++++++++++++++---- libgfortran/gfortran.map | 1 + libgfortran/libgfortran.h | 3 +++ libgfortran/runtime/stop.c | 7 +++++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c index 41da970e8308..0ffbffa1d2ba 100644 --- a/libgfortran/caf/single.c +++ b/libgfortran/caf/single.c @@ -263,13 +263,17 @@ _gfortran_caf_sync_images (int count __attribute__ ((unused)), *stat = 0; } +extern void _gfortran_report_exception (void); void _gfortran_caf_stop_numeric(int stop_code, bool quiet) { if (!quiet) - fprintf (stderr, "STOP %d\n", stop_code); - exit (0); + { + _gfortran_report_exception (); + fprintf (stderr, "STOP %d\n", stop_code); + } + exit (stop_code); } @@ -278,6 +282,7 @@ _gfortran_caf_stop_str(const char *string, size_t len, bool quiet) { if (!quiet) { + _gfortran_report_exception (); fputs ("STOP ", stderr); while (len--) fputc (*(string++), stderr); @@ -292,6 +297,7 @@ _gfortran_caf_error_stop_str (const char *string, size_t len, bool quiet) { if (!quiet) { + _gfortran_report_exception (); fputs ("ERROR STOP ", stderr); while (len--) fputc (*(string++), stderr); @@ -373,7 +379,10 @@ void _gfortran_caf_error_stop (int error, bool quiet) { if (!quiet) - fprintf (stderr, "ERROR STOP %d\n", error); + { + _gfortran_report_exception (); + fprintf (stderr, "ERROR STOP %d\n", error); + } exit (error); } @@ -2131,14 +2140,16 @@ send_by_ref (caf_reference_t *ref, size_t *i, size_t *src_index, /* Assume that the rank and the dimensions fit for copying src to dst. */ GFC_DESCRIPTOR_DTYPE (dst) = GFC_DESCRIPTOR_DTYPE (src); + GFC_DESCRIPTOR_SPAN (dst) = GFC_DESCRIPTOR_SPAN (src); stride_dst = 1; + dst->offset = 0; for (size_t d = 0; d < src_rank; ++d) { extent_dst = GFC_DIMENSION_EXTENT (src->dim[d]); GFC_DIMENSION_LBOUND (dst->dim[d]) = 1; GFC_DIMENSION_UBOUND (dst->dim[d]) = extent_dst; GFC_DIMENSION_STRIDE (dst->dim[d]) = stride_dst; - dst->offset = -extent_dst; + dst->offset -= stride_dst; stride_dst *= extent_dst; } /* Null the data-pointer to make register_component allocate diff --git a/libgfortran/gfortran.map b/libgfortran/gfortran.map index f58edc52e3c2..851df211eeee 100644 --- a/libgfortran/gfortran.map +++ b/libgfortran/gfortran.map @@ -1997,4 +1997,5 @@ GFORTRAN_15 { _gfortran_sminloc1_8_m2; _gfortran_sminloc1_8_m4; _gfortran_sminloc1_8_m8; + _gfortran_report_exception; } GFORTRAN_14; diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index aaa9222c43b6..cf3dda07d3d1 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -986,6 +986,9 @@ internal_proto(filename_from_unit); /* stop.c */ +extern void report_exception (void); +iexport_proto (report_exception); + extern _Noreturn void stop_string (const char *, size_t, bool); export_proto(stop_string); diff --git a/libgfortran/runtime/stop.c b/libgfortran/runtime/stop.c index 2eefe21a9e90..3ac5beff6bba 100644 --- a/libgfortran/runtime/stop.c +++ b/libgfortran/runtime/stop.c @@ -38,7 +38,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see inexact - and we optionally ignore underflow, cf. thread starting at http://mailman.j3-fortran.org/pipermail/j3/2013-June/006452.html. */ -static void +extern void report_exception (void); +iexport_proto (report_exception); + +void report_exception (void) { struct iovec iov[8]; @@ -108,7 +111,7 @@ report_exception (void) estr_writev (iov, iovcnt); } - +iexport (report_exception); /* A numeric STOP statement. */