Refactor ptrace extended event status.

This commit implements functions for identifying and extracting extended
ptrace event information from a Linux wait status.  These are just
convenience functions intended to hide the ">> 16" used to extract the
event from the wait status word, replacing the hard-coded shift with a more
descriptive function call.  This is preparatory work for implementation of
follow-fork and detach-on-fork for extended-remote linux targets.

gdb/ChangeLog:

	* linux-nat.c (linux_handle_extended_wait): Call
	linux_ptrace_get_extended_event.
	(wait_lwp): Call linux_is_extended_waitstatus.
	(linux_nat_filter_event): Call linux_ptrace_get_extended_event
	and linux_is_extended_waitstatus.
	* nat/linux-ptrace.c (linux_test_for_tracefork): Call
	linux_ptrace_get_extended_event.
	(linux_ptrace_get_extended_event): New function.
	(linux_is_extended_waitstatus): New function.
	* nat/linux-ptrace.h (linux_ptrace_get_extended_event)
	(linux_is_extended_waitstatus): New declarations.

gdb/gdbserver/ChangeLog:

	* linux-low.c (handle_extended_wait): Call
	linux_ptrace_get_extended_event.
	(get_stop_pc, get_detach_signal, linux_low_filter_event): Call
	linux_is_extended_waitstatus.

---
This commit is contained in:
Don Breazeal 2014-09-19 10:54:34 -07:00
parent e00d879a2e
commit 89a5711c56
6 changed files with 51 additions and 9 deletions

View file

@ -1,3 +1,17 @@
2014-09-19 Don Breazeal <donb@codesourcery.com>
* linux-nat.c (linux_handle_extended_wait): Call
linux_ptrace_get_extended_event.
(wait_lwp): Call linux_is_extended_waitstatus.
(linux_nat_filter_event): Call linux_ptrace_get_extended_event
and linux_is_extended_waitstatus.
* nat/linux-ptrace.c (linux_test_for_tracefork): Call
linux_ptrace_get_extended_event.
(linux_ptrace_get_extended_event): New function.
(linux_is_extended_waitstatus): New function.
* nat/linux-ptrace.h (linux_ptrace_get_extended_event)
(linux_is_extended_waitstatus): New declarations.
2014-09-19 Yao Qi <yao@codesourcery.com> 2014-09-19 Yao Qi <yao@codesourcery.com>
* dwarf2read.c (dwarf_decode_lines): Update declaration. * dwarf2read.c (dwarf_decode_lines): Update declaration.

View file

@ -1,3 +1,10 @@
2014-09-19 Don Breazeal <donb@codesourcery.com>
* linux-low.c (handle_extended_wait): Call
linux_ptrace_get_extended_event.
(get_stop_pc, get_detach_signal, linux_low_filter_event): Call
linux_is_extended_waitstatus.
2014-09-16 Joel Brobecker <brobecker@adacore.com> 2014-09-16 Joel Brobecker <brobecker@adacore.com>
* Makefile.in (CPPFLAGS): Define. * Makefile.in (CPPFLAGS): Define.

View file

@ -370,7 +370,7 @@ linux_add_process (int pid, int attached)
static void static void
handle_extended_wait (struct lwp_info *event_child, int wstat) handle_extended_wait (struct lwp_info *event_child, int wstat)
{ {
int event = wstat >> 16; int event = linux_ptrace_get_extended_event (wstat);
struct thread_info *event_thr = get_lwp_thread (event_child); struct thread_info *event_thr = get_lwp_thread (event_child);
struct lwp_info *new_lwp; struct lwp_info *new_lwp;
@ -512,7 +512,7 @@ get_stop_pc (struct lwp_info *lwp)
if (WSTOPSIG (lwp->last_status) == SIGTRAP if (WSTOPSIG (lwp->last_status) == SIGTRAP
&& !lwp->stepping && !lwp->stepping
&& !lwp->stopped_by_watchpoint && !lwp->stopped_by_watchpoint
&& lwp->last_status >> 16 == 0) && !linux_is_extended_waitstatus (lwp->last_status))
stop_pc -= the_low_target.decr_pc_after_break; stop_pc -= the_low_target.decr_pc_after_break;
if (debug_threads) if (debug_threads)
@ -1056,7 +1056,7 @@ get_detach_signal (struct thread_info *thread)
} }
/* Extended wait statuses aren't real SIGTRAPs. */ /* Extended wait statuses aren't real SIGTRAPs. */
if (WSTOPSIG (status) == SIGTRAP && status >> 16 != 0) if (WSTOPSIG (status) == SIGTRAP && linux_is_extended_waitstatus (status))
{ {
if (debug_threads) if (debug_threads)
debug_printf ("GPS: lwp %s had stopped with extended " debug_printf ("GPS: lwp %s had stopped with extended "
@ -1869,7 +1869,7 @@ linux_low_filter_event (ptid_t filter_ptid, int lwpid, int wstat)
} }
if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGTRAP if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGTRAP
&& wstat >> 16 != 0) && linux_is_extended_waitstatus (wstat))
{ {
handle_extended_wait (child, wstat); handle_extended_wait (child, wstat);
return NULL; return NULL;

View file

@ -1996,7 +1996,7 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
{ {
int pid = ptid_get_lwp (lp->ptid); int pid = ptid_get_lwp (lp->ptid);
struct target_waitstatus *ourstatus = &lp->waitstatus; struct target_waitstatus *ourstatus = &lp->waitstatus;
int event = status >> 16; int event = linux_ptrace_get_extended_event (status);
if (event == PTRACE_EVENT_FORK || event == PTRACE_EVENT_VFORK if (event == PTRACE_EVENT_FORK || event == PTRACE_EVENT_VFORK
|| event == PTRACE_EVENT_CLONE) || event == PTRACE_EVENT_CLONE)
@ -2362,7 +2362,8 @@ wait_lwp (struct lwp_info *lp)
} }
/* Handle GNU/Linux's extended waitstatus for trace events. */ /* Handle GNU/Linux's extended waitstatus for trace events. */
if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0) if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP
&& linux_is_extended_waitstatus (status))
{ {
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -2921,6 +2922,7 @@ static struct lwp_info *
linux_nat_filter_event (int lwpid, int status, int *new_pending_p) linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
{ {
struct lwp_info *lp; struct lwp_info *lp;
int event = linux_ptrace_get_extended_event (status);
*new_pending_p = 0; *new_pending_p = 0;
@ -2940,7 +2942,7 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
thread changes its tid to the tgid. */ thread changes its tid to the tgid. */
if (WIFSTOPPED (status) && lp == NULL if (WIFSTOPPED (status) && lp == NULL
&& (WSTOPSIG (status) == SIGTRAP && status >> 16 == PTRACE_EVENT_EXEC)) && (WSTOPSIG (status) == SIGTRAP && event == PTRACE_EVENT_EXEC))
{ {
/* A multi-thread exec after we had seen the leader exiting. */ /* A multi-thread exec after we had seen the leader exiting. */
if (debug_linux_nat) if (debug_linux_nat)
@ -2984,7 +2986,8 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
} }
/* Handle GNU/Linux's extended waitstatus for trace events. */ /* Handle GNU/Linux's extended waitstatus for trace events. */
if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0) if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP
&& linux_is_extended_waitstatus (status))
{ {
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,

View file

@ -416,7 +416,7 @@ linux_test_for_tracefork (int child_pid)
/* Check if we received a fork event notification. */ /* Check if we received a fork event notification. */
if (ret == child_pid && WIFSTOPPED (status) if (ret == child_pid && WIFSTOPPED (status)
&& status >> 16 == PTRACE_EVENT_FORK) && linux_ptrace_get_extended_event (status) == PTRACE_EVENT_FORK)
{ {
/* We did receive a fork event notification. Make sure its PID /* We did receive a fork event notification. Make sure its PID
is reported. */ is reported. */
@ -550,3 +550,19 @@ linux_ptrace_set_additional_flags (int flags)
{ {
additional_flags = flags; additional_flags = flags;
} }
/* Extract extended ptrace event from wait status. */
int
linux_ptrace_get_extended_event (int wstat)
{
return (wstat >> 16);
}
/* Determine whether wait status denotes an extended event. */
int
linux_is_extended_waitstatus (int wstat)
{
return (linux_ptrace_get_extended_event (wstat) != 0);
}

View file

@ -92,5 +92,7 @@ extern int linux_supports_traceclone (void);
extern int linux_supports_tracevforkdone (void); extern int linux_supports_tracevforkdone (void);
extern int linux_supports_tracesysgood (void); extern int linux_supports_tracesysgood (void);
extern void linux_ptrace_set_additional_flags (int); extern void linux_ptrace_set_additional_flags (int);
extern int linux_ptrace_get_extended_event (int wstat);
extern int linux_is_extended_waitstatus (int wstat);
#endif /* COMMON_LINUX_PTRACE_H */ #endif /* COMMON_LINUX_PTRACE_H */