X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finfcmd.c;h=4ad37aa2756a14a8da85ddc93c7913692ecfb53a;hb=6e1e1966bac965c5a26b5e5cae69cb0ed21be4cc;hp=187c71f34461ef781c5c6fa6f4a20bc674400af7;hpb=bc3b087de2401c65c02730d346e8bea4dc0504ae;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 187c71f344..4ad37aa275 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1,6 +1,6 @@ /* Memory-access and commands for "inferior" process, for GDB. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -62,35 +62,9 @@ /* Local functions: */ -static void info_registers_command (char *, int); - static void until_next_command (int); -static void until_command (char *, int); - -static void path_command (char *, int); - -static void unset_command (char *, int); - -static void info_float_command (char *, int); - -static void disconnect_command (char *, int); - -static void info_program_command (char *, int); - -static void finish_command (char *, int); - -static void signal_command (char *, int); - -static void jump_command (char *, int); - -static void step_1 (int, int, char *); - -static void next_command (char *, int); - -static void step_command (char *, int); - -static void run_command (char *, int); +static void step_1 (int, int, const char *); #define ERROR_NO_INFERIOR \ if (!target_has_execution) error (_("The program is not being run.")); @@ -160,7 +134,7 @@ get_inferior_io_terminal (void) } static void -set_inferior_tty_command (char *args, int from_tty, +set_inferior_tty_command (const char *args, int from_tty, struct cmd_list_element *c) { /* CLI has assigned the user-provided value to inferior_io_terminal_scratch. @@ -206,7 +180,7 @@ get_inferior_args (void) NEWARGS is not transferred. */ void -set_inferior_args (char *newargs) +set_inferior_args (const char *newargs) { xfree (current_inferior ()->args); current_inferior ()->args = newargs ? xstrdup (newargs) : NULL; @@ -224,7 +198,7 @@ set_inferior_args_vector (int argc, char **argv) /* Notice when `set args' is run. */ static void -set_args_command (char *args, int from_tty, struct cmd_list_element *c) +set_args_command (const char *args, int from_tty, struct cmd_list_element *c) { /* CLI has assigned the user-provided value to inferior_args_scratch. Now route it to current inferior. */ @@ -268,7 +242,7 @@ get_inferior_cwd () /* Handle the 'set cwd' command. */ static void -set_cwd_command (char *args, int from_tty, struct cmd_list_element *c) +set_cwd_command (const char *args, int from_tty, struct cmd_list_element *c) { if (*inferior_cwd_scratch == '\0') set_inferior_cwd (NULL); @@ -423,7 +397,7 @@ construct_inferior_arguments (int argc, char **argv) NULL is returned. *BG_CHAR_P is an output boolean that indicates whether the '&' character was found. */ -static char * +static gdb::unique_xmalloc_ptr strip_bg_char (const char *args, int *bg_char_p) { const char *p; @@ -443,13 +417,14 @@ strip_bg_char (const char *args, int *bg_char_p) *bg_char_p = 1; if (p != args) - return savestring (args, p - args); + return gdb::unique_xmalloc_ptr + (savestring (args, p - args)); else - return NULL; + return gdb::unique_xmalloc_ptr (nullptr); } *bg_char_p = 0; - return xstrdup (args); + return gdb::unique_xmalloc_ptr (xstrdup (args)); } /* Common actions to take after creating any sort of inferior, by any @@ -586,7 +561,7 @@ enum run_how requested by RUN_HOW. */ static void -run_command_1 (char *args, int from_tty, enum run_how run_how) +run_command_1 (const char *args, int from_tty, enum run_how run_how) { const char *exec_file; struct cleanup *old_chain; @@ -594,8 +569,6 @@ run_command_1 (char *args, int from_tty, enum run_how run_how) struct ui_out *uiout = current_uiout; struct target_ops *run_target; int async_exec; - struct cleanup *args_chain; - CORE_ADDR pc; dont_repeat (); @@ -618,8 +591,8 @@ run_command_1 (char *args, int from_tty, enum run_how run_how) reopen_exec_file (); reread_symbols (); - args = strip_bg_char (args, &async_exec); - args_chain = make_cleanup (xfree, args); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (args, &async_exec); + args = stripped.get (); /* Do validation and preparation before possibly changing anything in the inferior. */ @@ -665,9 +638,6 @@ run_command_1 (char *args, int from_tty, enum run_how run_how) uiout->flush (); } - /* Done with ARGS. */ - do_cleanups (args_chain); - /* We call get_inferior_args() because we might need to compute the value now. */ run_target->to_create_inferior (run_target, exec_file, @@ -713,7 +683,7 @@ run_command_1 (char *args, int from_tty, enum run_how run_how) } static void -run_command (char *args, int from_tty) +run_command (const char *args, int from_tty) { run_command_1 (args, from_tty, RUN_NORMAL); } @@ -722,7 +692,7 @@ run_command (char *args, int from_tty) program. */ static void -start_command (char *args, int from_tty) +start_command (const char *args, int from_tty) { /* Some languages such as Ada need to search inside the program minimal symbols for the location where to put the temporary @@ -738,7 +708,7 @@ start_command (char *args, int from_tty) instruction. */ static void -starti_command (char *args, int from_tty) +starti_command (const char *args, int from_tty) { run_command_1 (args, from_tty, RUN_STOP_AT_FIRST_INSN); } @@ -848,17 +818,16 @@ continue_1 (int all_threads) /* continue [-a] [proceed-count] [&] */ static void -continue_command (char *args, int from_tty) +continue_command (const char *args, int from_tty) { int async_exec; int all_threads = 0; - struct cleanup *args_chain; ERROR_NO_INFERIOR; /* Find out whether we must run in the background. */ - args = strip_bg_char (args, &async_exec); - args_chain = make_cleanup (xfree, args); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (args, &async_exec); + args = stripped.get (); if (args != NULL) { @@ -920,9 +889,6 @@ continue_command (char *args, int from_tty) } } - /* Done with ARGS. */ - do_cleanups (args_chain); - ERROR_NO_INFERIOR; ensure_not_tfind_mode (); @@ -958,7 +924,7 @@ set_step_frame (void) /* Step until outside of current statement. */ static void -step_command (char *count_string, int from_tty) +step_command (const char *count_string, int from_tty) { step_1 (0, 0, count_string); } @@ -966,7 +932,7 @@ step_command (char *count_string, int from_tty) /* Likewise, but skip over subroutine calls as if single instructions. */ static void -next_command (char *count_string, int from_tty) +next_command (const char *count_string, int from_tty) { step_1 (1, 0, count_string); } @@ -974,13 +940,13 @@ next_command (char *count_string, int from_tty) /* Likewise, but step only one instruction. */ static void -stepi_command (char *count_string, int from_tty) +stepi_command (const char *count_string, int from_tty) { step_1 (0, 1, count_string); } static void -nexti_command (char *count_string, int from_tty) +nexti_command (const char *count_string, int from_tty) { step_1 (1, 1, count_string); } @@ -1063,11 +1029,10 @@ step_command_fsm_prepare (struct step_command_fsm *sm, static int prepare_one_step (struct step_command_fsm *sm); static void -step_1 (int skip_subroutines, int single_inst, char *count_string) +step_1 (int skip_subroutines, int single_inst, const char *count_string) { int count; int async_exec; - struct cleanup *args_chain; struct thread_info *thr; struct step_command_fsm *step_sm; @@ -1076,16 +1041,14 @@ step_1 (int skip_subroutines, int single_inst, char *count_string) ensure_valid_thread (); ensure_not_running (); - count_string = strip_bg_char (count_string, &async_exec); - args_chain = make_cleanup (xfree, count_string); + gdb::unique_xmalloc_ptr stripped + = strip_bg_char (count_string, &async_exec); + count_string = stripped.get (); prepare_execution_command (¤t_target, async_exec); count = count_string ? parse_and_eval_long (count_string) : 1; - /* Done with ARGS. */ - do_cleanups (args_chain); - clear_proceed_status (1); /* Setup the execution command state machine to handle all the COUNT @@ -1254,14 +1217,13 @@ prepare_one_step (struct step_command_fsm *sm) /* Continue program at specified address. */ static void -jump_command (char *arg, int from_tty) +jump_command (const char *arg, int from_tty) { struct gdbarch *gdbarch = get_current_arch (); CORE_ADDR addr; struct symbol *fn; struct symbol *sfn; int async_exec; - struct cleanup *args_chain; ERROR_NO_INFERIOR; ensure_not_tfind_mode (); @@ -1269,8 +1231,8 @@ jump_command (char *arg, int from_tty) ensure_not_running (); /* Find out whether we must run in the background. */ - arg = strip_bg_char (arg, &async_exec); - args_chain = make_cleanup (xfree, arg); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); + arg = stripped.get (); prepare_execution_command (¤t_target, async_exec); @@ -1282,9 +1244,6 @@ jump_command (char *arg, int from_tty) if (sals.size () != 1) error (_("Unreasonable jump request")); - /* Done with ARGS. */ - do_cleanups (args_chain); - symtab_and_line &sal = sals[0]; if (sal.symtab == 0 && sal.pc == 0) @@ -1339,11 +1298,10 @@ jump_command (char *arg, int from_tty) /* Continue program giving it specified signal. */ static void -signal_command (char *signum_exp, int from_tty) +signal_command (const char *signum_exp, int from_tty) { enum gdb_signal oursig; int async_exec; - struct cleanup *args_chain; dont_repeat (); /* Too dangerous. */ ERROR_NO_INFERIOR; @@ -1352,8 +1310,9 @@ signal_command (char *signum_exp, int from_tty) ensure_not_running (); /* Find out whether we must run in the background. */ - signum_exp = strip_bg_char (signum_exp, &async_exec); - args_chain = make_cleanup (xfree, signum_exp); + gdb::unique_xmalloc_ptr stripped + = strip_bg_char (signum_exp, &async_exec); + signum_exp = stripped.get (); prepare_execution_command (¤t_target, async_exec); @@ -1376,8 +1335,6 @@ signal_command (char *signum_exp, int from_tty) oursig = gdb_signal_from_command (num); } - do_cleanups (args_chain); - /* Look for threads other than the current that this command ends up resuming too (due to schedlock off), and warn if they'll get a signal delivered. "signal 0" is used to suppress a previous @@ -1438,7 +1395,7 @@ signal_command (char *signum_exp, int from_tty) /* Queue a signal to be delivered to the current thread. */ static void -queue_signal_command (char *signum_exp, int from_tty) +queue_signal_command (const char *signum_exp, int from_tty) { enum gdb_signal oursig; struct thread_info *tp; @@ -1539,8 +1496,6 @@ until_next_fsm_should_stop (struct thread_fsm *self, static void until_next_fsm_clean_up (struct thread_fsm *self, struct thread_info *thread) { - struct until_next_fsm *sm = (struct until_next_fsm *) self; - delete_longjmp_breakpoint (thread->global_num); } @@ -1619,10 +1574,9 @@ until_next_command (int from_tty) } static void -until_command (char *arg, int from_tty) +until_command (const char *arg, int from_tty) { int async_exec; - struct cleanup *args_chain; ERROR_NO_INFERIOR; ensure_not_tfind_mode (); @@ -1630,8 +1584,8 @@ until_command (char *arg, int from_tty) ensure_not_running (); /* Find out whether we must run in the background. */ - arg = strip_bg_char (arg, &async_exec); - args_chain = make_cleanup (xfree, arg); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); + arg = stripped.get (); prepare_execution_command (¤t_target, async_exec); @@ -1639,16 +1593,12 @@ until_command (char *arg, int from_tty) until_break_command (arg, from_tty, 0); else until_next_command (from_tty); - - /* Done with ARGS. */ - do_cleanups (args_chain); } static void -advance_command (char *arg, int from_tty) +advance_command (const char *arg, int from_tty) { int async_exec; - struct cleanup *args_chain; ERROR_NO_INFERIOR; ensure_not_tfind_mode (); @@ -1659,15 +1609,12 @@ advance_command (char *arg, int from_tty) error_no_arg (_("a location")); /* Find out whether we must run in the background. */ - arg = strip_bg_char (arg, &async_exec); - args_chain = make_cleanup (xfree, arg); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); + arg = stripped.get (); prepare_execution_command (¤t_target, async_exec); until_break_command (arg, from_tty, 1); - - /* Done with ARGS. */ - do_cleanups (args_chain); } /* Return the value of the result of a function at the end of a 'finish' @@ -1988,7 +1935,7 @@ finish_forward (struct finish_command_fsm *sm, struct frame_info *frame) sm->breakpoint = set_momentary_breakpoint (gdbarch, sal, get_stack_frame_id (frame), - bp_finish); + bp_finish).release (); /* set_momentary_breakpoint invalidates FRAME. */ frame = NULL; @@ -2029,11 +1976,10 @@ skip_finish_frames (struct frame_info *frame) frame will return to, then continue. */ static void -finish_command (char *arg, int from_tty) +finish_command (const char *arg, int from_tty) { struct frame_info *frame; int async_exec; - struct cleanup *args_chain; struct finish_command_fsm *sm; struct thread_info *tp; @@ -2043,17 +1989,14 @@ finish_command (char *arg, int from_tty) ensure_not_running (); /* Find out whether we must run in the background. */ - arg = strip_bg_char (arg, &async_exec); - args_chain = make_cleanup (xfree, arg); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); + arg = stripped.get (); prepare_execution_command (¤t_target, async_exec); if (arg) error (_("The \"finish\" command does not take any arguments.")); - /* Done with ARGS. */ - do_cleanups (args_chain); - frame = get_prev_frame (get_selected_frame (_("No selected frame."))); if (frame == 0) error (_("\"finish\" not meaningful in the outermost frame.")); @@ -2131,7 +2074,7 @@ finish_command (char *arg, int from_tty) static void -info_program_command (char *args, int from_tty) +info_program_command (const char *args, int from_tty) { bpstat bs; int num, stat; @@ -2321,7 +2264,7 @@ path_info (const char *args, int from_tty) /* Add zero or more directories to the front of the execution path. */ static void -path_command (char *dirname, int from_tty) +path_command (const char *dirname, int from_tty) { char *exec_path; const char *env; @@ -2464,7 +2407,7 @@ default_print_registers_info (struct gdbarch *gdbarch, } void -registers_info (char *addr_exp, int fpregs) +registers_info (const char *addr_exp, int fpregs) { struct frame_info *frame; struct gdbarch *gdbarch; @@ -2483,7 +2426,7 @@ registers_info (char *addr_exp, int fpregs) while (*addr_exp != '\0') { - char *start; + const char *start; const char *end; /* Skip leading white space. */ @@ -2572,13 +2515,13 @@ registers_info (char *addr_exp, int fpregs) } static void -info_all_registers_command (char *addr_exp, int from_tty) +info_all_registers_command (const char *addr_exp, int from_tty) { registers_info (addr_exp, 1); } static void -info_registers_command (char *addr_exp, int from_tty) +info_registers_command (const char *addr_exp, int from_tty) { registers_info (addr_exp, 0); } @@ -2613,7 +2556,7 @@ print_vector_info (struct ui_file *file, } static void -info_vector_command (char *args, int from_tty) +info_vector_command (const char *args, int from_tty) { if (!target_has_registers) error (_("The program has no registers now.")); @@ -2624,7 +2567,7 @@ info_vector_command (char *args, int from_tty) /* Kill the inferior process. Make us have no inferior. */ static void -kill_command (char *arg, int from_tty) +kill_command (const char *arg, int from_tty) { /* FIXME: This should not really be inferior_ptid (or target_has_execution). It should be a distinct flag that indicates that a target is active, cuz @@ -2845,10 +2788,9 @@ attach_command_continuation_free_args (void *args) and allows us to start debugging it. */ void -attach_command (char *args, int from_tty) +attach_command (const char *args, int from_tty) { int async_exec; - struct cleanup *args_chain; struct target_ops *attach_target; struct inferior *inferior = current_inferior (); enum attach_post_wait_mode mode; @@ -2871,8 +2813,8 @@ attach_command (char *args, int from_tty) this function should probably be moved into target_pre_inferior. */ target_pre_inferior (from_tty); - args = strip_bg_char (args, &async_exec); - args_chain = make_cleanup (xfree, args); + gdb::unique_xmalloc_ptr stripped = strip_bg_char (args, &async_exec); + args = stripped.get (); attach_target = find_attach_target (); @@ -2950,17 +2892,12 @@ attach_command (char *args, int from_tty) a->mode = mode; add_inferior_continuation (attach_command_continuation, a, attach_command_continuation_free_args); - /* Done with ARGS. */ - do_cleanups (args_chain); if (!target_is_async_p ()) mark_infrun_async_event_handler (); return; } - /* Done with ARGS. */ - do_cleanups (args_chain); - attach_post_wait (args, from_tty, mode); } @@ -3028,7 +2965,7 @@ notice_new_inferior (ptid_t ptid, int leave_running, int from_tty) */ void -detach_command (char *args, int from_tty) +detach_command (const char *args, int from_tty) { dont_repeat (); /* Not for the faint of heart. */ @@ -3039,7 +2976,7 @@ detach_command (char *args, int from_tty) disconnect_tracing (); - target_detach (args, from_tty); + target_detach (current_inferior (), from_tty); /* The current inferior process was just detached successfully. Get rid of breakpoints that no longer make sense. Note we don't do @@ -3071,7 +3008,7 @@ detach_command (char *args, int from_tty) stopped processes on some native platforms (e.g. GNU/Linux). */ static void -disconnect_command (char *args, int from_tty) +disconnect_command (const char *args, int from_tty) { dont_repeat (); /* Not for the faint of heart. */ query_if_trace_running (from_tty); @@ -3115,7 +3052,7 @@ interrupt_target_1 (int all_threads) if the `-a' switch is used. */ static void -interrupt_command (char *args, int from_tty) +interrupt_command (const char *args, int from_tty) { if (target_can_async_p ()) { @@ -3160,7 +3097,7 @@ default_print_float_info (struct gdbarch *gdbarch, struct ui_file *file, } static void -info_float_command (char *args, int from_tty) +info_float_command (const char *args, int from_tty) { struct frame_info *frame; @@ -3172,7 +3109,7 @@ info_float_command (char *args, int from_tty) } static void -unset_command (char *args, int from_tty) +unset_command (const char *args, int from_tty) { printf_filtered (_("\"unset\" must be followed by the " "name of an unset subcommand.\n")); @@ -3198,7 +3135,7 @@ info_proc_cmd_1 (const char *args, enum info_proc_what what, int from_tty) /* Implement `info proc' when given without any futher parameters. */ static void -info_proc_cmd (char *args, int from_tty) +info_proc_cmd (const char *args, int from_tty) { info_proc_cmd_1 (args, IP_MINIMAL, from_tty); } @@ -3523,13 +3460,17 @@ interrupt all running threads in non-stop mode, use the -a option.")); c = add_info ("registers", info_registers_command, _("\ List of integer registers and their contents, for selected stack frame.\n\ -Register name as argument means describe only that register.")); +One or more register names as argument means describe the given registers.\n\ +One or more register group names as argument means describe the registers\n\ +in the named register groups.")); add_info_alias ("r", "registers", 1); set_cmd_completer (c, reg_or_group_completer); c = add_info ("all-registers", info_all_registers_command, _("\ List of all registers and their contents, for selected stack frame.\n\ -Register name as argument means describe only that register.")); +One or more register names as argument means describe the given registers.\n\ +One or more register group names as argument means describe the registers\n\ +in the named register groups.")); set_cmd_completer (c, reg_or_group_completer); add_info ("program", info_program_command,