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>