OSDN Git Service

2007-01-18 Francois-Xavier Coudert <coudert@clipper.ens.fr>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Jan 2007 12:54:11 +0000 (12:54 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Jan 2007 12:54:11 +0000 (12:54 +0000)
            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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120897 138bc75d-0d04-0410-961f-82ee72b054a4

14 files changed:
gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/invoke.texi
gcc/fortran/lang.opt
gcc/fortran/options.c
gcc/fortran/trans-decl.c
libgfortran/ChangeLog
libgfortran/configure
libgfortran/configure.ac
libgfortran/io/unix.c
libgfortran/libgfortran.h
libgfortran/runtime/compile_options.c
libgfortran/runtime/environ.c
libgfortran/runtime/error.c

index 9dcead3..55c5ece 100644 (file)
@@ -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>
 
        PR fortran/30476
index 695d26d..64739fb 100644 (file)
@@ -1656,6 +1656,7 @@ typedef struct
   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 42f3b5e..9a9a008 100644 (file)
@@ -121,7 +121,7 @@ by type.  Explanations are in the following sections.
 -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 @@ and Warnings}.
 
 @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 @@ zero), @samp{overflow} (overflow in a floating point operation),
 @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 b744424..2991f7f 100644 (file)
@@ -137,6 +137,10 @@ fdollar-ok
 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 e26ff36..cd937da 100644 (file)
@@ -84,6 +84,7 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
   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;
@@ -451,6 +452,10 @@ gfc_handle_option (size_t scode, const char *arg, int value)
       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 44ccbcc..000772c 100644 (file)
@@ -2375,7 +2375,8 @@ gfc_build_builtin_function_decls (void)
   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);
@@ -3143,6 +3144,10 @@ gfc_generate_function_code (gfc_namespace * ns)
       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 2efc5ce..5295968 100644 (file)
@@ -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>
 
        PR libgfortran/27107:
index 5ee295a..30b3eb2 100755 (executable)
@@ -10270,7 +10270,8 @@ done
 
 
 
-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
index a4a9b39..d97360f 100644 (file)
@@ -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(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 aa1dd1f..08f3287 100644 (file)
@@ -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
 *********************************************************************/
index dc93b2f..af53e48 100644 (file)
@@ -355,6 +355,7 @@ typedef struct
   int fpu_round, fpu_precision, fpe;
 
   int sighup, sigint;
+  int dump_core;
 }
 options_t;
 
@@ -370,6 +371,7 @@ typedef struct
   int allow_std;
   int pedantic;
   int convert;
+  int dump_core;
   size_t record_marker;
   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_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);
 
@@ -571,9 +576,6 @@ internal_proto(internal_error);
 extern const char *get_oserror (void);
 internal_proto(get_oserror);
 
-extern void sys_exit (int) __attribute__ ((noreturn));
-internal_proto(sys_exit);
-
 extern void st_sprintf (char *, const char *, ...)
   __attribute__ ((format (printf, 2, 3)));
 internal_proto(st_sprintf);
index b2aef05..06ebc4d 100644 (file)
@@ -37,17 +37,19 @@ compile_options_t compile_options;
 
 
 /* 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 @@ init_compile_options (void)
   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 21c2cc9..cc3be21 100644 (file)
@@ -537,6 +537,11 @@ static variable variable_table[] = {
   {"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 c0787de..e6713d2 100644 (file)
@@ -36,8 +36,67 @@ Boston, MA 02110-1301, USA.  */
 #include <float.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"
 
+#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
  * it is the I/O subsystem that is severely wounded.  Our goal is to
  * try and print something making the fewest assumptions possible,