mirror of git://gcc.gnu.org/git/gcc.git
re PR libfortran/29649 (Force core dump on runtime library errors)
2007-01-18 Francois-Xavier Coudert <coudert@clipper.ens.fr> Tobias Burnus <burnus@net-b.de> PR libfortran/29649 * gfortran.h (gfc_option_t): Add flag_dump_core. * lang.opt: Add -fdump-core option. * invoke.texi: Document the new options. * trans-decl.c (gfc_build_builtin_function_decls): Add new options to the call to set_std. * options.c (gfc_init_options, gfc_handle_option): Set the new options. 2007-01-18 Francois-Xavier Coudert <coudert@clipper.ens.fr> Tobias Burnus <burnus@net-b.de> PR libfortran/29649 * runtime/environ.c (variable_table): New GFORTRAN_ERROR_DUMPCORE environment variable. * runtime/compile_options.c (set_std): Add new argument. * runtime/error.c (sys_exit): Move from io/unix.c. Add coredump functionality. * libgfortran.h (options_t): New dump_core and backtrace members. (sys_exit): Move prototype. * io/unix.c (sys_exit): Move to runtime/error.c. * configure.ac: Add check for getrlimit. * configure: Regenerate. Co-Authored-By: Tobias Burnus <burnus@net-b.de> From-SVN: r120897
This commit is contained in:
parent
9521dd6bd1
commit
eedeea04da
|
@ -1,3 +1,15 @@
|
||||||
|
2007-01-18 Francois-Xavier Coudert <coudert@clipper.ens.fr>
|
||||||
|
Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR libfortran/29649
|
||||||
|
* gfortran.h (gfc_option_t): Add flag_dump_core.
|
||||||
|
* lang.opt: Add -fdump-core option.
|
||||||
|
* invoke.texi: Document the new options.
|
||||||
|
* trans-decl.c (gfc_build_builtin_function_decls): Add new
|
||||||
|
options to the call to set_std.
|
||||||
|
* options.c (gfc_init_options, gfc_handle_option): Set the
|
||||||
|
new options.
|
||||||
|
|
||||||
2007-01-17 Paul Thomas <pault@gcc.gnu.org>
|
2007-01-17 Paul Thomas <pault@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/30476
|
PR fortran/30476
|
||||||
|
|
|
@ -1656,6 +1656,7 @@ typedef struct
|
||||||
int flag_f2c;
|
int flag_f2c;
|
||||||
int flag_automatic;
|
int flag_automatic;
|
||||||
int flag_backslash;
|
int flag_backslash;
|
||||||
|
int flag_dump_core;
|
||||||
int flag_external_blas;
|
int flag_external_blas;
|
||||||
int blas_matmul_limit;
|
int blas_matmul_limit;
|
||||||
int flag_cray_pointer;
|
int flag_cray_pointer;
|
||||||
|
|
|
@ -121,7 +121,7 @@ by type. Explanations are in the following sections.
|
||||||
-ffixed-line-length-@var{n} -ffixed-line-length-none @gol
|
-ffixed-line-length-@var{n} -ffixed-line-length-none @gol
|
||||||
-ffree-line-length-@var{n} -ffree-line-length-none @gol
|
-ffree-line-length-@var{n} -ffree-line-length-none @gol
|
||||||
-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol
|
-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol
|
||||||
-fcray-pointer -fopenmp -frange-check }
|
-fcray-pointer -fopenmp -frange-check -fno-backslash }
|
||||||
|
|
||||||
@item Error and Warning Options
|
@item Error and Warning Options
|
||||||
@xref{Error and Warning Options,,Options to Request or Suppress Errors
|
@xref{Error and Warning Options,,Options to Request or Suppress Errors
|
||||||
|
@ -134,7 +134,8 @@ and Warnings}.
|
||||||
|
|
||||||
@item Debugging Options
|
@item Debugging Options
|
||||||
@xref{Debugging Options,,Options for Debugging Your Program or GCC}.
|
@xref{Debugging Options,,Options for Debugging Your Program or GCC}.
|
||||||
@gccoptlist{-fdump-parse-tree -ffpe-trap=@var{list}}
|
@gccoptlist{-fdump-parse-tree -ffpe-trap=@var{list}
|
||||||
|
-fdump-core}
|
||||||
|
|
||||||
@item Directory Options
|
@item Directory Options
|
||||||
@xref{Directory Options,,Options for Directory Search}.
|
@xref{Directory Options,,Options for Directory Search}.
|
||||||
|
@ -559,6 +560,15 @@ zero), @samp{overflow} (overflow in a floating point operation),
|
||||||
@samp{underflow} (underflow in a floating point operation),
|
@samp{underflow} (underflow in a floating point operation),
|
||||||
@samp{precision} (loss of precision during operation) and @samp{denormal}
|
@samp{precision} (loss of precision during operation) and @samp{denormal}
|
||||||
(operation produced a denormal value).
|
(operation produced a denormal value).
|
||||||
|
|
||||||
|
@cindex -fdump-core option
|
||||||
|
@cindex options, -fdump-core
|
||||||
|
@item -fdump-core
|
||||||
|
@cindex core
|
||||||
|
Request that a core-dump file is written to disk when a runtime error
|
||||||
|
is encountered on systems that support core dumps. This option is
|
||||||
|
only effective for the compilation of the Fortran main program.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@xref{Debugging Options,,Options for Debugging Your Program or GCC,
|
@xref{Debugging Options,,Options for Debugging Your Program or GCC,
|
||||||
|
|
|
@ -137,6 +137,10 @@ fdollar-ok
|
||||||
Fortran
|
Fortran
|
||||||
Allow dollar signs in entity names
|
Allow dollar signs in entity names
|
||||||
|
|
||||||
|
fdump-core
|
||||||
|
Fortran
|
||||||
|
Dump a core file when a runtime error occurs
|
||||||
|
|
||||||
fdump-parse-tree
|
fdump-parse-tree
|
||||||
Fortran
|
Fortran
|
||||||
Display the code tree after parsing
|
Display the code tree after parsing
|
||||||
|
|
|
@ -84,6 +84,7 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
|
||||||
gfc_option.flag_preprocessed = 0;
|
gfc_option.flag_preprocessed = 0;
|
||||||
gfc_option.flag_automatic = 1;
|
gfc_option.flag_automatic = 1;
|
||||||
gfc_option.flag_backslash = 1;
|
gfc_option.flag_backslash = 1;
|
||||||
|
gfc_option.flag_dump_core = 0;
|
||||||
gfc_option.flag_external_blas = 0;
|
gfc_option.flag_external_blas = 0;
|
||||||
gfc_option.blas_matmul_limit = 30;
|
gfc_option.blas_matmul_limit = 30;
|
||||||
gfc_option.flag_cray_pointer = 0;
|
gfc_option.flag_cray_pointer = 0;
|
||||||
|
@ -451,6 +452,10 @@ gfc_handle_option (size_t scode, const char *arg, int value)
|
||||||
gfc_option.flag_backslash = value;
|
gfc_option.flag_backslash = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPT_fdump_core:
|
||||||
|
gfc_option.flag_dump_core = value;
|
||||||
|
break;
|
||||||
|
|
||||||
case OPT_fcray_pointer:
|
case OPT_fcray_pointer:
|
||||||
gfc_option.flag_cray_pointer = value;
|
gfc_option.flag_cray_pointer = value;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2375,7 +2375,8 @@ gfc_build_builtin_function_decls (void)
|
||||||
gfor_fndecl_set_std =
|
gfor_fndecl_set_std =
|
||||||
gfc_build_library_function_decl (get_identifier (PREFIX("set_std")),
|
gfc_build_library_function_decl (get_identifier (PREFIX("set_std")),
|
||||||
void_type_node,
|
void_type_node,
|
||||||
3,
|
4,
|
||||||
|
gfc_int4_type_node,
|
||||||
gfc_int4_type_node,
|
gfc_int4_type_node,
|
||||||
gfc_int4_type_node,
|
gfc_int4_type_node,
|
||||||
gfc_int4_type_node);
|
gfc_int4_type_node);
|
||||||
|
@ -3143,6 +3144,10 @@ gfc_generate_function_code (gfc_namespace * ns)
|
||||||
arglist = gfc_chainon_list (arglist,
|
arglist = gfc_chainon_list (arglist,
|
||||||
build_int_cst (gfc_int4_type_node,
|
build_int_cst (gfc_int4_type_node,
|
||||||
pedantic));
|
pedantic));
|
||||||
|
arglist = gfc_chainon_list (arglist,
|
||||||
|
build_int_cst (gfc_int4_type_node,
|
||||||
|
gfc_option.flag_dump_core));
|
||||||
|
|
||||||
tmp = build_function_call_expr (gfor_fndecl_set_std, arglist);
|
tmp = build_function_call_expr (gfor_fndecl_set_std, arglist);
|
||||||
gfc_add_expr_to_block (&body, tmp);
|
gfc_add_expr_to_block (&body, tmp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,17 @@
|
||||||
|
2007-01-18 Francois-Xavier Coudert <coudert@clipper.ens.fr>
|
||||||
|
Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR libfortran/29649
|
||||||
|
* runtime/environ.c (variable_table): New GFORTRAN_ERROR_DUMPCORE
|
||||||
|
environment variable.
|
||||||
|
* runtime/compile_options.c (set_std): Add new argument.
|
||||||
|
* runtime/error.c (sys_exit): Move from io/unix.c. Add coredump functionality.
|
||||||
|
* libgfortran.h (options_t): New dump_core and backtrace members.
|
||||||
|
(sys_exit): Move prototype.
|
||||||
|
* io/unix.c (sys_exit): Move to runtime/error.c.
|
||||||
|
* configure.ac: Add check for getrlimit.
|
||||||
|
* configure: Regenerate.
|
||||||
|
|
||||||
2007-01-17 Tom Tromey <tromey@redhat.com>
|
2007-01-17 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
PR libgfortran/27107:
|
PR libgfortran/27107:
|
||||||
|
|
|
@ -10270,7 +10270,8 @@ done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_func in wait setmode
|
|
||||||
|
for ac_func in wait setmode getrlimit
|
||||||
do
|
do
|
||||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||||
|
|
|
@ -171,7 +171,7 @@ AC_CHECK_MEMBERS([struct stat.st_rdev])
|
||||||
AC_CHECK_FUNCS(getrusage times mkstemp strtof strtold snprintf ftruncate chsize)
|
AC_CHECK_FUNCS(getrusage times mkstemp strtof strtold snprintf ftruncate chsize)
|
||||||
AC_CHECK_FUNCS(chdir strerror getlogin gethostname kill link symlink perror)
|
AC_CHECK_FUNCS(chdir strerror getlogin gethostname kill link symlink perror)
|
||||||
AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl)
|
AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl)
|
||||||
AC_CHECK_FUNCS(wait setmode)
|
AC_CHECK_FUNCS(wait setmode getrlimit)
|
||||||
|
|
||||||
# Check for types
|
# Check for types
|
||||||
AC_CHECK_TYPES([intptr_t])
|
AC_CHECK_TYPES([intptr_t])
|
||||||
|
|
|
@ -363,15 +363,6 @@ get_oserror (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* sys_exit()-- Terminate the program with an exit code */
|
|
||||||
|
|
||||||
void
|
|
||||||
sys_exit (int code)
|
|
||||||
{
|
|
||||||
exit (code);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
File descriptor stream functions
|
File descriptor stream functions
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
|
@ -355,6 +355,7 @@ typedef struct
|
||||||
int fpu_round, fpu_precision, fpe;
|
int fpu_round, fpu_precision, fpe;
|
||||||
|
|
||||||
int sighup, sigint;
|
int sighup, sigint;
|
||||||
|
int dump_core;
|
||||||
}
|
}
|
||||||
options_t;
|
options_t;
|
||||||
|
|
||||||
|
@ -370,6 +371,7 @@ typedef struct
|
||||||
int allow_std;
|
int allow_std;
|
||||||
int pedantic;
|
int pedantic;
|
||||||
int convert;
|
int convert;
|
||||||
|
int dump_core;
|
||||||
size_t record_marker;
|
size_t record_marker;
|
||||||
int max_subrecord_length;
|
int max_subrecord_length;
|
||||||
}
|
}
|
||||||
|
@ -549,6 +551,9 @@ internal_proto(get_args);
|
||||||
#define GFC_OTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 1)
|
#define GFC_OTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 1)
|
||||||
#define GFC_BTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 8 + 1)
|
#define GFC_BTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 8 + 1)
|
||||||
|
|
||||||
|
extern void sys_exit (int) __attribute__ ((noreturn));
|
||||||
|
internal_proto(sys_exit);
|
||||||
|
|
||||||
extern const char *gfc_itoa (GFC_INTEGER_LARGEST, char *, size_t);
|
extern const char *gfc_itoa (GFC_INTEGER_LARGEST, char *, size_t);
|
||||||
internal_proto(gfc_itoa);
|
internal_proto(gfc_itoa);
|
||||||
|
|
||||||
|
@ -571,9 +576,6 @@ internal_proto(internal_error);
|
||||||
extern const char *get_oserror (void);
|
extern const char *get_oserror (void);
|
||||||
internal_proto(get_oserror);
|
internal_proto(get_oserror);
|
||||||
|
|
||||||
extern void sys_exit (int) __attribute__ ((noreturn));
|
|
||||||
internal_proto(sys_exit);
|
|
||||||
|
|
||||||
extern void st_sprintf (char *, const char *, ...)
|
extern void st_sprintf (char *, const char *, ...)
|
||||||
__attribute__ ((format (printf, 2, 3)));
|
__attribute__ ((format (printf, 2, 3)));
|
||||||
internal_proto(st_sprintf);
|
internal_proto(st_sprintf);
|
||||||
|
|
|
@ -37,17 +37,19 @@ compile_options_t compile_options;
|
||||||
|
|
||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
extern void set_std (GFC_INTEGER_4, GFC_INTEGER_4, GFC_INTEGER_4);
|
extern void set_std (GFC_INTEGER_4, GFC_INTEGER_4, GFC_INTEGER_4,
|
||||||
|
GFC_INTEGER_4);
|
||||||
export_proto(set_std);
|
export_proto(set_std);
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
set_std (GFC_INTEGER_4 warn_std, GFC_INTEGER_4 allow_std,
|
set_std (GFC_INTEGER_4 warn_std, GFC_INTEGER_4 allow_std,
|
||||||
GFC_INTEGER_4 pedantic)
|
GFC_INTEGER_4 pedantic, GFC_INTEGER_4 dump_core)
|
||||||
{
|
{
|
||||||
compile_options.pedantic = pedantic;
|
compile_options.pedantic = pedantic;
|
||||||
compile_options.warn_std = warn_std;
|
compile_options.warn_std = warn_std;
|
||||||
compile_options.allow_std = allow_std;
|
compile_options.allow_std = allow_std;
|
||||||
|
compile_options.dump_core = dump_core;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,6 +63,7 @@ init_compile_options (void)
|
||||||
compile_options.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
|
compile_options.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
|
||||||
| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU | GFC_STD_LEGACY;
|
| GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU | GFC_STD_LEGACY;
|
||||||
compile_options.pedantic = 0;
|
compile_options.pedantic = 0;
|
||||||
|
compile_options.dump_core = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function called by the front-end to tell us the
|
/* Function called by the front-end to tell us the
|
||||||
|
|
|
@ -537,6 +537,11 @@ static variable variable_table[] = {
|
||||||
{"GFORTRAN_CONVERT_UNIT", 0, 0, init_unformatted, show_string,
|
{"GFORTRAN_CONVERT_UNIT", 0, 0, init_unformatted, show_string,
|
||||||
"Set format for unformatted files", 0},
|
"Set format for unformatted files", 0},
|
||||||
|
|
||||||
|
/* Behaviour when encoutering a runtime error. */
|
||||||
|
{"GFORTRAN_ERROR_DUMPCORE", -1, &options.dump_core,
|
||||||
|
init_boolean, show_boolean,
|
||||||
|
"Dump a core file (if possible) on runtime error", -1},
|
||||||
|
|
||||||
{NULL, 0, NULL, NULL, NULL, NULL, 0}
|
{NULL, 0, NULL, NULL, NULL, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,67 @@ Boston, MA 02110-1301, USA. */
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_RESOURCE_H
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "libgfortran.h"
|
#include "libgfortran.h"
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#define HAVE_GETPID 1
|
||||||
|
#include <process.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* sys_exit()-- Terminate the program with an exit code. */
|
||||||
|
|
||||||
|
void
|
||||||
|
sys_exit (int code)
|
||||||
|
{
|
||||||
|
/* Dump core if requested. */
|
||||||
|
if (code != 0
|
||||||
|
&& (options.dump_core == 1
|
||||||
|
|| (options.dump_core == -1 && compile_options.dump_core == 1)))
|
||||||
|
{
|
||||||
|
#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
|
||||||
|
/* Warn if a core file cannot be produced because
|
||||||
|
of core size limit. */
|
||||||
|
|
||||||
|
struct rlimit core_limit;
|
||||||
|
|
||||||
|
if (getrlimit (RLIMIT_CORE, &core_limit) == 0 && core_limit.rlim_cur == 0)
|
||||||
|
st_printf ("** Warning: a core dump was requested, but the core size"
|
||||||
|
"limit\n** is currently zero.\n\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_KILL) && defined(HAVE_GETPID) && defined(SIGQUIT)
|
||||||
|
kill (getpid (), SIGQUIT);
|
||||||
|
#else
|
||||||
|
st_printf ("Core dump not possible, sorry.");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
exit (code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Error conditions. The tricky part here is printing a message when
|
/* Error conditions. The tricky part here is printing a message when
|
||||||
* it is the I/O subsystem that is severely wounded. Our goal is to
|
* it is the I/O subsystem that is severely wounded. Our goal is to
|
||||||
* try and print something making the fewest assumptions possible,
|
* try and print something making the fewest assumptions possible,
|
||||||
|
|
Loading…
Reference in New Issue