mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-01 20:55:19 +02:00
add gdb-client to run on host to debug target.. (kgdb)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@1166 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
14d0f66cd2
commit
5a7eec1ada
@ -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"
|
||||
|
@ -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))
|
||||
|
8
openwrt/toolchain/gdb/Config.in
Normal file
8
openwrt/toolchain/gdb/Config.in
Normal file
@ -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.
|
||||
|
59
openwrt/toolchain/gdb/Makefile
Normal file
59
openwrt/toolchain/gdb/Makefile
Normal file
@ -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)
|
280
openwrt/toolchain/gdb/patches/100-uclibc-conf.patch
Normal file
280
openwrt/toolchain/gdb/patches/100-uclibc-conf.patch
Normal file
@ -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
|
15
openwrt/toolchain/gdb/patches/200-uclibc-readline-conf.patch
Normal file
15
openwrt/toolchain/gdb/patches/200-uclibc-readline-conf.patch
Normal file
@ -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
|
28
openwrt/toolchain/gdb/patches/400-mips-coredump.patch
Normal file
28
openwrt/toolchain/gdb/patches/400-mips-coredump.patch
Normal file
@ -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
|
||||
|
34
openwrt/toolchain/gdb/patches/500-thread-timeout.patch
Normal file
34
openwrt/toolchain/gdb/patches/500-thread-timeout.patch
Normal file
@ -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));
|
||||
|
552
openwrt/toolchain/gdb/patches/600-debian_10.selected-frame.patch
Normal file
552
openwrt/toolchain/gdb/patches/600-debian_10.selected-frame.patch
Normal file
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
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
|
156
openwrt/toolchain/gdb/patches/620-debian_static-thread-db.patch
Normal file
156
openwrt/toolchain/gdb/patches/620-debian_static-thread-db.patch
Normal file
@ -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) \
|
@ -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 */
|
@ -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);
|
||||
+}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
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. */
|
||||
|
@ -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 (¤t_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 (¤t_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);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
@@ -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) \
|
@ -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);
|
53
openwrt/toolchain/gdb/patches/680-debian_sim-destdir.patch
Normal file
53
openwrt/toolchain/gdb/patches/680-debian_sim-destdir.patch
Normal file
@ -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
|
@ -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;
|
@ -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;
|
||||
+}
|
@ -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, ¬ify);
|
||||
+ err = current_pointers->td_ta_event_addr_p (thread_agent, event, ¬ify);
|
||||
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);
|
||||
}
|
@ -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.
|
@ -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;
|
@ -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)
|
@ -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
|
||||
{
|
@ -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. */
|
@ -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
|
@ -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"
|
||||
- ]])
|
||||
)])
|
||||
|
@ -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];
|
||||
}
|
@ -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. */
|
@ -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;
|
@ -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
|
Loading…
Reference in New Issue
Block a user