Rationalize "fatal" error handling outside of gdbserver
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.
This commit is contained in:
parent
342119630e
commit
2c51604d3a
5 changed files with 35 additions and 33 deletions
|
@ -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>
|
2014-07-23 Ajit Agarwal <ajitkum@xilinx.com>
|
||||||
|
|
||||||
* microblaze-tdep.c (microblaze_fetch_instruction): Use of
|
* microblaze-tdep.c (microblaze_fetch_instruction): Use of
|
||||||
|
|
|
@ -390,7 +390,7 @@ throw_verror (enum errors error, const char *fmt, va_list ap)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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);
|
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_list args;
|
||||||
|
|
||||||
va_start (args, fmt);
|
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);
|
va_end (args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -191,10 +191,12 @@ extern void throw_exception (struct gdb_exception exception)
|
||||||
ATTRIBUTE_NORETURN;
|
ATTRIBUTE_NORETURN;
|
||||||
extern void throw_verror (enum errors, const char *fmt, va_list ap)
|
extern void throw_verror (enum errors, const char *fmt, va_list ap)
|
||||||
ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 0);
|
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);
|
ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 0);
|
||||||
extern void throw_error (enum errors error, const char *fmt, ...)
|
extern void throw_error (enum errors error, const char *fmt, ...)
|
||||||
ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 3);
|
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
|
/* Call FUNC(UIOUT, FUNC_ARGS) but wrapped within an exception
|
||||||
handler. If an exception (enum return_reason) is thrown using
|
handler. If an exception (enum return_reason) is thrown using
|
||||||
|
|
28
gdb/utils.c
28
gdb/utils.c
|
@ -569,26 +569,6 @@ error (const char *string, ...)
|
||||||
va_end (args);
|
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
|
void
|
||||||
error_stream (struct ui_file *stream)
|
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_verror (const char *file, int line, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
internal_vproblem (&internal_error_problem, file, line, fmt, ap);
|
internal_vproblem (&internal_error_problem, file, line, fmt, ap);
|
||||||
fatal (_("Command aborted."));
|
throw_quit (_("Command aborted."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1090,15 +1070,15 @@ quit (void)
|
||||||
#ifdef __MSDOS__
|
#ifdef __MSDOS__
|
||||||
/* No steenking SIGINT will ever be coming our way when the
|
/* No steenking SIGINT will ever be coming our way when the
|
||||||
program is resumed. Don't lie. */
|
program is resumed. Don't lie. */
|
||||||
fatal ("Quit");
|
throw_quit ("Quit");
|
||||||
#else
|
#else
|
||||||
if (job_control
|
if (job_control
|
||||||
/* If there is no terminal switching for this target, then we can't
|
/* If there is no terminal switching for this target, then we can't
|
||||||
possibly get screwed by the lack of job control. */
|
possibly get screwed by the lack of job control. */
|
||||||
|| !target_supports_terminal_ours ())
|
|| !target_supports_terminal_ours ())
|
||||||
fatal ("Quit");
|
throw_quit ("Quit");
|
||||||
else
|
else
|
||||||
fatal ("Quit (expect signal SIGINT when the program is resumed)");
|
throw_quit ("Quit (expect signal SIGINT when the program is resumed)");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -291,12 +291,6 @@ extern void error (const char *fmt, ...)
|
||||||
|
|
||||||
extern void error_stream (struct ui_file *) ATTRIBUTE_NORETURN;
|
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 *,
|
extern void internal_verror (const char *file, int line, const char *,
|
||||||
va_list ap)
|
va_list ap)
|
||||||
ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 0);
|
ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (3, 0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue