aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgfortran/ChangeLog9
-rw-r--r--libgfortran/runtime/backtrace.c4
-rw-r--r--libgfortran/runtime/compile_options.c50
3 files changed, 60 insertions, 3 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index c170cae..c399dbe 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,12 @@
+2012-01-09 Harald Anlauf <anlauf@gmx.de>
+ Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/51197
+ * runtime/backtrace.c (show_backtrace): Modify wording written
+ before the backtrace.
+ * runtime/compile_options.c (show_signal): New function.
+ (backtrace_handler): Use it.
+
2012-01-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* Makefile.am (libgfortran_la_LDFLAGS): Add -Wc,-shared-libgcc.
diff --git a/libgfortran/runtime/backtrace.c b/libgfortran/runtime/backtrace.c
index e28bdcb..5ebd972 100644
--- a/libgfortran/runtime/backtrace.c
+++ b/libgfortran/runtime/backtrace.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006, 2007, 2009, 2011 Free Software Foundation, Inc.
+/* Copyright (C) 2006, 2007, 2009, 2011, 2012 Free Software Foundation, Inc.
Contributed by François-Xavier Coudert
This file is part of the GNU Fortran runtime library (libgfortran).
@@ -197,7 +197,7 @@ show_backtrace (void)
state.frame_number = 0;
state.error = 0;
- estr_write ("\nA fatal error occurred! Backtrace for this error:\n");
+ estr_write ("\nBacktrace for this error:\n");
#if CAN_PIPE
diff --git a/libgfortran/runtime/compile_options.c b/libgfortran/runtime/compile_options.c
index 0c139a2..8038f07 100644
--- a/libgfortran/runtime/compile_options.c
+++ b/libgfortran/runtime/compile_options.c
@@ -1,5 +1,6 @@
/* Handling of compile-time options that influence the library.
- Copyright (C) 2005, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2007, 2009, 2010, 2011, 2012
+ Free Software Foundation, Inc.
This file is part of the GNU Fortran runtime library (libgfortran).
@@ -32,6 +33,52 @@ compile_options_t compile_options;
volatile sig_atomic_t fatal_error_in_progress = 0;
+
+/* Helper function for backtrace_handler to write information about the
+ received signal to stderr before actually giving the backtrace. */
+static void
+show_signal (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);
+}
+
+
/* A signal handler to allow us to output a backtrace. */
void
backtrace_handler (int signum)
@@ -43,6 +90,7 @@ backtrace_handler (int signum)
raise (signum);
fatal_error_in_progress = 1;
+ show_signal (signum);
show_backtrace();
/* Now reraise the signal. We reactivate the signal's