From patchwork Mon Feb 9 23:20:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 5010 Received: (qmail 6530 invoked by alias); 9 Feb 2015 23:50:32 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 6494 invoked by uid 89); 9 Feb 2015 23:50:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 09 Feb 2015 23:50:30 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t19NLuiE017450 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 9 Feb 2015 18:21:56 -0500 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19NKkux026307 for ; Mon, 9 Feb 2015 18:21:55 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 34/36] more making TRY/CATCH callers look more like real C++ try/catch blocks Date: Mon, 9 Feb 2015 23:20:44 +0000 Message-Id: <1423524046-20605-35-git-send-email-palves@redhat.com> In-Reply-To: <1423524046-20605-1-git-send-email-palves@redhat.com> References: <1423524046-20605-1-git-send-email-palves@redhat.com> All these were caught by actually making TRY/CATCH use try/catch behind the scenes, which then resulted in the build failing because there was code between the try and catch blocks. As with the prior patch, this could either be done _before_ running the TRY_CATCH conversion script, or be squashed into it. --- 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 ++++++++++---------- 6 files changed, 38 insertions(+), 33 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index b5a9704..4db4084 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -15899,6 +15899,7 @@ save_breakpoints (char *filename, int from_tty, if (tp->type != bp_dprintf && tp->commands) { + struct gdb_exception exception; fprintf_unfiltered (fp, " commands\n"); @@ -15907,14 +15908,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 54130b6..ff3bdf4 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2301,7 +2301,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; @@ -3229,6 +3228,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; @@ -3246,23 +3246,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 87596d2..74f7e69 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1730,16 +1730,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 1cbbd3e..8aedb0b 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1116,14 +1116,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; } @@ -1148,14 +1147,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; } @@ -1667,12 +1665,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; @@ -1682,6 +1679,9 @@ record_btrace_start_replaying (struct thread_info *tp) } END_CATCH + /* Restore the previous execution state. */ + set_executing (tp->ptid, executing); + return replay; }