This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] gdb: Avoid using W_STOPCODE(0) as this is ambiguous on MIPS


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=953473375500a809fbb3eca3efa4dbb670c3a32f

commit 953473375500a809fbb3eca3efa4dbb670c3a32f
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Tue Jul 3 19:02:48 2018 +0100

    gdb: Avoid using W_STOPCODE(0) as this is ambiguous on MIPS
    
    The MIPS target supports 127 signals, and this can create an ambiguity
    in process wait statuses.  A status value of 0x007f could potentially
    indicate a process that has exited with signal 127, or a process that
    has stopped with signal 0.
    
    In uClibc-ng the interpretation of 0x007f is that the process has
    exited with signal 127 rather than stopped with signal 0, and so,
    WIFSTOPPED (W_STOPCODE (0)) will be false rather than true as it would
    be on most other platforms.
    
    Given that it's pretty easy to avoid using W_STOPCODE (0), lets do that.
    
    gdb/ChangeLog:
    
    	* linux-nat.c (linux_nat_target::follow_fork): Avoid using
    	'W_STOPCODE (0)' as this could be ambiguous.

Diff:
---
 gdb/ChangeLog   |  6 ++++++
 gdb/linux-nat.c | 15 +++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4359456..0d38674 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-06  Sergey Korolev  <s.korolev@ndmsystems.com>
+	    Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* linux-nat.c (linux_nat_target::follow_fork): Avoid using
+	'W_STOPCODE (0)' as this could be ambiguous.
+
 2018-08-03  Sergio Durigan Junior  <sergiodj@redhat.com>
 
 	* ser-tcp.c (net_open): Fix thinko when deciding whether to
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 86d3dfd..d2c88ad 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -445,7 +445,6 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork)
   if (!follow_child)
     {
       struct lwp_info *child_lp = NULL;
-      int status = W_STOPCODE (0);
       int has_vforked;
       ptid_t parent_ptid, child_ptid;
       int parent_pid, child_pid;
@@ -465,6 +464,8 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork)
       /* Detach new forked process?  */
       if (detach_fork)
 	{
+	  int child_stop_signal = 0;
+	  bool detach_child = true;
 	  struct cleanup *old_chain = make_cleanup (delete_lwp_cleanup,
 						    child_lp);
 
@@ -484,18 +485,24 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork)
 	  if (!gdbarch_software_single_step_p (target_thread_architecture
 					       (parent_ptid)))
 	    {
+	      int status;
+
 	      linux_disable_event_reporting (child_pid);
 	      if (ptrace (PTRACE_SINGLESTEP, child_pid, 0, 0) < 0)
 		perror_with_name (_("Couldn't do single step"));
 	      if (my_waitpid (child_pid, &status, 0) < 0)
 		perror_with_name (_("Couldn't wait vfork process"));
+	      else
+		{
+		  detach_child = WIFSTOPPED (status);
+		  child_stop_signal = WSTOPSIG (status);
+		}
 	    }
 
-	  if (WIFSTOPPED (status))
+	  if (detach_child)
 	    {
-	      int signo;
+	      int signo = child_stop_signal;
 
-	      signo = WSTOPSIG (status);
 	      if (signo != 0
 		  && !signal_pass_state (gdb_signal_from_host (signo)))
 		signo = 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]