public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
From: Thomas Schwinge <thomas@codesourcery.com>
To: "Thomas König" <tk@tkoenig.net>,
	"fortran@gcc.gnu.org" <fortran@gcc.gnu.org>,
	gcc-patches <gcc-patches@gcc.gnu.org>
Cc: <vries@gcc.gnu.org>
Subject: PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process' (was: [patch, libfortran, committed] Implement stop_numeric for minimal targets)
Date: Thu, 19 Apr 2018 09:06:00 -0000	[thread overview]
Message-ID: <87in8nsgz9.fsf@euler.schwinge.homeip.net> (raw)
In-Reply-To: <751060e1-67cb-d290-4fd1-46b15b77fc1a@tkoenig.net>

Hi!

On Wed, 4 Apr 2018 11:30:34 +0200, Thomas König <tk@tkoenig.net> wrote:
> the recent patch to make the gfortran and libgomp testsuites more
> standard conforming, by replacing CALL ABORT() with STOP N, led
> to numerous testsuite failures on nvptx because stop_numeric
> was not implemented in minimal.c.
> 
> I have committed the patch below in r259072 as obvious after Tom
> de Vries had confirmed that it solves the problem.

... for some meaning of "solves the problem"; see below.  ;-) Which you
couldn't know, of course.  (So, definitely thanks anyway, for promptly
addressing the issue raised!)

> --- runtime/minimal.c	(Revision 259055)
> +++ runtime/minimal.c	(Arbeitskopie)

> +void
> +stop_numeric (int code, bool quiet)
> +{
> +  if (!quiet)
> +    printf ("STOP %d\n", code);
> +
> +  exit (code);
> +}

Per PR85463 '[nvptx] "exit" in offloaded region doesn't terminate
process' that I just filed, we currently have to use "abort" instead of
"exit" for nvptx offloading, so I have applied the following in trunk
r259491, where I completed this by adding and testing stop_string,
error_stop_string, and error_stop_numeric functions, too.

commit 6bc09e4fa2e5e59dee18f1c03f2d6529b9b0045b
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Thu Apr 19 08:53:38 2018 +0000

    PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process'
    
            libgomp/
            PR libfortran/85166
            * testsuite/libgomp.oacc-fortran/abort-1.f90: Switch back to "call
            abort".
            * testsuite/libgomp.oacc-fortran/abort-2.f90: Likewise.
    
            libgfortran/
            PR libfortran/85166
            PR libgomp/85463
            * runtime/minimal.c (stop_numeric): Reimplement.
            (stop_string, error_stop_string, error_stop_numeric): New
            functions.
            libgomp/
            PR libgomp/85463
            * testsuite/libgomp.oacc-fortran/error_stop-1.f: New file.
            * testsuite/libgomp.oacc-fortran/error_stop-2.f: Likewise.
            * testsuite/libgomp.oacc-fortran/error_stop-3.f: Likewise.
            * testsuite/libgomp.oacc-fortran/stop-1.f: Likewise.
            * testsuite/libgomp.oacc-fortran/stop-2.f: Likewise.
            * testsuite/libgomp.oacc-fortran/stop-3.f: Likewise.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259491 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libgfortran/ChangeLog                              |  8 +++
 libgfortran/runtime/minimal.c                      | 80 +++++++++++++++++++++-
 libgomp/ChangeLog                                  | 15 ++++
 libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90 |  5 +-
 libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90 |  5 +-
 .../testsuite/libgomp.oacc-fortran/error_stop-1.f  | 20 ++++++
 .../testsuite/libgomp.oacc-fortran/error_stop-2.f  | 20 ++++++
 .../testsuite/libgomp.oacc-fortran/error_stop-3.f  | 20 ++++++
 libgomp/testsuite/libgomp.oacc-fortran/stop-1.f    | 22 ++++++
 libgomp/testsuite/libgomp.oacc-fortran/stop-2.f    | 20 ++++++
 libgomp/testsuite/libgomp.oacc-fortran/stop-3.f    | 23 +++++++
 11 files changed, 234 insertions(+), 4 deletions(-)

diff --git libgfortran/ChangeLog libgfortran/ChangeLog
index d4a1fbb..ea4358c 100644
--- libgfortran/ChangeLog
+++ libgfortran/ChangeLog
@@ -1,3 +1,11 @@
+2018-04-19  Thomas Schwinge  <thomas@codesourcery.com>
+
+	PR libfortran/85166
+	PR libgomp/85463
+	* runtime/minimal.c (stop_numeric): Reimplement.
+	(stop_string, error_stop_string, error_stop_numeric): New
+	functions.
+
 2018-04-19  Jakub Jelinek  <jakub@redhat.com>
 
 	* configure: Regenerated.
diff --git libgfortran/runtime/minimal.c libgfortran/runtime/minimal.c
index e17666b..0b1efeb 100644
--- libgfortran/runtime/minimal.c
+++ libgfortran/runtime/minimal.c
@@ -188,6 +188,22 @@ sys_abort (void)
   abort();
 }
 
+
+/* runtime/stop.c */
+
+#undef report_exception
+#define report_exception() do {} while (0)
+#undef st_printf
+#define st_printf printf
+#undef estr_write
+#define estr_write printf
+/* Map "exit" to "abort"; see PR85463 '[nvptx] "exit" in offloaded region
+   doesn't terminate process'.  */
+#undef exit
+#define exit(...) do { abort (); } while (0)
+#undef exit_error
+#define exit_error(...) do { abort (); } while (0)
+
 /* A numeric STOP statement.  */
 
 extern _Noreturn void stop_numeric (int, bool);
@@ -197,7 +213,67 @@ void
 stop_numeric (int code, bool quiet)
 {
   if (!quiet)
-    printf ("STOP %d\n", code);
-
+    {
+      report_exception ();
+      st_printf ("STOP %d\n", code);
+    }
   exit (code);
 }
+
+
+/* A character string or blank STOP statement.  */
+
+void
+stop_string (const char *string, size_t len, bool quiet)
+{
+  if (!quiet)
+    {
+      report_exception ();
+      if (string)
+	{
+	  estr_write ("STOP ");
+	  (void) write (STDERR_FILENO, string, len);
+	  estr_write ("\n");
+	}
+    }
+  exit (0);
+}
+
+
+/* Per Fortran 2008, section 8.4:  "Execution of a STOP statement initiates
+   normal termination of execution. Execution of an ERROR STOP statement
+   initiates error termination of execution."  Thus, error_stop_string returns
+   a nonzero exit status code.  */
+
+extern _Noreturn void error_stop_string (const char *, size_t, bool);
+export_proto(error_stop_string);
+
+void
+error_stop_string (const char *string, size_t len, bool quiet)
+{
+  if (!quiet)
+    {
+      report_exception ();
+      estr_write ("ERROR STOP ");
+      (void) write (STDERR_FILENO, string, len);
+      estr_write ("\n");
+    }
+  exit_error (1);
+}
+
+
+/* A numeric ERROR STOP statement.  */
+
+extern _Noreturn void error_stop_numeric (int, bool);
+export_proto(error_stop_numeric);
+
+void
+error_stop_numeric (int code, bool quiet)
+{
+  if (!quiet)
+    {
+      report_exception ();
+      st_printf ("ERROR STOP %d\n", code);
+    }
+  exit_error (code);
+}
diff --git libgomp/ChangeLog libgomp/ChangeLog
index 1025acb..f68a4a8 100644
--- libgomp/ChangeLog
+++ libgomp/ChangeLog
@@ -1,3 +1,18 @@
+2018-04-19  Thomas Schwinge  <thomas@codesourcery.com>
+
+	PR libgomp/85463
+	* testsuite/libgomp.oacc-fortran/error_stop-1.f: New file.
+	* testsuite/libgomp.oacc-fortran/error_stop-2.f: Likewise.
+	* testsuite/libgomp.oacc-fortran/error_stop-3.f: Likewise.
+	* testsuite/libgomp.oacc-fortran/stop-1.f: Likewise.
+	* testsuite/libgomp.oacc-fortran/stop-2.f: Likewise.
+	* testsuite/libgomp.oacc-fortran/stop-3.f: Likewise.
+
+	PR libfortran/85166
+	* testsuite/libgomp.oacc-fortran/abort-1.f90: Switch back to "call
+	abort".
+	* testsuite/libgomp.oacc-fortran/abort-2.f90: Likewise.
+
 2018-04-19  Jakub Jelinek  <jakub@redhat.com>
 
 	* configure: Regenerated.
diff --git libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90 libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90
index dde3512..fc0af7f 100644
--- libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90
+++ libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90
@@ -1,9 +1,12 @@
+! Verify that an unconditional "call abort" inside an OpenACC parallel region
+! does the right thing.
+
 program main
   implicit none
 
   print *, "CheCKpOInT"
   !$acc parallel
-  STOP 1
+  call abort
   !$acc end parallel
 
 end program main
diff --git libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90 libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90
index 68d90e9..97a692b 100644
--- libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90
+++ libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90
@@ -1,3 +1,6 @@
+! Verify that a conditional "call abort" inside an OpenACC parallel region does
+! the right thing.
+
 program main
   implicit none
 
@@ -6,7 +9,7 @@ program main
 
   !$acc parallel copyin(argc)
   if (argc .ne. 0) then
-     STOP 1
+     call abort
   end if
   !$acc end parallel
 
diff --git libgomp/testsuite/libgomp.oacc-fortran/error_stop-1.f libgomp/testsuite/libgomp.oacc-fortran/error_stop-1.f
new file mode 100644
index 0000000..4965e67
--- /dev/null
+++ libgomp/testsuite/libgomp.oacc-fortran/error_stop-1.f
@@ -0,0 +1,20 @@
+! { dg-do run }
+
+      PROGRAM MAIN
+      IMPLICIT NONE
+
+      PRINT *, "CheCKpOInT"
+!$ACC PARALLEL
+      ERROR STOP
+!$ACC END PARALLEL
+      PRINT *, "WrONg WAy"
+
+      END PROGRAM MAIN
+
+! { dg-output "CheCKpOInT(\n|\r\n|\r)+" }
+! { dg-output "ERROR STOP (\n|\r\n|\r)+" }
+! PR85463.  The "minimal" libgfortran implementation used with nvptx
+! offloading is a little bit different.
+! { dg-output "Error termination.*" { target { ! openacc_nvidia_accel_selected } } }
+! { dg-output "libgomp: cuStreamSynchronize error.*" { target openacc_nvidia_accel_selected } }
+! { dg-shouldfail "" }
diff --git libgomp/testsuite/libgomp.oacc-fortran/error_stop-2.f libgomp/testsuite/libgomp.oacc-fortran/error_stop-2.f
new file mode 100644
index 0000000..7103fdb
--- /dev/null
+++ libgomp/testsuite/libgomp.oacc-fortran/error_stop-2.f
@@ -0,0 +1,20 @@
+! { dg-do run }
+
+      PROGRAM MAIN
+      IMPLICIT NONE
+
+      PRINT *, "CheCKpOInT"
+!$ACC PARALLEL
+      ERROR STOP 35
+!$ACC END PARALLEL
+      PRINT *, "WrONg WAy"
+
+      END PROGRAM MAIN
+
+! { dg-output "CheCKpOInT(\n|\r\n|\r)+" }
+! { dg-output "ERROR STOP 35(\n|\r\n|\r)+" }
+! PR85463.  The "minimal" libgfortran implementation used with nvptx
+! offloading is a little bit different.
+! { dg-output "Error termination.*" { target { ! openacc_nvidia_accel_selected } } }
+! { dg-output "libgomp: cuStreamSynchronize error.*" { target openacc_nvidia_accel_selected } }
+! { dg-shouldfail "" }
diff --git libgomp/testsuite/libgomp.oacc-fortran/error_stop-3.f libgomp/testsuite/libgomp.oacc-fortran/error_stop-3.f
new file mode 100644
index 0000000..9c217f1
--- /dev/null
+++ libgomp/testsuite/libgomp.oacc-fortran/error_stop-3.f
@@ -0,0 +1,20 @@
+! { dg-do run }
+
+      PROGRAM MAIN
+      IMPLICIT NONE
+
+      PRINT *, "CheCKpOInT"
+!$ACC PARALLEL
+      ERROR STOP "SiGN"
+!$ACC END PARALLEL
+      PRINT *, "WrONg WAy"
+
+      END PROGRAM MAIN
+
+! { dg-output "CheCKpOInT(\n|\r\n|\r)+" }
+! { dg-output "ERROR STOP SiGN(\n|\r\n|\r)+" }
+! PR85463.  The "minimal" libgfortran implementation used with nvptx
+! offloading is a little bit different.
+! { dg-output "Error termination.*" { target { ! openacc_nvidia_accel_selected } } }
+! { dg-output "libgomp: cuStreamSynchronize error.*" { target openacc_nvidia_accel_selected } }
+! { dg-shouldfail "" }
diff --git libgomp/testsuite/libgomp.oacc-fortran/stop-1.f libgomp/testsuite/libgomp.oacc-fortran/stop-1.f
new file mode 100644
index 0000000..af267fc
--- /dev/null
+++ libgomp/testsuite/libgomp.oacc-fortran/stop-1.f
@@ -0,0 +1,22 @@
+! { dg-do run }
+
+      PROGRAM MAIN
+      IMPLICIT NONE
+
+      PRINT *, "CheCKpOInT"
+!$ACC PARALLEL
+      STOP
+!$ACC END PARALLEL
+      PRINT *, "WrONg WAy"
+
+      END PROGRAM MAIN
+
+! { dg-output "CheCKpOInT(\n|\r\n|\r)+" }
+! PR85463.  The "minimal" libgfortran implementation used with nvptx
+! offloading is a little bit different.
+! { dg-output "libgomp: cuStreamSynchronize error.*" { target openacc_nvidia_accel_selected } }
+! { dg-output "$" }
+! PR85463.  STOP with code zero (as implied here) should actually
+! terminate the process normally, but doesn't in the "minimal"
+! libgfortran implementation used with nvptx offloading.
+! { dg-shouldfail "" { openacc_nvidia_accel_selected } }
diff --git libgomp/testsuite/libgomp.oacc-fortran/stop-2.f libgomp/testsuite/libgomp.oacc-fortran/stop-2.f
new file mode 100644
index 0000000..13c0684
--- /dev/null
+++ libgomp/testsuite/libgomp.oacc-fortran/stop-2.f
@@ -0,0 +1,20 @@
+! { dg-do run }
+
+      PROGRAM MAIN
+      IMPLICIT NONE
+
+      PRINT *, "CheCKpOInT"
+!$ACC PARALLEL
+      STOP 35
+!$ACC END PARALLEL
+      PRINT *, "WrONg WAy"
+
+      END PROGRAM MAIN
+
+! { dg-output "CheCKpOInT(\n|\r\n|\r)+" }
+! { dg-output "STOP 35(\n|\r\n|\r)+" }
+! PR85463.  The "minimal" libgfortran implementation used with nvptx
+! offloading is a little bit different.
+! { dg-output "libgomp: cuStreamSynchronize error.*" { target openacc_nvidia_accel_selected } }
+! { dg-output "$" }
+! { dg-shouldfail "" }
diff --git libgomp/testsuite/libgomp.oacc-fortran/stop-3.f libgomp/testsuite/libgomp.oacc-fortran/stop-3.f
new file mode 100644
index 0000000..3bd7446
--- /dev/null
+++ libgomp/testsuite/libgomp.oacc-fortran/stop-3.f
@@ -0,0 +1,23 @@
+! { dg-do run }
+
+      PROGRAM MAIN
+      IMPLICIT NONE
+
+      PRINT *, "CheCKpOInT"
+!$ACC PARALLEL
+      STOP "SiGN"
+!$ACC END PARALLEL
+      PRINT *, "WrONg WAy"
+
+      END PROGRAM MAIN
+
+! { dg-output "CheCKpOInT(\n|\r\n|\r)+" }
+! { dg-output "STOP SiGN(\n|\r\n|\r)+" }
+! PR85463.  The "minimal" libgfortran implementation used with nvptx
+! offloading is a little bit different.
+! { dg-output "libgomp: cuStreamSynchronize error.*" { target openacc_nvidia_accel_selected } }
+! { dg-output "$" }
+! PR85463.  STOP with code zero (as implied here) should actually
+! terminate the process normally, but doesn't in the "minimal"
+! libgfortran implementation used with nvptx offloading.
+! { dg-shouldfail "" { openacc_nvidia_accel_selected } }


Grüße
 Thomas

  reply	other threads:[~2018-04-19  9:06 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-04  9:30 [patch, libfortran, committed] Implement stop_numeric for minimal targets Thomas König
2018-04-19  9:06 ` Thomas Schwinge [this message]
2018-04-19  9:36   ` PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process' (was: [patch, libfortran, committed] Implement stop_numeric for minimal targets) Jakub Jelinek
2018-04-19  9:19     ` Thomas Schwinge
2018-04-19  9:25       ` Jakub Jelinek
2018-04-19  9:36         ` Thomas Schwinge
2018-04-19 11:32     ` Thomas König
2018-04-19 11:59       ` Thomas Schwinge
2018-04-19 17:59         ` PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process' Thomas König
2018-04-25 13:56   ` PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process' (was: [patch, libfortran, committed] Implement stop_numeric for minimal targets) Martin Jambor
2018-04-26 10:47     ` PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process' Thomas Schwinge
2018-04-26 12:39       ` Martin Jambor
     [not found]   ` <20230119220005.2002779-1-thomas@codesourcery.com>
2023-01-20 20:12     ` Clean up after newlib "nvptx: In offloading execution, map '_exit' to 'abort' [GCC PR85463]" Thomas Schwinge

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87in8nsgz9.fsf@euler.schwinge.homeip.net \
    --to=thomas@codesourcery.com \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=tk@tkoenig.net \
    --cc=vries@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).