From patchwork Thu Oct 13 21:09:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 16484 Received: (qmail 1389 invoked by alias); 13 Oct 2016 21:11:14 -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 1182 invoked by uid 89); 13 Oct 2016 21:11:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.0 required=5.0 tests=AWL, BAYES_50, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=Tell, interp, 3017, *fp X-HELO: gproxy4-pub.mail.unifiedlayer.com Received: from gproxy4-pub.mail.unifiedlayer.com (HELO gproxy4-pub.mail.unifiedlayer.com) (69.89.23.142) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Thu, 13 Oct 2016 21:11:02 +0000 Received: (qmail 26804 invoked by uid 0); 13 Oct 2016 21:11:00 -0000 Received: from unknown (HELO cmgw2) (10.0.90.83) by gproxy4.mail.unifiedlayer.com with SMTP; 13 Oct 2016 21:11:00 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw2 with id v9AH1t00v2f2jeq019ALeA; Thu, 13 Oct 2016 15:10:20 -0600 X-Authority-Analysis: v=2.1 cv=PIacp5aC c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=CH0kA5CcgfcA:10 a=zstS-IiYAAAA:8 a=mDV3o1hIAAAA:8 a=06YKZZkRp5nOU5L_8hgA:9 a=Vwz_KV1lrPrqE60_:21 a=MWwAzcwNK9PwVTUT:21 a=4G6NA9xxw8l3yy4pmD5M:22 a=_FVE-zBwftR9WsbkzFJk:22 Received: from 174-16-143-211.hlrn.qwest.net ([174.16.143.211]:42448 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1bunGc-00011Z-RS; Thu, 13 Oct 2016 15:10:19 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA v2 01/17] Use RAII to save and restore scalars Date: Thu, 13 Oct 2016 15:09:56 -0600 Message-Id: <1476393012-29987-2-git-send-email-tom@tromey.com> In-Reply-To: <1476393012-29987-1-git-send-email-tom@tromey.com> References: <1476393012-29987-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1bunGc-00011Z-RS X-Source-Sender: 174-16-143-211.hlrn.qwest.net (bapiya.Home) [174.16.143.211]:42448 X-Source-Auth: tom+tromey.com X-Email-Count: 2 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This patch replaces many (but not all) uses of make_cleanup_restore_integer with a simple RAII-based template class. It also removes the similar restore_execution_direction cleanup in favor of this new class. Subsequent patches will replace other similar cleanups with this class. The class is typically instantiated using make_scoped_restore. This allows for template argument deduction. 2016-10-13 Tom Tromey * common/scoped_restore.h: New file. * utils.h: Include scoped_restore.h. * top.c (execute_command_to_string): Use scoped_restore. * python/python.c (python_interactive_command): Use scoped_restore. (python_command, execute_gdb_command): Likewise. * printcmd.c (do_one_display): Use scoped_restore. * mi/mi-main.c (exec_continue): Use scoped_restore. * mi/mi-cmd-var.c (mi_cmd_var_assign): Use scoped_restore. * linux-fork.c (checkpoint_command): Use scoped_restore. * infrun.c (restore_execution_direction): Remove. (fetch_inferior_event): Use scoped_restore. * compile/compile.c (compile_file_command): Use scoped_restore. (compile_code_command, compile_print_command): Likewise. * cli/cli-script.c (execute_user_command): Use scoped_restore. (while_command, if_command, script_from_file): Likewise. * arm-tdep.c (arm_insert_single_step_breakpoint): Use scoped_restore. --- gdb/ChangeLog | 23 +++++++++++ gdb/arm-tdep.c | 9 ++--- gdb/cli/cli-script.c | 18 ++------- gdb/common/scoped_restore.h | 99 +++++++++++++++++++++++++++++++++++++++++++++ gdb/compile/compile.c | 23 ++++------- gdb/infrun.c | 16 +------- gdb/linux-fork.c | 11 ++--- gdb/mi/mi-cmd-var.c | 8 +--- gdb/mi/mi-main.c | 3 +- gdb/printcmd.c | 6 +-- gdb/python/python.c | 12 ++---- gdb/top.c | 3 +- gdb/utils.h | 1 + 13 files changed, 155 insertions(+), 77 deletions(-) create mode 100644 gdb/common/scoped_restore.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0efe9c1..775fa81 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,26 @@ +2016-10-13 Tom Tromey + + * common/scoped_restore.h: New file. + * utils.h: Include scoped_restore.h. + * top.c (execute_command_to_string): Use scoped_restore. + * python/python.c (python_interactive_command): Use + scoped_restore. + (python_command, execute_gdb_command): Likewise. + * printcmd.c (do_one_display): Use scoped_restore. + * mi/mi-main.c (exec_continue): Use scoped_restore. + * mi/mi-cmd-var.c (mi_cmd_var_assign): Use scoped_restore. + * linux-fork.c (checkpoint_command): Use scoped_restore. + * infrun.c (restore_execution_direction): Remove. + (fetch_inferior_event): Use scoped_restore. + * compile/compile.c (compile_file_command): Use + scoped_restore. + (compile_code_command, compile_print_command): Likewise. + * cli/cli-script.c (execute_user_command): Use + scoped_restore. + (while_command, if_command, script_from_file): Likewise. + * arm-tdep.c (arm_insert_single_step_breakpoint): Use + scoped_restore. + 2016-10-12 Tom Tromey * machoread.c (macho_symfile_read_all_oso): Use std::string. diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 31ebdc3..9fda74a 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -4255,15 +4255,12 @@ arm_insert_single_step_breakpoint (struct gdbarch *gdbarch, struct address_space *aspace, CORE_ADDR pc) { - struct cleanup *old_chain - = make_cleanup_restore_integer (&arm_override_mode); - - arm_override_mode = IS_THUMB_ADDR (pc); + scoped_restore save_override_mode + = make_scoped_restore (&arm_override_mode, + (int) IS_THUMB_ADDR (pc)); pc = gdbarch_addr_bits_remove (gdbarch, pc); insert_single_step_breakpoint (gdbarch, aspace, pc); - - do_cleanups (old_chain); } /* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 0118795..b5684a4 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -380,8 +380,7 @@ execute_user_command (struct cmd_list_element *c, char *args) not confused with Insight. */ in_user_command = 1; - make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); command_nest_depth++; while (cmdlines) @@ -651,7 +650,6 @@ static void while_command (char *arg, int from_tty) { struct command_line *command = NULL; - struct cleanup *old_chain; control_level = 1; command = get_command_line (while_control, arg); @@ -659,13 +657,10 @@ while_command (char *arg, int from_tty) if (command == NULL) return; - old_chain = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); execute_control_command_untraced (command); free_command_lines (&command); - - do_cleanups (old_chain); } /* "if" command support. Execute either the true or false arm depending @@ -683,13 +678,10 @@ if_command (char *arg, int from_tty) if (command == NULL) return; - old_chain = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); execute_control_command_untraced (command); free_command_lines (&command); - - do_cleanups (old_chain); } /* Cleanup */ @@ -1647,10 +1639,8 @@ script_from_file (FILE *stream, const char *file) source_line_number = 0; source_file_name = file; - make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; - { + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); TRY { diff --git a/gdb/common/scoped_restore.h b/gdb/common/scoped_restore.h new file mode 100644 index 0000000..8c2a5b0 --- /dev/null +++ b/gdb/common/scoped_restore.h @@ -0,0 +1,99 @@ +/* scoped_restore, a simple class for saving and restoring a value + + Copyright (C) 2016 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef SCOPED_RESTORE_H +#define SCOPED_RESTORE_H + +/* Base class for scoped_restore_tmpl. */ +struct scoped_restore_base +{ +}; + +/* A convenience typedef. Users of make_scoped_restore declare the + local RAII object as having this type. */ +typedef const scoped_restore_base &scoped_restore; + +/* An RAII-based object that saves a variable's value, and then + restores it again when this object is destroyed. */ +template +class scoped_restore_tmpl : public scoped_restore_base +{ + public: + + /* Create a new scoped_restore object that saves the current value + of *VAR. *VAR will be restored when this scoped_restore object + is destroyed. */ + scoped_restore_tmpl (T *var) + : m_saved_var (var), + m_saved_value (*var) + { + } + + /* Create a new scoped_restore object that saves the current value + of *VAR, and sets *VAR to VALUE. *VAR will be restored when this + scoped_restore object is destroyed. */ + scoped_restore_tmpl (T *var, T value) + : m_saved_var (var), + m_saved_value (*var) + { + *var = value; + } + + scoped_restore_tmpl (const scoped_restore_tmpl &other) + : m_saved_var (other.m_saved_var), + m_saved_value (other.m_saved_value) + { + other.m_saved_var = NULL; + } + + ~scoped_restore_tmpl () + { + if (m_saved_var != NULL) + *m_saved_var = m_saved_value; + } + + private: + + /* No need for this. It is intentionally not defined anywhere. */ + scoped_restore_tmpl &operator= (const scoped_restore_tmpl &); + + /* The saved variable. */ + mutable T *m_saved_var; + + /* The saved value. */ + const T m_saved_value; +}; + +/* Make a scoped_restore. This is useful because it lets template + argument deduction work. */ +template +scoped_restore_tmpl make_scoped_restore (T *var) +{ + return scoped_restore_tmpl (var); +} + +/* Make a scoped_restore. This is useful because it lets template + argument deduction work. */ +template +scoped_restore_tmpl make_scoped_restore (T *var, T value) +{ + return scoped_restore_tmpl (var, value); +} + +#endif /* SCOPED_RESTORE_H */ diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c index 0db95e4..2de9de5 100644 --- a/gdb/compile/compile.c +++ b/gdb/compile/compile.c @@ -91,8 +91,7 @@ compile_file_command (char *arg, int from_tty) char *buffer; struct cleanup *cleanup; - cleanup = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); /* Check the user did not just after command. */ if (arg == NULL) @@ -115,7 +114,7 @@ compile_file_command (char *arg, int from_tty) arg = skip_spaces (arg); arg = gdb_abspath (arg); - make_cleanup (xfree, arg); + cleanup = make_cleanup (xfree, arg); buffer = xstrprintf ("#include \"%s\"\n", arg); make_cleanup (xfree, buffer); eval_compile_command (NULL, buffer, scope, NULL); @@ -130,11 +129,9 @@ compile_file_command (char *arg, int from_tty) static void compile_code_command (char *arg, int from_tty) { - struct cleanup *cleanup; enum compile_i_scope_types scope = COMPILE_I_SIMPLE_SCOPE; - cleanup = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); if (arg != NULL && check_raw_argument (&arg)) { @@ -155,13 +152,12 @@ compile_code_command (char *arg, int from_tty) else { struct command_line *l = get_command_line (compile_control, ""); + struct cleanup *cleanup = make_cleanup_free_command_lines (&l); - make_cleanup_free_command_lines (&l); l->control_u.compile.scope = scope; execute_control_command_untraced (l); + do_cleanups (cleanup); } - - do_cleanups (cleanup); } /* Callback for compile_print_command. */ @@ -183,12 +179,10 @@ static void compile_print_command (char *arg_param, int from_tty) { const char *arg = arg_param; - struct cleanup *cleanup; enum compile_i_scope_types scope = COMPILE_I_PRINT_ADDRESS_SCOPE; struct format_data fmt; - cleanup = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); /* Passing &FMT as SCOPE_DATA is safe as do_module_cleanup will not touch the stale pointer if compile_object_run has already quit. */ @@ -199,14 +193,13 @@ compile_print_command (char *arg_param, int from_tty) else { struct command_line *l = get_command_line (compile_control, ""); + struct cleanup *cleanup = make_cleanup_free_command_lines (&l); - make_cleanup_free_command_lines (&l); l->control_u.compile.scope = scope; l->control_u.compile.scope_data = &fmt; execute_control_command_untraced (l); + do_cleanups (cleanup); } - - do_cleanups (cleanup); } /* A cleanup function to remove a directory and all its contents. */ diff --git a/gdb/infrun.c b/gdb/infrun.c index 2fa6449..3e62cfe 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -3877,17 +3877,6 @@ all_uis_on_sync_execution_starting (void) } } -/* A cleanup that restores the execution direction to the value saved - in *ARG. */ - -static void -restore_execution_direction (void *arg) -{ - enum exec_direction_kind *save_exec_dir = (enum exec_direction_kind *) arg; - - execution_direction = *save_exec_dir; -} - /* Asynchronous version of wait_for_inferior. It is called by the event loop whenever a change of state is detected on the file descriptor corresponding to the target. It can be called more than @@ -3904,7 +3893,6 @@ fetch_inferior_event (void *client_data) struct execution_control_state *ecs = &ecss; struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); struct cleanup *ts_old_chain; - enum exec_direction_kind save_exec_dir = execution_direction; int cmd_done = 0; ptid_t waiton_ptid = minus_one_ptid; @@ -3943,8 +3931,8 @@ fetch_inferior_event (void *client_data) event. */ target_dcache_invalidate (); - make_cleanup (restore_execution_direction, &save_exec_dir); - execution_direction = target_execution_direction (); + scoped_restore save_exec_dir + = make_scoped_restore (&execution_direction, target_execution_direction ()); ecs->ptid = do_target_wait (waiton_ptid, &ecs->ws, target_can_async_p () ? TARGET_WNOHANG : 0); diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c index e7202dd..e4be593 100644 --- a/gdb/linux-fork.c +++ b/gdb/linux-fork.c @@ -680,7 +680,6 @@ checkpoint_command (char *args, int from_tty) struct value *fork_fn = NULL, *ret; struct fork_info *fp; pid_t retpid; - struct cleanup *old_chain; if (!target_has_execution) error (_("The program is not being run.")); @@ -704,11 +703,13 @@ checkpoint_command (char *args, int from_tty) ret = value_from_longest (builtin_type (gdbarch)->builtin_int, 0); /* Tell linux-nat.c that we're checkpointing this inferior. */ - old_chain = make_cleanup_restore_integer (&checkpointing_pid); - checkpointing_pid = ptid_get_pid (inferior_ptid); + { + scoped_restore save_pid + = make_scoped_restore (&checkpointing_pid, ptid_get_pid (inferior_ptid)); + + ret = call_function_by_hand (fork_fn, 0, &ret); + } - ret = call_function_by_hand (fork_fn, 0, &ret); - do_cleanups (old_chain); if (!ret) /* Probably can't happen. */ error (_("checkpoint: call_function_by_hand returned null.")); diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 48dc602..147e026 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -591,7 +591,6 @@ mi_cmd_var_assign (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - struct cleanup *cleanup; if (argc != 2) error (_("-var-assign: Usage: NAME EXPRESSION.")); @@ -606,9 +605,8 @@ mi_cmd_var_assign (char *command, char **argv, int argc) /* MI command '-var-assign' may write memory, so suppress memory changed notification if it does. */ - cleanup - = make_cleanup_restore_integer (&mi_suppress_notification.memory); - mi_suppress_notification.memory = 1; + scoped_restore save_suppress + = make_scoped_restore (&mi_suppress_notification.memory, 1); if (!varobj_set_value (var, expression)) error (_("-var-assign: Could not assign " @@ -616,8 +614,6 @@ mi_cmd_var_assign (char *command, char **argv, int argc) std::string val = varobj_get_value (var); ui_out_field_string (uiout, "value", val.c_str ()); - - do_cleanups (cleanup); } /* Type used for parameters passing to mi_cmd_var_update_iter. */ diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 98d53ca..b80b4f2 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -301,7 +301,7 @@ exec_continue (char **argv, int argc) } else { - struct cleanup *back_to = make_cleanup_restore_integer (&sched_multi); + scoped_restore save_multi = make_scoped_restore (&sched_multi); if (current_context->all) { @@ -316,7 +316,6 @@ exec_continue (char **argv, int argc) same. */ continue_1 (1); } - do_cleanups (back_to); } } diff --git a/gdb/printcmd.c b/gdb/printcmd.c index ef64d15..082f8e8 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1919,7 +1919,6 @@ undisplay_command (char *args, int from_tty) static void do_one_display (struct display *d) { - struct cleanup *old_chain; int within_current_scope; if (d->enabled_p == 0) @@ -1970,8 +1969,8 @@ do_one_display (struct display *d) if (!within_current_scope) return; - old_chain = make_cleanup_restore_integer (¤t_display_number); - current_display_number = d->number; + scoped_restore save_display_number + = make_scoped_restore (¤t_display_number, d->number); annotate_display_begin (); printf_filtered ("%d", d->number); @@ -2059,7 +2058,6 @@ do_one_display (struct display *d) annotate_display_end (); gdb_flush (gdb_stdout); - do_cleanups (old_chain); } /* Display all of the values on the auto-display chain which can be diff --git a/gdb/python/python.c b/gdb/python/python.c index 0ca7d9a..53f83b8 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -319,11 +319,9 @@ static void python_interactive_command (char *arg, int from_tty) { struct ui *ui = current_ui; - struct cleanup *cleanup; int err; - cleanup = make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); arg = skip_spaces (arg); @@ -351,8 +349,6 @@ python_interactive_command (char *arg, int from_tty) gdbpy_print_stack (); error (_("Error while executing Python code.")); } - - do_cleanups (cleanup); } /* A wrapper around PyRun_SimpleFile. FILE is the Python script to run @@ -467,8 +463,7 @@ python_command (char *arg, int from_tty) cleanup = ensure_python_env (get_current_arch (), current_language); - make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); arg = skip_spaces (arg); if (arg && *arg) @@ -652,8 +647,7 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) struct cleanup *cleanup = make_cleanup (xfree, copy); struct interp *interp; - make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); make_cleanup_restore_current_uiout (); diff --git a/gdb/top.c b/gdb/top.c index fb424b6..ce41bc9 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -700,8 +700,7 @@ execute_command_to_string (char *p, int from_tty) restoration callbacks. */ cleanup = set_batch_flag_and_make_cleanup_restore_page_info (); - make_cleanup_restore_integer (¤t_ui->async); - current_ui->async = 0; + scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); str_file = mem_fileopen (); diff --git a/gdb/utils.h b/gdb/utils.h index 8635075..c4944e1 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -22,6 +22,7 @@ #define UTILS_H #include "exceptions.h" +#include "common/scoped_restore.h" extern void initialize_utils (void);