From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2370 invoked by alias); 29 Aug 2016 04:12:07 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 2330 invoked by uid 89); 29 Aug 2016 04:12:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.4 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=traced, UD:kind, sergio, Junior X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 29 Aug 2016 04:12:02 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D2759C057FA6 for ; Mon, 29 Aug 2016 04:12:00 +0000 (UTC) Received: from psique.yyz.redhat.com (unused-10-15-17-51.yyz.redhat.com [10.15.17.51]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7T4BxH9017393; Mon, 29 Aug 2016 00:12:00 -0400 From: Sergio Durigan Junior To: GDB Patches Cc: Sergio Durigan Junior Subject: [PATCH 1/2] Use target_continue{,_no_signal} instead of target_resume Date: Mon, 29 Aug 2016 04:12:00 -0000 Message-Id: <1472443911-29056-2-git-send-email-sergiodj@redhat.com> In-Reply-To: <1472443911-29056-1-git-send-email-sergiodj@redhat.com> References: <1472443911-29056-1-git-send-email-sergiodj@redhat.com> X-IsSubscribed: yes X-SW-Source: 2016-08/txt/msg00288.txt.bz2 This commit implements a new function, target_continue, on top of the target_resume function. Then, it replaces all calls to target_resume by calls to target_continue or to the already existing target_continue_no_signal. This is one of the (many) necessary steps needed to consolidate the target interface between GDB and gdbserver. In particular, I am interested in the impact this change will have on the unification of the fork_inferior function (which I have been working on). Tested on the BuildBot, no regressions introduced. gdb/gdbserver/ChangeLog: 2016-08-29 Sergio Durigan Junior * server.c (start_inferior): New variable 'ptid'. Replace calls to the_target->resume by target_continue{,_no_signal}, depending on the case. * target.c (target_stop_and_wait): Call target_continue_no_signal instead of the_target->resume. (target_continue): New function. gdb/ChangeLog: 2016-08-29 Sergio Durigan Junior * fork-child.c (startup_inferior): Replace calls to target_resume by target_continue{,_no_signal}, depending on the case. * linux-nat.c (cleanup_target_stop): Call target_continue_no_signal instead of target_resume. * procfs.c (procfs_wait): Likewise. * target.c (target_continue): New function. * target/target.h (target_continue): New prototype. --- gdb/fork-child.c | 4 ++-- gdb/gdbserver/server.c | 25 +++++++------------------ gdb/gdbserver/target.c | 19 ++++++++++++++----- gdb/linux-nat.c | 2 +- gdb/procfs.c | 4 ++-- gdb/target.c | 8 ++++++++ gdb/target/target.h | 6 ++++++ 7 files changed, 40 insertions(+), 28 deletions(-) diff --git a/gdb/fork-child.c b/gdb/fork-child.c index 6856cf6..3e29a1f 100644 --- a/gdb/fork-child.c +++ b/gdb/fork-child.c @@ -514,7 +514,7 @@ startup_inferior (int ntraps) if (resume_signal != GDB_SIGNAL_TRAP) { /* Let shell child handle its own signals in its own way. */ - target_resume (resume_ptid, 0, resume_signal); + target_continue (resume_ptid, resume_signal); } else { @@ -540,7 +540,7 @@ startup_inferior (int ntraps) break; /* Just make it go on. */ - target_resume (resume_ptid, 0, GDB_SIGNAL_0); + target_continue_no_signal (resume_ptid); } } diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 6fbd61d..9c06443 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -258,12 +258,7 @@ start_inferior (char **argv) if (wrapper_argv != NULL) { - struct thread_resume resume_info; - - memset (&resume_info, 0, sizeof (resume_info)); - resume_info.thread = pid_to_ptid (signal_pid); - resume_info.kind = resume_continue; - resume_info.sig = 0; + ptid_t ptid = pid_to_ptid (signal_pid); last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0); @@ -271,7 +266,7 @@ start_inferior (char **argv) { do { - (*the_target->resume) (&resume_info, 1); + target_continue_no_signal (ptid); last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0); if (last_status.kind != TARGET_WAITKIND_STOPPED) @@ -3929,7 +3924,6 @@ process_serial_event (void) if ((tracing && disconnected_tracing) || any_persistent_commands ()) { - struct thread_resume resume_info; struct process_info *process = find_process_pid (pid); if (process == NULL) @@ -3965,10 +3959,7 @@ process_serial_event (void) process->gdb_detached = 1; /* Detaching implicitly resumes all threads. */ - resume_info.thread = minus_one_ptid; - resume_info.kind = resume_continue; - resume_info.sig = 0; - (*the_target->resume) (&resume_info, 1); + target_continue_no_signal (minus_one_ptid); write_ok (own_buf); break; /* from switch/case */ @@ -4428,7 +4419,7 @@ handle_target_event (int err, gdb_client_data client_data) /* A thread stopped with a signal, but gdb isn't connected to handle it. Pass it down to the inferior, as if it wasn't being traced. */ - struct thread_resume resume_info; + enum gdb_signal signal; if (debug_threads) debug_printf ("GDB not connected; forwarding event %d for" @@ -4436,13 +4427,11 @@ handle_target_event (int err, gdb_client_data client_data) (int) last_status.kind, target_pid_to_str (last_ptid)); - resume_info.thread = last_ptid; - resume_info.kind = resume_continue; if (last_status.kind == TARGET_WAITKIND_STOPPED) - resume_info.sig = gdb_signal_to_host (last_status.value.sig); + signal = last_status.value.sig; else - resume_info.sig = 0; - (*the_target->resume) (&resume_info, 1); + signal = GDB_SIGNAL_0; + target_continue (last_ptid, signal); } } else diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c index 42d22b4..8435dc2 100644 --- a/gdb/gdbserver/target.c +++ b/gdb/gdbserver/target.c @@ -248,12 +248,8 @@ target_stop_and_wait (ptid_t ptid) { struct target_waitstatus status; int was_non_stop = non_stop; - struct thread_resume resume_info; - resume_info.thread = ptid; - resume_info.kind = resume_stop; - resume_info.sig = GDB_SIGNAL_0; - (*the_target->resume) (&resume_info, 1); + target_continue_no_signal (ptid); non_stop = 1; mywait (ptid, &status, 0, 0); @@ -273,6 +269,19 @@ target_continue_no_signal (ptid_t ptid) (*the_target->resume) (&resume_info, 1); } +/* See target/target.h. */ + +void +target_continue (ptid_t ptid, enum gdb_signal signal) +{ + struct thread_resume resume_info; + + resume_info.thread = ptid; + resume_info.kind = resume_continue; + resume_info.sig = gdb_signal_to_host (signal); + (*the_target->resume) (&resume_info, 1); +} + int start_non_stop (int nonstop) { diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 5d5efa0..7410f8e 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4289,7 +4289,7 @@ cleanup_target_stop (void *arg) gdb_assert (arg != NULL); /* Unpause all */ - target_resume (*ptid, 0, GDB_SIGNAL_0); + target_continue_no_signal (*ptid); } static VEC(static_tracepoint_marker_p) * diff --git a/gdb/procfs.c b/gdb/procfs.c index 67b424f..0e0641e 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -3716,7 +3716,7 @@ wait_again: else { /* How to keep going without returning to wfi: */ - target_resume (ptid, 0, GDB_SIGNAL_0); + target_continue_no_signal (ptid); goto wait_again; } } @@ -3742,7 +3742,7 @@ wait_again: /* This is an internal event and should be transparent to wfi, so resume the execution and wait again. See comment in procfs_init_inferior() for more details. */ - target_resume (ptid, 0, GDB_SIGNAL_0); + target_continue_no_signal (ptid); goto wait_again; } #endif diff --git a/gdb/target.c b/gdb/target.c index 13e3cdb..87c9681 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3449,6 +3449,14 @@ target_continue_no_signal (ptid_t ptid) target_resume (ptid, 0, GDB_SIGNAL_0); } +/* See target/target.h. */ + +void +target_continue (ptid_t ptid, enum gdb_signal signal) +{ + target_resume (ptid, 0, signal); +} + /* Concatenate ELEM to LIST, a comma separate list, and return the result. The LIST incoming argument is released. */ diff --git a/gdb/target/target.h b/gdb/target/target.h index 76af732..1bfa1b0 100644 --- a/gdb/target/target.h +++ b/gdb/target/target.h @@ -70,4 +70,10 @@ extern void target_stop_and_wait (ptid_t ptid); extern void target_continue_no_signal (ptid_t ptid); +/* Restart a target previously stopped by target_stop_and_wait. + SIGNAL is delivered to the target. This function must be provided + by the client. */ + +extern void target_continue (ptid_t ptid, enum gdb_signal signal); + #endif /* TARGET_COMMON_H */ -- 2.4.3