From 38ab23a72e09f54062951499211d04ef2f3afc3e Mon Sep 17 00:00:00 2001 From: scheidell Date: Sat, 25 Feb 2012 11:57:56 +0000 Subject: - Adds HW watchpoint support for amd64, closing ports/160930 (thanks to Ben Morrow) - Adds a symbolic link executable with the version suffix to support tools without debugger configuration (like devel/nemiver) - Bump PORTREVISION due to track changes to options and pkg-plist PR: ports/165357 Submitted by: Luca Pizzamiglio (maintainer) Approved by: gabor (mentor, implicit) --- devel/gdb/Makefile | 15 +++- devel/gdb/files/amd64bsd-nat.h | 38 +++++++++++ devel/gdb/files/patch-gdb-Makefile.in | 13 +++- devel/gdb/files/patch-gdb-amd64-nat.h | 12 ++++ devel/gdb/files/patch-gdb-amd64bsd-nat.c | 91 +++++++++++++++++++++++++ devel/gdb/files/patch-gdb-amd64fbsd-nat.c | 35 +++++++++- devel/gdb/files/patch-gdb-config-i386-fbsd64.mh | 10 +++ devel/gdb/files/patch-gdb-configure | 2 +- devel/gdb/pkg-plist | 1 + 9 files changed, 209 insertions(+), 8 deletions(-) create mode 100644 devel/gdb/files/amd64bsd-nat.h create mode 100644 devel/gdb/files/patch-gdb-amd64-nat.h create mode 100644 devel/gdb/files/patch-gdb-amd64bsd-nat.c create mode 100644 devel/gdb/files/patch-gdb-config-i386-fbsd64.mh (limited to 'devel') diff --git a/devel/gdb/Makefile b/devel/gdb/Makefile index de3a6c32fc64..54bed0ef8176 100644 --- a/devel/gdb/Makefile +++ b/devel/gdb/Makefile @@ -8,6 +8,7 @@ PORTNAME= gdb PORTVERSION= 7.4 +PORTREVISION= 1 CATEGORIES= devel MASTER_SITES= ${MASTER_SITE_GNU:S,$,:gdb,} MASTER_SITE_SUBDIR=gdb/:gdb @@ -47,10 +48,17 @@ LDFLAGS+= -L${LOCALBASE}/lib OPTIONS= DEBUG "Build with debugging symbols" off \ EXPAT "Enable XML parsing for metadata" off \ PYTHON "Enable Python support" off \ - THREAD "Enable Thread support" on + THREAD "Enable Thread support" on \ + GDB_LINK "Create the gdb link" on .include +.if defined(WITH_GDB_LINK) +PLIST_SUB+= GDB_LINK=true +.else +PLIST_SUB+= GDB_LINK=false +.endif + .if defined(WITH_PYTHON) USE_PYTHON= 2.5-2.7 .endif @@ -84,10 +92,13 @@ post-patch: .if !defined(WITHOUT_THREAD) @${CP} ${FILESDIR}/fbsd-threads.c ${WRKSRC}/gdb/ .endif + @${CP} ${FILESDIR}/amd64bsd-nat.h ${WRKSRC}/gdb do-install: ${INSTALL_PROGRAM} ${WRKSRC}/gdb/gdb ${PREFIX}/bin/gdb${VER} ${LN} ${PREFIX}/bin/gdb${VER} ${PREFIX}/bin/gdbtui${VER} ${INSTALL_MAN} ${WRKSRC}/gdb/gdb.1 ${MAN1PREFIX}/man/man1/gdb${VER}.1 - +.if defined(WITH_GDB_LINK) + ${LN} -s ${PREFIX}/bin/gdb${VER} ${PREFIX}/bin/gdb +.endif .include diff --git a/devel/gdb/files/amd64bsd-nat.h b/devel/gdb/files/amd64bsd-nat.h new file mode 100644 index 000000000000..4b517b840b20 --- /dev/null +++ b/devel/gdb/files/amd64bsd-nat.h @@ -0,0 +1,38 @@ +/* Native-dependent code for amd64 BSD's. + + Copyright (C) 2011 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef AMD64BSD_NAT_H +#define AMD64BSD_NAT_H + +/* Create a prototype *BSD/amd64 target. The client can override it + with local methods. */ + +extern struct target_ops *amd64bsd_target (void); + +/* low level amd64 debug register functions used in amd64fbsd-nat.c. */ + +extern void amd64bsd_dr_set_control (unsigned long control); + +extern void amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr); + +extern void amd64bsd_dr_reset_addr (int regnum); + +extern unsigned long amd64bsd_dr_get_status (void); + +#endif /* amd64bsd-nat.h */ diff --git a/devel/gdb/files/patch-gdb-Makefile.in b/devel/gdb/files/patch-gdb-Makefile.in index cf57c35d20d8..037a40c97048 100644 --- a/devel/gdb/files/patch-gdb-Makefile.in +++ b/devel/gdb/files/patch-gdb-Makefile.in @@ -1,5 +1,5 @@ ---- gdb/Makefile.in 2011-03-30 08:55:39.000000000 +0200 -+++ gdb/Makefile.in 2011-09-12 17:40:33.000000000 +0200 +--- gdb/Makefile.in.orig 2011-03-30 07:55:39.000000000 +0100 ++++ gdb/Makefile.in 2011-10-29 08:02:29.600973609 +0100 @@ -571,7 +571,7 @@ xstormy16-tdep.o \ xtensa-config.o xtensa-tdep.o xtensa-linux-tdep.o \ @@ -9,6 +9,15 @@ nbsd-tdep.o obsd-tdep.o \ sol2-tdep.o \ solib-frv.o solib-irix.o solib-svr4.o solib-target.o \ +@@ -758,7 +758,7 @@ + osf-share/cma_deb_core.h osf-share/AT386/cma_thread_io.h \ + osf-share/cma_sched.h proc-utils.h arm-tdep.h ax-gdb.h ppcnbsd-tdep.h \ + cli-out.h gdb_expat.h breakpoint.h infcall.h obsd-tdep.h \ +-exec.h m32r-tdep.h osabi.h gdbcore.h solib-som.h \ ++exec.h m32r-tdep.h osabi.h gdbcore.h solib-som.h amd64bsd-nat.h \ + i386bsd-nat.h xml-support.h xml-tdesc.h alphabsd-tdep.h gdb_obstack.h \ + ia64-tdep.h ada-lang.h varobj.h frv-tdep.h nto-tdep.h serial.h \ + c-lang.h d-lang.h frame.h event-loop.h block.h cli/cli-setshow.h \ @@ -782,7 +782,7 @@ gnulib/stdint.in.h remote.h gdb.h sparc-nat.h \ gdbthread.h dwarf2-frame.h dwarf2-frame-tailcall.h nbsd-nat.h dcache.h \ diff --git a/devel/gdb/files/patch-gdb-amd64-nat.h b/devel/gdb/files/patch-gdb-amd64-nat.h new file mode 100644 index 000000000000..8222cbf6f813 --- /dev/null +++ b/devel/gdb/files/patch-gdb-amd64-nat.h @@ -0,0 +1,12 @@ +--- gdb/amd64-nat.h.orig 2011-09-23 01:36:54.874780473 +0100 ++++ gdb/amd64-nat.h 2011-09-23 01:28:46.964218514 +0100 +@@ -50,9 +50,4 @@ + extern void amd64_collect_native_gregset (const struct regcache *regcache, + void *gregs, int regnum); + +-/* Create a prototype *BSD/amd64 target. The client can override it +- with local methods. */ +- +-extern struct target_ops *amd64bsd_target (void); +- + #endif /* amd64-nat.h */ diff --git a/devel/gdb/files/patch-gdb-amd64bsd-nat.c b/devel/gdb/files/patch-gdb-amd64bsd-nat.c new file mode 100644 index 000000000000..dd488502a9ea --- /dev/null +++ b/devel/gdb/files/patch-gdb-amd64bsd-nat.c @@ -0,0 +1,91 @@ +--- gdb/amd64bsd-nat.c.orig 2011-09-23 01:35:24.211306143 +0100 ++++ gdb/amd64bsd-nat.c 2011-09-23 01:28:28.444487431 +0100 +@@ -33,6 +33,7 @@ + + #include "amd64-tdep.h" + #include "amd64-nat.h" ++#include "amd64bsd-nat.h" + #include "inf-ptrace.h" + + +@@ -126,3 +127,80 @@ + t->to_store_registers = amd64bsd_store_inferior_registers; + return t; + } ++ ++ ++/* Support for debug registers. */ ++ ++#ifdef HAVE_PT_GETDBREGS ++ ++/* Not all versions of FreeBSD/i386 that support the debug registers ++ have this macro. */ ++#ifndef DBREG_DRX ++#define DBREG_DRX(d, x) ((&d->dr0)[x]) ++#endif ++ ++static void ++amd64bsd_dr_set (int regnum, unsigned long value) ++{ ++ struct dbreg dbregs; ++ ++ if (ptrace (PT_GETDBREGS, PIDGET (inferior_ptid), ++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) ++ perror_with_name (_("Couldn't get debug registers")); ++ ++ /* For some mysterious reason, some of the reserved bits in the ++ debug control register get set. Mask these off, otherwise the ++ ptrace call below will fail. */ ++ DBREG_DRX ((&dbregs), 7) &= ~(0x0000fc00); ++ ++ DBREG_DRX ((&dbregs), regnum) = value; ++ ++ if (ptrace (PT_SETDBREGS, PIDGET (inferior_ptid), ++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) ++ perror_with_name (_("Couldn't write debug registers")); ++} ++ ++void ++amd64bsd_dr_set_control (unsigned long control) ++{ ++ amd64bsd_dr_set (7, control); ++} ++ ++void ++amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr) ++{ ++ gdb_assert (regnum >= 0 && regnum <= 4); ++ ++ amd64bsd_dr_set (regnum, addr); ++} ++ ++void ++amd64bsd_dr_reset_addr (int regnum) ++{ ++ gdb_assert (regnum >= 0 && regnum <= 4); ++ ++ amd64bsd_dr_set (regnum, 0); ++} ++ ++unsigned long ++amd64bsd_dr_get_status (void) ++{ ++ struct dbreg dbregs; ++ ++ /* FIXME: kettenis/2001-03-31: Calling perror_with_name if the ++ ptrace call fails breaks debugging remote targets. The correct ++ way to fix this is to add the hardware breakpoint and watchpoint ++ stuff to the target vector. For now, just return zero if the ++ ptrace call fails. */ ++ if (ptrace (PT_GETDBREGS, PIDGET (inferior_ptid), ++ (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) ++#if 0 ++ perror_with_name (_("Couldn't read debug registers")); ++#else ++ return 0; ++#endif ++ ++ return DBREG_DRX ((&dbregs), 6); ++} ++ ++#endif /* PT_GETDBREGS */ diff --git a/devel/gdb/files/patch-gdb-amd64fbsd-nat.c b/devel/gdb/files/patch-gdb-amd64fbsd-nat.c index e2a759a084a5..12723c3af44b 100644 --- a/devel/gdb/files/patch-gdb-amd64fbsd-nat.c +++ b/devel/gdb/files/patch-gdb-amd64fbsd-nat.c @@ -1,5 +1,5 @@ ---- gdb/amd64fbsd-nat.c.orig 2010-10-13 14:53:14.425152000 -0400 -+++ gdb/amd64fbsd-nat.c 2010-10-13 15:15:01.080198000 -0400 +--- gdb/amd64fbsd-nat.c.orig 2010-02-03 15:30:25.000000000 +0000 ++++ gdb/amd64fbsd-nat.c 2011-09-23 03:08:51.942111416 +0100 @@ -27,6 +27,7 @@ #include #include @@ -8,7 +8,16 @@ #include #include #include -@@ -92,6 +93,47 @@ +@@ -34,6 +35,8 @@ + #include "fbsd-nat.h" + #include "amd64-tdep.h" + #include "amd64-nat.h" ++#include "amd64bsd-nat.h" ++#include "i386-nat.h" + + + /* Offset in `struct reg' where MEMBER is stored. */ +@@ -92,6 +95,47 @@ }; @@ -56,3 +65,23 @@ /* Support for debugging kernel virtual memory images. */ #include +@@ -155,6 +199,19 @@ + + /* Add some extra features to the common *BSD/i386 target. */ + t = amd64bsd_target (); ++ ++#ifdef HAVE_PT_GETDBREGS ++ ++ i386_use_watchpoints (t); ++ ++ i386_dr_low.set_control = amd64bsd_dr_set_control; ++ i386_dr_low.set_addr = amd64bsd_dr_set_addr; ++ i386_dr_low.reset_addr = amd64bsd_dr_reset_addr; ++ i386_dr_low.get_status = amd64bsd_dr_get_status; ++ i386_set_debug_register_length (8); ++ ++#endif /* HAVE_PT_GETDBREGS */ ++ + t->to_pid_to_exec_file = fbsd_pid_to_exec_file; + t->to_find_memory_regions = fbsd_find_memory_regions; + t->to_make_corefile_notes = fbsd_make_corefile_notes; diff --git a/devel/gdb/files/patch-gdb-config-i386-fbsd64.mh b/devel/gdb/files/patch-gdb-config-i386-fbsd64.mh new file mode 100644 index 000000000000..80f5becb3dea --- /dev/null +++ b/devel/gdb/files/patch-gdb-config-i386-fbsd64.mh @@ -0,0 +1,10 @@ +--- gdb/config/i386/fbsd64.mh.orig 2011-09-23 03:15:43.254648862 +0100 ++++ gdb/config/i386/fbsd64.mh 2011-09-23 03:14:06.843804785 +0100 +@@ -1,6 +1,6 @@ + # Host: FreeBSD/amd64 + NATDEPFILES= fork-child.o inf-ptrace.o \ +- fbsd-nat.o amd64-nat.o amd64bsd-nat.o amd64fbsd-nat.o \ ++ fbsd-nat.o i386-nat.o amd64-nat.o amd64bsd-nat.o amd64fbsd-nat.o \ + bsd-kvm.o + + LOADLIBES= -lkvm diff --git a/devel/gdb/files/patch-gdb-configure b/devel/gdb/files/patch-gdb-configure index 6ee8b83083ab..2b9cf049470b 100644 --- a/devel/gdb/files/patch-gdb-configure +++ b/devel/gdb/files/patch-gdb-configure @@ -8,4 +8,4 @@ +LDFLAGS="-L../bfd -L../libiberty $LDFLAGS" intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'` # -ldl is provided by bfd/Makfile.am (LIBDL) . - if test "$plugins" = "yes"; then \ No newline at end of file + if test "$plugins" = "yes"; then diff --git a/devel/gdb/pkg-plist b/devel/gdb/pkg-plist index ec79e4c77af9..9fef05cf30f3 100644 --- a/devel/gdb/pkg-plist +++ b/devel/gdb/pkg-plist @@ -1,2 +1,3 @@ bin/gdb%%VER%% bin/gdbtui%%VER%% +@unexec if $( %%GDB_LINK%% ) ; then rm -f %%PREFIX%%/bin/gdb; fi -- cgit