add gdb-client to run on host to debug target.. (kgdb)
authorWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Tue, 7 Jun 2005 08:11:06 +0000 (08:11 +0000)
committerWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Tue, 7 Jun 2005 08:11:06 +0000 (08:11 +0000)
SVN-Revision: 1166

29 files changed:
openwrt/toolchain/Config.in.devel
openwrt/toolchain/Makefile
openwrt/toolchain/gdb/Config.in [new file with mode: 0644]
openwrt/toolchain/gdb/Makefile [new file with mode: 0644]
openwrt/toolchain/gdb/patches/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/200-uclibc-readline-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/400-mips-coredump.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/500-thread-timeout.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/600-debian_10.selected-frame.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/620-debian_static-thread-db.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/630-debian_24.tracepoint-segv.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/650-debian_vsyscall-gdb-support.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/660-debian_dwarf-cfa-restore.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/680-debian_sim-destdir.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/690-debian_member-field-symtab.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/700-debian_cp-pass-by-reference.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/710-debian_thread-db-multiple-libraries.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/720-debian_static-threads-test.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/730-debian_gdb-fix-tracefork-check.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/740-debian_make-cv-type-crash.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/750-debian_sparc-singlestep.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/760-debian_vsyscall-bfd-close-result.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/770-debian_vfork-done-spelling.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/780-debian_gdbserver-rdynamic.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/790-debian_dwarf2-cfi-warning.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/800-debian_linux-use-underscore-exit.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/810-debian_bfd-no-kylix-crash.patch [new file with mode: 0644]
openwrt/toolchain/gdb/patches/820-debian_disable-linux-fork-messages.patch [new file with mode: 0644]

index 00434607a00c8e58b84716029dde7a8e6ade5f74..0baf9b20c5721a4b123445ae4b52469e07a03e03 100644 (file)
@@ -6,6 +6,7 @@ source "toolchain/uClibc/Config.in"
 source "toolchain/binutils/Config.in"
 source "toolchain/gcc/Config.in"
 source "toolchain/ccache/Config.in"
+source "toolchain/gdb/Config.in"
 
 
 comment "Common Toolchain Options"
index 28ac81c865cc8c0810f8f42f649aed6fc2795e9d..c573debe4954d860d8ea002ffdcadac31c5a46b3 100644 (file)
@@ -1,6 +1,6 @@
 # Main makefile for the toolchain
 include $(TOPDIR)/rules.mk
-TARGETS:=sed utils binutils gcc uClibc ipkg-utils
+TARGETS:=sed utils binutils gcc uClibc ipkg-utils gdb
 
 TARGETS_INSTALL:=$(patsubst %,%-install,$(TARGETS))
 TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))
diff --git a/openwrt/toolchain/gdb/Config.in b/openwrt/toolchain/gdb/Config.in
new file mode 100644 (file)
index 0000000..574a398
--- /dev/null
@@ -0,0 +1,8 @@
+comment "Gdb Options"
+
+config BR2_PACKAGE_GDB_CLIENT
+       bool "Build gdb client for the Host"
+       default n
+       help
+           Build gdb to run on the host to debug programs running on the target.
+
diff --git a/openwrt/toolchain/gdb/Makefile b/openwrt/toolchain/gdb/Makefile
new file mode 100644 (file)
index 0000000..4b0d6b3
--- /dev/null
@@ -0,0 +1,59 @@
+# $Id$
+
+include $(TOPDIR)/rules.mk
+
+GDB_NAME:=gdb
+GDB_SITE:=http://ftp.gnu.org/gnu/gdb
+GDB_VERSION:=6.3
+GDB_SOURCE:=$(GDB_NAME)-$(GDB_VERSION).tar.bz2
+GDB_CAT:=bzcat
+
+GDB_DIR:=$(TOOL_BUILD_DIR)/$(GDB_NAME)-$(GDB_VERSION)
+
+$(DL_DIR)/$(GDB_SOURCE):
+       $(WGET) -P $(DL_DIR) $(GDB_SITE)/$(GDB_SOURCE)
+
+$(GDB_DIR)/.patched: $(DL_DIR)/$(GDB_SOURCE)
+       $(GDB_CAT) $(DL_DIR)/$(GDB_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) -
+       $(PATCH) $(GDB_DIR) ./patches
+       # Copy a config.sub from gcc.  This is only necessary until
+       # gdb's config.sub supports <arch>-linux-uclibc tuples.
+       # Should probably integrate this into the patch.
+       touch  $(GDB_DIR)/.patched
+
+# gdb client
+
+GDB_CLIENT_DIR:=$(TOOL_BUILD_DIR)/gdbclient-$(GDB_VERSION)
+
+$(GDB_CLIENT_DIR)/.configured: $(GDB_DIR)/.unpacked
+       mkdir -p $(GDB_CLIENT_DIR)
+       (cd $(GDB_CLIENT_DIR); \
+               gdb_cv_func_sigsetjmp=yes \
+               $(GDB_DIR)/configure \
+               --prefix=$(STAGING_DIR) \
+               --build=$(GNU_HOST_NAME) \
+               --host=$(GNU_HOST_NAME) \
+               --target=$(REAL_GNU_TARGET_NAME) \
+               $(DISABLE_NLS) \
+               --without-uiout --disable-gdbmi \
+               --disable-tui --disable-gdbtk --without-x \
+               --without-included-gettext \
+               --enable-threads \
+       );
+       touch  $(GDB_CLIENT_DIR)/.configured
+
+$(GDB_CLIENT_DIR)/gdb/gdb: $(GDB_CLIENT_DIR)/.configured
+       $(MAKE) -C $(GDB_CLIENT_DIR)
+       strip $(GDB_CLIENT_DIR)/gdb/gdb
+
+$(TARGET_CROSS)gdb: $(GDB_CLIENT_DIR)/gdb/gdb
+       install -c $(GDB_CLIENT_DIR)/gdb/gdb $(TARGET_CROSS)gdb
+       ln -fs ../../bin/$(REAL_GNU_TARGET_NAME)-gdb \
+               $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/gdb
+
+source: $(DL_DIR)/$(GDB_SOURCE)
+prepare: $(GDB_DIR)/.patched
+compile: 
+install: $(TARGET_CROSS)gdb
+clean:
+       rm -rf $(GDB_CLIENT_DIR)
diff --git a/openwrt/toolchain/gdb/patches/100-uclibc-conf.patch b/openwrt/toolchain/gdb/patches/100-uclibc-conf.patch
new file mode 100644 (file)
index 0000000..cc69ff3
--- /dev/null
@@ -0,0 +1,280 @@
+--- gdb-6.3/bfd/config.bfd.orig        Fri Oct 15 07:47:11 2004
++++ gdb-6.3/bfd/config.bfd     Mon Feb 28 00:04:43 2005
+@@ -129,7 +129,7 @@
+     targ_defvec=ecoffalpha_little_vec
+     targ_selvecs=bfd_elf64_alpha_vec
+     ;;
+-  alpha*-*-linux-gnu* | alpha*-*-elf*)
++  alpha*-*-linux-* | alpha*-*-elf*)
+     targ_defvec=bfd_elf64_alpha_vec
+     targ_selvecs=ecoffalpha_little_vec
+     ;;
+@@ -139,7 +139,7 @@
+   alpha*-*-*)
+     targ_defvec=ecoffalpha_little_vec
+     ;;
+-  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu)
++  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu)
+     targ_defvec=bfd_elf64_ia64_little_vec
+     targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec"
+     ;;
+@@ -216,7 +216,7 @@
+     targ_defvec=bfd_elf32_littlearm_vec
+     targ_selvecs=bfd_elf32_bigarm_vec
+     ;;
+-  armeb-*-elf | arm*b-*-linux-gnu*)
++  armeb-*-elf | arm*b-*-linux-*)
+     targ_defvec=bfd_elf32_bigarm_vec
+     targ_selvecs=bfd_elf32_littlearm_vec
+     ;;
+@@ -224,7 +224,7 @@
+     targ_defvec=bfd_elf32_littlearm_vec
+     targ_selvecs=bfd_elf32_bigarm_vec
+     ;;
+-  arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \
++  arm-*-elf | arm-*-freebsd* | arm*-*-linux-* | arm*-*-conix* | \
+   arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \
+   arm*-*-eabi* )
+     targ_defvec=bfd_elf32_littlearm_vec
+@@ -378,7 +378,7 @@
+     ;;
+ #ifdef BFD64
+-  hppa*64*-*-linux-gnu*)
++  hppa*64*-*-linux-*)
+     targ_defvec=bfd_elf64_hppa_linux_vec
+     targ_selvecs=bfd_elf64_hppa_vec
+     ;;
+@@ -389,7 +389,7 @@
+     ;;
+ #endif
+-  hppa*-*-linux-gnu*)
++  hppa*-*-linux-*)
+     targ_defvec=bfd_elf32_hppa_linux_vec
+     targ_selvecs=bfd_elf32_hppa_vec
+     ;;
+@@ -522,7 +522,7 @@
+     targ_selvecs=bfd_elf32_i386_vec
+     targ_underscore=yes
+     ;;
+-  i[3-7]86-*-linux-gnu*)
++  i[3-7]86-*-linux-*)
+     targ_defvec=bfd_elf32_i386_vec
+     targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec"
+     targ64_selvecs=bfd_elf64_x86_64_vec
+@@ -536,7 +536,7 @@
+     targ_defvec=bfd_elf64_x86_64_vec
+     targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec"
+     ;;
+-  x86_64-*-linux-gnu*)
++  x86_64-*-linux-*)
+     targ_defvec=bfd_elf64_x86_64_vec
+     targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec"
+     ;;
+@@ -706,7 +706,7 @@
+     targ_defvec=hp300hpux_vec
+     targ_underscore=yes
+     ;;
+-  m68*-*-linux*aout*)
++  m68*-*-linux*aout* | m68*-*-linux-uclibc*)
+     targ_defvec=m68klinux_vec
+     targ_selvecs=bfd_elf32_m68k_vec
+     targ_underscore=yes
+@@ -987,7 +987,7 @@
+     ;;
+ #endif
+   powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \
+-  powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \
++  powerpc-*-solaris2* | powerpc-*-linux-* | powerpc-*-rtems* | \
+   powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*)
+     targ_defvec=bfd_elf32_powerpc_vec
+     targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec"
+@@ -1024,7 +1024,7 @@
+     targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec"
+     ;;
+   powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \
+-  powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\
++  powerpcle-*-solaris2* | powerpcle-*-linux-* | powerpcle-*-vxworks* |\
+   powerpcle-*-rtems*)
+     targ_defvec=bfd_elf32_powerpcle_vec
+     targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec"
+@@ -1192,7 +1192,7 @@
+     targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec"
+     targ_underscore=yes
+     ;;
+-  sparc-*-linux-gnu*)
++  sparc-*-linux-*)
+     targ_defvec=bfd_elf32_sparc_vec
+     targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec"
+     ;;
+@@ -1239,7 +1239,7 @@
+     targ_defvec=sunos_big_vec
+     targ_underscore=yes
+     ;;
+-  sparc64-*-linux-gnu*)
++  sparc64-*-linux-*)
+     targ_defvec=bfd_elf64_sparc_vec
+     targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec"
+     ;;
+@@ -1308,7 +1308,7 @@
+     targ_underscore=yes
+     ;;
+-  vax-*-linux-gnu*)
++  vax-*-linux-*)
+     targ_defvec=bfd_elf32_vax_vec
+     ;;
+--- gdb-6.3/bfd/configure.orig Fri Oct  8 16:53:56 2004
++++ gdb-6.3/bfd/configure      Sun Feb 27 18:32:58 2005
+@@ -3583,6 +3583,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -9914,7 +9919,7 @@
+   alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
+       COREFILE=''
+       ;;
+-  alpha*-*-linux-gnu*)
++  alpha*-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/alphalinux.h"'
+       ;;
+@@ -9978,7 +9983,7 @@
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/i386mach3.h"'
+       ;;
+-  i[3-7]86-*-linux-gnu*)
++  i[3-7]86-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/i386linux.h"'
+       ;;
+@@ -10016,7 +10021,7 @@
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/hp300bsd.h"'
+       ;;
+-  m68*-*-linux-gnu*)
++  m68*-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/m68klinux.h"'
+       ;;
+@@ -10150,7 +10155,7 @@
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/vaxult2.h"'
+       ;;
+-  vax-*-linux-gnu*)
++  vax-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/vaxlinux.h"'
+       ;;
+--- gdb-6.3/bfd/configure.in.orig      Fri Oct  8 16:53:59 2004
++++ gdb-6.3/bfd/configure.in   Sun Feb 27 18:14:41 2005
+@@ -163,7 +163,7 @@
+   alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
+       COREFILE=''
+       ;;
+-  alpha*-*-linux-gnu*)
++  alpha*-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/alphalinux.h"'
+       ;;
+@@ -248,7 +248,7 @@
+       TRAD_HEADER='"hosts/i386mach3.h"'
+       ;;
+ changequote(,)dnl
+-  i[3-7]86-*-linux-gnu*)
++  i[3-7]86-*-linux-*)
+ changequote([,])dnl
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/i386linux.h"'
+@@ -289,7 +289,7 @@
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/hp300bsd.h"'
+       ;;
+-  m68*-*-linux-gnu*)
++  m68*-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/m68klinux.h"'
+       ;;
+@@ -375,7 +375,7 @@
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/vaxult2.h"'
+       ;;
+-  vax-*-linux-gnu*)
++  vax-*-linux-*)
+       COREFILE=trad-core.lo
+       TRAD_HEADER='"hosts/vaxlinux.h"'
+       ;;
+--- gdb-6.3/libtool.m4.orig    Wed Jul 21 21:21:41 2004
++++ gdb-6.3/libtool.m4 Mon Feb 28 00:08:11 2005
+@@ -653,6 +653,11 @@
+   fi
+   ;;
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ newsos6)
+   [lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)']
+   lt_cv_file_magic_cmd=/usr/bin/file
+--- gdb-6.3/ltconfig.orig      Tue Oct  5 15:34:42 2004
++++ gdb-6.3/ltconfig   Sun Feb 27 18:14:41 2005
+@@ -602,7 +602,7 @@
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
+-linux-gnu*) ;;
++linux-gnu*|linux-uclibc*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1270,6 +1270,24 @@
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  # Note: copied from linux-gnu, and may not be appropriate.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+--- gdb-6.3/opcodes/configure.orig     Fri Sep 17 08:13:38 2004
++++ gdb-6.3/opcodes/configure  Mon Feb 28 00:09:42 2005
+@@ -3595,6 +3595,11 @@
+   fi
+   ;;
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ newsos6)
+   lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+   lt_cv_file_magic_cmd=/usr/bin/file
diff --git a/openwrt/toolchain/gdb/patches/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/patches/200-uclibc-readline-conf.patch
new file mode 100644 (file)
index 0000000..ffe792d
--- /dev/null
@@ -0,0 +1,15 @@
+--- gdb-6.1.1-dist/readline/configure  2003-05-27 18:29:47.000000000 -0500
++++ gdb-6.1.1/readline/configure       2004-08-09 14:20:23.000000000 -0500
+@@ -6249,7 +6249,12 @@
+ echo "$as_me:$LINENO: checking for mbstate_t" >&5
++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6
+ echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6
++if test "${bash_cv_have_mbstate_t+set}" != set; then
++  bash_cv_have_mbstate_t=yes
++  echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6
++fi
+ if test "${bash_cv_have_mbstate_t+set}" = set; then
+   echo $ECHO_N "(cached) $ECHO_C" >&6
+ else
diff --git a/openwrt/toolchain/gdb/patches/400-mips-coredump.patch b/openwrt/toolchain/gdb/patches/400-mips-coredump.patch
new file mode 100644 (file)
index 0000000..4e17ba7
--- /dev/null
@@ -0,0 +1,28 @@
+Sometime around 2.4.22-23, the mips pt_regs.h fields were reordered, breaking
+coredump handling by gdb for current kernels.  Update the hardcoded constants
+to reflect the change.
+--- gdb-6.2.1/gdb/mips-linux-tdep.c-orig       2004-10-29 14:23:55.000000000 -0500
++++ gdb-6.2.1/gdb/mips-linux-tdep.c    2004-10-29 14:26:44.000000000 -0500
+@@ -53,12 +53,22 @@
+ #define EF_REG0                       6
+ #define EF_REG31              37
++
++#if 0
+ #define EF_LO                 38
+ #define EF_HI                 39
+ #define EF_CP0_EPC            40
+ #define EF_CP0_BADVADDR               41
+ #define EF_CP0_STATUS         42
+ #define EF_CP0_CAUSE          43
++#else
++#define EF_CP0_STATUS         38
++#define EF_LO                 39
++#define EF_HI                 40
++#define EF_CP0_BADVADDR               41
++#define EF_CP0_CAUSE          42
++#define EF_CP0_EPC            43
++#endif
+ #define EF_SIZE                       180
diff --git a/openwrt/toolchain/gdb/patches/500-thread-timeout.patch b/openwrt/toolchain/gdb/patches/500-thread-timeout.patch
new file mode 100644 (file)
index 0000000..6db0a7a
--- /dev/null
@@ -0,0 +1,34 @@
+--- gdb-6.3.org/gdb/gdbserver/thread-db.c      2004-10-17 02:42:00.000000000 +0900
++++ gdb-6.3/gdb/gdbserver/thread-db.c  2005-01-27 12:19:29.000000000 +0900
+@@ -21,6 +21,7 @@
+    Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.  */
++#include <unistd.h>
+ #include "server.h"
+ #include "linux-low.h"
+@@ -142,6 +143,7 @@
+   td_event_msg_t msg;
+   td_err_e err;
+   struct inferior_linux_data *tdata;
++  int timeout;
+   if (debug_threads)
+     fprintf (stderr, "Thread creation event.\n");
+@@ -152,7 +154,13 @@
+      In the LinuxThreads implementation, this is safe,
+      because all events come from the manager thread
+      (except for its own creation, of course).  */
+-  err = td_ta_event_getmsg (thread_agent, &msg);
++  for (timeout = 0; timeout < 50000; timeout++)
++    {
++      err = td_ta_event_getmsg (thread_agent, &msg);
++      if (err != TD_NOMSG)
++      break;
++      usleep(1000);
++    }
+   if (err != TD_OK)
+     fprintf (stderr, "thread getmsg err: %s\n",
+            thread_db_err_str (err));
+
diff --git a/openwrt/toolchain/gdb/patches/600-debian_10.selected-frame.patch b/openwrt/toolchain/gdb/patches/600-debian_10.selected-frame.patch
new file mode 100644 (file)
index 0000000..5970f9b
--- /dev/null
@@ -0,0 +1,552 @@
+2004-10-11
+
+This patch is not submitted.  Many of these functions should be passing
+a frame around rather than calling get_selected_frame, but at least it
+is an improvement over deprecated_selected_frame.
+
+Index: gdb-6.3/gdb/breakpoint.c
+===================================================================
+--- gdb-6.3.orig/gdb/breakpoint.c      2004-10-08 13:30:46.000000000 -0400
++++ gdb-6.3/gdb/breakpoint.c   2004-11-09 22:55:11.231620957 -0500
+@@ -922,7 +922,7 @@ insert_bp_location (struct bp_location *
+       /* FIXME drow/2003-09-09: It would be nice if evaluate_expression
+        took a frame parameter, so that we didn't have to change the
+        selected frame.  */
+-      saved_frame_id = get_frame_id (deprecated_selected_frame);
++      saved_frame_id = get_frame_id (get_selected_frame ());
+       /* Determine if the watchpoint is within scope.  */
+       if (bpt->owner->exp_valid_block == NULL)
+@@ -5464,14 +5464,9 @@ break_at_finish_at_depth_command_1 (char
+       if (default_breakpoint_valid)
+       {
+-        if (deprecated_selected_frame)
+-          {
+-            selected_pc = get_frame_pc (deprecated_selected_frame);
+-            if (arg)
+-              if_arg = 1;
+-          }
+-        else
+-          error ("No selected frame.");
++        selected_pc = get_frame_pc (get_selected_frame ());
++        if (arg)
++          if_arg = 1;
+       }
+       else
+       error ("No default breakpoint address now.");
+@@ -5542,15 +5537,10 @@ break_at_finish_command_1 (char *arg, in
+     {
+       if (default_breakpoint_valid)
+       {
+-        if (deprecated_selected_frame)
+-          {
+-            addr_string = xstrprintf ("*0x%s",
+-                                      paddr_nz (get_frame_pc (deprecated_selected_frame)));
+-            if (arg)
+-              if_arg = 1;
+-          }
+-        else
+-          error ("No selected frame.");
++        addr_string = xstrprintf ("*0x%s",
++                                  paddr_nz (get_frame_pc (get_selected_frame ())));
++        if (arg)
++          if_arg = 1;
+       }
+       else
+       error ("No default breakpoint address now.");
+@@ -6082,7 +6072,7 @@ until_break_command (char *arg, int from
+ {
+   struct symtabs_and_lines sals;
+   struct symtab_and_line sal;
+-  struct frame_info *prev_frame = get_prev_frame (deprecated_selected_frame);
++  struct frame_info *prev_frame = get_prev_frame (get_selected_frame ());
+   struct breakpoint *breakpoint;
+   struct cleanup *old_chain;
+   struct continuation_arg *arg1;
+@@ -6119,7 +6109,7 @@ until_break_command (char *arg, int from
+     /* Otherwise, specify the current frame, because we want to stop only
+        at the very same frame.  */
+     breakpoint = set_momentary_breakpoint (sal,
+-                                         get_frame_id (deprecated_selected_frame),
++                                         get_frame_id (get_selected_frame ()),
+                                          bp_until);
+   if (!target_can_async_p ())
+Index: gdb-6.3/gdb/cli/cli-cmds.c
+===================================================================
+--- gdb-6.3.orig/gdb/cli/cli-cmds.c    2004-09-11 06:24:53.000000000 -0400
++++ gdb-6.3/gdb/cli/cli-cmds.c 2004-11-09 22:51:07.323246218 -0500
+@@ -845,10 +845,7 @@ disassemble_command (char *arg, int from
+   name = NULL;
+   if (!arg)
+     {
+-      if (!deprecated_selected_frame)
+-      error ("No frame selected.\n");
+-
+-      pc = get_frame_pc (deprecated_selected_frame);
++      pc = get_frame_pc (get_selected_frame ());
+       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
+       error ("No function contains program counter for selected frame.\n");
+ #if defined(TUI)
+Index: gdb-6.3/gdb/f-valprint.c
+===================================================================
+--- gdb-6.3.orig/gdb/f-valprint.c      2003-10-14 02:51:14.000000000 -0400
++++ gdb-6.3/gdb/f-valprint.c   2004-11-09 22:51:07.326245632 -0500
+@@ -76,7 +76,7 @@ f77_get_dynamic_lowerbound (struct type 
+   switch (TYPE_ARRAY_LOWER_BOUND_TYPE (type))
+     {
+     case BOUND_BY_VALUE_ON_STACK:
+-      current_frame_addr = get_frame_base (deprecated_selected_frame);
++      current_frame_addr = get_frame_base (get_selected_frame ());
+       if (current_frame_addr > 0)
+       {
+         *lower_bound =
+@@ -100,7 +100,7 @@ f77_get_dynamic_lowerbound (struct type 
+       break;
+     case BOUND_BY_REF_ON_STACK:
+-      current_frame_addr = get_frame_base (deprecated_selected_frame);
++      current_frame_addr = get_frame_base (get_selected_frame ());
+       if (current_frame_addr > 0)
+       {
+         ptr_to_lower_bound =
+@@ -134,7 +134,7 @@ f77_get_dynamic_upperbound (struct type 
+   switch (TYPE_ARRAY_UPPER_BOUND_TYPE (type))
+     {
+     case BOUND_BY_VALUE_ON_STACK:
+-      current_frame_addr = get_frame_base (deprecated_selected_frame);
++      current_frame_addr = get_frame_base (get_selected_frame ());
+       if (current_frame_addr > 0)
+       {
+         *upper_bound =
+@@ -163,7 +163,7 @@ f77_get_dynamic_upperbound (struct type 
+       break;
+     case BOUND_BY_REF_ON_STACK:
+-      current_frame_addr = get_frame_base (deprecated_selected_frame);
++      current_frame_addr = get_frame_base (get_selected_frame ());
+       if (current_frame_addr > 0)
+       {
+         ptr_to_upper_bound =
+@@ -630,10 +630,7 @@ info_common_command (char *comname, int 
+      first make sure that it is visible and if so, let 
+      us display its contents */
+-  fi = deprecated_selected_frame;
+-
+-  if (fi == NULL)
+-    error ("No frame selected");
++  fi = get_selected_frame ();
+   /* The following is generally ripped off from stack.c's routine 
+      print_frame_info() */
+@@ -722,10 +719,7 @@ there_is_a_visible_common_named (char *c
+   if (comname == NULL)
+     error ("Cannot deal with NULL common name!");
+-  fi = deprecated_selected_frame;
+-
+-  if (fi == NULL)
+-    error ("No frame selected");
++  fi = get_selected_frame ();
+   /* The following is generally ripped off from stack.c's routine 
+      print_frame_info() */
+Index: gdb-6.3/gdb/infcmd.c
+===================================================================
+--- gdb-6.3.orig/gdb/infcmd.c  2004-09-13 14:26:28.000000000 -0400
++++ gdb-6.3/gdb/infcmd.c       2004-11-09 22:57:37.274099559 -0500
+@@ -1214,10 +1214,8 @@ finish_command (char *arg, int from_tty)
+     error ("The \"finish\" command does not take any arguments.");
+   if (!target_has_execution)
+     error ("The program is not running.");
+-  if (deprecated_selected_frame == NULL)
+-    error ("No selected frame.");
+-  frame = get_prev_frame (deprecated_selected_frame);
++  frame = get_prev_frame (get_selected_frame ());
+   if (frame == 0)
+     error ("\"finish\" not meaningful in the outermost frame.");
+@@ -1235,7 +1233,7 @@ finish_command (char *arg, int from_tty)
+   /* Find the function we will return from.  */
+-  function = find_pc_function (get_frame_pc (deprecated_selected_frame));
++  function = find_pc_function (get_frame_pc (get_selected_frame ()));
+   /* Print info on the selected frame, including level number but not
+      source.  */
+@@ -1600,13 +1598,11 @@ registers_info (char *addr_exp, int fpre
+   if (!target_has_registers)
+     error ("The program has no registers now.");
+-  if (deprecated_selected_frame == NULL)
+-    error ("No selected frame.");
+   if (!addr_exp)
+     {
+       gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
+-                                  deprecated_selected_frame, -1, fpregs);
++                                  get_selected_frame (), -1, fpregs);
+       return;
+     }
+@@ -1644,7 +1640,7 @@ registers_info (char *addr_exp, int fpre
+       if (regnum >= 0)
+         {
+           gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
+-                                        deprecated_selected_frame, regnum, fpregs);
++                                        get_selected_frame (), regnum, fpregs);
+           continue;
+         }
+       }
+@@ -1658,7 +1654,7 @@ registers_info (char *addr_exp, int fpre
+           && regnum < NUM_REGS + NUM_PSEUDO_REGS)
+         {
+           gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
+-                                        deprecated_selected_frame, regnum, fpregs);
++                                        get_selected_frame (), regnum, fpregs);
+           continue;
+         }
+       }
+@@ -1684,7 +1680,7 @@ registers_info (char *addr_exp, int fpre
+               if (gdbarch_register_reggroup_p (current_gdbarch, regnum,
+                                                group))
+                 gdbarch_print_registers_info (current_gdbarch,
+-                                              gdb_stdout, deprecated_selected_frame,
++                                              gdb_stdout, get_selected_frame (),
+                                               regnum, fpregs);
+             }
+           continue;
+@@ -1714,8 +1710,6 @@ print_vector_info (struct gdbarch *gdbar
+ {
+   if (!target_has_registers)
+     error ("The program has no registers now.");
+-  if (deprecated_selected_frame == NULL)
+-    error ("No selected frame.");
+   if (gdbarch_print_vector_info_p (gdbarch))
+     gdbarch_print_vector_info (gdbarch, file, frame, args);
+@@ -1740,7 +1734,7 @@ print_vector_info (struct gdbarch *gdbar
+ static void
+ vector_info (char *args, int from_tty)
+ {
+-  print_vector_info (current_gdbarch, gdb_stdout, deprecated_selected_frame, args);
++  print_vector_info (current_gdbarch, gdb_stdout, get_selected_frame (), args);
+ }
\f
+@@ -1910,8 +1904,6 @@ print_float_info (struct gdbarch *gdbarc
+ {
+   if (!target_has_registers)
+     error ("The program has no registers now.");
+-  if (deprecated_selected_frame == NULL)
+-    error ("No selected frame.");
+   if (gdbarch_print_float_info_p (gdbarch))
+     gdbarch_print_float_info (gdbarch, file, frame, args);
+@@ -1937,7 +1929,7 @@ No floating-point info available for thi
+ static void
+ float_info (char *args, int from_tty)
+ {
+-  print_float_info (current_gdbarch, gdb_stdout, deprecated_selected_frame, args);
++  print_float_info (current_gdbarch, gdb_stdout, get_selected_frame (), args);
+ }
\f
+ static void
+Index: gdb-6.3/gdb/inflow.c
+===================================================================
+--- gdb-6.3.orig/gdb/inflow.c  2004-08-11 05:00:57.000000000 -0400
++++ gdb-6.3/gdb/inflow.c       2004-11-09 22:58:37.488338883 -0500
+@@ -591,10 +591,7 @@ kill_command (char *arg, int from_tty)
+   if (target_has_stack)
+     {
+       printf_filtered ("In %s,\n", target_longname);
+-      if (deprecated_selected_frame == NULL)
+-      fputs_filtered ("No selected stack frame.\n", gdb_stdout);
+-      else
+-      print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
++      print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
+     }
+   bfd_cache_close_all ();
+ }
+Index: gdb-6.3/gdb/infrun.c
+===================================================================
+--- gdb-6.3.orig/gdb/infrun.c  2004-09-27 13:58:08.000000000 -0400
++++ gdb-6.3/gdb/infrun.c       2004-11-09 22:51:07.351240752 -0500
+@@ -3485,7 +3485,7 @@ save_inferior_status (int restore_stack_
+   inf_status->registers = regcache_dup (current_regcache);
+-  inf_status->selected_frame_id = get_frame_id (deprecated_selected_frame);
++  inf_status->selected_frame_id = get_frame_id (get_selected_frame ());
+   return inf_status;
+ }
+Index: gdb-6.3/gdb/mi/mi-main.c
+===================================================================
+--- gdb-6.3.orig/gdb/mi/mi-main.c      2004-09-12 11:00:42.000000000 -0400
++++ gdb-6.3/gdb/mi/mi-main.c   2004-11-09 22:53:29.998389013 -0500
+@@ -388,7 +388,7 @@ register_changed_p (int regnum)
+ {
+   char raw_buffer[MAX_REGISTER_SIZE];
+-  if (! frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
++  if (! frame_register_read (get_selected_frame (), regnum, raw_buffer))
+     return -1;
+   if (memcmp (&old_regs[DEPRECATED_REGISTER_BYTE (regnum)], raw_buffer,
+@@ -509,7 +509,7 @@ get_register (int regnum, int format)
+   if (format == 'N')
+     format = 0;
+-  frame_register (deprecated_selected_frame, regnum, &optim, &lval, &addr,
++  frame_register (get_selected_frame (), regnum, &optim, &lval, &addr,
+                 &realnum, buffer);
+   if (optim)
+Index: gdb-6.3/gdb/mn10300-tdep.c
+===================================================================
+--- gdb-6.3.orig/gdb/mn10300-tdep.c    2004-08-02 22:02:22.000000000 -0400
++++ gdb-6.3/gdb/mn10300-tdep.c 2004-11-09 22:51:07.356239776 -0500
+@@ -1154,7 +1154,7 @@ mn10300_print_register (const char *name
+     printf_filtered ("%s: ", name);
+   /* Get the data */
+-  if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
++  if (!frame_register_read (get_selected_frame (), regnum, raw_buffer))
+     {
+       printf_filtered ("[invalid]");
+       return;
+Index: gdb-6.3/gdb/stack.c
+===================================================================
+--- gdb-6.3.orig/gdb/stack.c   2004-08-02 20:57:26.000000000 -0400
++++ gdb-6.3/gdb/stack.c        2004-11-09 22:51:07.361238800 -0500
+@@ -758,9 +758,7 @@ parse_frame_specification (char *frame_e
+   switch (numargs)
+     {
+     case 0:
+-      if (deprecated_selected_frame == NULL)
+-      error ("No selected frame.");
+-      return deprecated_selected_frame;
++      return get_selected_frame ();
+       /* NOTREACHED */
+     case 1:
+       {
+@@ -902,10 +900,10 @@ frame_info (char *addr_exp, int from_tty
+     }
+   calling_frame_info = get_prev_frame (fi);
+-  if (!addr_exp && frame_relative_level (deprecated_selected_frame) >= 0)
++  if (!addr_exp && frame_relative_level (get_selected_frame ()) >= 0)
+     {
+       printf_filtered ("Stack level %d, frame at ",
+-                     frame_relative_level (deprecated_selected_frame));
++                     frame_relative_level (get_selected_frame ()));
+       print_address_numeric (get_frame_base (fi), 1, gdb_stdout);
+       printf_filtered (":\n");
+     }
+@@ -1445,9 +1443,7 @@ print_frame_label_vars (struct frame_inf
+ void
+ locals_info (char *args, int from_tty)
+ {
+-  if (!deprecated_selected_frame)
+-    error ("No frame selected.");
+-  print_frame_local_vars (deprecated_selected_frame, 0, gdb_stdout);
++  print_frame_local_vars (get_selected_frame (), 0, gdb_stdout);
+ }
+ static void
+@@ -1470,7 +1466,7 @@ catch_info (char *ignore, int from_tty)
+       if (!deprecated_selected_frame)
+       error ("No frame selected.");
+-      print_frame_label_vars (deprecated_selected_frame, 0, gdb_stdout);
++      print_frame_label_vars (get_selected_frame (), 0, gdb_stdout);
+     }
+ }
+@@ -1537,9 +1533,7 @@ print_frame_arg_vars (struct frame_info 
+ void
+ args_info (char *ignore, int from_tty)
+ {
+-  if (!deprecated_selected_frame)
+-    error ("No frame selected.");
+-  print_frame_arg_vars (deprecated_selected_frame, gdb_stdout);
++  print_frame_arg_vars (get_selected_frame (), gdb_stdout);
+ }
+@@ -1724,7 +1718,7 @@ down_silently_base (char *count_exp)
+   if (target_has_stack == 0 || deprecated_selected_frame == 0)
+     error ("No stack.");
+-  frame = find_relative_frame (deprecated_selected_frame, &count1);
++  frame = find_relative_frame (get_selected_frame (), &count1);
+   if (count1 != 0 && count_exp == 0)
+     {
+@@ -1944,7 +1938,7 @@ func_command (char *arg, int from_tty)
+   if (!found)
+     printf_filtered ("'%s' not within current stack frame.\n", arg);
+-  else if (fp != deprecated_selected_frame)
++  else if (fp != get_selected_frame ())
+     select_and_print_frame (fp);
+ }
+@@ -1965,7 +1959,7 @@ get_frame_language (void)
+          instruction of another function.  So we rely on
+          get_frame_address_in_block(), it provides us with a PC which is
+          guaranteed to be inside the frame's code block.  */
+-      s = find_pc_symtab (get_frame_address_in_block (deprecated_selected_frame));
++      s = find_pc_symtab (get_frame_address_in_block (get_selected_frame ()));
+       if (s)
+       flang = s->language;
+       else
+Index: gdb-6.3/gdb/tui/tui-disasm.c
+===================================================================
+--- gdb-6.3.orig/gdb/tui/tui-disasm.c  2004-02-24 20:10:01.000000000 -0500
++++ gdb-6.3/gdb/tui/tui-disasm.c       2004-11-09 22:51:07.370237044 -0500
+@@ -382,7 +382,7 @@ tui_vertical_disassem_scroll (enum tui_s
+       content = (tui_win_content) TUI_DISASM_WIN->generic.content;
+       if (cursal.symtab == (struct symtab *) NULL)
+-      s = find_pc_symtab (get_frame_pc (deprecated_selected_frame));
++      s = find_pc_symtab (get_frame_pc (get_selected_frame ()));
+       else
+       s = cursal.symtab;
+Index: gdb-6.3/gdb/tui/tui-source.c
+===================================================================
+--- gdb-6.3.orig/gdb/tui/tui-source.c  2004-02-16 16:05:09.000000000 -0500
++++ gdb-6.3/gdb/tui/tui-source.c       2004-11-09 22:51:07.370237044 -0500
+@@ -326,7 +326,7 @@ tui_vertical_source_scroll (enum tui_scr
+       struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+       if (cursal.symtab == (struct symtab *) NULL)
+-      s = find_pc_symtab (get_frame_pc (deprecated_selected_frame));
++      s = find_pc_symtab (get_frame_pc (get_selected_frame ()));
+       else
+       s = cursal.symtab;
+Index: gdb-6.3/gdb/tui/tui-winsource.c
+===================================================================
+--- gdb-6.3.orig/gdb/tui/tui-winsource.c       2004-02-16 16:05:09.000000000 -0500
++++ gdb-6.3/gdb/tui/tui-winsource.c    2004-11-09 22:51:07.371236848 -0500
+@@ -311,7 +311,7 @@ tui_horizontal_source_scroll (struct tui
+       struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+       if (cursal.symtab == (struct symtab *) NULL)
+-      s = find_pc_symtab (get_frame_pc (deprecated_selected_frame));
++      s = find_pc_symtab (get_frame_pc (get_selected_frame ()));
+       else
+       s = cursal.symtab;
+Index: gdb-6.3/gdb/valops.c
+===================================================================
+--- gdb-6.3.orig/gdb/valops.c  2004-09-13 23:01:48.000000000 -0400
++++ gdb-6.3/gdb/valops.c       2004-11-09 22:51:07.374236263 -0500
+@@ -2663,15 +2663,10 @@ value_of_local (const char *name, int co
+   struct block *b;
+   struct value * ret;
+-  if (deprecated_selected_frame == 0)
+-    {
+-      if (complain)
+-      error ("no frame selected");
+-      else
+-      return 0;
+-    }
++  if (!complain && deprecated_selected_frame == 0)
++    return 0;
+-  func = get_frame_function (deprecated_selected_frame);
++  func = get_frame_function (get_selected_frame ());
+   if (!func)
+     {
+       if (complain)
+@@ -2700,7 +2695,7 @@ value_of_local (const char *name, int co
+       return NULL;
+     }
+-  ret = read_var_value (sym, deprecated_selected_frame);
++  ret = read_var_value (sym, get_selected_frame ());
+   if (ret == 0 && complain)
+     error ("`%s' argument unreadable", name);
+   return ret;
+Index: gdb-6.3/gdb/varobj.c
+===================================================================
+--- gdb-6.3.orig/gdb/varobj.c  2004-07-26 10:53:06.000000000 -0400
++++ gdb-6.3/gdb/varobj.c       2004-11-09 22:51:07.377235677 -0500
+@@ -488,7 +488,7 @@ varobj_create (char *objname,
+       if (fi != NULL)
+       {
+         var->root->frame = get_frame_id (fi);
+-        old_fi = deprecated_selected_frame;
++        old_fi = get_selected_frame ();
+         select_frame (fi);
+       }
+Index: gdb-6.3/gdb/testsuite/gdb.base/default.exp
+===================================================================
+--- gdb-6.3.orig/gdb/testsuite/gdb.base/default.exp    2003-03-20 09:45:50.000000000 -0500
++++ gdb-6.3/gdb/testsuite/gdb.base/default.exp 2004-11-09 22:51:07.379235287 -0500
+@@ -167,7 +167,7 @@ gdb_test "disable breakpoints" "" "disab
+ #test disable display
+ gdb_test "disable display" "" "disable display"
+ #test disassemble
+-gdb_test "disassemble" "No frame selected." "disassemble"
++gdb_test "disassemble" "No (frame selected|registers)." "disassemble"
+ #test display
+ gdb_test "display" "" "display"
+ #test do
+@@ -229,9 +229,9 @@ gdb_expect {
+ }
+ #test frame "f" abbreviation
+-gdb_test "f" "No stack." "frame \"f\" abbreviation"
++gdb_test "f" "No (stack|registers)." "frame \"f\" abbreviation"
+ #test frame
+-gdb_test "frame" "No stack." "frame"
++gdb_test "frame" "No (stack|registers)." "frame"
+ #test fg
+ gdb_test "fg" "The program is not being run." "fg"
+ # FIXME: fg kills the udi connection
+@@ -294,9 +294,9 @@ gdb_test "ignore" "Argument required .a 
+ #test info address
+ gdb_test "info address" "Argument required." "info address"
+ #test info all-registers
+-gdb_test "info all-registers" "The program has no registers now." "info all-registers"
++gdb_test "info all-registers" "(The program has no registers now|No registers)." "info all-registers"
+ #test info args
+-gdb_test "info args" "No frame selected." "info args"
++gdb_test "info args" "No (frame selected|registers)." "info args"
+ #test info bogus-gdb-command
+ gdb_test "info bogus-gdb-command" "Undefined info command: \"bogus-gdb-command\".  Try \"help info\".*" "info bogus-gdb-command"
+ #test info breakpoints
+@@ -320,11 +320,11 @@ gdb_test "info frame" "No stack.|No sele
+ #test info files
+ gdb_test "info files" "" "info files"
+ #test info float
+-gdb_test "info float" "The program has no registers now." "info float"
++gdb_test "info float" "(The program has no registers now|No registers)." "info float"
+ #test info functions
+ gdb_test "info functions" "All defined functions:" "info functions"
+ #test info locals
+-gdb_test "info locals" "No frame selected." "info locals"
++gdb_test "info locals" "(No frame selected|No registers)." "info locals"
+ #test info program
+ gdb_test "info program" "The program being debugged is not being run." "info program"
+ #test info registers
+@@ -352,7 +352,7 @@ gdb_test "info types" "All defined types
+ #test info variables
+ gdb_test "info variables" "All defined variables:" "info variables"
+ #test info vector
+-gdb_test "info vector" "The program has no registers now." "info vector"
++gdb_test "info vector" "(The program has no registers now|No registers)." "info vector"
+ #test info warranty
+ gdb_test "info warranty" "NO WARRANTY(\[^\r\n\]*\[\r\n\])+  *11.  *BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY(\[^\r\n\]*\[\r\n\])+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN(\[^\r\n\]*\[\r\n\])+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES(\[^\r\n\]*\[\r\n\])+PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED(\[^\r\n\]*\[\r\n\])+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF(\[^\r\n\]*\[\r\n\])+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS(\[^\r\n\]*\[\r\n\])+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE(\[^\r\n\]*\[\r\n\])+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,(\[^\r\n\]*\[\r\n\])+REPAIR OR CORRECTION.(\[^\r\n\]*\[\r\n\])+  *12.  *IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING(\[^\r\n\]*\[\r\n\])+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR(\[^\r\n\]*\[\r\n\])+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,(\[^\r\n\]*\[\r\n\])+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING(\[^\r\n\]*\[\r\n\])+OUT OF THE USE OR INABILITY TO USE THE PROGRAM .INCLUDING BUT NOT LIMITED(\[^\r\n\]*\[\r\n\])+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY(\[^\r\n\]*\[\r\n\])+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER(\[^\r\n\]*\[\r\n\])+PROGRAMS., EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE(\[^\r\n\]*\[\r\n\])+POSSIBILITY OF SUCH DAMAGES.*" "info warranty"
+ #test info watchpoints
diff --git a/openwrt/toolchain/gdb/patches/620-debian_static-thread-db.patch b/openwrt/toolchain/gdb/patches/620-debian_static-thread-db.patch
new file mode 100644 (file)
index 0000000..c5ac5a6
--- /dev/null
@@ -0,0 +1,156 @@
+Status: submitted similar patch 2004-12-08
+
+This patch cleans up the initialization of thread_db.  It works for static
+binaries now.  The vsyscall patches hide this problem, since new static
+binaries will load the vsyscall DSO and then trigger thread_db; but
+this is still a good cleanup.
+
+Index: gdb-6.3/gdb/thread-db.c
+===================================================================
+--- gdb-6.3.orig/gdb/thread-db.c       2004-10-08 16:29:56.000000000 -0400
++++ gdb-6.3/gdb/thread-db.c    2004-11-10 00:19:30.626530413 -0500
+@@ -34,6 +34,7 @@
+ #include "target.h"
+ #include "regcache.h"
+ #include "solib-svr4.h"
++#include "observer.h"
+ #ifdef HAVE_GNU_LIBC_VERSION_H
+ #include <gnu/libc-version.h>
+@@ -627,59 +628,49 @@ check_thread_signals (void)
+ #endif
+ }
++/* Check whether thread_db is usable.  This function is called when
++   an inferior is created (or otherwise acquired, e.g. attached to)
++   and when new shared libraries are loaded into a running process.  */
++
+ static void
+-thread_db_new_objfile (struct objfile *objfile)
++check_for_thread_db (void)
+ {
+   td_err_e err;
++  static int already_loaded;
+   /* First time through, report that libthread_db was successfuly
+      loaded.  Can't print this in in thread_db_load as, at that stage,
+-     the interpreter and it's console haven't started.  The real
+-     problem here is that libthread_db is loaded too early - it should
+-     only be loaded when there is a program to debug.  */
+-  {
+-    static int dejavu;
+-    if (!dejavu)
+-      {
+-      Dl_info info;
+-      const char *library = NULL;
+-      /* Try dladdr.  */
+-      if (dladdr ((*td_ta_new_p), &info) != 0)
+-        library = info.dli_fname;
+-      /* Try dlinfo?  */
+-      if (library == NULL)
+-        /* Paranoid - don't let a NULL path slip through.  */
+-        library = LIBTHREAD_DB_SO;
+-      printf_unfiltered ("Using host libthread_db library \"%s\".\n",
+-                         library);
+-      dejavu = 1;
+-      }
+-  }
++     the interpreter and it's console haven't started.  */
+-  /* Don't attempt to use thread_db on targets which can not run
+-     (core files).  */
+-  if (objfile == NULL || !target_has_execution)
++  if (!already_loaded)
+     {
+-      /* All symbols have been discarded.  If the thread_db target is
+-         active, deactivate it now.  */
+-      if (using_thread_db)
+-      {
+-        gdb_assert (proc_handle.pid == 0);
+-        unpush_target (&thread_db_ops);
+-        using_thread_db = 0;
+-      }
++      Dl_info info;
++      const char *library = NULL;
++      if (dladdr ((*td_ta_new_p), &info) != 0)
++      library = info.dli_fname;
++
++      /* Try dlinfo?  */
+-      goto quit;
++      if (library == NULL)
++      /* Paranoid - don't let a NULL path slip through.  */
++      library = LIBTHREAD_DB_SO;
++
++      printf_unfiltered ("Using host libthread_db library \"%s\".\n",
++                       library);
++      already_loaded = 1;
+     }
+   if (using_thread_db)
+     /* Nothing to do.  The thread library was already detected and the
+        target vector was already activated.  */
+-    goto quit;
++    return;
++
++  /* Don't attempt to use thread_db on targets which can not run
++     (executables not running yet, core files) for now.  */
++  if (!target_has_execution)
++    return;
+-  /* Initialize the structure that identifies the child process.  Note
+-     that at this point there is no guarantee that we actually have a
+-     child process.  */
++  /* Initialize the structure that identifies the child process.  */
+   proc_handle.pid = GET_PID (inferior_ptid);
+   /* Now attempt to open a connection to the thread library.  */
+@@ -706,12 +697,24 @@ thread_db_new_objfile (struct objfile *o
+              thread_db_err_str (err));
+       break;
+     }
++}
++
++static void
++thread_db_new_objfile (struct objfile *objfile)
++{
++  if (objfile != NULL)
++    check_for_thread_db ();
+-quit:
+   if (target_new_objfile_chain)
+     target_new_objfile_chain (objfile);
+ }
++static void
++check_for_thread_db_observer (struct target_ops *target, int from_tty)
++{
++  check_for_thread_db ();
++}
++
+ /* Attach to a new thread.  This function is called when we receive a
+    TD_CREATE event or when we iterate over all threads and find one
+    that wasn't already in our list.  */
+@@ -1366,5 +1369,8 @@ _initialize_thread_db (void)
+       /* Add ourselves to objfile event chain.  */
+       target_new_objfile_chain = deprecated_target_new_objfile_hook;
+       deprecated_target_new_objfile_hook = thread_db_new_objfile;
++
++      /* Register ourselves for the new inferior observer.  */
++      observer_attach_inferior_created (check_for_thread_db_observer);
+     }
+ }
+Index: gdb-6.3/gdb/Makefile.in
+===================================================================
+--- gdb-6.3.orig/gdb/Makefile.in       2004-11-09 23:04:57.000000000 -0500
++++ gdb-6.3/gdb/Makefile.in    2004-11-10 00:19:26.440347022 -0500
+@@ -2626,7 +2626,8 @@ thread.o: thread.c $(defs_h) $(symtab_h)
+       $(gdbcmd_h) $(regcache_h) $(gdb_h) $(gdb_string_h) $(ui_out_h)
+ thread-db.o: thread-db.c $(defs_h) $(gdb_assert_h) $(gdb_proc_service_h) \
+       $(gdb_thread_db_h) $(bfd_h) $(gdbthread_h) $(inferior_h) \
+-      $(symfile_h) $(objfiles_h) $(target_h) $(regcache_h) $(solib_svr4_h)
++      $(symfile_h) $(objfiles_h) $(target_h) $(regcache_h) $(solib_svr4_h) \
++      $(observer_h)
+ top.o: top.c $(defs_h) $(gdbcmd_h) $(call_cmds_h) $(cli_cmds_h) \
+       $(cli_script_h) $(cli_setshow_h) $(cli_decode_h) $(symtab_h) \
+       $(inferior_h) $(target_h) $(breakpoint_h) $(gdbtypes_h) \
diff --git a/openwrt/toolchain/gdb/patches/630-debian_24.tracepoint-segv.patch b/openwrt/toolchain/gdb/patches/630-debian_24.tracepoint-segv.patch
new file mode 100644 (file)
index 0000000..d038ff8
--- /dev/null
@@ -0,0 +1,15 @@
+Trivial.  Still need to submit this.
+
+Index: gdb-6.1/gdb/tracepoint.c
+===================================================================
+--- gdb-6.1.orig/gdb/tracepoint.c      2004-04-05 13:26:43.000000000 -0400
++++ gdb-6.1/gdb/tracepoint.c   2004-04-05 13:26:45.000000000 -0400
+@@ -853,6 +853,8 @@ read_actions (struct tracepoint *t)
+       else
+       line = gdb_readline (0);
++      if (line == NULL || *line == EOF)
++      break;
+       linetype = validate_actionline (&line, t);
+       if (linetype == BADLINE)
+       continue;               /* already warned -- collect another line */
diff --git a/openwrt/toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch b/openwrt/toolchain/gdb/patches/640-debian_dwarf2-frame-signal-unwinder.patch
new file mode 100644 (file)
index 0000000..246427e
--- /dev/null
@@ -0,0 +1,120 @@
+Status: Checked in to HEAD after 6.3.
+
+2004-11-07  Daniel Jacobowitz  <dan@debian.org>
+
+       * dwarf2-frame.c (struct dwarf2_frame_ops): Add signal_frame_p.
+       (dwarf2_frame_set_signal_frame_p, dwarf2_frame_signal_frame_p)
+       (dwarf2_signal_frame_unwind): New.
+       (dwarf2_frame_sniffer): Use dwarf2_frame_signal_frame_p.
+       * dwarf2-frame.h (dwarf2_frame_set_signal_frame_p): New prototype.
+
+Index: src/gdb/dwarf2-frame.c
+===================================================================
+RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.c,v
+retrieving revision 1.41
+diff -u -p -r1.41 dwarf2-frame.c
+--- src/gdb/dwarf2-frame.c     4 Nov 2004 21:15:15 -0000       1.41
++++ src/gdb/dwarf2-frame.c     7 Nov 2004 17:41:58 -0000
+@@ -471,6 +471,10 @@ struct dwarf2_frame_ops
+ {
+   /* Pre-initialize the register state REG for register REGNUM.  */
+   void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *);
++
++  /* Check whether the frame preceding NEXT_FRAME will be a signal
++     trampoline.  */
++  int (*signal_frame_p) (struct gdbarch *, struct frame_info *);
+ };
+ /* Default architecture-specific register state initialization
+@@ -547,6 +551,33 @@ dwarf2_frame_init_reg (struct gdbarch *g
+   ops->init_reg (gdbarch, regnum, reg);
+ }
++
++/* Set the architecture-specific signal trampoline recognition
++   function for GDBARCH to SIGNAL_FRAME_P.  */
++
++void
++dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
++                               int (*signal_frame_p) (struct gdbarch *,
++                                                      struct frame_info *))
++{
++  struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
++
++  ops->signal_frame_p = signal_frame_p;
++}
++
++/* Query the architecture-specific signal frame recognizer for
++   NEXT_FRAME.  */
++
++static int
++dwarf2_frame_signal_frame_p (struct gdbarch *gdbarch,
++                           struct frame_info *next_frame)
++{
++  struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
++
++  if (ops->signal_frame_p == NULL)
++    return 0;
++  return ops->signal_frame_p (gdbarch, next_frame);
++}
\f
+ struct dwarf2_frame_cache
+@@ -841,6 +872,13 @@ static const struct frame_unwind dwarf2_
+   dwarf2_frame_prev_register
+ };
++static const struct frame_unwind dwarf2_signal_frame_unwind =
++{
++  SIGTRAMP_FRAME,
++  dwarf2_frame_this_id,
++  dwarf2_frame_prev_register
++};
++
+ const struct frame_unwind *
+ dwarf2_frame_sniffer (struct frame_info *next_frame)
+ {
+@@ -848,10 +886,18 @@ dwarf2_frame_sniffer (struct frame_info 
+      function.  frame_pc_unwind(), for a no-return next function, can
+      end up returning something past the end of this function's body.  */
+   CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
+-  if (dwarf2_frame_find_fde (&block_addr))
+-    return &dwarf2_frame_unwind;
++  if (!dwarf2_frame_find_fde (&block_addr))
++    return NULL;
+-  return NULL;
++  /* On some targets, signal trampolines may have unwind information.
++     We need to recognize them so that we set the frame type
++     correctly.  */
++
++  if (dwarf2_frame_signal_frame_p (get_frame_arch (next_frame),
++                                 next_frame))
++    return &dwarf2_signal_frame_unwind;
++
++  return &dwarf2_frame_unwind;
+ }
\f
+Index: src/gdb/dwarf2-frame.h
+===================================================================
+RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.h,v
+retrieving revision 1.6
+diff -u -p -r1.6 dwarf2-frame.h
+--- src/gdb/dwarf2-frame.h     28 Feb 2004 16:59:32 -0000      1.6
++++ src/gdb/dwarf2-frame.h     7 Nov 2004 17:40:41 -0000
+@@ -79,6 +79,14 @@ extern void dwarf2_frame_set_init_reg (s
+                                      void (*init_reg) (struct gdbarch *, int,
+                                            struct dwarf2_frame_state_reg *));
++/* Set the architecture-specific signal trampoline recognition
++   function for GDBARCH to SIGNAL_FRAME_P.  */
++
++extern void
++  dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
++                                 int (*signal_frame_p) (struct gdbarch *,
++                                                        struct frame_info *));
++
+ /* Return the frame unwind methods for the function that contains PC,
+    or NULL if it can't be handled by DWARF CFI frame unwinder.  */
diff --git a/openwrt/toolchain/gdb/patches/650-debian_vsyscall-gdb-support.patch b/openwrt/toolchain/gdb/patches/650-debian_vsyscall-gdb-support.patch
new file mode 100644 (file)
index 0000000..e725f9c
--- /dev/null
@@ -0,0 +1,245 @@
+Status: Checked in to HEAD after 6.3.
+
+2004-11-07  Andrew Cagney  <cagney@redhat.com>
+           Daniel Jacobowitz  <dan@debian.org>
+           Roland McGrath  <roland@redhat.com>
+
+       * Makefile.in (symfile-mem.o): Update dependencies.
+       * i386-linux-tdep.c (i386_linux_dwarf_signal_frame_p): New.
+       (i386_linux_init_abi): Call dwarf2_frame_set_signal_frame_p.
+       * inf-ptrace.c (inf_ptrace_attach): Call
+       observer_notify_inferior_created.
+       * inftarg.c (child_attach): Likewise.
+       * symfile-mem.c: Include "observer.h", "auxv.h", and "elf/common.h".
+       (symbol_file_add_from_memory): Take NAME argument.  Use it for
+       the new BFD's filename.
+       (add_symbol_file_from_memory_command): Update call to
+       symbol_file_add_from_memory.
+       (struct symbol_file_add_from_memory_args, add_vsyscall_page)
+       (symbol_file_add_from_memory_wrapper): New.
+       (_initialize_symfile_mem): Register add_vsyscall_page as an
+       inferior_created observer.
+
+Index: gdb-6.3/gdb/i386-linux-tdep.c
+===================================================================
+--- gdb-6.3.orig/gdb/i386-linux-tdep.c 2004-08-06 16:58:28.000000000 -0400
++++ gdb-6.3/gdb/i386-linux-tdep.c      2004-11-10 00:55:06.669398770 -0500
+@@ -27,6 +27,7 @@
+ #include "inferior.h"
+ #include "osabi.h"
+ #include "reggroups.h"
++#include "dwarf2-frame.h"
+ #include "gdb_string.h"
+@@ -244,6 +245,27 @@ i386_linux_sigtramp_p (struct frame_info
+         || strcmp ("__restore_rt", name) == 0);
+ }
++/* Return one if the unwound PC from NEXT_FRAME is in a signal trampoline
++   which may have DWARF-2 CFI.  */
++
++static int
++i386_linux_dwarf_signal_frame_p (struct gdbarch *gdbarch,
++                               struct frame_info *next_frame)
++{
++  CORE_ADDR pc = frame_pc_unwind (next_frame);
++  char *name;
++
++  find_pc_partial_function (pc, &name, NULL, NULL);
++
++  /* If a vsyscall DSO is in use, the signal trampolines may have these
++     names.  */
++  if (name && (strcmp (name, "__kernel_sigreturn") == 0
++             || strcmp (name, "__kernel_rt_sigreturn") == 0))
++    return 1;
++
++  return 0;
++}
++
+ /* Offset to struct sigcontext in ucontext, from <asm/ucontext.h>.  */
+ #define I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 20
+@@ -414,6 +436,8 @@ i386_linux_init_abi (struct gdbarch_info
+   /* GNU/Linux uses the dynamic linker included in the GNU C Library.  */
+   set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
++
++  dwarf2_frame_set_signal_frame_p (gdbarch, i386_linux_dwarf_signal_frame_p);
+ }
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-6.3/gdb/inf-ptrace.c
+===================================================================
+--- gdb-6.3.orig/gdb/inf-ptrace.c      2004-10-15 09:29:33.000000000 -0400
++++ gdb-6.3/gdb/inf-ptrace.c   2004-11-10 00:53:43.697615843 -0500
+@@ -220,6 +220,10 @@ inf_ptrace_attach (char *args, int from_
+   inferior_ptid = pid_to_ptid (pid);
+   push_target (ptrace_ops_hack);
++
++  /* Do this first, before anything has had a chance to query the
++     inferior's symbol table or similar.  */
++  observer_notify_inferior_created (&current_target, from_tty);
+ }
+ static void
+Index: gdb-6.3/gdb/inftarg.c
+===================================================================
+--- gdb-6.3.orig/gdb/inftarg.c 2004-10-08 16:29:47.000000000 -0400
++++ gdb-6.3/gdb/inftarg.c      2004-11-10 00:53:43.711613107 -0500
+@@ -211,6 +211,10 @@ child_attach (char *args, int from_tty)
+   
+   inferior_ptid = pid_to_ptid (pid);
+   push_target (&deprecated_child_ops);
++
++  /* Do this first, before anything has had a chance to query the
++     inferior's symbol table or similar.  */
++  observer_notify_inferior_created (&current_target, from_tty);
+ }
+ #if !defined(CHILD_POST_ATTACH)
+Index: gdb-6.3/gdb/symfile-mem.c
+===================================================================
+--- gdb-6.3.orig/gdb/symfile-mem.c     2004-07-17 10:24:07.000000000 -0400
++++ gdb-6.3/gdb/symfile-mem.c  2004-11-10 00:53:43.722610958 -0500
+@@ -52,13 +52,19 @@
+ #include "target.h"
+ #include "value.h"
+ #include "symfile.h"
++#include "observer.h"
++#include "auxv.h"
++#include "elf/common.h"
+ /* Read inferior memory at ADDR to find the header of a loaded object file
+    and read its in-core symbols out of inferior memory.  TEMPL is a bfd
+-   representing the target's format.  */
++   representing the target's format.  NAME is the name to use for this
++   symbol file in messages; it can be NULL or a malloc-allocated string
++   which will be attached to the BFD.  */
+ static struct objfile *
+-symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, int from_tty)
++symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
++                           int from_tty)
+ {
+   struct objfile *objf;
+   struct bfd *nbfd;
+@@ -75,7 +81,10 @@ symbol_file_add_from_memory (struct bfd 
+   if (nbfd == NULL)
+     error ("Failed to read a valid object file image from memory.");
+-  nbfd->filename = xstrdup ("shared object read from target memory");
++  if (name == NULL)
++    nbfd->filename = xstrdup ("shared object read from target memory");
++  else
++    nbfd->filename = name;
+   if (!bfd_check_format (nbfd, bfd_object))
+     {
+@@ -129,7 +138,73 @@ add_symbol_file_from_memory_command (cha
+     error ("\
+ Must use symbol-file or exec-file before add-symbol-file-from-memory.");
+-  symbol_file_add_from_memory (templ, addr, from_tty);
++  symbol_file_add_from_memory (templ, addr, NULL, from_tty);
++}
++
++/* Arguments for symbol_file_add_from_memory_wrapper.  */
++
++struct symbol_file_add_from_memory_args
++{
++  struct bfd *bfd;
++  CORE_ADDR sysinfo_ehdr;
++  char *name;
++  int from_tty;
++};
++
++/* Wrapper function for symbol_file_add_from_memory, for
++   catch_exceptions.  */
++
++static int
++symbol_file_add_from_memory_wrapper (struct ui_out *uiout, void *data)
++{
++  struct symbol_file_add_from_memory_args *args = data;
++
++  symbol_file_add_from_memory (args->bfd, args->sysinfo_ehdr, args->name,
++                             args->from_tty);
++  return 0;
++}
++
++/* Try to add the symbols for the vsyscall page, if there is one.  This function
++   is called via the inferior_created observer.  */
++
++static void
++add_vsyscall_page (struct target_ops *target, int from_tty)
++{
++  CORE_ADDR sysinfo_ehdr;
++
++  if (target_auxv_search (target, AT_SYSINFO_EHDR, &sysinfo_ehdr) > 0
++      && sysinfo_ehdr != (CORE_ADDR) 0)
++    {
++      struct bfd *bfd;
++      struct symbol_file_add_from_memory_args args;
++
++      if (core_bfd != NULL)
++      bfd = core_bfd;
++      else if (exec_bfd != NULL)
++      bfd = exec_bfd;
++      else
++       /* FIXME: cagney/2004-05-06: Should not require an existing
++        BFD when trying to create a run-time BFD of the VSYSCALL
++        page in the inferior.  Unfortunately that's the current
++        interface so for the moment bail.  Introducing a
++        ``bfd_runtime'' (a BFD created using the loaded image) file
++        format should fix this.  */
++      {
++        warning ("could not load vsyscall page because no executable was specified");
++        warning ("try using the \"file\" command first");
++        return;
++      }
++      args.bfd = bfd;
++      args.sysinfo_ehdr = sysinfo_ehdr;
++      xasprintf (&args.name, "system-supplied DSO at 0x%s",
++               paddr_nz (sysinfo_ehdr));
++      /* Pass zero for FROM_TTY, because the action of loading the
++       vsyscall DSO was not triggered by the user, even if the user
++       typed "run" at the TTY.  */
++      args.from_tty = 0;
++      catch_exceptions (uiout, symbol_file_add_from_memory_wrapper,
++                      &args, NULL, RETURN_MASK_ALL);
++    }
+ }
\f
+@@ -143,4 +218,7 @@ Load the symbols out of memory from a dy
+ Give an expression for the address of the file's shared object file header.",
+            &cmdlist);
++  /* Want to know of each new inferior so that its vsyscall info can
++     be extracted.  */
++  observer_attach_inferior_created (add_vsyscall_page);
+ }
+Index: gdb-6.3/gdb/Makefile.in
+===================================================================
+--- gdb-6.3.orig/gdb/Makefile.in       2004-11-10 00:29:00.000000000 -0500
++++ gdb-6.3/gdb/Makefile.in    2004-11-10 00:54:47.728100986 -0500
+@@ -2020,7 +2020,7 @@ i386-linux-nat.o: i386-linux-nat.c $(def
+ i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
+       $(value_h) $(regcache_h) $(inferior_h) $(osabi_h) $(reggroups_h) \
+       $(gdb_string_h) $(i386_tdep_h) $(i386_linux_tdep_h) $(glibc_tdep_h) \
+-      $(solib_svr4_h)
++      $(solib_svr4_h) $(dwarf2_frame_h)
+ i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
+       $(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h)
+ i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
+@@ -2606,7 +2606,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
+       $(hashtab_h) $(readline_h) $(gdb_assert_h) $(block_h) \
+       $(gdb_string_h) $(gdb_stat_h)
+ symfile-mem.o: symfile-mem.c $(defs_h) $(symtab_h) $(gdbcore_h) \
+-      $(objfiles_h) $(gdbcmd_h) $(target_h) $(value_h) $(symfile_h)
++      $(objfiles_h) $(gdbcmd_h) $(target_h) $(value_h) $(symfile_h) \
++      $(observer_h) $(auxv_h) $(elf_common_h)
+ symmisc.o: symmisc.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(bfd_h) \
+       $(symfile_h) $(objfiles_h) $(breakpoint_h) $(command_h) \
+       $(gdb_obstack_h) $(language_h) $(bcache_h) $(block_h) $(gdb_regex_h) \
diff --git a/openwrt/toolchain/gdb/patches/660-debian_dwarf-cfa-restore.patch b/openwrt/toolchain/gdb/patches/660-debian_dwarf-cfa-restore.patch
new file mode 100644 (file)
index 0000000..8b81cca
--- /dev/null
@@ -0,0 +1,23 @@
+Status: Checked in to HEAD after 6.3.
+
+2004-11-09  Daniel Jacobowitz  <dan@debian.org>
+
+       * dwarf2-frame.c (dwarf2_frame_state_alloc_regs): Correct allocated
+       size.
+
+Index: src/gdb/dwarf2-frame.c
+===================================================================
+RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v
+retrieving revision 1.45
+diff -u -p -r1.45 dwarf2-frame.c
+--- src/gdb/dwarf2-frame.c     7 Nov 2004 21:16:11 -0000       1.45
++++ src/gdb/dwarf2-frame.c     9 Nov 2004 14:42:52 -0000
+@@ -162,7 +162,7 @@ dwarf2_frame_state_alloc_regs (struct dw
+ static struct dwarf2_frame_state_reg *
+ dwarf2_frame_state_copy_regs (struct dwarf2_frame_state_reg_info *rs)
+ {
+-  size_t size = rs->num_regs * sizeof (struct dwarf2_frame_state_reg_info);
++  size_t size = rs->num_regs * sizeof (struct dwarf2_frame_state_reg);
+   struct dwarf2_frame_state_reg *reg;
+   reg = (struct dwarf2_frame_state_reg *) xmalloc (size);
diff --git a/openwrt/toolchain/gdb/patches/680-debian_sim-destdir.patch b/openwrt/toolchain/gdb/patches/680-debian_sim-destdir.patch
new file mode 100644 (file)
index 0000000..71f60b5
--- /dev/null
@@ -0,0 +1,53 @@
+Fix some missing uses of DESTDIR in the sim/ directories.  The Debian
+packages use DESTDIR to build.
+
+%patch
+Index: gdb-6.3/sim/Makefile.in
+===================================================================
+--- gdb-6.3.orig/sim/Makefile.in       2003-09-03 14:46:52.000000000 -0400
++++ gdb-6.3/sim/Makefile.in    2004-11-10 00:39:25.381315738 -0500
+@@ -93,6 +93,7 @@ FLAGS_TO_PASS = \
+       "CC=$(CC)" \
+       "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+       "CFLAGS=$(CFLAGS)" \
++      "DESTDIR=$(DESTDIR)" \
+       "RANLIB=$(RANLIB)" \
+       "MAKEINFO=$(MAKEINFO)" \
+       "INSTALL=$(INSTALL)" \
+Index: gdb-6.3/sim/common/Make-common.in
+===================================================================
+--- gdb-6.3.orig/sim/common/Make-common.in     2003-09-08 13:24:59.000000000 -0400
++++ gdb-6.3/sim/common/Make-common.in  2004-11-10 00:39:25.383315347 -0500
+@@ -581,14 +581,14 @@ install: install-common $(SIM_EXTRA_INST
+ install-common: installdirs
+       n=`echo run | sed '$(program_transform_name)'`; \
+-      $(INSTALL_PROGRAM) run$(EXEEXT) $(bindir)/$$n$(EXEEXT)
++      $(INSTALL_PROGRAM) run$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT)
+       n=`echo libsim.a | sed s/libsim.a/lib$(target_alias)-sim.a/`; \
+-      $(INSTALL_DATA) libsim.a $(libdir)/$$n ; \
+-      ( cd $(libdir) ; $(RANLIB) $$n )
++      $(INSTALL_DATA) libsim.a $(DESTDIR)$(libdir)/$$n ; \
++      ( cd $(DESTDIR)$(libdir) ; $(RANLIB) $$n )
+ installdirs:
+-      $(SHELL) $(srcdir)/../../mkinstalldirs $(bindir)
+-      $(SHELL) $(srcdir)/../../mkinstalldirs $(libdir)
++      $(SHELL) $(srcdir)/../../mkinstalldirs $(DESTDIR)$(bindir)
++      $(SHELL) $(srcdir)/../../mkinstalldirs $(DESTDIR)$(libdir)
+ check:
+       cd ../testsuite && $(MAKE) check RUNTESTFLAGS="$(RUNTESTFLAGS)"
+Index: gdb-6.3/sim/erc32/Makefile.in
+===================================================================
+--- gdb-6.3.orig/sim/erc32/Makefile.in 2000-03-07 10:32:49.000000000 -0500
++++ gdb-6.3/sim/erc32/Makefile.in      2004-11-10 00:39:25.385314957 -0500
+@@ -53,7 +53,7 @@ end.h: end
+ # Copy the files into directories where they will be run.
+ install-sis: installdirs
+       n=`echo sis | sed '$(program_transform_name)'`; \
+-      $(INSTALL_PROGRAM) sis$(EXEEXT) $(bindir)/$$n$(EXEEXT)
++      $(INSTALL_PROGRAM) sis$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT)
+ clean-sis:
+       rm -f sis end end.h
diff --git a/openwrt/toolchain/gdb/patches/690-debian_member-field-symtab.patch b/openwrt/toolchain/gdb/patches/690-debian_member-field-symtab.patch
new file mode 100644 (file)
index 0000000..4f5fb45
--- /dev/null
@@ -0,0 +1,35 @@
+Status: unsubmitted
+
+This patch was for Debian bug #239535.  It needs to be tested, and
+submitted.
+
+Index: gdb-6.3/gdb/valops.c
+===================================================================
+--- gdb-6.3.orig/gdb/valops.c  2004-11-09 22:51:07.000000000 -0500
++++ gdb-6.3/gdb/valops.c       2004-11-10 00:43:54.036837699 -0500
+@@ -2314,8 +2314,10 @@ check_field_in (struct type *type, const
+       return 1;
+     }
++  /* Check each baseclass.  Call check_typedef, which will follow typedefs
++     and do opaque/stub type resolution.  */
+   for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--)
+-    if (check_field_in (TYPE_BASECLASS (type, i), name))
++    if (check_field_in (check_typedef (TYPE_BASECLASS (type, i)), name))
+       return 1;
+   return 0;
+Index: gdb-6.3/gdb/dwarf2read.c
+===================================================================
+--- gdb-6.3.orig/gdb/dwarf2read.c      2004-10-15 20:41:00.000000000 -0400
++++ gdb-6.3/gdb/dwarf2read.c   2004-11-10 00:46:21.970935829 -0500
+@@ -2099,8 +2099,8 @@ guess_structure_name (struct partial_die
+                                   strlen (actual_class_name),
+                                   &cu->comp_unit_obstack);
+                 xfree (actual_class_name);
++                break;
+               }
+-            break;
+           }
+         child_pdi = child_pdi->die_sibling;
diff --git a/openwrt/toolchain/gdb/patches/700-debian_cp-pass-by-reference.patch b/openwrt/toolchain/gdb/patches/700-debian_cp-pass-by-reference.patch
new file mode 100644 (file)
index 0000000..666d343
--- /dev/null
@@ -0,0 +1,464 @@
+This patch needs to be submitted for the FSF.  Also, there may be testcases
+already in the GDB testsuite (currently disabled) that it would probably fix.
+
+Index: gdb-6.3/gdb/infcall.c
+===================================================================
+--- gdb-6.3.orig/gdb/infcall.c 2004-10-08 04:15:56.000000000 -0400
++++ gdb-6.3/gdb/infcall.c      2004-11-10 12:30:07.000000000 -0500
+@@ -36,6 +36,7 @@
+ #include "gdb_string.h"
+ #include "infcall.h"
+ #include "dummy-frame.h"
++#include "cp-abi.h"
+ /* NOTE: cagney/2003-04-16: What's the future of this code?
+@@ -297,8 +298,8 @@ call_function_by_hand (struct value *fun
+ {
+   CORE_ADDR sp;
+   CORE_ADDR dummy_addr;
+-  struct type *value_type;
+-  unsigned char struct_return;
++  struct type *value_type, *target_value_type;
++  unsigned char struct_return = 0, cp_struct_return = 0;
+   CORE_ADDR struct_addr = 0;
+   struct regcache *retbuf;
+   struct cleanup *retbuf_cleanup;
+@@ -312,6 +313,7 @@ call_function_by_hand (struct value *fun
+   struct regcache *caller_regcache;
+   struct cleanup *caller_regcache_cleanup;
+   struct frame_id dummy_id;
++  struct cleanup *args_cleanup;
+   if (!target_has_execution)
+     noprocess ();
+@@ -410,10 +412,31 @@ call_function_by_hand (struct value *fun
+     using_gcc = (b == NULL ? 2 : BLOCK_GCC_COMPILED (b));
+   }
+-  /* Are we returning a value using a structure return or a normal
+-     value return? */
++  /* Are we returning a value using a structure return (passing a
++     hidden argument pointing to storage) or a normal value return?
++     There are two cases: C++ ABI mandated structure return and
++     target ABI structure return.  The variable STRUCT_RETURN only
++     describes the latter.  The C++ version is handled by passing
++     the return location as the first parameter to the function,
++     even preceding "this".  This is different from the target
++     ABI version, which is target-specific; for instance, on ia64
++     the first argument is passed in out0 but the hidden structure
++     return pointer would normally be passed in r8.  */
+-  struct_return = using_struct_return (value_type, using_gcc);
++  if (current_language->la_language == language_cplus
++      && cp_pass_by_reference (value_type))
++    {
++      cp_struct_return = 1;
++
++      /* Tell the target specific argument pushing routine not to
++       expect a value.  */
++      target_value_type = builtin_type_void;
++    }
++  else
++    {
++      struct_return = using_struct_return (value_type, using_gcc);
++      target_value_type = value_type;
++    }
+   /* Determine the location of the breakpoint (and possibly other
+      stuff) that the called function will return to.  The SPARC, for a
+@@ -432,7 +455,7 @@ call_function_by_hand (struct value *fun
+       if (INNER_THAN (1, 2))
+       {
+         sp = push_dummy_code (current_gdbarch, sp, funaddr,
+-                              using_gcc, args, nargs, value_type,
++                              using_gcc, args, nargs, target_value_type,
+                               &real_pc, &bp_addr);
+         dummy_addr = sp;
+       }
+@@ -440,7 +463,7 @@ call_function_by_hand (struct value *fun
+       {
+         dummy_addr = sp;
+         sp = push_dummy_code (current_gdbarch, sp, funaddr,
+-                              using_gcc, args, nargs, value_type,
++                              using_gcc, args, nargs, target_value_type,
+                               &real_pc, &bp_addr);
+       }
+       break;
+@@ -507,9 +530,15 @@ call_function_by_hand (struct value *fun
+         param_type = TYPE_FIELD_TYPE (ftype, i);
+       else
+         param_type = NULL;
+-      
++
+       args[i] = value_arg_coerce (args[i], param_type, prototyped);
++      /* FIXME: Is current_language the right language?  */
++      if (current_language->la_language == language_cplus
++          && param_type != NULL
++          && cp_pass_by_reference (param_type))
++        args[i] = value_addr (args[i]);
++
+       /* elz: this code is to handle the case in which the function
+          to be called has a pointer to function as parameter and the
+          corresponding actual argument is the address of a function
+@@ -607,7 +636,7 @@ You must use a pointer to function type 
+      stack, if necessary.  Make certain that the value is correctly
+      aligned. */
+-  if (struct_return)
++  if (struct_return || cp_struct_return)
+     {
+       int len = TYPE_LENGTH (value_type);
+       if (INNER_THAN (1, 2))
+@@ -632,6 +661,22 @@ You must use a pointer to function type 
+       }
+     }
++  if (cp_struct_return)
++    {
++      struct value **new_args;
++
++      /* Add the new argument to the front of the argument list.  */
++      new_args = xmalloc (sizeof (struct value *) * (nargs + 1));
++      new_args[0] = value_from_pointer (lookup_pointer_type (value_type),
++                                      struct_addr);
++      memcpy (&new_args[1], &args[0], sizeof (struct value *) * nargs);
++      args = new_args;
++      nargs++;
++      args_cleanup = make_cleanup (xfree, args);
++    }
++  else
++    args_cleanup = make_cleanup (null_cleanup, NULL);
++
+   /* Create the dummy stack frame.  Pass in the call dummy address as,
+      presumably, the ABI code knows where, in the call dummy, the
+      return address should be pointed.  */
+@@ -649,6 +694,8 @@ You must use a pointer to function type 
+   else
+     error ("This target does not support function calls");
++  do_cleanups (args_cleanup);
++
+   /* Set up a frame ID for the dummy frame so we can pass it to
+      set_momentary_breakpoint.  We need to give the breakpoint a frame
+      ID so that the breakpoint code can correctly re-identify the
+@@ -839,11 +886,7 @@ the function call).", name);
+   /* Figure out the value returned by the function, return that.  */
+   {
+     struct value *retval;
+-    if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
+-      /* If the function returns void, don't bother fetching the
+-       return value.  */
+-      retval = allocate_value (value_type);
+-    else if (struct_return)
++    if (struct_return || cp_struct_return)
+       /* NOTE: cagney/2003-09-27: This assumes that PUSH_DUMMY_CALL
+        has correctly stored STRUCT_ADDR in the target.  In the past
+        that hasn't been the case, the old MIPS PUSH_ARGUMENTS
+@@ -853,6 +896,10 @@ the function call).", name);
+        "struct return convention", check that PUSH_DUMMY_CALL isn't
+        playing tricks.  */
+       retval = value_at (value_type, struct_addr, NULL);
++    else if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
++      /* If the function returns void, don't bother fetching the
++       return value.  */
++      retval = allocate_value (value_type);
+     else
+       {
+       /* This code only handles "register convention".  */
+Index: gdb-6.3/gdb/cp-abi.h
+===================================================================
+--- gdb-6.3.orig/gdb/cp-abi.h  2003-04-12 13:41:25.000000000 -0400
++++ gdb-6.3/gdb/cp-abi.h       2004-11-10 12:30:07.000000000 -0500
+@@ -1,7 +1,7 @@
+ /* Abstraction of various C++ ABI's we support, and the info we need
+    to get from them.
+    Contributed by Daniel Berlin <dberlin@redhat.com>
+-   Copyright 2001 Free Software Foundation, Inc.
++   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+    This file is part of GDB.
+@@ -145,6 +145,10 @@ extern struct type *value_rtti_type (str
+ extern int baseclass_offset (struct type *type, int index, char *valaddr,
+                            CORE_ADDR address);
+                   
++/* Return non-zero if an argument of type TYPE should be passed by reference
++   instead of value.  */
++extern int cp_pass_by_reference (struct type *type);
++
+ struct cp_abi_ops
+ {
+   const char *shortname;
+@@ -162,6 +166,7 @@ struct cp_abi_ops
+                            int *using_enc);
+   int (*baseclass_offset) (struct type *type, int index, char *valaddr,
+                          CORE_ADDR address);
++  int (*pass_by_reference) (struct type *type);
+ };
+Index: gdb-6.3/gdb/cp-abi.c
+===================================================================
+--- gdb-6.3.orig/gdb/cp-abi.c  2003-11-26 17:04:00.000000000 -0500
++++ gdb-6.3/gdb/cp-abi.c       2004-11-10 12:30:07.000000000 -0500
+@@ -1,5 +1,5 @@
+ /* Generic code for supporting multiple C++ ABI's
+-   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
++   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+    This file is part of GDB.
+@@ -94,6 +94,14 @@ value_rtti_type (struct value *v, int *f
+   return (*current_cp_abi.rtti_type) (v, full, top, using_enc);
+ }
++int
++cp_pass_by_reference (struct type *type)
++{
++  if ((current_cp_abi.pass_by_reference) == NULL)
++    return 0;
++  return (*current_cp_abi.pass_by_reference) (type);
++}
++
+ /* Set the current C++ ABI to SHORT_NAME.  */
+ static int
+Index: gdb-6.3/gdb/gnu-v3-abi.c
+===================================================================
+--- gdb-6.3.orig/gdb/gnu-v3-abi.c      2004-03-15 15:38:08.000000000 -0500
++++ gdb-6.3/gdb/gnu-v3-abi.c   2004-11-10 12:30:07.000000000 -0500
+@@ -1,7 +1,7 @@
+ /* Abstraction of GNU v3 abi.
+    Contributed by Jim Blandy <jimb@redhat.com>
+-   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
++   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+    This file is part of GDB.
+@@ -419,6 +419,84 @@ gnuv3_baseclass_offset (struct type *typ
+   return base_offset;
+ }
++/* Return nonzero if a type should be passed by reference.
++
++   The rule in the v3 ABI document comes from section 3.1.1.  If the
++   type has a non-trivial copy constructor or destructor, then the
++   caller must make a copy (by calling the copy constructor if there
++   is one or perform the copy itself otherwise), pass the address of
++   the copy, and then destroy the temporary (if necessary).
++
++   For return values with non-trivial copy constructors or
++   destructors, space will be allocated in the caller, and a pointer
++   will be passed as the first argument (preceding "this").
++
++   We don't have a bulletproof mechanism for determining whether a
++   constructor or destructor is trivial.  For GCC and DWARF2 debug
++   information, we can check the artificial flag.
++
++   We don't do anything with the constructors or destructors yet,
++   but we have to get the argument passing right anyway.  */
++static int
++gnuv3_pass_by_reference (struct type *type)
++{
++  int fieldnum, fieldelem, basenum;
++
++  CHECK_TYPEDEF (type);
++
++  /* We're only interested in things that can have methods.  */
++  if (TYPE_CODE (type) != TYPE_CODE_STRUCT
++      && TYPE_CODE (type) != TYPE_CODE_CLASS
++      && TYPE_CODE (type) != TYPE_CODE_UNION)
++    return 0;
++
++  for (fieldnum = 0; fieldnum < TYPE_NFN_FIELDS (type); fieldnum++)
++    for (fieldelem = 0; fieldelem < TYPE_FN_FIELDLIST_LENGTH (type, fieldnum);
++       fieldelem++)
++      {
++      struct fn_field *fn = TYPE_FN_FIELDLIST1 (type, fieldnum);
++      char *name = TYPE_FN_FIELDLIST_NAME (type, fieldnum);
++      struct type *fieldtype = TYPE_FN_FIELD_TYPE (fn, fieldelem);
++
++      /* If this function is marked as artificial, it is compiler-generated,
++         and we assume it is trivial.  */
++      if (TYPE_FN_FIELD_ARTIFICIAL (fn, fieldelem))
++        continue;
++
++      /* If we've found a destructor, we must pass this by reference.  */
++      if (name[0] == '~')
++        return 1;
++
++      /* If the mangled name of this method doesn't indicate that it
++         is a constructor, we're not interested.
++
++         FIXME drow/2004-05-27: We could do this using the name of
++         the method and the name of the class instead of dealing
++         with the mangled name.  We don't have a convenient function
++         to strip off both leading scope qualifiers and trailing
++         template arguments yet.  */
++      if (!is_constructor_name (TYPE_FN_FIELD_PHYSNAME (fn, fieldelem)))
++        continue;
++
++      /* If this method takes two arguments, and the second argument is
++         a reference to this class, then it is a copy constructor.  */
++      if (TYPE_NFIELDS (fieldtype) == 2
++          && TYPE_CODE (TYPE_FIELD_TYPE (fieldtype, 1)) == TYPE_CODE_REF
++          && check_typedef (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (fieldtype, 1))) == type)
++        return 1;
++      }
++
++  /* Even if all the constructors and destructors were artificial, one
++     of them may have invoked a non-artificial constructor or
++     destructor in a base class.  If any base class needs to be passed
++     by reference, so does this class.  */
++  for (basenum = 0; basenum < TYPE_N_BASECLASSES (type); basenum++)
++    if (gnuv3_pass_by_reference (TYPE_BASECLASS (type, basenum)))
++      return 1;
++
++  return 0;
++}
++
+ static void
+ init_gnuv3_ops (void)
+ {
+@@ -434,6 +512,7 @@ init_gnuv3_ops (void)
+   gnu_v3_abi_ops.rtti_type = gnuv3_rtti_type;
+   gnu_v3_abi_ops.virtual_fn_field = gnuv3_virtual_fn_field;
+   gnu_v3_abi_ops.baseclass_offset = gnuv3_baseclass_offset;
++  gnu_v3_abi_ops.pass_by_reference = gnuv3_pass_by_reference;
+ }
+ extern initialize_file_ftype _initialize_gnu_v3_abi; /* -Wmissing-prototypes */
+Index: gdb-6.3/gdb/hpacc-abi.c
+===================================================================
+--- gdb-6.3.orig/gdb/hpacc-abi.c       2003-06-08 14:27:13.000000000 -0400
++++ gdb-6.3/gdb/hpacc-abi.c    2004-11-10 12:30:07.000000000 -0500
+@@ -3,7 +3,7 @@
+    Most of the real code is from HP, i've just fiddled it to fit in
+    the C++ ABI abstraction framework.
+-   Copyright 2001 Free Software Foundation, Inc.
++   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
+    This file is part of GDB.
+Index: gdb-6.3/gdb/Makefile.in
+===================================================================
+--- gdb-6.3.orig/gdb/Makefile.in       2004-11-10 12:30:06.000000000 -0500
++++ gdb-6.3/gdb/Makefile.in    2004-11-10 12:30:07.000000000 -0500
+@@ -2073,7 +2073,7 @@ ia64-tdep.o: ia64-tdep.c $(defs_h) $(inf
+ infcall.o: infcall.c $(defs_h) $(breakpoint_h) $(target_h) $(regcache_h) \
+       $(inferior_h) $(gdb_assert_h) $(block_h) $(gdbcore_h) $(language_h) \
+       $(objfiles_h) $(gdbcmd_h) $(command_h) $(gdb_string_h) $(infcall_h) \
+-      $(dummy_frame_h)
++      $(dummy_frame_h) $(cp_abi_h)
+ inf-child.o: inf-child.c $(defs_h) $(regcache_h) $(memattr_h) $(symtab_h) \
+       $(target_h) $(inferior_h) $(gdb_string_h)
+ infcmd.o: infcmd.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
+Index: gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.exp
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.exp       2004-11-11 09:48:00.498518899 -0500
+@@ -0,0 +1,38 @@
++# This testcase is part of GDB, the GNU debugger.
++
++# Copyright 2004 Free Software Foundation, Inc.
++
++# 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 2 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, write to the Free Software
++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
++
++# Check that GDB can call C++ functions whose parameters have
++# object type, but are passed by reference.
++
++set testfile "pass-by-ref"
++set srcfile ${testfile}.cc
++set binfile ${objdir}/${subdir}/${testfile}
++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
++    return -1
++}
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++if ![runto_main] then {
++    return -1
++}
++
++gdb_test "print foo (global_obj)" " = 3" "call function"
+Index: gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.cc
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.cc        2004-11-11 09:44:17.815014667 -0500
+@@ -0,0 +1,57 @@
++/* This testcase is part of GDB, the GNU debugger.
++
++   Copyright 2004 Free Software Foundation, Inc.
++
++   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 2 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, write to the Free Software
++   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++   USA.  */
++
++class Obj {
++public:
++  Obj ();
++  Obj (const Obj &);
++  ~Obj ();
++  int var[2];
++};
++
++int foo (Obj arg)
++{
++  return arg.var[0] + arg.var[1];
++}
++
++Obj::Obj ()
++{
++  var[0] = 1;
++  var[1] = 2;
++}
++
++Obj::Obj (const Obj &obj)
++{
++  var[0] = obj.var[0];
++  var[1] = obj.var[1];
++}
++
++Obj::~Obj ()
++{
++
++}
++
++Obj global_obj;
++
++int
++main ()
++{
++  int bar = foo (global_obj);
++  return bar;
++}
diff --git a/openwrt/toolchain/gdb/patches/710-debian_thread-db-multiple-libraries.patch b/openwrt/toolchain/gdb/patches/710-debian_thread-db-multiple-libraries.patch
new file mode 100644 (file)
index 0000000..c164bd1
--- /dev/null
@@ -0,0 +1,593 @@
+Support loading two libthread_db DSOs.  In this case, the LinuxThreads
+and NPTL ones.
+
+Index: gdb-6.3/gdb/thread-db.c
+===================================================================
+--- gdb-6.3.orig/gdb/thread-db.c       2004-11-10 10:46:24.000000000 -0500
++++ gdb-6.3/gdb/thread-db.c    2004-11-10 11:22:34.858812426 -0500
+@@ -79,53 +79,63 @@ static td_thragent_t *thread_agent;
+ /* Pointers to the libthread_db functions.  */
+-static td_err_e (*td_init_p) (void);
++struct thread_db_pointers
++{
++  const char *filename;
++
++  td_err_e (*td_init_p) (void);
+-static td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
+-                              td_thragent_t **ta);
+-static td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
+-                                     td_thrhandle_t *__th);
+-static td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
+-                                      lwpid_t lwpid, td_thrhandle_t *th);
+-static td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
+-                                   td_thr_iter_f *callback, void *cbdata_p,
+-                                   td_thr_state_e state, int ti_pri,
+-                                   sigset_t *ti_sigmask_p,
+-                                   unsigned int ti_user_flags);
+-static td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
+-                                     td_event_e event, td_notify_t *ptr);
+-static td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
+-                                    td_thr_events_t *event);
+-static td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
+-                                       td_event_msg_t *msg);
+-
+-static td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
+-static td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
+-                                    td_thrinfo_t *infop);
+-static td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
+-                                     gdb_prfpregset_t *regset);
+-static td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
+-                                    prgregset_t gregs);
+-static td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
+-                                     const gdb_prfpregset_t *fpregs);
+-static td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
+-                                    prgregset_t gregs);
+-static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
+-                                        int event);
+-
+-static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
+-                                        void *map_address,
+-                                        size_t offset, void **address);
++  td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
++                         td_thragent_t **ta);
++  td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
++                                td_thrhandle_t *__th);
++  td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
++                                 lwpid_t lwpid, td_thrhandle_t *th);
++
++  td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
++                              td_thr_iter_f *callback, void *cbdata_p,
++                              td_thr_state_e state, int ti_pri,
++                              sigset_t *ti_sigmask_p,
++                              unsigned int ti_user_flags);
++  td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
++                                td_event_e event, td_notify_t *ptr);
++  td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
++                               td_thr_events_t *event);
++  td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
++                                  td_event_msg_t *msg);
++
++  td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
++  td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
++                               td_thrinfo_t *infop);
++  td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
++                                gdb_prfpregset_t *regset);
++  td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
++                               prgregset_t gregs);
++  td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
++                                const gdb_prfpregset_t *fpregs);
++  td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
++                               prgregset_t gregs);
++  td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
++                                   int event);
++
++  td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
++                                   void *map_address,
++                                   size_t offset, void **address);
++
++  struct thread_db_pointers *next;
++};
+ /* Location of the thread creation event breakpoint.  The code at this
+    location in the child process will be called by the pthread library
+    whenever a new thread is created.  By setting a special breakpoint
+    at this location, GDB can detect when a new thread is created.  We
+    obtain this location via the td_ta_event_addr call.  */
+-static CORE_ADDR td_create_bp_addr;
++CORE_ADDR td_create_bp_addr;
+ /* Location of the thread death event breakpoint.  */
+-static CORE_ADDR td_death_bp_addr;
++CORE_ADDR td_death_bp_addr;
++
++static struct thread_db_pointers *current_pointers, *all_pointers;
+ /* Prototypes for local functions.  */
+ static void thread_db_find_new_threads (void);
+@@ -262,7 +272,7 @@ thread_get_info_callback (const td_thrha
+   struct thread_info *thread_info;
+   ptid_t thread_ptid;
+-  err = td_thr_get_info_p (thp, &ti);
++  err = current_pointers->td_thr_get_info_p (thp, &ti);
+   if (err != TD_OK)
+     error ("thread_get_info_callback: cannot get thread info: %s",
+          thread_db_err_str (err));
+@@ -316,8 +326,9 @@ thread_db_map_id2thr (struct thread_info
+   if (thread_info->private->th_valid)
+     return;
+-  err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (thread_info->ptid),
+-                          &thread_info->private->th);
++  err = current_pointers->td_ta_map_id2thr_p (thread_agent,
++                                            GET_THREAD (thread_info->ptid),
++                                            &thread_info->private->th);
+   if (err != TD_OK)
+     {
+       if (fatal)
+@@ -340,8 +351,8 @@ thread_db_get_info (struct thread_info *
+   if (!thread_info->private->th_valid)
+     thread_db_map_id2thr (thread_info, 1);
+-  err =
+-    td_thr_get_info_p (&thread_info->private->th, &thread_info->private->ti);
++  err = current_pointers->td_thr_get_info_p (&thread_info->private->th,
++                                           &thread_info->private->ti);
+   if (err != TD_OK)
+     error ("thread_db_get_info: cannot get thread info: %s",
+          thread_db_err_str (err));
+@@ -365,7 +376,8 @@ thread_from_lwp (ptid_t ptid)
+   gdb_assert (is_lwp (ptid));
+-  err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
++  err = current_pointers->td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid),
++                                             &th);
+   if (err != TD_OK)
+     error ("Cannot find user-level thread for LWP %ld: %s",
+          GET_LWP (ptid), thread_db_err_str (err));
+@@ -420,85 +432,102 @@ verbose_dlsym (void *handle, const char 
+   return sym;
+ }
+-static int
+-thread_db_load (void)
++static struct thread_db_pointers *
++thread_db_load (const char *name)
+ {
++  struct thread_db_pointers *ptrs;
++  Dl_info info;
+   void *handle;
+   td_err_e err;
+-  handle = dlopen (LIBTHREAD_DB_SO, RTLD_NOW);
++  ptrs = xcalloc (1, sizeof (struct thread_db_pointers));
++
++  handle = dlopen (name, RTLD_NOW);
+   if (handle == NULL)
+     {
+-      fprintf_filtered (gdb_stderr, "\n\ndlopen failed on '%s' - %s\n",
+-                      LIBTHREAD_DB_SO, dlerror ());
+-      fprintf_filtered (gdb_stderr,
+-                      "GDB will not be able to debug pthreads.\n\n");
++      if (all_pointers == NULL)
++      {
++        fprintf_filtered (gdb_stderr, "\n\ndlopen failed on '%s' - %s\n",
++                          name, dlerror ());
++        fprintf_filtered (gdb_stderr,
++                          "GDB will not be able to debug pthreads.\n\n");
++      }
+       return 0;
+     }
+   /* Initialize pointers to the dynamic library functions we will use.
+      Essential functions first.  */
+-  td_init_p = verbose_dlsym (handle, "td_init");
+-  if (td_init_p == NULL)
++  ptrs->td_init_p = verbose_dlsym (handle, "td_init");
++  if (ptrs->td_init_p == NULL)
+     return 0;
+-  td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
+-  if (td_ta_new_p == NULL)
++  ptrs->td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
++  if (ptrs->td_ta_new_p == NULL)
+     return 0;
+-  td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
+-  if (td_ta_map_id2thr_p == NULL)
++  ptrs->td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
++  if (ptrs->td_ta_map_id2thr_p == NULL)
+     return 0;
+-  td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
+-  if (td_ta_map_lwp2thr_p == NULL)
++  ptrs->td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
++  if (ptrs->td_ta_map_lwp2thr_p == NULL)
+     return 0;
+-  td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
+-  if (td_ta_thr_iter_p == NULL)
++  ptrs->td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
++  if (ptrs->td_ta_thr_iter_p == NULL)
+     return 0;
+-  td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
+-  if (td_thr_validate_p == NULL)
++  ptrs->td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
++  if (ptrs->td_thr_validate_p == NULL)
+     return 0;
+-  td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
+-  if (td_thr_get_info_p == NULL)
++  ptrs->td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
++  if (ptrs->td_thr_get_info_p == NULL)
+     return 0;
+-  td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
+-  if (td_thr_getfpregs_p == NULL)
++  ptrs->td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
++  if (ptrs->td_thr_getfpregs_p == NULL)
+     return 0;
+-  td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
+-  if (td_thr_getgregs_p == NULL)
++  ptrs->td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
++  if (ptrs->td_thr_getgregs_p == NULL)
+     return 0;
+-  td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
+-  if (td_thr_setfpregs_p == NULL)
++  ptrs->td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
++  if (ptrs->td_thr_setfpregs_p == NULL)
+     return 0;
+-  td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
+-  if (td_thr_setgregs_p == NULL)
++  ptrs->td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
++  if (ptrs->td_thr_setgregs_p == NULL)
+     return 0;
+   /* Initialize the library.  */
+-  err = td_init_p ();
++  err = ptrs->td_init_p ();
+   if (err != TD_OK)
+     {
+       warning ("Cannot initialize libthread_db: %s", thread_db_err_str (err));
++      xfree (ptrs);
+       return 0;
+     }
+   /* These are not essential.  */
+-  td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
+-  td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
+-  td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
+-  td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
+-  td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
++  ptrs->td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
++  ptrs->td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
++  ptrs->td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
++  ptrs->td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
++  ptrs->td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
++
++  if (dladdr (ptrs->td_ta_new_p, &info) != 0)
++    ptrs->filename = info.dli_fname;
++
++  /* Try dlinfo?  */
++
++  if (ptrs->filename == NULL)
++    /* Paranoid - don't let a NULL path slip through.  */
++    ptrs->filename = name;
+-  return 1;
++  return ptrs;
+ }
+ static td_err_e
+@@ -508,7 +537,7 @@ enable_thread_event (td_thragent_t *thre
+   td_err_e err;
+   /* Get the breakpoint address for thread EVENT.  */
+-  err = td_ta_event_addr_p (thread_agent, event, &notify);
++  err = current_pointers->td_ta_event_addr_p (thread_agent, event, &notify);
+   if (err != TD_OK)
+     return err;
+@@ -534,8 +563,10 @@ enable_thread_event_reporting (void)
+   /* We cannot use the thread event reporting facility if these
+      functions aren't available.  */
+-  if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL
+-      || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)
++  if (current_pointers->td_ta_event_addr_p == NULL
++      || current_pointers->td_ta_set_event_p == NULL
++      || current_pointers->td_ta_event_getmsg_p == NULL
++      || current_pointers->td_thr_event_enable_p == NULL)
+     return;
+   /* Set the process wide mask saying which events we're interested in.  */
+@@ -552,7 +583,7 @@ enable_thread_event_reporting (void)
+ #endif
+     td_event_addset (&events, TD_DEATH);
+-  err = td_ta_set_event_p (thread_agent, &events);
++  err = current_pointers->td_ta_set_event_p (thread_agent, &events);
+   if (err != TD_OK)
+     {
+       warning ("Unable to set global thread event mask: %s",
+@@ -592,7 +623,7 @@ disable_thread_event_reporting (void)
+   /* Set the process wide mask saying we aren't interested in any
+      events anymore.  */
+   td_event_emptyset (&events);
+-  td_ta_set_event_p (thread_agent, &events);
++  current_pointers->td_ta_set_event_p (thread_agent, &events);
+   /* Delete thread event breakpoints, if any.  */
+   remove_thread_event_breakpoints ();
+@@ -635,7 +666,6 @@ check_thread_signals (void)
+ static void
+ check_for_thread_db (void)
+ {
+-  td_err_e err;
+   static int already_loaded;
+   /* First time through, report that libthread_db was successfuly
+@@ -644,19 +674,8 @@ check_for_thread_db (void)
+   if (!already_loaded)
+     {
+-      Dl_info info;
+-      const char *library = NULL;
+-      if (dladdr ((*td_ta_new_p), &info) != 0)
+-      library = info.dli_fname;
+-
+-      /* Try dlinfo?  */
+-
+-      if (library == NULL)
+-      /* Paranoid - don't let a NULL path slip through.  */
+-      library = LIBTHREAD_DB_SO;
+-
+       printf_unfiltered ("Using host libthread_db library \"%s\".\n",
+-                       library);
++                       all_pointers->filename);
+       already_loaded = 1;
+     }
+@@ -674,28 +693,34 @@ check_for_thread_db (void)
+   proc_handle.pid = GET_PID (inferior_ptid);
+   /* Now attempt to open a connection to the thread library.  */
+-  err = td_ta_new_p (&proc_handle, &thread_agent);
+-  switch (err)
++  for (current_pointers = all_pointers;
++       current_pointers != NULL;
++       current_pointers = current_pointers->next)
+     {
+-    case TD_NOLIBTHREAD:
+-      /* No thread library was detected.  */
+-      break;
+-
+-    case TD_OK:
+-      printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");
++      td_err_e err;
++      err = current_pointers->td_ta_new_p (&proc_handle, &thread_agent);
++      switch (err)
++      {
++      case TD_NOLIBTHREAD:
++        /* No thread library was detected.  */
++        break;
+-      /* The thread library was detected.  Activate the thread_db target.  */
+-      push_target (&thread_db_ops);
+-      using_thread_db = 1;
++      case TD_OK:
++        printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");
+-      enable_thread_event_reporting ();
+-      thread_db_find_new_threads ();
+-      break;
++        /* The thread library was detected.  Activate the thread_db target.  */
++        push_target (&thread_db_ops);
++        using_thread_db = 1;
++
++        enable_thread_event_reporting ();
++        thread_db_find_new_threads ();
++        return;
+-    default:
+-      warning ("Cannot initialize thread debugging library: %s",
+-             thread_db_err_str (err));
+-      break;
++      default:
++        warning ("Cannot initialize thread debugging library: %s",
++                 thread_db_err_str (err));
++        break;
++      }
+     }
+ }
+@@ -766,7 +791,7 @@ attach_thread (ptid_t ptid, const td_thr
+ #endif
+   /* Enable thread event reporting for this thread.  */
+-  err = td_thr_event_enable_p (th_p, 1);
++  err = current_pointers->td_thr_event_enable_p (th_p, 1);
+   if (err != TD_OK)
+     error ("Cannot enable thread event reporting for %s: %s",
+          target_pid_to_str (ptid), thread_db_err_str (err));
+@@ -892,7 +917,7 @@ check_event (ptid_t ptid)
+   do
+     {
+-      err = td_ta_event_getmsg_p (thread_agent, &msg);
++      err = current_pointers->td_ta_event_getmsg_p (thread_agent, &msg);
+       if (err != TD_OK)
+       {
+         if (err == TD_NOMSG)
+@@ -902,7 +927,7 @@ check_event (ptid_t ptid)
+                thread_db_err_str (err));
+       }
+-      err = td_thr_get_info_p (msg.th_p, &ti);
++      err = current_pointers->td_thr_get_info_p (msg.th_p, &ti);
+       if (err != TD_OK)
+       error ("Cannot get thread info: %s", thread_db_err_str (err));
+@@ -1015,12 +1040,14 @@ thread_db_fetch_registers (int regno)
+   thread_info = find_thread_pid (inferior_ptid);
+   thread_db_map_id2thr (thread_info, 1);
+-  err = td_thr_getgregs_p (&thread_info->private->th, gregset);
++  err = current_pointers->td_thr_getgregs_p (&thread_info->private->th,
++                                           gregset);
+   if (err != TD_OK)
+     error ("Cannot fetch general-purpose registers for thread %ld: %s",
+          (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
+-  err = td_thr_getfpregs_p (&thread_info->private->th, &fpregset);
++  err = current_pointers->td_thr_getfpregs_p (&thread_info->private->th,
++                                            &fpregset);
+   if (err != TD_OK)
+     error ("Cannot get floating-point registers for thread %ld: %s",
+          (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
+@@ -1062,11 +1089,13 @@ thread_db_store_registers (int regno)
+   fill_gregset ((gdb_gregset_t *) gregset, -1);
+   fill_fpregset (&fpregset, -1);
+-  err = td_thr_setgregs_p (&thread_info->private->th, gregset);
++  err = current_pointers->td_thr_setgregs_p (&thread_info->private->th,
++                                           gregset);
+   if (err != TD_OK)
+     error ("Cannot store general-purpose registers for thread %ld: %s",
+          (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
+-  err = td_thr_setfpregs_p (&thread_info->private->th, &fpregset);
++  err = current_pointers->td_thr_setfpregs_p (&thread_info->private->th,
++                                            &fpregset);
+   if (err != TD_OK)
+     error ("Cannot store floating-point registers  for thread %ld: %s",
+          (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
+@@ -1136,15 +1165,14 @@ thread_db_thread_alive (ptid_t ptid)
+       if (!thread_info->private->th_valid)
+       return 0;
+-      err = td_thr_validate_p (&thread_info->private->th);
++      err = current_pointers->td_thr_validate_p (&thread_info->private->th);
+       if (err != TD_OK)
+       return 0;
+       if (!thread_info->private->ti_valid)
+       {
+-        err =
+-          td_thr_get_info_p (&thread_info->private->th,
+-                             &thread_info->private->ti);
++        err = current_pointers->td_thr_get_info_p
++          (&thread_info->private->th, &thread_info->private->ti);
+         if (err != TD_OK)
+           return 0;
+         thread_info->private->ti_valid = 1;
+@@ -1170,7 +1198,7 @@ find_new_threads_callback (const td_thrh
+   td_err_e err;
+   ptid_t ptid;
+-  err = td_thr_get_info_p (th_p, &ti);
++  err = current_pointers->td_thr_get_info_p (th_p, &ti);
+   if (err != TD_OK)
+     error ("find_new_threads_callback: cannot get thread info: %s",
+          thread_db_err_str (err));
+@@ -1192,9 +1220,10 @@ thread_db_find_new_threads (void)
+   td_err_e err;
+   /* Iterate over all user-space threads to discover new threads.  */
+-  err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
+-                        TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
+-                        TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
++  err = current_pointers->td_ta_thr_iter_p
++    (thread_agent, find_new_threads_callback, NULL,
++     TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
++     TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
+   if (err != TD_OK)
+     error ("Cannot find new threads: %s", thread_db_err_str (err));
+ }
+@@ -1257,7 +1286,7 @@ thread_db_get_thread_local_address (ptid
+       struct thread_info *thread_info;
+       /* glibc doesn't provide the needed interface.  */
+-      if (!td_thr_tls_get_addr_p)
++      if (!current_pointers->td_thr_tls_get_addr_p)
+       error ("Cannot find thread-local variables in this thread library.");
+       /* Get the address of the link map for this objfile.  */
+@@ -1279,8 +1308,8 @@ thread_db_get_thread_local_address (ptid
+       thread_db_map_id2thr (thread_info, 1);
+       /* Finally, get the address of the variable.  */
+-      err = td_thr_tls_get_addr_p (&thread_info->private->th, (void *) lm,
+-                                 offset, &address);
++      err = current_pointers->td_thr_tls_get_addr_p
++      (&thread_info->private->th, (void *) lm, offset, &address);
+ #ifdef THREAD_DB_HAS_TD_NOTALLOC
+       /* The memory hasn't been allocated, yet.  */
+@@ -1360,17 +1389,49 @@ init_thread_db_ops (void)
+ void
+ _initialize_thread_db (void)
+ {
++  struct thread_db_pointers *ptrs;
++  const char *p;
++
+   /* Only initialize the module if we can load libthread_db.  */
+-  if (thread_db_load ())
+-    {
+-      init_thread_db_ops ();
+-      add_target (&thread_db_ops);
++  ptrs = thread_db_load (LIBTHREAD_DB_SO);
++  if (ptrs == NULL)
++    return;
++
++  all_pointers = ptrs;
+-      /* Add ourselves to objfile event chain.  */
+-      target_new_objfile_chain = deprecated_target_new_objfile_hook;
+-      deprecated_target_new_objfile_hook = thread_db_new_objfile;
++  /* Some GNU/Linux systems have more than one binary-compatible copy
++     of libthread_db.  If we can find a second one, load that too.
++     The inferior may force the use of a different threading package
++     than we expect.  Our guess for the location is somewhat hokey:
++     strip out anything between /lib (or /lib64) and LIBTHREAD_DB_SO.
++     If we loaded the NPTL libthread_db by default, this may find us
++     the LinuxThreads copy.  */
++  p = strrchr (ptrs->filename, '/');
++  while (p != NULL && p > ptrs->filename)
++    {
++      const char *component;
+-      /* Register ourselves for the new inferior observer.  */
+-      observer_attach_inferior_created (check_for_thread_db_observer);
++      component = memrchr (ptrs->filename, '/', p - ptrs->filename);
++      if (component != NULL && strncmp (component, "/lib", 4) == 0)
++      {
++        char *new_name = xmalloc (p - ptrs->filename + 2
++                                  + strlen (LIBTHREAD_DB_SO));
++        memcpy (new_name, ptrs->filename, p - ptrs->filename + 1);
++        strcpy (new_name + (p - ptrs->filename) + 1, LIBTHREAD_DB_SO);
++        ptrs->next = thread_db_load (new_name);
++        xfree (new_name);
++        break;
++      }
++      p = component;
+     }
++
++  init_thread_db_ops ();
++  add_target (&thread_db_ops);
++
++  /* Add ourselves to objfile event chain.  */
++  target_new_objfile_chain = deprecated_target_new_objfile_hook;
++  deprecated_target_new_objfile_hook = thread_db_new_objfile;
++
++  /* Register ourselves for the new inferior observer.  */
++  observer_attach_inferior_created (check_for_thread_db_observer);
+ }
diff --git a/openwrt/toolchain/gdb/patches/720-debian_static-threads-test.patch b/openwrt/toolchain/gdb/patches/720-debian_static-threads-test.patch
new file mode 100644 (file)
index 0000000..448c9b1
--- /dev/null
@@ -0,0 +1,36 @@
+Update staticthreads.exp to handle debugging info in libpthread.a.
+
+Index: gdb-6.3/gdb/testsuite/gdb.threads/staticthreads.exp
+===================================================================
+--- gdb-6.3.orig/gdb/testsuite/gdb.threads/staticthreads.exp   2004-11-10 10:35:15.000000000 -0500
++++ gdb-6.3/gdb/testsuite/gdb.threads/staticthreads.exp        2004-11-10 11:22:48.671121466 -0500
+@@ -53,6 +53,10 @@ gdb_test_multiple "continue" "$test" {
+     -re " sem_post .*$gdb_prompt " {
+       pass "$test"
+     }
++    -re " (.*_)sem_post .*$gdb_prompt " {
++      # Glibc uses aliases for internal symbols; match __new_sem_post.
++      pass "$test"
++    }
+     -re "Program received signal .*$gdb_prompt " {
+       kfail gdb/1328 "$test"
+     }
+@@ -64,8 +68,16 @@ gdb_test_multiple "continue" "$test" {
+ rerun_to_main
+ gdb_test "handle SIG32 nostop noprint pass"
+-set test "Handle SIG32 helps"
+-gdb_test "continue" " sem_post .*" "handle SIG32 helps"
++set test "handle SIG32 helps"
++gdb_test_multiple "continue" "$test" {
++    -re " sem_post .*$gdb_prompt $" {
++      pass "$test"
++    }
++    -re " (.*_)sem_post .*$gdb_prompt $" {
++      # Glibc uses aliases for internal symbols; match __new_sem_post.
++      pass "$test"
++    }
++}
+ # See if info threads produces anything approaching a thread list.
diff --git a/openwrt/toolchain/gdb/patches/730-debian_gdb-fix-tracefork-check.patch b/openwrt/toolchain/gdb/patches/730-debian_gdb-fix-tracefork-check.patch
new file mode 100644 (file)
index 0000000..9890d80
--- /dev/null
@@ -0,0 +1,225 @@
+Status: submitted for comments
+
+2004-11-12  Daniel Jacobowitz  <dan@debian.org>
+
+       * linux-nat.c (my_waitpid): New function.
+       (linux_test_for_tracefork): Make more robust and verbose.  Take
+       an ORIGINAL_PID argument and test for PTRACE_SETOPTIONS first.
+       (linux_supports_tracefork, linux_supports_tracevforkdone): Take a PID
+       argument.  Update calls to linux_test_for_tracefork.
+       (linux_enable_event_reporting, child_follow_fork)
+       (child_insert_fork_catchpoint, child_insert_vfork_catchpoint)
+       (child_insert_exec_catchpoint): Update calls to
+       linux_supports_tracefork and linux_supports_tracevforkdone.
+
+Index: gdb-6.3/gdb/linux-nat.c
+===================================================================
+--- gdb-6.3.orig/gdb/linux-nat.c       2004-10-08 16:29:47.000000000 -0400
++++ gdb-6.3/gdb/linux-nat.c    2004-11-13 16:41:51.368720845 -0500
+@@ -150,18 +150,47 @@ linux_tracefork_child (void)
+   exit (0);
+ }
+-/* Determine if PTRACE_O_TRACEFORK can be used to follow fork events.  We
++/* Wrapper function for waitpid which handles EINTR.  */
++
++static int
++my_waitpid (int pid, int *status, int flags)
++{
++  int ret;
++  do
++    {
++      ret = waitpid (pid, status, flags);
++    }
++  while (ret == -1 && errno == EINTR);
++
++  return ret;
++}
++
++/* Determine if PTRACE_O_TRACEFORK can be used to follow fork events.
++
++   First, we try to enable fork tracing on ORIGINAL_PID.  If this fails,
++   we know that the feature is not available.  This may change the tracing
++   options for ORIGINAL_PID, but we'll be setting them shortly anyway.
++
++   However, if it succeeds, we don't know for sure that the feature is
++   available; old versions of PTRACE_SETOPTIONS ignored unknown options.  We
+    create a child process, attach to it, use PTRACE_SETOPTIONS to enable
+-   fork tracing, and let it fork.  If the process exits, we assume that
+-   we can't use TRACEFORK; if we get the fork notification, and we can
+-   extract the new child's PID, then we assume that we can.  */
++   fork tracing, and let it fork.  If the process exits, we assume that we
++   can't use TRACEFORK; if we get the fork notification, and we can extract
++   the new child's PID, then we assume that we can.  */
+ static void
+-linux_test_for_tracefork (void)
++linux_test_for_tracefork (int original_pid)
+ {
+   int child_pid, ret, status;
+   long second_pid;
++  linux_supports_tracefork_flag = 0;
++  linux_supports_tracevforkdone_flag = 0;
++
++  ret = ptrace (PTRACE_SETOPTIONS, original_pid, 0, PTRACE_O_TRACEFORK);
++  if (ret != 0)
++    return;
++
+   child_pid = fork ();
+   if (child_pid == -1)
+     perror_with_name ("linux_test_for_tracefork: fork");
+@@ -169,7 +198,7 @@ linux_test_for_tracefork (void)
+   if (child_pid == 0)
+     linux_tracefork_child ();
+-  ret = waitpid (child_pid, &status, 0);
++  ret = my_waitpid (child_pid, &status, 0);
+   if (ret == -1)
+     perror_with_name ("linux_test_for_tracefork: waitpid");
+   else if (ret != child_pid)
+@@ -177,13 +206,23 @@ linux_test_for_tracefork (void)
+   if (! WIFSTOPPED (status))
+     error ("linux_test_for_tracefork: waitpid: unexpected status %d.", status);
+-  linux_supports_tracefork_flag = 0;
+-
+   ret = ptrace (PTRACE_SETOPTIONS, child_pid, 0, PTRACE_O_TRACEFORK);
+   if (ret != 0)
+     {
+-      ptrace (PTRACE_KILL, child_pid, 0, 0);
+-      waitpid (child_pid, &status, 0);
++      ret = ptrace (PTRACE_KILL, child_pid, 0, 0);
++      if (ret != 0)
++      {
++        warning ("linux_test_for_tracefork: failed to kill child");
++        return;
++      }
++
++      ret = my_waitpid (child_pid, &status, 0);
++      if (ret != child_pid)
++      warning ("linux_test_for_tracefork: failed to wait for killed child");
++      else if (!WIFSIGNALED (status))
++      warning ("linux_test_for_tracefork: unexpected wait status 0x%x from "
++               "killed child", status);
++
+       return;
+     }
+@@ -192,8 +231,12 @@ linux_test_for_tracefork (void)
+               PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORKDONE);
+   linux_supports_tracevforkdone_flag = (ret == 0);
+-  ptrace (PTRACE_CONT, child_pid, 0, 0);
+-  ret = waitpid (child_pid, &status, 0);
++  ret = ptrace (PTRACE_CONT, child_pid, 0, 0);
++  if (ret != 0)
++    warning ("linux_test_for_tracefork: failed to resume child");
++
++  ret = my_waitpid (child_pid, &status, 0);
++
+   if (ret == child_pid && WIFSTOPPED (status)
+       && status >> 16 == PTRACE_EVENT_FORK)
+     {
+@@ -204,34 +247,38 @@ linux_test_for_tracefork (void)
+         int second_status;
+         linux_supports_tracefork_flag = 1;
+-        waitpid (second_pid, &second_status, 0);
+-        ptrace (PTRACE_DETACH, second_pid, 0, 0);
++        my_waitpid (second_pid, &second_status, 0);
++        ret = ptrace (PTRACE_KILL, second_pid, 0, 0);
++        if (ret != 0)
++          warning ("linux_test_for_tracefork: failed to kill second child");
+       }
+     }
++  else
++    warning ("linux_test_for_tracefork: unexpected result from waitpid "
++           "(%d, status 0x%x)", ret, status);
+-  if (WIFSTOPPED (status))
+-    {
+-      ptrace (PTRACE_DETACH, child_pid, 0, 0);
+-      waitpid (child_pid, &status, 0);
+-    }
++  ret = ptrace (PTRACE_KILL, child_pid, 0, 0);
++  if (ret != 0)
++    warning ("linux_test_for_tracefork: failed to kill child");
++  my_waitpid (child_pid, &status, 0);
+ }
+ /* Return non-zero iff we have tracefork functionality available.
+    This function also sets linux_supports_tracefork_flag.  */
+ static int
+-linux_supports_tracefork (void)
++linux_supports_tracefork (int pid)
+ {
+   if (linux_supports_tracefork_flag == -1)
+-    linux_test_for_tracefork ();
++    linux_test_for_tracefork (pid);
+   return linux_supports_tracefork_flag;
+ }
+ static int
+-linux_supports_tracevforkdone (void)
++linux_supports_tracevforkdone (int pid)
+ {
+   if (linux_supports_tracefork_flag == -1)
+-    linux_test_for_tracefork ();
++    linux_test_for_tracefork (pid);
+   return linux_supports_tracevforkdone_flag;
+ }
+@@ -242,12 +289,12 @@ linux_enable_event_reporting (ptid_t pti
+   int pid = ptid_get_pid (ptid);
+   int options;
+-  if (! linux_supports_tracefork ())
++  if (! linux_supports_tracefork (pid))
+     return;
+   options = PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEEXEC
+     | PTRACE_O_TRACECLONE;
+-  if (linux_supports_tracevforkdone ())
++  if (linux_supports_tracevforkdone (pid))
+     options |= PTRACE_O_TRACEVFORKDONE;
+   /* Do not enable PTRACE_O_TRACEEXIT until GDB is more prepared to support
+@@ -308,7 +355,8 @@ child_follow_fork (int follow_child)
+       if (has_vforked)
+       {
+-        if (linux_supports_tracevforkdone ())
++        gdb_assert (linux_supports_tracefork_flag >= 0);
++        if (linux_supports_tracevforkdone (0))
+           {
+             int status;
+@@ -476,7 +524,7 @@ linux_handle_extended_wait (int pid, int
+ int
+ child_insert_fork_catchpoint (int pid)
+ {
+-  if (! linux_supports_tracefork ())
++  if (! linux_supports_tracefork (pid))
+     error ("Your system does not support fork catchpoints.");
+   return 0;
+@@ -485,7 +533,7 @@ child_insert_fork_catchpoint (int pid)
+ int
+ child_insert_vfork_catchpoint (int pid)
+ {
+-  if (!linux_supports_tracefork ())
++  if (!linux_supports_tracefork (pid))
+     error ("Your system does not support vfork catchpoints.");
+   return 0;
+@@ -494,7 +542,7 @@ child_insert_vfork_catchpoint (int pid)
+ int
+ child_insert_exec_catchpoint (int pid)
+ {
+-  if (!linux_supports_tracefork ())
++  if (!linux_supports_tracefork (pid))
+     error ("Your system does not support exec catchpoints.");
+   return 0;
diff --git a/openwrt/toolchain/gdb/patches/740-debian_make-cv-type-crash.patch b/openwrt/toolchain/gdb/patches/740-debian_make-cv-type-crash.patch
new file mode 100644 (file)
index 0000000..4e0b8cd
--- /dev/null
@@ -0,0 +1,132 @@
+2004-11-04  Jim Blandy  <jimb@redhat.com>
+
+       * gdbtypes.c (make_qualified_type): Doc fix.  Add assertion to
+       prevent cross-objfile references.
+       (make_cv_type): Doc fix.  Don't create cross-objfile references,
+       even for stub types.
+       (replace_type): Add assertion to prevent cross-objfile references.
+       (check_typedef): Never resolve a stub type by copying over a type
+       from another file.
+
+Index: src/gdb/gdbtypes.c
+===================================================================
+RCS file: /big/fsf/rsync/src-cvs/src/gdb/gdbtypes.c,v
+retrieving revision 1.92
+retrieving revision 1.93
+diff -u -p -r1.92 -r1.93
+--- src/gdb/gdbtypes.c 8 Aug 2004 17:18:16 -0000       1.92
++++ src/gdb/gdbtypes.c 4 Nov 2004 17:50:16 -0000       1.93
+@@ -433,7 +433,9 @@ address_space_int_to_name (int space_fla
+ }
+ /* Create a new type with instance flags NEW_FLAGS, based on TYPE.
+-   If STORAGE is non-NULL, create the new type instance there.  */
++
++   If STORAGE is non-NULL, create the new type instance there.
++   STORAGE must be in the same obstack as TYPE.  */
+ static struct type *
+ make_qualified_type (struct type *type, int new_flags,
+@@ -453,6 +455,12 @@ make_qualified_type (struct type *type, 
+     ntype = alloc_type_instance (type);
+   else
+     {
++      /* If STORAGE was provided, it had better be in the same objfile as
++       TYPE.  Otherwise, we can't link it into TYPE's cv chain: if one
++       objfile is freed and the other kept, we'd have dangling
++       pointers.  */
++      gdb_assert (TYPE_OBJFILE (type) == TYPE_OBJFILE (storage));
++
+       ntype = storage;
+       TYPE_MAIN_TYPE (ntype) = TYPE_MAIN_TYPE (type);
+       TYPE_CHAIN (ntype) = ntype;
+@@ -501,11 +509,12 @@ make_type_with_address_space (struct typ
+    CNST is a flag for setting the const attribute
+    VOLTL is a flag for setting the volatile attribute
+    TYPE is the base type whose variant we are creating.
+-   TYPEPTR, if nonzero, points
+-   to a pointer to memory where the reference type should be stored.
+-   If *TYPEPTR is zero, update it to point to the reference type we return.
+-   We allocate new memory if needed.  */
++   If TYPEPTR and *TYPEPTR are non-zero, then *TYPEPTR points to
++   storage to hold the new qualified type; *TYPEPTR and TYPE must be
++   in the same objfile.  Otherwise, allocate fresh memory for the new
++   type whereever TYPE lives.  If TYPEPTR is non-zero, set it to the
++   new type we construct.  */
+ struct type *
+ make_cv_type (int cnst, int voltl, struct type *type, struct type **typeptr)
+ {
+@@ -524,20 +533,19 @@ make_cv_type (int cnst, int voltl, struc
+   if (typeptr && *typeptr != NULL)
+     {
+-      /* Objfile is per-core-type.  This const-qualified type had best
+-       belong to the same objfile as the type it is qualifying, unless
+-       we are overwriting a stub type, in which case the safest thing
+-       to do is to copy the core type into the new objfile.  */
+-
+-      gdb_assert (TYPE_OBJFILE (*typeptr) == TYPE_OBJFILE (type)
+-                || TYPE_STUB (*typeptr));
+-      if (TYPE_OBJFILE (*typeptr) != TYPE_OBJFILE (type))
+-      {
+-        TYPE_MAIN_TYPE (*typeptr)
+-          = TYPE_ALLOC (*typeptr, sizeof (struct main_type));
+-        *TYPE_MAIN_TYPE (*typeptr)
+-          = *TYPE_MAIN_TYPE (type);
+-      }
++      /* TYPE and *TYPEPTR must be in the same objfile.  We can't have
++       a C-V variant chain that threads across objfiles: if one
++       objfile gets freed, then the other has a broken C-V chain.
++
++       This code used to try to copy over the main type from TYPE to
++       *TYPEPTR if they were in different objfiles, but that's
++       wrong, too: TYPE may have a field list or member function
++       lists, which refer to types of their own, etc. etc.  The
++       whole shebang would need to be copied over recursively; you
++       can't have inter-objfile pointers.  The only thing to do is
++       to leave stub types as stub types, and look them up afresh by
++       name each time you encounter them.  */
++      gdb_assert (TYPE_OBJFILE (*typeptr) == TYPE_OBJFILE (type));
+     }
+   
+   ntype = make_qualified_type (type, new_flags, typeptr ? *typeptr : NULL);
+@@ -562,6 +570,12 @@ replace_type (struct type *ntype, struct
+ {
+   struct type *chain;
++  /* These two types had better be in the same objfile.  Otherwise,
++     the assignment of one type's main type structure to the other
++     will produce a type with references to objects (names; field
++     lists; etc.) allocated on an objfile other than its own.  */
++  gdb_assert (TYPE_OBJFILE (ntype) == TYPE_OBJFILE (ntype));
++
+   *TYPE_MAIN_TYPE (ntype) = *TYPE_MAIN_TYPE (type);
+   /* The type length is not a part of the main type.  Update it for each
+@@ -1416,8 +1430,24 @@ check_typedef (struct type *type)
+         return type;
+       }
+       newtype = lookup_transparent_type (name);
++
+       if (newtype)
+-      make_cv_type (is_const, is_volatile, newtype, &type);
++      {
++        /* If the resolved type and the stub are in the same objfile,
++           then replace the stub type with the real deal.  But if
++           they're in separate objfiles, leave the stub alone; we'll
++           just look up the transparent type every time we call
++           check_typedef.  We can't create pointers between types
++           allocated to different objfiles, since they may have
++           different lifetimes.  Trying to copy NEWTYPE over to TYPE's
++           objfile is pointless, too, since you'll have to move over any
++           other types NEWTYPE refers to, which could be an unbounded
++           amount of stuff.  */
++        if (TYPE_OBJFILE (newtype) == TYPE_OBJFILE (type))
++          make_cv_type (is_const, is_volatile, newtype, &type);
++        else
++          type = newtype;
++      }
+     }
+   /* Otherwise, rely on the stub flag being set for opaque/stubbed types */
+   else if (TYPE_STUB (type) && !currently_reading_symtab)
diff --git a/openwrt/toolchain/gdb/patches/750-debian_sparc-singlestep.patch b/openwrt/toolchain/gdb/patches/750-debian_sparc-singlestep.patch
new file mode 100644 (file)
index 0000000..904883c
--- /dev/null
@@ -0,0 +1,37 @@
+Status: submitted for comments
+
+2004-11-13  Daniel Jacobowitz  <dan@debian.org>
+
+       * sparc-tdep.c (sparc_software_single_step): Handle stepping to NULL.
+
+Index: gdb-6.3/gdb/sparc-tdep.c
+===================================================================
+--- gdb-6.3.orig/gdb/sparc-tdep.c      2004-06-06 22:02:55.000000000 -0400
++++ gdb-6.3/gdb/sparc-tdep.c   2004-11-13 17:06:05.000000000 -0500
+@@ -1026,10 +1026,10 @@
+   if (insert_breakpoints_p)
+     {
+-      CORE_ADDR pc;
++      CORE_ADDR pc, orig_npc;
+       pc = sparc_address_from_register (tdep->pc_regnum);
+-      npc = sparc_address_from_register (tdep->npc_regnum);
++      orig_npc = npc = sparc_address_from_register (tdep->npc_regnum);
+       /* Analyze the instruction at PC.  */
+       nnpc = sparc_analyze_control_transfer (pc, &npc);
+@@ -1039,9 +1039,10 @@
+       target_insert_breakpoint (nnpc, nnpc_save);
+       /* Assert that we have set at least one breakpoint, and that
+-         they're not set at the same spot.  */
+-      gdb_assert (npc != 0 || nnpc != 0);
+-      gdb_assert (nnpc != npc);
++         they're not set at the same spot - unless we're going
++       from here straight to NULL, i.e. a call or jump to 0.  */
++      gdb_assert (npc != 0 || nnpc != 0 || orig_npc == 0);
++      gdb_assert (nnpc != npc || orig_npc == 0);
+     }
+   else
+     {
diff --git a/openwrt/toolchain/gdb/patches/760-debian_vsyscall-bfd-close-result.patch b/openwrt/toolchain/gdb/patches/760-debian_vsyscall-bfd-close-result.patch
new file mode 100644 (file)
index 0000000..56002be
--- /dev/null
@@ -0,0 +1,20 @@
+2004-10-24  Daniel Jacobowitz  <dan@debian.org>
+
+       * opncls.c (bfd_close): Return TRUE for BFD_IN_MEMORY.
+
+Index: src/bfd/opncls.c
+===================================================================
+RCS file: /big/fsf/rsync/src-cvs/src/bfd/opncls.c,v
+retrieving revision 1.25
+diff -u -p -r1.25 opncls.c
+--- src/bfd/opncls.c   10 Oct 2004 13:58:05 -0000      1.25
++++ src/bfd/opncls.c   24 Oct 2004 17:52:53 -0000
+@@ -598,7 +598,7 @@ bfd_close (bfd *abfd)
+   if (!(abfd->flags & BFD_IN_MEMORY))
+     ret = abfd->iovec->bclose (abfd);
+   else
+-    ret = 0;
++    ret = TRUE;
+   /* If the file was open for writing and is now executable,
+      make it so.  */
diff --git a/openwrt/toolchain/gdb/patches/770-debian_vfork-done-spelling.patch b/openwrt/toolchain/gdb/patches/770-debian_vfork-done-spelling.patch
new file mode 100644 (file)
index 0000000..f65db8d
--- /dev/null
@@ -0,0 +1,31 @@
+Index: gdb-6.3/gdb/linux-nat.c
+===================================================================
+--- gdb-6.3.orig/gdb/linux-nat.c       2004-11-14 00:36:41.000000000 -0500
++++ gdb-6.3/gdb/linux-nat.c    2004-11-15 11:51:43.954161476 -0500
+@@ -69,7 +69,7 @@
+ #define PTRACE_EVENT_VFORK    2
+ #define PTRACE_EVENT_CLONE    3
+ #define PTRACE_EVENT_EXEC     4
+-#define PTRACE_EVENT_VFORKDONE        5
++#define PTRACE_EVENT_VFORK_DONE       5
+ #define PTRACE_EVENT_EXIT     6
+ #endif /* PTRACE_EVENT_FORK */
+@@ -362,7 +362,7 @@ child_follow_fork (int follow_child)
+             ptrace (PTRACE_CONT, parent_pid, 0, 0);
+             waitpid (parent_pid, &status, __WALL);
+-            if ((status >> 16) != PTRACE_EVENT_VFORKDONE)
++            if ((status >> 16) != PTRACE_EVENT_VFORK_DONE)
+               warning ("Unexpected waitpid result %06x when waiting for "
+                        "vfork-done", status);
+           }
+@@ -434,7 +434,7 @@ child_follow_fork (int follow_child)
+        generally not encounter vfork (vfork is defined to fork
+        in libpthread.so).
+-       The holding part is very easy if we have VFORKDONE events;
++       The holding part is very easy if we have VFORK_DONE events;
+        but keeping track of both processes is beyond GDB at the
+        moment.  So we don't expose the parent to the rest of GDB.
+        Instead we quietly hold onto it until such time as we can
diff --git a/openwrt/toolchain/gdb/patches/780-debian_gdbserver-rdynamic.patch b/openwrt/toolchain/gdb/patches/780-debian_gdbserver-rdynamic.patch
new file mode 100644 (file)
index 0000000..0311dde
--- /dev/null
@@ -0,0 +1,675 @@
+Status: Commited to GDB after 6.3.
+
+Index: gdb-6.3/gdb/gdbserver/acinclude.m4
+===================================================================
+--- gdb-6.3.orig/gdb/gdbserver/acinclude.m4    2002-06-11 13:32:39.000000000 -0400
++++ gdb-6.3/gdb/gdbserver/acinclude.m4 2004-12-07 17:19:31.115089905 -0500
+@@ -13,6 +13,7 @@ AC_DEFUN([SRV_CHECK_THREAD_DB],
+    void ps_lsetregs() {}
+    void ps_lgetfpregs() {}
+    void ps_lsetfpregs() {}
++   void ps_get_thread_area() {}
+    void ps_getpid() {}],
+   [td_ta_new();],
+   [srv_cv_thread_db="-lthread_db"],
+@@ -32,10 +33,11 @@ AC_DEFUN([SRV_CHECK_THREAD_DB],
+    void ps_lsetregs() {}
+    void ps_lgetfpregs() {}
+    void ps_lsetfpregs() {}
++   void ps_get_thread_area() {}
+    void ps_getpid() {}],
+   [td_ta_new();],
+   [srv_cv_thread_db="$thread_db"],
+   [srv_cv_thread_db=no])
++  ]])
+  LIBS="$old_LIBS"
+- ]])
+ )])
+Index: gdb-6.3/gdb/gdbserver/configure
+===================================================================
+--- gdb-6.3.orig/gdb/gdbserver/configure       2004-10-16 12:18:54.000000000 -0400
++++ gdb-6.3/gdb/gdbserver/configure    2004-12-07 17:22:17.343129771 -0500
+@@ -28,6 +28,7 @@ program_suffix=NONE
+ program_transform_name=s,x,x,
+ silent=
+ site=
++sitefile=
+ srcdir=
+ target=NONE
+ verbose=
+@@ -142,6 +143,7 @@ Configuration:
+   --help                  print this message
+   --no-create             do not create output files
+   --quiet, --silent       do not print \`checking...' messages
++  --site-file=FILE        use FILE as the site file
+   --version               print the version of autoconf that created configure
+ Directory and file names:
+   --prefix=PREFIX         install architecture-independent files in PREFIX
+@@ -312,6 +314,11 @@ EOF
+   -site=* | --site=* | --sit=*)
+     site="$ac_optarg" ;;
++  -site-file | --site-file | --site-fil | --site-fi | --site-f)
++    ac_prev=sitefile ;;
++  -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
++    sitefile="$ac_optarg" ;;
++
+   -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+     ac_prev=srcdir ;;
+   -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+@@ -477,12 +484,16 @@ fi
+ srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+ # Prefer explicitly selected file to automatically selected ones.
+-if test -z "$CONFIG_SITE"; then
+-  if test "x$prefix" != xNONE; then
+-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+-  else
+-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
++if test -z "$sitefile"; then
++  if test -z "$CONFIG_SITE"; then
++    if test "x$prefix" != xNONE; then
++      CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
++    else
++      CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
++    fi
+   fi
++else
++  CONFIG_SITE="$sitefile"
+ fi
+ for ac_site_file in $CONFIG_SITE; do
+   if test -r "$ac_site_file"; then
+@@ -526,7 +537,7 @@ fi
+ # Extract the first word of "gcc", so it can be a program name with args.
+ set dummy gcc; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:530: checking for $ac_word" >&5
++echo "configure:541: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -556,7 +567,7 @@ if test -z "$CC"; then
+   # Extract the first word of "cc", so it can be a program name with args.
+ set dummy cc; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:560: checking for $ac_word" >&5
++echo "configure:571: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -607,7 +618,7 @@ fi
+       # Extract the first word of "cl", so it can be a program name with args.
+ set dummy cl; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:611: checking for $ac_word" >&5
++echo "configure:622: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -639,7 +650,7 @@ fi
+ fi
+ echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+-echo "configure:643: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
++echo "configure:654: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+ ac_ext=c
+ # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+@@ -650,12 +661,12 @@ cross_compiling=$ac_cv_prog_cc_cross
+ cat > conftest.$ac_ext << EOF
+-#line 654 "configure"
++#line 665 "configure"
+ #include "confdefs.h"
+ main(){return(0);}
+ EOF
+-if { (eval echo configure:659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   ac_cv_prog_cc_works=yes
+   # If we can't run a trivial program, we are probably using a cross compiler.
+   if (./conftest; exit) 2>/dev/null; then
+@@ -681,12 +692,12 @@ if test $ac_cv_prog_cc_works = no; then
+   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+-echo "configure:685: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
++echo "configure:696: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+ echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+ cross_compiling=$ac_cv_prog_cc_cross
+ echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+-echo "configure:690: checking whether we are using GNU C" >&5
++echo "configure:701: checking whether we are using GNU C" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -695,7 +706,7 @@ else
+   yes;
+ #endif
+ EOF
+-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:699: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:710: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+   ac_cv_prog_gcc=yes
+ else
+   ac_cv_prog_gcc=no
+@@ -714,7 +725,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+-echo "configure:718: checking whether ${CC-cc} accepts -g" >&5
++echo "configure:729: checking whether ${CC-cc} accepts -g" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -793,7 +804,7 @@ else { echo "configure: error: can not r
+ fi
+ echo $ac_n "checking host system type""... $ac_c" 1>&6
+-echo "configure:797: checking host system type" >&5
++echo "configure:808: checking host system type" >&5
+ host_alias=$host
+ case "$host_alias" in
+@@ -814,7 +825,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-
+ echo "$ac_t""$host" 1>&6
+ echo $ac_n "checking target system type""... $ac_c" 1>&6
+-echo "configure:818: checking target system type" >&5
++echo "configure:829: checking target system type" >&5
+ target_alias=$target
+ case "$target_alias" in
+@@ -832,7 +843,7 @@ target_os=`echo $target | sed 's/^\([^-]
+ echo "$ac_t""$target" 1>&6
+ echo $ac_n "checking build system type""... $ac_c" 1>&6
+-echo "configure:836: checking build system type" >&5
++echo "configure:847: checking build system type" >&5
+ build_alias=$build
+ case "$build_alias" in
+@@ -867,7 +878,7 @@ test "$host_alias" != "$target_alias" &&
+ # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+ # ./install, which can be erroneously created by make from ./install.sh.
+ echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+-echo "configure:871: checking for a BSD compatible install" >&5
++echo "configure:882: checking for a BSD compatible install" >&5
+ if test -z "$INSTALL"; then
+ if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+@@ -921,7 +932,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA=
+ echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+-echo "configure:925: checking how to run the C preprocessor" >&5
++echo "configure:936: checking how to run the C preprocessor" >&5
+ # On Suns, sometimes $CPP names a directory.
+ if test -n "$CPP" && test -d "$CPP"; then
+   CPP=
+@@ -936,13 +947,13 @@ else
+   # On the NeXT, cc -E runs the code through the compiler's parser,
+   # not just through cpp.
+   cat > conftest.$ac_ext <<EOF
+-#line 940 "configure"
++#line 951 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:946: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   :
+@@ -953,13 +964,13 @@ else
+   rm -rf conftest*
+   CPP="${CC-cc} -E -traditional-cpp"
+   cat > conftest.$ac_ext <<EOF
+-#line 957 "configure"
++#line 968 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:963: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:974: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   :
+@@ -970,13 +981,13 @@ else
+   rm -rf conftest*
+   CPP="${CC-cc} -nologo -E"
+   cat > conftest.$ac_ext <<EOF
+-#line 974 "configure"
++#line 985 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:980: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:991: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   :
+@@ -1001,12 +1012,12 @@ fi
+ echo "$ac_t""$CPP" 1>&6
+ echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+-echo "configure:1005: checking for ANSI C header files" >&5
++echo "configure:1016: checking for ANSI C header files" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1010 "configure"
++#line 1021 "configure"
+ #include "confdefs.h"
+ #include <stdlib.h>
+ #include <stdarg.h>
+@@ -1014,7 +1025,7 @@ else
+ #include <float.h>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:1018: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:1029: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+@@ -1031,7 +1042,7 @@ rm -f conftest*
+ if test $ac_cv_header_stdc = yes; then
+   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat > conftest.$ac_ext <<EOF
+-#line 1035 "configure"
++#line 1046 "configure"
+ #include "confdefs.h"
+ #include <string.h>
+ EOF
+@@ -1049,7 +1060,7 @@ fi
+ if test $ac_cv_header_stdc = yes; then
+   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat > conftest.$ac_ext <<EOF
+-#line 1053 "configure"
++#line 1064 "configure"
+ #include "confdefs.h"
+ #include <stdlib.h>
+ EOF
+@@ -1070,7 +1081,7 @@ if test "$cross_compiling" = yes; then
+   :
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1074 "configure"
++#line 1085 "configure"
+ #include "confdefs.h"
+ #include <ctype.h>
+ #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+@@ -1081,7 +1092,7 @@ if (XOR (islower (i), ISLOWER (i)) || to
+ exit (0); }
+ EOF
+-if { (eval echo configure:1085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:1096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   :
+ else
+@@ -1109,17 +1120,17 @@ for ac_hdr in sgtty.h termio.h termios.h
+ do
+ ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+ echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+-echo "configure:1113: checking for $ac_hdr" >&5
++echo "configure:1124: checking for $ac_hdr" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1118 "configure"
++#line 1129 "configure"
+ #include "confdefs.h"
+ #include <$ac_hdr>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:1123: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:1134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+@@ -1147,12 +1158,12 @@ done
+ echo $ac_n "checking whether strerror must be declared""... $ac_c" 1>&6
+-echo "configure:1151: checking whether strerror must be declared" >&5
++echo "configure:1162: checking whether strerror must be declared" >&5
+ if eval "test \"`echo '$''{'bfd_cv_decl_needed_strerror'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1156 "configure"
++#line 1167 "configure"
+ #include "confdefs.h"
+ #include <stdio.h>
+@@ -1173,7 +1184,7 @@ int main() {
+ char *(*pfn) = (char *(*)) strerror
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1177: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1188: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   bfd_cv_decl_needed_strerror=no
+ else
+@@ -1205,19 +1216,19 @@ fi
+ if test "${srv_linux_regsets}" = "yes"; then
+   echo $ac_n "checking for PTRACE_GETREGS""... $ac_c" 1>&6
+-echo "configure:1209: checking for PTRACE_GETREGS" >&5
++echo "configure:1220: checking for PTRACE_GETREGS" >&5
+   if eval "test \"`echo '$''{'gdbsrv_cv_have_ptrace_getregs'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1214 "configure"
++#line 1225 "configure"
+ #include "confdefs.h"
+ #include <sys/ptrace.h>
+ int main() {
+ PTRACE_GETREGS;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   gdbsrv_cv_have_ptrace_getregs=yes
+ else
+@@ -1238,19 +1249,19 @@ EOF
+   fi
+   echo $ac_n "checking for PTRACE_GETFPXREGS""... $ac_c" 1>&6
+-echo "configure:1242: checking for PTRACE_GETFPXREGS" >&5
++echo "configure:1253: checking for PTRACE_GETFPXREGS" >&5
+   if eval "test \"`echo '$''{'gdbsrv_cv_have_ptrace_getfpxregs'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1247 "configure"
++#line 1258 "configure"
+ #include "confdefs.h"
+ #include <sys/ptrace.h>
+ int main() {
+ PTRACE_GETFPXREGS;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1254: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   gdbsrv_cv_have_ptrace_getfpxregs=yes
+ else
+@@ -1273,12 +1284,12 @@ fi
+ if test "$ac_cv_header_sys_procfs_h" = yes; then
+   echo $ac_n "checking for lwpid_t in sys/procfs.h""... $ac_c" 1>&6
+-echo "configure:1277: checking for lwpid_t in sys/procfs.h" >&5
++echo "configure:1288: checking for lwpid_t in sys/procfs.h" >&5
+  if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_lwpid_t'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1282 "configure"
++#line 1293 "configure"
+ #include "confdefs.h"
+ #define _SYSCALL32
+@@ -1287,7 +1298,7 @@ int main() {
+ lwpid_t avar
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1291: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1302: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   bfd_cv_have_sys_procfs_type_lwpid_t=yes
+ else
+@@ -1309,12 +1320,12 @@ EOF
+  echo "$ac_t""$bfd_cv_have_sys_procfs_type_lwpid_t" 1>&6
+   echo $ac_n "checking for psaddr_t in sys/procfs.h""... $ac_c" 1>&6
+-echo "configure:1313: checking for psaddr_t in sys/procfs.h" >&5
++echo "configure:1324: checking for psaddr_t in sys/procfs.h" >&5
+  if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_psaddr_t'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1318 "configure"
++#line 1329 "configure"
+ #include "confdefs.h"
+ #define _SYSCALL32
+@@ -1323,7 +1334,7 @@ int main() {
+ psaddr_t avar
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1327: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1338: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   bfd_cv_have_sys_procfs_type_psaddr_t=yes
+ else
+@@ -1345,12 +1356,12 @@ EOF
+  echo "$ac_t""$bfd_cv_have_sys_procfs_type_psaddr_t" 1>&6
+   echo $ac_n "checking for prgregset_t in sys/procfs.h""... $ac_c" 1>&6
+-echo "configure:1349: checking for prgregset_t in sys/procfs.h" >&5
++echo "configure:1360: checking for prgregset_t in sys/procfs.h" >&5
+  if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_prgregset_t'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1354 "configure"
++#line 1365 "configure"
+ #include "confdefs.h"
+ #define _SYSCALL32
+@@ -1359,7 +1370,7 @@ int main() {
+ prgregset_t avar
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1363: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1374: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   bfd_cv_have_sys_procfs_type_prgregset_t=yes
+ else
+@@ -1381,12 +1392,12 @@ EOF
+  echo "$ac_t""$bfd_cv_have_sys_procfs_type_prgregset_t" 1>&6
+   echo $ac_n "checking for prfpregset_t in sys/procfs.h""... $ac_c" 1>&6
+-echo "configure:1385: checking for prfpregset_t in sys/procfs.h" >&5
++echo "configure:1396: checking for prfpregset_t in sys/procfs.h" >&5
+  if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_prfpregset_t'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1390 "configure"
++#line 1401 "configure"
+ #include "confdefs.h"
+ #define _SYSCALL32
+@@ -1395,7 +1406,7 @@ int main() {
+ prfpregset_t avar
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1399: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1410: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   bfd_cv_have_sys_procfs_type_prfpregset_t=yes
+ else
+@@ -1421,7 +1432,7 @@ EOF
+         
+   if test $bfd_cv_have_sys_procfs_type_prfpregset_t = yes; then
+     echo $ac_n "checking whether prfpregset_t type is broken""... $ac_c" 1>&6
+-echo "configure:1425: checking whether prfpregset_t type is broken" >&5
++echo "configure:1436: checking whether prfpregset_t type is broken" >&5
+     if eval "test \"`echo '$''{'gdb_cv_prfpregset_t_broken'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1429,7 +1440,7 @@ else
+   gdb_cv_prfpregset_t_broken=yes
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1433 "configure"
++#line 1444 "configure"
+ #include "confdefs.h"
+ #include <sys/procfs.h>
+        int main ()
+@@ -1439,7 +1450,7 @@ else
+          return 0;
+        }
+ EOF
+-if { (eval echo configure:1443: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:1454: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   gdb_cv_prfpregset_t_broken=no
+ else
+@@ -1463,12 +1474,12 @@ EOF
+   fi
+   echo $ac_n "checking for elf_fpregset_t in sys/procfs.h""... $ac_c" 1>&6
+-echo "configure:1467: checking for elf_fpregset_t in sys/procfs.h" >&5
++echo "configure:1478: checking for elf_fpregset_t in sys/procfs.h" >&5
+  if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_elf_fpregset_t'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 1472 "configure"
++#line 1483 "configure"
+ #include "confdefs.h"
+ #define _SYSCALL32
+@@ -1477,7 +1488,7 @@ int main() {
+ elf_fpregset_t avar
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1481: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1492: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   bfd_cv_have_sys_procfs_type_elf_fpregset_t=yes
+ else
+@@ -1506,14 +1517,14 @@ USE_THREAD_DB=
+ if test "$srv_linux_thread_db" = "yes"; then
+   echo $ac_n "checking for libthread_db""... $ac_c" 1>&6
+-echo "configure:1510: checking for libthread_db" >&5
++echo "configure:1521: checking for libthread_db" >&5
+ if eval "test \"`echo '$''{'srv_cv_thread_db'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   old_LIBS="$LIBS"
+   LIBS="$LIBS -lthread_db"
+   cat > conftest.$ac_ext <<EOF
+-#line 1517 "configure"
++#line 1528 "configure"
+ #include "confdefs.h"
+ void ps_pglobal_lookup() {}
+    void ps_pdread() {}
+@@ -1522,12 +1533,13 @@ void ps_pglobal_lookup() {}
+    void ps_lsetregs() {}
+    void ps_lgetfpregs() {}
+    void ps_lsetfpregs() {}
++   void ps_get_thread_area() {}
+    void ps_getpid() {}
+ int main() {
+ td_ta_new();
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:1543: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   srv_cv_thread_db="-lthread_db"
+ else
+@@ -1543,7 +1555,7 @@ else
+  fi
+  LIBS="$old_LIBS `eval echo "$thread_db"`"
+  cat > conftest.$ac_ext <<EOF
+-#line 1547 "configure"
++#line 1559 "configure"
+ #include "confdefs.h"
+ void ps_pglobal_lookup() {}
+    void ps_pdread() {}
+@@ -1552,12 +1564,13 @@ void ps_pglobal_lookup() {}
+    void ps_lsetregs() {}
+    void ps_lgetfpregs() {}
+    void ps_lsetfpregs() {}
++   void ps_get_thread_area() {}
+    void ps_getpid() {}
+ int main() {
+ td_ta_new();
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:1574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   srv_cv_thread_db="$thread_db"
+ else
+@@ -1567,11 +1580,11 @@ else
+   srv_cv_thread_db=no
+ fi
+ rm -f conftest*
+- LIBS="$old_LIBS"
+- 
++  
+ fi
+ echo "$ac_t""$srv_cv_thread_db" 1>&6
++ LIBS="$old_LIBS"
+ fi
+ rm -f conftest*
+@@ -1585,14 +1598,14 @@ rm -f conftest*
+   old_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -rdynamic"
+   cat > conftest.$ac_ext <<EOF
+-#line 1589 "configure"
++#line 1602 "configure"
+ #include "confdefs.h"
+ int main() {
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1596: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:1609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   RDYNAMIC=-rdynamic
+ else
+Index: gdb-6.3/gdb/gdbserver/aclocal.m4
+===================================================================
+--- gdb-6.3.orig/gdb/gdbserver/aclocal.m4      2002-06-11 13:32:39.000000000 -0400
++++ gdb-6.3/gdb/gdbserver/aclocal.m4   2004-12-07 17:22:00.382495519 -0500
+@@ -1,4 +1,4 @@
+-dnl aclocal.m4 generated automatically by aclocal 1.4-p4
++dnl aclocal.m4 generated automatically by aclocal 1.4
+ dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+ dnl This file is free software; the Free Software Foundation
+@@ -25,6 +25,7 @@ AC_DEFUN([SRV_CHECK_THREAD_DB],
+    void ps_lsetregs() {}
+    void ps_lgetfpregs() {}
+    void ps_lsetfpregs() {}
++   void ps_get_thread_area() {}
+    void ps_getpid() {}],
+   [td_ta_new();],
+   [srv_cv_thread_db="-lthread_db"],
+@@ -44,11 +45,12 @@ AC_DEFUN([SRV_CHECK_THREAD_DB],
+    void ps_lsetregs() {}
+    void ps_lgetfpregs() {}
+    void ps_lsetfpregs() {}
++   void ps_get_thread_area() {}
+    void ps_getpid() {}],
+   [td_ta_new();],
+   [srv_cv_thread_db="$thread_db"],
+   [srv_cv_thread_db=no])
++  ]])
+  LIBS="$old_LIBS"
+- ]])
+ )])
diff --git a/openwrt/toolchain/gdb/patches/790-debian_dwarf2-cfi-warning.patch b/openwrt/toolchain/gdb/patches/790-debian_dwarf2-cfi-warning.patch
new file mode 100644 (file)
index 0000000..cfb3d95
--- /dev/null
@@ -0,0 +1,39 @@
+Status: Unsuitable for upstream (at least, without a lot of arguing).
+
+GCC does not specify the state of every last register in the CIE.  Since
+GCC's focus is on correctness of runtime unwinding, any registers which
+have to be unwound will be specified; but unmodified registers will not
+be explicitly marked.  (How about modified, call-clobbered registers?
+I'm not sure if they are marked as unavailable.)
+
+GDB issues a noisy warning about this.  The warning is generally not useful,
+and we can get it extremely frequently (any time we load a new CIE).
+
+This patch disables the warning.  Alternately we could set the complaints
+threshold to zero, or implement a default frame init-register method for
+every architecture.  But someday the compiler will support using different
+calling conventions for internal functions, so that's not much of a stopgap. 
+ARM has a complex algorithm for handling this, involving scanning all CIEs -
+benefit not completely clear outside of the ARM context of flexible register
+sets.
+
+Index: gdb-6.3/gdb/dwarf2-frame.c
+===================================================================
+--- gdb-6.3.orig/gdb/dwarf2-frame.c    2004-11-15 11:54:57.000000000 -0500
++++ gdb-6.3/gdb/dwarf2-frame.c 2004-12-08 18:02:23.896409471 -0500
+@@ -705,9 +705,12 @@ dwarf2_frame_cache (struct frame_info *n
+          table.  We need a way of iterating through all the valid
+          DWARF2 register numbers.  */
+       if (fs->regs.reg[column].how == DWARF2_FRAME_REG_UNSPECIFIED)
+-        complaint (&symfile_complaints,
+-                   "Incomplete CFI data; unspecified registers at 0x%s",
+-                   paddr (fs->pc));
++        {
++          if (0)
++            complaint (&symfile_complaints,
++                       "Incomplete CFI data; unspecified registers at 0x%s",
++                       paddr (fs->pc));
++        }
+       else
+         cache->reg[regnum] = fs->regs.reg[column];
+       }
diff --git a/openwrt/toolchain/gdb/patches/800-debian_linux-use-underscore-exit.patch b/openwrt/toolchain/gdb/patches/800-debian_linux-use-underscore-exit.patch
new file mode 100644 (file)
index 0000000..198918c
--- /dev/null
@@ -0,0 +1,22 @@
+Status: committed upstream after 6.3.  Fixes some terminal mangling in
+gdbtui.
+
+2004-12-04  Daniel Jacobowitz  <dan@debian.org>
+
+       PR tui/1703
+       * linux-nat.c (linux_tracefork_child): Use _exit instead of exit.
+       Suggested by Joshua Neuheisel.
+
+Index: gdb-6.3/gdb/linux-nat.c
+===================================================================
+--- gdb-6.3.orig/gdb/linux-nat.c       2004-12-08 18:22:04.996973094 -0500
++++ gdb-6.3/gdb/linux-nat.c    2004-12-08 18:22:20.386956067 -0500
+@@ -147,7 +147,7 @@ linux_tracefork_child (void)
+   ptrace (PTRACE_TRACEME, 0, 0, 0);
+   kill (getpid (), SIGSTOP);
+   fork ();
+-  exit (0);
++  _exit (0);
+ }
+ /* Wrapper function for waitpid which handles EINTR.  */
diff --git a/openwrt/toolchain/gdb/patches/810-debian_bfd-no-kylix-crash.patch b/openwrt/toolchain/gdb/patches/810-debian_bfd-no-kylix-crash.patch
new file mode 100644 (file)
index 0000000..9aba5ca
--- /dev/null
@@ -0,0 +1,47 @@
+Status: committed upstream after 6.3.
+
+Fix a crash triggered by Kylix libraries.
+
+2004-12-06  Daniel Jacobowitz  <dan@debian.org>
+
+       Suggested by Fergal Daly <fergal@esatclear.ie>:
+       * simple.c (simple_dummy_multiple_definition): New function.
+       (bfd_simple_get_relocated_section_contents): Use it.
+
+Index: src/bfd/simple.c
+===================================================================
+RCS file: /cvs/src/src/bfd/simple.c,v
+retrieving revision 1.19
+retrieving revision 1.20
+Index: gdb-6.3/bfd/simple.c
+===================================================================
+--- gdb-6.3.orig/bfd/simple.c  2004-09-24 03:07:19.000000000 -0400
++++ gdb-6.3/bfd/simple.c       2004-12-08 18:25:58.415216808 -0500
+@@ -78,6 +78,19 @@ simple_dummy_unattached_reloc (struct bf
+   return TRUE;
+ }
++static bfd_boolean
++simple_dummy_multiple_definition (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
++                                const char *name ATTRIBUTE_UNUSED,
++                                bfd *obfd ATTRIBUTE_UNUSED,
++                                asection *osec ATTRIBUTE_UNUSED,
++                                bfd_vma oval ATTRIBUTE_UNUSED,
++                                bfd *nbfd ATTRIBUTE_UNUSED,
++                                asection *nsec ATTRIBUTE_UNUSED,
++                                bfd_vma nval ATTRIBUTE_UNUSED)
++{
++  return TRUE;
++}
++
+ struct saved_output_info
+ {
+   bfd_vma offset;
+@@ -172,6 +185,7 @@ bfd_simple_get_relocated_section_content
+   callbacks.reloc_overflow = simple_dummy_reloc_overflow;
+   callbacks.reloc_dangerous = simple_dummy_reloc_dangerous;
+   callbacks.unattached_reloc = simple_dummy_unattached_reloc;
++  callbacks.multiple_definition = simple_dummy_multiple_definition;
+   memset (&link_order, 0, sizeof (link_order));
+   link_order.next = NULL;
diff --git a/openwrt/toolchain/gdb/patches/820-debian_disable-linux-fork-messages.patch b/openwrt/toolchain/gdb/patches/820-debian_disable-linux-fork-messages.patch
new file mode 100644 (file)
index 0000000..60730ab
--- /dev/null
@@ -0,0 +1,46 @@
+Status: Proposed upstream after 6.3, not yet committed.
+
+2004-12-06  Daniel Jacobowitz  <dan@debian.org>
+
+       * linux-nat.c (child_follow_fork): Call target_terminal_ours before
+       printing output.  Use fprintf_unfiltered.  Only print output when
+       debugging.
+
+Index: gdb-6.3/gdb/linux-nat.c
+===================================================================
+--- gdb-6.3.orig/gdb/linux-nat.c       2004-12-08 18:22:20.386956067 -0500
++++ gdb-6.3/gdb/linux-nat.c    2004-12-08 18:28:49.995585970 -0500
+@@ -347,9 +347,13 @@ child_follow_fork (int follow_child)
+        also, but they'll be reinserted below.  */
+       detach_breakpoints (child_pid);
+-      fprintf_filtered (gdb_stdout,
+-                      "Detaching after fork from child process %d.\n",
+-                      child_pid);
++      if (debug_linux_nat)
++      {
++        target_terminal_ours ();
++        fprintf_unfiltered (gdb_stdlog,
++                            "Detaching after fork from child process %d.\n",
++                            child_pid);
++      }
+       ptrace (PTRACE_DETACH, child_pid, 0, 0);
+@@ -418,9 +422,13 @@ child_follow_fork (int follow_child)
+       /* Before detaching from the parent, remove all breakpoints from it. */
+       remove_breakpoints ();
+-      fprintf_filtered (gdb_stdout,
+-                      "Attaching after fork to child process %d.\n",
+-                      child_pid);
++      if (debug_linux_nat)
++      {
++        target_terminal_ours ();
++        fprintf_unfiltered (gdb_stdlog,
++                            "Attaching after fork to child process %d.\n",
++                            child_pid);
++      }
+       /* If we're vforking, we may want to hold on to the parent until
+        the child exits or execs.  At exec time we can remove the old