X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finfcmd.c;h=27177a475053a4814226ab5040ae66585a60f26b;hb=f6efe3f842e72e23ec6d8a57d683ce90d2e89785;hp=3879df3f5a0d3e0d1a26bca969ac76c85e0537ff;hpb=e813d34aaabee0ca034fa5ddd50e76ade80318bc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 3879df3f5a..27177a4750 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -42,7 +42,7 @@ #include "block.h" #include "solib.h" #include -#include "observer.h" +#include "observable.h" #include "target-descriptions.h" #include "user-regs.h" #include "cli/cli-decode.h" @@ -59,6 +59,7 @@ #include "top.h" #include "interps.h" #include "common/gdb_optional.h" +#include "source.h" /* Local functions: */ @@ -93,10 +94,6 @@ static char *inferior_io_terminal_scratch; ptid_t inferior_ptid; -/* Address at which inferior stopped. */ - -CORE_ADDR stop_pc; - /* Nonzero if stopped due to completion of a stack dummy routine. */ enum stop_stack_kind stop_stack_dummy; @@ -157,7 +154,7 @@ show_inferior_tty_command (struct ui_file *file, int from_tty, "is \"%s\".\n"), inferior_io_terminal); } -char * +const char * get_inferior_args (void) { if (current_inferior ()->argc != 0) @@ -447,10 +444,12 @@ post_create_inferior (struct target_ops *target, int from_tty) /* Now that we know the register layout, retrieve current PC. But if the PC is unavailable (e.g., we're opening a core file with missing registers info), ignore it. */ - stop_pc = 0; + thread_info *thr = inferior_thread (); + + thr->suspend.stop_pc = 0; TRY { - stop_pc = regcache_read_pc (get_current_regcache ()); + thr->suspend.stop_pc = regcache_read_pc (get_current_regcache ()); } CATCH (ex, RETURN_MASK_ERROR) { @@ -498,7 +497,7 @@ post_create_inferior (struct target_ops *target, int from_tty) if the now pushed target supports hardware watchpoints. */ breakpoint_re_set (); - observer_notify_inferior_created (target, from_tty); + gdb::observers::inferior_created.notify (target, from_tty); } /* Kill the inferior if already running. This function is designed @@ -509,7 +508,7 @@ post_create_inferior (struct target_ops *target, int from_tty) static void kill_if_already_running (int from_tty) { - if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution) + if (inferior_ptid != null_ptid && target_has_execution) { /* Bail out before killing the program if we will not be able to restart it. */ @@ -530,7 +529,7 @@ prepare_execution_command (struct target_ops *target, int background) { /* If we get a request for running in the bg but the target doesn't support it, error out. */ - if (background && !target->to_can_async_p (target)) + if (background && !target->can_async_p ()) error (_("Asynchronous execution not supported on this target.")); if (!background) @@ -564,8 +563,6 @@ static void run_command_1 (const char *args, int from_tty, enum run_how run_how) { const char *exec_file; - struct cleanup *old_chain; - ptid_t ptid; struct ui_out *uiout = current_uiout; struct target_ops *run_target; int async_exec; @@ -601,7 +598,7 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) prepare_execution_command (run_target, async_exec); - if (non_stop && !run_target->to_supports_non_stop (run_target)) + if (non_stop && !run_target->supports_non_stop ()) error (_("The target does not support running in non-stop mode.")); /* Done. Can now set breakpoints, change inferior args, etc. */ @@ -640,10 +637,10 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) /* We call get_inferior_args() because we might need to compute the value now. */ - run_target->to_create_inferior (run_target, exec_file, - std::string (get_inferior_args ()), - current_inferior ()->environment.envp (), - from_tty); + run_target->create_inferior (exec_file, + std::string (get_inferior_args ()), + current_inferior ()->environment.envp (), + from_tty); /* to_create_inferior should push the target, so after this point we shouldn't refer to run_target again. */ run_target = NULL; @@ -654,15 +651,14 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) events --- the frontend shouldn't see them as stopped. In all-stop, always finish the state of all threads, as we may be resuming more than just the new process. */ - if (non_stop) - ptid = pid_to_ptid (ptid_get_pid (inferior_ptid)); - else - ptid = minus_one_ptid; - old_chain = make_cleanup (finish_thread_state_cleanup, &ptid); + ptid_t finish_ptid = (non_stop + ? ptid_t (current_inferior ()->pid) + : minus_one_ptid); + scoped_finish_thread_state finish_state (finish_ptid); /* Pass zero for FROM_TTY, because at this point the "run" command has done its thing; now we are setting up the running program. */ - post_create_inferior (¤t_target, 0); + post_create_inferior (current_top_target (), 0); /* Queue a pending event so that the program stops immediately. */ if (run_how == RUN_STOP_AT_FIRST_INSN) @@ -679,7 +675,7 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) /* Since there was no error, there's no need to finish the thread states here. */ - discard_cleanups (old_chain); + finish_state.release (); } static void @@ -725,10 +721,10 @@ proceed_thread_callback (struct thread_info *thread, void *arg) much. If/when GDB gains a way to tell the target `hold this thread stopped until I say otherwise', then we can optimize this. */ - if (!is_stopped (thread->ptid)) + if (thread->state != THREAD_STOPPED) return 0; - switch_to_thread (thread->ptid); + switch_to_thread (thread); clear_proceed_status (0); proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT); return 0; @@ -737,8 +733,8 @@ proceed_thread_callback (struct thread_info *thread, void *arg) static void ensure_valid_thread (void) { - if (ptid_equal (inferior_ptid, null_ptid) - || is_exited (inferior_ptid)) + if (inferior_ptid == null_ptid + || inferior_thread ()->state == THREAD_EXITED) error (_("Cannot execute this command without a live selected thread.")); } @@ -767,7 +763,7 @@ error_is_running (void) static void ensure_not_running (void) { - if (is_running (inferior_ptid)) + if (inferior_thread ()->state == THREAD_RUNNING) error_is_running (); } @@ -857,7 +853,7 @@ continue_command (const char *args, int from_tty) struct thread_info *tp; if (non_stop) - tp = find_thread_ptid (inferior_ptid); + tp = inferior_thread (); else { ptid_t last_ptid; @@ -898,7 +894,7 @@ continue_command (const char *args, int from_tty) ensure_not_running (); } - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); if (from_tty) printf_filtered (_("Continuing.\n")); @@ -1045,7 +1041,7 @@ step_1 (int skip_subroutines, int single_inst, const char *count_string) = strip_bg_char (count_string, &async_exec); count_string = stripped.get (); - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); count = count_string ? parse_and_eval_long (count_string) : 1; @@ -1150,7 +1146,7 @@ prepare_one_step (struct step_command_fsm *sm) /* Step at an inlined function behaves like "down". */ if (!sm->skip_subroutines - && inline_skipped_frames (inferior_ptid)) + && inline_skipped_frames (tp)) { ptid_t resume_ptid; @@ -1158,7 +1154,7 @@ prepare_one_step (struct step_command_fsm *sm) resume_ptid = user_visible_resume_ptid (1); set_running (resume_ptid, 1); - step_into_inline_frame (inferior_ptid); + step_into_inline_frame (tp); sm->count--; return prepare_one_step (sm); } @@ -1234,7 +1230,7 @@ jump_command (const char *arg, int from_tty) gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); arg = stripped.get (); - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); if (!arg) error_no_arg (_("starting address")); @@ -1314,7 +1310,7 @@ signal_command (const char *signum_exp, int from_tty) = strip_bg_char (signum_exp, &async_exec); signum_exp = stripped.get (); - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); if (!signum_exp) error_no_arg (_("signal number")); @@ -1353,9 +1349,9 @@ signal_command (const char *signum_exp, int from_tty) ALL_NON_EXITED_THREADS (tp) { - if (ptid_equal (tp->ptid, inferior_ptid)) + if (tp->ptid == inferior_ptid) continue; - if (!ptid_match (tp->ptid, resume_ptid)) + if (!tp->ptid.matches (resume_ptid)) continue; if (tp->suspend.stop_signal != GDB_SIGNAL_0 @@ -1556,7 +1552,7 @@ until_next_command (int from_tty) { sal = find_pc_line (pc, 0); - tp->control.step_range_start = BLOCK_START (SYMBOL_BLOCK_VALUE (func)); + tp->control.step_range_start = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (func)); tp->control.step_range_end = sal.end; } tp->control.may_range_step = 1; @@ -1587,7 +1583,7 @@ until_command (const char *arg, int from_tty) gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); arg = stripped.get (); - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); if (arg) until_break_command (arg, from_tty, 0); @@ -1612,7 +1608,7 @@ advance_command (const char *arg, int from_tty) gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); arg = stripped.get (); - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); until_break_command (arg, from_tty, 1); } @@ -1624,8 +1620,8 @@ advance_command (const char *arg, int from_tty) struct value * get_return_value (struct value *function, struct type *value_type) { - regcache stop_regs (regcache::readonly, *get_current_regcache ()); - struct gdbarch *gdbarch = stop_regs.arch (); + regcache *stop_regs = get_current_regcache (); + struct gdbarch *gdbarch = stop_regs->arch (); struct value *value; value_type = check_typedef (value_type); @@ -1645,7 +1641,7 @@ get_return_value (struct value *function, struct type *value_type) case RETURN_VALUE_ABI_RETURNS_ADDRESS: case RETURN_VALUE_ABI_PRESERVES_ADDRESS: value = allocate_value (value_type); - gdbarch_return_value (gdbarch, function, value_type, &stop_regs, + gdbarch_return_value (gdbarch, function, value_type, stop_regs, value_contents_raw (value), NULL); break; case RETURN_VALUE_STRUCT_CONVENTION: @@ -1689,7 +1685,7 @@ print_return_value_1 (struct ui_out *uiout, struct return_value_info *rv) uiout->field_fmt ("gdb-result-var", "$%d", rv->value_history_index); uiout->text (" = "); - get_no_prettyformat_print_options (&opts); + get_user_print_options (&opts); string_file stb; @@ -1992,7 +1988,7 @@ finish_command (const char *arg, int from_tty) gdb::unique_xmalloc_ptr stripped = strip_bg_char (arg, &async_exec); arg = stripped.get (); - prepare_execution_command (¤t_target, async_exec); + prepare_execution_command (current_top_target (), async_exec); if (arg) error (_("The \"finish\" command does not take any arguments.")); @@ -2078,7 +2074,6 @@ info_program_command (const char *args, int from_tty) { bpstat bs; int num, stat; - struct thread_info *tp; ptid_t ptid; if (!target_has_execution) @@ -2096,18 +2091,22 @@ info_program_command (const char *args, int from_tty) get_last_target_status (&ptid, &ws); } - if (ptid_equal (ptid, null_ptid) || is_exited (ptid)) + if (ptid == null_ptid || ptid == minus_one_ptid) + error (_("No selected thread.")); + + thread_info *tp = find_thread_ptid (ptid); + + if (tp->state == THREAD_EXITED) error (_("Invalid selected thread.")); - else if (is_running (ptid)) + else if (tp->state == THREAD_RUNNING) error (_("Selected thread is running.")); - tp = find_thread_ptid (ptid); bs = tp->control.stop_bpstat; stat = bpstat_num (&bs, &num); target_files_info (); printf_filtered (_("Program stopped at %s.\n"), - paddress (target_gdbarch (), stop_pc)); + paddress (target_gdbarch (), tp->suspend.stop_pc)); if (tp->control.stop_step) printf_filtered (_("It stopped after being stepped.\n")); else if (stat != 0) @@ -2388,8 +2387,7 @@ default_print_registers_info (struct gdbarch *gdbarch, int regnum, int print_all) { int i; - const int numregs = gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch); + const int numregs = gdbarch_num_cooked_regs (gdbarch); for (i = 0; i < numregs; i++) { @@ -2476,8 +2474,7 @@ registers_info (const char *addr_exp, int fpregs) /* User registers lie completely outside of the range of normal registers. Catch them early so that the target never sees them. */ - if (regnum >= gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch)) + if (regnum >= gdbarch_num_cooked_regs (gdbarch)) { struct value *regval = value_of_user_reg (regnum, frame); const char *regname = user_reg_map_regnum_to_name (gdbarch, @@ -2516,8 +2513,7 @@ registers_info (const char *addr_exp, int fpregs) int regnum; for (regnum = 0; - regnum < gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch); + regnum < gdbarch_num_cooked_regs (gdbarch); regnum++) { if (gdbarch_register_reggroup_p (gdbarch, regnum, group)) @@ -2559,10 +2555,7 @@ print_vector_info (struct ui_file *file, int regnum; int printed_something = 0; - for (regnum = 0; - regnum < gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch); - regnum++) + for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++) { if (gdbarch_register_reggroup_p (gdbarch, regnum, vector_reggroup)) { @@ -2593,12 +2586,23 @@ kill_command (const char *arg, int from_tty) It should be a distinct flag that indicates that a target is active, cuz some targets don't have processes! */ - if (ptid_equal (inferior_ptid, null_ptid)) + if (inferior_ptid == null_ptid) error (_("The program is not being run.")); if (!query (_("Kill the program being debugged? "))) error (_("Not confirmed.")); + + int pid = current_inferior ()->pid; + /* Save the pid as a string before killing the inferior, since that + may unpush the current target, and we need the string after. */ + std::string pid_str = target_pid_to_str (ptid_t (pid)); + int infnum = current_inferior ()->num; + target_kill (); + if (print_inferior_events) + printf_unfiltered (_("[Inferior %d (%s) killed]\n"), + infnum, pid_str.c_str ()); + /* If we still have other inferiors to debug, then don't mess with with their threads. */ if (!have_inferiors ()) @@ -2628,13 +2632,13 @@ proceed_after_attach_callback (struct thread_info *thread, { int pid = * (int *) arg; - if (ptid_get_pid (thread->ptid) == pid - && !is_exited (thread->ptid) - && !is_executing (thread->ptid) + if (thread->ptid.pid () == pid + && thread->state != THREAD_EXITED + && !thread->executing && !thread->stop_requested && thread->suspend.stop_signal == GDB_SIGNAL_0) { - switch_to_thread (thread->ptid); + switch_to_thread (thread); clear_proceed_status (0); proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT); } @@ -2667,7 +2671,7 @@ setup_inferior (int from_tty) /* If no exec file is yet known, try to determine it from the process itself. */ if (get_exec_file (0) == NULL) - exec_file_locate_attach (ptid_get_pid (inferior_ptid), 1, from_tty); + exec_file_locate_attach (inferior_ptid.pid (), 1, from_tty); else { reopen_exec_file (); @@ -2675,9 +2679,9 @@ setup_inferior (int from_tty) } /* Take any necessary post-attaching actions for this platform. */ - target_post_attach (ptid_get_pid (inferior_ptid)); + target_post_attach (inferior_ptid.pid ()); - post_create_inferior (¤t_target, from_tty); + post_create_inferior (current_top_target (), from_tty); } /* What to do after the first program stops after attaching. */ @@ -2741,7 +2745,7 @@ attach_post_wait (const char *args, int from_tty, enum attach_post_wait_mode mod Be sure to explicitly stop all threads of the process. This should have no effect on already stopped threads. */ if (non_stop) - target_stop (pid_to_ptid (inferior->pid)); + target_stop (ptid_t (inferior->pid)); else if (target_is_non_stop_p ()) { struct thread_info *thread; @@ -2756,7 +2760,7 @@ attach_post_wait (const char *args, int from_tty, enum attach_post_wait_mode mod still exists. */ ALL_NON_EXITED_THREADS (thread) { - if (ptid_get_pid (thread->ptid) == pid) + if (thread->ptid.pid () == pid) { if (thread->inf->num < lowest->inf->num || thread->per_inf_num < lowest->per_inf_num) @@ -2764,7 +2768,7 @@ attach_post_wait (const char *args, int from_tty, enum attach_post_wait_mode mod } } - switch_to_thread (lowest->ptid); + switch_to_thread (lowest); } /* Tell the user/frontend where we're stopped. */ @@ -2840,10 +2844,10 @@ attach_command (const char *args, int from_tty) prepare_execution_command (attach_target, async_exec); - if (non_stop && !attach_target->to_supports_non_stop (attach_target)) + if (non_stop && !attach_target->supports_non_stop ()) error (_("Cannot attach to this target in non-stop mode")); - attach_target->to_attach (attach_target, args, from_tty); + attach_target->attach (args, from_tty); /* to_attach should push the target, so after this point we shouldn't refer to attach_target again. */ attach_target = NULL; @@ -2887,14 +2891,14 @@ attach_command (const char *args, int from_tty) else /* The user requested an `attach', so stop all threads of this inferior. */ - target_stop (pid_to_ptid (ptid_get_pid (inferior_ptid))); + target_stop (ptid_t (inferior_ptid.pid ())); } mode = async_exec ? ATTACH_POST_WAIT_RESUME : ATTACH_POST_WAIT_STOP; /* Some system don't generate traps when attaching to inferior. E.g. Mach 3 or GNU hurd. */ - if (!target_attach_no_wait) + if (!target_attach_no_wait ()) { struct attach_command_continuation_args *a; @@ -2930,7 +2934,7 @@ attach_command (const char *args, int from_tty) as stopped. */ void -notice_new_inferior (ptid_t ptid, int leave_running, int from_tty) +notice_new_inferior (thread_info *thr, int leave_running, int from_tty) { enum attach_post_wait_mode mode = leave_running ? ATTACH_POST_WAIT_RESUME : ATTACH_POST_WAIT_NOTHING; @@ -2942,12 +2946,12 @@ notice_new_inferior (ptid_t ptid, int leave_running, int from_tty) /* Avoid reading registers -- we haven't fetched the target description yet. */ - switch_to_thread_no_regs (find_thread_ptid (ptid)); + switch_to_thread_no_regs (thr); /* When we "notice" a new inferior we need to do all the things we would normally do if we had just attached to it. */ - if (is_executing (inferior_ptid)) + if (thr->executing) { struct attach_command_continuation_args *a; struct inferior *inferior = current_inferior (); @@ -2989,7 +2993,7 @@ detach_command (const char *args, int from_tty) { dont_repeat (); /* Not for the faint of heart. */ - if (ptid_equal (inferior_ptid, null_ptid)) + if (inferior_ptid == null_ptid) error (_("The program is not being run.")); query_if_trace_running (from_tty); @@ -3100,10 +3104,7 @@ default_print_float_info (struct gdbarch *gdbarch, struct ui_file *file, int regnum; int printed_something = 0; - for (regnum = 0; - regnum < gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch); - regnum++) + for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++) { if (gdbarch_register_reggroup_p (gdbarch, regnum, float_reggroup)) { @@ -3208,6 +3209,14 @@ info_proc_cmd_exe (const char *args, int from_tty) info_proc_cmd_1 (args, IP_EXE, from_tty); } +/* Implement `info proc files'. */ + +static void +info_proc_cmd_files (const char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_FILES, from_tty); +} + /* Implement `info proc all'. */ static void @@ -3436,7 +3445,7 @@ Execution will also stop upon exit from the current stack frame.")); c = add_com ("jump", class_run, jump_command, _("\ Continue program being debugged at specified line or address.\n\ -Usage: jump \n\ +Usage: jump LOCATION\n\ Give as argument either LINENUM or *ADDR, where ADDR is an expression\n\ for an address to start at.")); set_cmd_completer (c, location_completer); @@ -3504,13 +3513,13 @@ in the named register groups.")); add_prefix_cmd ("proc", class_info, info_proc_cmd, _("\ -Show /proc process information about any running process.\n\ +Show additional information about a process.\n\ Specify any process id, or use the program being debugged by default."), &info_proc_cmdlist, "info proc ", 1/*allow-unknown*/, &infolist); add_cmd ("mappings", class_info, info_proc_cmd_mappings, _("\ -List of mapped memory regions."), +List memory regions mapped by the specified process."), &info_proc_cmdlist); add_cmd ("stat", class_info, info_proc_cmd_stat, _("\ @@ -3522,18 +3531,22 @@ List process info from /proc/PID/status."), &info_proc_cmdlist); add_cmd ("cwd", class_info, info_proc_cmd_cwd, _("\ -List current working directory of the process."), +List current working directory of the specified process."), &info_proc_cmdlist); add_cmd ("cmdline", class_info, info_proc_cmd_cmdline, _("\ -List command line arguments of the process."), +List command line arguments of the specified process."), &info_proc_cmdlist); add_cmd ("exe", class_info, info_proc_cmd_exe, _("\ -List absolute filename for executable of the process."), +List absolute filename for executable of the specified process."), + &info_proc_cmdlist); + + add_cmd ("files", class_info, info_proc_cmd_files, _("\ +List files opened by the specified process."), &info_proc_cmdlist); add_cmd ("all", class_info, info_proc_cmd_all, _("\ -List all available /proc info."), +List all available info about the specified process."), &info_proc_cmdlist); }