X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Finfrun.c;h=d7df3c7d5766b4881e2f61dc4e9e74a7b4382403;hb=935676c92feb5f35e4634ef58c20ffdfd0979b07;hp=0e31dbcdb54cfbefd291b2e9d8be8aa0500e281f;hpb=a01bda5221f75031ea2b6d05860e46c7b9b58b55;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/infrun.c b/gdb/infrun.c index 0e31dbcdb5..d7df3c7d57 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -70,25 +70,16 @@ /* Prototypes for local functions */ -static void info_signals_command (char *, int); - -static void handle_command (char *, int); - static void sig_print_info (enum gdb_signal); static void sig_print_header (void); -static void resume_cleanups (void *); - static int follow_fork (void); static int follow_fork_inferior (int follow_child, int detach_fork); static void follow_inferior_reset_breakpoints (void); -static void set_schedlock_func (char *args, int from_tty, - struct cmd_list_element *c); - static int currently_stepping (struct thread_info *tp); void nullify_last_target_wait_ptid (void); @@ -199,7 +190,7 @@ show_disable_randomization (struct ui_file *file, int from_tty, } static void -set_disable_randomization (char *args, int from_tty, +set_disable_randomization (const char *args, int from_tty, struct cmd_list_element *c) { if (!target_supports_disable_randomization ()) @@ -214,7 +205,7 @@ int non_stop = 0; static int non_stop_1 = 0; static void -set_non_stop (char *args, int from_tty, +set_non_stop (const char *args, int from_tty, struct cmd_list_element *c) { if (target_has_execution) @@ -243,7 +234,7 @@ int observer_mode = 0; static int observer_mode_1 = 0; static void -set_observer_mode (char *args, int from_tty, +set_observer_mode (const char *args, int from_tty, struct cmd_list_element *c) { if (target_has_execution) @@ -368,7 +359,8 @@ int stop_on_solib_events; as appropriate when the above flag is changed. */ static void -set_stop_on_solib_events (char *args, int from_tty, struct cmd_list_element *c) +set_stop_on_solib_events (const char *args, + int from_tty, struct cmd_list_element *c) { update_solib_breakpoints (); } @@ -1289,7 +1281,7 @@ struct step_over_info and address of the instruction the breakpoint is set at. We'll skip inserting all breakpoints here. Valid iff ASPACE is non-NULL. */ - struct address_space *aspace; + const address_space *aspace; CORE_ADDR address; /* The instruction being stepped over triggers a nonsteppable @@ -1332,7 +1324,7 @@ static struct step_over_info step_over_info; because when we need the info later the thread may be running. */ static void -set_step_over_info (struct address_space *aspace, CORE_ADDR address, +set_step_over_info (const address_space *aspace, CORE_ADDR address, int nonsteppable_watchpoint_p, int thread) { @@ -1760,7 +1752,7 @@ displaced_step_prepare_throw (ptid_t ptid) struct thread_info *tp = find_thread_ptid (ptid); struct regcache *regcache = get_thread_regcache (ptid); struct gdbarch *gdbarch = regcache->arch (); - struct address_space *aspace = regcache->aspace (); + const address_space *aspace = regcache->aspace (); CORE_ADDR original, copy; ULONGEST len; struct displaced_step_closure *closure; @@ -2198,17 +2190,6 @@ infrun_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid) } -/* Resuming. */ - -/* Things to clean up if we QUIT out of resume (). */ -static void -resume_cleanups (void *ignore) -{ - if (!ptid_equal (inferior_ptid, null_ptid)) - delete_single_step_breakpoints (inferior_thread ()); - - normal_stop (); -} static const char schedlock_off[] = "off"; static const char schedlock_on[] = "on"; @@ -2233,7 +2214,7 @@ show_scheduler_mode (struct ui_file *file, int from_tty, } static void -set_schedlock_func (char *args, int from_tty, struct cmd_list_element *c) +set_schedlock_func (const char *args, int from_tty, struct cmd_list_element *c) { if (!target_can_lock_scheduler) { @@ -2373,22 +2354,17 @@ do_target_resume (ptid_t resume_ptid, int step, enum gdb_signal sig) target_commit_resume (); } -/* Resume the inferior, but allow a QUIT. This is useful if the user - wants to interrupt some lengthy single-stepping operation - (for child processes, the SIGINT goes to the inferior, and so - we get a SIGINT random_signal, but for remote debugging and perhaps - other targets, that's not true). +/* Resume the inferior. SIG is the signal to give the inferior + (GDB_SIGNAL_0 for none). */ - SIG is the signal to give the inferior (zero for none). */ void resume (enum gdb_signal sig) { - struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0); struct regcache *regcache = get_current_regcache (); struct gdbarch *gdbarch = regcache->arch (); struct thread_info *tp = inferior_thread (); CORE_ADDR pc = regcache_read_pc (regcache); - struct address_space *aspace = regcache->aspace (); + const address_space *aspace = regcache->aspace (); ptid_t resume_ptid; /* This represents the user's step vs continue request. When deciding whether "set scheduler-locking step" applies, it's the @@ -2403,8 +2379,6 @@ resume (enum gdb_signal sig) gdb_assert (!tp->stop_requested); gdb_assert (!thread_is_in_step_over_chain (tp)); - QUIT; - if (tp->suspend.waitstatus_pending_p) { if (debug_infrun) @@ -2431,7 +2405,6 @@ resume (enum gdb_signal sig) } tp->suspend.stop_signal = GDB_SIGNAL_0; - discard_cleanups (old_cleanups); if (target_can_async_p ()) target_async (1); @@ -2543,7 +2516,6 @@ resume (enum gdb_signal sig) resume_ptid = internal_resume_ptid (user_step); do_target_resume (resume_ptid, 0, GDB_SIGNAL_0); - discard_cleanups (old_cleanups); tp->resumed = 1; return; } @@ -2581,7 +2553,6 @@ resume (enum gdb_signal sig) "Got placed in step-over queue\n"); tp->control.trap_expected = 0; - discard_cleanups (old_cleanups); return; } else if (prepared < 0) @@ -2758,7 +2729,6 @@ resume (enum gdb_signal sig) do_target_resume (resume_ptid, step, sig); tp->resumed = 1; - discard_cleanups (old_cleanups); } /* Proceeding. */ @@ -2983,7 +2953,6 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal) struct gdbarch *gdbarch; struct thread_info *tp; CORE_ADDR pc; - struct address_space *aspace; ptid_t resume_ptid; struct execution_control_state ecss; struct execution_control_state *ecs = &ecss; @@ -3007,7 +2976,8 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal) regcache = get_current_regcache (); gdbarch = regcache->arch (); - aspace = regcache->aspace (); + const address_space *aspace = regcache->aspace (); + pc = regcache_read_pc (regcache); tp = inferior_thread (); @@ -3073,6 +3043,12 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal) inferior. */ gdb_flush (gdb_stdout); + /* Since we've marked the inferior running, give it the terminal. A + QUIT/Ctrl-C from here on is forwarded to the target (which can + still detect attempts to unblock a stuck connection with repeated + Ctrl-C from within target_pass_ctrlc). */ + target_terminal::inferior (); + /* In a multi-threaded task we may select another thread and then continue or step. @@ -4070,7 +4046,6 @@ adjust_pc_after_break (struct thread_info *thread, { struct regcache *regcache; struct gdbarch *gdbarch; - struct address_space *aspace; CORE_ADDR breakpoint_pc, decr_pc; /* If we've hit a breakpoint, we'll normally be stopped with SIGTRAP. If @@ -4150,7 +4125,7 @@ adjust_pc_after_break (struct thread_info *thread, if (decr_pc == 0) return; - aspace = regcache->aspace (); + const address_space *aspace = regcache->aspace (); /* Find the location where (if we've hit a breakpoint) the breakpoint would be. */ @@ -4385,7 +4360,6 @@ static void save_waitstatus (struct thread_info *tp, struct target_waitstatus *ws) { struct regcache *regcache; - struct address_space *aspace; if (debug_infrun) { @@ -4404,7 +4378,7 @@ save_waitstatus (struct thread_info *tp, struct target_waitstatus *ws) tp->suspend.waitstatus_pending_p = 1; regcache = get_thread_regcache (tp->ptid); - aspace = regcache->aspace (); + const address_space *aspace = regcache->aspace (); if (ws->kind == TARGET_WAITKIND_STOPPED && ws->value.sig == GDB_SIGNAL_TRAP) @@ -5776,11 +5750,11 @@ handle_signal_stop (struct execution_control_state *ecs) if (ecs->event_thread->suspend.stop_signal == GDB_SIGNAL_TRAP) { struct regcache *regcache; - struct address_space *aspace; CORE_ADDR pc; regcache = get_thread_regcache (ecs->ptid); - aspace = regcache->aspace (); + const address_space *aspace = regcache->aspace (); + pc = regcache_read_pc (regcache); /* However, before doing so, if this single-step breakpoint was @@ -5871,7 +5845,7 @@ handle_signal_stop (struct execution_control_state *ecs) inline function call sites). */ if (ecs->event_thread->control.step_range_end != 1) { - struct address_space *aspace = + const address_space *aspace = get_thread_regcache (ecs->ptid)->aspace (); /* skip_inline_frames is expensive, so we avoid it if we can @@ -7404,7 +7378,7 @@ insert_step_resume_breakpoint_at_sal_1 (struct gdbarch *gdbarch, paddress (gdbarch, sr_sal.pc)); inferior_thread ()->control.step_resume_breakpoint - = set_momentary_breakpoint (gdbarch, sr_sal, sr_id, sr_type); + = set_momentary_breakpoint (gdbarch, sr_sal, sr_id, sr_type).release (); } void @@ -7493,7 +7467,7 @@ insert_longjmp_resume_breakpoint (struct gdbarch *gdbarch, CORE_ADDR pc) paddress (gdbarch, pc)); inferior_thread ()->control.exception_resume_breakpoint = - set_momentary_breakpoint_at_pc (gdbarch, pc, bp_longjmp_resume); + set_momentary_breakpoint_at_pc (gdbarch, pc, bp_longjmp_resume).release (); } /* Insert an exception resume breakpoint. TP is the thread throwing @@ -7528,7 +7502,8 @@ insert_exception_resume_breakpoint (struct thread_info *tp, (unsigned long) handler); bp = set_momentary_breakpoint_at_pc (get_frame_arch (frame), - handler, bp_exception_resume); + handler, + bp_exception_resume).release (); /* set_momentary_breakpoint_at_pc invalidates FRAME. */ frame = NULL; @@ -7569,7 +7544,7 @@ insert_exception_resume_from_probe (struct thread_info *tp, handler)); bp = set_momentary_breakpoint_at_pc (get_frame_arch (frame), - handler, bp_exception_resume); + handler, bp_exception_resume).release (); bp->thread = tp->global_num; inferior_thread ()->control.exception_resume_breakpoint = bp; } @@ -7590,7 +7565,7 @@ check_exception_resume (struct execution_control_state *ecs, CFA and the HANDLER. We ignore the CFA, extract the handler, and set a breakpoint there. */ probe = find_probe_by_pc (get_frame_pc (frame)); - if (probe.probe) + if (probe.prob) { insert_exception_resume_from_probe (ecs->event_thread, &probe, frame); return; @@ -7664,10 +7639,6 @@ stop_waiting (struct execution_control_state *ecs) static void keep_going_pass_signal (struct execution_control_state *ecs) { - /* Make sure normal_stop is called if we get a QUIT handled before - reaching resume. */ - struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0); - gdb_assert (ptid_equal (ecs->event_thread->ptid, inferior_ptid)); gdb_assert (!ecs->event_thread->resumed); @@ -7689,7 +7660,6 @@ keep_going_pass_signal (struct execution_control_state *ecs) non-signal event (e.g., a fork); or took a signal which we are supposed to pass through to the inferior. Simply continue. */ - discard_cleanups (old_cleanups); resume (ecs->event_thread->suspend.stop_signal); } else if (step_over_info_valid_p ()) @@ -7717,8 +7687,6 @@ keep_going_pass_signal (struct execution_control_state *ecs) "resume of %s deferred\n", target_pid_to_str (tp->ptid)); } - - discard_cleanups (old_cleanups); } else { @@ -7782,14 +7750,12 @@ keep_going_pass_signal (struct execution_control_state *ecs) { exception_print (gdb_stderr, e); stop_waiting (ecs); - discard_cleanups (old_cleanups); return; } END_CATCH ecs->event_thread->control.trap_expected = (remove_bp || remove_wps); - discard_cleanups (old_cleanups); resume (ecs->event_thread->suspend.stop_signal); } @@ -8469,7 +8435,7 @@ sig_print_info (enum gdb_signal oursig) /* Specify how various signals in the inferior should be handled. */ static void -handle_command (char *args, int from_tty) +handle_command (const char *args, int from_tty) { int digits, wordlen; int sigfirst, signum, siglast; @@ -8682,7 +8648,7 @@ Use \"info signals\" for a list of symbolic signals.")); targets, all signals should be in the signal tables). */ static void -info_signals_command (char *signum_exp, int from_tty) +info_signals_command (const char *signum_exp, int from_tty) { enum gdb_signal oursig; @@ -9101,7 +9067,7 @@ static const char *const exec_direction_names[] = { }; static void -set_exec_direction_func (char *args, int from_tty, +set_exec_direction_func (const char *args, int from_tty, struct cmd_list_element *cmd) { if (target_can_execute_reverse)