mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
1781a04fcc
commit
6e0d40b6f8
|
@ -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>
|
2018-04-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* configure: Regenerated.
|
* configure: Regenerated.
|
||||||
|
|
|
@ -188,6 +188,22 @@ sys_abort (void)
|
||||||
abort();
|
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. */
|
/* A numeric STOP statement. */
|
||||||
|
|
||||||
extern _Noreturn void stop_numeric (int, bool);
|
extern _Noreturn void stop_numeric (int, bool);
|
||||||
|
@ -197,7 +213,67 @@ void
|
||||||
stop_numeric (int code, bool quiet)
|
stop_numeric (int code, bool quiet)
|
||||||
{
|
{
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
printf ("STOP %d\n", code);
|
{
|
||||||
|
report_exception ();
|
||||||
|
st_printf ("STOP %d\n", code);
|
||||||
|
}
|
||||||
exit (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);
|
||||||
|
}
|
||||||
|
|
|
@ -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>
|
2018-04-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* configure: Regenerated.
|
* configure: Regenerated.
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
|
! Verify that an unconditional "call abort" inside an OpenACC parallel region
|
||||||
|
! does the right thing.
|
||||||
|
|
||||||
program main
|
program main
|
||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
print *, "CheCKpOInT"
|
print *, "CheCKpOInT"
|
||||||
!$acc parallel
|
!$acc parallel
|
||||||
STOP 1
|
call abort
|
||||||
!$acc end parallel
|
!$acc end parallel
|
||||||
|
|
||||||
end program main
|
end program main
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
! Verify that a conditional "call abort" inside an OpenACC parallel region does
|
||||||
|
! the right thing.
|
||||||
|
|
||||||
program main
|
program main
|
||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
|
@ -6,7 +9,7 @@ program main
|
||||||
|
|
||||||
!$acc parallel copyin(argc)
|
!$acc parallel copyin(argc)
|
||||||
if (argc .ne. 0) then
|
if (argc .ne. 0) then
|
||||||
STOP 1
|
call abort
|
||||||
end if
|
end if
|
||||||
!$acc end parallel
|
!$acc end parallel
|
||||||
|
|
||||||
|
|
|
@ -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 "" }
|
|
@ -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 "" }
|
|
@ -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 "" }
|
|
@ -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 } }
|
|
@ -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 "" }
|
|
@ -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 } }
|
Loading…
Reference in New Issue