Rationalize "fatal" error handling outside of gdbserver
authorGary Benson <gbenson@redhat.com>
Wed, 23 Jul 2014 13:51:26 +0000 (14:51 +0100)
committerGary Benson <gbenson@redhat.com>
Thu, 24 Jul 2014 08:55:50 +0000 (09:55 +0100)
GDB and gdbserver have functions named "fatal" that are used in
completely different ways.  In gdbserver "fatal" is used to handle
critical errors: it differs from "error" in that "fatal" causes
gdbserver to exit whereas "error" does not.  In GDB "fatal" is used
to abort the current operation and return to the command level.
This is implemented by throwing a non-error "RETURN_QUIT" exception.

This commit removes GDB's "fatal" and "vfatal" functions entirely.
The exception-throwing function "throw_vfatal" is renamed as
"throw_vquit", and a new convenience function "throw_quit" is added.
The small number of calls to "fatal" are replaced with calls to
"throw_quit", making what is happening more obvious.

This commit also modifies GDB's "throw_error" to call "throw_verror"
rather than calling "throw_it" directly.  This change means the
assignment of RETURN_ERROR as the exception type now happens in
precisely one place in GDB rather than two.

gdb/
2014-07-24  Gary Benson  <gbenson@redhat.com>

* exceptions.h (throw_vfatal): Renamed to...
(throw_vquit): New declaration.
(throw_quit): Likewise.
* exceptions.c (throw_vfatal): Renamed to...
(throw_vquit): New function.
(throw_quit): Likewise.
(throw_error): Call throw_verror rather than throw_it.
* utils.h (vfatal): Removed.
(fatal): Likewise.
* utils.c (vfatal): Removed.
(fatal): Likewise.
(internal_verror): Replaced call to fatal with call to throw_quit.
(quit): Replaced calls to fatal with calls to throw_quit.

gdb/ChangeLog
gdb/exceptions.c
gdb/exceptions.h
gdb/utils.c
gdb/utils.h

index 02f5e92dfbb10fab977a4f282c1174478f4fd3dc..befc09e9bfe45dd9bed50a0753156df594c968bb 100644 (file)
@@ -1,3 +1,19 @@
+2014-07-24  Gary Benson  <gbenson@redhat.com>
+
+       * exceptions.h (throw_vfatal): Renamed to...
+       (throw_vquit): New declaration.
+       (throw_quit): Likewise.
+       * exceptions.c (throw_vfatal): Renamed to...
+       (throw_vquit): New function.
+       (throw_quit): Likewise.
+       (throw_error): Call throw_verror rather than throw_it.
+       * utils.h (vfatal): Removed.
+       (fatal): Likewise.
+       * utils.c (vfatal): Removed.
+       (fatal): Likewise.
+       (internal_verror): Replaced call to fatal with call to throw_quit.
+       (quit): Replaced calls to fatal with calls to throw_quit.
+
 2014-07-23  Ajit Agarwal <ajitkum@xilinx.com>
 
        * microblaze-tdep.c (microblaze_fetch_instruction): Use of
index def1f41b910d41d604015e04674f5266697659c0..ddaf250973a6e8a7160471adf77d0c55e0aa1dc5 100644 (file)
@@ -390,7 +390,7 @@ throw_verror (enum errors error, const char *fmt, va_list ap)
 }
 
 void
-throw_vfatal (const char *fmt, va_list ap)
+throw_vquit (const char *fmt, va_list ap)
 {
   throw_it (RETURN_QUIT, GDB_NO_ERROR, fmt, ap);
 }
@@ -401,7 +401,17 @@ throw_error (enum errors error, const char *fmt, ...)
   va_list args;
 
   va_start (args, fmt);
-  throw_it (RETURN_ERROR, error, fmt, args);
+  throw_verror (error, fmt, args);
+  va_end (args);
+}
+
+void
+throw_quit (const char *fmt, ...)
+{
+  va_list args;
+
+  va_start (args, fmt);
+  throw_vquit (fmt, args);
   va_end (args);
 }
 
index e5e1a493d81b2900768a3e69a675234f964eba86..be74ad5b795884b457f2a5b38eea4da48e895fbd 100644 (file)
@@ -191,10 +191,12 @@ extern void throw_exception (struct gdb_exception exception)
      ATTRIBUTE_NORETURN;
 extern void throw_verror (enum errors, const char *fmt, va_list ap)
      ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 0);
-extern void throw_vfatal (const char *fmt, va_list ap)
+extern void throw_vquit (const char *fmt, va_list ap)
      ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 0);
 extern void throw_error (enum errors error, const char *fmt, ...)
      ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 3);
+extern void throw_quit (const char *fmt, ...)
+     ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 2);
 
 /* Call FUNC(UIOUT, FUNC_ARGS) but wrapped within an exception
    handler.  If an exception (enum return_reason) is thrown using
index a9e8196ee07af13306e165fa1ce805ed38ac9742..8af8827bbe54d45ce8e7e4a9f6f8ae6a5d119359 100644 (file)
@@ -569,26 +569,6 @@ error (const char *string, ...)
   va_end (args);
 }
 
-/* Print an error message and quit.
-   The first argument STRING is the error message, used as a fprintf string,
-   and the remaining args are passed as arguments to it.  */
-
-void
-vfatal (const char *string, va_list args)
-{
-  throw_vfatal (string, args);
-}
-
-void
-fatal (const char *string, ...)
-{
-  va_list args;
-
-  va_start (args, string);
-  throw_vfatal (string, args);
-  va_end (args);
-}
-
 void
 error_stream (struct ui_file *stream)
 {
@@ -833,7 +813,7 @@ void
 internal_verror (const char *file, int line, const char *fmt, va_list ap)
 {
   internal_vproblem (&internal_error_problem, file, line, fmt, ap);
-  fatal (_("Command aborted."));
+  throw_quit (_("Command aborted."));
 }
 
 void
@@ -1090,15 +1070,15 @@ quit (void)
 #ifdef __MSDOS__
   /* No steenking SIGINT will ever be coming our way when the
      program is resumed.  Don't lie.  */
-  fatal ("Quit");
+  throw_quit ("Quit");
 #else
   if (job_control
       /* If there is no terminal switching for this target, then we can't
          possibly get screwed by the lack of job control.  */
       || !target_supports_terminal_ours ())
-    fatal ("Quit");
+    throw_quit ("Quit");
   else
-    fatal ("Quit (expect signal SIGINT when the program is resumed)");
+    throw_quit ("Quit (expect signal SIGINT when the program is resumed)");
 #endif
 }
 
index a91f5510f439f6e3cef5bb2b232c905621263994..cc79562c8e7b7adffb360ad01da60c02bb10b4d3 100644 (file)
@@ -291,12 +291,6 @@ extern void error (const char *fmt, ...)
 
 extern void error_stream (struct ui_file *) ATTRIBUTE_NORETURN;
 
-extern void vfatal (const char *fmt, va_list ap)
-     ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 0);
-
-extern void fatal (const char *fmt, ...)
-     ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 2);
-
 extern void internal_verror (const char *file, int line, const char *,
                             va_list ap)
      ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 0);