summaryrefslogtreecommitdiff
path: root/libgfortran/runtime
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2012-12-20 19:15:13 +0100
committerJanus Weil <janus@gcc.gnu.org>2012-12-20 19:15:13 +0100
commitf0f67c96c3906c09d9a9e00cbdbbb959c9c6e539 (patch)
treee5d70c766699e82a05d85f8b91a5a37c1eee9520 /libgfortran/runtime
parentd97c9b2248a86fc8a2d3f65df0e0a63347c89e2a (diff)
downloadgcc-f0f67c96c3906c09d9a9e00cbdbbb959c9c6e539.tar.gz
re PR libfortran/36044 (user-requested backtrace)
2012-12-20 Janus Weil <janus@gcc.gnu.org> PR fortran/36044 * gfortran.h (gfc_isym_id): Add GFC_ISYM_BACKTRACE. * intrinsic.c (add_subroutines): Add "backtrace". * intrinsic.texi (BACKTRACE): Document BACKTRACE intrinsic. 2012-12-20 Janus Weil <janus@gcc.gnu.org> PR fortran/36044 * gfortran.map: Add _gfortran_backtrace. * libgfortran.h: Rename 'show_backtrace' and export. * runtime/backtrace.c (show_backtrace): Rename to 'backtrace'. Don't show message. Close file descriptor. Export. * runtime/compile_options.c (backtrace_handler): Renamed 'show_backtrace'. Move message outside. * runtime/error.c (sys_abort): Ditto. From-SVN: r194648
Diffstat (limited to 'libgfortran/runtime')
-rw-r--r--libgfortran/runtime/backtrace.c6
-rw-r--r--libgfortran/runtime/compile_options.c3
-rw-r--r--libgfortran/runtime/error.c3
3 files changed, 7 insertions, 5 deletions
diff --git a/libgfortran/runtime/backtrace.c b/libgfortran/runtime/backtrace.c
index 9d88d136a8b..3e3e8441ea1 100644
--- a/libgfortran/runtime/backtrace.c
+++ b/libgfortran/runtime/backtrace.c
@@ -190,14 +190,12 @@ trace_function (struct _Unwind_Context *context, void *state_ptr)
/* Display the backtrace. */
void
-show_backtrace (void)
+backtrace (void)
{
bt_state state;
state.frame_number = 0;
state.error = 0;
- estr_write ("\nBacktrace for this error:\n");
-
#if CAN_PIPE
if (addr2line_path == NULL)
@@ -261,6 +259,7 @@ show_backtrace (void)
if (state.error)
goto fallback;
close (inp[1]);
+ close (f[0]);
wait (NULL);
return;
@@ -277,3 +276,4 @@ fallback_noerr:
state.direct_output = 1;
_Unwind_Backtrace (trace_function, &state);
}
+iexport(backtrace);
diff --git a/libgfortran/runtime/compile_options.c b/libgfortran/runtime/compile_options.c
index 2ba1aedf5c5..1860edadf5c 100644
--- a/libgfortran/runtime/compile_options.c
+++ b/libgfortran/runtime/compile_options.c
@@ -126,7 +126,8 @@ backtrace_handler (int signum)
fatal_error_in_progress = 1;
show_signal (signum);
- show_backtrace();
+ estr_write ("\nBacktrace for this error:\n");
+ backtrace ();
/* Now reraise the signal. We reactivate the signal's
default handling, which is to terminate the process.
diff --git a/libgfortran/runtime/error.c b/libgfortran/runtime/error.c
index 3955e44cea0..dfdfb4cbfe7 100644
--- a/libgfortran/runtime/error.c
+++ b/libgfortran/runtime/error.c
@@ -166,7 +166,8 @@ sys_abort (void)
if (options.backtrace == 1
|| (options.backtrace == -1 && compile_options.backtrace == 1))
{
- show_backtrace ();
+ estr_write ("\nProgram aborted. Backtrace:\n");
+ backtrace ();
signal (SIGABRT, SIG_DFL);
}