diagnostic.c (real_abort): New.
authorGeoffrey Keating <geoffk@apple.com>
Wed, 12 Feb 2003 01:05:47 +0000 (01:05 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Wed, 12 Feb 2003 01:05:47 +0000 (01:05 +0000)
* diagnostic.c (real_abort): New.
(diagnostic_report_diagnostic): Call real_abort on error.
* diagnostic.h (diagnostic_abort_on_error): New.
(struct diagnostic_context): Add abort_on_error field.
* toplev.c (setup_core_dumping): New.
(decode_d_option): Handle 'H' case.
* doc/invoke.texi (Debugging Options): Document -dH.

From-SVN: r62753

gcc/ChangeLog
gcc/diagnostic.c
gcc/diagnostic.h
gcc/doc/invoke.texi
gcc/toplev.c

index 7190341a7f8b4b8e976e774e75a24f58936301c8..96d364e7c8781cac51c014baaebc8e1f5798bf52 100644 (file)
@@ -1,3 +1,13 @@
+2003-02-11  Geoffrey Keating  <geoffk@apple.com>
+
+       * diagnostic.c (real_abort): New.
+       (diagnostic_report_diagnostic): Call real_abort on error.
+       * diagnostic.h (diagnostic_abort_on_error): New.
+       (struct diagnostic_context): Add abort_on_error field.
+       * toplev.c (setup_core_dumping): New.
+       (decode_d_option): Handle 'H' case.
+       * doc/invoke.texi (Debugging Options): Document -dH.
+
 2003-02-11  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        * Makefile.in: Remove pointless setting of CXXFLAGS for dejagnu
index a192229bd59f6a6f9749bd5577feeec40bd076c3..21d78a95dc5cda89eeff678f7ba73cac5a713f2f 100644 (file)
@@ -81,6 +81,7 @@ static void default_diagnostic_finalizer PARAMS ((diagnostic_context *,
 
 static void error_recursion PARAMS ((diagnostic_context *)) ATTRIBUTE_NORETURN;
 static bool text_specifies_location PARAMS ((text_info *, location_t *));
+static void real_abort PARAMS ((void)) ATTRIBUTE_NORETURN;
 
 extern int rtl_dump_and_exit;
 extern int warnings_are_errors;
@@ -1283,6 +1284,8 @@ diagnostic_report_diagnostic (context, diagnostic)
       output_flush (&context->buffer);
     }
 
+  if (context->abort_on_error && diagnostic->kind <= DK_ERROR)
+    real_abort();
   --context->lock;
 }
 
@@ -1459,3 +1462,13 @@ warn_deprecated_use (node)
        warning ("type is deprecated");
     }
 }
+
+/* Really call the system 'abort'.  This has to go right at the end of
+   this file, so that there are no functions after it that call abort
+   and get the system abort instead of our macro.  */
+#undef abort
+static void 
+real_abort ()
+{
+  abort ();
+}
index 2bb0f8af3491e0503b3d36cd7536d1a527e2a51e..2c822fc16174c3a59d335ee88388b313a7d09604 100644 (file)
@@ -1,5 +1,5 @@
 /* Various declarations for language-independent diagnostics subroutines.
-   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
 
 This file is part of GCC.
@@ -190,6 +190,9 @@ struct diagnostic_context
      message, usually displayed once per compiler run.  */
   bool warnings_are_errors_message;
 
+  /* True if we should raise a SIGABRT on errors.  */
+  bool abort_on_error;
+
   /* This function is called before any message is printed out.  It is
      responsible for preparing message prefix and such.  For example, it
      might say:
@@ -259,12 +262,16 @@ struct diagnostic_context
 #define diagnostic_set_last_module(DC) \
   (DC)->last_module = input_file_stack_tick
 
+/* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher.  */
+#define diagnostic_abort_on_error(DC) \
+  (DC)->abort_on_error = true
+
 /* This diagnostic_context is used by front-ends that directly output
    diagnostic messages without going through `error', `warning',
    and similar functions.  */
 extern diagnostic_context *global_dc;
 
-/* The total count of a KIND of diagnostics meitted so far.  */
+/* The total count of a KIND of diagnostics emitted so far.  */
 #define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)]
 
 /* The number of errors that have been issued so far.  Ideally, these
index 6ebc5556fa97421fc4f1c246389db085afaca04b..0e0a0ea91a14f20653cbe51f9a37d0ef42b7ea91 100644 (file)
@@ -3216,6 +3216,9 @@ Dump after the peephole pass, to @file{@var{file}.27.peephole2}.
 @item a
 @opindex da
 Produce all the dumps listed above.
+@item H
+@opindex dH
+Produce a core dump whenever an error occurs.
 @item m
 @opindex dm
 Print statistics on memory usage, at the end of the run, to
index a4cd1df45887cd214d4e77cbff34751318d01558..38cff5b12d7e8d905f0df2e601a8467acb68fe48 100644 (file)
@@ -113,6 +113,7 @@ static void finalize PARAMS ((void));
 static void set_target_switch PARAMS ((const char *));
 
 static void crash_signal PARAMS ((int)) ATTRIBUTE_NORETURN;
+static void setup_core_dumping PARAMS ((void));
 static void compile_file PARAMS ((void));
 static void display_help PARAMS ((void));
 static void display_target_options PARAMS ((void));
@@ -1693,6 +1694,29 @@ crash_signal (signo)
   internal_error ("%s", strsignal (signo));
 }
 
+/* Arrange to dump core on error.  (The regular error message is still
+   printed first, except in the case of abort().)  */
+
+static void
+setup_core_dumping ()
+{
+#ifdef SIGABRT
+  signal (SIGABRT, SIG_DFL);
+#endif
+#if defined(HAVE_SETRLIMIT)
+  {
+    struct rlimit rlim;
+    if (getrlimit (RLIMIT_CORE, &rlim) != 0)
+      fatal_io_error ("getting core file size maximum limit");
+    rlim.rlim_cur = rlim.rlim_max;
+    if (setrlimit (RLIMIT_CORE, &rlim) != 0)
+      fatal_io_error ("setting core file size limit to maximum");
+  }
+#endif
+  diagnostic_abort_on_error (global_dc);
+}
+
+
 /* Strip off a legitimate source ending from the input string NAME of
    length LEN.  Rather than having to know the names used by all of
    our front ends, we strip off an ending of a period followed by
@@ -3953,6 +3977,9 @@ decode_d_option (arg)
       case 'D':        /* These are handled by the preprocessor.  */
       case 'I':
        break;
+      case 'H':
+       setup_core_dumping();
+       break;
 
       default:
        matched = 0;