Commit f0f67c96 by Janus Weil

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
parent d97c9b22
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 Tobias Burnus <burnus@net-b.de> 2012-12-20 Tobias Burnus <burnus@net-b.de>
PR fortran/54818 PR fortran/54818
......
...@@ -505,6 +505,7 @@ enum gfc_isym_id ...@@ -505,6 +505,7 @@ enum gfc_isym_id
GFC_ISYM_SHIFTA, GFC_ISYM_SHIFTA,
GFC_ISYM_SHIFTL, GFC_ISYM_SHIFTL,
GFC_ISYM_SHIFTR, GFC_ISYM_SHIFTR,
GFC_ISYM_BACKTRACE,
GFC_ISYM_SIGN, GFC_ISYM_SIGN,
GFC_ISYM_SIGNAL, GFC_ISYM_SIGNAL,
GFC_ISYM_SI_KIND, GFC_ISYM_SI_KIND,
......
...@@ -2896,6 +2896,8 @@ add_subroutines (void) ...@@ -2896,6 +2896,8 @@ add_subroutines (void)
"value", BT_INTEGER, di, REQUIRED, INTENT_OUT, "value", BT_INTEGER, di, REQUIRED, INTENT_OUT,
"atom", BT_INTEGER, di, REQUIRED, INTENT_IN); "atom", BT_INTEGER, di, REQUIRED, INTENT_IN);
add_sym_0s ("backtrace", GFC_ISYM_BACKTRACE, GFC_STD_GNU, NULL);
add_sym_1s ("cpu_time", GFC_ISYM_CPU_TIME, CLASS_IMPURE, BT_UNKNOWN, 0, add_sym_1s ("cpu_time", GFC_ISYM_CPU_TIME, CLASS_IMPURE, BT_UNKNOWN, 0,
GFC_STD_F95, gfc_check_cpu_time, NULL, gfc_resolve_cpu_time, GFC_STD_F95, gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
tm, BT_REAL, dr, REQUIRED, INTENT_OUT); tm, BT_REAL, dr, REQUIRED, INTENT_OUT);
......
...@@ -63,6 +63,7 @@ Some basic guidelines for editing this document: ...@@ -63,6 +63,7 @@ Some basic guidelines for editing this document:
* @code{ATANH}: ATANH, Inverse hyperbolic tangent function * @code{ATANH}: ATANH, Inverse hyperbolic tangent function
* @code{ATOMIC_DEFINE}: ATOMIC_DEFINE, Setting a variable atomically * @code{ATOMIC_DEFINE}: ATOMIC_DEFINE, Setting a variable atomically
* @code{ATOMIC_REF}: ATOMIC_REF, Obtaining the value of a variable atomically * @code{ATOMIC_REF}: ATOMIC_REF, Obtaining the value of a variable atomically
* @code{BACKTRACE}: BACKTRACE, Show a backtrace
* @code{BESSEL_J0}: BESSEL_J0, Bessel function of the first kind of order 0 * @code{BESSEL_J0}: BESSEL_J0, Bessel function of the first kind of order 0
* @code{BESSEL_J1}: BESSEL_J1, Bessel function of the first kind of order 1 * @code{BESSEL_J1}: BESSEL_J1, Bessel function of the first kind of order 1
* @code{BESSEL_JN}: BESSEL_JN, Bessel function of the first kind * @code{BESSEL_JN}: BESSEL_JN, Bessel function of the first kind
...@@ -349,6 +350,7 @@ the applicable standard for each intrinsic procedure is noted. ...@@ -349,6 +350,7 @@ the applicable standard for each intrinsic procedure is noted.
@item @emph{Description}: @item @emph{Description}:
@code{ABORT} causes immediate termination of the program. On operating @code{ABORT} causes immediate termination of the program. On operating
systems that support a core dump, @code{ABORT} will produce a core dump. systems that support a core dump, @code{ABORT} will produce a core dump.
It will also print a backtrace, unless @code{-fno-backtrace} is given.
@item @emph{Standard}: @item @emph{Standard}:
GNU extension GNU extension
...@@ -371,7 +373,7 @@ end program test_abort ...@@ -371,7 +373,7 @@ end program test_abort
@end smallexample @end smallexample
@item @emph{See also}: @item @emph{See also}:
@ref{EXIT}, @ref{KILL} @ref{EXIT}, @ref{KILL}, @ref{BACKTRACE}
@end table @end table
...@@ -1644,6 +1646,35 @@ end program atomic ...@@ -1644,6 +1646,35 @@ end program atomic
@node BACKTRACE
@section @code{BACKTRACE} --- Show a backtrace
@fnindex BACKTRACE
@cindex backtrace
@table @asis
@item @emph{Description}:
@code{BACKTRACE} shows a backtrace at an arbitrary place in user code. Program
execution continues normally afterwards. The backtrace information is printed
to the unit corresponding to @code{ERROR_UNIT} in @code{ISO_FORTRAN_ENV}.
@item @emph{Standard}:
GNU Extension
@item @emph{Class}:
Subroutine
@item @emph{Syntax}:
@code{CALL BACKTRACE}
@item @emph{Arguments}:
None
@item @emph{See also}:
@ref{ABORT}
@end table
@node BESSEL_J0 @node BESSEL_J0
@section @code{BESSEL_J0} --- Bessel function of the first kind of order 0 @section @code{BESSEL_J0} --- Bessel function of the first kind of order 0
@fnindex BESSEL_J0 @fnindex BESSEL_J0
......
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.
2012-12-19 Paul Thomas <pault@gcc.gnu.org> 2012-12-19 Paul Thomas <pault@gcc.gnu.org>
* intrinsics/extends_type_of.c : Return correct results for * intrinsics/extends_type_of.c : Return correct results for
......
...@@ -1192,6 +1192,7 @@ GFORTRAN_1.4 { ...@@ -1192,6 +1192,7 @@ GFORTRAN_1.4 {
GFORTRAN_1.5 { GFORTRAN_1.5 {
global: global:
_gfortran_ftell2; _gfortran_ftell2;
_gfortran_backtrace;
} GFORTRAN_1.4; } GFORTRAN_1.4;
F2C_1.0 { F2C_1.0 {
......
...@@ -667,8 +667,8 @@ internal_proto(find_addr2line); ...@@ -667,8 +667,8 @@ internal_proto(find_addr2line);
/* backtrace.c */ /* backtrace.c */
extern void show_backtrace (void); extern void backtrace (void);
internal_proto(show_backtrace); iexport_proto(backtrace);
/* error.c */ /* error.c */
......
...@@ -190,14 +190,12 @@ trace_function (struct _Unwind_Context *context, void *state_ptr) ...@@ -190,14 +190,12 @@ trace_function (struct _Unwind_Context *context, void *state_ptr)
/* Display the backtrace. */ /* Display the backtrace. */
void void
show_backtrace (void) backtrace (void)
{ {
bt_state state; bt_state state;
state.frame_number = 0; state.frame_number = 0;
state.error = 0; state.error = 0;
estr_write ("\nBacktrace for this error:\n");
#if CAN_PIPE #if CAN_PIPE
if (addr2line_path == NULL) if (addr2line_path == NULL)
...@@ -261,6 +259,7 @@ show_backtrace (void) ...@@ -261,6 +259,7 @@ show_backtrace (void)
if (state.error) if (state.error)
goto fallback; goto fallback;
close (inp[1]); close (inp[1]);
close (f[0]);
wait (NULL); wait (NULL);
return; return;
...@@ -277,3 +276,4 @@ fallback_noerr: ...@@ -277,3 +276,4 @@ fallback_noerr:
state.direct_output = 1; state.direct_output = 1;
_Unwind_Backtrace (trace_function, &state); _Unwind_Backtrace (trace_function, &state);
} }
iexport(backtrace);
...@@ -126,7 +126,8 @@ backtrace_handler (int signum) ...@@ -126,7 +126,8 @@ backtrace_handler (int signum)
fatal_error_in_progress = 1; fatal_error_in_progress = 1;
show_signal (signum); show_signal (signum);
show_backtrace(); estr_write ("\nBacktrace for this error:\n");
backtrace ();
/* Now reraise the signal. We reactivate the signal's /* Now reraise the signal. We reactivate the signal's
default handling, which is to terminate the process. default handling, which is to terminate the process.
......
...@@ -166,7 +166,8 @@ sys_abort (void) ...@@ -166,7 +166,8 @@ sys_abort (void)
if (options.backtrace == 1 if (options.backtrace == 1
|| (options.backtrace == -1 && compile_options.backtrace == 1)) || (options.backtrace == -1 && compile_options.backtrace == 1))
{ {
show_backtrace (); estr_write ("\nProgram aborted. Backtrace:\n");
backtrace ();
signal (SIGABRT, SIG_DFL); signal (SIGABRT, SIG_DFL);
} }
......
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