Index: head/devel/gdb/Makefile =================================================================== --- head/devel/gdb/Makefile (revision 418963) +++ head/devel/gdb/Makefile (revision 418964) @@ -1,139 +1,149 @@ # Created by: Steven Kreuzer # $FreeBSD$ PORTNAME= gdb PORTVERSION= 7.11.1 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= devel MASTER_SITES= GNU MAINTAINER= luca.pizzamiglio@gmail.com COMMENT= GNU GDB of newer version than comes with the system LICENSE= GPLv3 TEST_DEPENDS= runtest:misc/dejagnu TEST_TARGET= check USES= cpe iconv gmake libtool tar:xz USE_CSTD= gnu89 CPE_VENDOR= gnu GNU_CONFIGURE= yes CONFIGURE_ENV= CONFIGURED_M4=m4 CONFIGURED_BISON=byacc CONFIGURE_ARGS= --program-suffix=${PORTVERSION:S/.//g} \ --enable-targets=all --enable-64-bit-bfd \ --with-gdb-datadir=${PREFIX}/share/gdb${PORTVERSION:S/.//g} \ --with-separate-debug-dir=/usr/lib/debug \ ${ICONV_CONFIGURE_ARG} \ --without-libunwind-ia64 CFLAGS:= ${CFLAGS:C/ +$//} # blanks at EOL creep in sometimes CFLAGS+= -DRL_NO_COMPAT -Wno-unused-function -Wno-unused-variable EXCLUDE= dejagnu expect sim texinfo intl EXTRACT_AFTER_ARGS= ${EXCLUDE:S/^/--exclude /} EXTRA_PATCHES= ${FILESDIR}/commit-21002a6 \ ${FILESDIR}/commit-b00f86d \ ${FILESDIR}/commit-aa1ed4a \ ${FILESDIR}/commit-7697fc9 \ ${FILESDIR}/commit-3350c5f \ ${FILESDIR}/commit-2faa344 \ ${FILESDIR}/commit-82372b2 \ ${FILESDIR}/commit-e6cdd38 \ ${FILESDIR}/commit-a3405d1 \ ${FILESDIR}/commit-5077bff \ ${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} ONLY_FOR_ARCHS= i386 amd64 powerpc powerpc64 armv6 # untested elsewhere, might work OPTIONS_DEFINE= DEBUG EXPAT GDB_LINK GUILE KGDB PYTHON TUI OPTIONS_DEFAULT= EXPAT GDB_LINK KGDB PYTHON TUI PORT_READLINE OPTIONS_SINGLE= READLINE OPTIONS_SINGLE_READLINE= BASE_READLINE BUNDLED_READLINE PORT_READLINE GDB_LINK_DESC= Create ${PREFIX}/bin/gdb symlink KGDB_DESC= Kernel Debugging Support BASE_READLINE_DESC= from base system BUNDLED_READLINE_DESC= from gdb distfile PORT_READLINE_DESC= from devel/readline port TUI_DESC= Text User Interface enabled OPTIONS_SUB= yes BASE_READLINE_USES= readline BASE_READLINE_CFLAGS= -D_rl_echoing_p=readline_echoing_p BASE_READLINE_EXTRA_PATCHES= ${FILESDIR}/extrapatch-base-readline BUNDLED_READLINE_CONFIGURE_OFF= --with-system-readline DEBUG_CFLAGS= -g EXPAT_CONFIGURE_WITH= expat EXPAT_LIB_DEPENDS= libexpat.so:textproc/expat2 GUILE_CONFIGURE_WITH= guile GUILE_USES= pkgconfig GUILE_LIB_DEPENDS= libguile-2.0.so:lang/guile2 PORT_READLINE_USES= readline:port PYTHON_CONFIGURE_ON= --with-python=${PYTHON_CMD} PYTHON_CONFIGURE_OFF= --without-python PYTHON_USES= python:2 TUI_CONFIGURE_ENABLE= tui .include + +.if ${OSVERSION} < 1000010 +# FreeBSD 9.x and earlier do not define SIGLIBRT in +CFLAGS+= -DSIGLIBRT=33 +.endif .if ! ${PORT_OPTIONS:MBUNDLED_READLINE} EXCLUDE+= readline .endif .if ${ARCH} == "amd64" CONFIGURE_TARGET= x86_64-portbld-freebsd${OSREL} .endif post-patch: @${REINPLACE_CMD} -e 's|$$| [GDB v${PORTVERSION} for FreeBSD]|' \ ${WRKSRC}/gdb/version.in post-patch-KGDB-on: @${CP} -r ${FILESDIR}/kgdb/*.[ch] ${WRKSRC}/gdb/ @${PATCH} ${PATCH_ARGS} < ${FILESDIR}/extrapatch-kgdb do-install: ${INSTALL_PROGRAM} ${WRKSRC}/gdb/gdb \ ${STAGEDIR}${PREFIX}/bin/gdb${VER} ${INSTALL_MAN} ${WRKSRC}/gdb/doc/gdb.1 \ ${STAGEDIR}${MAN1PREFIX}/man/man1/gdb${VER}.1 do-install-KGDB-on: ${INSTALL_PROGRAM} ${WRKSRC}/gdb/kgdb \ ${STAGEDIR}${PREFIX}/bin/kgdb${VER} do-install-TUI-on: ${LN} -sf gdb${VER} ${STAGEDIR}${PREFIX}/bin/gdbtui${VER} do-install-EXPAT-on: (cd ${WRKSRC}/gdb/data-directory ; \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} install-syscalls ) do-install-GDB_LINK-on: ${LN} -sf gdb${VER} ${STAGEDIR}${PREFIX}/bin/gdb .if ${PORT_OPTIONS:MKGDB} ${LN} -sf kgdb${VER} ${STAGEDIR}${PREFIX}/bin/kgdb .endif do-install-PYTHON-on: (cd ${WRKSRC}/gdb; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} install-python ) (cd ${WRKSRC}/gdb/data-directory ; \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} install-python ) . for f in gdb gdb/command gdb/function gdb/printer @(cd ${STAGEDIR}${PREFIX}/share/gdb${VER}/python/${f} ; ${CHMOD} 644 *.py* ) . endfor do-install-GUILE-on: (cd ${WRKSRC}/gdb; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} install-guile ) (cd ${WRKSRC}/gdb/data-directory ; \ ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${MAKE_ARGS} install-guile ) .include Index: head/devel/gdb/files/patch-sigev =================================================================== --- head/devel/gdb/files/patch-sigev (revision 418963) +++ head/devel/gdb/files/patch-sigev (nonexistent) @@ -1,65 +0,0 @@ -diff --git gdb/common/signals.c gdb/common/signals.c -index d4cf953..019371e 100644 ---- gdb/common/signals.c -+++ gdb/common/signals.c -@@ -41,6 +41,12 @@ struct gdbarch; - # endif - #endif - -+#ifdef __FreeBSD__ -+# ifndef SIGLIBRT -+# define SIGLIBRT 33 /* Older versions do not define the constant */ -+# endif -+#endif -+ - /* This table must match in order and size the signals in enum - gdb_signal. */ - -@@ -332,6 +338,11 @@ gdb_signal_from_host (int hostsig) - return GDB_SIGNAL_INFO; - #endif - -+#if defined (SIGLIBRT) -+ if ( hostsig == SIGLIBRT ) -+ return GDB_SIGNAL_FBSD_LIBRT; -+#endif -+ - #if defined (REALTIME_LO) - if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI) - { -@@ -585,6 +596,11 @@ do_gdb_signal_to_host (enum gdb_signal oursig, - return SIGINFO; - #endif - -+#if defined (SIGLIBRT) -+ case GDB_SIGNAL_FBSD_LIBRT: -+ return SIGLIBRT; -+#endif -+ - default: - #if defined (REALTIME_LO) - retsig = 0; -diff --git gdb/infrun.c gdb/infrun.c -index 11dcc0e..6ec4d0b 100644 ---- gdb/infrun.c -+++ gdb/infrun.c -@@ -7715,6 +7715,8 @@ leave it stopped or free to run as needed."), - signal_print[GDB_SIGNAL_WINCH] = 0; - signal_stop[GDB_SIGNAL_PRIO] = 0; - signal_print[GDB_SIGNAL_PRIO] = 0; -+ signal_stop[GDB_SIGNAL_FBSD_LIBRT] = 0; -+ signal_print[GDB_SIGNAL_FBSD_LIBRT] = 0; - - /* These signals are used internally by user-level thread - implementations. (See signal(5) on Solaris.) Like the above -diff --git include/gdb/signals.def include/gdb/signals.def -index 3f49980..857c69d 100644 ---- include/gdb/signals.def -+++ include/gdb/signals.def -@@ -197,4 +197,5 @@ SET (GDB_EXC_BREAKPOINT, 150, "EXC_BREAKPOINT", "Breakpoint") - /* 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_FBSD_LIBRT, 151, "SIGLIBRT", "GDB_SIGNAL_FBSD_LIBRT") -+SET (GDB_SIGNAL_LAST, 152, NULL, "GDB_SIGNAL_MAGIC") Property changes on: head/devel/gdb/files/patch-sigev ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/devel/gdb/files/commit-0064d22 =================================================================== --- head/devel/gdb/files/commit-0064d22 (nonexistent) +++ head/devel/gdb/files/commit-0064d22 (revision 418964) @@ -0,0 +1,83 @@ +commit 0064d22386b99c047bbff3bcc73b6bfce9c29b4c +Author: John Baldwin +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; + } Property changes on: head/devel/gdb/files/commit-0064d22 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/devel/gdb/files/commit-5fa14c6 =================================================================== --- head/devel/gdb/files/commit-5fa14c6 (nonexistent) +++ head/devel/gdb/files/commit-5fa14c6 (revision 418964) @@ -0,0 +1,30 @@ +commit 5fa14c6b9789bad6f91dd21889f7b1a0eb75c6d0 +Author: John Baldwin +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); Property changes on: head/devel/gdb/files/commit-5fa14c6 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/devel/gdb/files/commit-bc7b765 =================================================================== --- head/devel/gdb/files/commit-bc7b765 (nonexistent) +++ head/devel/gdb/files/commit-bc7b765 (revision 418964) @@ -0,0 +1,102 @@ +commit bc7b765ab71f967eb2a9c3da111d7529eec46fbe +Author: John Baldwin +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 ++ ++ * signals.def: Add GDB_SIGNAL_LIBRT. ++ + 2016-01-06 Mike Frysinger + + * 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") Property changes on: head/devel/gdb/files/commit-bc7b765 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/devel/gdb/files/commit-da95a26 =================================================================== --- head/devel/gdb/files/commit-da95a26 (nonexistent) +++ head/devel/gdb/files/commit-da95a26 (revision 418964) @@ -0,0 +1,123 @@ +commit da95a26cc381c0f092f515ffe108075985c16d7f +Author: John Baldwin +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); + } + Property changes on: head/devel/gdb/files/commit-da95a26 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/devel/gdb/files/commit-dbaed38 =================================================================== --- head/devel/gdb/files/commit-dbaed38 (nonexistent) +++ head/devel/gdb/files/commit-dbaed38 (revision 418964) @@ -0,0 +1,157 @@ +commit dbaed3853474e7bd824a25bc454a8f2fdd71d2b3 +Author: John Baldwin +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; Property changes on: head/devel/gdb/files/commit-dbaed38 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property