mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-07 20:10:53 +08:00
PR 53379 Print backtrace on error termination.
2015-09-05 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/53379 * libgfortran.h (exit_error): New prototype. * runtime/error.c (exit_error): New function. (os_error): Call exit_error instead of exit. (runtime_error): Likewise. (runtime_error_at): Likewise. (internal_error): Likewise. (generate_error): Likewise. (notify_std): Likewise. * runtime/stop.c (error_stop_string): Likewise. (error_stop_numeric): Likewise. From-SVN: r227503
This commit is contained in:
parent
5e229618cd
commit
71cda9cac8
@ -1,3 +1,17 @@
|
||||
2015-09-05 Janne Blomqvist <jb@gcc.gnu.org>
|
||||
|
||||
PR fortran/53379
|
||||
* libgfortran.h (exit_error): New prototype.
|
||||
* runtime/error.c (exit_error): New function.
|
||||
(os_error): Call exit_error instead of exit.
|
||||
(runtime_error): Likewise.
|
||||
(runtime_error_at): Likewise.
|
||||
(internal_error): Likewise.
|
||||
(generate_error): Likewise.
|
||||
(notify_std): Likewise.
|
||||
* runtime/stop.c (error_stop_string): Likewise.
|
||||
(error_stop_numeric): Likewise.
|
||||
|
||||
2015-09-04 Janne Blomqvist <jb@gcc.gnu.org>
|
||||
|
||||
* io/unix.h (delete_file): Remove prototype.
|
||||
|
@ -675,6 +675,9 @@ internal_proto(show_backtrace);
|
||||
extern _Noreturn void sys_abort (void);
|
||||
internal_proto(sys_abort);
|
||||
|
||||
extern _Noreturn void exit_error (int);
|
||||
internal_proto(exit_error);
|
||||
|
||||
extern ssize_t estr_write (const char *);
|
||||
internal_proto(estr_write);
|
||||
|
||||
|
@ -74,15 +74,17 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
|
||||
2.3.5 also explains how co-images synchronize during termination.
|
||||
|
||||
In libgfortran we have two ways of ending a program. exit(code) is
|
||||
a normal exit; calling exit() also causes open units to be
|
||||
closed. No backtrace or core dump is needed here. When something
|
||||
goes wrong, we have sys_abort() which tries to print the backtrace
|
||||
if -fbacktrace is enabled, and then dumps core; whether a core file
|
||||
is generated is system dependent. When aborting, we don't flush and
|
||||
close open units, as program memory might be corrupted and we'd
|
||||
rather risk losing dirty data in the buffers rather than corrupting
|
||||
files on disk.
|
||||
In libgfortran we have three ways of ending a program. exit(code)
|
||||
is a normal exit; calling exit() also causes open units to be
|
||||
closed. No backtrace or core dump is needed here. For error
|
||||
termination, we have exit_error(status), which prints a backtrace
|
||||
if backtracing is enabled, then exits. Finally, when something
|
||||
goes terribly wrong, we have sys_abort() which tries to print the
|
||||
backtrace if -fbacktrace is enabled, and then dumps core; whether a
|
||||
core file is generated is system dependent. When aborting, we don't
|
||||
flush and close open units, as program memory might be corrupted
|
||||
and we'd rather risk losing dirty data in the buffers rather than
|
||||
corrupting files on disk.
|
||||
|
||||
*/
|
||||
|
||||
@ -181,6 +183,23 @@ sys_abort (void)
|
||||
}
|
||||
|
||||
|
||||
/* Exit in case of error termination. If backtracing is enabled, print
|
||||
backtrace, then exit. */
|
||||
|
||||
void
|
||||
exit_error (int status)
|
||||
{
|
||||
if (options.backtrace == 1
|
||||
|| (options.backtrace == -1 && compile_options.backtrace == 1))
|
||||
{
|
||||
estr_write ("\nError termination. Backtrace:\n");
|
||||
show_backtrace (false);
|
||||
}
|
||||
exit (status);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* gfc_xtoa()-- Integer to hexadecimal conversion. */
|
||||
|
||||
const char *
|
||||
@ -326,7 +345,7 @@ os_error (const char *message)
|
||||
estr_write ("\n");
|
||||
estr_write (message);
|
||||
estr_write ("\n");
|
||||
exit (1);
|
||||
exit_error (1);
|
||||
}
|
||||
iexport(os_error);
|
||||
|
||||
@ -345,7 +364,7 @@ runtime_error (const char *message, ...)
|
||||
st_vprintf (message, ap);
|
||||
va_end (ap);
|
||||
estr_write ("\n");
|
||||
exit (2);
|
||||
exit_error (2);
|
||||
}
|
||||
iexport(runtime_error);
|
||||
|
||||
@ -364,7 +383,7 @@ runtime_error_at (const char *where, const char *message, ...)
|
||||
st_vprintf (message, ap);
|
||||
va_end (ap);
|
||||
estr_write ("\n");
|
||||
exit (2);
|
||||
exit_error (2);
|
||||
}
|
||||
iexport(runtime_error_at);
|
||||
|
||||
@ -402,7 +421,7 @@ internal_error (st_parameter_common *cmp, const char *message)
|
||||
because hopefully it doesn't happen too often). */
|
||||
stupid_function_name_for_static_linking();
|
||||
|
||||
exit (3);
|
||||
exit_error (3);
|
||||
}
|
||||
|
||||
|
||||
@ -574,7 +593,7 @@ generate_error (st_parameter_common *cmp, int family, const char *message)
|
||||
estr_write ("Fortran runtime error: ");
|
||||
estr_write (message);
|
||||
estr_write ("\n");
|
||||
exit (2);
|
||||
exit_error (2);
|
||||
}
|
||||
iexport(generate_error);
|
||||
|
||||
@ -636,7 +655,7 @@ notify_std (st_parameter_common *cmp, int std, const char * message)
|
||||
estr_write ("Fortran runtime error: ");
|
||||
estr_write (message);
|
||||
estr_write ("\n");
|
||||
exit (2);
|
||||
exit_error (2);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -145,7 +145,7 @@ error_stop_string (const char *string, GFC_INTEGER_4 len)
|
||||
(void) write (STDERR_FILENO, string, len);
|
||||
estr_write ("\n");
|
||||
|
||||
exit (1);
|
||||
exit_error (1);
|
||||
}
|
||||
|
||||
|
||||
@ -159,5 +159,5 @@ error_stop_numeric (GFC_INTEGER_4 code)
|
||||
{
|
||||
report_exception ();
|
||||
st_printf ("ERROR STOP %d\n", (int) code);
|
||||
exit (code);
|
||||
exit_error (code);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user