Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Jul 2016 13:23:37 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r418964 - in head/devel/gdb: . files
Message-ID:  <201607231323.u6NDNbjc048316@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb (src,doc committer)
Date: Sat Jul 23 13:23:37 2016
New Revision: 418964
URL: https://svnweb.freebsd.org/changeset/ports/418964

Log:
  A few more recent patches that were merged to upstream GDB:
  
  - Handle version 1a of NT_PRPSINFO notes which include the pr_pid field.
  - Replace patch-sigev with upstream version.  Note that upstream GDB
    doesn't define SIGLIBRT on older OS versions, so do that in the port
    Makefile instead.
  - Use PT_GET_EVENT_MASK/PT_SET_EVENT_MASK (new in 12).
  - Fix a bug where fork and LWP events weren't enabled in new child
    processes when following child processes after a fork.
  - Handle "real" vfork done events via PTRACE_VFORK (new in 12).
  
  PR:		211254
  Approved by:	luca.pizzamiglio@gmail.com (maintainer)

Added:
  head/devel/gdb/files/commit-0064d22   (contents, props changed)
  head/devel/gdb/files/commit-5fa14c6   (contents, props changed)
  head/devel/gdb/files/commit-bc7b765   (contents, props changed)
  head/devel/gdb/files/commit-da95a26   (contents, props changed)
  head/devel/gdb/files/commit-dbaed38   (contents, props changed)
Deleted:
  head/devel/gdb/files/patch-sigev
Modified:
  head/devel/gdb/Makefile

Modified: head/devel/gdb/Makefile
==============================================================================
--- head/devel/gdb/Makefile	Sat Jul 23 12:32:18 2016	(r418963)
+++ head/devel/gdb/Makefile	Sat Jul 23 13:23:37 2016	(r418964)
@@ -3,7 +3,7 @@
 
 PORTNAME=	gdb
 PORTVERSION=	7.11.1
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	devel
 MASTER_SITES=	GNU
 
@@ -43,7 +43,12 @@ EXTRA_PATCHES=	${FILESDIR}/commit-21002a
 		${FILESDIR}/commit-bb2a62e \
 		${FILESDIR}/commit-8607ea6 \
 		${FILESDIR}/commit-2c5c2a3 \
-		${FILESDIR}/commit-ee95032
+		${FILESDIR}/commit-ee95032 \
+		${FILESDIR}/commit-bc7b765 \
+		${FILESDIR}/commit-0064d22 \
+		${FILESDIR}/commit-da95a26 \
+		${FILESDIR}/commit-5fa14c6 \
+		${FILESDIR}/commit-dbaed38
 
 VER=		${PORTVERSION:S/.//g}
 PLIST_SUB=	VER=${VER}
@@ -84,6 +89,11 @@ TUI_CONFIGURE_ENABLE=	tui
 
 .include <bsd.port.options.mk>
 
+.if ${OSVERSION} < 1000010
+# FreeBSD 9.x and earlier do not define SIGLIBRT in <sys/signal.h>
+CFLAGS+=	-DSIGLIBRT=33
+.endif
+
 .if ! ${PORT_OPTIONS:MBUNDLED_READLINE}
 EXCLUDE+=	readline
 .endif

Added: head/devel/gdb/files/commit-0064d22
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-0064d22	Sat Jul 23 13:23:37 2016	(r418964)
@@ -0,0 +1,83 @@
+commit 0064d22386b99c047bbff3bcc73b6bfce9c29b4c
+Author: John Baldwin <jhb@FreeBSD.org>
+Date:   Mon Jul 4 19:19:48 2016 -0700
+
+    Handle version 1a of FreeBSD's NT_PRSINFO.
+    
+    Version 1a adds a pr_pid member containing the process ID of the
+    terminating process.  The presence of pr_pid is inferred from the
+    note's size.
+    
+    bfd/ChangeLog:
+    
+    	* elf.c (elfcore_grok_freebsd_psinfo): Check for minimum note size
+    	and handle pr_pid if present.
+
+diff --git bfd/elf.c bfd/elf.c
+index 2cc64e8..ba1774e 100644
+--- bfd/elf.c
++++ bfd/elf.c
+@@ -9590,27 +9590,36 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
+ {
+   size_t offset;
+ 
+-  /* Check for version 1 in pr_version. */
+-  if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
+-    return FALSE;
+-  offset = 4;
+-
+-  /* Skip over pr_psinfosz. */
+   switch (abfd->arch_info->bits_per_word)
+     {
+     case 32:
+-      offset += 4;
++      if (note->descsz < 108)
++	return FALSE;
+       break;
+ 
+     case 64:
+-      offset += 4;	/* Padding before pr_psinfosz. */
+-      offset += 8;
++      if (note->descsz < 120)
++	return FALSE;
+       break;
+ 
+     default:
+       return FALSE;
+     }
+ 
++  /* Check for version 1 in pr_version.  */
++  if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
++    return FALSE;
++  offset = 4;
++
++  /* Skip over pr_psinfosz. */
++  if (abfd->arch_info->bits_per_word == 32)
++    offset += 4;
++  else
++    {
++      offset += 4;	/* Padding before pr_psinfosz. */
++      offset += 8;
++    }
++
+   /* pr_fname is PRFNAMESZ (16) + 1 bytes in size.  */
+   elf_tdata (abfd)->core->program
+     = _bfd_elfcore_strndup (abfd, note->descdata + offset, 17);
+@@ -9619,6 +9628,17 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
+   /* pr_psargs is PRARGSZ (80) + 1 bytes in size.  */
+   elf_tdata (abfd)->core->command
+     = _bfd_elfcore_strndup (abfd, note->descdata + offset, 81);
++  offset += 81;
++
++  /* Padding before pr_pid.  */
++  offset += 2;
++
++  /* The pr_pid field was added in version "1a".  */
++  if (note->descsz < offset + 4)
++    return TRUE;
++
++  elf_tdata (abfd)->core->pid
++    = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
+ 
+   return TRUE;
+ }

Added: head/devel/gdb/files/commit-5fa14c6
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-5fa14c6	Sat Jul 23 13:23:37 2016	(r418964)
@@ -0,0 +1,30 @@
+commit 5fa14c6b9789bad6f91dd21889f7b1a0eb75c6d0
+Author: John Baldwin <jhb@FreeBSD.org>
+Date:   Fri Jul 15 17:01:21 2016 -0700
+
+    Enable ptrace events on new child processes.
+    
+    New child processes on FreeBSD do not inherit optional ptrace events
+    such as fork and LWP events from the parent process.  Instead,
+    explicitly enable events on new children when reporting a fork
+    event.
+    
+    gdb/ChangeLog:
+    
+    	* fbsd-nat.c (fbsd_wait): Use "fbsd_enable_proc_events" on
+    	new child processes.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 508ab19..5e4304e 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -836,6 +836,9 @@ fbsd_wait (struct target_ops *ops,
+ 		  child_ptid = ptid_build (child, pl.pl_lwpid, 0);
+ 		}
+ 
++	      /* Enable additional events on the child process.  */
++	      fbsd_enable_proc_events (ptid_get_pid (child_ptid));
++
+ 	      /* For vfork, the child process will have the P_PPWAIT
+ 		 flag set.  */
+ 	      fbsd_fetch_kinfo_proc (child, &kp);

Added: head/devel/gdb/files/commit-bc7b765
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-bc7b765	Sat Jul 23 13:23:37 2016	(r418964)
@@ -0,0 +1,102 @@
+commit bc7b765ab71f967eb2a9c3da111d7529eec46fbe
+Author: John Baldwin <jhb@FreeBSD.org>
+Date:   Sun Jul 3 11:56:21 2016 -0700
+
+    Pass SIGLIBRT directly to child processes.
+    
+    FreeBSD's librt uses SIGLIBRT as an internal signal to implement
+    SIGEV_THREAD sigevent notifications.  Similar to SIGLWP or SIGCANCEL
+    this signal should be passed through to child processes by default.
+    
+    include/ChangeLog:
+    
+    	* signals.def: Add GDB_SIGNAL_LIBRT.
+    
+    gdb/ChangeLog:
+    
+    	* common/signals.c (gdb_signal_from_host): Handle SIGLIBRT.
+    	(do_gdb_signal_to_host): Likewise.
+    	* infrun.c (_initialize_infrun): Pass GDB_SIGNAL_LIBRT through to
+    	programs.
+    	* proc-events.c (signal_table): Add entry for SIGLIBRT.
+
+diff --git gdb/common/signals.c gdb/common/signals.c
+index 45c0c73..f84935d 100644
+--- gdb/common/signals.c
++++ gdb/common/signals.c
+@@ -331,6 +331,10 @@ gdb_signal_from_host (int hostsig)
+   if (hostsig == SIGINFO)
+     return GDB_SIGNAL_INFO;
+ #endif
++#if defined (SIGLIBRT)
++  if (hostsig == SIGLIBRT)
++    return GDB_SIGNAL_LIBRT;
++#endif
+ 
+ #if defined (REALTIME_LO)
+   if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
+@@ -584,6 +588,10 @@ do_gdb_signal_to_host (enum gdb_signal oursig,
+     case GDB_SIGNAL_INFO:
+       return SIGINFO;
+ #endif
++#if defined (SIGLIBRT)
++    case GDB_SIGNAL_LIBRT:
++      return SIGLIBRT;
++#endif
+ 
+     default:
+ #if defined (REALTIME_LO)
+diff --git gdb/infrun.c gdb/infrun.c
+index 70a0790..257ac8a 100644
+--- gdb/infrun.c
++++ gdb/infrun.c
+@@ -9409,6 +9409,8 @@ leave it stopped or free to run as needed."),
+   signal_print[GDB_SIGNAL_WAITING] = 0;
+   signal_stop[GDB_SIGNAL_CANCEL] = 0;
+   signal_print[GDB_SIGNAL_CANCEL] = 0;
++  signal_stop[GDB_SIGNAL_LIBRT] = 0;
++  signal_print[GDB_SIGNAL_LIBRT] = 0;
+ 
+   /* Update cached state.  */
+   signal_cache_update (-1);
+diff --git gdb/proc-events.c gdb/proc-events.c
+index b291d31..daa6f58 100644
+--- gdb/proc-events.c
++++ gdb/proc-events.c
+@@ -1536,6 +1536,9 @@ static struct trans signal_table[] =
+ #ifdef SIGAIO
+   { SIGAIO, "SIGAIO", "Asynchronous I/O signal" },
+ #endif
++#ifdef SIGLIBRT
++  { SIGLIBRT, "SIGLIBRT", "Used by librt" },
++#endif
+ 
+   /* FIXME: add real-time signals.  */
+ };
+diff --git include/gdb/ChangeLog include/gdb/ChangeLog
+index f05ba4b..05f127e 100644
+--- include/gdb/ChangeLog
++++ include/gdb/ChangeLog
+@@ -1,3 +1,7 @@
++2016-07-15  John Baldwin  <jhb@FreeBSD.org>
++
++	* signals.def: Add GDB_SIGNAL_LIBRT.
++
+ 2016-01-06  Mike Frysinger  <vapier@gentoo.org>
+ 
+ 	* remote-sim.h (sim_open): Mark argv const.
+diff --git include/gdb/signals.def include/gdb/signals.def
+index 61cc88c..2b30e71 100644
+--- include/gdb/signals.def
++++ include/gdb/signals.def
+@@ -194,7 +194,9 @@ SET (GDB_EXC_EMULATION, 148, "EXC_EMULATION", "Emulation instruction")
+ SET (GDB_EXC_SOFTWARE, 149, "EXC_SOFTWARE", "Software generated exception")
+ SET (GDB_EXC_BREAKPOINT, 150, "EXC_BREAKPOINT", "Breakpoint")
+ 
++SET (GDB_SIGNAL_LIBRT, 151, "SIGLIBRT", "librt internal signal")
++
+ /* If you are adding a new signal, add it just above this comment.  */
+ 
+ /* Last and unused enum value, for sizing arrays, etc.  */
+-SET (GDB_SIGNAL_LAST, 151, NULL, "GDB_SIGNAL_LAST")
++SET (GDB_SIGNAL_LAST, 152, NULL, "GDB_SIGNAL_LAST")

Added: head/devel/gdb/files/commit-da95a26
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-da95a26	Sat Jul 23 13:23:37 2016	(r418964)
@@ -0,0 +1,123 @@
+commit da95a26cc381c0f092f515ffe108075985c16d7f
+Author: John Baldwin <jhb@FreeBSD.org>
+Date:   Fri Jul 15 14:03:10 2016 -0700
+
+    Consolidate code to enable optional FreeBSD native target event reporting.
+    
+    Add a new function to enable optional event reporting for FreeBSD native
+    targets.  Specifically, use this to enable fork and LWP events.
+    The bodies of fbsd_enable_follow_fork and fbsd_enable_lwp_events have been
+    subsumed into the new function.  In addition, use the PT_GET_EVENT_MASK
+    and PT_EVENT_SET_MASK requests added in FreeBSD 12 when present to enable
+    these events.
+    
+    gdb/ChangeLog:
+    
+    	* fbsd-nat.c (fbsd_enable_lwp_events): Remove function.
+    	(fbsd_enable_proc_events): New function.
+    	(fbsd_enable_follow_fork): Remove function.
+    	(fbsd_post_startup_inferior): Use "fbsd_enable_proc_events".
+    	(fbsd_post_attach): Likewise.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index fa9516e..508ab19 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -412,22 +412,43 @@ fbsd_thread_name (struct target_ops *self, struct thread_info *thr)
+ }
+ #endif
+ 
+-#ifdef PT_LWP_EVENTS
+-/* Enable LWP events for a specific process.
++/* Enable additional event reporting on new processes.
+ 
+-   To catch LWP events, PT_LWP_EVENTS is set on every traced process.
++   To catch fork events, PTRACE_FORK is set on every traced process
++   to enable stops on returns from fork or vfork.  Note that both the
++   parent and child will always stop, even if system call stops are
++   not enabled.
++
++   To catch LWP events, PTRACE_EVENTS is set on every traced process.
+    This enables stops on the birth for new LWPs (excluding the "main" LWP)
+    and the death of LWPs (excluding the last LWP in a process).  Note
+    that unlike fork events, the LWP that creates a new LWP does not
+    report an event.  */
+ 
+ static void
+-fbsd_enable_lwp_events (pid_t pid)
++fbsd_enable_proc_events (pid_t pid)
+ {
++#ifdef PT_GET_EVENT_MASK
++  int events;
++
++  if (ptrace (PT_GET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
++	      sizeof (events)) == -1)
++    perror_with_name (("ptrace"));
++  events |= PTRACE_FORK | PTRACE_LWP;
++  if (ptrace (PT_SET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
++	      sizeof (events)) == -1)
++    perror_with_name (("ptrace"));
++#else
++#ifdef TDP_RFPPWAIT
++  if (ptrace (PT_FOLLOW_FORK, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
++    perror_with_name (("ptrace"));
++#endif
++#ifdef PT_LWP_EVENTS
+   if (ptrace (PT_LWP_EVENTS, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
+     perror_with_name (("ptrace"));
+-}
+ #endif
++#endif
++}
+ 
+ /* Add threads for any new LWPs in a process.
+ 
+@@ -957,20 +978,6 @@ fbsd_remove_vfork_catchpoint (struct target_ops *self, int pid)
+ {
+   return 0;
+ }
+-
+-/* Enable fork tracing for a specific process.
+-   
+-   To catch fork events, PT_FOLLOW_FORK is set on every traced process
+-   to enable stops on returns from fork or vfork.  Note that both the
+-   parent and child will always stop, even if system call stops are
+-   not enabled.  */
+-
+-static void
+-fbsd_enable_follow_fork (pid_t pid)
+-{
+-  if (ptrace (PT_FOLLOW_FORK, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
+-    perror_with_name (("ptrace"));
+-}
+ #endif
+ 
+ /* Implement the "to_post_startup_inferior" target_ops method.  */
+@@ -978,12 +985,7 @@ fbsd_enable_follow_fork (pid_t pid)
+ static void
+ fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
+ {
+-#ifdef TDP_RFPPWAIT
+-  fbsd_enable_follow_fork (ptid_get_pid (pid));
+-#endif
+-#ifdef PT_LWP_EVENTS
+-  fbsd_enable_lwp_events (ptid_get_pid (pid));
+-#endif
++  fbsd_enable_proc_events (ptid_get_pid (pid));
+ }
+ 
+ /* Implement the "to_post_attach" target_ops method.  */
+@@ -991,12 +993,7 @@ fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
+ static void
+ fbsd_post_attach (struct target_ops *self, int pid)
+ {
+-#ifdef TDP_RFPPWAIT
+-  fbsd_enable_follow_fork (pid);
+-#endif
+-#ifdef PT_LWP_EVENTS
+-  fbsd_enable_lwp_events (pid);
+-#endif
++  fbsd_enable_proc_events (pid);
+   fbsd_add_threads (pid);
+ }
+ 

Added: head/devel/gdb/files/commit-dbaed38
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/gdb/files/commit-dbaed38	Sat Jul 23 13:23:37 2016	(r418964)
@@ -0,0 +1,157 @@
+commit dbaed3853474e7bd824a25bc454a8f2fdd71d2b3
+Author: John Baldwin <jhb@FreeBSD.org>
+Date:   Sat Jul 16 10:14:08 2016 -0700
+
+    Use a real vfork done event on FreeBSD when available.
+    
+    FreeBSD 12 recently added a new ptrace event to indicate when the vfork
+    parent resumes after the child process stops sharing the address space.
+    Use this event to report a proper TARGET_WAITKIND_VFORK_DONE rather than
+    faking a vfork done event after a delay.
+    
+    gdb/ChangeLog:
+    
+    	* fbsd-nat.c (fbsd_enable_proc_events): Enable "PTRACE_VFORK"
+    	events.
+    	(fbsd_pending_vfork_done): Only define if "PTRACE_VFORK" is not
+    	defined.
+    	(fbsd_add_vfork_done): Likewise.
+    	(fbsd_is_vfork_done_pending): Likewise.
+    	(fbsd_next_vfork_done): Likewise.
+    	(fbsd_resume): Only ignore pending vfork done events if
+    	"PTRACE_VFORK" is not defined.
+    	(fbsd_wait): Only look for pending vfork done events if
+    	"PTRACE_VFORK" is not defined.
+    	[PTRACE_VFORK]: Handle "PL_FLAG_VFORKED" and "PL_FLAG_VFORK_DONE"
+    	events.
+    	(fbsd_follow_fork): Only fake a vfork done event if "PTRACE_VFORK"
+    	is not defined.
+
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 5e4304e..ade62f1 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -435,6 +435,9 @@ fbsd_enable_proc_events (pid_t pid)
+ 	      sizeof (events)) == -1)
+     perror_with_name (("ptrace"));
+   events |= PTRACE_FORK | PTRACE_LWP;
++#ifdef PTRACE_VFORK
++  events |= PTRACE_VFORK;
++#endif
+   if (ptrace (PT_SET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
+ 	      sizeof (events)) == -1)
+     perror_with_name (("ptrace"));
+@@ -598,6 +601,7 @@ fbsd_is_child_pending (pid_t pid)
+   return null_ptid;
+ }
+ 
++#ifndef PTRACE_VFORK
+ static struct fbsd_fork_info *fbsd_pending_vfork_done;
+ 
+ /* Record a pending vfork done event.  */
+@@ -647,6 +651,7 @@ fbsd_next_vfork_done (void)
+   return null_ptid;
+ }
+ #endif
++#endif
+ 
+ static int
+ resume_one_thread_cb (struct thread_info *tp, void *data)
+@@ -686,7 +691,7 @@ static void
+ fbsd_resume (struct target_ops *ops,
+ 	     ptid_t ptid, int step, enum gdb_signal signo)
+ {
+-#ifdef TDP_RFPPWAIT
++#if defined(TDP_RFPPWAIT) && !defined(PTRACE_VFORK)
+   pid_t pid;
+ 
+   /* Don't PT_CONTINUE a process which has a pending vfork done event.  */
+@@ -731,12 +736,14 @@ fbsd_wait (struct target_ops *ops,
+ 
+   while (1)
+     {
++#ifndef PTRACE_VFORK
+       wptid = fbsd_next_vfork_done ();
+       if (!ptid_equal (wptid, null_ptid))
+ 	{
+ 	  ourstatus->kind = TARGET_WAITKIND_VFORK_DONE;
+ 	  return wptid;
+ 	}
++#endif
+       wptid = super_wait (ops, ptid, ourstatus, target_options);
+       if (ourstatus->kind == TARGET_WAITKIND_STOPPED)
+ 	{
+@@ -812,12 +819,18 @@ fbsd_wait (struct target_ops *ops,
+ #ifdef TDP_RFPPWAIT
+ 	  if (pl.pl_flags & PL_FLAG_FORKED)
+ 	    {
++#ifndef PTRACE_VFORK
+ 	      struct kinfo_proc kp;
++#endif
+ 	      ptid_t child_ptid;
+ 	      pid_t child;
+ 
+ 	      child = pl.pl_child_pid;
+ 	      ourstatus->kind = TARGET_WAITKIND_FORKED;
++#ifdef PTRACE_VFORK
++	      if (pl.pl_flags & PL_FLAG_VFORKED)
++		ourstatus->kind = TARGET_WAITKIND_VFORKED;
++#endif
+ 
+ 	      /* Make sure the other end of the fork is stopped too.  */
+ 	      child_ptid = fbsd_is_child_pending (child);
+@@ -839,11 +852,13 @@ fbsd_wait (struct target_ops *ops,
+ 	      /* Enable additional events on the child process.  */
+ 	      fbsd_enable_proc_events (ptid_get_pid (child_ptid));
+ 
++#ifndef PTRACE_VFORK
+ 	      /* For vfork, the child process will have the P_PPWAIT
+ 		 flag set.  */
+ 	      fbsd_fetch_kinfo_proc (child, &kp);
+ 	      if (kp.ki_flag & P_PPWAIT)
+ 		ourstatus->kind = TARGET_WAITKIND_VFORKED;
++#endif
+ 	      ourstatus->value.related_pid = child_ptid;
+ 
+ 	      return wptid;
+@@ -857,6 +872,14 @@ fbsd_wait (struct target_ops *ops,
+ 	      fbsd_remember_child (wptid);
+ 	      continue;
+ 	    }
++
++#ifdef PTRACE_VFORK
++	  if (pl.pl_flags & PL_FLAG_VFORK_DONE)
++	    {
++	      ourstatus->kind = TARGET_WAITKIND_VFORK_DONE;
++	      return wptid;
++	    }
++#endif
+ #endif
+ 
+ #ifdef PL_FLAG_EXEC
+@@ -918,7 +941,6 @@ fbsd_follow_fork (struct target_ops *ops, int follow_child,
+   if (!follow_child && detach_fork)
+     {
+       struct thread_info *tp = inferior_thread ();
+-      int has_vforked = tp->pending_follow.kind == TARGET_WAITKIND_VFORKED;
+       pid_t child_pid = ptid_get_pid (tp->pending_follow.value.related_pid);
+ 
+       /* Breakpoints have already been detached from the child by
+@@ -927,7 +949,8 @@ fbsd_follow_fork (struct target_ops *ops, int follow_child,
+       if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
+ 	perror_with_name (("ptrace"));
+ 
+-      if (has_vforked)
++#ifndef PTRACE_VFORK
++      if (tp->pending_follow.kind == TARGET_WAITKIND_VFORKED)
+ 	{
+ 	  /* We can't insert breakpoints until the child process has
+ 	     finished with the shared memory region.  The parent
+@@ -953,6 +976,7 @@ fbsd_follow_fork (struct target_ops *ops, int follow_child,
+ 	     wait.  */
+ 	  fbsd_add_vfork_done (inferior_ptid);
+ 	}
++#endif
+     }
+ 
+   return 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607231323.u6NDNbjc048316>