diff options
author | jhb <jhb@FreeBSD.org> | 2016-07-23 13:23:37 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2016-07-23 13:23:37 +0000 |
commit | f90fd33ed1232232615e3c3c3b192bc514185930 (patch) | |
tree | 34bda6726a04cbf085dc12350828af35a824a518 | |
parent | a397495eff87d8490e695b89aa19bf98f227248d (diff) | |
download | FreeBSD-ports-f90fd33ed1232232615e3c3c3b192bc514185930.zip FreeBSD-ports-f90fd33ed1232232615e3c3c3b192bc514185930.tar.gz |
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)
-rw-r--r-- | devel/gdb/Makefile | 14 | ||||
-rw-r--r-- | devel/gdb/files/commit-0064d22 | 83 | ||||
-rw-r--r-- | devel/gdb/files/commit-5fa14c6 | 30 | ||||
-rw-r--r-- | devel/gdb/files/commit-bc7b765 | 102 | ||||
-rw-r--r-- | devel/gdb/files/commit-da95a26 | 123 | ||||
-rw-r--r-- | devel/gdb/files/commit-dbaed38 | 157 | ||||
-rw-r--r-- | devel/gdb/files/patch-sigev | 65 |
7 files changed, 507 insertions, 67 deletions
diff --git a/devel/gdb/Makefile b/devel/gdb/Makefile index 409fb9b..08b3d5a 100644 --- a/devel/gdb/Makefile +++ b/devel/gdb/Makefile @@ -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-21002a6 \ ${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 diff --git a/devel/gdb/files/commit-0064d22 b/devel/gdb/files/commit-0064d22 new file mode 100644 index 0000000..5e77881 --- /dev/null +++ b/devel/gdb/files/commit-0064d22 @@ -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; + } diff --git a/devel/gdb/files/commit-5fa14c6 b/devel/gdb/files/commit-5fa14c6 new file mode 100644 index 0000000..66f5432 --- /dev/null +++ b/devel/gdb/files/commit-5fa14c6 @@ -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); diff --git a/devel/gdb/files/commit-bc7b765 b/devel/gdb/files/commit-bc7b765 new file mode 100644 index 0000000..5791ffe --- /dev/null +++ b/devel/gdb/files/commit-bc7b765 @@ -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") diff --git a/devel/gdb/files/commit-da95a26 b/devel/gdb/files/commit-da95a26 new file mode 100644 index 0000000..aaa488e --- /dev/null +++ b/devel/gdb/files/commit-da95a26 @@ -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); + } + diff --git a/devel/gdb/files/commit-dbaed38 b/devel/gdb/files/commit-dbaed38 new file mode 100644 index 0000000..78fd2bb --- /dev/null +++ b/devel/gdb/files/commit-dbaed38 @@ -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; diff --git a/devel/gdb/files/patch-sigev b/devel/gdb/files/patch-sigev deleted file mode 100644 index 3c10a37..0000000 --- a/devel/gdb/files/patch-sigev +++ /dev/null @@ -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") |