From 6c63c96a22d216fb5d51c5d93646066d29e08ea1 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Sat, 7 Mar 2015 14:50:05 +0000 Subject: [PATCH] more making TRY/CATCH callers look more like real C++ try/catch blocks All these were caught by actually making TRY/CATCH use try/catch behind the scenes, which then resulted in the build failing (on x86_64 Fedora 20) because there was code between the try and catch blocks. gdb/ChangeLog: 2015-03-07 Pedro Alves * breakpoint.c (save_breakpoints): Adjust to avoid code between TRY and CATCH. * gdbtypes.c (safe_parse_type): Remove empty line. (types_deeply_equal): * guile/scm-frame.c (gdbscm_frame_name): * linux-thread-db.c (find_new_threads_once): * python/py-breakpoint.c (bppy_get_commands): * record-btrace.c (record_btrace_insert_breakpoint) (record_btrace_remove_breakpoint, record_btrace_start_replaying) (record_btrace_start_replaying): Adjust to avoid code between TRY and CATCH. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/breakpoint.c | 5 +++-- gdb/gdbtypes.c | 24 ++++++++++++++---------- gdb/guile/scm-frame.c | 9 +++------ gdb/linux-thread-db.c | 10 ++++++---- gdb/python/py-breakpoint.c | 3 ++- gdb/record-btrace.c | 20 ++++++++++---------- 7 files changed, 52 insertions(+), 33 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6df72f7..a18830f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,19 @@ 2015-03-07 Pedro Alves + * breakpoint.c (save_breakpoints): Adjust to avoid code between + TRY and CATCH. + * gdbtypes.c (safe_parse_type): Remove empty line. + (types_deeply_equal): + * guile/scm-frame.c (gdbscm_frame_name): + * linux-thread-db.c (find_new_threads_once): + * python/py-breakpoint.c (bppy_get_commands): + * record-btrace.c (record_btrace_insert_breakpoint) + (record_btrace_remove_breakpoint, record_btrace_start_replaying) + (record_btrace_start_replaying): Adjust to avoid code between TRY + and CATCH. + +2015-03-07 Pedro Alves + * common/common-exceptions.c (struct catcher) : No longer a pointer to volatile exception. Now an exception value. : Delete field. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 0e59638..923523e 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -15926,6 +15926,7 @@ save_breakpoints (char *filename, int from_tty, if (tp->type != bp_dprintf && tp->commands) { + struct gdb_exception exception; fprintf_unfiltered (fp, " commands\n"); @@ -15934,14 +15935,14 @@ save_breakpoints (char *filename, int from_tty, { print_command_lines (current_uiout, tp->commands->commands, 2); } - ui_out_redirect (current_uiout, NULL); - CATCH (ex, RETURN_MASK_ALL) { + ui_out_redirect (current_uiout, NULL); throw_exception (ex); } END_CATCH + ui_out_redirect (current_uiout, NULL); fprintf_unfiltered (fp, " end\n"); } diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index af59d42..4cbbe95 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2309,7 +2309,6 @@ safe_parse_type (struct gdbarch *gdbarch, char *p, int length) { type = parse_and_eval_type (p, length); } - CATCH (except, RETURN_MASK_ERROR) { type = builtin_type (gdbarch)->builtin_void; @@ -3237,6 +3236,7 @@ check_types_worklist (VEC (type_equality_entry_d) **worklist, int types_deeply_equal (struct type *type1, struct type *type2) { + struct gdb_exception except = exception_none; int result = 0; struct bcache *cache; VEC (type_equality_entry_d) *worklist = NULL; @@ -3254,23 +3254,27 @@ types_deeply_equal (struct type *type1, struct type *type2) entry.type2 = type2; VEC_safe_push (type_equality_entry_d, worklist, &entry); + /* check_types_worklist calls several nested helper functions, some + of which can raise a GDB exception, so we just check and rethrow + here. If there is a GDB exception, a comparison is not capable + (or trusted), so exit. */ TRY { result = check_types_worklist (&worklist, cache); } - /* check_types_worklist calls several nested helper functions, - some of which can raise a GDB Exception, so we just check - and rethrow here. If there is a GDB exception, a comparison - is not capable (or trusted), so exit. */ - bcache_xfree (cache); - VEC_free (type_equality_entry_d, worklist); - /* Rethrow if there was a problem. */ - CATCH (except, RETURN_MASK_ALL) + CATCH (ex, RETURN_MASK_ALL) { - throw_exception (except); + except = ex; } END_CATCH + bcache_xfree (cache); + VEC_free (type_equality_entry_d, worklist); + + /* Rethrow if there was a problem. */ + if (except.reason < 0) + throw_exception (except); + return result; } diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c index 6189802..ea51d1b 100644 --- a/gdb/guile/scm-frame.c +++ b/gdb/guile/scm-frame.c @@ -426,7 +426,6 @@ gdbscm_frame_name (SCM self) enum language lang = language_minimal; struct frame_info *frame = NULL; SCM result; - struct gdb_exception except = exception_none; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); @@ -436,15 +435,13 @@ gdbscm_frame_name (SCM self) if (frame != NULL) find_frame_funname (frame, &name, &lang, NULL); } - CATCH (ex, RETURN_MASK_ALL) + CATCH (except, RETURN_MASK_ALL) { - except = ex; + xfree (name); + GDBSCM_HANDLE_GDB_EXCEPTION (except); } END_CATCH - xfree (name); - GDBSCM_HANDLE_GDB_EXCEPTION (except); - if (frame == NULL) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 0669750..88094a7 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1702,16 +1702,18 @@ find_new_threads_once (struct thread_db_info *info, int iteration, TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); } - - if (libthread_db_debug) + CATCH (except, RETURN_MASK_ERROR) { - CATCH (except, RETURN_MASK_ERROR) + if (libthread_db_debug) { exception_fprintf (gdb_stdlog, except, "Warning: find_new_threads_once: "); } - END_CATCH + } + END_CATCH + if (libthread_db_debug) + { fprintf_unfiltered (gdb_stdlog, _("Found %d new threads in iteration %d.\n"), data.new_threads, iteration); diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index dcf1d5a..42a8596 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -503,15 +503,16 @@ bppy_get_commands (PyObject *self, void *closure) { print_command_lines (current_uiout, breakpoint_commands (bp), 0); } - ui_out_redirect (current_uiout, NULL); CATCH (except, RETURN_MASK_ALL) { + ui_out_redirect (current_uiout, NULL); do_cleanups (chain); gdbpy_convert_exception (except); return NULL; } END_CATCH + ui_out_redirect (current_uiout, NULL); cmdstr = ui_file_xstrdup (string_file, &length); make_cleanup (xfree, cmdstr); result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL); diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 6bd9d01..5eb5cf4 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1155,14 +1155,13 @@ record_btrace_insert_breakpoint (struct target_ops *ops, { ret = ops->beneath->to_insert_breakpoint (ops->beneath, gdbarch, bp_tgt); } - - replay_memory_access = old; - CATCH (except, RETURN_MASK_ALL) { + replay_memory_access = old; throw_exception (except); } END_CATCH + replay_memory_access = old; return ret; } @@ -1187,14 +1186,13 @@ record_btrace_remove_breakpoint (struct target_ops *ops, { ret = ops->beneath->to_remove_breakpoint (ops->beneath, gdbarch, bp_tgt); } - - replay_memory_access = old; - CATCH (except, RETURN_MASK_ALL) { + replay_memory_access = old; throw_exception (except); } END_CATCH + replay_memory_access = old; return ret; } @@ -1706,12 +1704,11 @@ record_btrace_start_replaying (struct thread_info *tp) if (upd_step_stack_frame_id) tp->control.step_stack_frame_id = frame_id; } - - /* Restore the previous execution state. */ - set_executing (tp->ptid, executing); - CATCH (except, RETURN_MASK_ALL) { + /* Restore the previous execution state. */ + set_executing (tp->ptid, executing); + xfree (btinfo->replay); btinfo->replay = NULL; @@ -1721,6 +1718,9 @@ record_btrace_start_replaying (struct thread_info *tp) } END_CATCH + /* Restore the previous execution state. */ + set_executing (tp->ptid, executing); + return replay; } -- 2.7.4