mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-01 11:59:27 +08:00
Eliminate catch_exceptions/catch_exceptions_with_msg
This patch gets rid of catch_exceptions / catch_exceptions_with_msg. The latter is done mostly by getting rid of the three remaining vestigial libgdb wrapper functions, which are really pointless nowadays. This results in a good number of simplifications. (I checked that Insight doesn't use those functions.) The gdb.mi/mi-pthreads.exp change is necessary because this actually fixes a bug, IMO -- the patch stops MI's -thread-select causing output on the CLI stream. I.e., before: -thread-select 123456789 &"Thread ID 123456789 not known.\n" ^error,msg="Thread ID 123456789 not known." (gdb) After: -thread-select 123456789 ^error,msg="Thread ID 123456789 not known." (gdb) gdb/ChangeLog 2017-10-10 Pedro Alves <palves@redhat.com> Tom Tromey <tom@tromey.com> * breakpoint.c (struct captured_breakpoint_query_args) (do_captured_breakpoint_query, gdb_breakpoint_query): Delete. (print_breakpoint): New. * breakpoint.h (print_breakpoint): Declare. * common/common-exceptions.h (enum return_reason): Remove references to catch_exceptions. * exceptions.c (catch_exceptions, catch_exceptions_with_msg): Delete. * exceptions.h (catch_exceptions_ftype, catch_exceptions) (catch_exception_ftype, catch_exceptions_with_msg): Delete. * gdb.h: Delete. * gdbthread.h (thread_select): Declare. * mi/mi-cmd-break.c: Don't include gdb.h. (breakpoint_notify): Use print_breakpoint. * mi/mi-cmd-catch.c: Don't include gdb.h. * mi/mi-interp.c: Don't include gdb.h. (mi_print_breakpoint_for_event): New. (mi_breakpoint_created, mi_breakpoint_modified): Use mi_print_breakpoint_for_event. * mi/mi-main.c: Don't include gdb.h. (mi_cmd_thread_select): Parse the global thread ID here. Use thread_select instead of gdb_thread_select. (mi_cmd_thread_list_ids): Output "thread-ids" tuple here instead of using gdb_list_thread_ids. * remote-fileio.c (do_remote_fileio_request): Change type. Reply FILEIO_ENOSYS here. (remote_fileio_request): Use TRY/CATCH instead of catch_exceptions. * symfile-mem.c (struct symbol_file_add_from_memory_args) (symbol_file_add_from_memory_wrapper): Delete. (add_vsyscall_page): Use TRY/CATCH instead of catch_exceptions. * thread.c: Don't include gdb.h. (do_captured_list_thread_ids, gdb_list_thread_ids): Delete. (thread_alive): Use thread_select. (do_captured_thread_select): Delete, parts salvaged as ... (thread_select): ... this new function. (gdb_thread_select): Delete. gdb/testsuite/ChangeLog 2017-10-10 Pedro Alves <palves@redhat.com> * gdb.mi/mi-pthreads.exp (check_mi_thread_command_set): Don't expect CLI output.
This commit is contained in:
@ -134,89 +134,6 @@ exception_fprintf (struct ui_file *file, struct gdb_exception e,
|
||||
}
|
||||
}
|
||||
|
||||
/* Call FUNC(UIOUT, FUNC_ARGS) but wrapped within an exception
|
||||
handler. If an exception (enum return_reason) is thrown using
|
||||
throw_exception() than all cleanups installed since
|
||||
catch_exceptions() was entered are invoked, the (-ve) exception
|
||||
value is then returned by catch_exceptions. If FUNC() returns
|
||||
normally (with a positive or zero return value) then that value is
|
||||
returned by catch_exceptions(). It is an internal_error() for
|
||||
FUNC() to return a negative value.
|
||||
|
||||
See exceptions.h for further usage details. */
|
||||
|
||||
/* MAYBE: cagney/1999-11-05: catch_errors() in conjunction with
|
||||
error() et al. could maintain a set of flags that indicate the
|
||||
current state of each of the longjmp buffers. This would give the
|
||||
longjmp code the chance to detect a longjmp botch (before it gets
|
||||
to longjmperror()). Prior to 1999-11-05 this wasn't possible as
|
||||
code also randomly used a SET_TOP_LEVEL macro that directly
|
||||
initialized the longjmp buffers. */
|
||||
|
||||
int
|
||||
catch_exceptions (struct ui_out *uiout,
|
||||
catch_exceptions_ftype *func,
|
||||
void *func_args,
|
||||
return_mask mask)
|
||||
{
|
||||
return catch_exceptions_with_msg (uiout, func, func_args, NULL, mask);
|
||||
}
|
||||
|
||||
int
|
||||
catch_exceptions_with_msg (struct ui_out *func_uiout,
|
||||
catch_exceptions_ftype *func,
|
||||
void *func_args,
|
||||
char **gdberrmsg,
|
||||
return_mask mask)
|
||||
{
|
||||
struct gdb_exception exception = exception_none;
|
||||
volatile int val = 0;
|
||||
struct ui_out *saved_uiout;
|
||||
|
||||
/* Save and override the global ``struct ui_out'' builder. */
|
||||
saved_uiout = current_uiout;
|
||||
current_uiout = func_uiout;
|
||||
|
||||
TRY
|
||||
{
|
||||
val = (*func) (current_uiout, func_args);
|
||||
}
|
||||
CATCH (ex, RETURN_MASK_ALL)
|
||||
{
|
||||
exception = ex;
|
||||
}
|
||||
END_CATCH
|
||||
|
||||
/* Restore the global builder. */
|
||||
current_uiout = saved_uiout;
|
||||
|
||||
if (exception.reason < 0 && (mask & RETURN_MASK (exception.reason)) == 0)
|
||||
{
|
||||
/* The caller didn't request that the event be caught.
|
||||
Rethrow. */
|
||||
throw_exception (exception);
|
||||
}
|
||||
|
||||
exception_print (gdb_stderr, exception);
|
||||
gdb_assert (val >= 0);
|
||||
gdb_assert (exception.reason <= 0);
|
||||
if (exception.reason < 0)
|
||||
{
|
||||
/* If caller wants a copy of the low-level error message, make
|
||||
one. This is used in the case of a silent error whereby the
|
||||
caller may optionally want to issue the message. */
|
||||
if (gdberrmsg != NULL)
|
||||
{
|
||||
if (exception.message != NULL)
|
||||
*gdberrmsg = xstrdup (exception.message);
|
||||
else
|
||||
*gdberrmsg = NULL;
|
||||
}
|
||||
return exception.reason;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
/* See exceptions.h. */
|
||||
|
||||
int
|
||||
|
Reference in New Issue
Block a user