From ab1ddbcf110a3f1ad45e3a346d2da98ffb833dec Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 10 Jan 2020 20:05:49 +0000 Subject: [PATCH] Some get_last_target_status tweaks - Make get_last_target_status arguments optional. A following patch will add another argument to get_last_target_status (the event's target), and passing nullptr when we don't care for some piece of info is handier than creating dummy local variables. - Declare nullify_last_target_wait_ptid in a header, and remove the local extern declaration from linux-fork.c. gdb/ChangeLog: 2020-01-10 Pedro Alves * break-catch-sig.c (signal_catchpoint_print_it): Don't pass a ptid to get_last_target_status. * break-catch-syscall.c (print_it_catch_syscall): Don't pass a ptid to get_last_target_status. * infcmd.c (continue_command): Don't pass a target_waitstatus to get_last_target_status. (info_program_command): Don't pass a target_waitstatus to get_last_target_status. * infrun.c (init_wait_for_inferior): Use nullify_last_target_wait_ptid. (get_last_target_status): Handle nullptr arguments. (nullify_last_target_wait_ptid): Clear target_last_waitstatus. (print_stop_event): Don't pass a ptid to get_last_target_status. (normal_stop): Don't pass a ptid to get_last_target_status. * infrun.h (get_last_target_status, set_last_target_status): Move comments here and update. (nullify_last_target_wait_ptid): Declare. * linux-fork.c (fork_load_infrun_state): Remove local extern declaration of nullify_last_target_wait_ptid. * linux-nat.c (get_detach_signal): Don't pass a target_waitstatus to get_last_target_status. --- gdb/ChangeLog | 24 ++++++++++++++++++++++++ gdb/break-catch-sig.c | 3 +-- gdb/break-catch-syscall.c | 3 +-- gdb/infcmd.c | 9 ++------- gdb/infrun.c | 28 +++++++++++++--------------- gdb/infrun.h | 9 +++++++++ gdb/linux-fork.c | 1 - gdb/linux-nat.c | 3 +-- 8 files changed, 51 insertions(+), 29 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a733f0dfa0..2d18e3e439 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,27 @@ +2020-01-10 Pedro Alves + + * break-catch-sig.c (signal_catchpoint_print_it): Don't pass a + ptid to get_last_target_status. + * break-catch-syscall.c (print_it_catch_syscall): Don't pass a + ptid to get_last_target_status. + * infcmd.c (continue_command): Don't pass a target_waitstatus to + get_last_target_status. + (info_program_command): Don't pass a target_waitstatus to + get_last_target_status. + * infrun.c (init_wait_for_inferior): Use + nullify_last_target_wait_ptid. + (get_last_target_status): Handle nullptr arguments. + (nullify_last_target_wait_ptid): Clear target_last_waitstatus. + (print_stop_event): Don't pass a ptid to get_last_target_status. + (normal_stop): Don't pass a ptid to get_last_target_status. + * infrun.h (get_last_target_status, set_last_target_status): Move + comments here and update. + (nullify_last_target_wait_ptid): Declare. + * linux-fork.c (fork_load_infrun_state): Remove local extern + declaration of nullify_last_target_wait_ptid. + * linux-nat.c (get_detach_signal): Don't pass a target_waitstatus + to get_last_target_status. + 2020-01-10 Pedro Alves * gdbthread.h (scoped_restore_current_thread) diff --git a/gdb/break-catch-sig.c b/gdb/break-catch-sig.c index a9ec583414..9970efa680 100644 --- a/gdb/break-catch-sig.c +++ b/gdb/break-catch-sig.c @@ -181,12 +181,11 @@ static enum print_stop_action signal_catchpoint_print_it (bpstat bs) { struct breakpoint *b = bs->breakpoint_at; - ptid_t ptid; struct target_waitstatus last; const char *signal_name; struct ui_out *uiout = current_uiout; - get_last_target_status (&ptid, &last); + get_last_target_status (nullptr, &last); signal_name = signal_to_name_or_int (last.value.sig); diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c index 97eb100e6d..e51777c035 100644 --- a/gdb/break-catch-syscall.c +++ b/gdb/break-catch-syscall.c @@ -182,12 +182,11 @@ print_it_catch_syscall (bpstat bs) syscall is. It can be in the TARGET_WAITKIND_SYSCALL_ENTRY or TARGET_WAITKIND_SYSCALL_RETURN, and depending on it we must print "called syscall" or "returned from syscall". */ - ptid_t ptid; struct target_waitstatus last; struct syscall s; struct gdbarch *gdbarch = bs->bp_location_at->gdbarch; - get_last_target_status (&ptid, &last); + get_last_target_status (nullptr, &last); get_syscall_by_number (gdbarch, last.value.syscall_number, &s); diff --git a/gdb/infcmd.c b/gdb/infcmd.c index aea977f492..99823a8f25 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -851,9 +851,8 @@ continue_command (const char *args, int from_tty) else { ptid_t last_ptid; - struct target_waitstatus ws; - get_last_target_status (&last_ptid, &ws); + get_last_target_status (&last_ptid, nullptr); tp = find_thread_ptid (last_ptid); } if (tp != NULL) @@ -1993,11 +1992,7 @@ info_program_command (const char *args, int from_tty) if (non_stop) ptid = inferior_ptid; else - { - struct target_waitstatus ws; - - get_last_target_status (&ptid, &ws); - } + get_last_target_status (&ptid, nullptr); if (ptid == null_ptid || ptid == minus_one_ptid) error (_("No selected thread.")); diff --git a/gdb/infrun.c b/gdb/infrun.c index 2fa5cd89b4..bcfb178ef9 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -78,8 +78,6 @@ static void follow_inferior_reset_breakpoints (void); static int currently_stepping (struct thread_info *tp); -void nullify_last_target_wait_ptid (void); - static void insert_hp_step_resume_breakpoint_at_frame (struct frame_info *); static void insert_step_resume_breakpoint_at_caller (struct frame_info *); @@ -3103,7 +3101,7 @@ init_wait_for_inferior (void) clear_proceed_status (0); - target_last_wait_ptid = minus_one_ptid; + nullify_last_target_wait_ptid (); previous_inferior_ptid = inferior_ptid; } @@ -3847,7 +3845,7 @@ init_thread_stepping_state (struct thread_info *tss) tss->step_after_step_resume_breakpoint = 0; } -/* Set the cached copy of the last ptid/waitstatus. */ +/* See infrun.h. */ void set_last_target_status (ptid_t ptid, struct target_waitstatus status) @@ -3856,22 +3854,24 @@ set_last_target_status (ptid_t ptid, struct target_waitstatus status) target_last_waitstatus = status; } -/* Return the cached copy of the last pid/waitstatus returned by - target_wait()/deprecated_target_wait_hook(). The data is actually - cached by handle_inferior_event(), which gets called immediately - after target_wait()/deprecated_target_wait_hook(). */ +/* See infrun.h. */ void -get_last_target_status (ptid_t *ptidp, struct target_waitstatus *status) +get_last_target_status (ptid_t *ptid, struct target_waitstatus *status) { - *ptidp = target_last_wait_ptid; - *status = target_last_waitstatus; + if (ptid != nullptr) + *ptid = target_last_wait_ptid; + if (status != nullptr) + *status = target_last_waitstatus; } +/* See infrun.h. */ + void nullify_last_target_wait_ptid (void) { target_last_wait_ptid = minus_one_ptid; + target_last_waitstatus = {}; } /* Switch thread contexts. */ @@ -7876,10 +7876,9 @@ void print_stop_event (struct ui_out *uiout, bool displays) { struct target_waitstatus last; - ptid_t last_ptid; struct thread_info *tp; - get_last_target_status (&last_ptid, &last); + get_last_target_status (nullptr, &last); { scoped_restore save_uiout = make_scoped_restore (¤t_uiout, uiout); @@ -7998,9 +7997,8 @@ int normal_stop (void) { struct target_waitstatus last; - ptid_t last_ptid; - get_last_target_status (&last_ptid, &last); + get_last_target_status (nullptr, &last); new_stop_id (); diff --git a/gdb/infrun.h b/gdb/infrun.h index 912514195e..4dd995db7a 100644 --- a/gdb/infrun.h +++ b/gdb/infrun.h @@ -101,12 +101,21 @@ extern void wait_for_inferior (void); target, false otherwise. */ extern int normal_stop (void); +/* Return the cached copy of the last ptid/waitstatus returned + by target_wait()/deprecated_target_wait_hook(). The data is + actually cached by handle_inferior_event(), which gets called + immediately after target_wait()/deprecated_target_wait_hook(). */ extern void get_last_target_status (ptid_t *ptid, struct target_waitstatus *status); +/* Set the cached copy of the last ptid/waitstatus. */ extern void set_last_target_status (ptid_t ptid, struct target_waitstatus status); +/* Clear the cached copy of the last ptid/waitstatus returned by + target_wait(). */ +extern void nullify_last_target_wait_ptid (); + /* Stop all threads. Only returns after everything is halted. */ extern void stop_all_threads (void); diff --git a/gdb/linux-fork.c b/gdb/linux-fork.c index dd925ea8c0..b15bd3badd 100644 --- a/gdb/linux-fork.c +++ b/gdb/linux-fork.c @@ -215,7 +215,6 @@ call_lseek (int fd, off_t offset, int whence) static void fork_load_infrun_state (struct fork_info *fp) { - extern void nullify_last_target_wait_ptid (); int i; linux_nat_switch_fork (fp->ptid); diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 4484fa5c87..a01839c70a 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1315,10 +1315,9 @@ get_detach_signal (struct lwp_info *lp) } else if (!target_is_non_stop_p ()) { - struct target_waitstatus last; ptid_t last_ptid; - get_last_target_status (&last_ptid, &last); + get_last_target_status (&last_ptid, nullptr); if (lp->ptid.lwp () == last_ptid.lwp ()) signo = tp->suspend.stop_signal; -- 2.34.1