From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2775 invoked by alias); 6 Jan 2007 10:21:26 -0000 Received: (qmail 2757 invoked by uid 22791); 6 Jan 2007 10:21:24 -0000 X-Spam-Check-By: sourceware.org Received: from zs04.physik.fu-berlin.de (HELO zs04.physik.fu-berlin.de) (160.45.35.155) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 06 Jan 2007 10:21:12 +0000 Received: from ith.physik.fu-berlin.de ([160.45.32.115] helo=[127.0.0.1]) by zs04.physik.fu-berlin.de with esmtp (Exim 4.63) (envelope-from ) id 1H38fl-0005qz-ET; Sat, 06 Jan 2007 11:21:09 +0100 Message-ID: <459F7814.5020808@net-b.de> Date: Sat, 06 Jan 2007 10:21:00 -0000 From: Tobias Burnus User-Agent: Thunderbird 1.5.0.8 (X11/20060911) MIME-Version: 1.0 To: gcc-patches , burnus@net-b.de Subject: Re: [patch,fortran] Add -fdump-core option to coredump at library run-time errors (PR29649) References: <459EC21E.7070204@net-b.de> <6113E044-201A-4840-8134-FAE8C096A185@gmail.com> In-Reply-To: <6113E044-201A-4840-8134-FAE8C096A185@gmail.com> Content-Type: multipart/mixed; boundary="------------040206040100000703040108" X-Scanned: No viruses found. Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2007-01/txt/msg00454.txt.bz2 This is a multi-part message in MIME format. --------------040206040100000703040108 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 1232 FX Coudert schrieb: >> 2006-11-24 Francois-Xavier Coudert >> Tobias Burnus >> >> PR fortran/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. >> >> >> fortran/ >> 2006-11-24 Francois-Xavier Coudert >> Tobias Burnus >> >> PR fortran/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. >> > > I believe you forgot the patch itself :) Good point! Tobias --------------040206040100000703040108 Content-Type: text/x-patch; name="core-dump.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="core-dump.diff" Content-length: 9803 Index: libgfortran/runtime/environ.c =================================================================== --- libgfortran/runtime/environ.c (Revision 120491) +++ libgfortran/runtime/environ.c (Arbeitskopie) @@ -538,6 +538,11 @@ unformatted I/O. */ {"GFORTRAN_CONVERT_UNIT", 0, 0, init_unformatted, show_string, "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} }; Index: libgfortran/runtime/compile_options.c =================================================================== --- libgfortran/runtime/compile_options.c (Revision 120491) +++ libgfortran/runtime/compile_options.c (Arbeitskopie) @@ -37,17 +37,19 @@ /* 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); void 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.warn_std = warn_std; compile_options.allow_std = allow_std; + compile_options.dump_core = dump_core; } @@ -61,6 +63,7 @@ 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; compile_options.pedantic = 0; + compile_options.dump_core = 0; } /* Function called by the front-end to tell us the Index: libgfortran/runtime/error.c =================================================================== --- libgfortran/runtime/error.c (Revision 120491) +++ libgfortran/runtime/error.c (Arbeitskopie) @@ -36,10 +36,69 @@ #include #include +#ifdef HAVE_SIGNAL_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +#ifdef HAVE_SYS_TIME_H +#include +#endif + #include "libgfortran.h" #include "../io/io.h" #include "../io/unix.h" +#ifdef __MINGW32__ +#define HAVE_GETPID 1 +#include +#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 * it is the I/O subsystem that is severely wounded. Our goal is to * try and print something making the fewest assumptions possible, Index: libgfortran/libgfortran.h =================================================================== --- libgfortran/libgfortran.h (Revision 120491) +++ libgfortran/libgfortran.h (Arbeitskopie) @@ -354,6 +354,7 @@ int fpu_round, fpu_precision, fpe; int sighup, sigint; + int dump_core; } options_t; @@ -369,6 +370,7 @@ int allow_std; int pedantic; int convert; + int dump_core; size_t record_marker; int max_subrecord_length; } @@ -493,6 +495,9 @@ #define GFC_OTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 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); internal_proto(gfc_itoa); @@ -515,9 +520,6 @@ extern const char *get_oserror (void); internal_proto(get_oserror); -extern void sys_exit (int) __attribute__ ((noreturn)); -internal_proto(sys_exit); - extern int st_printf (const char *, ...) __attribute__ ((format (printf, 1, 2))); internal_proto(st_printf); Index: libgfortran/configure.ac =================================================================== --- libgfortran/configure.ac (Revision 120491) +++ libgfortran/configure.ac (Arbeitskopie) @@ -172,7 +172,7 @@ 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(sleep time ttyname signal alarm ctime clock access fork execl) -AC_CHECK_FUNCS(wait setmode) +AC_CHECK_FUNCS(wait setmode getrlimit) # Check for types AC_CHECK_TYPES([intptr_t]) Index: libgfortran/io/unix.c =================================================================== --- libgfortran/io/unix.c (Revision 120491) +++ libgfortran/io/unix.c (Arbeitskopie) @@ -327,15 +327,6 @@ } -/* sys_exit()-- Terminate the program with an exit code */ - -void -sys_exit (int code) -{ - exit (code); -} - - /********************************************************************* File descriptor stream functions *********************************************************************/ Index: gcc/fortran/gfortran.h =================================================================== --- gcc/fortran/gfortran.h (Revision 120491) +++ gcc/fortran/gfortran.h (Arbeitskopie) @@ -1656,6 +1656,7 @@ int flag_f2c; int flag_automatic; int flag_backslash; + int flag_dump_core; int flag_external_blas; int blas_matmul_limit; int flag_cray_pointer; Index: gcc/fortran/lang.opt =================================================================== --- gcc/fortran/lang.opt (Revision 120491) +++ gcc/fortran/lang.opt (Arbeitskopie) @@ -133,6 +133,10 @@ Fortran Allow dollar signs in entity names +fdump-core +Fortran +Dump a core file when a runtime error occurs + fdump-parse-tree Fortran Display the code tree after parsing Index: gcc/fortran/invoke.texi =================================================================== --- gcc/fortran/invoke.texi (Revision 120491) +++ gcc/fortran/invoke.texi (Arbeitskopie) @@ -121,7 +121,7 @@ -ffixed-line-length-@var{n} -ffixed-line-length-none @gol -ffree-line-length-@var{n} -ffree-line-length-none @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 @xref{Error and Warning Options,,Options to Request or Suppress Errors @@ -134,7 +134,8 @@ @item Debugging Options @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 @xref{Directory Options,,Options for Directory Search}. @@ -559,6 +560,15 @@ @samp{underflow} (underflow in a floating point operation), @samp{precision} (loss of precision during operation) and @samp{denormal} (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 @xref{Debugging Options,,Options for Debugging Your Program or GCC, Index: gcc/fortran/trans-decl.c =================================================================== --- gcc/fortran/trans-decl.c (Revision 120491) +++ gcc/fortran/trans-decl.c (Arbeitskopie) @@ -2374,9 +2374,10 @@ gfor_fndecl_set_std = gfc_build_library_function_decl (get_identifier (PREFIX("set_std")), void_type_node, - 3, + 4, gfc_int4_type_node, gfc_int4_type_node, + gfc_int4_type_node, gfc_int4_type_node); gfor_fndecl_set_convert = @@ -3142,6 +3143,10 @@ arglist = gfc_chainon_list (arglist, build_int_cst (gfc_int4_type_node, 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); gfc_add_expr_to_block (&body, tmp); } Index: gcc/fortran/options.c =================================================================== --- gcc/fortran/options.c (Revision 120491) +++ gcc/fortran/options.c (Arbeitskopie) @@ -83,6 +83,7 @@ gfc_option.flag_preprocessed = 0; gfc_option.flag_automatic = 1; gfc_option.flag_backslash = 1; + gfc_option.flag_dump_core = 0; gfc_option.flag_external_blas = 0; gfc_option.blas_matmul_limit = 30; gfc_option.flag_cray_pointer = 0; @@ -446,6 +447,10 @@ gfc_option.flag_backslash = value; break; + case OPT_fdump_core: + gfc_option.flag_dump_core = value; + break; + case OPT_fcray_pointer: gfc_option.flag_cray_pointer = value; break; Index: configure =================================================================== --- configure (Revision 120496) +++ configure (Arbeitskopie) @@ -10095,7 +10095,8 @@ -for ac_func in wait setmode + +for ac_func in wait setmode getrlimit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 --------------040206040100000703040108--