Commit 6e0d40b6 by Thomas Schwinge Committed by Thomas Schwinge

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.

From-SVN: r259491
parent 1781a04f
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.
......
......@@ -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);
}
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.
......
! 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
......
! 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
......
! { 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 "" }
! { 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 "" }
! { 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 "" }
! { 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 } }
! { 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 "" }
! { 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 } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment