PR85463 '[nvptx] "exit" in offloaded region doesn't terminate process'
authorThomas Schwinge <thomas@codesourcery.com>
Thu, 19 Apr 2018 08:53:38 +0000 (10:53 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Thu, 19 Apr 2018 08:53:38 +0000 (10:53 +0200)
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.

From-SVN: r259491

libgfortran/ChangeLog
libgfortran/runtime/minimal.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90
libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90
libgomp/testsuite/libgomp.oacc-fortran/error_stop-1.f [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/error_stop-2.f [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/error_stop-3.f [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/stop-1.f [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/stop-2.f [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/stop-3.f [new file with mode: 0644]

index d4a1fbb08ab9909605c7d052981b6e8de9f74be1..ea4358cc54e825cdba8d5841765e1615fac7447a 100644 (file)
@@ -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.
index e17666b7b82e88463b6f48993171220e0fa37a16..0b1efeb0d58bfee448677bcf52026565f3a13fc9 100644 (file)
@@ -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);
+}
index 1025acb5d819cf58b7f38e9742378814ea95d938..f68a4a83fad7cca588b7658092b372a63cd4cd43 100644 (file)
@@ -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.
index dde35123e7907ae90a96bb705e0771c414dd7139..fc0af7ff7d89e3dc7517f9d575369c16101c9126 100644 (file)
@@ -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
index 68d90e945396d6dfd7bc674fba3ac87952c5c8da..97a692ba6677851d0a71da9a92dfc9664dba0dab 100644 (file)
@@ -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 a/libgomp/testsuite/libgomp.oacc-fortran/error_stop-1.f b/libgomp/testsuite/libgomp.oacc-fortran/error_stop-1.f
new file mode 100644 (file)
index 0000000..4965e67
--- /dev/null
@@ -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 a/libgomp/testsuite/libgomp.oacc-fortran/error_stop-2.f b/libgomp/testsuite/libgomp.oacc-fortran/error_stop-2.f
new file mode 100644 (file)
index 0000000..7103fdb
--- /dev/null
@@ -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 a/libgomp/testsuite/libgomp.oacc-fortran/error_stop-3.f b/libgomp/testsuite/libgomp.oacc-fortran/error_stop-3.f
new file mode 100644 (file)
index 0000000..9c217f1
--- /dev/null
@@ -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 a/libgomp/testsuite/libgomp.oacc-fortran/stop-1.f b/libgomp/testsuite/libgomp.oacc-fortran/stop-1.f
new file mode 100644 (file)
index 0000000..af267fc
--- /dev/null
@@ -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 a/libgomp/testsuite/libgomp.oacc-fortran/stop-2.f b/libgomp/testsuite/libgomp.oacc-fortran/stop-2.f
new file mode 100644 (file)
index 0000000..13c0684
--- /dev/null
@@ -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 a/libgomp/testsuite/libgomp.oacc-fortran/stop-3.f b/libgomp/testsuite/libgomp.oacc-fortran/stop-3.f
new file mode 100644 (file)
index 0000000..3bd7446
--- /dev/null
@@ -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 } }