Commit 2b840e50 by Francois-Xavier Coudert Committed by François-Xavier Coudert

re PR fortran/31189 (Support backtracing for non-library errors)

	PR fortran/31189

	* runtime/backtrace.c (show_backtrace): Skip _gfortrani_handler
	when displaying backtrace.
	* runtime/compile_options.c: Include <signal.h>.
	(handler): New function.
	(set_options): Set signal handlers for backtrace.
	* libgfortran.h (handler): Add prototype.

	* invoke.texi (-fbacktrace): Document the new behaviour.

Co-Authored-By: Tobias Burnus <burnus@gcc.gnu.org>

From-SVN: r127364
parent c9ff1de3
2007-08-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 2007-08-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/31189
* invoke.texi (-fbacktrace): Document the new behaviour.
2007-08-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/32937 PR fortran/32937
* trans-array.c (gfc_conv_expr_descriptor): Use * trans-array.c (gfc_conv_expr_descriptor): Use
gfc_conv_const_charlen to generate backend_decl of right type. gfc_conv_const_charlen to generate backend_decl of right type.
......
...@@ -544,7 +544,9 @@ zero), @samp{overflow} (overflow in a floating point operation), ...@@ -544,7 +544,9 @@ zero), @samp{overflow} (overflow in a floating point operation),
@opindex @code{fbacktrace} @opindex @code{fbacktrace}
@cindex backtrace @cindex backtrace
@cindex trace @cindex trace
Specify that, when a runtime error is encountered, the Fortran runtime Specify that, when a runtime error is encountered or a deadly signal is
emitted (segmentation fault, illegal instruction, bus error or
floating-point exception), the Fortran runtime
library should output a backtrace of the error. This option library should output a backtrace of the error. This option
only has influence for compilation of the Fortran main program. only has influence for compilation of the Fortran main program.
......
2007-08-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> 2007-08-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Tobias Burnus <burnus@gcc.gnu.org>
PR fortran/31189
* runtime/backtrace.c (show_backtrace): Skip _gfortrani_handler
when displaying backtrace.
* runtime/compile_options.c: Include <signal.h>.
(handler): New function.
(set_options): Set signal handlers for backtrace.
* libgfortran.h (handler): Add prototype.
2007-08-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* intrinsics/string_intrinsics.c (compare_string): Return an int. * intrinsics/string_intrinsics.c (compare_string): Return an int.
* libgfortran.h (compare_string): Likewise. * libgfortran.h (compare_string): Likewise.
......
...@@ -373,6 +373,9 @@ options_t; ...@@ -373,6 +373,9 @@ options_t;
extern options_t options; extern options_t options;
internal_proto(options); internal_proto(options);
extern void handler (int);
internal_proto(handler);
/* Compile-time options that will influence the library. */ /* Compile-time options that will influence the library. */
......
...@@ -223,7 +223,8 @@ show_backtrace (void) ...@@ -223,7 +223,8 @@ show_backtrace (void)
/* Try to recognize the internal libgfortran functions. */ /* Try to recognize the internal libgfortran functions. */
if (strncasecmp (func, "*_gfortran", 10) == 0 if (strncasecmp (func, "*_gfortran", 10) == 0
|| strncasecmp (func, "_gfortran", 9) == 0 || strncasecmp (func, "_gfortran", 9) == 0
|| strcmp (func, "main") == 0 || strcmp (func, "_start") == 0) || strcmp (func, "main") == 0 || strcmp (func, "_start") == 0
|| strcmp (func, "_gfortrani_handler") == 0)
continue; continue;
if (local_strcasestr (str[i], "libgfortran.so") != NULL if (local_strcasestr (str[i], "libgfortran.so") != NULL
......
...@@ -31,10 +31,61 @@ Boston, MA 02110-1301, USA. */ ...@@ -31,10 +31,61 @@ Boston, MA 02110-1301, USA. */
#include "libgfortran.h" #include "libgfortran.h"
#ifdef HAVE_SIGNAL_H
#include <signal.h>
#endif
/* Useful compile-time options will be stored in here. */ /* Useful compile-time options will be stored in here. */
compile_options_t compile_options; compile_options_t compile_options;
/* A signal handler to allow us to output a backtrace. */
void
handler (int signum)
{
const char * name = NULL, * desc = NULL;
switch (signum)
{
#if defined(SIGSEGV)
case SIGSEGV:
name = "SIGSEGV";
desc = "Segmentation fault";
break;
#endif
#if defined(SIGBUS)
case SIGBUS:
name = "SIGBUS";
desc = "Bus error";
break;
#endif
#if defined(SIGILL)
case SIGILL:
name = "SIGILL";
desc = "Illegal instruction";
break;
#endif
#if defined(SIGFPE)
case SIGFPE:
name = "SIGFPE";
desc = "Floating-point exception";
break;
#endif
}
if (name)
st_printf ("\nProgram received signal %d (%s): %s.\n", signum, name, desc);
else
st_printf ("\nProgram received signal %d.\n", signum);
sys_exit (5);
}
/* Set the usual compile-time options. */ /* Set the usual compile-time options. */
extern void set_options (int , int []); extern void set_options (int , int []);
export_proto(set_options); export_proto(set_options);
...@@ -56,6 +107,31 @@ set_options (int num, int options[]) ...@@ -56,6 +107,31 @@ set_options (int num, int options[])
compile_options.sign_zero = options[5]; compile_options.sign_zero = options[5];
if (num >= 7) if (num >= 7)
compile_options.bounds_check = options[6]; compile_options.bounds_check = options[6];
/* If backtrace is required, we set signal handlers on most common
signals. */
#if defined(HAVE_SIGNAL_H) && (defined(SIGSEGV) || defined(SIGBUS) \
|| defined(SIGILL) || defined(SIGFPE))
if (compile_options.backtrace)
{
#if defined(SIGSEGV)
signal (SIGSEGV, handler);
#endif
#if defined(SIGBUS)
signal (SIGBUS, handler);
#endif
#if defined(SIGILL)
signal (SIGILL, handler);
#endif
#if defined(SIGFPE)
signal (SIGFPE, handler);
#endif
}
#endif
} }
......
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