- Upgrade to the upstream gdb-6.8 prerelease.
- Cleanup the leftover `.orig' files during %prep. - Add expat-devel check by the configure script (for the other-arch builds). - `--with testsuite' now also BuildRequires: fpc - Backport fix of a segfault + PIE regression since 6.7.1 on PIE executables. - Update the printed GDB version string to be Fedora specific.
This commit is contained in:
parent
2da8118ede
commit
25ff8a1663
@ -1 +1 @@
|
||||
gdb-6.7.1.tar.bz2
|
||||
gdb-6.7.50.20080227.tar.bz2
|
||||
|
@ -6,52 +6,153 @@ from Alexandre Oliva <aoliva@redhat.com>
|
||||
(i386_linux_set_debug_regs_for_thread): ... this, and
|
||||
add new function to catch exceptions in the old one.
|
||||
|
||||
Index: gdb-6.5/gdb/i386-linux-nat.c
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
This patch was originally made to workaround a deficiency of ia32el (==ia32
|
||||
emulator on ia64) which EIOs on ptrace(2) of the debug registers.
|
||||
|
||||
Currently I can no longer run gdb.i386 on RHEL-5.1.ia64 as it fails on
|
||||
$ rpm -qv kernel
|
||||
kernel-2.6.18-53.el5.ia64
|
||||
$ file /emul/ia32-linux/usr/bin/gdb ./print-threads
|
||||
/emul/ia32-linux/usr/bin/gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
|
||||
./print-threads: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
|
||||
$ /emul/ia32-linux/usr/bin/gdb ./print-threads
|
||||
(gdb) r
|
||||
Starting program: /root/jkratoch/redhat/print-threads
|
||||
Warning:
|
||||
Cannot insert breakpoint -2.
|
||||
Error accessing memory address 0x555766fb: Input/output error.
|
||||
(gdb) maint info breakpoints
|
||||
Num Type Disp Enb Address What
|
||||
-1 longjmp resume keep n 0x00000000
|
||||
-2 shlib events keep y 0x555766fb
|
||||
|
||||
ia32-on-ia64 run problem info:
|
||||
|
||||
the inconsistency is in function linux_nat_wait - there is a variable called
|
||||
block_mask, which is assumed to represent the current signal mask. in the
|
||||
following execution path this assumption does not hold:
|
||||
|
||||
1) block-mask is filled with SIGCHLD and the signal is masked in
|
||||
lin_lwp_attach_lwp, which is called at the beginning of the procedure
|
||||
that handles a new thread in the debuggee.
|
||||
2) further down this procedure gdb tries to set the debug regs of the debuggee.
|
||||
when trying to set debug regs - gdb fails and calls throw_exception. this
|
||||
function finishes with siglongjmp, which clears the sigmask (seq. 1).
|
||||
3) further down, linux_nat_wait is called to wait on the new child. in
|
||||
linux_nat_wait there is a sequence :
|
||||
|
||||
if ( ! (block_mask & SIGCHLD) )
|
||||
mask- SIGCHLD
|
||||
while () {
|
||||
wait-no-hang( )
|
||||
if no child found then
|
||||
sigsuspend (SIGCHLD)
|
||||
|
||||
4) the signal that notifies the debugger about the child is received after the
|
||||
wait and before the sigsuspend. originally, this was not supposed to happen
|
||||
because SIGCHLD is supposed to be blocked, but because what happens in step
|
||||
2, the signal mask is cleared and the signal is received at this point,
|
||||
which results with a hang
|
||||
|
||||
sequence 1:
|
||||
|
||||
catch_errors (symbol_add_stubs)
|
||||
symbol_file_add_with_addrs_or_offsets
|
||||
deprecated_target_new_objfile_hook
|
||||
tui_new_objfile_hook
|
||||
attach_thread
|
||||
observer_notify_linux_new_thread
|
||||
generic_observer_notify
|
||||
observer_linux_new_thread_notification_stub
|
||||
i386_linux_new_thread
|
||||
i386_linux_set_debug_regs_for_thread
|
||||
i386_linux_dr_set_addr
|
||||
i386_linux_dr_set
|
||||
perror_with_name
|
||||
.
|
||||
.
|
||||
.
|
||||
throw_exception
|
||||
siglongjmp
|
||||
|
||||
RHEL Bug 175270
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/i386-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.5.orig/gdb/i386-linux-nat.c 2006-07-11 05:21:58.000000000 -0300
|
||||
+++ gdb-6.5/gdb/i386-linux-nat.c 2006-07-11 05:24:29.000000000 -0300
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "observer.h"
|
||||
--- gdb-6.8cvs20080219.orig/gdb/i386-linux-nat.c 2008-01-10 19:19:02.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/i386-linux-nat.c 2008-02-24 09:23:09.000000000 +0100
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "regcache.h"
|
||||
#include "target.h"
|
||||
#include "linux-nat.h"
|
||||
+#include "exceptions.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
@@ -695,14 +696,33 @@ struct i386_debug_register_state
|
||||
unsigned long control;
|
||||
};
|
||||
@@ -611,20 +612,40 @@ i386_linux_dr_get (ptid_t ptid, int regn
|
||||
return value;
|
||||
}
|
||||
|
||||
-static void
|
||||
-i386_linux_set_debug_regs_for_thread (ptid_t ptid,
|
||||
- struct i386_debug_register_state *dbs)
|
||||
+struct i386_debug_register_for_thread
|
||||
+{
|
||||
+ ptid_t ptid;
|
||||
+ struct i386_debug_register_state *dbs;
|
||||
+};
|
||||
+
|
||||
-i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
|
||||
-{
|
||||
- int tid;
|
||||
+struct i386_linux_dr_set
|
||||
+ {
|
||||
+ int tid;
|
||||
+ int regnum;
|
||||
+ unsigned long value;
|
||||
+ };
|
||||
|
||||
- tid = TIDGET (ptid);
|
||||
- if (tid == 0)
|
||||
- tid = PIDGET (ptid);
|
||||
+static int
|
||||
+i386_linux_set_dr_for_thread (void *drp)
|
||||
{
|
||||
+ ptid_t ptid = ((struct i386_debug_register_for_thread *)drp)->ptid;
|
||||
+ struct i386_debug_register_state *dbs
|
||||
+ = ((struct i386_debug_register_for_thread *)drp)->dbs;
|
||||
int i;
|
||||
for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
i386_linux_dr_set_addr (ptid, i, dbs->addr[i]);
|
||||
i386_linux_dr_set_control (ptid, dbs->control);
|
||||
+i386_linux_dr_set_core (void *data_pointer)
|
||||
+{
|
||||
+ struct i386_linux_dr_set *data = data_pointer;
|
||||
|
||||
errno = 0;
|
||||
- ptrace (PTRACE_POKEUSER, tid,
|
||||
- offsetof (struct user, u_debugreg[regnum]), value);
|
||||
+ ptrace (PTRACE_POKEUSER, data->tid,
|
||||
+ offsetof (struct user, u_debugreg[data->regnum]), data->value);
|
||||
if (errno != 0)
|
||||
perror_with_name (_("Couldn't write debug register"));
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+i386_linux_set_debug_regs_for_thread (ptid_t ptid,
|
||||
+ struct i386_debug_register_state *dbs)
|
||||
+i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
|
||||
+{
|
||||
+ struct i386_debug_register_for_thread dr;
|
||||
+ dr.ptid = ptid;
|
||||
+ dr.dbs = dbs;
|
||||
+ return catch_errors (i386_linux_set_dr_for_thread, &dr, "", RETURN_MASK_ALL);
|
||||
+ struct i386_linux_dr_set data;
|
||||
+ int tid;
|
||||
+
|
||||
+ data.tid = TIDGET (ptid);
|
||||
+ if (data.tid == 0)
|
||||
+ data.tid = PIDGET (ptid);
|
||||
+
|
||||
+ data.regnum = regnum;
|
||||
+ data.value = value;
|
||||
+
|
||||
+ return catch_errors (i386_linux_dr_set_core, &data, "", RETURN_MASK_ALL);
|
||||
}
|
||||
|
||||
/* Iterator function to support syncing debug registers across all threads. */
|
||||
void
|
||||
Index: gdb-6.8cvs20080219/gdb/Makefile.in
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/Makefile.in 2008-02-24 09:13:35.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/Makefile.in 2008-02-24 09:14:26.000000000 +0100
|
||||
@@ -2252,7 +2252,7 @@ i386gnu-tdep.o: i386gnu-tdep.c $(defs_h)
|
||||
i386-linux-nat.o: i386-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(linux_nat_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(gregset_h) $(i387_tdep_h) $(i386_tdep_h) $(i386_linux_tdep_h) \
|
||||
- $(gdb_proc_service_h) $(target_h)
|
||||
+ $(gdb_proc_service_h) $(target_h) $(exceptions_h)
|
||||
i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
|
||||
$(value_h) $(regcache_h) $(inferior_h) $(osabi_h) $(reggroups_h) \
|
||||
$(dwarf2_frame_h) $(gdb_string_h) $(i386_tdep_h) \
|
||||
|
@ -3,11 +3,17 @@
|
||||
* dwarf2read.c (die_type): Tolerate a type reference to location
|
||||
<0> and treat as unknown type.
|
||||
|
||||
--- gdb-6.3/gdb/dwarf2read.c.fix Tue Feb 1 16:48:49 2005
|
||||
+++ gdb-6.3/gdb/dwarf2read.c Tue Feb 1 16:50:12 2005
|
||||
@@ -7120,6 +7120,10 @@ die_type (struct die_info *die, struct d
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/dwarf2read.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/dwarf2read.c 2008-02-22 08:10:39.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/dwarf2read.c 2008-02-22 08:17:56.000000000 +0100
|
||||
@@ -7634,6 +7634,10 @@ die_type (struct die_info *die, struct d
|
||||
/* A missing DW_AT_type represents a void type. */
|
||||
return dwarf2_fundamental_type (cu->objfile, FT_VOID, cu);
|
||||
return builtin_type (current_gdbarch)->builtin_void;
|
||||
}
|
||||
+ else if (DW_ADDR (type_attr) == 0)
|
||||
+ /* If we have an invalid reference to 0, ignore it and treat
|
||||
|
@ -9,6 +9,10 @@ testsuite:
|
||||
* gdb.arch/ia64-sigtramp.exp: New test.
|
||||
* gdb.arch/ia64-sigtramp.c: Ditto.
|
||||
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre. (Only the testcase has remained.)
|
||||
|
||||
--- gdb-6.3/gdb/testsuite/gdb.arch/ia64-sigtramp.c.fix 2005-07-25 16:42:46.000000000 -0400
|
||||
+++ gdb-6.3/gdb/testsuite/gdb.arch/ia64-sigtramp.c 2005-07-25 16:42:08.000000000 -0400
|
||||
@@ -0,0 +1,23 @@
|
||||
@ -104,17 +108,3 @@ testsuite:
|
||||
+gdb_test "f 1" ".*signal handler called.*" "frame 1"
|
||||
+gdb_test "info frame" "Stack level 1.*p63 at .*" "info sigtramp frame"
|
||||
+
|
||||
--- gdb-6.3/gdb/libunwind-frame.c.fix 2005-07-25 16:41:30.000000000 -0400
|
||||
+++ gdb-6.3/gdb/libunwind-frame.c 2005-07-25 16:46:23.000000000 -0400
|
||||
@@ -303,8 +303,9 @@ libunwind_frame_prev_register (struct fr
|
||||
modification to support unwinding through a sigaltstack. */
|
||||
if (uw_regnum == INT_MAX)
|
||||
{
|
||||
- store_unsigned_integer (valuep, sizeof (CORE_ADDR),
|
||||
- (CORE_ADDR)&cache->cursor);
|
||||
+ if (valuep)
|
||||
+ store_unsigned_integer (valuep, sizeof (CORE_ADDR),
|
||||
+ (CORE_ADDR)&cache->cursor);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,204 +0,0 @@
|
||||
2005-07-11 Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* ia64-tdep.c (pseudo_regs): Add CURSOR_ADDR_REGNUM.
|
||||
(ia64_register_names): Add empty string for CURSOR_ADDR_REGNUM.
|
||||
(ia64_frame_prev_register): Default a request for CURSOR_ADDR_REGNUM
|
||||
to return 0.
|
||||
(ia64_sigtramp_frame_prev_register): Ditto.
|
||||
(ia64_gdb2uw_regnum): Map CURSOR_ADDR_REGNUM to INT_MAX so
|
||||
it won't clash with any legitimate UNW register number.
|
||||
(ia64_unwind_cursor): New callback.
|
||||
(ia64_libunwind_descr): Add new ia64_unwind_cursor callback.
|
||||
* libunwind-frame.h (struct libunwind_descr): Add new slot
|
||||
for unwind cursor callback.
|
||||
* libunwind-frame.c (libunwind_frame_cache): Attempt to copy
|
||||
and step previous cursor if possible, otherwise, create new
|
||||
cursor.
|
||||
(libunwind_frame_prev_register): Support request for
|
||||
getting the cursor address.
|
||||
|
||||
2007-10-14 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
Index: gdb-6.7/gdb/ia64-tdep.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/ia64-tdep.c 2007-10-14 23:57:38.000000000 +0200
|
||||
+++ gdb-6.7/gdb/ia64-tdep.c 2007-10-15 00:05:20.000000000 +0200
|
||||
@@ -131,7 +131,7 @@ static int lr_regnum = IA64_VRAP_REGNUM;
|
||||
they may not be accessible via the ptrace register get/set interfaces. */
|
||||
enum pseudo_regs { FIRST_PSEUDO_REGNUM = NUM_IA64_RAW_REGS, VBOF_REGNUM = IA64_NAT127_REGNUM + 1, V32_REGNUM,
|
||||
V127_REGNUM = V32_REGNUM + 95,
|
||||
- VP0_REGNUM, VP16_REGNUM = VP0_REGNUM + 16, VP63_REGNUM = VP0_REGNUM + 63, LAST_PSEUDO_REGNUM };
|
||||
+ VP0_REGNUM, VP16_REGNUM = VP0_REGNUM + 16, VP63_REGNUM = VP0_REGNUM + 63, CURSOR_ADDR_REGNUM, LAST_PSEUDO_REGNUM };
|
||||
|
||||
/* Array of register names; There should be ia64_num_regs strings in
|
||||
the initializer. */
|
||||
@@ -243,6 +243,7 @@ static char *ia64_register_names[] =
|
||||
"p40", "p41", "p42", "p43", "p44", "p45", "p46", "p47",
|
||||
"p48", "p49", "p50", "p51", "p52", "p53", "p54", "p55",
|
||||
"p56", "p57", "p58", "p59", "p60", "p61", "p62", "p63",
|
||||
+ ""
|
||||
};
|
||||
|
||||
struct ia64_frame_cache
|
||||
@@ -1856,6 +1857,12 @@ ia64_frame_prev_register (struct frame_i
|
||||
read_memory (addr, valuep, register_size (current_gdbarch, regnum));
|
||||
}
|
||||
}
|
||||
+ else if (regnum == CURSOR_ADDR_REGNUM)
|
||||
+ {
|
||||
+ /* The cursor is the address of the ia64 libunwind cursor.
|
||||
+ Default to 0. */
|
||||
+ *lvalp = lval_memory;
|
||||
+ }
|
||||
else
|
||||
{
|
||||
CORE_ADDR addr = 0;
|
||||
@@ -2178,6 +2185,12 @@ ia64_sigtramp_frame_prev_register (struc
|
||||
*addrp = pr_addr;
|
||||
}
|
||||
}
|
||||
+ else if (regnum == CURSOR_ADDR_REGNUM)
|
||||
+ {
|
||||
+ /* The cursor is the address of the ia64 libunwind cursor.
|
||||
+ Default to 0. */
|
||||
+ *lvalp = lval_memory;
|
||||
+ }
|
||||
else
|
||||
{
|
||||
/* All other registers not listed above. */
|
||||
@@ -2299,6 +2312,8 @@ ia64_gdb2uw_regnum (int regnum)
|
||||
return UNW_IA64_AR + (regnum - IA64_AR0_REGNUM);
|
||||
else if ((unsigned) (regnum - IA64_NAT0_REGNUM) < 128)
|
||||
return UNW_IA64_NAT + (regnum - IA64_NAT0_REGNUM);
|
||||
+ else if (regnum == CURSOR_ADDR_REGNUM)
|
||||
+ return INT_MAX;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
@@ -2334,6 +2349,21 @@ ia64_uw2gdb_regnum (int uw_regnum)
|
||||
return -1;
|
||||
}
|
||||
|
||||
+/* Special callback function to allow libunwind-frame to get
|
||||
+ the address of the next frame's cursor so it may be copied and
|
||||
+ stepped. */
|
||||
+static unw_cursor_t *
|
||||
+ia64_unwind_cursor (struct frame_info *next_frame)
|
||||
+{
|
||||
+ unw_cursor_t *cursor_addr;
|
||||
+ char buf[8];
|
||||
+
|
||||
+ frame_unwind_register (next_frame, CURSOR_ADDR_REGNUM, buf);
|
||||
+ cursor_addr = (unw_cursor_t *)extract_unsigned_integer (buf, 8);
|
||||
+
|
||||
+ return cursor_addr;
|
||||
+}
|
||||
+
|
||||
/* Gdb libunwind-frame callback function to reveal if register is a float
|
||||
register or not. */
|
||||
static int
|
||||
@@ -3046,6 +3076,7 @@ static struct libunwind_descr ia64_libun
|
||||
ia64_gdb2uw_regnum,
|
||||
ia64_uw2gdb_regnum,
|
||||
ia64_is_fpreg,
|
||||
+ ia64_unwind_cursor,
|
||||
&ia64_unw_accessors,
|
||||
&ia64_unw_rse_accessors,
|
||||
};
|
||||
Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/libunwind-frame.c 2007-08-23 20:08:35.000000000 +0200
|
||||
+++ gdb-6.7/gdb/libunwind-frame.c 2007-10-15 00:07:56.000000000 +0200
|
||||
@@ -125,6 +125,7 @@ libunwind_frame_set_descr (struct gdbarc
|
||||
arch_descr->is_fpreg = descr->is_fpreg;
|
||||
arch_descr->accessors = descr->accessors;
|
||||
arch_descr->special_accessors = descr->special_accessors;
|
||||
+ arch_descr->unwind_cursor = descr->unwind_cursor;
|
||||
}
|
||||
|
||||
static struct libunwind_frame_cache *
|
||||
@@ -132,6 +133,7 @@ libunwind_frame_cache (struct frame_info
|
||||
{
|
||||
unw_accessors_t *acc;
|
||||
unw_addr_space_t as;
|
||||
+ unw_cursor_t *cursor_addr;
|
||||
unw_word_t fp;
|
||||
unw_regnum_t uw_sp_regnum;
|
||||
struct libunwind_frame_cache *cache;
|
||||
@@ -153,23 +155,34 @@ libunwind_frame_cache (struct frame_info
|
||||
&& get_frame_type (next_frame) != SIGTRAMP_FRAME)
|
||||
return NULL;
|
||||
|
||||
- /* Get a libunwind cursor to the previous frame. We do this by initializing
|
||||
- a cursor. Libunwind treats a new cursor as the top of stack and will get
|
||||
- the current register set via the libunwind register accessor. Now, we
|
||||
- provide the platform-specific accessors and we set up the register accessor to use
|
||||
- the frame register unwinding interfaces so that we properly get the registers for
|
||||
- the current frame rather than the top. We then use the unw_step function to
|
||||
- move the libunwind cursor back one frame. We can later use this cursor to find previous
|
||||
- registers via the unw_get_reg interface which will invoke libunwind's special logic. */
|
||||
+ /* Get a libunwind cursor to the previous frame. We do this by getting
|
||||
+ the address of the next frame's cursor (if one exists). If we are at
|
||||
+ the top of stack, then we will get back a zero cursor address and we
|
||||
+ should initialize a new cursor.
|
||||
+
|
||||
+ Otherwise, we copy the cursor address contents and step back by one.
|
||||
+ Libunwind will use our register accessors which are set up to
|
||||
+ unwind registers from the previous frame. We will later use this cursor
|
||||
+ to find previous registers via the unw_get_reg interface. By passing
|
||||
+ back a cursor, we allow libunwind to handle sigaltstack which requires
|
||||
+ one cursor stepped back for all frames. */
|
||||
descr = libunwind_descr (get_frame_arch (next_frame));
|
||||
- acc = descr->accessors;
|
||||
- as = unw_create_addr_space_p (acc,
|
||||
+ cursor_addr = descr->unwind_cursor (next_frame);
|
||||
+
|
||||
+ if (cursor_addr == 0)
|
||||
+ {
|
||||
+ acc = descr->accessors;
|
||||
+ as = unw_create_addr_space_p (acc,
|
||||
gdbarch_byte_order (current_gdbarch)
|
||||
== BFD_ENDIAN_BIG
|
||||
? __BIG_ENDIAN
|
||||
: __LITTLE_ENDIAN);
|
||||
|
||||
- unw_init_remote_p (&cache->cursor, as, next_frame);
|
||||
+ unw_init_remote_p (&cache->cursor, as, next_frame);
|
||||
+ }
|
||||
+ else /* make copy */
|
||||
+ cache->cursor = *cursor_addr;
|
||||
+
|
||||
if (unw_step_p (&cache->cursor) < 0)
|
||||
{
|
||||
unw_destroy_addr_space_p (as);
|
||||
@@ -316,6 +329,16 @@ libunwind_frame_prev_register (struct fr
|
||||
if (uw_regnum < 0)
|
||||
return;
|
||||
|
||||
+ /* Check if we are unwinding the cursor address which just gives
|
||||
+ back the address of the next frame's cursor. This is a special
|
||||
+ modification to support unwinding through a sigaltstack. */
|
||||
+ if (uw_regnum == INT_MAX)
|
||||
+ {
|
||||
+ store_unsigned_integer (valuep, sizeof (CORE_ADDR),
|
||||
+ (CORE_ADDR)&cache->cursor);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
/* To get the previous register, we use the libunwind register APIs with
|
||||
the cursor we have already pushed back to the previous frame. */
|
||||
|
||||
Index: gdb-6.7/gdb/libunwind-frame.h
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/libunwind-frame.h 2007-08-23 20:08:35.000000000 +0200
|
||||
+++ gdb-6.7/gdb/libunwind-frame.h 2007-10-15 00:05:20.000000000 +0200
|
||||
@@ -36,6 +36,7 @@ struct libunwind_descr
|
||||
int (*gdb2uw) (int);
|
||||
int (*uw2gdb) (int);
|
||||
int (*is_fpreg) (int);
|
||||
+ unw_cursor_t *(*unwind_cursor) (struct frame_info *next_frame);
|
||||
void *accessors;
|
||||
void *special_accessors;
|
||||
};
|
@ -16,10 +16,14 @@
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/libunwind-frame.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/libunwind-frame.c 2007-10-15 00:08:30.000000000 +0200
|
||||
+++ gdb-6.7/gdb/libunwind-frame.c 2007-10-15 00:13:29.000000000 +0200
|
||||
--- gdb-6.8cvs20080219.orig/gdb/libunwind-frame.c 2008-01-02 00:04:03.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/libunwind-frame.c 2008-02-24 20:25:56.000000000 +0100
|
||||
@@ -61,6 +61,7 @@ static unw_word_t (*unw_find_dyn_list_p)
|
||||
struct libunwind_frame_cache
|
||||
{
|
||||
@ -28,19 +32,19 @@ Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
CORE_ADDR func_addr;
|
||||
unw_cursor_t cursor;
|
||||
unw_addr_space_t as;
|
||||
@@ -134,7 +135,7 @@ libunwind_frame_cache (struct frame_info
|
||||
@@ -133,6 +134,7 @@ libunwind_frame_cache (struct frame_info
|
||||
unw_accessors_t *acc;
|
||||
unw_addr_space_t as;
|
||||
unw_cursor_t *cursor_addr;
|
||||
- unw_word_t fp;
|
||||
unw_word_t fp;
|
||||
+ unw_word_t fp, sp;
|
||||
unw_regnum_t uw_sp_regnum;
|
||||
struct libunwind_frame_cache *cache;
|
||||
struct libunwind_descr *descr;
|
||||
@@ -183,14 +184,29 @@ libunwind_frame_cache (struct frame_info
|
||||
else /* make copy */
|
||||
cache->cursor = *cursor_addr;
|
||||
@@ -171,14 +173,30 @@ libunwind_frame_cache (struct frame_info
|
||||
: __LITTLE_ENDIAN);
|
||||
|
||||
unw_init_remote_p (&cache->cursor, as, next_frame);
|
||||
+
|
||||
+ /* For the base address, we have a small problem. The majority
|
||||
+ of the time, we can get the stack pointer of the previous
|
||||
+ frame to use as a frame pointer. In the case where we have
|
||||
@ -50,7 +54,7 @@ Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
+ sigaltstack as we want. To handle this, we record the stack
|
||||
+ address so the caller may calculate a more correct base address
|
||||
+ to use. */
|
||||
+ uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (current_gdbarch));
|
||||
+ uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (gdbarch));
|
||||
+ ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &sp);
|
||||
+ if (ret < 0)
|
||||
+ {
|
||||
@ -65,11 +69,11 @@ Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
}
|
||||
|
||||
- /* To get base address, get sp from previous frame. */
|
||||
- uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (current_gdbarch));
|
||||
- uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (gdbarch));
|
||||
ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp);
|
||||
if (ret < 0)
|
||||
{
|
||||
@@ -198,6 +214,7 @@ libunwind_frame_cache (struct frame_info
|
||||
@@ -186,6 +204,7 @@ libunwind_frame_cache (struct frame_info
|
||||
error (_("Can't get libunwind sp register."));
|
||||
}
|
||||
|
||||
@ -77,7 +81,7 @@ Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
cache->base = (CORE_ADDR)fp;
|
||||
cache->as = as;
|
||||
|
||||
@@ -402,6 +419,31 @@ libunwind_search_unwind_table (void *as,
|
||||
@@ -381,6 +400,31 @@ libunwind_search_unwind_table (void *as,
|
||||
di, pi, need_unwind_info, args);
|
||||
}
|
||||
|
||||
@ -109,7 +113,7 @@ Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
/* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */
|
||||
const struct frame_unwind *
|
||||
libunwind_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
@@ -439,7 +481,7 @@ libunwind_sigtramp_frame_sniffer (struct
|
||||
@@ -419,7 +463,7 @@ libunwind_sigtramp_frame_sniffer (struct
|
||||
ret = unw_is_signal_frame_p (&cursor);
|
||||
unw_destroy_addr_space_p (as);
|
||||
if (ret > 0)
|
||||
@ -118,11 +122,11 @@ Index: gdb-6.7/gdb/libunwind-frame.c
|
||||
|
||||
return NULL;
|
||||
}
|
||||
Index: gdb-6.7/gdb/libunwind-frame.h
|
||||
Index: gdb-6.8cvs20080219/gdb/libunwind-frame.h
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/libunwind-frame.h 2007-10-15 00:05:20.000000000 +0200
|
||||
+++ gdb-6.7/gdb/libunwind-frame.h 2007-10-15 00:08:36.000000000 +0200
|
||||
@@ -48,6 +48,9 @@ void libunwind_frame_set_descr (struct g
|
||||
--- gdb-6.8cvs20080219.orig/gdb/libunwind-frame.h 2008-01-02 00:04:03.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/libunwind-frame.h 2008-02-24 20:23:47.000000000 +0100
|
||||
@@ -47,6 +47,9 @@ void libunwind_frame_set_descr (struct g
|
||||
|
||||
void libunwind_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
||||
struct frame_id *this_id);
|
||||
@ -132,11 +136,11 @@ Index: gdb-6.7/gdb/libunwind-frame.h
|
||||
void libunwind_frame_prev_register (struct frame_info *next_frame, void **this_cache,
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp, CORE_ADDR *addrp,
|
||||
Index: gdb-6.7/gdb/ia64-tdep.c
|
||||
Index: gdb-6.8cvs20080219/gdb/ia64-tdep.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/ia64-tdep.c 2007-10-15 00:05:20.000000000 +0200
|
||||
+++ gdb-6.7/gdb/ia64-tdep.c 2007-10-15 00:08:36.000000000 +0200
|
||||
@@ -2968,7 +2968,7 @@ ia64_libunwind_sigtramp_frame_this_id (s
|
||||
--- gdb-6.8cvs20080219.orig/gdb/ia64-tdep.c 2008-02-24 20:23:40.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/ia64-tdep.c 2008-02-24 20:23:47.000000000 +0100
|
||||
@@ -2942,7 +2942,7 @@ ia64_libunwind_sigtramp_frame_this_id (s
|
||||
struct frame_id id;
|
||||
CORE_ADDR prev_ip;
|
||||
|
||||
@ -145,7 +149,7 @@ Index: gdb-6.7/gdb/ia64-tdep.c
|
||||
if (frame_id_eq (id, null_frame_id))
|
||||
{
|
||||
(*this_id) = null_frame_id;
|
||||
@@ -2980,8 +2980,14 @@ ia64_libunwind_sigtramp_frame_this_id (s
|
||||
@@ -2954,8 +2954,14 @@ ia64_libunwind_sigtramp_frame_this_id (s
|
||||
frame_unwind_register (next_frame, IA64_BSP_REGNUM, buf);
|
||||
bsp = extract_unsigned_integer (buf, 8);
|
||||
|
||||
|
@ -13,10 +13,14 @@
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
Index: gdb-6.7/gdb/doc/observer.texi
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/doc/observer.texi
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/doc/observer.texi 2007-10-13 05:09:50.000000000 +0200
|
||||
+++ gdb-6.7/gdb/doc/observer.texi 2007-10-14 23:24:52.000000000 +0200
|
||||
--- gdb-6.8cvs20080219.orig/gdb/doc/observer.texi 2007-10-09 13:06:07.000000000 +0200
|
||||
+++ gdb-6.8cvs20080219/gdb/doc/observer.texi 2008-02-21 17:45:46.000000000 +0100
|
||||
@@ -119,6 +119,10 @@ when @value{GDBN} calls this observer, t
|
||||
haven't been loaded yet.
|
||||
@end deftypefun
|
||||
@ -28,11 +32,19 @@ Index: gdb-6.7/gdb/doc/observer.texi
|
||||
@deftypefun void solib_unloaded (struct so_list *@var{solib})
|
||||
The shared library specified by @var{solib} has been unloaded.
|
||||
@end deftypefun
|
||||
Index: gdb-6.7/gdb/linux-nat.c
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/linux-nat.c 2007-10-13 05:09:50.000000000 +0200
|
||||
+++ gdb-6.7/gdb/linux-nat.c 2007-10-14 23:24:52.000000000 +0200
|
||||
@@ -742,11 +742,26 @@ iterate_over_lwps (int (*callback) (stru
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.c 2008-02-21 17:45:45.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.c 2008-02-22 08:12:57.000000000 +0100
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "regset.h"
|
||||
#include "inf-ptrace.h"
|
||||
#include "auxv.h"
|
||||
+#include "observer.h"
|
||||
#include <sys/param.h> /* for MAXPATHLEN */
|
||||
#include <sys/procfs.h> /* for elf_gregset etc. */
|
||||
#include "elf-bfd.h" /* for elfcore_write_* */
|
||||
@@ -751,11 +752,26 @@ iterate_over_lwps (int (*callback) (stru
|
||||
{
|
||||
struct lwp_info *lp, *lpnext;
|
||||
|
||||
@ -62,8 +74,8 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -3272,6 +3284,18 @@ linux_nat_add_target (struct target_ops
|
||||
thread_db_init (t);
|
||||
@@ -3319,6 +3335,18 @@ linux_nat_get_siginfo (ptid_t ptid)
|
||||
return &lp->siginfo;
|
||||
}
|
||||
|
||||
+/* Observer function for a mourn inferior event. This is needed
|
||||
@ -81,7 +93,7 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
void
|
||||
_initialize_linux_nat (void)
|
||||
{
|
||||
@@ -3286,6 +3310,8 @@ Specify any of the following keywords fo
|
||||
@@ -3333,6 +3361,8 @@ Specify any of the following keywords fo
|
||||
status -- list a different bunch of random process info.\n\
|
||||
all -- list all available /proc info."));
|
||||
|
||||
@ -90,10 +102,10 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
/* Save the original signal mask. */
|
||||
sigprocmask (SIG_SETMASK, NULL, &normal_mask);
|
||||
|
||||
Index: gdb-6.7/gdb/target.c
|
||||
Index: gdb-6.8cvs20080219/gdb/target.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/target.c 2007-08-23 20:08:45.000000000 +0200
|
||||
+++ gdb-6.7/gdb/target.c 2007-10-14 23:25:13.000000000 +0200
|
||||
--- gdb-6.8cvs20080219.orig/gdb/target.c 2008-02-14 23:04:00.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/target.c 2008-02-22 08:10:37.000000000 +0100
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "gdbcore.h"
|
||||
#include "exceptions.h"
|
||||
@ -116,11 +128,11 @@ Index: gdb-6.7/gdb/target.c
|
||||
static int
|
||||
nomemory (CORE_ADDR memaddr, char *myaddr, int len, int write,
|
||||
struct target_ops *t)
|
||||
Index: gdb-6.7/gdb/target.h
|
||||
Index: gdb-6.8cvs20080219/gdb/target.h
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/target.h 2007-08-23 20:08:46.000000000 +0200
|
||||
+++ gdb-6.7/gdb/target.h 2007-10-14 23:24:52.000000000 +0200
|
||||
@@ -864,8 +864,7 @@ int target_follow_fork (int follow_child
|
||||
--- gdb-6.8cvs20080219.orig/gdb/target.h 2008-01-02 00:04:05.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/target.h 2008-02-22 08:10:37.000000000 +0100
|
||||
@@ -861,8 +861,7 @@ int target_follow_fork (int follow_child
|
||||
|
||||
/* The inferior process has died. Do what is right. */
|
||||
|
||||
@ -130,9 +142,10 @@ Index: gdb-6.7/gdb/target.h
|
||||
|
||||
/* Does target have enough data to do a run or attach command? */
|
||||
|
||||
diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-orig/gdb/testsuite/gdb.base/follow-child.c gdb-6.6/gdb/testsuite/gdb.base/follow-child.c
|
||||
--- gdb-6.6-orig/gdb/testsuite/gdb.base/follow-child.c 2007-10-13 19:24:58.000000000 +0200
|
||||
+++ gdb-6.6/gdb/testsuite/gdb.base/follow-child.c 2007-10-13 19:11:08.000000000 +0200
|
||||
Index: gdb-6.8cvs20080219/gdb/testsuite/gdb.base/follow-child.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.8cvs20080219/gdb/testsuite/gdb.base/follow-child.c 2008-02-22 08:14:04.000000000 +0100
|
||||
@@ -0,0 +1,29 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
@ -147,7 +160,7 @@ diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-orig/gdb/testsuite/gdb.bas
|
||||
+ 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.
|
||||
@ -163,9 +176,10 @@ diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-orig/gdb/testsuite/gdb.bas
|
||||
+ sleep (60);
|
||||
+ return 0;
|
||||
+}
|
||||
diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-orig/gdb/testsuite/gdb.base/follow-child.exp gdb-6.6/gdb/testsuite/gdb.base/follow-child.exp
|
||||
--- gdb-6.6-orig/gdb/testsuite/gdb.base/follow-child.exp 2007-10-13 19:24:58.000000000 +0200
|
||||
+++ gdb-6.6/gdb/testsuite/gdb.base/follow-child.exp 2007-10-13 19:24:21.000000000 +0200
|
||||
Index: gdb-6.8cvs20080219/gdb/testsuite/gdb.base/follow-child.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.8cvs20080219/gdb/testsuite/gdb.base/follow-child.exp 2008-02-22 08:14:17.000000000 +0100
|
||||
@@ -0,0 +1,55 @@
|
||||
+# Copyright 2007 Free Software Foundation, Inc.
|
||||
+
|
||||
@ -181,7 +195,7 @@ diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-orig/gdb/testsuite/gdb.bas
|
||||
+#
|
||||
+# 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.
|
||||
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+
|
||||
+if $tracelevel then {
|
||||
+ strace $tracelevel
|
||||
@ -222,3 +236,16 @@ diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.6-orig/gdb/testsuite/gdb.bas
|
||||
+ fail $test
|
||||
+ }
|
||||
+}
|
||||
Index: gdb-6.8cvs20080219/gdb/Makefile.in
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/Makefile.in 2008-02-22 08:10:38.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/Makefile.in 2008-02-22 08:13:31.000000000 +0100
|
||||
@@ -2377,7 +2377,7 @@ linux-nat.o: linux-nat.c $(defs_h) $(inf
|
||||
$(gdb_wait_h) $(gdb_assert_h) $(linux_nat_h) $(gdbthread_h) \
|
||||
$(gdbcmd_h) $(regcache_h) $(regset_h) $(inf_ptrace_h) $(auxv_h) \
|
||||
$(elf_bfd_h) $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(gdb_stat_h) \
|
||||
- $(linux_fork_h)
|
||||
+ $(linux_fork_h) $(observer_h)
|
||||
linux-thread-db.o: linux-thread-db.c $(defs_h) $(gdb_assert_h) \
|
||||
$(gdb_proc_service_h) $(gdb_thread_db_h) $(bfd_h) $(exceptions_h) \
|
||||
$(gdbthread_h) $(inferior_h) $(symfile_h) $(objfiles_h) $(target_h) \
|
||||
|
@ -10,11 +10,19 @@
|
||||
|
||||
* solib-svr4.c (svr4_current_sos): Fix segfault on NULL EXEC_BFD.
|
||||
|
||||
Index: gdb-6.7.1/gdb/dwarf2read.c
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
2008-02-27 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to gdb-6.7.50.20080227.
|
||||
|
||||
Index: gdb-6.7.50.20080227/gdb/dwarf2read.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/dwarf2read.c 2007-11-02 15:24:10.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/dwarf2read.c 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -1226,7 +1226,7 @@ dwarf2_build_psymtabs (struct objfile *o
|
||||
--- gdb-6.7.50.20080227.orig/gdb/dwarf2read.c 2008-02-27 08:57:20.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/dwarf2read.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -1217,7 +1217,7 @@ dwarf2_build_psymtabs (struct objfile *o
|
||||
else
|
||||
dwarf2_per_objfile->loc_buffer = NULL;
|
||||
|
||||
@ -23,10 +31,10 @@ Index: gdb-6.7.1/gdb/dwarf2read.c
|
||||
|| (objfile->global_psymbols.size == 0
|
||||
&& objfile->static_psymbols.size == 0))
|
||||
{
|
||||
Index: gdb-6.7.1/gdb/auxv.c
|
||||
Index: gdb-6.7.50.20080227/gdb/auxv.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/auxv.c 2007-08-23 20:08:26.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/auxv.c 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/auxv.c 2008-01-16 17:27:37.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/auxv.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -80,7 +80,7 @@ procfs_xfer_auxv (struct target_ops *ops
|
||||
Return 1 if an entry was read into *TYPEP and *VALP. */
|
||||
int
|
||||
@ -89,7 +97,7 @@ Index: gdb-6.7.1/gdb/auxv.c
|
||||
{
|
||||
#define TAG(tag, text, kind) \
|
||||
case tag: name = #tag; description = text; flavor = kind; break
|
||||
@@ -211,7 +213,7 @@ fprint_target_auxv (struct ui_file *file
|
||||
@@ -213,7 +215,7 @@ fprint_target_auxv (struct ui_file *file
|
||||
}
|
||||
|
||||
fprintf_filtered (file, "%-4s %-20s %-30s ",
|
||||
@ -98,10 +106,10 @@ Index: gdb-6.7.1/gdb/auxv.c
|
||||
switch (flavor)
|
||||
{
|
||||
case dec:
|
||||
Index: gdb-6.7.1/gdb/auxv.h
|
||||
Index: gdb-6.7.50.20080227/gdb/auxv.h
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/auxv.h 2007-08-23 20:08:26.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/auxv.h 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/auxv.h 2008-01-01 23:53:09.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/auxv.h 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -35,14 +35,14 @@ struct target_ops; /* Forward declarati
|
||||
Return 1 if an entry was read into *TYPEP and *VALP. */
|
||||
extern int target_auxv_parse (struct target_ops *ops,
|
||||
@ -119,11 +127,11 @@ Index: gdb-6.7.1/gdb/auxv.h
|
||||
|
||||
/* Print the contents of the target's AUXV on the specified file. */
|
||||
extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops);
|
||||
Index: gdb-6.7.1/gdb/breakpoint.h
|
||||
Index: gdb-6.7.50.20080227/gdb/breakpoint.h
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/breakpoint.h 2007-11-02 15:22:24.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/breakpoint.h 2007-11-02 15:24:59.000000000 +0100
|
||||
@@ -150,6 +150,7 @@ enum enable_state
|
||||
--- gdb-6.7.50.20080227.orig/gdb/breakpoint.h 2008-02-01 17:24:46.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/breakpoint.h 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -144,6 +144,7 @@ enum enable_state
|
||||
automatically enabled and reset when the call
|
||||
"lands" (either completes, or stops at another
|
||||
eventpoint). */
|
||||
@ -131,7 +139,7 @@ Index: gdb-6.7.1/gdb/breakpoint.h
|
||||
bp_permanent /* There is a breakpoint instruction hard-wired into
|
||||
the target's code. Don't try to write another
|
||||
breakpoint instruction on top of it, or restore
|
||||
@@ -826,6 +827,10 @@ extern void remove_thread_event_breakpoi
|
||||
@@ -823,6 +824,10 @@ extern void remove_thread_event_breakpoi
|
||||
|
||||
extern void disable_breakpoints_in_shlibs (void);
|
||||
|
||||
@ -139,13 +147,13 @@ Index: gdb-6.7.1/gdb/breakpoint.h
|
||||
+
|
||||
+extern void re_enable_breakpoints_at_startup (void);
|
||||
+
|
||||
extern void create_solib_load_event_breakpoint (char *, int, char *, char *);
|
||||
/* This function returns TRUE if ep is a catchpoint. */
|
||||
extern int ep_is_catchpoint (struct breakpoint *);
|
||||
|
||||
extern void create_solib_unload_event_breakpoint (char *, int,
|
||||
Index: gdb-6.7.1/gdb/symfile-mem.c
|
||||
Index: gdb-6.7.50.20080227/gdb/symfile-mem.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/symfile-mem.c 2007-08-23 20:08:39.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/symfile-mem.c 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/symfile-mem.c 2008-01-01 23:53:13.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/symfile-mem.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -108,7 +108,7 @@ symbol_file_add_from_memory (struct bfd
|
||||
}
|
||||
|
||||
@ -155,11 +163,11 @@ Index: gdb-6.7.1/gdb/symfile-mem.c
|
||||
|
||||
/* This might change our ideas about frames already looked at. */
|
||||
reinit_frame_cache ();
|
||||
Index: gdb-6.7.1/gdb/infrun.c
|
||||
Index: gdb-6.7.50.20080227/gdb/infrun.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/infrun.c 2007-11-02 15:21:57.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/infrun.c 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -2298,6 +2298,11 @@ process_event_stop_test:
|
||||
--- gdb-6.7.50.20080227.orig/gdb/infrun.c 2008-02-27 08:57:20.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/infrun.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -2277,6 +2277,11 @@ process_event_stop_test:
|
||||
#endif
|
||||
target_terminal_inferior ();
|
||||
|
||||
@ -171,13 +179,13 @@ Index: gdb-6.7.1/gdb/infrun.c
|
||||
/* If requested, stop when the dynamic linker notifies
|
||||
gdb of events. This allows the user to get control
|
||||
and place breakpoints in initializer routines for
|
||||
Index: gdb-6.7.1/gdb/objfiles.c
|
||||
Index: gdb-6.7.50.20080227/gdb/objfiles.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/objfiles.c 2007-08-23 20:08:36.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/objfiles.c 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -48,6 +48,9 @@
|
||||
#include "dictionary.h"
|
||||
--- gdb-6.7.50.20080227.orig/gdb/objfiles.c 2008-01-01 23:53:12.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/objfiles.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -49,6 +49,9 @@
|
||||
#include "source.h"
|
||||
#include "addrmap.h"
|
||||
|
||||
+#include "auxv.h"
|
||||
+#include "elf/common.h"
|
||||
@ -185,7 +193,7 @@ Index: gdb-6.7.1/gdb/objfiles.c
|
||||
/* Prototypes for local functions */
|
||||
|
||||
static void objfile_alloc_data (struct objfile *objfile);
|
||||
@@ -259,7 +262,19 @@ init_entry_point_info (struct objfile *o
|
||||
@@ -260,7 +263,19 @@ init_entry_point_info (struct objfile *o
|
||||
CORE_ADDR
|
||||
entry_point_address (void)
|
||||
{
|
||||
@ -206,10 +214,10 @@ Index: gdb-6.7.1/gdb/objfiles.c
|
||||
}
|
||||
|
||||
/* Create the terminating entry of OBJFILE's minimal symbol table.
|
||||
Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
Index: gdb-6.7.50.20080227/gdb/solib-svr4.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/solib-svr4.c 2007-11-02 15:21:46.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/solib-svr4.c 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/solib-svr4.c 2008-02-27 08:57:19.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/solib-svr4.c 2008-02-27 08:59:06.000000000 +0100
|
||||
@@ -31,6 +31,8 @@
|
||||
#include "gdbcore.h"
|
||||
#include "target.h"
|
||||
@ -219,7 +227,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
|
||||
#include "gdb_assert.h"
|
||||
|
||||
@@ -249,7 +251,9 @@ static char *debug_loader_name;
|
||||
@@ -246,7 +248,9 @@ static char *debug_loader_name;
|
||||
|
||||
/* Local function prototypes */
|
||||
|
||||
@ -229,7 +237,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
|
||||
static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
|
||||
|
||||
@@ -352,10 +356,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
||||
@@ -349,10 +353,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
||||
int arch_size, step, sect_size;
|
||||
long dyn_tag;
|
||||
CORE_ADDR dyn_ptr, dyn_addr;
|
||||
@ -242,7 +250,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
|
||||
if (abfd == NULL)
|
||||
return 0;
|
||||
@@ -363,19 +369,74 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
||||
@@ -360,19 +366,74 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
||||
if (arch_size == -1)
|
||||
return 0;
|
||||
|
||||
@ -319,7 +327,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
|
||||
/* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
|
||||
step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
|
||||
@@ -408,9 +469,43 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
||||
@@ -405,9 +466,43 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
||||
CORE_ADDR ptr_addr;
|
||||
|
||||
ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
|
||||
@ -365,7 +373,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
*ptr = dyn_ptr;
|
||||
}
|
||||
return 1;
|
||||
@@ -547,6 +642,10 @@ solib_svr4_r_map (void)
|
||||
@@ -544,6 +639,10 @@ solib_svr4_r_map (void)
|
||||
{
|
||||
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
|
||||
|
||||
@ -376,41 +384,40 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
return read_memory_typed_address (debug_base + lmo->r_map_offset,
|
||||
builtin_type_void_data_ptr);
|
||||
}
|
||||
@@ -704,6 +803,11 @@ svr4_current_sos (void)
|
||||
@@ -713,6 +812,11 @@ svr4_current_sos (void)
|
||||
struct so_list *head = 0;
|
||||
struct so_list **link_ptr = &head;
|
||||
CORE_ADDR ldsomap = 0;
|
||||
+ const char *filename = exec_bfd ? exec_bfd->filename : "<none>";
|
||||
|
||||
+
|
||||
+ if (debug_solib)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "svr4_current_sos: exec_bfd %s\n", filename);
|
||||
+
|
||||
/* Make sure we've looked up the inferior's dynamic linker's base
|
||||
structure. */
|
||||
|
||||
/* Always locate the debug struct, in case it has moved. */
|
||||
debug_base = 0;
|
||||
@@ -721,10 +825,19 @@ svr4_current_sos (void)
|
||||
/* If we can't find the dynamic linker's base structure, this
|
||||
must not be a dynamically linked executable. Hmm. */
|
||||
if (! debug_base)
|
||||
@@ -713,11 +817,20 @@ svr4_current_sos (void)
|
||||
/* If we can't find the dynamic linker's base structure, this
|
||||
must not be a dynamically linked executable. Hmm. */
|
||||
if (! debug_base)
|
||||
- return svr4_default_sos ();
|
||||
+ {
|
||||
+ if (debug_solib)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "svr4_current_sos: no DT_DEBUG found in %s -- return now\n",
|
||||
+ filename);
|
||||
+ return svr4_default_sos ();
|
||||
+ }
|
||||
}
|
||||
- return svr4_default_sos ();
|
||||
+ {
|
||||
+ if (debug_solib)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "svr4_current_sos: no DT_DEBUG found in %s -- return now\n",
|
||||
+ filename);
|
||||
+ return svr4_default_sos ();
|
||||
+ }
|
||||
|
||||
/* Walk the inferior's link map list, and build our list of
|
||||
`struct so_list' nodes. */
|
||||
+ if (debug_solib)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "svr4_current_sos: walk link map in %s\n", filename);
|
||||
+ "svr4_current_sos: walk link map in %s\n", filename);
|
||||
lm = solib_svr4_r_map ();
|
||||
|
||||
while (lm)
|
||||
@@ -733,23 +847,103 @@ svr4_current_sos (void)
|
||||
@@ -740,23 +853,103 @@ svr4_current_sos (void)
|
||||
new->lm_info->lm = xzalloc (lmo->link_map_size);
|
||||
make_cleanup (xfree, new->lm_info->lm);
|
||||
|
||||
@ -516,7 +523,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
target_read_string (LM_NAME (new), &buffer,
|
||||
SO_NAME_MAX_PATH_SIZE - 1, &errcode);
|
||||
if (errcode != 0)
|
||||
@@ -757,23 +951,35 @@ svr4_current_sos (void)
|
||||
@@ -764,23 +957,35 @@ svr4_current_sos (void)
|
||||
safe_strerror (errcode));
|
||||
else
|
||||
{
|
||||
@ -568,7 +575,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
}
|
||||
|
||||
/* On Solaris, the dynamic linker is not in the normal list of
|
||||
@@ -789,6 +995,9 @@ svr4_current_sos (void)
|
||||
@@ -796,6 +1001,9 @@ svr4_current_sos (void)
|
||||
if (head == NULL)
|
||||
return svr4_default_sos ();
|
||||
|
||||
@ -578,7 +585,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
return head;
|
||||
}
|
||||
|
||||
@@ -868,7 +1079,7 @@ svr4_fetch_objfile_link_map (struct objf
|
||||
@@ -875,7 +1083,7 @@ svr4_fetch_objfile_link_map (struct objf
|
||||
/* On some systems, the only way to recognize the link map entry for
|
||||
the main executable file is by looking at its name. Return
|
||||
non-zero iff SONAME matches one of the known main executable names. */
|
||||
@ -587,7 +594,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
static int
|
||||
match_main (char *soname)
|
||||
{
|
||||
@@ -882,6 +1093,7 @@ match_main (char *soname)
|
||||
@@ -889,6 +1097,7 @@ match_main (char *soname)
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -595,7 +602,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
|
||||
/* Return 1 if PC lies in the dynamic symbol resolution code of the
|
||||
SVR4 run time loader. */
|
||||
@@ -979,6 +1191,11 @@ enable_break (void)
|
||||
@@ -1040,6 +1249,11 @@ enable_break (void)
|
||||
/* Find the .interp section; if not found, warn the user and drop
|
||||
into the old breakpoint at symbol code. */
|
||||
interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
|
||||
@ -607,7 +614,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
if (interp_sect)
|
||||
{
|
||||
unsigned int interp_sect_size;
|
||||
@@ -1018,6 +1235,9 @@ enable_break (void)
|
||||
@@ -1074,6 +1288,9 @@ enable_break (void)
|
||||
if (tmp_fd >= 0)
|
||||
tmp_bfd = bfd_fopen (tmp_pathname, gnutarget, FOPEN_RB, tmp_fd);
|
||||
|
||||
@ -617,7 +624,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
if (tmp_bfd == NULL)
|
||||
goto bkpt_at_symbol;
|
||||
|
||||
@@ -1115,6 +1335,9 @@ enable_break (void)
|
||||
@@ -1180,6 +1397,9 @@ enable_break (void)
|
||||
if (sym_addr != 0)
|
||||
{
|
||||
create_solib_event_breakpoint (load_addr + sym_addr);
|
||||
@ -627,7 +634,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1375,6 +1598,8 @@ svr4_solib_create_inferior_hook (void)
|
||||
@@ -1440,6 +1660,8 @@ svr4_solib_create_inferior_hook (void)
|
||||
while (stop_signal != TARGET_SIGNAL_TRAP);
|
||||
stop_soon = NO_STOP_QUIETLY;
|
||||
#endif /* defined(_SCO_DS) */
|
||||
@ -636,7 +643,7 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1551,6 +1776,75 @@ svr4_lp64_fetch_link_map_offsets (void)
|
||||
@@ -1620,6 +1842,75 @@ svr4_lp64_fetch_link_map_offsets (void)
|
||||
|
||||
return lmp;
|
||||
}
|
||||
@ -712,20 +719,19 @@ Index: gdb-6.7.1/gdb/solib-svr4.c
|
||||
|
||||
|
||||
struct target_so_ops svr4_so_ops;
|
||||
@@ -1592,4 +1886,8 @@ _initialize_svr4_solib (void)
|
||||
|
||||
/* FIXME: Don't do this here. *_gdbarch_init() should set so_ops. */
|
||||
current_target_so_ops = &svr4_so_ops;
|
||||
@@ -1678,4 +1969,7 @@ _initialize_svr4_solib (void)
|
||||
svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code;
|
||||
svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol;
|
||||
svr4_so_ops.same = svr4_same;
|
||||
+
|
||||
+ add_info ("linkmap", info_linkmap_command,
|
||||
+ "Display the inferior's linkmap.");
|
||||
+
|
||||
+ "Display the inferior's linkmap.");
|
||||
}
|
||||
Index: gdb-6.7.1/gdb/varobj.c
|
||||
Index: gdb-6.7.50.20080227/gdb/varobj.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/varobj.c 2007-08-31 21:01:17.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/varobj.c 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -1116,6 +1116,62 @@ install_new_value (struct varobj *var, s
|
||||
--- gdb-6.7.50.20080227.orig/gdb/varobj.c 2008-02-04 08:49:04.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/varobj.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -1078,6 +1078,62 @@ install_new_value (struct varobj *var, s
|
||||
return changed;
|
||||
}
|
||||
|
||||
@ -788,10 +794,10 @@ Index: gdb-6.7.1/gdb/varobj.c
|
||||
/* Update the values for a variable and its children. This is a
|
||||
two-pronged attack. First, re-parse the value for the root's
|
||||
expression to see if it's changed. Then go all the way
|
||||
Index: gdb-6.7.1/gdb/solist.h
|
||||
Index: gdb-6.7.50.20080227/gdb/solist.h
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/solist.h 2007-08-23 20:08:38.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/solist.h 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/solist.h 2008-01-07 16:19:58.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/solist.h 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -61,6 +61,8 @@ struct so_list
|
||||
bfd *abfd;
|
||||
char symbols_loaded; /* flag: symbols read in yet? */
|
||||
@ -801,7 +807,7 @@ Index: gdb-6.7.1/gdb/solist.h
|
||||
struct objfile *objfile; /* objfile for loaded lib */
|
||||
struct section_table *sections;
|
||||
struct section_table *sections_end;
|
||||
@@ -123,9 +125,15 @@ void free_so (struct so_list *so);
|
||||
@@ -127,9 +129,15 @@ void free_so (struct so_list *so);
|
||||
/* Return address of first so_list entry in master shared object list. */
|
||||
struct so_list *master_so_list (void);
|
||||
|
||||
@ -817,28 +823,28 @@ Index: gdb-6.7.1/gdb/solist.h
|
||||
/* FIXME: gdbarch needs to control this variable */
|
||||
extern struct target_so_ops *current_target_so_ops;
|
||||
|
||||
@@ -143,4 +151,6 @@ struct symbol *solib_global_lookup (cons
|
||||
@@ -140,4 +148,6 @@ struct symbol *solib_global_lookup (cons
|
||||
const domain_enum domain,
|
||||
struct symtab **symtab);
|
||||
|
||||
+/* Controls the printing of debugging output. */
|
||||
+extern int debug_solib;
|
||||
#endif
|
||||
Index: gdb-6.7.1/gdb/varobj.h
|
||||
Index: gdb-6.7.50.20080227/gdb/varobj.h
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/varobj.h 2007-08-31 20:52:05.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/varobj.h 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -114,4 +114,6 @@ extern int varobj_update (struct varobj
|
||||
--- gdb-6.7.50.20080227.orig/gdb/varobj.h 2008-01-30 08:17:31.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/varobj.h 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -122,4 +122,6 @@ extern void varobj_invalidate (void);
|
||||
|
||||
extern void varobj_invalidate (void);
|
||||
extern int varobj_editable_p (struct varobj *var);
|
||||
|
||||
+extern void varobj_refresh(void);
|
||||
+
|
||||
#endif /* VAROBJ_H */
|
||||
Index: gdb-6.7.1/gdb/symfile.c
|
||||
Index: gdb-6.7.50.20080227/gdb/symfile.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/symfile.c 2007-09-24 23:48:05.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/symfile.c 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/symfile.c 2008-01-29 23:47:20.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/symfile.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "readline/readline.h"
|
||||
#include "gdb_assert.h"
|
||||
@ -847,7 +853,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
#include "observer.h"
|
||||
#include "exec.h"
|
||||
#include "parser-defs.h"
|
||||
@@ -779,7 +780,7 @@ syms_from_objfile (struct objfile *objfi
|
||||
@@ -778,7 +779,7 @@ syms_from_objfile (struct objfile *objfi
|
||||
|
||||
/* Now either addrs or offsets is non-zero. */
|
||||
|
||||
@ -856,7 +862,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
{
|
||||
/* We will modify the main symbol table, make sure that all its users
|
||||
will be cleaned up if an error occurs during symbol reading. */
|
||||
@@ -807,7 +808,7 @@ syms_from_objfile (struct objfile *objfi
|
||||
@@ -806,7 +807,7 @@ syms_from_objfile (struct objfile *objfi
|
||||
|
||||
We no longer warn if the lowest section is not a text segment (as
|
||||
happens for the PA64 port. */
|
||||
@ -865,7 +871,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
{
|
||||
asection *lower_sect;
|
||||
asection *sect;
|
||||
@@ -976,17 +977,21 @@ new_symfile_objfile (struct objfile *obj
|
||||
@@ -975,17 +976,21 @@ new_symfile_objfile (struct objfile *obj
|
||||
/* If this is the main symbol file we have to clean up all users of the
|
||||
old main symbol file. Otherwise it is sufficient to fixup all the
|
||||
breakpoints that may have been redefined by this symbol file. */
|
||||
@ -889,7 +895,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
|
||||
/* We're done reading the symbol file; finish off complaints. */
|
||||
clear_complaints (&symfile_complaints, 0, verbo);
|
||||
@@ -1029,7 +1034,7 @@ symbol_file_add_with_addrs_or_offsets (b
|
||||
@@ -1028,7 +1033,7 @@ symbol_file_add_with_addrs_or_offsets (b
|
||||
interactively wiping out any existing symbols. */
|
||||
|
||||
if ((have_full_symbols () || have_partial_symbols ())
|
||||
@ -898,7 +904,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
&& from_tty
|
||||
&& !query ("Load new symbol table from \"%s\"? ", name))
|
||||
error (_("Not confirmed."));
|
||||
@@ -1213,6 +1218,10 @@ symbol_file_clear (int from_tty)
|
||||
@@ -1212,6 +1217,10 @@ symbol_file_clear (int from_tty)
|
||||
symfile_objfile->name)
|
||||
: !query (_("Discard symbol table? "))))
|
||||
error (_("Not confirmed."));
|
||||
@ -909,7 +915,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
free_all_objfiles ();
|
||||
|
||||
/* solib descriptors may have handles to objfiles. Since their
|
||||
@@ -2470,6 +2479,8 @@ reread_symbols (void)
|
||||
@@ -2466,6 +2475,8 @@ reread_symbols (void)
|
||||
/* Discard cleanups as symbol reading was successful. */
|
||||
discard_cleanups (old_cleanups);
|
||||
|
||||
@ -918,7 +924,7 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
/* If the mtime has changed between the time we set new_modtime
|
||||
and now, we *want* this to be out of date, so don't call stat
|
||||
again now. */
|
||||
@@ -2837,6 +2848,7 @@ clear_symtab_users (void)
|
||||
@@ -2834,6 +2845,7 @@ clear_symtab_users (void)
|
||||
breakpoint_re_set ();
|
||||
set_default_breakpoint (0, 0, 0, 0);
|
||||
clear_pc_function_cache ();
|
||||
@ -926,101 +932,20 @@ Index: gdb-6.7.1/gdb/symfile.c
|
||||
observer_notify_new_objfile (NULL);
|
||||
|
||||
/* Clear globals which might have pointed into a removed objfile.
|
||||
Index: gdb-6.7.1/gdb/breakpoint.c
|
||||
Index: gdb-6.7.50.20080227/gdb/breakpoint.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/breakpoint.c 2007-11-02 15:24:10.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/breakpoint.c 2007-11-02 15:26:50.000000000 +0100
|
||||
@@ -847,15 +847,15 @@ insert_watchpoints_for_new_thread (ptid_
|
||||
struct value *v = b->owner->val_chain;
|
||||
--- gdb-6.7.50.20080227.orig/gdb/breakpoint.c 2008-02-27 08:57:20.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/breakpoint.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -923,7 +923,7 @@ update_watchpoint (struct breakpoint *b,
|
||||
value_release_to_mark (mark);
|
||||
|
||||
/* Look at each value on the value chain. */
|
||||
- for (; v; v = v->next)
|
||||
+ for (; v; v = value_next (v))
|
||||
{
|
||||
/* If it's a memory location, and GDB actually needed
|
||||
its contents to evaluate the expression, then we
|
||||
must watch it. */
|
||||
if (VALUE_LVAL (v) == lval_memory
|
||||
- && ! VALUE_LAZY (v))
|
||||
+ && ! value_lazy (v))
|
||||
{
|
||||
- struct type *vtype = check_typedef (VALUE_TYPE (v));
|
||||
+ struct type *vtype = check_typedef (value_type (v));
|
||||
|
||||
/* We only watch structs and arrays if user asked
|
||||
for it explicitly, never if they just happen to
|
||||
@@ -867,8 +867,8 @@ insert_watchpoints_for_new_thread (ptid_
|
||||
CORE_ADDR addr;
|
||||
int len, type;
|
||||
|
||||
- addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
|
||||
- len = TYPE_LENGTH (VALUE_TYPE (v));
|
||||
+ addr = VALUE_ADDRESS (v) + value_offset (v);
|
||||
+ len = TYPE_LENGTH (value_type (v));
|
||||
type = hw_write;
|
||||
if (b->owner->type == bp_read_watchpoint)
|
||||
type = hw_read;
|
||||
@@ -2767,12 +2767,12 @@ mark_triggered_watchpoints (CORE_ADDR st
|
||||
|| b->type == bp_read_watchpoint
|
||||
|| b->type == bp_access_watchpoint)
|
||||
{
|
||||
- for (v = b->val_chain; v; v = v->next)
|
||||
+ for (v = b->val_chain; v; v = value_next (v))
|
||||
{
|
||||
if (VALUE_LVAL (v) == lval_memory
|
||||
- && ! VALUE_LAZY (v))
|
||||
+ && ! value_lazy (v))
|
||||
{
|
||||
- struct type *vtype = check_typedef (VALUE_TYPE (v));
|
||||
+ struct type *vtype = check_typedef (value_type (v));
|
||||
|
||||
if (v == b->val_chain
|
||||
|| (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
|
||||
@@ -2780,11 +2780,11 @@ mark_triggered_watchpoints (CORE_ADDR st
|
||||
{
|
||||
CORE_ADDR vaddr;
|
||||
|
||||
- vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
|
||||
+ vaddr = VALUE_ADDRESS (v) + value_offset (v);
|
||||
/* Exact match not required. Within range is
|
||||
sufficient. */
|
||||
if (addr >= vaddr &&
|
||||
- addr < vaddr + TYPE_LENGTH (VALUE_TYPE (v)))
|
||||
+ addr < vaddr + TYPE_LENGTH (value_type (v)))
|
||||
b->watchpoint_triggered = 1;
|
||||
}
|
||||
}
|
||||
@@ -2957,12 +2957,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
|
||||
bs->stop = 0;
|
||||
continue;
|
||||
}
|
||||
- for (v = b->val_chain; v; v = v->next)
|
||||
+ for (v = b->val_chain; v; v = value_next (v))
|
||||
{
|
||||
if (VALUE_LVAL (v) == lval_memory
|
||||
- && ! VALUE_LAZY (v))
|
||||
+ && ! value_lazy (v))
|
||||
{
|
||||
- struct type *vtype = check_typedef (VALUE_TYPE (v));
|
||||
+ struct type *vtype = check_typedef (value_type (v));
|
||||
|
||||
if (v == b->val_chain
|
||||
|| (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
|
||||
@@ -2970,11 +2970,11 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
|
||||
{
|
||||
CORE_ADDR vaddr;
|
||||
|
||||
- vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
|
||||
+ vaddr = VALUE_ADDRESS (v) + value_offset (v);
|
||||
/* Exact match not required. Within range is
|
||||
sufficient. */
|
||||
if (addr >= vaddr &&
|
||||
- addr < vaddr + TYPE_LENGTH (VALUE_TYPE (v)))
|
||||
+ addr < vaddr + TYPE_LENGTH (value_type (v)))
|
||||
must_check_value = 1;
|
||||
}
|
||||
}
|
||||
@@ -4118,7 +4118,8 @@ describe_other_breakpoints (CORE_ADDR pc
|
||||
/* Look at each value on the value chain. */
|
||||
- for (; v; v = next)
|
||||
+ for (; v; v = value_next (v))
|
||||
{
|
||||
/* If it's a memory location, and GDB actually needed
|
||||
its contents to evaluate the expression, then we
|
||||
@@ -3882,7 +3882,8 @@ describe_other_breakpoints (CORE_ADDR pc
|
||||
printf_filtered (" (thread %d)", b->thread);
|
||||
printf_filtered ("%s%s ",
|
||||
((b->enable_state == bp_disabled ||
|
||||
@ -1030,7 +955,7 @@ Index: gdb-6.7.1/gdb/breakpoint.c
|
||||
? " (disabled)"
|
||||
: b->enable_state == bp_permanent
|
||||
? " (permanent)"
|
||||
@@ -4773,6 +4774,62 @@ disable_breakpoints_in_unloaded_shlib (s
|
||||
@@ -4534,6 +4535,62 @@ disable_breakpoints_in_unloaded_shlib (s
|
||||
}
|
||||
}
|
||||
|
||||
@ -1091,13 +1016,13 @@ Index: gdb-6.7.1/gdb/breakpoint.c
|
||||
+
|
||||
+
|
||||
static void
|
||||
solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
|
||||
char *cond_string, enum bptype bp_kind)
|
||||
Index: gdb-6.7.1/gdb/solib.c
|
||||
create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
|
||||
enum bptype bp_kind)
|
||||
Index: gdb-6.7.50.20080227/gdb/solib.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/solib.c 2007-08-23 20:08:38.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/solib.c 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -78,6 +78,8 @@ set_solib_ops (struct gdbarch *gdbarch,
|
||||
--- gdb-6.7.50.20080227.orig/gdb/solib.c 2008-01-07 16:19:58.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/solib.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -79,6 +79,8 @@ set_solib_ops (struct gdbarch *gdbarch,
|
||||
|
||||
/* external data declarations */
|
||||
|
||||
@ -1106,7 +1031,7 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
/* FIXME: gdbarch needs to control this variable, or else every
|
||||
configuration needs to call set_solib_ops. */
|
||||
struct target_so_ops *current_target_so_ops;
|
||||
@@ -105,6 +107,8 @@ The search path for loading non-absolute
|
||||
@@ -102,6 +104,8 @@ The search path for loading non-absolute
|
||||
value);
|
||||
}
|
||||
|
||||
@ -1115,7 +1040,7 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
/*
|
||||
|
||||
GLOBAL FUNCTION
|
||||
@@ -394,7 +398,6 @@ free_so (struct so_list *so)
|
||||
@@ -391,7 +395,6 @@ free_so (struct so_list *so)
|
||||
xfree (so);
|
||||
}
|
||||
|
||||
@ -1123,7 +1048,7 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
/* Return address of first so_list entry in master shared object list. */
|
||||
struct so_list *
|
||||
master_so_list (void)
|
||||
@@ -402,7 +405,6 @@ master_so_list (void)
|
||||
@@ -399,7 +402,6 @@ master_so_list (void)
|
||||
return so_list_head;
|
||||
}
|
||||
|
||||
@ -1131,7 +1056,7 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
/* A small stub to get us past the arg-passing pinhole of catch_errors. */
|
||||
|
||||
static int
|
||||
@@ -414,15 +416,40 @@ symbol_add_stub (void *arg)
|
||||
@@ -411,15 +413,40 @@ symbol_add_stub (void *arg)
|
||||
/* Have we already loaded this shared object? */
|
||||
ALL_OBJFILES (so->objfile)
|
||||
{
|
||||
@ -1175,18 +1100,18 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
free_section_addr_info (sap);
|
||||
|
||||
return (1);
|
||||
@@ -550,6 +577,10 @@ update_solib_list (int from_tty, struct
|
||||
the inferior's current list. */
|
||||
while (i)
|
||||
{
|
||||
+ if (debug_solib)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "update_solib_list: compare gdb:%s and inferior:%s\n",
|
||||
+ gdb->so_original_name, i->so_original_name);
|
||||
if (! strcmp (gdb->so_original_name, i->so_original_name))
|
||||
break;
|
||||
|
||||
@@ -603,28 +634,7 @@ update_solib_list (int from_tty, struct
|
||||
@@ -545,6 +572,10 @@ update_solib_list (int from_tty, struct
|
||||
}
|
||||
else
|
||||
{
|
||||
+ if (debug_solib)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "update_solib_list: compare gdb:%s and inferior:%s\n",
|
||||
+ gdb->so_original_name, i->so_original_name);
|
||||
if (! strcmp (gdb->so_original_name, i->so_original_name))
|
||||
break;
|
||||
}
|
||||
@@ -599,28 +630,7 @@ update_solib_list (int from_tty, struct
|
||||
/* Fill in the rest of each of the `struct so_list' nodes. */
|
||||
for (i = inferior; i; i = i->next)
|
||||
{
|
||||
@ -1216,7 +1141,7 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
|
||||
/* Notify any observer that the shared object has been
|
||||
loaded now that we've added it to GDB's tables. */
|
||||
@@ -720,6 +730,41 @@ solib_add (char *pattern, int from_tty,
|
||||
@@ -716,6 +726,41 @@ solib_add (char *pattern, int from_tty,
|
||||
}
|
||||
}
|
||||
|
||||
@ -1258,7 +1183,7 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
|
||||
/*
|
||||
|
||||
@@ -1045,4 +1090,12 @@ This takes precedence over the environme
|
||||
@@ -1035,4 +1080,12 @@ This takes precedence over the environme
|
||||
reload_shared_libraries,
|
||||
show_solib_search_path,
|
||||
&setlist, &showlist);
|
||||
@ -1271,11 +1196,11 @@ Index: gdb-6.7.1/gdb/solib.c
|
||||
+ NULL, NULL,
|
||||
+ &setdebuglist, &showdebuglist);
|
||||
}
|
||||
Index: gdb-6.7.1/gdb/elfread.c
|
||||
Index: gdb-6.7.50.20080227/gdb/elfread.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/elfread.c 2007-08-23 20:08:28.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/elfread.c 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -611,7 +611,7 @@ elf_symfile_read (struct objfile *objfil
|
||||
--- gdb-6.7.50.20080227.orig/gdb/elfread.c 2008-01-01 23:53:09.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/elfread.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -644,7 +644,7 @@ elf_symfile_read (struct objfile *objfil
|
||||
/* If we are reinitializing, or if we have never loaded syms yet,
|
||||
set table to empty. MAINLINE is cleared so that *_read_psymtab
|
||||
functions do not all also re-initialize the psymbol table. */
|
||||
@ -1284,11 +1209,11 @@ Index: gdb-6.7.1/gdb/elfread.c
|
||||
{
|
||||
init_psymbol_list (objfile, 0);
|
||||
mainline = 0;
|
||||
Index: gdb-6.7.1/gdb/Makefile.in
|
||||
Index: gdb-6.7.50.20080227/gdb/Makefile.in
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/Makefile.in 2007-11-02 15:24:10.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/Makefile.in 2007-11-02 15:24:19.000000000 +0100
|
||||
@@ -1819,7 +1819,7 @@ amd64-tdep.o: amd64-tdep.c $(defs_h) $(a
|
||||
--- gdb-6.7.50.20080227.orig/gdb/Makefile.in 2008-02-27 08:57:20.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/Makefile.in 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -1914,7 +1914,7 @@ amd64-tdep.o: amd64-tdep.c $(defs_h) $(a
|
||||
$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
|
||||
$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
|
||||
$(regset_h) $(symfile_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||
@ -1297,10 +1222,10 @@ Index: gdb-6.7.1/gdb/Makefile.in
|
||||
annotate.o: annotate.c $(defs_h) $(annotate_h) $(value_h) $(target_h) \
|
||||
$(gdbtypes_h) $(breakpoint_h)
|
||||
arch-utils.o: arch-utils.c $(defs_h) $(arch_utils_h) $(buildsym_h) \
|
||||
Index: gdb-6.7.1/gdb/amd64-tdep.c
|
||||
Index: gdb-6.7.50.20080227/gdb/amd64-tdep.c
|
||||
===================================================================
|
||||
--- gdb-6.7.1.orig/gdb/amd64-tdep.c 2007-11-02 15:21:46.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/amd64-tdep.c 2007-11-02 15:24:19.000000000 +0100
|
||||
--- gdb-6.7.50.20080227.orig/gdb/amd64-tdep.c 2008-02-27 08:57:19.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/amd64-tdep.c 2008-02-27 08:57:31.000000000 +0100
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "symfile.h"
|
||||
#include "dwarf2-frame.h"
|
||||
@ -1309,7 +1234,7 @@ Index: gdb-6.7.1/gdb/amd64-tdep.c
|
||||
|
||||
#include "amd64-tdep.h"
|
||||
#include "i387-tdep.h"
|
||||
@@ -734,16 +735,28 @@ amd64_alloc_frame_cache (void)
|
||||
@@ -731,16 +732,28 @@ amd64_alloc_frame_cache (void)
|
||||
Any function that doesn't start with this sequence will be assumed
|
||||
to have no prologue and thus no valid frame pointer in %rbp. */
|
||||
|
||||
@ -1342,7 +1267,7 @@ Index: gdb-6.7.1/gdb/amd64-tdep.c
|
||||
|
||||
op = read_memory_unsigned_integer (pc, 1);
|
||||
|
||||
@@ -756,18 +769,57 @@ amd64_analyze_prologue (CORE_ADDR pc, CO
|
||||
@@ -753,18 +766,57 @@ amd64_analyze_prologue (CORE_ADDR pc, CO
|
||||
|
||||
/* If that's all, return now. */
|
||||
if (current_pc <= pc + 1)
|
||||
|
@ -1,99 +0,0 @@
|
||||
2004-10-26 Andrew Cagney <cagney@gnu.org>
|
||||
|
||||
* blockframe.c (find_pc_function): Use find_pc_section to find the
|
||||
pc's section.
|
||||
* block.c, symfile.c: Ditto.
|
||||
|
||||
*** ./gdb/blockframe.c.1 2004-10-26 21:21:46.517866240 -0400
|
||||
--- ./gdb/blockframe.c 2004-10-26 21:24:16.345089040 -0400
|
||||
***************
|
||||
*** 288,294 ****
|
||||
struct symbol *
|
||||
find_pc_function (CORE_ADDR pc)
|
||||
{
|
||||
! return find_pc_sect_function (pc, find_pc_mapped_section (pc));
|
||||
}
|
||||
|
||||
/* These variables are used to cache the most recent result
|
||||
--- 288,311 ----
|
||||
struct symbol *
|
||||
find_pc_function (CORE_ADDR pc)
|
||||
{
|
||||
! struct bfd_section *section;
|
||||
! struct symbol *symbol;
|
||||
! /* To ensure that the symbol returned belongs to the correct setion
|
||||
! (and that the last [random] symbol from the previous section
|
||||
! isn't returned) try to find the section containing PC. First try
|
||||
! the overlay code (which by default returns NULL); and second try
|
||||
! the normal section code (which almost always succeeds). */
|
||||
! section = find_pc_overlay (pc);
|
||||
! if (section == NULL)
|
||||
! {
|
||||
! struct obj_section *obj_section = find_pc_section (pc);
|
||||
! if (obj_section == NULL)
|
||||
! section = NULL;
|
||||
! else
|
||||
! section = obj_section->the_bfd_section;
|
||||
! }
|
||||
! symbol = find_pc_sect_function (pc, section);
|
||||
! return symbol;
|
||||
}
|
||||
|
||||
/* These variables are used to cache the most recent result
|
||||
--- ./gdb/symtab.c.1 2004-10-26 22:47:13.650423616 -0400
|
||||
+++ ./gdb/symtab.c 2004-10-26 22:50:10.239577984 -0400
|
||||
@@ -2176,7 +2176,20 @@
|
||||
{
|
||||
asection *section;
|
||||
|
||||
+ /* To ensure that the symbol returned belongs to the correct setion
|
||||
+ (and that the last [random] symbol from the previous section
|
||||
+ isn't returned) try to find the section containing PC. First try
|
||||
+ the overlay code (which by default returns NULL); and second try
|
||||
+ the normal section code (which almost always succeeds). */
|
||||
section = find_pc_overlay (pc);
|
||||
+ if (section == NULL)
|
||||
+ {
|
||||
+ struct obj_section *obj_section = find_pc_section (pc);
|
||||
+ if (obj_section == NULL)
|
||||
+ section = NULL;
|
||||
+ else
|
||||
+ section = obj_section->the_bfd_section;
|
||||
+ }
|
||||
if (pc_in_unmapped_range (pc, section))
|
||||
pc = overlay_mapped_address (pc, section);
|
||||
return find_pc_sect_line (pc, section, notcurrent);
|
||||
--- ./gdb/block.c.1 2004-10-27 00:22:56.881319808 -0400
|
||||
+++ ./gdb/block.c 2004-10-27 00:24:17.364084568 -0400
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "symfile.h"
|
||||
#include "gdb_obstack.h"
|
||||
#include "cp-support.h"
|
||||
+#include "objfiles.h"
|
||||
|
||||
/* This is used by struct block to store namespace-related info for
|
||||
C++ files, namely using declarations and the current namespace in
|
||||
@@ -153,7 +154,22 @@
|
||||
struct block *
|
||||
block_for_pc (CORE_ADDR pc)
|
||||
{
|
||||
- return block_for_pc_sect (pc, find_pc_mapped_section (pc));
|
||||
+ struct bfd_section *section;
|
||||
+ /* To ensure that the symbol returned belongs to the correct setion
|
||||
+ (and that the last [random] symbol from the previous section
|
||||
+ isn't returned) try to find the section containing PC. First try
|
||||
+ the overlay code (which by default returns NULL); and second try
|
||||
+ the normal section code (which almost always succeeds). */
|
||||
+ section = find_pc_overlay (pc);
|
||||
+ if (section == NULL)
|
||||
+ {
|
||||
+ struct obj_section *obj_section = find_pc_section (pc);
|
||||
+ if (obj_section == NULL)
|
||||
+ section = NULL;
|
||||
+ else
|
||||
+ section = obj_section->the_bfd_section;
|
||||
+ }
|
||||
+ return block_for_pc_sect (pc, section);
|
||||
}
|
||||
|
||||
/* Now come some functions designed to deal with C++ namespace issues.
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,861 +0,0 @@
|
||||
2005-02-28 Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* config/i386/nm-linux.h: Change dr register routines to
|
||||
accept a ptid_t first argument. Change all calling macros
|
||||
to default the inferior_ptid for the first argument.
|
||||
(i386_linux_insert_watchpoint): New prototype.
|
||||
(i386_linux_remove_watchpoint, i386_linux_insert_hw_breakpoint): Ditto.
|
||||
(i386_linux_remove_hw_breakpoint): Ditto.
|
||||
(target_insert_watchpoint, target_remove_watchpoint): Undef and
|
||||
override.
|
||||
(target_insert_hw_breakpoint, target_remove_hw_breakpoint): Ditto.
|
||||
* config/i386/nm-linux64.h: Ditto except add amd64 versions of
|
||||
the watchpoint/hw-breakpoint insert/remove routines.
|
||||
* i386-nat.c: Include "inferior.h" to define inferior_ptid.
|
||||
* i386-linux-nat.c: Change all dr get/set routines to accept
|
||||
ptid_t as first argument and to use this argument to determine
|
||||
the tid for PTRACE.
|
||||
(i386_linux_set_debug_regs_for_thread): New function.
|
||||
(i386_linux_sync_debug_registers_callback): Ditto.
|
||||
(i386_linux_sync_debug_registers_across_threads): Ditto.
|
||||
(i386_linux_insert_watchpoint, i386_linux_remove_watchpoint): Ditto.
|
||||
(i386_linux_hw_breakpoint, i386_linux_remove_hw_breakpoint): Ditto.
|
||||
(i386_linux_new_thread): Ditto.
|
||||
(_initialize_i386_linux_nat): Ditto.
|
||||
* amd64-linux-nat.c: Change all dr get/set routines to accept
|
||||
ptid_t as first argument and to use this argument to determine
|
||||
the tid for PTRACE.
|
||||
(amd64_linux_set_debug_regs_for_thread): New function.
|
||||
(amd64_linux_sync_debug_registers_callback): Ditto.
|
||||
(amd64_linux_sync_debug_registers_across_threads): Ditto.
|
||||
(amd64_linux_insert_watchpoint, amd64_linux_remove_watchpoint): Ditto.
|
||||
(amd64_linux_hw_breakpoint, amd64_linux_remove_hw_breakpoint): Ditto.
|
||||
(amd64_linux_new_thread): Ditto.
|
||||
(_initialize_amd64_linux_nat): Register linux new thread observer.
|
||||
* testsuite/gdb.threads/watchthreads2.c: New test case.
|
||||
* testsuite/gdb.threads/watchthreads2.exp: Ditto.
|
||||
|
||||
2007-10-14 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
Index: gdb-6.7/gdb/config/i386/nm-linux64.h
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/config/i386/nm-linux64.h 2007-08-23 20:08:48.000000000 +0200
|
||||
+++ gdb-6.7/gdb/config/i386/nm-linux64.h 2007-10-14 23:41:50.000000000 +0200
|
||||
@@ -33,20 +33,58 @@
|
||||
|
||||
/* Provide access to the i386 hardware debugging registers. */
|
||||
|
||||
-extern void amd64_linux_dr_set_control (unsigned long control);
|
||||
+extern void amd64_linux_dr_set_control (ptid_t ptid, unsigned long control);
|
||||
#define I386_DR_LOW_SET_CONTROL(control) \
|
||||
- amd64_linux_dr_set_control (control)
|
||||
+ amd64_linux_dr_set_control (inferior_ptid, control)
|
||||
|
||||
-extern void amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr);
|
||||
+extern void amd64_linux_dr_set_addr (ptid_t ptid, int regnum, CORE_ADDR addr);
|
||||
#define I386_DR_LOW_SET_ADDR(regnum, addr) \
|
||||
- amd64_linux_dr_set_addr (regnum, addr)
|
||||
+ amd64_linux_dr_set_addr (inferior_ptid, regnum, addr)
|
||||
|
||||
-extern void amd64_linux_dr_reset_addr (int regnum);
|
||||
+extern void amd64_linux_dr_reset_addr (ptid_t ptid, int regnum);
|
||||
#define I386_DR_LOW_RESET_ADDR(regnum) \
|
||||
- amd64_linux_dr_reset_addr (regnum)
|
||||
+ amd64_linux_dr_reset_addr (inferior_ptid, regnum)
|
||||
|
||||
-extern unsigned long amd64_linux_dr_get_status (void);
|
||||
+extern unsigned long amd64_linux_dr_get_status (ptid_t ptid);
|
||||
#define I386_DR_LOW_GET_STATUS() \
|
||||
- amd64_linux_dr_get_status ()
|
||||
+ amd64_linux_dr_get_status (inferior_ptid)
|
||||
+
|
||||
+/* Watchpoints and hardware breakpoints. */
|
||||
+
|
||||
+/* Insert a watchpoint to watch a memory region which starts at
|
||||
+ * * address ADDR and whose length is LEN bytes. Watch memory accesses
|
||||
+ * * of the type TYPE. Return 0 on success, -1 on failure. */
|
||||
+extern int amd64_linux_insert_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ * * address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ * * type TYPE. Return 0 on success, -1 on failure. */
|
||||
+extern int amd64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
+
|
||||
+/* Insert a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ * * unused. Return 0 on success, EBUSY on failure. */
|
||||
+extern int amd64_linux_insert_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
+
|
||||
+/* Remove a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ * * unused. Return 0 on success, -1 on failure. */
|
||||
+extern int amd64_linux_remove_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
+
|
||||
+/* Override basic amd64 macros for watchpoint and hardware breakpoint
|
||||
+ * insertion/removal to support threads. */
|
||||
+#undef target_insert_watchpoint
|
||||
+#define target_insert_watchpoint(addr, len, type) \
|
||||
+ amd64_linux_insert_watchpoint (addr, len, type)
|
||||
+
|
||||
+#undef target_remove_watchpoint
|
||||
+#define target_remove_watchpoint(addr, len, type) \
|
||||
+ amd64_linux_remove_watchpoint (addr, len, type)
|
||||
+
|
||||
+#undef target_insert_hw_breakpoint
|
||||
+#define target_insert_hw_breakpoint(bp_tgt) \
|
||||
+ amd64_linux_insert_hw_breakpoint (bp_tgt)
|
||||
+
|
||||
+#undef target_remove_hw_breakpoint
|
||||
+#define target_remove_hw_breakpoint(bp_tgt) \
|
||||
+ amd64_linux_remove_hw_breakpoint (bp_tgt)
|
||||
|
||||
#endif /* nm-linux64.h */
|
||||
Index: gdb-6.7/gdb/config/i386/nm-linux.h
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/config/i386/nm-linux.h 2007-08-23 20:08:48.000000000 +0200
|
||||
+++ gdb-6.7/gdb/config/i386/nm-linux.h 2007-10-14 23:40:55.000000000 +0200
|
||||
@@ -29,21 +29,60 @@
|
||||
|
||||
/* Provide access to the i386 hardware debugging registers. */
|
||||
|
||||
-extern void i386_linux_dr_set_control (unsigned long control);
|
||||
+extern void i386_linux_dr_set_control (ptid_t ptid, unsigned long control);
|
||||
#define I386_DR_LOW_SET_CONTROL(control) \
|
||||
- i386_linux_dr_set_control (control)
|
||||
+ i386_linux_dr_set_control (inferior_ptid, control)
|
||||
|
||||
-extern void i386_linux_dr_set_addr (int regnum, CORE_ADDR addr);
|
||||
+extern void i386_linux_dr_set_addr (ptid_t ptid, int regnum, CORE_ADDR addr);
|
||||
#define I386_DR_LOW_SET_ADDR(regnum, addr) \
|
||||
- i386_linux_dr_set_addr (regnum, addr)
|
||||
+ i386_linux_dr_set_addr (inferior_ptid, regnum, addr)
|
||||
|
||||
-extern void i386_linux_dr_reset_addr (int regnum);
|
||||
+extern void i386_linux_dr_reset_addr (ptid_t ptid, int regnum);
|
||||
#define I386_DR_LOW_RESET_ADDR(regnum) \
|
||||
- i386_linux_dr_reset_addr (regnum)
|
||||
+ i386_linux_dr_reset_addr (inferior_ptid, regnum)
|
||||
|
||||
-extern unsigned long i386_linux_dr_get_status (void);
|
||||
+extern unsigned long i386_linux_dr_get_status (ptid_t ptid);
|
||||
#define I386_DR_LOW_GET_STATUS() \
|
||||
- i386_linux_dr_get_status ()
|
||||
+ i386_linux_dr_get_status (inferior_ptid)
|
||||
+
|
||||
+/* Watchpoints and hardware breakpoints. */
|
||||
+
|
||||
+/* Insert a watchpoint to watch a memory region which starts at
|
||||
+ * address ADDR and whose length is LEN bytes. Watch memory accesses
|
||||
+ * of the type TYPE. Return 0 on success, -1 on failure. */
|
||||
+extern int i386_linux_insert_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ * address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ * type TYPE. Return 0 on success, -1 on failure. */
|
||||
+extern int i386_linux_remove_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
+
|
||||
+/* Insert a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ * unused. Return 0 on success, EBUSY on failure. */
|
||||
+extern int i386_linux_insert_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
+
|
||||
+/* Remove a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ * unused. Return 0 on success, -1 on failure. */
|
||||
+extern int i386_linux_remove_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
+
|
||||
+/* Override basic i386 macros for watchpoint and hardware breakpoint
|
||||
+ insertion/removal to support threads. */
|
||||
+#undef target_insert_watchpoint
|
||||
+#define target_insert_watchpoint(addr, len, type) \
|
||||
+ i386_linux_insert_watchpoint (addr, len, type)
|
||||
+
|
||||
+#undef target_remove_watchpoint
|
||||
+#define target_remove_watchpoint(addr, len, type) \
|
||||
+ i386_linux_remove_watchpoint (addr, len, type)
|
||||
+
|
||||
+#undef target_insert_hw_breakpoint
|
||||
+#define target_insert_hw_breakpoint(bp_tgt) \
|
||||
+ i386_linux_insert_hw_breakpoint (bp_tgt)
|
||||
+
|
||||
+#undef target_remove_hw_breakpoint
|
||||
+#define target_remove_hw_breakpoint(bp_tgt) \
|
||||
+ i386_linux_remove_hw_breakpoint (bp_tgt)
|
||||
+
|
||||
|
||||
|
||||
#ifdef HAVE_PTRACE_GETFPXREGS
|
||||
Index: gdb-6.7/gdb/i386-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/i386-nat.c 2007-08-23 20:08:34.000000000 +0200
|
||||
+++ gdb-6.7/gdb/i386-nat.c 2007-10-14 23:39:04.000000000 +0200
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "defs.h"
|
||||
#include "breakpoint.h"
|
||||
+#include "inferior.h"
|
||||
#include "command.h"
|
||||
#include "gdbcmd.h"
|
||||
|
||||
Index: gdb-6.7/gdb/testsuite/gdb.threads/watchthreads2.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/testsuite/gdb.threads/watchthreads2.c 2007-10-14 23:39:04.000000000 +0200
|
||||
@@ -0,0 +1,66 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2002, 2003, 2004, 2005 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.
|
||||
+
|
||||
+ This file is copied from schedlock.c. */
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <unistd.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <pthread.h>
|
||||
+
|
||||
+void *thread_function(void *arg); /* Pointer to function executed by each thread */
|
||||
+
|
||||
+#define NUM 5
|
||||
+
|
||||
+unsigned int args[NUM+1];
|
||||
+
|
||||
+int main() {
|
||||
+ int res;
|
||||
+ pthread_t threads[NUM];
|
||||
+ void *thread_result;
|
||||
+ long i;
|
||||
+
|
||||
+ for (i = 0; i < NUM; i++)
|
||||
+ {
|
||||
+ args[i] = 1; /* Init value. */
|
||||
+ res = pthread_create(&threads[i],
|
||||
+ NULL,
|
||||
+ thread_function,
|
||||
+ (void *) i);
|
||||
+ }
|
||||
+
|
||||
+ args[i] = 1;
|
||||
+ thread_function ((void *) i);
|
||||
+
|
||||
+ exit(EXIT_SUCCESS);
|
||||
+}
|
||||
+
|
||||
+void *thread_function(void *arg) {
|
||||
+ int my_number = (long) arg;
|
||||
+ int *myp = (int *) &args[my_number];
|
||||
+
|
||||
+ /* Don't run forever. Run just short of it :) */
|
||||
+ while (*myp > 0)
|
||||
+ {
|
||||
+ (*myp) ++; usleep (1); /* Loop increment. */
|
||||
+ }
|
||||
+
|
||||
+ pthread_exit(NULL);
|
||||
+}
|
||||
+
|
||||
Index: gdb-6.7/gdb/testsuite/gdb.threads/watchthreads2.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/testsuite/gdb.threads/watchthreads2.exp 2007-10-14 23:39:04.000000000 +0200
|
||||
@@ -0,0 +1,133 @@
|
||||
+# This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+# Copyright 2005 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 support multiple watchpoints across threads.
|
||||
+
|
||||
+if $tracelevel {
|
||||
+ strace $tracelevel
|
||||
+}
|
||||
+
|
||||
+set prms_id 0
|
||||
+set bug_id 0
|
||||
+
|
||||
+# This test verifies that a watchpoint is detected in the proper thread
|
||||
+# so the test is only meaningful on a system with hardware watchpoints.
|
||||
+if [target_info exists gdb,no_hardware_watchpoints] {
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+set testfile "watchthreads2"
|
||||
+set srcfile ${testfile}.c
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+gdb_test "set can-use-hw-watchpoints 1" "" ""
|
||||
+
|
||||
+#
|
||||
+# Run to `main' where we begin our tests.
|
||||
+#
|
||||
+
|
||||
+if ![runto_main] then {
|
||||
+ gdb_suppress_tests
|
||||
+}
|
||||
+
|
||||
+set args_2 0
|
||||
+set args_3 0
|
||||
+
|
||||
+gdb_breakpoint "thread_function"
|
||||
+gdb_continue_to_breakpoint "thread_function"
|
||||
+gdb_test "disable 2" ""
|
||||
+
|
||||
+gdb_test_multiple "p args\[2\]" "get initial args2" {
|
||||
+ -re "\\\$\[0-9\]* = (.*)$gdb_prompt $" {
|
||||
+ set init_args_2 $expect_out(1,string)
|
||||
+ pass "get initial args2"
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+gdb_test_multiple "p args\[3\]" "get initial args3" {
|
||||
+ -re "\\\$\[0-9\]* = (.*)$gdb_prompt $" {
|
||||
+ set init_args_3 $expect_out(1,string)
|
||||
+ pass "get initial args3"
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+set args_2 $init_args_2
|
||||
+set args_3 $init_args_3
|
||||
+
|
||||
+# Watch values that will be modified by distinct threads.
|
||||
+gdb_test "watch args\[2\]" "Hardware watchpoint 3: args\\\[2\\\]"
|
||||
+gdb_test "watch args\[3\]" "Hardware watchpoint 4: args\\\[3\\\]"
|
||||
+
|
||||
+set init_line [expr [gdb_get_line_number "Init value"]+1]
|
||||
+set inc_line [gdb_get_line_number "Loop increment"]
|
||||
+
|
||||
+# Loop and continue to allow both watchpoints to be triggered.
|
||||
+for {set i 0} {$i < 30} {incr i} {
|
||||
+ set test_flag 0
|
||||
+ gdb_test_multiple "continue" "threaded watch loop" {
|
||||
+ -re "Hardware watchpoint 3: args\\\[2\\\].*Old value = 0.*New value = 1.*main \\\(\\\) at .*watchthreads2.c:$init_line.*$gdb_prompt $"
|
||||
+ { set args_2 1; set test_flag 1 }
|
||||
+ -re "Hardware watchpoint 4: args\\\[3\\\].*Old value = 0.*New value = 1.*main \\\(\\\) at .*watchthreads2.c:$init_line.*$gdb_prompt $"
|
||||
+ { set args_3 1; set test_flag 1 }
|
||||
+ -re "Hardware watchpoint 3: args\\\[2\\\].*Old value = $args_2.*New value = [expr $args_2+1].*in thread_function \\\(arg=0x2\\\) at .*watchthreads2.c:$inc_line.*$gdb_prompt $"
|
||||
+ { set args_2 [expr $args_2+1]; set test_flag 1 }
|
||||
+ -re "Hardware watchpoint 4: args\\\[3\\\].*Old value = $args_3.*New value = [expr $args_3+1].*in thread_function \\\(arg=0x3\\\) at .*watchthreads2.c:$inc_line.*$gdb_prompt $"
|
||||
+ { set args_3 [expr $args_3+1]; set test_flag 1 }
|
||||
+ }
|
||||
+ # If we fail above, don't bother continuing loop
|
||||
+ if { $test_flag == 0 } {
|
||||
+ set i 30;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+# Print success message if loop succeeded.
|
||||
+if { $test_flag == 1 } {
|
||||
+ pass "threaded watch loop"
|
||||
+}
|
||||
+
|
||||
+# Verify that we hit first watchpoint in child thread.
|
||||
+set message "watchpoint on args\[2\] hit in thread"
|
||||
+if { $args_2 > 1 } {
|
||||
+ pass $message
|
||||
+} else {
|
||||
+ fail $message
|
||||
+}
|
||||
+
|
||||
+# Verify that we hit second watchpoint in child thread.
|
||||
+set message "watchpoint on args\[3\] hit in thread"
|
||||
+if { $args_3 > 1 } {
|
||||
+ pass $message
|
||||
+} else {
|
||||
+ fail $message
|
||||
+}
|
||||
+
|
||||
+# Verify that all watchpoint hits are accounted for.
|
||||
+set message "combination of threaded watchpoints = 30 + initial values"
|
||||
+if { [expr $args_2+$args_3] == [expr [expr 30+$init_args_2]+$init_args_3] } {
|
||||
+ pass $message
|
||||
+} else {
|
||||
+ fail $message
|
||||
+}
|
||||
Index: gdb-6.7/gdb/i386-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/i386-linux-nat.c 2007-10-13 05:09:50.000000000 +0200
|
||||
+++ gdb-6.7/gdb/i386-linux-nat.c 2007-10-14 23:39:04.000000000 +0200
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "inferior.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
+#include "observer.h"
|
||||
#include "target.h"
|
||||
#include "linux-nat.h"
|
||||
|
||||
@@ -580,14 +581,14 @@ i386_linux_store_inferior_registers (str
|
||||
/* Support for debug registers. */
|
||||
|
||||
static unsigned long
|
||||
-i386_linux_dr_get (int regnum)
|
||||
+i386_linux_dr_get (ptid_t ptid, int regnum)
|
||||
{
|
||||
int tid;
|
||||
unsigned long value;
|
||||
|
||||
- tid = TIDGET (inferior_ptid);
|
||||
+ tid = TIDGET (ptid);
|
||||
if (tid == 0)
|
||||
- tid = PIDGET (inferior_ptid);
|
||||
+ tid = PIDGET (ptid);
|
||||
|
||||
/* FIXME: kettenis/2001-03-27: Calling perror_with_name if the
|
||||
ptrace call fails breaks debugging remote targets. The correct
|
||||
@@ -608,13 +609,13 @@ i386_linux_dr_get (int regnum)
|
||||
}
|
||||
|
||||
static void
|
||||
-i386_linux_dr_set (int regnum, unsigned long value)
|
||||
+i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
|
||||
{
|
||||
int tid;
|
||||
|
||||
- tid = TIDGET (inferior_ptid);
|
||||
+ tid = TIDGET (ptid);
|
||||
if (tid == 0)
|
||||
- tid = PIDGET (inferior_ptid);
|
||||
+ tid = PIDGET (ptid);
|
||||
|
||||
errno = 0;
|
||||
ptrace (PTRACE_POKEUSER, tid,
|
||||
@@ -624,34 +625,158 @@ i386_linux_dr_set (int regnum, unsigned
|
||||
}
|
||||
|
||||
void
|
||||
-i386_linux_dr_set_control (unsigned long control)
|
||||
+i386_linux_dr_set_control (ptid_t ptid, unsigned long control)
|
||||
{
|
||||
- i386_linux_dr_set (DR_CONTROL, control);
|
||||
+ i386_linux_dr_set (ptid, DR_CONTROL, control);
|
||||
}
|
||||
|
||||
void
|
||||
-i386_linux_dr_set_addr (int regnum, CORE_ADDR addr)
|
||||
+i386_linux_dr_set_addr (ptid_t ptid, int regnum, CORE_ADDR addr)
|
||||
{
|
||||
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
|
||||
|
||||
- i386_linux_dr_set (DR_FIRSTADDR + regnum, addr);
|
||||
+ i386_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
|
||||
}
|
||||
|
||||
void
|
||||
-i386_linux_dr_reset_addr (int regnum)
|
||||
+i386_linux_dr_reset_addr (ptid_t ptid, int regnum)
|
||||
{
|
||||
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
|
||||
|
||||
- i386_linux_dr_set (DR_FIRSTADDR + regnum, 0L);
|
||||
+ i386_linux_dr_set (ptid, DR_FIRSTADDR + regnum, 0L);
|
||||
}
|
||||
|
||||
unsigned long
|
||||
-i386_linux_dr_get_status (void)
|
||||
+i386_linux_dr_get_status (ptid_t ptid)
|
||||
{
|
||||
- return i386_linux_dr_get (DR_STATUS);
|
||||
+ return i386_linux_dr_get (ptid, DR_STATUS);
|
||||
}
|
||||
|
||||
|
||||
+/* Structure used to sync debug registers for all threads. */
|
||||
+struct i386_debug_register_state
|
||||
+{
|
||||
+ int tid;
|
||||
+ CORE_ADDR addr[DR_LASTADDR - DR_FIRSTADDR + 1];
|
||||
+ unsigned long control;
|
||||
+};
|
||||
+
|
||||
+static void
|
||||
+i386_linux_set_debug_regs_for_thread (ptid_t ptid,
|
||||
+ struct i386_debug_register_state *dbs)
|
||||
+{
|
||||
+ int i;
|
||||
+ for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
+ i386_linux_dr_set_addr (ptid, i, dbs->addr[i]);
|
||||
+ i386_linux_dr_set_control (ptid, dbs->control);
|
||||
+}
|
||||
+
|
||||
+/* Iterator function to support syncing debug registers across all threads. */
|
||||
+static int
|
||||
+i386_linux_sync_debug_registers_callback (struct lwp_info *lwp, void *data)
|
||||
+{
|
||||
+ struct i386_debug_register_state *args = data;
|
||||
+ int i, tid;
|
||||
+
|
||||
+ tid = TIDGET (lwp->ptid);
|
||||
+ if (tid == 0)
|
||||
+ tid = PIDGET (lwp->ptid);
|
||||
+
|
||||
+ if (tid != args->tid)
|
||||
+ i386_linux_set_debug_regs_for_thread (lwp->ptid, args);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* Sync the debug registers for all known threads to the current
|
||||
+ thread that has just performed an operation. This is required
|
||||
+ because the debug registers are thread-specific. We want
|
||||
+ watchpoints and hardware breakpoints to be treated globally
|
||||
+ across all threads. */
|
||||
+static int
|
||||
+i386_linux_sync_debug_registers_across_threads (void)
|
||||
+{
|
||||
+ int i, tid;
|
||||
+ struct i386_debug_register_state args;
|
||||
+
|
||||
+ tid = TIDGET (inferior_ptid);
|
||||
+ if (tid == 0)
|
||||
+ tid = PIDGET (inferior_ptid);
|
||||
+
|
||||
+ args.tid = tid;
|
||||
+ for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
+ args.addr[i] = i386_linux_dr_get (inferior_ptid, DR_FIRSTADDR + i);
|
||||
+ args.control = i386_linux_dr_get (inferior_ptid, DR_CONTROL);
|
||||
+
|
||||
+ iterate_over_lwps (&i386_linux_sync_debug_registers_callback, &args);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* Insert a watchpoint to watch a memory region which starts at
|
||||
+ address ADDR and whose length is LEN bytes. Watch memory accesses
|
||||
+ of the type TYPE. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+i386_linux_insert_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_insert_watchpoint (addr, len, type);
|
||||
+ if (!rc)
|
||||
+ i386_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ type TYPE. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+i386_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_remove_watchpoint (addr, len, type);
|
||||
+ if (!rc)
|
||||
+ i386_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Insert a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ unused. Return 0 on success, EBUSY on failure. */
|
||||
+int
|
||||
+i386_linux_insert_hw_breakpoint (struct bp_target_info *bp_tgt)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_insert_hw_breakpoint (bp_tgt);
|
||||
+ if (!rc)
|
||||
+ i386_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Remove a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ unused. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+i386_linux_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_remove_hw_breakpoint (bp_tgt);
|
||||
+ if (!rc)
|
||||
+ i386_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Observer function for a new thread attach. We need to insert
|
||||
+ existing watchpoints and hardware breakpoints on the new thread. */
|
||||
+static void
|
||||
+i386_linux_new_thread (ptid_t ptid)
|
||||
+{
|
||||
+ int i;
|
||||
+ struct i386_debug_register_state dbs;
|
||||
+
|
||||
+ for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
+ dbs.addr[i] = i386_linux_dr_get (inferior_ptid, DR_FIRSTADDR + i);
|
||||
+ dbs.control = i386_linux_dr_get (inferior_ptid, DR_CONTROL);
|
||||
+
|
||||
+ i386_linux_set_debug_regs_for_thread (ptid, &dbs);
|
||||
+}
|
||||
+
|
||||
/* Called by libthread_db. Returns a pointer to the thread local
|
||||
storage (or its descriptor). */
|
||||
|
||||
@@ -816,4 +941,6 @@ _initialize_i386_linux_nat (void)
|
||||
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
+
|
||||
+ observer_attach_linux_new_thread (i386_linux_new_thread);
|
||||
}
|
||||
Index: gdb-6.7/gdb/amd64-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/amd64-linux-nat.c 2007-10-13 05:09:50.000000000 +0200
|
||||
+++ gdb-6.7/gdb/amd64-linux-nat.c 2007-10-14 23:39:04.000000000 +0200
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "inferior.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
+#include "observer.h"
|
||||
#include "linux-nat.h"
|
||||
#include "amd64-linux-tdep.h"
|
||||
|
||||
@@ -235,14 +236,14 @@ amd64_linux_store_inferior_registers (st
|
||||
|
||||
|
||||
static unsigned long
|
||||
-amd64_linux_dr_get (int regnum)
|
||||
+amd64_linux_dr_get (ptid_t ptid, int regnum)
|
||||
{
|
||||
int tid;
|
||||
unsigned long value;
|
||||
|
||||
- tid = TIDGET (inferior_ptid);
|
||||
+ tid = TIDGET (ptid);
|
||||
if (tid == 0)
|
||||
- tid = PIDGET (inferior_ptid);
|
||||
+ tid = PIDGET (ptid);
|
||||
|
||||
/* FIXME: kettenis/2001-03-27: Calling perror_with_name if the
|
||||
ptrace call fails breaks debugging remote targets. The correct
|
||||
@@ -263,13 +264,13 @@ amd64_linux_dr_get (int regnum)
|
||||
}
|
||||
|
||||
static void
|
||||
-amd64_linux_dr_set (int regnum, unsigned long value)
|
||||
+amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
|
||||
{
|
||||
int tid;
|
||||
|
||||
- tid = TIDGET (inferior_ptid);
|
||||
+ tid = TIDGET (ptid);
|
||||
if (tid == 0)
|
||||
- tid = PIDGET (inferior_ptid);
|
||||
+ tid = PIDGET (ptid);
|
||||
|
||||
errno = 0;
|
||||
ptrace (PT_WRITE_U, tid, offsetof (struct user, u_debugreg[regnum]), value);
|
||||
@@ -278,34 +279,158 @@ amd64_linux_dr_set (int regnum, unsigned
|
||||
}
|
||||
|
||||
void
|
||||
-amd64_linux_dr_set_control (unsigned long control)
|
||||
+amd64_linux_dr_set_control (ptid_t ptid, unsigned long control)
|
||||
{
|
||||
- amd64_linux_dr_set (DR_CONTROL, control);
|
||||
+ amd64_linux_dr_set (ptid, DR_CONTROL, control);
|
||||
}
|
||||
|
||||
void
|
||||
-amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr)
|
||||
+amd64_linux_dr_set_addr (ptid_t ptid, int regnum, CORE_ADDR addr)
|
||||
{
|
||||
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
|
||||
|
||||
- amd64_linux_dr_set (DR_FIRSTADDR + regnum, addr);
|
||||
+ amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
|
||||
}
|
||||
|
||||
void
|
||||
-amd64_linux_dr_reset_addr (int regnum)
|
||||
+amd64_linux_dr_reset_addr (ptid_t ptid, int regnum)
|
||||
{
|
||||
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
|
||||
|
||||
- amd64_linux_dr_set (DR_FIRSTADDR + regnum, 0L);
|
||||
+ amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, 0L);
|
||||
}
|
||||
|
||||
unsigned long
|
||||
-amd64_linux_dr_get_status (void)
|
||||
+amd64_linux_dr_get_status (ptid_t ptid)
|
||||
{
|
||||
- return amd64_linux_dr_get (DR_STATUS);
|
||||
+ return amd64_linux_dr_get (ptid, DR_STATUS);
|
||||
}
|
||||
|
||||
|
||||
+/* Structure used to sync debug registers for all threads. */
|
||||
+struct amd64_debug_register_state
|
||||
+{
|
||||
+ int tid;
|
||||
+ CORE_ADDR addr[DR_LASTADDR - DR_FIRSTADDR + 1];
|
||||
+ unsigned long control;
|
||||
+};
|
||||
+
|
||||
+static void
|
||||
+amd64_linux_set_debug_regs_for_thread (ptid_t ptid,
|
||||
+ struct amd64_debug_register_state *dbs)
|
||||
+{
|
||||
+ int i;
|
||||
+ for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
+ amd64_linux_dr_set_addr (ptid, i, dbs->addr[i]);
|
||||
+ amd64_linux_dr_set_control (ptid, dbs->control);
|
||||
+}
|
||||
+
|
||||
+/* Iterator function to support syncing debug registers across all threads. */
|
||||
+static int
|
||||
+amd64_linux_sync_debug_registers_callback (struct lwp_info *lwp, void *data)
|
||||
+{
|
||||
+ struct amd64_debug_register_state *args = data;
|
||||
+ int i, tid;
|
||||
+
|
||||
+ tid = TIDGET (lwp->ptid);
|
||||
+ if (tid == 0)
|
||||
+ tid = PIDGET (lwp->ptid);
|
||||
+
|
||||
+ if (tid != args->tid)
|
||||
+ amd64_linux_set_debug_regs_for_thread (lwp->ptid, args);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* Sync the debug registers for all known threads to the current
|
||||
+ thread that has just performed an operation. This is required
|
||||
+ because the debug registers are thread-specific. We want
|
||||
+ watchpoints and hardware breakpoints to be treated globally
|
||||
+ across all threads. */
|
||||
+static int
|
||||
+amd64_linux_sync_debug_registers_across_threads (void)
|
||||
+{
|
||||
+ int i, tid;
|
||||
+ struct amd64_debug_register_state args;
|
||||
+
|
||||
+ tid = TIDGET (inferior_ptid);
|
||||
+ if (tid == 0)
|
||||
+ tid = PIDGET (inferior_ptid);
|
||||
+
|
||||
+ args.tid = tid;
|
||||
+ for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
+ args.addr[i] = amd64_linux_dr_get (inferior_ptid, DR_FIRSTADDR + i);
|
||||
+ args.control = amd64_linux_dr_get (inferior_ptid, DR_CONTROL);
|
||||
+
|
||||
+ iterate_over_lwps (&amd64_linux_sync_debug_registers_callback, &args);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* Insert a watchpoint to watch a memory region which starts at
|
||||
+ address ADDR and whose length is LEN bytes. Watch memory accesses
|
||||
+ of the type TYPE. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+amd64_linux_insert_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_insert_watchpoint (addr, len, type);
|
||||
+ if (!rc)
|
||||
+ amd64_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ type TYPE. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+amd64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_remove_watchpoint (addr, len, type);
|
||||
+ if (!rc)
|
||||
+ amd64_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Insert a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ unused. Return 0 on success, EBUSY on failure. */
|
||||
+int
|
||||
+amd64_linux_insert_hw_breakpoint (struct bp_target_info *bp_tgt)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_insert_hw_breakpoint (bp_tgt);
|
||||
+ if (!rc)
|
||||
+ amd64_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Remove a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
+ unused. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+amd64_linux_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
|
||||
+{
|
||||
+ int rc;
|
||||
+ rc = i386_remove_hw_breakpoint (bp_tgt);
|
||||
+ if (!rc)
|
||||
+ amd64_linux_sync_debug_registers_across_threads ();
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* Observer function for a new thread attach. We need to insert
|
||||
+ existing watchpoints and hardware breakpoints on the new thread. */
|
||||
+static void
|
||||
+amd64_linux_new_thread (ptid_t ptid)
|
||||
+{
|
||||
+ int i;
|
||||
+ struct amd64_debug_register_state dbs;
|
||||
+
|
||||
+ for (i = 0; i < (DR_LASTADDR - DR_FIRSTADDR) + 1; ++i)
|
||||
+ dbs.addr[i] = amd64_linux_dr_get (inferior_ptid, DR_FIRSTADDR + i);
|
||||
+ dbs.control = amd64_linux_dr_get (inferior_ptid, DR_CONTROL);
|
||||
+
|
||||
+ amd64_linux_set_debug_regs_for_thread (ptid, &dbs);
|
||||
+}
|
||||
+
|
||||
/* This function is called by libthread_db as part of its handling of
|
||||
a request for a thread's local storage address. */
|
||||
|
||||
@@ -406,4 +531,6 @@ _initialize_amd64_linux_nat (void)
|
||||
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
+
|
||||
+ observer_attach_linux_new_thread (amd64_linux_new_thread);
|
||||
}
|
||||
Index: gdb-6.7/gdb/testsuite/gdb.threads/watchthreads.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/testsuite/gdb.threads/watchthreads.c 2007-08-23 20:08:50.000000000 +0200
|
||||
+++ gdb-6.7/gdb/testsuite/gdb.threads/watchthreads.c 2007-10-14 23:39:04.000000000 +0200
|
||||
@@ -56,7 +56,7 @@ void *thread_function(void *arg) {
|
||||
/* Don't run forever. Run just short of it :) */
|
||||
while (*myp > 0)
|
||||
{
|
||||
- (*myp) ++; /* Loop increment. */
|
||||
+ (*myp) ++; usleep (1); /* Loop increment. */
|
||||
}
|
||||
|
||||
pthread_exit(NULL);
|
@ -1,6 +1,5 @@
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=181390
|
||||
|
||||
|
||||
2006-09-28 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb/utils.c (paddress): Disable cutting of the printed addresses
|
||||
@ -9,15 +8,16 @@ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=181390
|
||||
(value_as_address): New `value_as_address' wrapper - cut memory address
|
||||
to the target's address bit size, bugreport by John Reiser.
|
||||
|
||||
2008-03-02 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Index: gdb-6.5/gdb/utils.c
|
||||
Port to GDB-6.8pre.
|
||||
New testcase `gdb.arch/amd64-i386-address.exp'.
|
||||
|
||||
Index: gdb-6.7.50.20080227/gdb/utils.c
|
||||
===================================================================
|
||||
RCS file: /cvs/src/src/gdb/utils.c,v
|
||||
retrieving revision 1.169
|
||||
diff -u -p -r1.169 utils.c
|
||||
--- gdb-6.5.orig/gdb/utils.c 21 Sep 2006 13:50:51 -0000 1.169
|
||||
+++ gdb-6.5/gdb/utils.c 28 Sep 2006 17:06:03 -0000
|
||||
@@ -2596,6 +2596,14 @@ paddr_nz (CORE_ADDR addr)
|
||||
--- gdb-6.7.50.20080227.orig/gdb/utils.c 2008-03-02 14:28:44.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/utils.c 2008-03-02 14:35:09.000000000 +0100
|
||||
@@ -2540,6 +2540,14 @@ paddr_nz (CORE_ADDR addr)
|
||||
const char *
|
||||
paddress (CORE_ADDR addr)
|
||||
{
|
||||
@ -32,7 +32,7 @@ diff -u -p -r1.169 utils.c
|
||||
/* Truncate address to the size of a target address, avoiding shifts
|
||||
larger or equal than the width of a CORE_ADDR. The local
|
||||
variable ADDR_BIT stops the compiler reporting a shift overflow
|
||||
@@ -2609,6 +2617,8 @@ paddress (CORE_ADDR addr)
|
||||
@@ -2553,6 +2561,8 @@ paddress (CORE_ADDR addr)
|
||||
|
||||
if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
|
||||
addr &= ((CORE_ADDR) 1 << addr_bit) - 1;
|
||||
@ -41,30 +41,26 @@ diff -u -p -r1.169 utils.c
|
||||
return hex_string (addr);
|
||||
}
|
||||
|
||||
Index: gdb-6.5/gdb/value.c
|
||||
Index: gdb-6.7.50.20080227/gdb/value.c
|
||||
===================================================================
|
||||
RCS file: /cvs/src/src/gdb/value.c,v
|
||||
retrieving revision 1.36
|
||||
diff -u -p -r1.36 value.c
|
||||
--- gdb-6.5.orig/gdb/value.c 31 Mar 2006 10:36:18 -0000 1.36
|
||||
+++ gdb-6.5/gdb/value.c 28 Sep 2006 17:06:03 -0000
|
||||
@@ -950,11 +950,10 @@ value_as_double (struct value *val)
|
||||
error (_("Invalid floating value found in program."));
|
||||
--- gdb-6.7.50.20080227.orig/gdb/value.c 2008-01-18 18:07:40.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/value.c 2008-03-02 14:36:38.000000000 +0100
|
||||
@@ -983,11 +983,9 @@ value_as_double (struct value *val)
|
||||
return foo;
|
||||
}
|
||||
|
||||
-/* Extract a value as a C pointer. Does not deallocate the value.
|
||||
- Note that val's type may not actually be a pointer; value_as_long
|
||||
- handles all the cases. */
|
||||
-CORE_ADDR
|
||||
-value_as_address (struct value *val)
|
||||
+
|
||||
+/* See `value_as_address' below - core of value to C pointer extraction. */
|
||||
+static CORE_ADDR
|
||||
+value_as_address_core (struct value *val)
|
||||
{
|
||||
/* Assume a CORE_ADDR can fit in a LONGEST (for now). Not sure
|
||||
whether we want this to be true eventually. */
|
||||
@@ -1054,6 +1053,34 @@ value_as_address (struct value *val)
|
||||
@@ -1087,6 +1085,34 @@ value_as_address (struct value *val)
|
||||
return unpack_long (value_type (val), value_contents (val));
|
||||
#endif
|
||||
}
|
||||
@ -99,3 +95,103 @@ diff -u -p -r1.36 value.c
|
||||
|
||||
/* Unpack raw data (copied from debugee, target byte order) at VALADDR
|
||||
as a long, or as a double, assuming the raw data is described
|
||||
--- /dev/null 2008-03-01 10:30:54.797374318 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.arch/amd64-i386-address.S 2008-03-02 12:47:06.000000000 +0100
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* Copyright 2008 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 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+ Please email any bugs, comments, and/or additions to this file to:
|
||||
+ bug-gdb@gnu.org
|
||||
+
|
||||
+ This file is part of the gdb testsuite.
|
||||
+
|
||||
+ Test UNsigned extension of the 32-bit inferior address on a 64-bit host.
|
||||
+ This file is based on the work by John Reiser.
|
||||
+ This file was created by Jan Kratochvil <jan.kratochvil@redhat.com>.
|
||||
+ https://bugzilla.redhat.com/show_bug.cgi?id=181390 */
|
||||
+
|
||||
+_start: .globl _start
|
||||
+ nop
|
||||
+ int3
|
||||
+ movl %esp,%ebx
|
||||
+ int3 # examining memory from $ebx fails, from $esp succeeds
|
||||
+ nop
|
||||
+ nop
|
||||
--- /dev/null 2008-03-01 10:30:54.797374318 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.arch/amd64-i386-address.exp 2008-03-02 12:57:11.000000000 +0100
|
||||
@@ -0,0 +1,62 @@
|
||||
+# Copyright 2008 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 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+# Please email any bugs, comments, and/or additions to this file to:
|
||||
+# bug-gdb@gnu.org
|
||||
+
|
||||
+# This file is part of the gdb testsuite.
|
||||
+
|
||||
+# Test UNsigned extension of the 32-bit inferior address on a 64-bit host.
|
||||
+# This file is based on the work by John Reiser.
|
||||
+# This file was created by Jan Kratochvil <jan.kratochvil@redhat.com>.
|
||||
+# https://bugzilla.redhat.com/show_bug.cgi?id=181390
|
||||
+
|
||||
+if {![istarget "x86_64-*-*"]} then {
|
||||
+ verbose "Skipping amd64->i386 adress test."
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+set testfile "amd64-i386-address"
|
||||
+set srcfile ${testfile}.S
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "additional_flags=-m32 -nostdlib"]] != "" } {
|
||||
+ untested amd64-i386-address.exp
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+# Get things started.
|
||||
+
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+gdb_run_cmd
|
||||
+
|
||||
+set test "trap stop"
|
||||
+gdb_test_multiple "" $test {
|
||||
+ -re "Program received signal SIGTRAP,.*_start .*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+gdb_test "stepi" ".*_start .*int3.*"
|
||||
+
|
||||
+gdb_test "x/x \$esp" "0x\[0-9a-f\]*:\t0x0*1"
|
||||
+
|
||||
+# Failure case would be:
|
||||
+# 0xff8d7f00: Cannot access memory at address 0xff8d7f00
|
||||
+gdb_test "x/x \$ebx" "0x\[0-9a-f\]*:\t0x0*1"
|
||||
|
@ -1,5 +1,8 @@
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=185337
|
||||
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
currently for trivial nonthreaded helloworld with no debug info up to -ggdb2 you
|
||||
will get:
|
||||
@ -27,9 +30,11 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
|
||||
<81a2> DW_AT_name : (indirect string, offset: 0x280e): __errno_location
|
||||
<81a8> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location
|
||||
|
||||
--- ./gdb/dwarf2read.c 25 Oct 2007 20:54:27 -0000 1.236
|
||||
+++ ./gdb/dwarf2read.c 3 Nov 2007 21:03:43 -0000
|
||||
@@ -5550,8 +5550,8 @@ read_partial_die (struct partial_die_inf
|
||||
Index: gdb-6.8cvs20080219/gdb/dwarf2read.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/dwarf2read.c 2008-02-19 17:27:21.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/dwarf2read.c 2008-02-20 13:35:19.000000000 +0100
|
||||
@@ -5679,8 +5679,8 @@ read_partial_die (struct partial_die_inf
|
||||
{
|
||||
case DW_AT_name:
|
||||
|
||||
@ -40,7 +45,7 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
|
||||
part_die->name = DW_STRING (&attr);
|
||||
break;
|
||||
case DW_AT_comp_dir:
|
||||
@@ -5559,7 +5559,9 @@ read_partial_die (struct partial_die_inf
|
||||
@@ -5688,7 +5688,9 @@ read_partial_die (struct partial_die_inf
|
||||
part_die->dirname = DW_STRING (&attr);
|
||||
break;
|
||||
case DW_AT_MIPS_linkage_name:
|
||||
@ -51,7 +56,7 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
|
||||
break;
|
||||
case DW_AT_low_pc:
|
||||
has_low_pc_attr = 1;
|
||||
@@ -7871,9 +7873,13 @@ dwarf2_linkage_name (struct die_info *di
|
||||
@@ -7936,9 +7938,13 @@ dwarf2_linkage_name (struct die_info *di
|
||||
{
|
||||
struct attribute *attr;
|
||||
|
||||
@ -68,22 +73,20 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
|
||||
attr = dwarf2_attr (die, DW_AT_name, cu);
|
||||
if (attr && DW_STRING (attr))
|
||||
return DW_STRING (attr);
|
||||
|
||||
|
||||
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/gdbtypes.c gdb-6.7.1-patched/gdb/gdbtypes.c
|
||||
--- gdb-6.7.1/gdb/gdbtypes.c 2007-11-04 01:43:03.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/gdbtypes.c 2007-11-04 01:09:31.000000000 +0100
|
||||
@@ -3465,6 +3465,8 @@ gdbtypes_post_init (struct gdbarch *gdba
|
||||
Index: gdb-6.8cvs20080219/gdb/gdbtypes.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/gdbtypes.c 2008-02-14 23:03:57.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/gdbtypes.c 2008-02-20 13:35:19.000000000 +0100
|
||||
@@ -3106,6 +3106,8 @@ gdbtypes_post_init (struct gdbarch *gdba
|
||||
init_type (TYPE_CODE_INT,
|
||||
gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
|
||||
gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
|
||||
0, "int", (struct objfile *) NULL);
|
||||
+ builtin_type->builtin_int_ptr =
|
||||
+ make_pointer_type (builtin_type->builtin_int, NULL);
|
||||
builtin_type->builtin_unsigned_int =
|
||||
init_type (TYPE_CODE_INT,
|
||||
gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
|
||||
@@ -3559,6 +3561,11 @@ gdbtypes_post_init (struct gdbarch *gdba
|
||||
gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
|
||||
@@ -3215,6 +3217,11 @@ gdbtypes_post_init (struct gdbarch *gdba
|
||||
"<text variable, no debug info>", NULL);
|
||||
TYPE_TARGET_TYPE (builtin_type->nodebug_text_symbol) =
|
||||
builtin_type->builtin_int;
|
||||
@ -95,10 +98,11 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/gdbtypes.c gdb-6.7.1-pa
|
||||
builtin_type->nodebug_data_symbol =
|
||||
init_type (TYPE_CODE_INT,
|
||||
gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/gdbtypes.h gdb-6.7.1-patched/gdb/gdbtypes.h
|
||||
--- gdb-6.7.1/gdb/gdbtypes.h 2007-11-04 01:43:03.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/gdbtypes.h 2007-11-04 01:07:50.000000000 +0100
|
||||
@@ -1008,6 +1008,7 @@ struct builtin_type
|
||||
Index: gdb-6.8cvs20080219/gdb/gdbtypes.h
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/gdbtypes.h 2008-02-14 23:03:57.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/gdbtypes.h 2008-02-20 13:35:19.000000000 +0100
|
||||
@@ -942,6 +942,7 @@ struct builtin_type
|
||||
|
||||
/* Types used for symbols with no debug information. */
|
||||
struct type *nodebug_text_symbol;
|
||||
@ -106,7 +110,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/gdbtypes.h gdb-6.7.1-pa
|
||||
struct type *nodebug_data_symbol;
|
||||
struct type *nodebug_unknown_symbol;
|
||||
struct type *nodebug_tls_symbol;
|
||||
@@ -1026,6 +1027,7 @@ struct builtin_type
|
||||
@@ -960,6 +961,7 @@ struct builtin_type
|
||||
struct type *builtin_char;
|
||||
struct type *builtin_short;
|
||||
struct type *builtin_int;
|
||||
@ -114,10 +118,11 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/gdbtypes.h gdb-6.7.1-pa
|
||||
struct type *builtin_long;
|
||||
struct type *builtin_signed_char;
|
||||
struct type *builtin_unsigned_char;
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/parse.c gdb-6.7.1-patched/gdb/parse.c
|
||||
--- gdb-6.7.1/gdb/parse.c 2007-08-23 20:08:36.000000000 +0200
|
||||
+++ gdb-6.7.1-patched/gdb/parse.c 2007-11-04 01:06:59.000000000 +0100
|
||||
@@ -424,7 +424,12 @@ write_exp_msymbol (struct minimal_symbol
|
||||
Index: gdb-6.8cvs20080219/gdb/parse.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/parse.c 2008-01-02 00:04:03.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/parse.c 2008-02-20 13:35:19.000000000 +0100
|
||||
@@ -437,7 +437,12 @@ write_exp_msymbol (struct minimal_symbol
|
||||
case mst_text:
|
||||
case mst_file_text:
|
||||
case mst_solib_trampoline:
|
||||
@ -131,10 +136,11 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/parse.c gdb-6.7.1-patch
|
||||
break;
|
||||
|
||||
case mst_data:
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/target.c gdb-6.7.1-patched/gdb/target.c
|
||||
--- gdb-6.7.1/gdb/target.c 2007-11-04 01:43:03.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/target.c 2007-11-04 01:37:45.000000000 +0100
|
||||
@@ -819,6 +819,25 @@ pop_target (void)
|
||||
Index: gdb-6.8cvs20080219/gdb/target.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/target.c 2008-02-19 17:22:33.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/target.c 2008-02-20 13:36:17.000000000 +0100
|
||||
@@ -812,6 +812,25 @@ pop_target (void)
|
||||
internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
|
||||
}
|
||||
|
||||
@ -157,10 +163,10 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/target.c gdb-6.7.1-patc
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
/* Using the objfile specified in BATON, find the address for the
|
||||
/* Using the objfile specified in OBJFILE, find the address for the
|
||||
current thread's thread-local storage with offset OFFSET. */
|
||||
CORE_ADDR
|
||||
@@ -904,7 +923,28 @@ target_translate_tls_address (struct obj
|
||||
@@ -893,7 +912,28 @@ target_translate_tls_address (struct obj
|
||||
/* It wouldn't be wrong here to try a gdbarch method, too; finding
|
||||
TLS is an ABI-specific thing. But we don't do that yet. */
|
||||
else
|
||||
@ -190,9 +196,10 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/target.c gdb-6.7.1-patc
|
||||
|
||||
return addr;
|
||||
}
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/testsuite/gdb.dwarf2/dw2-errno.c gdb-6.7.1-patched/gdb/testsuite/gdb.dwarf2/dw2-errno.c
|
||||
--- gdb-6.7.1/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2007-11-04 01:43:41.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2007-11-03 23:29:02.000000000 +0100
|
||||
Index: gdb-6.8cvs20080219/gdb/testsuite/gdb.dwarf2/dw2-errno.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.8cvs20080219/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2008-02-20 13:35:19.000000000 +0100
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
@ -222,9 +229,10 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/testsuite/gdb.dwarf2/dw
|
||||
+
|
||||
+ return 0; /* breakpoint */
|
||||
+}
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1/gdb/testsuite/gdb.dwarf2/dw2-errno.exp gdb-6.7.1-patched/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
|
||||
--- gdb-6.7.1/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2007-11-04 01:43:39.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2007-11-04 01:41:46.000000000 +0100
|
||||
Index: gdb-6.8cvs20080219/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.8cvs20080219/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2008-02-20 13:35:19.000000000 +0100
|
||||
@@ -0,0 +1,67 @@
|
||||
+# Copyright 2007 Free Software Foundation, Inc.
|
||||
+
|
||||
|
@ -1,177 +0,0 @@
|
||||
2007-04-20 Luis Machado <luisgpm@br.ibm.com>
|
||||
|
||||
* rs6000-tdep.c (rs6000_gdbarch_init): Set the long double format for
|
||||
powerpc64.
|
||||
* configure.host : Set the host long double format for powerpc64 to be
|
||||
a 128-bit type defined in libiberty/floatformat.c.
|
||||
* ppc-linux-tdep.c (ppc_linux_init_abi): Remove code that sets long double
|
||||
size to 8 bytes. This breaks expression evaluation by overriding the
|
||||
default.
|
||||
* floatformat.c : Introduce default floatformat structs to describe the
|
||||
128-bit long double found on the powerpc64. Description does not fully
|
||||
describe this format which is actually a pair of 64-bit doubles. However
|
||||
we are relying on floatformat_to_doublest() recognizing that this is
|
||||
also the default host floatformat.
|
||||
* floatformat.h : Default floatformat structs for powerpc64 128-bit
|
||||
long doubles.
|
||||
|
||||
Index: ./gdb/configure.host
|
||||
===================================================================
|
||||
--- ./gdb/configure.host.orig 2007-04-21 23:51:06.000000000 -0300
|
||||
+++ ./gdb/configure.host 2007-04-21 23:51:09.000000000 -0300
|
||||
@@ -179,6 +179,11 @@
|
||||
gdb_host_double_format="&floatformat_ieee_double_big"
|
||||
gdb_host_long_double_format="&floatformat_m68881_ext"
|
||||
;;
|
||||
+powerpc64-*-*)
|
||||
+ gdb_host_float_format=0
|
||||
+ gdb_host_double_format=0
|
||||
+ gdb_host_long_double_format="&floatformat_ppc64_long_double_big"
|
||||
+ ;;
|
||||
*)
|
||||
gdb_host_float_format=0
|
||||
gdb_host_double_format=0
|
||||
Index: ./gdb/rs6000-tdep.c
|
||||
===================================================================
|
||||
--- ./gdb/rs6000-tdep.c.orig 2007-04-21 23:51:06.000000000 -0300
|
||||
+++ ./gdb/rs6000-tdep.c 2007-04-21 23:51:09.000000000 -0300
|
||||
@@ -3442,7 +3442,19 @@
|
||||
set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
|
||||
set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
|
||||
if (sysv_abi)
|
||||
- set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
|
||||
+ {
|
||||
+ int byte_order = gdbarch_byte_order (gdbarch);
|
||||
+
|
||||
+ if (byte_order == BFD_ENDIAN_BIG)
|
||||
+ set_gdbarch_long_double_format (gdbarch, &floatformat_ppc64_long_double_big);
|
||||
+ else if (byte_order == BFD_ENDIAN_LITTLE)
|
||||
+ set_gdbarch_long_double_format (gdbarch, &floatformat_ppc64_long_double_little);
|
||||
+ else
|
||||
+ internal_error (__FILE__, __LINE__,
|
||||
+ _("rs6000_gdbarch_init: "
|
||||
+ "bad byte order"));
|
||||
+ set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
|
||||
+ }
|
||||
else
|
||||
set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
|
||||
set_gdbarch_char_signed (gdbarch, 0);
|
||||
Index: ./include/floatformat.h
|
||||
===================================================================
|
||||
--- ./include/floatformat.h.orig 2007-04-21 23:51:06.000000000 -0300
|
||||
+++ ./include/floatformat.h 2007-04-21 23:51:09.000000000 -0300
|
||||
@@ -118,6 +118,9 @@
|
||||
extern const struct floatformat floatformat_ia64_spill_little;
|
||||
extern const struct floatformat floatformat_ia64_quad_big;
|
||||
extern const struct floatformat floatformat_ia64_quad_little;
|
||||
+/* ppc64 long double implemented as 2 doubles */
|
||||
+extern const struct floatformat floatformat_ppc64_long_double_big;
|
||||
+extern const struct floatformat floatformat_ppc64_long_double_little;
|
||||
|
||||
/* Convert from FMT to a double.
|
||||
FROM is the address of the extended float.
|
||||
Index: ./libiberty/floatformat.c
|
||||
===================================================================
|
||||
--- ./libiberty/floatformat.c.orig 2007-04-21 23:51:06.000000000 -0300
|
||||
+++ ./libiberty/floatformat.c 2007-04-21 23:51:09.000000000 -0300
|
||||
@@ -106,6 +106,25 @@
|
||||
floatformat_always_valid
|
||||
};
|
||||
|
||||
+/* floatformats for ppc64 long double, big and little endian. */
|
||||
+/* The layout is a pair of doubles. Don't use this description to pass */
|
||||
+/* information to get_field(). The bit size is the important thing. */
|
||||
+const struct floatformat floatformat_ppc64_long_double_big =
|
||||
+{
|
||||
+ floatformat_big, 128, 0, 1, 11, 1023, 2047, 12, 52,
|
||||
+ floatformat_intbit_no,
|
||||
+ "floatformat_ppc64_long_double_big",
|
||||
+ floatformat_always_valid
|
||||
+};
|
||||
+
|
||||
+const struct floatformat floatformat_ppc64_long_double_little =
|
||||
+{
|
||||
+ floatformat_little, 128, 0, 1, 11, 1023, 2047, 12, 52,
|
||||
+ floatformat_intbit_no,
|
||||
+ "floatformat_ppc64_long_double_little",
|
||||
+ floatformat_always_valid
|
||||
+};
|
||||
+
|
||||
/* floatformat for IEEE double, little endian byte order, with big endian word
|
||||
ordering, as on the ARM. */
|
||||
|
||||
Index: ./gdb/ppc-linux-tdep.c
|
||||
===================================================================
|
||||
--- ./gdb/ppc-linux-tdep.c.orig 2007-04-21 19:48:50.000000000 -0300
|
||||
+++ ./gdb/ppc-linux-tdep.c 2007-04-22 00:29:50.000000000 -0300
|
||||
@@ -1059,7 +1059,8 @@
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
- /* NOTE: jimb/2004-03-26: The System V ABI PowerPC Processor
|
||||
+#if 0
|
||||
+ /* NOTE: jimb/2004-03-26: The System V ABI PowerPC Processor
|
||||
Supplement says that long doubles are sixteen bytes long.
|
||||
However, as one of the known warts of its ABI, PPC GNU/Linux uses
|
||||
eight-byte long doubles. GCC only recently got 128-bit long
|
||||
@@ -1068,6 +1069,7 @@
|
||||
double' on PPC GNU/Linux are non-conformant. */
|
||||
/* NOTE: cagney/2005-01-25: True for both 32- and 64-bit. */
|
||||
set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
|
||||
+#endif
|
||||
|
||||
if (tdep->wordsize == 4)
|
||||
{
|
||||
|
||||
|
||||
|
||||
2007-10-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.7-patched/gdb/gdbtypes.c gdb-6.7/gdb/gdbtypes.c
|
||||
--- gdb-6.7-patched/gdb/gdbtypes.c 2007-09-05 02:51:48.000000000 +0200
|
||||
+++ gdb-6.7/gdb/gdbtypes.c 2007-10-17 12:09:00.000000000 +0200
|
||||
@@ -95,6 +95,10 @@ const struct floatformat *floatformats_v
|
||||
&floatformat_vax_d,
|
||||
&floatformat_vax_d
|
||||
};
|
||||
+const struct floatformat *floatformat_ppc64_long_double[BFD_ENDIAN_UNKNOWN] = {
|
||||
+ &floatformat_ppc64_long_double_big,
|
||||
+ &floatformat_ppc64_long_double_little
|
||||
+};
|
||||
|
||||
struct type *builtin_type_ieee_single;
|
||||
struct type *builtin_type_ieee_double;
|
||||
diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.7-patched/gdb/gdbtypes.h gdb-6.7/gdb/gdbtypes.h
|
||||
--- gdb-6.7-patched/gdb/gdbtypes.h 2007-09-05 02:51:48.000000000 +0200
|
||||
+++ gdb-6.7/gdb/gdbtypes.h 2007-10-17 12:08:30.000000000 +0200
|
||||
@@ -1121,6 +1121,7 @@ extern const struct floatformat *floatfo
|
||||
extern const struct floatformat *floatformats_ia64_quad[BFD_ENDIAN_UNKNOWN];
|
||||
extern const struct floatformat *floatformats_vax_f[BFD_ENDIAN_UNKNOWN];
|
||||
extern const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN];
|
||||
+extern const struct floatformat *floatformat_ppc64_long_double[BFD_ENDIAN_UNKNOWN];
|
||||
|
||||
extern struct type *builtin_type_ieee_single;
|
||||
extern struct type *builtin_type_ieee_double;
|
||||
diff -u -u -X /home/jkratoch/.diffi.list -rup gdb-6.7-patched/gdb/rs6000-tdep.c gdb-6.7/gdb/rs6000-tdep.c
|
||||
--- gdb-6.7-patched/gdb/rs6000-tdep.c 2007-10-16 20:52:45.000000000 +0200
|
||||
+++ gdb-6.7/gdb/rs6000-tdep.c 2007-10-17 12:07:54.000000000 +0200
|
||||
@@ -3755,16 +3755,7 @@ rs6000_gdbarch_init (struct gdbarch_info
|
||||
set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
|
||||
if (sysv_abi)
|
||||
{
|
||||
- int byte_order = gdbarch_byte_order (gdbarch);
|
||||
-
|
||||
- if (byte_order == BFD_ENDIAN_BIG)
|
||||
- set_gdbarch_long_double_format (gdbarch, &floatformat_ppc64_long_double_big);
|
||||
- else if (byte_order == BFD_ENDIAN_LITTLE)
|
||||
- set_gdbarch_long_double_format (gdbarch, &floatformat_ppc64_long_double_little);
|
||||
- else
|
||||
- internal_error (__FILE__, __LINE__,
|
||||
- _("rs6000_gdbarch_init: "
|
||||
- "bad byte order"));
|
||||
+ set_gdbarch_long_double_format (gdbarch, floatformat_ppc64_long_double);
|
||||
set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
|
||||
}
|
||||
else
|
@ -19,11 +19,15 @@
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
Index: gdb-6.7/gdb/Makefile.in
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/Makefile.in
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/Makefile.in 2007-10-14 23:57:38.000000000 +0200
|
||||
+++ gdb-6.7/gdb/Makefile.in 2007-10-16 15:46:48.000000000 +0200
|
||||
@@ -717,6 +717,7 @@ gdb_expat_h = gdb_expat.h
|
||||
--- gdb-6.8cvs20080219.orig/gdb/Makefile.in 2008-02-19 16:52:21.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/Makefile.in 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -785,6 +785,7 @@ gdb_expat_h = gdb_expat.h
|
||||
gdb_locale_h = gdb_locale.h
|
||||
gdb_obstack_h = gdb_obstack.h $(obstack_h)
|
||||
gdb_proc_service_h = gdb_proc_service.h $(gregset_h)
|
||||
@ -31,7 +35,7 @@ Index: gdb-6.7/gdb/Makefile.in
|
||||
gdb_ptrace_h = gdb_ptrace.h
|
||||
gdb_regex_h = gdb_regex.h $(xregex_h)
|
||||
gdb_select_h = gdb_select.h
|
||||
@@ -726,6 +727,7 @@ gdb_string_h = gdb_string.h
|
||||
@@ -794,6 +795,7 @@ gdb_string_h = gdb_string.h
|
||||
gdb_thread_db_h = gdb_thread_db.h
|
||||
gdbthread_h = gdbthread.h $(breakpoint_h) $(frame_h)
|
||||
gdbtypes_h = gdbtypes.h $(hashtab_h)
|
||||
@ -39,7 +43,7 @@ Index: gdb-6.7/gdb/Makefile.in
|
||||
gdb_vfork_h = gdb_vfork.h
|
||||
gdb_wait_h = gdb_wait.h
|
||||
glibc_tdep_h = glibc-tdep.h
|
||||
@@ -1793,7 +1795,8 @@ amd64fbsd-tdep.o: amd64fbsd-tdep.c $(def
|
||||
@@ -1888,7 +1890,8 @@ amd64fbsd-tdep.o: amd64fbsd-tdep.c $(def
|
||||
amd64-linux-nat.o: amd64-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(linux_nat_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(gdb_proc_service_h) $(gregset_h) $(amd64_tdep_h) \
|
||||
@ -49,11 +53,11 @@ Index: gdb-6.7/gdb/Makefile.in
|
||||
amd64-linux-tdep.o: amd64-linux-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(osabi_h) $(symtab_h) $(gdb_string_h) $(amd64_tdep_h) \
|
||||
$(solib_svr4_h) $(gdbtypes_h) $(reggroups_h) $(amd64_linux_tdep_h)
|
||||
Index: gdb-6.7/gdb/amd64-linux-nat.c
|
||||
Index: gdb-6.8cvs20080219/gdb/amd64-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/amd64-linux-nat.c 2007-10-14 23:39:04.000000000 +0200
|
||||
+++ gdb-6.7/gdb/amd64-linux-nat.c 2007-10-16 15:46:18.000000000 +0200
|
||||
@@ -51,6 +51,9 @@
|
||||
--- gdb-6.8cvs20080219.orig/gdb/amd64-linux-nat.c 2008-02-16 19:10:27.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/amd64-linux-nat.c 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -50,6 +50,9 @@
|
||||
#include "amd64-tdep.h"
|
||||
#include "i386-linux-tdep.h"
|
||||
#include "amd64-nat.h"
|
||||
@ -63,7 +67,7 @@ Index: gdb-6.7/gdb/amd64-linux-nat.c
|
||||
|
||||
/* Mapping between the general-purpose registers in GNU/Linux x86-64
|
||||
`struct user' format and GDB's register cache layout. */
|
||||
@@ -85,6 +88,35 @@ static int amd64_linux_gregset64_reg_off
|
||||
@@ -84,6 +87,35 @@ static int amd64_linux_gregset64_reg_off
|
||||
GNU/Linux i386 registers are all 32-bit, but since we're
|
||||
little-endian we get away with that. */
|
||||
|
||||
@ -99,7 +103,7 @@ Index: gdb-6.7/gdb/amd64-linux-nat.c
|
||||
/* From <sys/reg.h> on GNU/Linux i386. */
|
||||
static int amd64_linux_gregset32_reg_offset[] =
|
||||
{
|
||||
@@ -103,6 +135,96 @@ static int amd64_linux_gregset32_reg_off
|
||||
@@ -102,6 +134,96 @@ static int amd64_linux_gregset32_reg_off
|
||||
};
|
||||
|
||||
|
||||
@ -196,7 +200,7 @@ Index: gdb-6.7/gdb/amd64-linux-nat.c
|
||||
/* Transfering the general-purpose registers between GDB, inferiors
|
||||
and core files. */
|
||||
|
||||
@@ -529,6 +649,11 @@ _initialize_amd64_linux_nat (void)
|
||||
@@ -429,6 +551,11 @@ _initialize_amd64_linux_nat (void)
|
||||
t->to_fetch_registers = amd64_linux_fetch_inferior_registers;
|
||||
t->to_store_registers = amd64_linux_store_inferior_registers;
|
||||
|
||||
@ -207,11 +211,11 @@ Index: gdb-6.7/gdb/amd64-linux-nat.c
|
||||
+
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
|
||||
Index: gdb-6.7/gdb/config.in
|
||||
linux_nat_set_new_thread (t, amd64_linux_new_thread);
|
||||
Index: gdb-6.8cvs20080219/gdb/config.in
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/config.in 2007-06-18 17:46:37.000000000 +0200
|
||||
+++ gdb-6.7/gdb/config.in 2007-10-16 15:46:18.000000000 +0200
|
||||
--- gdb-6.8cvs20080219.orig/gdb/config.in 2008-01-10 19:17:06.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/config.in 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -385,6 +385,9 @@
|
||||
/* Define to 1 if you have the <sys/poll.h> header file. */
|
||||
#undef HAVE_SYS_POLL_H
|
||||
@ -232,11 +236,11 @@ Index: gdb-6.7/gdb/config.in
|
||||
/* Define to 1 if you have the <sys/user.h> header file. */
|
||||
#undef HAVE_SYS_USER_H
|
||||
|
||||
Index: gdb-6.7/gdb/configure
|
||||
Index: gdb-6.8cvs20080219/gdb/configure
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/configure 2007-09-29 22:54:13.000000000 +0200
|
||||
+++ gdb-6.7/gdb/configure 2007-10-16 15:46:18.000000000 +0200
|
||||
@@ -10439,6 +10439,157 @@ done
|
||||
--- gdb-6.8cvs20080219.orig/gdb/configure 2008-02-14 23:03:56.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/configure 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -11140,6 +11140,157 @@ done
|
||||
|
||||
|
||||
|
||||
@ -394,11 +398,11 @@ Index: gdb-6.7/gdb/configure
|
||||
for ac_header in sys/wait.h wait.h
|
||||
do
|
||||
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||
Index: gdb-6.7/gdb/configure.ac
|
||||
Index: gdb-6.8cvs20080219/gdb/configure.ac
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/configure.ac 2007-09-29 22:54:13.000000000 +0200
|
||||
+++ gdb-6.7/gdb/configure.ac 2007-10-16 15:46:18.000000000 +0200
|
||||
@@ -424,6 +424,7 @@ AC_CHECK_HEADERS(sys/user.h, [], [],
|
||||
--- gdb-6.8cvs20080219.orig/gdb/configure.ac 2008-02-14 23:03:56.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/configure.ac 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -523,6 +523,7 @@ AC_CHECK_HEADERS(sys/user.h, [], [],
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
])
|
||||
@ -406,10 +410,10 @@ Index: gdb-6.7/gdb/configure.ac
|
||||
AC_CHECK_HEADERS(sys/wait.h wait.h)
|
||||
AC_CHECK_HEADERS(termios.h termio.h sgtty.h)
|
||||
AC_CHECK_HEADERS(unistd.h)
|
||||
Index: gdb-6.7/gdb/gcore.c
|
||||
Index: gdb-6.8cvs20080219/gdb/gcore.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/gcore.c 2007-10-14 23:57:38.000000000 +0200
|
||||
+++ gdb-6.7/gdb/gcore.c 2007-10-16 15:46:18.000000000 +0200
|
||||
--- gdb-6.8cvs20080219.orig/gdb/gcore.c 2008-02-19 16:52:21.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/gcore.c 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -317,6 +317,11 @@ gcore_create_callback (CORE_ADDR vaddr,
|
||||
asection *osec;
|
||||
flagword flags = SEC_ALLOC | SEC_HAS_CONTENTS | SEC_LOAD;
|
||||
@ -422,10 +426,10 @@ Index: gdb-6.7/gdb/gcore.c
|
||||
/* If the memory segment has no permissions set, ignore it, otherwise
|
||||
when we later try to access it for read/write, we'll get an error
|
||||
or jam the kernel. */
|
||||
Index: gdb-6.7/gdb/gdb_procfs32.h
|
||||
Index: gdb-6.8cvs20080219/gdb/gdb_procfs32.h
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/gdb_procfs32.h 2007-10-16 15:46:18.000000000 +0200
|
||||
+++ gdb-6.8cvs20080219/gdb/gdb_procfs32.h 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -0,0 +1,128 @@
|
||||
+#ifdef HAVE_SYS_PROCFS32_H
|
||||
+#include <sys/procfs32.h>
|
||||
@ -555,10 +559,10 @@ Index: gdb-6.7/gdb/gdb_procfs32.h
|
||||
+#endif /* _SYS_PROCFS32_H */
|
||||
+
|
||||
+#endif /* HAVE_SYS_PROCFS32_H */
|
||||
Index: gdb-6.7/gdb/gdb_user32.h
|
||||
Index: gdb-6.8cvs20080219/gdb/gdb_user32.h
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/gdb_user32.h 2007-10-16 15:46:18.000000000 +0200
|
||||
+++ gdb-6.8cvs20080219/gdb/gdb_user32.h 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -0,0 +1,108 @@
|
||||
+#ifdef HAVE_SYS_USER32_H
|
||||
+#include <sys/user32.h>
|
||||
@ -668,11 +672,11 @@ Index: gdb-6.7/gdb/gdb_user32.h
|
||||
+#endif /* _SYS_USER32_H */
|
||||
+
|
||||
+#endif /* HAVE_SYS_USER32_H */
|
||||
Index: gdb-6.7/gdb/linux-nat.c
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/linux-nat.c 2007-10-15 21:42:26.000000000 +0200
|
||||
+++ gdb-6.7/gdb/linux-nat.c 2007-10-16 15:46:18.000000000 +0200
|
||||
@@ -98,6 +98,21 @@ static LONGEST (*super_xfer_partial) (st
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.c 2008-02-19 17:27:21.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.c 2008-02-20 13:39:08.000000000 +0100
|
||||
@@ -104,6 +104,21 @@ static LONGEST (*super_xfer_partial) (st
|
||||
const gdb_byte *,
|
||||
ULONGEST, LONGEST);
|
||||
|
||||
@ -694,7 +698,7 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
static int debug_linux_nat;
|
||||
static void
|
||||
show_debug_linux_nat (struct ui_file *file, int from_tty,
|
||||
@@ -2687,11 +2696,11 @@ linux_nat_do_thread_registers (bfd *obfd
|
||||
@@ -2716,11 +2731,11 @@ linux_nat_do_thread_registers (bfd *obfd
|
||||
else
|
||||
fill_gregset (regcache, &gregs, -1);
|
||||
|
||||
@ -711,7 +715,7 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
|
||||
if (core_regset_p
|
||||
&& (regset = gdbarch_regset_from_core_section (gdbarch, ".reg2",
|
||||
@@ -2702,10 +2711,11 @@ linux_nat_do_thread_registers (bfd *obfd
|
||||
@@ -2731,10 +2746,11 @@ linux_nat_do_thread_registers (bfd *obfd
|
||||
else
|
||||
fill_fpregset (regcache, &fpregs, -1);
|
||||
|
||||
@ -727,7 +731,7 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
|
||||
#ifdef FILL_FPXREGSET
|
||||
if (core_regset_p
|
||||
@@ -2799,9 +2808,9 @@ linux_nat_make_corefile_notes (bfd *obfd
|
||||
@@ -2828,9 +2844,9 @@ linux_nat_make_corefile_notes (bfd *obfd
|
||||
psargs_end - string_end);
|
||||
}
|
||||
}
|
||||
@ -740,16 +744,16 @@ Index: gdb-6.7/gdb/linux-nat.c
|
||||
}
|
||||
|
||||
/* Dump information for threads. */
|
||||
Index: gdb-6.7/gdb/linux-nat.h
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.h
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/linux-nat.h 2007-10-13 05:09:50.000000000 +0200
|
||||
+++ gdb-6.7/gdb/linux-nat.h 2007-10-16 15:46:18.000000000 +0200
|
||||
@@ -110,3 +110,12 @@ void linux_nat_add_target (struct target
|
||||
/* Update linux-nat internal state when changing from one fork
|
||||
to another. */
|
||||
void linux_nat_switch_fork (ptid_t new_ptid);
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.h 2008-02-19 14:26:32.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.h 2008-02-20 13:39:37.000000000 +0100
|
||||
@@ -124,3 +124,12 @@ void linux_nat_switch_fork (ptid_t new_p
|
||||
|
||||
/* Return the saved siginfo associated with PTID. */
|
||||
struct siginfo *linux_nat_get_siginfo (ptid_t ptid);
|
||||
+
|
||||
+/* This functions make elfcore note sections.
|
||||
+/* These functions make elfcore note sections.
|
||||
+ They may get overriden by code adjusting data for multi-target builds. */
|
||||
+extern char *(*linux_elfcore_write_prpsinfo)
|
||||
+ (bfd *, char *, int *, const char *, const char *);
|
||||
|
@ -16,17 +16,21 @@ The testsuite needs `gdb-6.5-tls-of-separate-debuginfo.patch'.
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
Index: gdb-6.7/gdb/solib-svr4.c
|
||||
2008-02-27 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to gdb-6.7.50.20080227.
|
||||
|
||||
Index: gdb-6.7.50.20080227/gdb/solib-svr4.c
|
||||
===================================================================
|
||||
--- gdb-6.7.orig/gdb/solib-svr4.c 2007-10-14 23:04:45.000000000 +0200
|
||||
+++ gdb-6.7/gdb/solib-svr4.c 2007-10-16 15:43:56.000000000 +0200
|
||||
@@ -1009,10 +1009,14 @@ CORE_ADDR
|
||||
--- gdb-6.7.50.20080227.orig/gdb/solib-svr4.c 2008-02-27 08:59:06.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/solib-svr4.c 2008-02-27 09:00:44.000000000 +0100
|
||||
@@ -1017,10 +1017,14 @@ CORE_ADDR
|
||||
svr4_fetch_objfile_link_map (struct objfile *objfile)
|
||||
{
|
||||
CORE_ADDR lm;
|
||||
+ int resolve;
|
||||
|
||||
if ((debug_base = locate_base ()) == 0)
|
||||
if (locate_base () == 0)
|
||||
return 0; /* failed somehow... */
|
||||
|
||||
+for (resolve = 0; resolve <= 1; resolve++)
|
||||
@ -35,7 +39,7 @@ Index: gdb-6.7/gdb/solib-svr4.c
|
||||
/* Position ourselves on the first link map. */
|
||||
lm = solib_svr4_r_map ();
|
||||
while (lm)
|
||||
@@ -1051,6 +1055,21 @@ svr4_fetch_objfile_link_map (struct objf
|
||||
@@ -1059,6 +1063,21 @@ svr4_fetch_objfile_link_map (struct objf
|
||||
safe_strerror (errcode));
|
||||
else
|
||||
{
|
||||
@ -57,7 +61,7 @@ Index: gdb-6.7/gdb/solib-svr4.c
|
||||
/* Is this the linkmap for the file we want? */
|
||||
/* If the file is not a shared library and has no name,
|
||||
we are sure it is the main executable, so we return that. */
|
||||
@@ -1069,6 +1088,9 @@ svr4_fetch_objfile_link_map (struct objf
|
||||
@@ -1077,6 +1096,9 @@ svr4_fetch_objfile_link_map (struct objf
|
||||
builtin_type_void_data_ptr);
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
@ -67,10 +71,10 @@ Index: gdb-6.7/gdb/solib-svr4.c
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index: gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug-main.c
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/tls-sepdebug-main.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug-main.c 2007-10-16 15:40:01.000000000 +0200
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/tls-sepdebug-main.c 2008-02-27 09:00:15.000000000 +0100
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
@ -97,10 +101,10 @@ Index: gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug-main.c
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
Index: gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug-shared.c
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/tls-sepdebug-shared.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug-shared.c 2007-10-16 15:40:01.000000000 +0200
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/tls-sepdebug-shared.c 2008-02-27 09:00:15.000000000 +0100
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
@ -124,10 +128,10 @@ Index: gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug-shared.c
|
||||
+ bug-gdb@prep.ai.mit.edu */
|
||||
+
|
||||
+__thread int var = 42;
|
||||
Index: gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug.exp
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/tls-sepdebug.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7/gdb/testsuite/gdb.threads/tls-sepdebug.exp 2007-10-16 15:40:01.000000000 +0200
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/tls-sepdebug.exp 2008-02-27 09:00:15.000000000 +0100
|
||||
@@ -0,0 +1,81 @@
|
||||
+# Copyright 2006 Free Software Foundation, Inc.
|
||||
+
|
||||
|
@ -18,11 +18,16 @@
|
||||
Provide its level 0 to disable the build-id messages.
|
||||
Resolve the RH Bug 432164.
|
||||
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/Makefile.in gdb-6.7.1-patched/gdb/Makefile.in
|
||||
--- gdb-6.7.1-unpatched/gdb/Makefile.in 2008-02-21 05:01:55.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/Makefile.in 2008-02-21 04:58:13.000000000 +0100
|
||||
@@ -387,7 +387,7 @@ INSTALLED_LIBS=-lbfd -lreadline -lopcode
|
||||
CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(INTL) $(LIBIBERTY) \
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.7.50.20080227/gdb/Makefile.in
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/Makefile.in 2008-03-01 10:30:49.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/Makefile.in 2008-03-01 10:38:01.000000000 +0100
|
||||
@@ -392,7 +392,7 @@ INSTALLED_LIBS=-lbfd -lreadline -lopcode
|
||||
CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \
|
||||
$(XM_CLIBS) $(TM_CLIBS) $(NAT_CLIBS) $(GDBTKLIBS) @LIBS@ \
|
||||
$(LIBICONV) $(LIBEXPAT) \
|
||||
- $(LIBIBERTY) $(WIN32LIBS)
|
||||
@ -30,33 +35,34 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/Makefile.in g
|
||||
CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE_DEPS) \
|
||||
$(OPCODES) $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS)
|
||||
|
||||
@@ -1932,7 +1932,8 @@ corelow.o: corelow.c $(defs_h) $(arch_ut
|
||||
@@ -2029,7 +2029,8 @@ corelow.o: corelow.c $(defs_h) $(arch_ut
|
||||
$(inferior_h) $(symtab_h) $(command_h) $(bfd_h) $(target_h) \
|
||||
$(gdbcore_h) $(gdbthread_h) $(regcache_h) $(regset_h) $(symfile_h) \
|
||||
$(exec_h) $(readline_h) $(gdb_assert_h) \
|
||||
- $(exceptions_h) $(solib_h)
|
||||
+ $(exceptions_h) $(solib_h) $(auxv_h) $(elf_common_h) $(objfiles_h) \
|
||||
+ $(gdbcmd_h)
|
||||
- $(exceptions_h) $(solib_h) $(filenames_h)
|
||||
+ $(exceptions_h) $(solib_h) $(filenames_h) $(auxv_h) $(elf_common_h) \
|
||||
+ $(objfiles_h) $(gdbcmd_h)
|
||||
core-regset.o: core-regset.c $(defs_h) $(command_h) $(gdbcore_h) \
|
||||
$(inferior_h) $(target_h) $(regcache_h) $(gdb_string_h) $(gregset_h)
|
||||
cp-abi.o: cp-abi.c $(defs_h) $(value_h) $(cp_abi_h) $(command_h) $(gdbcmd_h) \
|
||||
@@ -2768,7 +2769,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
|
||||
@@ -2884,7 +2885,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
|
||||
$(gdb_stabs_h) $(gdb_obstack_h) $(completer_h) $(bcache_h) \
|
||||
$(hashtab_h) $(readline_h) $(gdb_assert_h) $(block_h) \
|
||||
$(gdb_string_h) $(gdb_stat_h) $(observer_h) $(exec_h) \
|
||||
- $(parser_defs_h) $(varobj_h) $(elf_bfd_h)
|
||||
+ $(parser_defs_h) $(varobj_h) $(elf_bfd_h) $(gdb_stdint_h) $(libbfd_h) \
|
||||
+ $(elf_bfd_h) $(elf_external_h)
|
||||
- $(parser_defs_h) $(varobj_h) $(elf_bfd_h) $(solib_h)
|
||||
+ $(parser_defs_h) $(varobj_h) $(elf_bfd_h) $(solib_h) $(gdb_stdint_h) \
|
||||
+ $(libbfd_h) $(elf_bfd_h) $(elf_external_h)
|
||||
symfile-mem.o: symfile-mem.c $(defs_h) $(symtab_h) $(gdbcore_h) \
|
||||
$(objfiles_h) $(exceptions_h) $(gdbcmd_h) $(target_h) $(value_h) \
|
||||
$(symfile_h) $(observer_h) $(auxv_h) $(elf_common_h)
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/corelow.c gdb-6.7.1-patched/gdb/corelow.c
|
||||
--- gdb-6.7.1-unpatched/gdb/corelow.c 2008-02-21 05:01:55.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/corelow.c 2008-02-21 04:58:13.000000000 +0100
|
||||
@@ -44,6 +44,10 @@
|
||||
#include "gdb_assert.h"
|
||||
Index: gdb-6.7.50.20080227/gdb/corelow.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/corelow.c 2008-02-09 14:45:33.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/corelow.c 2008-03-01 10:30:50.000000000 +0100
|
||||
@@ -45,6 +45,10 @@
|
||||
#include "exceptions.h"
|
||||
#include "solib.h"
|
||||
#include "filenames.h"
|
||||
+#include "auxv.h"
|
||||
+#include "elf/common.h"
|
||||
+#include "objfiles.h"
|
||||
@ -64,7 +70,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/corelow.c gdb
|
||||
|
||||
|
||||
#ifndef O_LARGEFILE
|
||||
@@ -251,6 +255,56 @@ add_to_thread_list (bfd *abfd, asection
|
||||
@@ -248,6 +252,56 @@ add_to_thread_list (bfd *abfd, asection
|
||||
inferior_ptid = pid_to_ptid (thread_id); /* Yes, make it current */
|
||||
}
|
||||
|
||||
@ -121,7 +127,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/corelow.c gdb
|
||||
/* This routine opens and sets up the core file bfd. */
|
||||
|
||||
static void
|
||||
@@ -347,6 +401,15 @@ core_open (char *filename, int from_tty)
|
||||
@@ -344,6 +398,15 @@ core_open (char *filename, int from_tty)
|
||||
ontop = !push_target (&core_ops);
|
||||
discard_cleanups (old_chain);
|
||||
|
||||
@ -137,7 +143,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/corelow.c gdb
|
||||
/* This is done first, before anything has a chance to query the
|
||||
inferior for information such as symbols. */
|
||||
post_create_inferior (&core_ops, from_tty);
|
||||
@@ -678,4 +741,11 @@ _initialize_corelow (void)
|
||||
@@ -692,4 +755,11 @@ _initialize_corelow (void)
|
||||
|
||||
if (!coreops_suppress_target)
|
||||
add_target (&core_ops);
|
||||
@ -149,10 +155,11 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/corelow.c gdb
|
||||
+ NULL, NULL, NULL,
|
||||
+ &setlist, &showlist);
|
||||
}
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/doc/gdb.texinfo gdb-6.7.1-patched/gdb/doc/gdb.texinfo
|
||||
--- gdb-6.7.1-unpatched/gdb/doc/gdb.texinfo 2008-02-21 05:00:36.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/doc/gdb.texinfo 2008-02-21 04:59:10.000000000 +0100
|
||||
@@ -12074,6 +12074,27 @@ information files.
|
||||
Index: gdb-6.7.50.20080227/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/doc/gdb.texinfo 2008-03-01 10:30:50.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/doc/gdb.texinfo 2008-03-01 10:38:02.000000000 +0100
|
||||
@@ -12208,6 +12208,27 @@ information files.
|
||||
|
||||
@end table
|
||||
|
||||
@ -180,10 +187,11 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/doc/gdb.texin
|
||||
@cindex @code{.gnu_debuglink} sections
|
||||
@cindex debug link sections
|
||||
A debug link is a special section of the executable file named
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/solib-svr4.c gdb-6.7.1-patched/gdb/solib-svr4.c
|
||||
--- gdb-6.7.1-unpatched/gdb/solib-svr4.c 2008-02-21 05:01:55.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/solib-svr4.c 2008-02-21 04:58:13.000000000 +0100
|
||||
@@ -960,9 +960,34 @@ svr4_current_sos (void)
|
||||
Index: gdb-6.7.50.20080227/gdb/solib-svr4.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/solib-svr4.c 2008-03-01 10:30:48.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/solib-svr4.c 2008-03-01 10:30:50.000000000 +0100
|
||||
@@ -967,9 +967,34 @@ svr4_current_sos (void)
|
||||
free_so (new);
|
||||
else
|
||||
{
|
||||
@ -221,20 +229,21 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/solib-svr4.c
|
||||
if (debug_solib)
|
||||
{
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb-6.7.1-patched/gdb/symfile.c
|
||||
--- gdb-6.7.1-unpatched/gdb/symfile.c 2008-02-21 05:02:16.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/symfile.c 2008-02-21 04:59:10.000000000 +0100
|
||||
@@ -53,6 +53,9 @@
|
||||
#include "parser-defs.h"
|
||||
Index: gdb-6.7.50.20080227/gdb/symfile.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/symfile.c 2008-03-01 10:30:48.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/symfile.c 2008-03-01 10:47:02.000000000 +0100
|
||||
@@ -54,6 +54,9 @@
|
||||
#include "varobj.h"
|
||||
#include "elf-bfd.h"
|
||||
#include "solib.h"
|
||||
+#include "gdb_stdint.h"
|
||||
+#include "libbfd.h"
|
||||
+#include "elf/external.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
@@ -61,6 +64,7 @@
|
||||
@@ -62,6 +65,7 @@
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
@ -242,7 +251,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
|
||||
|
||||
int (*deprecated_ui_load_progress_hook) (const char *section, unsigned long num);
|
||||
@@ -1262,16 +1266,65 @@ symbol_file_clear (int from_tty)
|
||||
@@ -1235,16 +1239,65 @@ symbol_file_clear (int from_tty)
|
||||
printf_unfiltered (_("No symbol file now.\n"));
|
||||
}
|
||||
|
||||
@ -310,7 +319,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
{
|
||||
struct build_id *retval;
|
||||
|
||||
@@ -1287,6 +1340,348 @@ build_id_bfd_get (bfd *abfd)
|
||||
@@ -1260,6 +1313,348 @@ build_id_bfd_get (bfd *abfd)
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -659,7 +668,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
/* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value. */
|
||||
|
||||
static int
|
||||
@@ -1301,7 +1696,7 @@ build_id_verify (const char *filename, s
|
||||
@@ -1274,7 +1669,7 @@ build_id_verify (const char *filename, s
|
||||
if (abfd == NULL)
|
||||
return 0;
|
||||
|
||||
@ -668,7 +677,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
|
||||
if (found == NULL)
|
||||
warning (_("File \"%s\" has no build-id, file skipped"), filename);
|
||||
@@ -1317,8 +1712,9 @@ build_id_verify (const char *filename, s
|
||||
@@ -1290,8 +1685,9 @@ build_id_verify (const char *filename, s
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -680,7 +689,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
{
|
||||
char *link, *s, *retval = NULL;
|
||||
gdb_byte *data = build_id->data;
|
||||
@@ -1326,7 +1722,9 @@ build_id_to_debug_filename (struct build
|
||||
@@ -1299,7 +1695,9 @@ build_id_to_debug_filename (struct build
|
||||
|
||||
/* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
|
||||
link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
|
||||
@ -691,7 +700,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
s = link + sprintf (link, "%s/.build-id/", debug_file_directory);
|
||||
if (size > 0)
|
||||
{
|
||||
@@ -1337,12 +1735,14 @@ build_id_to_debug_filename (struct build
|
||||
@@ -1310,12 +1708,14 @@ build_id_to_debug_filename (struct build
|
||||
*s++ = '/';
|
||||
while (size-- > 0)
|
||||
s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
@ -708,7 +717,7 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
|
||||
if (retval != NULL && !build_id_verify (retval, build_id))
|
||||
{
|
||||
@@ -1350,9 +1750,202 @@ build_id_to_debug_filename (struct build
|
||||
@@ -1323,9 +1723,202 @@ build_id_to_debug_filename (struct build
|
||||
retval = NULL;
|
||||
}
|
||||
|
||||
@ -911,7 +920,20 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
static char *
|
||||
get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
|
||||
{
|
||||
@@ -1447,23 +2040,27 @@ find_separate_debug_file (struct objfile
|
||||
@@ -1411,32 +2004,36 @@ static char *
|
||||
find_separate_debug_file (struct objfile *objfile)
|
||||
{
|
||||
asection *sect;
|
||||
- char *basename;
|
||||
- char *dir;
|
||||
- char *debugfile;
|
||||
+ char *basename = NULL;
|
||||
+ char *dir = NULL;
|
||||
+ char *debugfile = NULL;
|
||||
char *name_copy;
|
||||
- char *canon_name;
|
||||
+ char *canon_name = NULL;
|
||||
bfd_size_type debuglink_size;
|
||||
unsigned long crc32;
|
||||
int i;
|
||||
struct build_id *build_id;
|
||||
@ -944,64 +966,103 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
}
|
||||
|
||||
basename = get_debug_link_info (objfile, &crc32);
|
||||
@@ -1471,7 +2068,10 @@ find_separate_debug_file (struct objfile
|
||||
@@ -1444,7 +2041,7 @@ find_separate_debug_file (struct objfile
|
||||
if (basename == NULL)
|
||||
/* There's no separate debug info, hence there's no way we could
|
||||
load it => no warning. */
|
||||
- return NULL;
|
||||
+ {
|
||||
+ xfree (build_id_filename);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
dir = xstrdup (objfile->name);
|
||||
|
||||
@@ -1500,6 +2100,7 @@ find_separate_debug_file (struct objfile
|
||||
@@ -1460,23 +2057,19 @@ find_separate_debug_file (struct objfile
|
||||
gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i]));
|
||||
dir[i+1] = '\0';
|
||||
|
||||
- debugfile = alloca (strlen (debug_file_directory) + 1
|
||||
- + strlen (dir)
|
||||
- + strlen (DEBUG_SUBDIRECTORY)
|
||||
- + strlen ("/")
|
||||
- + strlen (basename)
|
||||
- + 1);
|
||||
+ debugfile = xmalloc (strlen (debug_file_directory) + 1
|
||||
+ + strlen (dir)
|
||||
+ + strlen (DEBUG_SUBDIRECTORY)
|
||||
+ + strlen ("/")
|
||||
+ + strlen (basename)
|
||||
+ + 1);
|
||||
|
||||
/* First try in the same directory as the original file. */
|
||||
strcpy (debugfile, dir);
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
+ xfree (build_id_filename);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
return xstrdup (debugfile);
|
||||
@@ -1513,6 +2114,7 @@ find_separate_debug_file (struct objfile
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */
|
||||
strcpy (debugfile, dir);
|
||||
@@ -1485,11 +2078,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
+ xfree (build_id_filename);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
return xstrdup (debugfile);
|
||||
@@ -1526,6 +2128,7 @@ find_separate_debug_file (struct objfile
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* Then try in the global debugfile directory. */
|
||||
strcpy (debugfile, debug_file_directory);
|
||||
@@ -1498,11 +2087,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
+ xfree (build_id_filename);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
return xstrdup (debugfile);
|
||||
@@ -1545,6 +2148,7 @@ find_separate_debug_file (struct objfile
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* If the file is in the sysroot, try using its base path in the
|
||||
global debugfile directory. */
|
||||
@@ -1517,20 +2102,19 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
+ xfree (build_id_filename);
|
||||
xfree (canon_name);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1552,6 +2156,12 @@ find_separate_debug_file (struct objfile
|
||||
}
|
||||
- {
|
||||
- xfree (canon_name);
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
}
|
||||
|
||||
+ if (build_id_filename != NULL)
|
||||
+ {
|
||||
+ build_id_print_missing (objfile->name, build_id_filename);
|
||||
+ xfree (build_id_filename);
|
||||
+ }
|
||||
+
|
||||
if (canon_name)
|
||||
xfree (canon_name);
|
||||
-
|
||||
- if (canon_name)
|
||||
- xfree (canon_name);
|
||||
|
||||
@@ -4275,4 +4885,16 @@ the global debug-file directory prepende
|
||||
+ debugfile = NULL;
|
||||
+ if (build_id_filename != NULL)
|
||||
+ build_id_print_missing (objfile->name, build_id_filename);
|
||||
+
|
||||
+cleanup_return_debugfile:
|
||||
+ xfree (build_id_filename);
|
||||
+ xfree (canon_name);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
- return NULL;
|
||||
+ return debugfile;
|
||||
}
|
||||
|
||||
|
||||
@@ -4220,4 +4804,16 @@ the global debug-file directory prepende
|
||||
NULL,
|
||||
show_debug_file_directory,
|
||||
&setlist, &showlist);
|
||||
@ -1018,10 +1079,11 @@ diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.c gdb
|
||||
+
|
||||
+ observer_attach_inferior_created (missing_debuginfos_change_inferior_created);
|
||||
}
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.1-unpatched/gdb/symfile.h gdb-6.7.1-patched/gdb/symfile.h
|
||||
--- gdb-6.7.1-unpatched/gdb/symfile.h 2008-02-21 05:01:55.000000000 +0100
|
||||
+++ gdb-6.7.1-patched/gdb/symfile.h 2008-02-21 04:58:13.000000000 +0100
|
||||
@@ -353,6 +353,13 @@ extern int symfile_map_offsets_to_segmen
|
||||
Index: gdb-6.7.50.20080227/gdb/symfile.h
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/symfile.h 2008-02-03 23:13:29.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/symfile.h 2008-03-01 10:30:50.000000000 +0100
|
||||
@@ -358,6 +358,13 @@ extern int symfile_map_offsets_to_segmen
|
||||
struct symfile_segment_data *get_symfile_segment_data (bfd *abfd);
|
||||
void free_symfile_segment_data (struct symfile_segment_data *data);
|
||||
|
||||
|
@ -1,17 +0,0 @@
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=232371
|
||||
|
||||
|
||||
diff -u -rup gdb-6.6-orig/gdb/linux-nat.c gdb-6.6/gdb/linux-nat.c
|
||||
--- gdb-6.6-orig/gdb/linux-nat.c 2007-03-15 19:55:40.000000000 -0400
|
||||
+++ gdb-6.6/gdb/linux-nat.c 2007-03-15 20:02:09.000000000 -0400
|
||||
@@ -1014,6 +1014,10 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
|
||||
{
|
||||
/* Try again with __WCLONE to check cloned processes. */
|
||||
pid = my_waitpid (GET_LWP (ptid), &status, __WCLONE);
|
||||
+ if (pid == -1 && errno == ECHILD)
|
||||
+ error (_("Can't attach %s (%s) - possible SELinux denial,"
|
||||
+ " check your /var/log/messages for `avc: denied'"),
|
||||
+ target_pid_to_str (ptid), safe_strerror (errno));
|
||||
lp->cloned = 1;
|
||||
}
|
||||
|
@ -1,26 +1,25 @@
|
||||
--- ./gdb/linux-nat.c 9 Feb 2007 20:52:16 -0000 1.56
|
||||
+++ ./gdb/linux-nat.c 22 Apr 2007 17:20:25 -0000
|
||||
@@ -378,9 +378,17 @@ child_follow_fork (struct target_ops *op
|
||||
2008-03-01 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
Remove the `[' character from the GDB-6.8 default message.
|
||||
|
||||
Index: gdb-6.7.50.20080227/gdb/linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/linux-nat.c 2008-03-01 10:30:48.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/linux-nat.c 2008-03-01 10:48:25.000000000 +0100
|
||||
@@ -415,7 +415,7 @@ linux_child_follow_fork (struct target_o
|
||||
/* Detach new forked process? */
|
||||
if (detach_fork)
|
||||
{
|
||||
+ static int advice_printed = 0;
|
||||
+
|
||||
+ target_terminal_ours ();
|
||||
+ fprintf_filtered (gdb_stdlog,
|
||||
+ _("[Detaching after fork from child process %d.%s]\n"),
|
||||
+ child_pid, (advice_printed ? "" :
|
||||
+ _(" (Try `set detach-on-fork off'.)")));
|
||||
+ advice_printed = 1;
|
||||
+
|
||||
if (debug_linux_nat)
|
||||
- if (info_verbose || debug_linux_nat)
|
||||
+ if (1 /* Fedora Bug 235197 */ || info_verbose || debug_linux_nat)
|
||||
{
|
||||
- target_terminal_ours ();
|
||||
target_terminal_ours ();
|
||||
fprintf_filtered (gdb_stdlog,
|
||||
"Detaching after fork from child process %d.\n",
|
||||
child_pid);
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ ./gdb/testsuite/gdb.base/fork-detach.c 22 Apr 2007 17:20:25 -0000
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.base/fork-detach.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.base/fork-detach.c 2008-03-01 10:30:49.000000000 +0100
|
||||
@@ -0,0 +1,57 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
@ -79,8 +78,10 @@
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ ./gdb/testsuite/gdb.base/fork-detach.exp 22 Apr 2007 17:20:25 -0000
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.base/fork-detach.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.base/fork-detach.exp 2008-03-01 10:49:36.000000000 +0100
|
||||
@@ -0,0 +1,43 @@
|
||||
+# Copyright 2007 Free Software Foundation, Inc.
|
||||
+
|
||||
@ -96,7 +97,7 @@
|
||||
+#
|
||||
+# 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.
|
||||
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+
|
||||
+if $tracelevel then {
|
||||
+ strace $tracelevel
|
||||
@ -123,5 +124,5 @@
|
||||
+gdb_run_cmd
|
||||
+# `Starting program: .*' prefix is available since gdb-6.7.
|
||||
+gdb_test "" \
|
||||
+ "\\\[Detaching after fork from child process.*Program exited normally\\..*" \
|
||||
+ "Detaching after fork from child process.*Program exited normally\\..*" \
|
||||
+ "Info message caught"
|
||||
|
@ -1,62 +0,0 @@
|
||||
TODO: ./gdb/testsuite/gdb.threads/watchthreads2.exp
|
||||
|
||||
It applies only to recent (~2.6.20) Linux kernels, on RHEL4 the behavior is not
|
||||
changed (and this patch has no effect there).
|
||||
|
||||
|
||||
--- ./gdb/testsuite/gdb.threads/watchthreads.exp 9 Jan 2007 17:59:14 -0000 1.3
|
||||
+++ ./gdb/testsuite/gdb.threads/watchthreads.exp 20 Apr 2007 19:11:01 -0000
|
||||
@@ -65,25 +65,42 @@ set inc_line [gdb_get_line_number "Loop
|
||||
|
||||
# Loop and continue to allow both watchpoints to be triggered.
|
||||
for {set i 0} {$i < 30} {incr i} {
|
||||
- set test_flag 0
|
||||
+ set test_flag_0 0
|
||||
+ set test_flag_1 0
|
||||
gdb_test_multiple "continue" "threaded watch loop" {
|
||||
- -re "Hardware watchpoint 2: args\\\[0\\\].*Old value = 0.*New value = 1.*main \\\(\\\) at .*watchthreads.c:$init_line.*$gdb_prompt $"
|
||||
- { set args_0 1; set test_flag 1 }
|
||||
- -re "Hardware watchpoint 3: args\\\[1\\\].*Old value = 0.*New value = 1.*main \\\(\\\) at .*watchthreads.c:$init_line.*$gdb_prompt $"
|
||||
- { set args_1 1; set test_flag 1 }
|
||||
- -re "Hardware watchpoint 2: args\\\[0\\\].*Old value = $args_0.*New value = [expr $args_0+1].*in thread_function \\\(arg=0x0\\\) at .*watchthreads.c:$inc_line.*$gdb_prompt $"
|
||||
- { set args_0 [expr $args_0+1]; set test_flag 1 }
|
||||
- -re "Hardware watchpoint 3: args\\\[1\\\].*Old value = $args_1.*New value = [expr $args_1+1].*in thread_function \\\(arg=0x1\\\) at .*watchthreads.c:$inc_line.*$gdb_prompt $"
|
||||
- { set args_1 [expr $args_1+1]; set test_flag 1 }
|
||||
+ -re "(.*)$gdb_prompt $" {
|
||||
+ set test_flag_1 1
|
||||
+ set string $expect_out(1,string)
|
||||
+ foreach match [regexp -nocase -all -inline "Hardware watchpoint .*? at .*?watchthreads.c:\[0-9\]*\r" $string] {
|
||||
+ # FIXME: Test also for the trailing: \[^\r\]*main \\\(\\\) at .*?watchthreads.c:$init_line\r
|
||||
+ # We cannot test the line position as we do not get it for the
|
||||
+ # non-active threads (not being last in the list).
|
||||
+ if [regexp "Hardware watchpoint 2: args\\\[0\\\]\[^\r\]*\r\[^\r\]*\r\[^\r\]*Old value = 0\[^\r\]*\r\[^\r\]*New value = 1\r" $match] {
|
||||
+ set args_0 1; set test_flag_0 1
|
||||
+ }
|
||||
+ # FIXME: Test also for the trailing: \[^\r\]*main \\\(\\\) at .*?watchthreads.c:$init_line\r
|
||||
+ if [regexp "Hardware watchpoint 3: args\\\[1\\\]\[^\r\]*\r\[^\r\]*\r\[^\r\]*Old value = 0\[^\r\]*\r\[^\r\]*New value = 1\r" $match] {
|
||||
+ set args_1 1; set test_flag_0 1
|
||||
+ }
|
||||
+ # FIXME: Test also for the trailing: \[^\r\]*thread_function \\\(arg=0x0\\\) at .*?watchthreads.c:$inc_line\r
|
||||
+ if [regexp "Hardware watchpoint 2: args\\\[0\\\]\[^\r\]*\r\[^\r\]*\r\[^\r\]*Old value = $args_0\[^\r\]*\r\[^\r\]*New value = [expr $args_0+1]\r" $match] {
|
||||
+ set args_0 [expr $args_0+1]; set test_flag_0 1
|
||||
+ }
|
||||
+ # FIXME: Test also for the trailing: \[^\r\]*thread_function \\\(arg=0x0\\\) at .*?watchthreads.c:$inc_line\r
|
||||
+ if [regexp "Hardware watchpoint 3: args\\\[1\\\]\[^\r\]*\r\[^\r\]*\r\[^\r\]*Old value = $args_1\[^\r\]*\r\[^\r\]*New value = [expr $args_1+1]\r" $match] {
|
||||
+ set args_1 [expr $args_1+1]; set test_flag_0 1
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
# If we fail above, don't bother continuing loop
|
||||
- if { $test_flag == 0 } {
|
||||
+ if { $test_flag_0 == 0 || $test_flag_1 == 0 } {
|
||||
set i 30;
|
||||
}
|
||||
}
|
||||
|
||||
# Print success message if loop succeeded.
|
||||
-if { $test_flag == 1 } {
|
||||
+if { $test_flag_0 == 1 && $test_flag_1 == 1 } {
|
||||
pass "threaded watch loop"
|
||||
}
|
||||
|
@ -6,9 +6,15 @@
|
||||
(linux_xfer_partial_lwp): ... here.
|
||||
(linux_xfer_partial): New function wrapping LINUX_XFER_PARTIAL_LWP.
|
||||
|
||||
--- ./gdb/linux-nat.c 3 Jul 2007 17:01:55 -0000 1.65
|
||||
+++ ./gdb/linux-nat.c 7 Jul 2007 15:21:57 -0000
|
||||
@@ -1343,6 +1343,31 @@ linux_handle_extended_wait (struct lwp_i
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.c 2008-02-21 12:03:38.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.c 2008-02-21 12:05:01.000000000 +0100
|
||||
@@ -1570,6 +1570,31 @@ linux_handle_extended_wait (struct lwp_i
|
||||
_("unknown ptrace event %d"), event);
|
||||
}
|
||||
|
||||
@ -40,7 +46,7 @@
|
||||
/* Wait for LP to stop. Returns the wait status, or 0 if the LWP has
|
||||
exited. */
|
||||
|
||||
@@ -1350,16 +1375,31 @@ static int
|
||||
@@ -1577,16 +1602,31 @@ static int
|
||||
wait_lwp (struct lwp_info *lp)
|
||||
{
|
||||
pid_t pid;
|
||||
@ -76,7 +82,7 @@
|
||||
if (pid == -1 && errno == ECHILD)
|
||||
{
|
||||
/* The thread has previously exited. We need to delete it
|
||||
@@ -3144,10 +3159,12 @@ linux_proc_pending_signals (int pid, sig
|
||||
@@ -3451,10 +3491,12 @@ linux_proc_pending_signals (int pid, sig
|
||||
fclose (procfile);
|
||||
}
|
||||
|
||||
@ -92,7 +98,7 @@
|
||||
{
|
||||
LONGEST xfer;
|
||||
|
||||
@@ -3164,6 +3181,45 @@ linux_xfer_partial (struct target_ops *o
|
||||
@@ -3495,6 +3537,45 @@ linux_xfer_partial (struct target_ops *o
|
||||
offset, len);
|
||||
}
|
||||
|
||||
@ -135,6 +141,6 @@
|
||||
+ return xfer;
|
||||
+}
|
||||
+
|
||||
/* Create a prototype generic Linux target. The client can override
|
||||
/* Create a prototype generic GNU/Linux target. The client can override
|
||||
it with local methods. */
|
||||
|
||||
|
@ -1,422 +0,0 @@
|
||||
2007-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* dwarf2read.c (dwarf2_get_pc_bounds): Moved the `DW_AT_ranges' parsing
|
||||
code with its variables OBJFILE, CU_HEADER and OBFD into ...
|
||||
(dwarf2_ranges_read): ... a new function.
|
||||
(read_partial_die): Implemented the parsing of `DW_AT_ranges'.
|
||||
|
||||
2007-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.dwarf2/dw2-ranges.S, gdb.dwarf2/dw2-ranges.exp,
|
||||
gdb.dwarf2/dw2-ranges.lds: New files.
|
||||
|
||||
--- ./gdb/dwarf2read.c 26 Sep 2007 13:59:54 -0000 1.232
|
||||
+++ ./gdb/dwarf2read.c 9 Oct 2007 15:03:09 -0000
|
||||
@@ -3075,6 +3075,124 @@ read_lexical_block_scope (struct die_inf
|
||||
local_symbols = new->locals;
|
||||
}
|
||||
|
||||
+/* Get low and high pc attributes from DW_AT_ranges attribute value OFFSET.
|
||||
+ Return 1 if the attributes are present and valid, otherwise, return 0. */
|
||||
+
|
||||
+static int
|
||||
+dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
|
||||
+ CORE_ADDR *high_return, struct dwarf2_cu *cu)
|
||||
+{
|
||||
+ struct objfile *objfile = cu->objfile;
|
||||
+ struct comp_unit_head *cu_header = &cu->header;
|
||||
+ bfd *obfd = objfile->obfd;
|
||||
+ unsigned int addr_size = cu_header->addr_size;
|
||||
+ CORE_ADDR mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
|
||||
+ /* Base address selection entry. */
|
||||
+ CORE_ADDR base;
|
||||
+ int found_base;
|
||||
+ unsigned int dummy;
|
||||
+ gdb_byte *buffer;
|
||||
+ CORE_ADDR marker;
|
||||
+ int low_set;
|
||||
+ CORE_ADDR low = 0;
|
||||
+ CORE_ADDR high = 0;
|
||||
+
|
||||
+ found_base = cu_header->base_known;
|
||||
+ base = cu_header->base_address;
|
||||
+
|
||||
+ if (offset >= dwarf2_per_objfile->ranges_size)
|
||||
+ {
|
||||
+ complaint (&symfile_complaints,
|
||||
+ _("Offset %d out of bounds for DW_AT_ranges attribute"),
|
||||
+ offset);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ buffer = dwarf2_per_objfile->ranges_buffer + offset;
|
||||
+
|
||||
+ /* Read in the largest possible address. */
|
||||
+ marker = read_address (obfd, buffer, cu, &dummy);
|
||||
+ if ((marker & mask) == mask)
|
||||
+ {
|
||||
+ /* If we found the largest possible address, then
|
||||
+ read the base address. */
|
||||
+ base = read_address (obfd, buffer + addr_size, cu, &dummy);
|
||||
+ buffer += 2 * addr_size;
|
||||
+ offset += 2 * addr_size;
|
||||
+ found_base = 1;
|
||||
+ }
|
||||
+
|
||||
+ low_set = 0;
|
||||
+
|
||||
+ while (1)
|
||||
+ {
|
||||
+ CORE_ADDR range_beginning, range_end;
|
||||
+
|
||||
+ range_beginning = read_address (obfd, buffer, cu, &dummy);
|
||||
+ buffer += addr_size;
|
||||
+ range_end = read_address (obfd, buffer, cu, &dummy);
|
||||
+ buffer += addr_size;
|
||||
+ offset += 2 * addr_size;
|
||||
+
|
||||
+ /* An end of list marker is a pair of zero addresses. */
|
||||
+ if (range_beginning == 0 && range_end == 0)
|
||||
+ /* Found the end of list entry. */
|
||||
+ break;
|
||||
+
|
||||
+ /* Each base address selection entry is a pair of 2 values.
|
||||
+ The first is the largest possible address, the second is
|
||||
+ the base address. Check for a base address here. */
|
||||
+ if ((range_beginning & mask) == mask)
|
||||
+ {
|
||||
+ /* If we found the largest possible address, then
|
||||
+ read the base address. */
|
||||
+ base = read_address (obfd, buffer + addr_size, cu, &dummy);
|
||||
+ found_base = 1;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (!found_base)
|
||||
+ {
|
||||
+ /* We have no valid base address for the ranges
|
||||
+ data. */
|
||||
+ complaint (&symfile_complaints,
|
||||
+ _("Invalid .debug_ranges data (no base address)"));
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ range_beginning += base;
|
||||
+ range_end += base;
|
||||
+
|
||||
+ /* FIXME: This is recording everything as a low-high
|
||||
+ segment of consecutive addresses. We should have a
|
||||
+ data structure for discontiguous block ranges
|
||||
+ instead. */
|
||||
+ if (! low_set)
|
||||
+ {
|
||||
+ low = range_beginning;
|
||||
+ high = range_end;
|
||||
+ low_set = 1;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (range_beginning < low)
|
||||
+ low = range_beginning;
|
||||
+ if (range_end > high)
|
||||
+ high = range_end;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (! low_set)
|
||||
+ /* If the first entry is an end-of-list marker, the range
|
||||
+ describes an empty scope, i.e. no instructions. */
|
||||
+ return 0;
|
||||
+
|
||||
+ if (low_return)
|
||||
+ *low_return = low;
|
||||
+ if (high_return)
|
||||
+ *high_return = high;
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
/* Get low and high pc attributes from a die. Return 1 if the attributes
|
||||
are present and valid, otherwise, return 0. Return -1 if the range is
|
||||
discontinuous, i.e. derived from DW_AT_ranges information. */
|
||||
@@ -3082,10 +3200,7 @@ static int
|
||||
dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
|
||||
CORE_ADDR *highpc, struct dwarf2_cu *cu)
|
||||
{
|
||||
- struct objfile *objfile = cu->objfile;
|
||||
- struct comp_unit_head *cu_header = &cu->header;
|
||||
struct attribute *attr;
|
||||
- bfd *obfd = objfile->obfd;
|
||||
CORE_ADDR low = 0;
|
||||
CORE_ADDR high = 0;
|
||||
int ret = 0;
|
||||
@@ -3109,108 +3224,11 @@ dwarf2_get_pc_bounds (struct die_info *d
|
||||
attr = dwarf2_attr (die, DW_AT_ranges, cu);
|
||||
if (attr != NULL)
|
||||
{
|
||||
- unsigned int addr_size = cu_header->addr_size;
|
||||
- CORE_ADDR mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
|
||||
/* Value of the DW_AT_ranges attribute is the offset in the
|
||||
.debug_ranges section. */
|
||||
- unsigned int offset = DW_UNSND (attr);
|
||||
- /* Base address selection entry. */
|
||||
- CORE_ADDR base;
|
||||
- int found_base;
|
||||
- unsigned int dummy;
|
||||
- gdb_byte *buffer;
|
||||
- CORE_ADDR marker;
|
||||
- int low_set;
|
||||
-
|
||||
- found_base = cu_header->base_known;
|
||||
- base = cu_header->base_address;
|
||||
-
|
||||
- if (offset >= dwarf2_per_objfile->ranges_size)
|
||||
- {
|
||||
- complaint (&symfile_complaints,
|
||||
- _("Offset %d out of bounds for DW_AT_ranges attribute"),
|
||||
- offset);
|
||||
- return 0;
|
||||
- }
|
||||
- buffer = dwarf2_per_objfile->ranges_buffer + offset;
|
||||
-
|
||||
- /* Read in the largest possible address. */
|
||||
- marker = read_address (obfd, buffer, cu, &dummy);
|
||||
- if ((marker & mask) == mask)
|
||||
- {
|
||||
- /* If we found the largest possible address, then
|
||||
- read the base address. */
|
||||
- base = read_address (obfd, buffer + addr_size, cu, &dummy);
|
||||
- buffer += 2 * addr_size;
|
||||
- offset += 2 * addr_size;
|
||||
- found_base = 1;
|
||||
- }
|
||||
-
|
||||
- low_set = 0;
|
||||
-
|
||||
- while (1)
|
||||
- {
|
||||
- CORE_ADDR range_beginning, range_end;
|
||||
-
|
||||
- range_beginning = read_address (obfd, buffer, cu, &dummy);
|
||||
- buffer += addr_size;
|
||||
- range_end = read_address (obfd, buffer, cu, &dummy);
|
||||
- buffer += addr_size;
|
||||
- offset += 2 * addr_size;
|
||||
-
|
||||
- /* An end of list marker is a pair of zero addresses. */
|
||||
- if (range_beginning == 0 && range_end == 0)
|
||||
- /* Found the end of list entry. */
|
||||
- break;
|
||||
-
|
||||
- /* Each base address selection entry is a pair of 2 values.
|
||||
- The first is the largest possible address, the second is
|
||||
- the base address. Check for a base address here. */
|
||||
- if ((range_beginning & mask) == mask)
|
||||
- {
|
||||
- /* If we found the largest possible address, then
|
||||
- read the base address. */
|
||||
- base = read_address (obfd, buffer + addr_size, cu, &dummy);
|
||||
- found_base = 1;
|
||||
- continue;
|
||||
- }
|
||||
-
|
||||
- if (!found_base)
|
||||
- {
|
||||
- /* We have no valid base address for the ranges
|
||||
- data. */
|
||||
- complaint (&symfile_complaints,
|
||||
- _("Invalid .debug_ranges data (no base address)"));
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- range_beginning += base;
|
||||
- range_end += base;
|
||||
-
|
||||
- /* FIXME: This is recording everything as a low-high
|
||||
- segment of consecutive addresses. We should have a
|
||||
- data structure for discontiguous block ranges
|
||||
- instead. */
|
||||
- if (! low_set)
|
||||
- {
|
||||
- low = range_beginning;
|
||||
- high = range_end;
|
||||
- low_set = 1;
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- if (range_beginning < low)
|
||||
- low = range_beginning;
|
||||
- if (range_end > high)
|
||||
- high = range_end;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (! low_set)
|
||||
- /* If the first entry is an end-of-list marker, the range
|
||||
- describes an empty scope, i.e. no instructions. */
|
||||
+ if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu))
|
||||
return 0;
|
||||
-
|
||||
+ /* Found discontinuous range of addresses. */
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
@@ -5571,6 +5589,11 @@ read_partial_die (struct partial_die_inf
|
||||
has_high_pc_attr = 1;
|
||||
part_die->highpc = DW_ADDR (&attr);
|
||||
break;
|
||||
+ case DW_AT_ranges:
|
||||
+ if (dwarf2_ranges_read (DW_UNSND (&attr), &part_die->lowpc,
|
||||
+ &part_die->highpc, cu))
|
||||
+ has_low_pc_attr = has_high_pc_attr = 1;
|
||||
+ break;
|
||||
case DW_AT_location:
|
||||
/* Support the .debug_loc offsets */
|
||||
if (attr_form_is_block (&attr))
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges.S 9 Oct 2007 15:03:10 -0000
|
||||
@@ -0,0 +1,33 @@
|
||||
+/*
|
||||
+ Copyright 2007 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 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+ .text
|
||||
+
|
||||
+ .section .text._start, "ax", @progbits
|
||||
+ .globl _start
|
||||
+ .func _start
|
||||
+_start: call func
|
||||
+ .endfunc
|
||||
+ .size _start, . - _start
|
||||
+
|
||||
+ .section .text.func, "ax", @progbits
|
||||
+ .globl func
|
||||
+ .func func
|
||||
+func: int3
|
||||
+ nop
|
||||
+ .endfunc
|
||||
+ .size func, . - func
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges.exp 9 Oct 2007 15:03:10 -0000
|
||||
@@ -0,0 +1,82 @@
|
||||
+# Copyright 2007 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 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+# Test DW_TAG_compile_unit with no children and with neither DW_AT_low_pc nor
|
||||
+# DW_AT_high_pc but with DW_AT_ranges instead. We created the hole there for
|
||||
+# DW_AT_ranges by the linker script.
|
||||
+
|
||||
+# This test can only be run on targets which support DWARF-2 and use gas.
|
||||
+# For now pick a sampling of likely targets.
|
||||
+if {![istarget *-*-linux*]
|
||||
+ && ![istarget *-*-gnu*]
|
||||
+ && ![istarget *-*-elf*]
|
||||
+ && ![istarget *-*-openbsd*]
|
||||
+ && ![istarget arm-*-eabi*]
|
||||
+ && ![istarget powerpc-*-eabi*]} {
|
||||
+ verbose "Skipping i386/amd64 DW_AT_ranges test."
|
||||
+ return 0
|
||||
+}
|
||||
+if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } then {
|
||||
+ verbose "Skipping i386/amd64 DW_AT_ranges test."
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+set testfile "dw2-ranges"
|
||||
+set srcfile ${testfile}.S
|
||||
+set ldsfile ${testfile}.lds
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+
|
||||
+# Avoid `-lm' from `lib/ada.exp' as it would fail with out `-nostdlib'.
|
||||
+# Provide BOARD for SET_BOARD_INFO.
|
||||
+set board [target_info name]
|
||||
+set_board_info mathlib ""
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "additional_flags=-Wl,--script=${srcdir}/${subdir}/${ldsfile} -nostdlib"]] != "" } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+# Former wrong output:
|
||||
+# Program received signal SIGTRAP, Trace/breakpoint trap.
|
||||
+# 0x000000000000002b in func ()
|
||||
+# (gdb) bt
|
||||
+# #0 0x000000000000002b in func ()
|
||||
+# #1 0x0000000000000029 in _start ()
|
||||
+# (gdb) _
|
||||
+# Correct output:
|
||||
+# Program received signal SIGTRAP, Trace/breakpoint trap.
|
||||
+# func () at dw2-ranges.S:14
|
||||
+# 14 nop
|
||||
+# Current language: auto; currently asm
|
||||
+# (gdb) bt
|
||||
+# #0 func () at dw2-ranges.S:14
|
||||
+# #1 0x0000000000000029 in _start () at dw2-ranges.S:6
|
||||
+# (gdb) _
|
||||
+# The entry #1 is missing on i386.
|
||||
+# "#0 +func \\(\\) at .*dw2-ranges.S:\[0-9\]+\r\n#1 .*in _start \\(\\) at .*dw2-ranges.S:\[0-9\]+"
|
||||
+
|
||||
+gdb_run_cmd
|
||||
+set test "run"
|
||||
+gdb_test_multiple "" "$test" {
|
||||
+ -re "Program received signal SIGTRAP,.*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+gdb_test "backtrace" "#0 +func \\(\\) at .*dw2-ranges.S:\[0-9\]+"
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges.lds 9 Oct 2007 15:03:10 -0000
|
||||
@@ -0,0 +1,25 @@
|
||||
+/*
|
||||
+ Copyright 2007 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 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+SECTIONS
|
||||
+{
|
||||
+ .text._start : { *(.text._start) }
|
||||
+ /* Create the hole. */
|
||||
+ . = . + 1;
|
||||
+ .text.func : { *(.text.func) }
|
||||
+}
|
||||
+ENTRY(_start)
|
@ -14,38 +14,93 @@ http://sourceware.org/ml/gdb-patches/2008-01/msg00042.html
|
||||
* gdb.texinfo (Setting Watchpoints): New paragraph on the software
|
||||
watchpoints safety wrt `set scheduler-locking'.
|
||||
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/amd64-linux-nat.c gdb-6.7.1/gdb/amd64-linux-nat.c
|
||||
--- gdb-6.7.1-orig/gdb/amd64-linux-nat.c 2008-01-11 20:59:17.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/amd64-linux-nat.c 2008-01-11 20:49:42.000000000 +0100
|
||||
@@ -501,6 +501,12 @@ amd64_linux_insert_watchpoint (CORE_ADDR
|
||||
return rc;
|
||||
2008-03-01 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.7.50.20080227/gdb/amd64-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/amd64-linux-nat.c 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/amd64-linux-nat.c 2008-03-01 16:33:40.000000000 +0100
|
||||
@@ -408,25 +408,43 @@ amd64_linux_dr_set (ptid_t ptid, int reg
|
||||
void
|
||||
amd64_linux_dr_set_control (unsigned long control)
|
||||
{
|
||||
- struct lwp_info *lp;
|
||||
- ptid_t ptid;
|
||||
-
|
||||
amd64_linux_dr[DR_CONTROL] = control;
|
||||
- ALL_LWPS (lp, ptid)
|
||||
- amd64_linux_dr_set (ptid, DR_CONTROL, control);
|
||||
+
|
||||
+ /* I386_DETACH_BREAKPOINTS may need to reset the registers on single process
|
||||
+ not listed for ALL_LWPS. */
|
||||
+
|
||||
+ if (ptid_get_lwp (inferior_ptid) == 0)
|
||||
+ amd64_linux_dr_set (inferior_ptid, DR_CONTROL, control);
|
||||
+ else
|
||||
+ {
|
||||
+ struct lwp_info *lp;
|
||||
+ ptid_t ptid;
|
||||
+
|
||||
+ ALL_LWPS (lp, ptid)
|
||||
+ amd64_linux_dr_set (ptid, DR_CONTROL, control);
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr)
|
||||
{
|
||||
- struct lwp_info *lp;
|
||||
- ptid_t ptid;
|
||||
-
|
||||
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
|
||||
|
||||
amd64_linux_dr[DR_FIRSTADDR + regnum] = addr;
|
||||
- ALL_LWPS (lp, ptid)
|
||||
- amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
|
||||
+
|
||||
+ /* I386_DETACH_BREAKPOINTS may need to reset the registers on single process
|
||||
+ not listed for ALL_LWPS. */
|
||||
+
|
||||
+ if (ptid_get_lwp (inferior_ptid) == 0)
|
||||
+ amd64_linux_dr_set (inferior_ptid, DR_FIRSTADDR + regnum, addr);
|
||||
+ else
|
||||
+ {
|
||||
+ struct lwp_info *lp;
|
||||
+ ptid_t ptid;
|
||||
+
|
||||
+ ALL_LWPS (lp, ptid)
|
||||
+ amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
@@ -451,6 +469,41 @@ amd64_linux_new_thread (ptid_t ptid)
|
||||
|
||||
amd64_linux_dr_set (ptid, DR_CONTROL, amd64_linux_dr[DR_CONTROL]);
|
||||
}
|
||||
+
|
||||
+/* TO_FOLLOW_FORK stores here the PID under DETACH_BREAKPOINTS for the child
|
||||
+ process of traced FORK. We must clear such watchpoints only once during
|
||||
+ DETACH_BREAKPOINTS. */
|
||||
+
|
||||
+static int amd64_linux_detach_breakpoints_pid;
|
||||
+
|
||||
/* Remove a watchpoint that watched the memory region which starts at
|
||||
address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
type TYPE. Return 0 on success, -1 on failure. */
|
||||
@@ -508,12 +514,33 @@ int
|
||||
amd64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
int rc;
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ type TYPE. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+amd64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
+{
|
||||
+ if (ptid_get_pid (inferior_ptid) == amd64_linux_detach_breakpoints_pid)
|
||||
+ return 0;
|
||||
+ /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */
|
||||
+ amd64_linux_detach_breakpoints_pid = 0;
|
||||
+
|
||||
rc = i386_remove_watchpoint (addr, len, type);
|
||||
if (!rc)
|
||||
amd64_linux_sync_debug_registers_across_threads ();
|
||||
return rc;
|
||||
}
|
||||
|
||||
+ return i386_remove_watchpoint (addr, len, type);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+amd64_linux_detach_breakpoints (int detached_pid)
|
||||
+{
|
||||
@ -60,24 +115,10 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/amd64-linux-nat.c gdb-6.7.1/gdb/amd64-linux-nat
|
||||
+
|
||||
+ do_cleanups (old_chain);
|
||||
+}
|
||||
+
|
||||
/* Insert a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
unused. Return 0 on success, EBUSY on failure. */
|
||||
int
|
||||
@@ -532,6 +559,12 @@ int
|
||||
amd64_linux_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
|
||||
{
|
||||
int rc;
|
||||
+
|
||||
+ if (ptid_get_pid (inferior_ptid) == amd64_linux_detach_breakpoints_pid)
|
||||
+ return 0;
|
||||
+ /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */
|
||||
+ amd64_linux_detach_breakpoints_pid = 0;
|
||||
+
|
||||
rc = i386_remove_hw_breakpoint (bp_tgt);
|
||||
if (!rc)
|
||||
amd64_linux_sync_debug_registers_across_threads ();
|
||||
@@ -620,6 +653,41 @@ amd64_linux_child_post_startup_inferior
|
||||
|
||||
|
||||
/* This function is called by libthread_db as part of its handling of
|
||||
@@ -520,6 +573,41 @@ amd64_linux_child_post_startup_inferior
|
||||
i386_cleanup_dregs ();
|
||||
super_post_startup_inferior (ptid);
|
||||
}
|
||||
@ -119,7 +160,7 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/amd64-linux-nat.c gdb-6.7.1/gdb/amd64-linux-nat
|
||||
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
@@ -656,6 +724,9 @@ _initialize_amd64_linux_nat (void)
|
||||
@@ -556,6 +644,9 @@ _initialize_amd64_linux_nat (void)
|
||||
linux_elfcore_write_prstatus = amd64_linux_elfcore_write_prstatus;
|
||||
linux_elfcore_write_prfpreg = amd64_linux_elfcore_write_prfpreg;
|
||||
|
||||
@ -128,51 +169,99 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/amd64-linux-nat.c gdb-6.7.1/gdb/amd64-linux-nat
|
||||
+
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/config/i386/nm-i386.h gdb-6.7.1/gdb/config/i386/nm-i386.h
|
||||
--- gdb-6.7.1-orig/gdb/config/i386/nm-i386.h 2007-08-23 20:08:48.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/config/i386/nm-i386.h 2008-01-11 20:47:42.000000000 +0100
|
||||
@@ -114,6 +114,8 @@ extern int i386_stopped_by_watchpoint (v
|
||||
reset all debug registers by calling i386_cleanup_dregs (). */
|
||||
#define CHILD_POST_STARTUP_INFERIOR
|
||||
linux_nat_set_new_thread (t, amd64_linux_new_thread);
|
||||
Index: gdb-6.7.50.20080227/gdb/config/i386/nm-i386.h
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/config/i386/nm-i386.h 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/config/i386/nm-i386.h 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -110,6 +110,8 @@ extern int i386_stopped_by_watchpoint (v
|
||||
#define target_remove_hw_breakpoint(bp_tgt) \
|
||||
i386_remove_hw_breakpoint (bp_tgt)
|
||||
|
||||
+extern void i386_detach_breakpoints (int detached_pid);
|
||||
+
|
||||
#endif /* I386_USE_GENERIC_WATCHPOINTS */
|
||||
|
||||
#endif /* NM_I386_H */
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/i386-linux-nat.c gdb-6.7.1/gdb/i386-linux-nat.c
|
||||
--- gdb-6.7.1-orig/gdb/i386-linux-nat.c 2008-01-11 20:59:17.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/i386-linux-nat.c 2008-01-11 20:49:52.000000000 +0100
|
||||
@@ -745,6 +745,12 @@ i386_linux_insert_watchpoint (CORE_ADDR
|
||||
return rc;
|
||||
Index: gdb-6.7.50.20080227/gdb/i386-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/i386-linux-nat.c 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/i386-linux-nat.c 2008-03-01 16:33:40.000000000 +0100
|
||||
@@ -655,21 +655,42 @@ i386_linux_dr_set_control (unsigned long
|
||||
ptid_t ptid;
|
||||
|
||||
i386_linux_dr[DR_CONTROL] = control;
|
||||
- ALL_LWPS (lp, ptid)
|
||||
- i386_linux_dr_set (ptid, DR_CONTROL, control);
|
||||
+
|
||||
+ /* I386_DETACH_BREAKPOINTS may need to reset the registers on single process
|
||||
+ not listed for ALL_LWPS. */
|
||||
+
|
||||
+ if (ptid_get_lwp (inferior_ptid) == 0)
|
||||
+ i386_linux_dr_set (inferior_ptid, DR_CONTROL, control);
|
||||
+ else
|
||||
+ {
|
||||
+ struct lwp_info *lp;
|
||||
+ ptid_t ptid;
|
||||
+
|
||||
+ ALL_LWPS (lp, ptid)
|
||||
+ i386_linux_dr_set (ptid, DR_CONTROL, control);
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
i386_linux_dr_set_addr (int regnum, CORE_ADDR addr)
|
||||
{
|
||||
- struct lwp_info *lp;
|
||||
- ptid_t ptid;
|
||||
-
|
||||
gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
|
||||
|
||||
i386_linux_dr[DR_FIRSTADDR + regnum] = addr;
|
||||
- ALL_LWPS (lp, ptid)
|
||||
- i386_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
|
||||
+
|
||||
+ /* I386_DETACH_BREAKPOINTS may need to reset the registers on single process
|
||||
+ not listed for ALL_LWPS. */
|
||||
+
|
||||
+ if (ptid_get_lwp (inferior_ptid) == 0)
|
||||
+ i386_linux_dr_set (inferior_ptid, DR_FIRSTADDR + regnum, addr);
|
||||
+ else
|
||||
+ {
|
||||
+ struct lwp_info *lp;
|
||||
+ ptid_t ptid;
|
||||
+
|
||||
+ ALL_LWPS (lp, ptid)
|
||||
+ i386_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
@@ -694,6 +715,41 @@ i386_linux_new_thread (ptid_t ptid)
|
||||
|
||||
i386_linux_dr_set (ptid, DR_CONTROL, i386_linux_dr[DR_CONTROL]);
|
||||
}
|
||||
+
|
||||
+/* TO_FOLLOW_FORK stores here the PID under DETACH_BREAKPOINTS for the child
|
||||
+ process of traced FORK. We must clear such watchpoints only once during
|
||||
+ DETACH_BREAKPOINTS. */
|
||||
+
|
||||
+static int i386_linux_detach_breakpoints_pid;
|
||||
+
|
||||
/* Remove a watchpoint that watched the memory region which starts at
|
||||
address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
type TYPE. Return 0 on success, -1 on failure. */
|
||||
@@ -752,12 +758,33 @@ int
|
||||
i386_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
int rc;
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ type TYPE. Return 0 on success, -1 on failure. */
|
||||
+int
|
||||
+i386_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
+{
|
||||
+ if (ptid_get_pid (inferior_ptid) == i386_linux_detach_breakpoints_pid)
|
||||
+ return 0;
|
||||
+ /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */
|
||||
+ i386_linux_detach_breakpoints_pid = 0;
|
||||
+
|
||||
rc = i386_remove_watchpoint (addr, len, type);
|
||||
if (!rc)
|
||||
i386_linux_sync_debug_registers_across_threads ();
|
||||
return rc;
|
||||
}
|
||||
|
||||
+ return i386_remove_watchpoint (addr, len, type);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+i386_linux_detach_breakpoints (int detached_pid)
|
||||
+{
|
||||
@ -187,11 +276,10 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-linux-nat.c gdb-6.7.1/gdb/i386-linux-nat.c
|
||||
+
|
||||
+ do_cleanups (old_chain);
|
||||
+}
|
||||
+
|
||||
/* Insert a hardware-assisted breakpoint at address ADDR. SHADOW is
|
||||
unused. Return 0 on success, EBUSY on failure. */
|
||||
int
|
||||
@@ -940,6 +967,40 @@ i386_linux_child_post_startup_inferior (
|
||||
|
||||
|
||||
/* Called by libthread_db. Returns a pointer to the thread local
|
||||
@@ -833,6 +889,40 @@ i386_linux_child_post_startup_inferior (
|
||||
super_post_startup_inferior (ptid);
|
||||
}
|
||||
|
||||
@ -232,7 +320,7 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-linux-nat.c gdb-6.7.1/gdb/i386-linux-nat.c
|
||||
void
|
||||
_initialize_i386_linux_nat (void)
|
||||
{
|
||||
@@ -959,6 +1020,9 @@ _initialize_i386_linux_nat (void)
|
||||
@@ -852,6 +942,9 @@ _initialize_i386_linux_nat (void)
|
||||
t->to_fetch_registers = i386_linux_fetch_inferior_registers;
|
||||
t->to_store_registers = i386_linux_store_inferior_registers;
|
||||
|
||||
@ -241,11 +329,12 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-linux-nat.c gdb-6.7.1/gdb/i386-linux-nat.c
|
||||
+
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/i386-nat.c gdb-6.7.1/gdb/i386-nat.c
|
||||
--- gdb-6.7.1-orig/gdb/i386-nat.c 2008-01-11 20:59:17.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/i386-nat.c 2008-01-11 20:47:57.000000000 +0100
|
||||
@@ -545,6 +546,17 @@ i386_remove_watchpoint (CORE_ADDR addr,
|
||||
linux_nat_set_new_thread (t, i386_linux_new_thread);
|
||||
Index: gdb-6.7.50.20080227/gdb/i386-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/i386-nat.c 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/i386-nat.c 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -544,6 +544,17 @@ i386_remove_watchpoint (CORE_ADDR addr,
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -263,10 +352,12 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-nat.c gdb-6.7.1/gdb/i386-nat.c
|
||||
/* Return non-zero if we can watch a memory region that starts at
|
||||
address ADDR and whose length is LEN bytes. */
|
||||
|
||||
--- gdb-6.5/gdb/ia64-linux-nat.c.orig 2008-01-12 15:47:40.000000000 +0100
|
||||
+++ gdb-6.5/gdb/ia64-linux-nat.c 2008-01-12 15:57:58.000000000 +0100
|
||||
@@ -664,12 +664,23 @@ ia64_linux_remove_watchpoint_callback (s
|
||||
args->len);
|
||||
Index: gdb-6.7.50.20080227/gdb/ia64-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/ia64-linux-nat.c 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/ia64-linux-nat.c 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -583,6 +583,12 @@ ia64_linux_insert_watchpoint (CORE_ADDR
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* TO_FOLLOW_FORK stores here the PID under DETACH_BREAKPOINTS for the child
|
||||
@ -275,23 +366,24 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-nat.c gdb-6.7.1/gdb/i386-nat.c
|
||||
+
|
||||
+static int ia64_linux_detach_breakpoints_pid;
|
||||
+
|
||||
/* Remove a watchpoint for all threads. */
|
||||
static int
|
||||
ia64_linux_remove_watchpoint (CORE_ADDR addr, int len)
|
||||
ia64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
struct linux_watchpoint args;
|
||||
@@ -590,6 +596,11 @@ ia64_linux_remove_watchpoint (CORE_ADDR
|
||||
long dbr_addr, dbr_mask;
|
||||
int max_watchpoints = 4;
|
||||
|
||||
+ if (ptid_get_pid (inferior_ptid) == ia64_linux_detach_breakpoints_pid)
|
||||
+ return 0;
|
||||
+ /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */
|
||||
+ ia64_linux_detach_breakpoints_pid = 0;
|
||||
+
|
||||
args.addr = addr;
|
||||
args.len = len;
|
||||
if (len <= 0 || !is_power_of_2 (len))
|
||||
return -1;
|
||||
|
||||
@@ -617,6 +628,22 @@ ia64_linux_remove_watchpoint (CORE_ADDR
|
||||
}
|
||||
|
||||
@@ -771,6 +782,22 @@ ia64_linux_xfer_partial (struct target_o
|
||||
/* Observer function for a new thread attach. We need to insert
|
||||
existing watchpoints on the new thread. */
|
||||
static void
|
||||
+ia64_linux_detach_breakpoints (int detached_pid)
|
||||
+{
|
||||
@ -311,9 +403,9 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-nat.c gdb-6.7.1/gdb/i386-nat.c
|
||||
+static void
|
||||
ia64_linux_new_thread (ptid_t ptid)
|
||||
{
|
||||
insert_watchpoints_for_new_thread (ptid,
|
||||
@@ -793,6 +820,40 @@ ia64_linux_save_sigtrap_info (void *queu
|
||||
lp->saved_trap_data);
|
||||
int i, any;
|
||||
@@ -805,6 +832,40 @@ ia64_linux_xfer_partial (struct target_o
|
||||
offset, len);
|
||||
}
|
||||
|
||||
+static int (*ia64_linux_super_follow_fork) (struct target_ops *ops,
|
||||
@ -353,21 +445,22 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/i386-nat.c gdb-6.7.1/gdb/i386-nat.c
|
||||
void _initialize_ia64_linux_nat (void);
|
||||
|
||||
/*
|
||||
@@ -865,6 +926,9 @@ _initialize_ia64_linux_nat (void)
|
||||
super_xfer_partial = t->to_xfer_partial;
|
||||
t->to_xfer_partial = ia64_linux_xfer_partial;
|
||||
@@ -899,6 +960,9 @@ _initialize_ia64_linux_nat (void)
|
||||
t->to_insert_watchpoint = ia64_linux_insert_watchpoint;
|
||||
t->to_remove_watchpoint = ia64_linux_remove_watchpoint;
|
||||
|
||||
+ ia64_linux_super_follow_fork = t->to_follow_fork;
|
||||
+ t->to_follow_fork = ia64_linux_follow_fork;
|
||||
+
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
--- gdb-6.7.1-orig/gdb/ppc-linux-nat.c 2007-08-30 15:13:59.000000000 +0200
|
||||
+++ gdb-6.7.1/gdb/ppc-linux-nat.c 2008-01-11 20:43:12.000000000 +0100
|
||||
@@ -837,12 +837,23 @@ ppc_linux_insert_watchpoint (CORE_ADDR a
|
||||
return ptrace (PTRACE_SET_DEBUGREG, tid, 0, dabr_value);
|
||||
linux_nat_set_new_thread (t, ia64_linux_new_thread);
|
||||
Index: gdb-6.7.50.20080227/gdb/ppc-linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/ppc-linux-nat.c 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/ppc-linux-nat.c 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -847,6 +847,12 @@ ppc_linux_insert_watchpoint (CORE_ADDR a
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* TO_FOLLOW_FORK stores here the PID under DETACH_BREAKPOINTS for the child
|
||||
@ -379,19 +472,20 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
static int
|
||||
ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw)
|
||||
{
|
||||
int tid;
|
||||
ptid_t ptid = inferior_ptid;
|
||||
@@ -854,6 +860,11 @@ ppc_linux_remove_watchpoint (CORE_ADDR a
|
||||
ptid_t ptid;
|
||||
long dabr_value = 0;
|
||||
|
||||
+ if (ptid_get_pid (inferior_ptid) == ppc_linux_detach_breakpoints_pid)
|
||||
+ return 0;
|
||||
+ /* FOLLOW-FORK-MODE CHILD runs later the CHILD with no restrictions. */
|
||||
+ ppc_linux_detach_breakpoints_pid = 0;
|
||||
+
|
||||
tid = TIDGET (ptid);
|
||||
if (tid == 0)
|
||||
tid = PIDGET (ptid);
|
||||
@@ -850,6 +861,15 @@ ppc_linux_remove_watchpoint (CORE_ADDR a
|
||||
return ptrace (PTRACE_SET_DEBUGREG, tid, 0, 0);
|
||||
saved_dabr_value = 0;
|
||||
ALL_LWPS (lp, ptid)
|
||||
if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0, saved_dabr_value) < 0)
|
||||
@@ -867,6 +878,15 @@ ppc_linux_new_thread (ptid_t ptid)
|
||||
ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0, saved_dabr_value);
|
||||
}
|
||||
|
||||
+static void
|
||||
@ -406,8 +500,8 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
static int
|
||||
ppc_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
|
||||
{
|
||||
@@ -945,6 +965,40 @@ fill_fpregset (const struct regcache *re
|
||||
fpregsetp, sizeof (*fpregsetp));
|
||||
@@ -976,6 +996,40 @@ ppc_linux_read_description (struct targe
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+static int (*ppc_linux_super_follow_fork) (struct target_ops *ops,
|
||||
@ -447,26 +541,28 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
void _initialize_ppc_linux_nat (void);
|
||||
|
||||
void
|
||||
@@ -967,6 +1021,9 @@ _initialize_ppc_linux_nat (void)
|
||||
t->to_stopped_by_watchpoint = ppc_linux_stopped_by_watchpoint;
|
||||
t->to_stopped_data_address = ppc_linux_stopped_data_address;
|
||||
@@ -1000,6 +1054,9 @@ _initialize_ppc_linux_nat (void)
|
||||
|
||||
t->to_read_description = ppc_linux_read_description;
|
||||
|
||||
+ ppc_linux_super_follow_fork = t->to_follow_fork;
|
||||
+ t->to_follow_fork = ppc_linux_follow_fork;
|
||||
+
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
}
|
||||
--- gdb-6.7.1-unpatched/gdb/s390-nat.c 2008-01-11 15:33:48.000000000 -0500
|
||||
+++ gdb-6.7.1/gdb/s390-nat.c 2008-01-11 15:35:50.000000000 -0500
|
||||
@@ -269,17 +269,15 @@ s390_stopped_by_watchpoint (void)
|
||||
linux_nat_set_new_thread (t, ppc_linux_new_thread);
|
||||
Index: gdb-6.7.50.20080227/gdb/s390-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/s390-nat.c 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/s390-nat.c 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -283,21 +283,15 @@ s390_stopped_by_watchpoint (void)
|
||||
}
|
||||
|
||||
static void
|
||||
-s390_fix_watch_points (ptid_t ptid)
|
||||
+s390_fix_watch_points_list (int tid, struct watch_area *area_list)
|
||||
+s390_fix_watch_points (int tid, struct watch_area *area_list)
|
||||
{
|
||||
- int tid = s390_tid (ptid);
|
||||
- int tid;
|
||||
-
|
||||
per_struct per_info;
|
||||
ptrace_area parea;
|
||||
@ -474,12 +570,16 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0;
|
||||
struct watch_area *area;
|
||||
|
||||
- tid = TIDGET (ptid);
|
||||
- if (tid == 0)
|
||||
- tid = PIDGET (ptid);
|
||||
-
|
||||
- for (area = watch_base; area; area = area->next)
|
||||
+ for (area = area_list; area; area = area->next)
|
||||
{
|
||||
watch_lo_addr = min (watch_lo_addr, area->lo_addr);
|
||||
watch_hi_addr = max (watch_hi_addr, area->hi_addr);
|
||||
@@ -291,7 +289,7 @@ s390_fix_watch_points (ptid_t ptid)
|
||||
@@ -309,7 +303,7 @@ s390_fix_watch_points (ptid_t ptid)
|
||||
if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea) < 0)
|
||||
perror_with_name (_("Couldn't retrieve watchpoint status"));
|
||||
|
||||
@ -488,20 +588,26 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
{
|
||||
per_info.control_regs.bits.em_storage_alteration = 1;
|
||||
per_info.control_regs.bits.storage_alt_space_ctl = 1;
|
||||
@@ -308,6 +306,12 @@ s390_fix_watch_points (ptid_t ptid)
|
||||
@@ -326,6 +320,18 @@ s390_fix_watch_points (ptid_t ptid)
|
||||
perror_with_name (_("Couldn't modify watchpoint status"));
|
||||
}
|
||||
|
||||
+static void
|
||||
+s390_fix_watch_points (ptid_t ptid)
|
||||
+{
|
||||
+ s390_fix_watch_points_list (s390_tid (ptid), watch_base);
|
||||
+ int tid;
|
||||
+
|
||||
+ tid = TIDGET (ptid);
|
||||
+ if (tid == 0)
|
||||
+ tid = PIDGET (ptid);
|
||||
+
|
||||
+ s390_fix_watch_points_list (tid, watch_base);
|
||||
+}
|
||||
+
|
||||
/* Callback routine to use with iterate_over_lwps to insert a specified
|
||||
watchpoint on all threads. */
|
||||
static int
|
||||
@@ -348,12 +352,23 @@ s390_remove_watchpoint_callback (struct
|
||||
s390_insert_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
@@ -347,6 +353,12 @@ s390_insert_watchpoint (CORE_ADDR addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -511,10 +617,11 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
+
|
||||
+static int s390_detach_breakpoints_pid;
|
||||
+
|
||||
/* Remove a specified watchpoint from all threads. */
|
||||
static int
|
||||
s390_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
@@ -354,6 +366,11 @@ s390_remove_watchpoint (CORE_ADDR addr,
|
||||
ptid_t ptid;
|
||||
struct watch_area *area, **parea;
|
||||
|
||||
+ if (ptid_get_pid (inferior_ptid) == s390_detach_breakpoints_pid)
|
||||
@ -525,7 +632,7 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
for (parea = &watch_base; *parea; parea = &(*parea)->next)
|
||||
if ((*parea)->lo_addr == addr
|
||||
&& (*parea)->hi_addr == addr + len - 1)
|
||||
@@ -378,6 +393,15 @@ s390_remove_watchpoint (CORE_ADDR addr,
|
||||
@@ -375,6 +392,15 @@ s390_remove_watchpoint (CORE_ADDR addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -541,8 +648,8 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
static int
|
||||
s390_can_use_hw_breakpoint (int type, int cnt, int othertype)
|
||||
{
|
||||
@@ -399,6 +423,39 @@ s390_linux_new_thread (ptid_t ptid)
|
||||
s390_fix_watch_points (ptid);
|
||||
@@ -387,6 +413,39 @@ s390_region_ok_for_hw_watchpoint (CORE_A
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static int (*s390_super_follow_fork) (struct target_ops *ops, int follow_child);
|
||||
@ -581,7 +688,7 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
|
||||
void _initialize_s390_nat (void);
|
||||
|
||||
@@ -422,6 +479,9 @@ _initialize_s390_nat (void)
|
||||
@@ -410,6 +469,9 @@ _initialize_s390_nat (void)
|
||||
t->to_insert_watchpoint = s390_insert_watchpoint;
|
||||
t->to_remove_watchpoint = s390_remove_watchpoint;
|
||||
|
||||
@ -590,10 +697,11 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/ppc-linux-nat.c gdb-6.7.1/gdb/ppc-linux-nat.c
|
||||
+
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c
|
||||
--- gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c 2008-01-11 20:28:48.000000000 +0100
|
||||
linux_nat_set_new_thread (t, s390_fix_watch_points);
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c 2008-03-01 15:18:13.000000000 +0100
|
||||
@@ -0,0 +1,160 @@
|
||||
+/* Test case for forgotten hw-watchpoints after fork()-off of a process.
|
||||
+
|
||||
@ -755,9 +863,10 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c
|
||||
+#else
|
||||
+# error "!FOLLOW_PARENT && !FOLLOW_CHILD"
|
||||
+#endif
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c
|
||||
--- gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c 2008-01-11 20:28:48.000000000 +0100
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -0,0 +1,154 @@
|
||||
+/* Test case for forgotten hw-watchpoints after fork()-off of a process.
|
||||
+
|
||||
@ -861,7 +970,7 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c gdb-
|
||||
+}
|
||||
+
|
||||
+int main (void)
|
||||
+{
|
||||
+{
|
||||
+ int i;
|
||||
+ void *thread_result;
|
||||
+
|
||||
@ -913,9 +1022,10 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c gdb-
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork.c gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork.c
|
||||
--- gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork.c 2008-01-11 20:28:48.000000000 +0100
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork.c 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -0,0 +1,56 @@
|
||||
+/* Test case for forgotten hw-watchpoints after fork()-off of a process.
|
||||
+
|
||||
@ -973,9 +1083,10 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork.c gdb-6.7
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork.exp gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork.exp
|
||||
--- gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork.exp 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/testsuite/gdb.threads/watchpoint-fork.exp 2008-01-11 20:28:48.000000000 +0100
|
||||
Index: gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.7.50.20080227/gdb/testsuite/gdb.threads/watchpoint-fork.exp 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -0,0 +1,140 @@
|
||||
+# Copyright 2008 Free Software Foundation, Inc.
|
||||
+
|
||||
@ -1117,47 +1228,16 @@ diff -u -ruNp gdb-6.7.1-orig/gdb/testsuite/gdb.threads/watchpoint-fork.exp gdb-6
|
||||
+if {[istarget "*-*-linux*"]} {
|
||||
+ test child FOLLOW_CHILD
|
||||
+}
|
||||
Index: gdb-6.7.50.20080227/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
|
||||
retrieving revision 1.434
|
||||
retrieving revision 1.435
|
||||
diff -u -r1.434 -r1.435
|
||||
--- src/gdb/doc/gdb.texinfo 2007/09/28 11:09:55 1.434
|
||||
+++ src/gdb/doc/gdb.texinfo 2007/10/01 00:17:58 1.435
|
||||
@@ -3346,20 +3346,13 @@
|
||||
way of doing that would be to set a code breakpoint at the entry to the
|
||||
@code{main} function and when it breaks, set all the watchpoints.
|
||||
|
||||
-@quotation
|
||||
@cindex watchpoints and threads
|
||||
@cindex threads and watchpoints
|
||||
-@emph{Warning:} In multi-thread programs, watchpoints have only limited
|
||||
-usefulness. With the current watchpoint implementation, @value{GDBN}
|
||||
-can only watch the value of an expression @emph{in a single thread}. If
|
||||
-you are confident that the expression can only change due to the current
|
||||
-thread's activity (and if you are also confident that no other thread
|
||||
-can become current), then you can use watchpoints as usual. However,
|
||||
-@value{GDBN} may not notice when a non-current thread's activity changes
|
||||
-the expression.
|
||||
+In multi-threaded programs, watchpoints will detect changes to the
|
||||
+watched expression from every thread.
|
||||
|
||||
-@c FIXME: this is almost identical to the previous paragraph.
|
||||
-@emph{HP-UX Warning:} In multi-thread programs, software watchpoints
|
||||
+@quotation
|
||||
+@emph{Warning:} In multi-threaded programs, software watchpoints
|
||||
have only limited usefulness. If @value{GDBN} creates a software
|
||||
watchpoint, it can only watch the value of an expression @emph{in a
|
||||
single thread}. If you are confident that the expression can only
|
||||
|
||||
--- gdb-6.5/gdb/doc/gdb.texinfo-orig 2007-12-15 13:25:14.000000000 +0100
|
||||
+++ gdb-6.5/gdb/doc/gdb.texinfo 2007-12-15 13:45:25.000000000 +0100
|
||||
@@ -3261,6 +3261,14 @@
|
||||
--- gdb-6.7.50.20080227.orig/gdb/doc/gdb.texinfo 2008-03-01 10:50:39.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/doc/gdb.texinfo 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -3386,6 +3386,14 @@ confident that no other thread can becom
|
||||
software watchpoints as usual. However, @value{GDBN} may not notice
|
||||
when a non-current thread's activity changes the expression. (Hardware
|
||||
watchpoints, in contrast, watch an expression in all threads.)
|
||||
+
|
||||
+Software watchpoints single-step the current thread to track the changes.
|
||||
+Software watchpoints single-step the current thread to track the changes.
|
||||
+Other threads are left freely running on @code{continue}; therefore, their
|
||||
+changes cannot be caught. To get more reliable software watchpoints, please
|
||||
+use @code{set scheduler-locking on}. The default for Red Hat/Fedora
|
||||
@ -1167,3 +1247,45 @@ diff -u -r1.434 -r1.435
|
||||
@end quotation
|
||||
|
||||
@xref{set remote hardware-watchpoint-limit}.
|
||||
Index: gdb-6.7.50.20080227/gdb/config/i386/nm-linux.h
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/config/i386/nm-linux.h 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/config/i386/nm-linux.h 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -44,6 +44,17 @@ extern void i386_linux_dr_reset_addr (in
|
||||
extern unsigned long i386_linux_dr_get_status (void);
|
||||
#define I386_DR_LOW_GET_STATUS() \
|
||||
i386_linux_dr_get_status ()
|
||||
+
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ * address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ * type TYPE. Return 0 on success, -1 on failure. */
|
||||
+extern int i386_linux_remove_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
+
|
||||
+/* Override basic i386 macros for watchpoint and hardware breakpoint
|
||||
+ insertion/removal to support threads. */
|
||||
+#undef target_remove_watchpoint
|
||||
+#define target_remove_watchpoint(addr, len, type) \
|
||||
+ i386_linux_remove_watchpoint (addr, len, type)
|
||||
|
||||
|
||||
#ifdef HAVE_PTRACE_GETFPXREGS
|
||||
Index: gdb-6.7.50.20080227/gdb/config/i386/nm-linux64.h
|
||||
===================================================================
|
||||
--- gdb-6.7.50.20080227.orig/gdb/config/i386/nm-linux64.h 2008-03-01 10:38:02.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227/gdb/config/i386/nm-linux64.h 2008-03-01 10:50:39.000000000 +0100
|
||||
@@ -50,4 +50,15 @@ extern unsigned long amd64_linux_dr_get_
|
||||
#define I386_DR_LOW_GET_STATUS() \
|
||||
amd64_linux_dr_get_status ()
|
||||
|
||||
+/* Remove a watchpoint that watched the memory region which starts at
|
||||
+ * address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
+ * type TYPE. Return 0 on success, -1 on failure. */
|
||||
+extern int amd64_linux_remove_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
+
|
||||
+/* Override basic amd64 macros for watchpoint and hardware breakpoint
|
||||
+ insertion/removal to support threads. */
|
||||
+#undef target_remove_watchpoint
|
||||
+#define target_remove_watchpoint(addr, len, type) \
|
||||
+ amd64_linux_remove_watchpoint (addr, len, type)
|
||||
+
|
||||
#endif /* nm-linux64.h */
|
||||
|
@ -17,9 +17,15 @@
|
||||
* infrun.c (proceed): RESUME_STEP initialized for non-stepping.
|
||||
RESUME_STEP set according to STEP only at the end of the function.
|
||||
|
||||
--- ./gdb/inferior.h 15 Jun 2007 22:44:55 -0000 1.83
|
||||
+++ ./gdb/inferior.h 25 Jun 2007 20:33:02 -0000
|
||||
@@ -194,7 +194,15 @@ extern void reopen_exec_file (void);
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/inferior.h
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/inferior.h 2008-02-14 23:03:57.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/inferior.h 2008-02-19 14:15:01.000000000 +0100
|
||||
@@ -179,7 +179,15 @@ extern void reopen_exec_file (void);
|
||||
/* The `resume' routine should only be called in special circumstances.
|
||||
Normally, use `proceed', which handles a lot of bookkeeping. */
|
||||
|
||||
@ -36,9 +42,11 @@
|
||||
|
||||
/* From misc files */
|
||||
|
||||
--- ./gdb/infrun.c 22 Jun 2007 12:47:48 -0000 1.243
|
||||
+++ ./gdb/infrun.c 25 Jun 2007 20:33:02 -0000
|
||||
@@ -76,7 +76,8 @@ static void set_schedlock_func (char *ar
|
||||
Index: gdb-6.8cvs20080219/gdb/infrun.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/infrun.c 2008-02-14 23:03:57.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/infrun.c 2008-02-19 14:24:37.000000000 +0100
|
||||
@@ -74,7 +74,8 @@ static void set_schedlock_func (char *ar
|
||||
|
||||
struct execution_control_state;
|
||||
|
||||
@ -48,7 +56,7 @@
|
||||
|
||||
static void xdb_handle_command (char *args, int from_tty);
|
||||
|
||||
@@ -496,15 +497,18 @@ set_schedlock_func (char *args, int from
|
||||
@@ -508,15 +509,18 @@ set_schedlock_func (char *args, int from
|
||||
STEP nonzero if we should step (zero to continue instead).
|
||||
SIG is the signal to give the inferior (zero for none). */
|
||||
void
|
||||
@ -70,7 +78,7 @@
|
||||
|
||||
/* FIXME: calling breakpoint_here_p (read_pc ()) three times! */
|
||||
|
||||
@@ -593,9 +597,10 @@ a command like `return' or `jump' to con
|
||||
@@ -632,9 +636,10 @@ a command like `return' or `jump' to con
|
||||
resume_ptid = inferior_ptid;
|
||||
}
|
||||
|
||||
@ -83,7 +91,7 @@
|
||||
{
|
||||
/* User-settable 'scheduler' mode requires solo thread resume. */
|
||||
resume_ptid = inferior_ptid;
|
||||
@@ -711,7 +716,7 @@ static CORE_ADDR prev_pc;
|
||||
@@ -742,7 +747,7 @@ static CORE_ADDR prev_pc;
|
||||
void
|
||||
proceed (CORE_ADDR addr, enum target_signal siggnal, int step)
|
||||
{
|
||||
@ -92,7 +100,7 @@
|
||||
|
||||
if (step > 0)
|
||||
step_start_function = find_pc_function (read_pc ());
|
||||
@@ -725,13 +731,13 @@ proceed (CORE_ADDR addr, enum target_sig
|
||||
@@ -756,13 +761,13 @@ proceed (CORE_ADDR addr, enum target_sig
|
||||
step one instruction before inserting breakpoints so that
|
||||
we do not stop right away (and report a second hit at this
|
||||
breakpoint). */
|
||||
@ -108,10 +116,10 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -755,9 +761,9 @@ proceed (CORE_ADDR addr, enum target_sig
|
||||
@@ -786,9 +791,9 @@ proceed (CORE_ADDR addr, enum target_sig
|
||||
that reported the most recent event. If a step-over is required
|
||||
it returns TRUE and sets the current thread to the old thread. */
|
||||
if (prepare_to_proceed () && breakpoint_here_p (read_pc ()))
|
||||
if (prepare_to_proceed (step))
|
||||
- oneproc = 1;
|
||||
+ resume_step = RESUME_STEP_USER;
|
||||
|
||||
@ -119,8 +127,8 @@
|
||||
+ if (resume_step == RESUME_STEP_USER)
|
||||
/* We will get a trace trap after one instruction.
|
||||
Continue it automatically and insert breakpoints then. */
|
||||
trap_expected = 1;
|
||||
@@ -806,8 +812,13 @@ proceed (CORE_ADDR addr, enum target_sig
|
||||
stepping_over_breakpoint = 1;
|
||||
@@ -832,8 +837,13 @@ proceed (CORE_ADDR addr, enum target_sig
|
||||
updated correctly when the inferior is stopped. */
|
||||
prev_pc = read_pc ();
|
||||
|
||||
@ -135,7 +143,7 @@
|
||||
|
||||
/* Wait for it to stop (if not standalone)
|
||||
and in any case decode why it stopped, and act accordingly. */
|
||||
@@ -2681,14 +2690,20 @@ process_event_stop_test:
|
||||
@@ -2723,14 +2733,21 @@ process_event_stop_test:
|
||||
|
||||
/* Are we in the middle of stepping? */
|
||||
|
||||
@ -145,11 +153,12 @@
|
||||
{
|
||||
- return ((!ecs->handling_longjmp
|
||||
- && ((step_range_end && step_resume_breakpoint == NULL)
|
||||
- || trap_expected))
|
||||
- || stepping_over_breakpoint))
|
||||
- || ecs->stepping_through_solib_after_catch
|
||||
- || bpstat_should_step ());
|
||||
+ if (!ecs->handling_longjmp
|
||||
+ && ((step_range_end && step_resume_breakpoint == NULL) || trap_expected))
|
||||
+ && ((step_range_end && step_resume_breakpoint == NULL)
|
||||
+ || stepping_over_breakpoint))
|
||||
+ return RESUME_STEP_USER;
|
||||
+
|
||||
+ if (ecs->stepping_through_solib_after_catch)
|
||||
@ -162,9 +171,11 @@
|
||||
}
|
||||
|
||||
/* Subroutine call with source code we should not step over. Do step
|
||||
--- ./gdb/linux-nat.c 16 Jun 2007 17:16:25 -0000 1.64
|
||||
+++ ./gdb/linux-nat.c 25 Jun 2007 20:33:02 -0000
|
||||
@@ -1720,7 +1720,10 @@ count_events_callback (struct lwp_info *
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.c 2008-02-14 23:03:57.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.c 2008-02-19 14:15:01.000000000 +0100
|
||||
@@ -1751,7 +1751,10 @@ count_events_callback (struct lwp_info *
|
||||
static int
|
||||
select_singlestep_lwp_callback (struct lwp_info *lp, void *data)
|
||||
{
|
||||
@ -176,9 +187,11 @@
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
--- ./gdb/linux-nat.h 10 May 2007 21:36:00 -0000 1.18
|
||||
+++ ./gdb/linux-nat.h 25 Jun 2007 20:33:02 -0000
|
||||
@@ -53,8 +53,8 @@ struct lwp_info
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.h
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.h 2008-02-14 23:03:58.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.h 2008-02-19 14:15:01.000000000 +0100
|
||||
@@ -55,8 +55,8 @@ struct lwp_info
|
||||
/* If non-zero, a pending wait status. */
|
||||
int status;
|
||||
|
||||
@ -187,5 +200,5 @@
|
||||
+ /* The kind of stepping of this LWP. */
|
||||
+ enum resume_step step;
|
||||
|
||||
/* If WAITSTATUS->KIND != TARGET_WAITKIND_SPURIOUS, the waitstatus
|
||||
for this LWP's last event. This may correspond to STATUS above,
|
||||
/* Non-zero si_signo if this LWP stopped with a trap. si_addr may
|
||||
be the address of a hardware watchpoint. */
|
||||
|
@ -18,10 +18,15 @@
|
||||
* gdb.texinfo (Attach): Document the ATTACH and DETACH commands for
|
||||
stopped processes. Document the messages on the seen pending signals.
|
||||
|
||||
diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/NEWS
|
||||
--- gdb-6.5-unpatched/gdb/NEWS 2008-01-09 18:26:07.000000000 +0100
|
||||
+++ gdb-6.5/gdb/NEWS 2008-01-09 15:26:30.000000000 +0100
|
||||
@@ -9,6 +9,9 @@ Renesas M32C/M16C m32c-elf
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: gdb-6.8cvs20080219/gdb/NEWS
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/NEWS 2008-02-24 19:35:37.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/NEWS 2008-02-24 19:36:26.000000000 +0100
|
||||
@@ -412,6 +412,9 @@ Renesas M32C/M16C m32c-elf
|
||||
|
||||
Morpho Technologies ms1 ms1-elf
|
||||
|
||||
@ -31,30 +36,27 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
* New commands
|
||||
|
||||
init-if-undefined Initialize a convenience variable, but
|
||||
--- gdb-6.7.1/gdb/linux-nat.c.orig 2008-01-09 23:54:42.000000000 +0100
|
||||
+++ gdb-6.7.1/gdb/linux-nat.c 2008-01-10 00:08:07.000000000 +0100
|
||||
@@ -85,11 +85,20 @@
|
||||
#define __WALL 0x40000000 /* Wait for any child. */
|
||||
Index: gdb-6.8cvs20080219/gdb/linux-nat.c
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/linux-nat.c 2008-02-24 19:36:26.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/linux-nat.c 2008-02-24 19:45:01.000000000 +0100
|
||||
@@ -89,6 +89,15 @@
|
||||
#define PTRACE_GETSIGINFO 0x4202
|
||||
#endif
|
||||
|
||||
+#define STRINGIFY_ARG(x) #x
|
||||
+#define STRINGIFY(x) STRINGIFY_ARG (x)
|
||||
+
|
||||
+static int linux_ptrace_post_attach (struct lwp_info *lp);
|
||||
+static int linux_ptrace_post_attach (ptid_t ptid, int *cloned_return);
|
||||
+static int kill_lwp (int lwpid, int signo);
|
||||
+
|
||||
+/* PID of the inferior stopped by SIGSTOP before attaching (or zero). */
|
||||
+static pid_t pid_was_stopped;
|
||||
+
|
||||
/* The single-threaded native GNU/Linux target_ops. We save a pointer for
|
||||
the use of the multi-threaded target. */
|
||||
static struct target_ops *linux_ops;
|
||||
static struct target_ops linux_ops_saved;
|
||||
|
||||
+/* PID of the inferior stopped by SIGSTOP before attaching (or zero). */
|
||||
+static pid_t pid_was_stopped;
|
||||
+
|
||||
/* The saved to_xfer_partial method, inherited from inf-ptrace.c.
|
||||
Called by our to_xfer_partial. */
|
||||
static LONGEST (*super_xfer_partial) (struct target_ops *,
|
||||
@@ -540,6 +549,11 @@ linux_child_follow_fork (struct target_o
|
||||
@@ -539,6 +548,11 @@ linux_child_follow_fork (struct target_o
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -66,52 +68,75 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
target_detach (NULL, 0);
|
||||
}
|
||||
|
||||
@@ -940,7 +954,6 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
|
||||
@@ -942,9 +956,8 @@ lin_lwp_attach_lwp (ptid_t ptid)
|
||||
to happen. */
|
||||
if (GET_LWP (ptid) != GET_PID (ptid) && lp == NULL)
|
||||
{
|
||||
- pid_t pid;
|
||||
int status;
|
||||
- int cloned = 0;
|
||||
+ int cloned;
|
||||
|
||||
if (ptrace (PTRACE_ATTACH, GET_LWP (ptid), 0, 0) < 0)
|
||||
@@ -958,10 +971,156 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
|
||||
if (lp == NULL)
|
||||
lp = add_lwp (ptid);
|
||||
{
|
||||
@@ -958,37 +971,20 @@ lin_lwp_attach_lwp (ptid_t ptid)
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (debug_linux_nat)
|
||||
- fprintf_unfiltered (gdb_stdlog,
|
||||
- "LLAL: PTRACE_ATTACH %s, 0, 0 (OK)\n",
|
||||
- target_pid_to_str (ptid));
|
||||
+ status = linux_ptrace_post_attach (lp);
|
||||
-
|
||||
- pid = my_waitpid (GET_LWP (ptid), &status, 0);
|
||||
- if (pid == -1 && errno == ECHILD)
|
||||
- {
|
||||
- /* Try again with __WCLONE to check cloned processes. */
|
||||
- pid = my_waitpid (GET_LWP (ptid), &status, __WCLONE);
|
||||
- cloned = 1;
|
||||
+ status = linux_ptrace_post_attach (ptid, &cloned);
|
||||
+ if (status != 0)
|
||||
+ {
|
||||
+ error (_("Thread %s exited: %s"), target_pid_to_str (ptid),
|
||||
+ status_to_str (status));
|
||||
+ }
|
||||
+
|
||||
}
|
||||
|
||||
- gdb_assert (pid == GET_LWP (ptid)
|
||||
- && WIFSTOPPED (status) && WSTOPSIG (status));
|
||||
-
|
||||
- if (lp == NULL)
|
||||
- lp = add_lwp (ptid);
|
||||
+ /* ADD_LWP with TID only already after the WAITPID. */
|
||||
+ lp = add_lwp (ptid);
|
||||
lp->cloned = cloned;
|
||||
|
||||
- target_post_attach (pid);
|
||||
+ target_post_attach (GET_LWP (ptid));
|
||||
+
|
||||
+ lp->stopped = 1;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* We assume that the LWP representing the original process is
|
||||
+ already stopped. Mark it as stopped in the data structure
|
||||
+ that the GNU/linux ptrace layer uses to keep track of
|
||||
+ threads. Note that this won't have already been done since
|
||||
+ the main thread will have, we assume, been stopped by an
|
||||
+ attach from a different layer. */
|
||||
+ if (lp == NULL)
|
||||
+ lp = add_lwp (ptid);
|
||||
+ lp->stopped = 1;
|
||||
+ }
|
||||
+
|
||||
+ if (verbose)
|
||||
+ printf_filtered (_("[New %s]\n"), target_pid_to_str (ptid));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
|
||||
lp->stopped = 1;
|
||||
-
|
||||
- if (debug_linux_nat)
|
||||
- {
|
||||
- fprintf_unfiltered (gdb_stdlog,
|
||||
- "LLAL: waitpid %s received %s\n",
|
||||
- target_pid_to_str (ptid),
|
||||
- status_to_str (status));
|
||||
- }
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -998,44 +994,202 @@ lin_lwp_attach_lwp (ptid_t ptid)
|
||||
threads. Note that this won't have already been done since
|
||||
the main thread will have, we assume, been stopped by an
|
||||
attach from a different layer. */
|
||||
- if (lp == NULL)
|
||||
- lp = add_lwp (ptid);
|
||||
lp->stopped = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* Detect `T (stopped)' in `/proc/PID/status'.
|
||||
+ Other states including `T (tracing stop)' are reported as false. */
|
||||
+
|
||||
@ -119,7 +144,7 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
+pid_is_stopped (pid_t pid)
|
||||
+{
|
||||
+ FILE *status_file;
|
||||
+ char buf[100];
|
||||
+ char buf[100];
|
||||
+ int retval = 0;
|
||||
+
|
||||
+ snprintf (buf, sizeof (buf), "/proc/%d/status", (int) pid);
|
||||
@ -135,7 +160,7 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
+ have_state = 1;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if (have_state && strstr (buf, "T (stopped)") != NULL)
|
||||
+ retval = 1;
|
||||
+ fclose (status_file);
|
||||
@ -206,11 +231,11 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
+ Similiar processing is being done in this file by WAIT_LWP. */
|
||||
+
|
||||
+static int
|
||||
+linux_ptrace_post_attach (struct lwp_info *lp)
|
||||
+linux_ptrace_post_attach (ptid_t ptid, int *cloned_return)
|
||||
+{
|
||||
+ ptid_t ptid = lp->ptid;
|
||||
+ unsigned long sig;
|
||||
+ int this_thread_was_stopped;
|
||||
+ int cloned = 0;
|
||||
+
|
||||
+ if (debug_linux_nat)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
@ -232,52 +257,33 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
+ {
|
||||
+ pid_t pid;
|
||||
+ int status;
|
||||
|
||||
pid = my_waitpid (GET_LWP (ptid), &status, 0);
|
||||
if (pid == -1 && errno == ECHILD)
|
||||
@@ -974,13 +1133,7 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
|
||||
target_pid_to_str (ptid), safe_strerror (errno));
|
||||
lp->cloned = 1;
|
||||
}
|
||||
-
|
||||
- gdb_assert (pid == GET_LWP (ptid)
|
||||
- && WIFSTOPPED (status) && WSTOPSIG (status));
|
||||
-
|
||||
- target_post_attach (pid);
|
||||
-
|
||||
- lp->stopped = 1;
|
||||
+
|
||||
+ pid = my_waitpid (GET_LWP (ptid), &status, 0);
|
||||
+ if (pid == -1 && errno == ECHILD)
|
||||
+ {
|
||||
+ /* Try again with __WCLONE to check cloned processes. */
|
||||
+ pid = my_waitpid (GET_LWP (ptid), &status, __WCLONE);
|
||||
+ cloned = 1;
|
||||
+ }
|
||||
+
|
||||
+ gdb_assert (pid == GET_LWP (ptid));
|
||||
|
||||
if (debug_linux_nat)
|
||||
{
|
||||
@@ -989,22 +1142,32 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
|
||||
target_pid_to_str (ptid),
|
||||
status_to_str (status));
|
||||
}
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- /* We assume that the LWP representing the original process is
|
||||
- already stopped. Mark it as stopped in the data structure
|
||||
- that the GNU/linux ptrace layer uses to keep track of
|
||||
- threads. Note that this won't have already been done since
|
||||
- the main thread will have, we assume, been stopped by an
|
||||
- attach from a different layer. */
|
||||
- if (lp == NULL)
|
||||
- lp = add_lwp (ptid);
|
||||
- lp->stopped = 1;
|
||||
- }
|
||||
|
||||
- if (verbose)
|
||||
- printf_filtered (_("[New %s]\n"), target_pid_to_str (ptid));
|
||||
+
|
||||
+ if (debug_linux_nat)
|
||||
+ {
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "LLAL: waitpid %s received %s\n",
|
||||
+ target_pid_to_str (ptid),
|
||||
+ status_to_str (status));
|
||||
+ }
|
||||
+
|
||||
+ /* Check if the thread has exited. */
|
||||
+ if (WIFEXITED (status) || WIFSIGNALED (status))
|
||||
+ return status;
|
||||
+ return status;
|
||||
+ gdb_assert (WIFSTOPPED (status));
|
||||
+ sig = WSTOPSIG (status);
|
||||
+ gdb_assert (sig != 0);
|
||||
+ if (sig == SIGSTOP)
|
||||
+ break;
|
||||
+ break;
|
||||
+
|
||||
+ /* As the second signal for stopped processes we send SIGSTOP. */
|
||||
+ if (this_thread_was_stopped && sig == SIGCONT)
|
||||
@ -295,20 +301,22 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
+ if (ptrace (PTRACE_CONT, GET_LWP (ptid), NULL, (void *) sig) != 0)
|
||||
+ perror_with_name (("ptrace"));
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1013,7 +1176,6 @@ static void
|
||||
+ *cloned_return = cloned;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
linux_nat_attach (char *args, int from_tty)
|
||||
{
|
||||
struct lwp_info *lp;
|
||||
- pid_t pid;
|
||||
int status;
|
||||
- int cloned = 0;
|
||||
+ int cloned;
|
||||
|
||||
/* FIXME: We should probably accept a list of process id's, and
|
||||
@@ -1024,21 +1186,12 @@ linux_nat_attach (char *args, int from_t
|
||||
inferior_ptid = BUILD_LWP (GET_PID (inferior_ptid), GET_PID (inferior_ptid));
|
||||
lp = add_lwp (inferior_ptid);
|
||||
attach all of them. */
|
||||
linux_ops->to_attach (args, from_tty);
|
||||
|
||||
- /* Make sure the initial process is stopped. The user-level threads
|
||||
- layer might want to poke around in the inferior, and that won't
|
||||
@ -320,21 +328,27 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
-
|
||||
- /* Try again with __WCLONE to check cloned processes. */
|
||||
- pid = my_waitpid (GET_PID (inferior_ptid), &status, __WCLONE);
|
||||
- lp->cloned = 1;
|
||||
- cloned = 1;
|
||||
- }
|
||||
-
|
||||
- gdb_assert (pid == GET_PID (inferior_ptid)
|
||||
- && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP);
|
||||
+ status = linux_ptrace_post_attach (lp);
|
||||
-
|
||||
/* Add the initial process as the first LWP to the list. */
|
||||
inferior_ptid = BUILD_LWP (GET_PID (inferior_ptid), GET_PID (inferior_ptid));
|
||||
+
|
||||
+ status = linux_ptrace_post_attach (inferior_ptid, &cloned);
|
||||
+ if (status != 0)
|
||||
+ error (_("Program %s exited: %s\n"), target_pid_to_str (inferior_ptid),
|
||||
+ status_to_str (status));
|
||||
+ if (lp->cloned)
|
||||
+ if (cloned)
|
||||
+ warning (_("%s is a cloned process"), target_pid_to_str (inferior_ptid));
|
||||
+
|
||||
+ /* ADD_LWP with TID only already after the WAITPID. */
|
||||
lp = add_lwp (inferior_ptid);
|
||||
lp->cloned = cloned;
|
||||
|
||||
lp->stopped = 1;
|
||||
|
||||
@@ -1047,8 +1200,8 @@ linux_nat_attach (char *args, int from_t
|
||||
@@ -1046,8 +1200,8 @@ linux_nat_attach (char *args, int from_t
|
||||
lp->resumed = 1;
|
||||
if (debug_linux_nat)
|
||||
{
|
||||
@ -345,7 +359,7 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1093,6 +1246,9 @@ detach_callback (struct lwp_info *lp, vo
|
||||
@@ -1092,6 +1246,9 @@ detach_callback (struct lwp_info *lp, vo
|
||||
overall process id just yet. */
|
||||
if (GET_LWP (lp->ptid) != GET_PID (lp->ptid))
|
||||
{
|
||||
@ -355,7 +369,7 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
errno = 0;
|
||||
if (ptrace (PTRACE_DETACH, GET_LWP (lp->ptid), 0,
|
||||
WSTOPSIG (lp->status)) < 0)
|
||||
@@ -1121,6 +1277,9 @@ linux_nat_detach (char *args, int from_t
|
||||
@@ -1120,6 +1277,9 @@ linux_nat_detach (char *args, int from_t
|
||||
|
||||
trap_ptid = null_ptid;
|
||||
|
||||
@ -365,9 +379,9 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
/* Destroy LWP info; it's no longer valid. */
|
||||
init_lwp_list ();
|
||||
|
||||
@@ -1258,6 +1417,14 @@ linux_nat_resume (ptid_t ptid, int step_
|
||||
lp->stopped = 0;
|
||||
}
|
||||
@@ -1255,6 +1415,14 @@ linux_nat_resume (ptid_t ptid, int step_
|
||||
resume_callback. */
|
||||
lp->stopped = 0;
|
||||
|
||||
+ /* At this point, we are going to resume the inferior and if we
|
||||
+ have attached to a stopped process, we no longer should leave
|
||||
@ -380,10 +394,11 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/NEWS gdb-6.5/gdb/
|
||||
if (resume_all)
|
||||
iterate_over_lwps (resume_callback, NULL);
|
||||
|
||||
diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/doc/gdb.texinfo gdb-6.5/gdb/doc/gdb.texinfo
|
||||
--- gdb-6.5-unpatched/gdb/doc/gdb.texinfo 2008-01-09 18:26:07.000000000 +0100
|
||||
+++ gdb-6.5/gdb/doc/gdb.texinfo 2008-01-09 15:26:30.000000000 +0100
|
||||
@@ -2190,16 +2190,29 @@ can step and continue; you can modify st
|
||||
Index: gdb-6.8cvs20080219/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-6.8cvs20080219.orig/gdb/doc/gdb.texinfo 2008-02-24 19:36:24.000000000 +0100
|
||||
+++ gdb-6.8cvs20080219/gdb/doc/gdb.texinfo 2008-02-24 19:36:26.000000000 +0100
|
||||
@@ -2176,16 +2176,29 @@ can step and continue; you can modify st
|
||||
process continue running, you may use the @code{continue} command after
|
||||
attaching @value{GDBN} to the process.
|
||||
|
||||
@ -418,4 +433,4 @@ diff -u -X /home/short/.diffi.list -ruNp gdb-6.5-unpatched/gdb/doc/gdb.texinfo g
|
||||
+@key{RET} again after executing the command.
|
||||
@end table
|
||||
|
||||
If you exit @value{GDBN} or use the @code{run} command while you have an
|
||||
If you exit @value{GDBN} while you have an attached process, you detach
|
||||
|
@ -1,13 +1,8 @@
|
||||
Original patch was:
|
||||
http://sourceware.org/ml/gdb-patches/2007-12/msg00397.html
|
||||
http://sourceware.org/ml/gdb-cvs/2007-12/msg00123.html
|
||||
|
||||
2007-12-22 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* dwarf2read.c (scan_partial_symbols partial_die_parent_scope)
|
||||
(add_partial_symbol, pdi_needs_namespace, process_die)
|
||||
(is_type_tag_for_partial, load_partial_dies, new_symbol)
|
||||
(read_type_die, determine_prefix): Extend the current code of
|
||||
`DW_TAG_class_type' also for `DW_TAG_interface_type'.
|
||||
extended for the RHEL safety:
|
||||
|
||||
2007-12-28 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
@ -15,93 +10,10 @@ http://sourceware.org/ml/gdb-cvs/2007-12/msg00123.html
|
||||
`DW_TAG_class_type'-type backing for `DW_TAG_interface_type', even for
|
||||
namespaces which should not apply for Java `DW_TAG_interface_type'.
|
||||
|
||||
===================================================================
|
||||
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
|
||||
retrieving revision 1.242
|
||||
retrieving revision 1.243
|
||||
diff -u -r1.242 -r1.243
|
||||
--- src/gdb/dwarf2read.c 2007/12/17 18:38:30 1.242
|
||||
+++ src/gdb/dwarf2read.c 2007/12/22 20:58:30 1.243
|
||||
@@ -1747,6 +1747,7 @@
|
||||
}
|
||||
break;
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
if (!pdi->is_declaration)
|
||||
{
|
||||
@@ -1829,6 +1830,7 @@
|
||||
if (parent->tag == DW_TAG_namespace
|
||||
|| parent->tag == DW_TAG_structure_type
|
||||
|| parent->tag == DW_TAG_class_type
|
||||
+ || parent->tag == DW_TAG_interface_type
|
||||
|| parent->tag == DW_TAG_union_type)
|
||||
{
|
||||
if (grandparent_scope == NULL)
|
||||
@@ -1976,6 +1978,7 @@
|
||||
0, (CORE_ADDR) 0, cu->language, objfile);
|
||||
break;
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
case DW_TAG_union_type:
|
||||
case DW_TAG_enumeration_type:
|
||||
@@ -2057,6 +2060,7 @@
|
||||
case DW_TAG_namespace:
|
||||
case DW_TAG_typedef:
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
case DW_TAG_union_type:
|
||||
case DW_TAG_enumeration_type:
|
||||
@@ -2676,6 +2680,7 @@
|
||||
read_lexical_block_scope (die, cu);
|
||||
break;
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
case DW_TAG_union_type:
|
||||
read_structure_type (die, cu);
|
||||
@@ -5403,6 +5408,7 @@
|
||||
#endif
|
||||
case DW_TAG_base_type:
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_enumeration_type:
|
||||
case DW_TAG_structure_type:
|
||||
case DW_TAG_subrange_type:
|
||||
@@ -5608,6 +5614,7 @@
|
||||
|| last_die->tag == DW_TAG_enumeration_type
|
||||
|| (cu->language != language_c
|
||||
&& (last_die->tag == DW_TAG_class_type
|
||||
+ || last_die->tag == DW_TAG_interface_type
|
||||
|| last_die->tag == DW_TAG_structure_type
|
||||
|| last_die->tag == DW_TAG_union_type))))
|
||||
{
|
||||
@@ -7358,6 +7365,7 @@
|
||||
(FIXME?) */
|
||||
break;
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
case DW_TAG_union_type:
|
||||
case DW_TAG_set_type:
|
||||
@@ -7677,6 +7685,7 @@
|
||||
switch (die->tag)
|
||||
{
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
case DW_TAG_union_type:
|
||||
read_structure_type (die, cu);
|
||||
@@ -7781,6 +7790,7 @@
|
||||
}
|
||||
break;
|
||||
case DW_TAG_class_type:
|
||||
+ case DW_TAG_interface_type:
|
||||
case DW_TAG_structure_type:
|
||||
{
|
||||
if (parent->type != NULL && TYPE_TAG_NAME (parent->type) != NULL)
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
Index: ./gdb/dwarf2read.c
|
||||
===================================================================
|
||||
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
|
||||
|
@ -4,6 +4,10 @@ http://sourceware.org/ml/gdb-patches/2007-12/msg00397.html
|
||||
|
||||
* gdb.arch/i386-interface.S, gdb.arch/i386-interface.exp: New files.
|
||||
|
||||
2008-03-02 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.arch/i386-interface.exp: Fix a testcase race.
|
||||
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ ./gdb/testsuite/gdb.arch/i386-interface.S 22 Dec 2007 19:07:28 -0000
|
||||
@@ -0,0 +1,628 @@
|
||||
@ -693,14 +697,14 @@ http://sourceware.org/ml/gdb-patches/2007-12/msg00397.html
|
||||
+
|
||||
+set test "ptype Interface"
|
||||
+gdb_test_multiple $test $test {
|
||||
+ -re "type = class Interface *extends java.lang.Object \{" {
|
||||
+ -re "type = class Interface *extends java.lang.Object \{.*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+set test "ptype Class"
|
||||
+gdb_test_multiple $test $test {
|
||||
+ -re "type = class Class *extends java.lang.Object implements Interface \{" {
|
||||
+ -re "type = class Class *extends java.lang.Object implements Interface \{.*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+}
|
||||
|
@ -1,61 +0,0 @@
|
||||
diff -up gdb-6.7.1/gdb/ia64-tdep.c.broken gdb-6.7.1/gdb/ia64-tdep.c
|
||||
--- gdb-6.7.1/gdb/ia64-tdep.c.broken 2008-01-15 15:13:54.558100457 -0500
|
||||
+++ gdb-6.7.1/gdb/ia64-tdep.c 2008-01-15 15:14:23.701740030 -0500
|
||||
@@ -2009,6 +2009,7 @@ ia64_sigtramp_frame_prev_register (struc
|
||||
{
|
||||
char dummy_valp[MAX_REGISTER_SIZE];
|
||||
char buf[MAX_REGISTER_SIZE];
|
||||
+ int nat_bit;
|
||||
|
||||
struct ia64_frame_cache *cache =
|
||||
ia64_sigtramp_frame_cache (next_frame, this_cache);
|
||||
@@ -2088,7 +2089,6 @@ ia64_sigtramp_frame_prev_register (struc
|
||||
/* Compute address of nat collection bits */
|
||||
CORE_ADDR nat_collection;
|
||||
nat_addr = gr_addr | 0x1f8;
|
||||
- int nat_bit;
|
||||
/* If our nat collection address is bigger than bsp, we have to get
|
||||
the nat collection from rnat. Otherwise, we fetch the nat
|
||||
collection from the computed address. FIXME: Do not know if
|
||||
diff -up gdb-6.7.1/gdb/libunwind-frame.c.broken gdb-6.7.1/gdb/libunwind-frame.c
|
||||
--- gdb-6.7.1/gdb/libunwind-frame.c.broken 2008-01-15 15:39:32.341093035 -0500
|
||||
+++ gdb-6.7.1/gdb/libunwind-frame.c 2008-01-15 15:48:25.254244213 -0500
|
||||
@@ -133,7 +133,7 @@ static struct libunwind_frame_cache *
|
||||
libunwind_frame_cache (struct frame_info *next_frame, void **this_cache)
|
||||
{
|
||||
unw_accessors_t *acc;
|
||||
- unw_addr_space_t as;
|
||||
+ unw_addr_space_t as = NULL;
|
||||
unw_cursor_t *cursor_addr;
|
||||
unw_word_t fp, sp;
|
||||
unw_regnum_t uw_sp_regnum;
|
||||
diff -up gdb-6.7.1/gdb/ia64-linux-nat.c.broken gdb-6.7.1/gdb/ia64-linux-nat.c
|
||||
--- gdb-6.7.1/gdb/ia64-linux-nat.c.broken 2008-01-15 15:23:11.933209405 -0500
|
||||
+++ gdb-6.7.1/gdb/ia64-linux-nat.c 2008-01-15 15:38:42.846709176 -0500
|
||||
@@ -661,7 +661,7 @@ ia64_linux_remove_watchpoint_callback (s
|
||||
struct linux_watchpoint *args = (struct linux_watchpoint *)data;
|
||||
|
||||
return ia64_linux_remove_one_watchpoint (lwp->ptid, args->addr,
|
||||
- args->len);
|
||||
+ args->len, args->type);
|
||||
}
|
||||
|
||||
/* TO_FOLLOW_FORK stores here the PID under DETACH_BREAKPOINTS for the child
|
||||
@@ -672,7 +672,7 @@ static int ia64_linux_detach_breakpoints
|
||||
|
||||
/* Remove a watchpoint for all threads. */
|
||||
static int
|
||||
-ia64_linux_remove_watchpoint (CORE_ADDR addr, int len)
|
||||
+ia64_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw)
|
||||
{
|
||||
struct linux_watchpoint args;
|
||||
|
||||
@@ -925,7 +925,7 @@ ia64_linux_save_sigtrap_info (void *queu
|
||||
if (lp->saved_trap_data == NULL)
|
||||
lp->saved_trap_data = xmalloc (sizeof(struct siginfo));
|
||||
|
||||
- ptrace (PTRACE_GETSIGINFO, ptid_get_lwp (lp->ptid), (PTRACE_ARG3_TYPE) 0,
|
||||
+ ptrace (PTRACE_GETSIGINFO, ptid_get_lwp (lp->ptid), (PTRACE_TYPE_ARG3) 0,
|
||||
lp->saved_trap_data);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
2239
gdb-6.8-bz377541-fortran-dynamic-arrays.patch
Normal file
2239
gdb-6.8-bz377541-fortran-dynamic-arrays.patch
Normal file
File diff suppressed because it is too large
Load Diff
477
gdb-6.8-watchpoint-inaccessible-memory.patch
Normal file
477
gdb-6.8-watchpoint-inaccessible-memory.patch
Normal file
@ -0,0 +1,477 @@
|
||||
http://sourceware.org/ml/gdb-patches/2008-02/msg00472.html
|
||||
|
||||
2008-02-28 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* breakpoint.c (fetch_watchpoint_value): New function.
|
||||
(update_watchpoint): Set and clear val_valid. Use
|
||||
fetch_watchpoint_value. Handle unreadable values on the
|
||||
value chain. Correct check for user-requested array watchpoints.
|
||||
(breakpoint_init_inferior): Clear val_valid.
|
||||
(watchpoint_value_print): New function.
|
||||
(print_it_typical): Use it. Do not free or clear old_val. Print
|
||||
watchpoints even if old_val == NULL.
|
||||
(watchpoint_check): Use fetch_watchpoint_value. Check for values
|
||||
becoming readable or unreadable.
|
||||
(watch_command_1): Use fetch_watchpoint_value. Set val_valid.
|
||||
(do_enable_watchpoint): Likewise.
|
||||
* breakpoint.h (struct breakpoint): Update comment for val. Add
|
||||
val_valid.
|
||||
* NEWS: Mention watchpoints on inaccessible memory.
|
||||
|
||||
2008-02-28 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* gdb.base/watchpoint.c (global_ptr, func4): New.
|
||||
(main): Call func4.
|
||||
* gdb.base/watchpoint.exp: Call test_inaccessible_watchpoint.
|
||||
(test_inaccessible_watchpoint): New.
|
||||
|
||||
[ Backported for GDB-6.8pre. ]
|
||||
|
||||
It fixes the regression since GDB-6.7.1rh on x86_64 -m64 -fPIE/-pie:
|
||||
-PASS: gdb.base/watchpoint.exp: run to marker1 in test_simple_watchpoint
|
||||
+FAIL: gdb.base/watchpoint.exp: run to marker1 in test_simple_watchpoint
|
||||
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.50.20080227-orig/gdb/NEWS gdb-6.7.50.20080227-dynwatch/gdb/NEWS
|
||||
--- gdb-6.7.50.20080227-orig/gdb/NEWS 2008-03-03 08:42:11.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227-dynwatch/gdb/NEWS 2008-03-03 08:38:18.000000000 +0100
|
||||
@@ -1,6 +1,9 @@
|
||||
What has changed in GDB?
|
||||
(Organized release by release)
|
||||
|
||||
+* Watchpoints can now be set on unreadable memory locations, e.g. addresses
|
||||
+which will be allocated using malloc later in program execution.
|
||||
+
|
||||
*** Changes since GDB 6.7
|
||||
|
||||
* New native configurations
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.50.20080227-orig/gdb/breakpoint.c gdb-6.7.50.20080227-dynwatch/gdb/breakpoint.c
|
||||
--- gdb-6.7.50.20080227-orig/gdb/breakpoint.c 2008-03-03 08:42:10.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227-dynwatch/gdb/breakpoint.c 2008-03-03 08:37:33.000000000 +0100
|
||||
@@ -55,6 +55,7 @@
|
||||
#include "memattr.h"
|
||||
#include "ada-lang.h"
|
||||
#include "top.h"
|
||||
+#include "wrapper.h"
|
||||
|
||||
#include "gdb-events.h"
|
||||
#include "mi/mi-common.h"
|
||||
@@ -826,7 +827,65 @@ is_hardware_watchpoint (struct breakpoin
|
||||
|| bpt->type == bp_access_watchpoint);
|
||||
}
|
||||
|
||||
-/* Assuming that B is a hardware breakpoint:
|
||||
+/* Find the current value of a watchpoint on EXP. Return the value in
|
||||
+ *VALP and *RESULTP and the chain of intermediate and final values
|
||||
+ in *VAL_CHAIN. RESULTP and VAL_CHAIN may be NULL if the caller does
|
||||
+ not need them.
|
||||
+
|
||||
+ If an error occurs while evaluating the expression, *RESULTP will
|
||||
+ be set to NULL. *RESULTP may be a lazy value, if the result could
|
||||
+ not be read from memory. It is used to determine whether a value
|
||||
+ is user-specified (we should watch the whole value) or intermediate
|
||||
+ (we should watch only the bit used to locate the final value).
|
||||
+
|
||||
+ If the final value, or any intermediate value, could not be read
|
||||
+ from memory, *VALP will be set to NULL. *VAL_CHAIN will still be
|
||||
+ set to any referenced values. *VALP will never be a lazy value.
|
||||
+ This is the value which we store in struct breakpoint.
|
||||
+
|
||||
+ If VAL_CHAIN is non-NULL, *VAL_CHAIN will be released from the
|
||||
+ value chain. The caller must free the values individually. If
|
||||
+ VAL_CHAIN is NULL, all generated values will be left on the value
|
||||
+ chain. */
|
||||
+
|
||||
+static void
|
||||
+fetch_watchpoint_value (struct expression *exp, struct value **valp,
|
||||
+ struct value **resultp, struct value **val_chain)
|
||||
+{
|
||||
+ struct value *mark, *new_mark, *result;
|
||||
+
|
||||
+ *valp = NULL;
|
||||
+ if (resultp)
|
||||
+ *resultp = NULL;
|
||||
+ if (val_chain)
|
||||
+ *val_chain = NULL;
|
||||
+
|
||||
+ /* Evaluate the expression. */
|
||||
+ mark = value_mark ();
|
||||
+ result = NULL;
|
||||
+ gdb_evaluate_expression (exp, &result);
|
||||
+ new_mark = value_mark ();
|
||||
+ if (mark == new_mark)
|
||||
+ return;
|
||||
+ if (resultp)
|
||||
+ *resultp = result;
|
||||
+
|
||||
+ /* Make sure it's not lazy, so that after the target stops again we
|
||||
+ have a non-lazy previous value to compare with. */
|
||||
+ if (result != NULL
|
||||
+ && (!value_lazy (result) || gdb_value_fetch_lazy (result)))
|
||||
+ *valp = result;
|
||||
+
|
||||
+ if (val_chain)
|
||||
+ {
|
||||
+ /* Return the chain of intermediate values. We use this to
|
||||
+ decide which addresses to watch. */
|
||||
+ *val_chain = new_mark;
|
||||
+ value_release_to_mark (mark);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Assuming that B is a hardware watchpoint:
|
||||
- Reparse watchpoint expression, is REPARSE is non-zero
|
||||
- Evaluate expression and store the result in B->val
|
||||
- Update the list of values that must be watched in B->loc.
|
||||
@@ -837,7 +896,6 @@ static void
|
||||
update_watchpoint (struct breakpoint *b, int reparse)
|
||||
{
|
||||
int within_current_scope;
|
||||
- struct value *mark = value_mark ();
|
||||
struct frame_id saved_frame_id;
|
||||
struct bp_location *loc;
|
||||
bpstat bs;
|
||||
@@ -889,9 +947,9 @@ update_watchpoint (struct breakpoint *b,
|
||||
to the user when the old value and the new value may actually
|
||||
be completely different objects. */
|
||||
value_free (b->val);
|
||||
- b->val = NULL;
|
||||
+ b->val = NULL;
|
||||
+ b->val_valid = 0;
|
||||
}
|
||||
-
|
||||
|
||||
/* If we failed to parse the expression, for example because
|
||||
it refers to a global variable in a not-yet-loaded shared library,
|
||||
@@ -900,43 +958,37 @@ update_watchpoint (struct breakpoint *b,
|
||||
is different from out-of-scope watchpoint. */
|
||||
if (within_current_scope && b->exp)
|
||||
{
|
||||
- struct value *v, *next;
|
||||
+ struct value *val_chain, *v, *result, *next;
|
||||
+
|
||||
+ fetch_watchpoint_value (b->exp, &v, &result, &val_chain);
|
||||
|
||||
- /* Evaluate the expression and make sure it's not lazy, so that
|
||||
- after target stops again, we have a non-lazy previous value
|
||||
- to compare with. Also, making the value non-lazy will fetch
|
||||
- intermediate values as needed, which we use to decide which
|
||||
- addresses to watch.
|
||||
-
|
||||
- The value returned by evaluate_expression is stored in b->val.
|
||||
- In addition, we look at all values which were created
|
||||
- during evaluation, and set watchoints at addresses as needed.
|
||||
- Those values are explicitly deleted here. */
|
||||
- v = evaluate_expression (b->exp);
|
||||
/* Avoid setting b->val if it's already set. The meaning of
|
||||
b->val is 'the last value' user saw, and we should update
|
||||
it only if we reported that last value to user. As it
|
||||
happens, the code that reports it updates b->val directly. */
|
||||
- if (b->val == NULL)
|
||||
- b->val = v;
|
||||
- value_contents (v);
|
||||
- value_release_to_mark (mark);
|
||||
+ if (!b->val_valid)
|
||||
+ {
|
||||
+ b->val = v;
|
||||
+ b->val_valid = 1;
|
||||
+ }
|
||||
|
||||
/* Look at each value on the value chain. */
|
||||
- for (; v; v = value_next (v))
|
||||
+ for (v = val_chain; v; v = value_next (v))
|
||||
{
|
||||
/* If it's a memory location, and GDB actually needed
|
||||
its contents to evaluate the expression, then we
|
||||
- must watch it. */
|
||||
+ must watch it. If the first value returned is
|
||||
+ still lazy, that means an error occurred reading it;
|
||||
+ watch it anyway in case it becomes readable. */
|
||||
if (VALUE_LVAL (v) == lval_memory
|
||||
- && ! value_lazy (v))
|
||||
+ && (v == val_chain || ! value_lazy (v)))
|
||||
{
|
||||
struct type *vtype = check_typedef (value_type (v));
|
||||
|
||||
/* We only watch structs and arrays if user asked
|
||||
for it explicitly, never if they just happen to
|
||||
appear in the middle of some value chain. */
|
||||
- if (v == b->val
|
||||
+ if (v == result
|
||||
|| (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
|
||||
&& TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
|
||||
{
|
||||
@@ -1682,6 +1734,7 @@ breakpoint_init_inferior (enum inf_conte
|
||||
if (b->val)
|
||||
value_free (b->val);
|
||||
b->val = NULL;
|
||||
+ b->val_valid = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -2104,6 +2157,17 @@ top:
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
+/* Print out the (old or new) value associated with a watchpoint. */
|
||||
+
|
||||
+static void
|
||||
+watchpoint_value_print (struct value *val, struct ui_file *stream)
|
||||
+{
|
||||
+ if (val == NULL)
|
||||
+ fprintf_unfiltered (stream, _("<unreadable>"));
|
||||
+ else
|
||||
+ value_print (val, stream, 0, Val_pretty_default);
|
||||
+}
|
||||
+
|
||||
/* This is the normal print function for a bpstat. In the future,
|
||||
much of this logic could (should?) be moved to bpstat_stop_status,
|
||||
by having it set different print_it values.
|
||||
@@ -2222,26 +2286,21 @@ print_it_typical (bpstat bs)
|
||||
|
||||
case bp_watchpoint:
|
||||
case bp_hardware_watchpoint:
|
||||
- if (bs->old_val != NULL)
|
||||
- {
|
||||
- annotate_watchpoint (b->number);
|
||||
- if (ui_out_is_mi_like_p (uiout))
|
||||
- ui_out_field_string
|
||||
- (uiout, "reason",
|
||||
- async_reason_lookup (EXEC_ASYNC_WATCHPOINT_TRIGGER));
|
||||
- mention (b);
|
||||
- ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
|
||||
- ui_out_text (uiout, "\nOld value = ");
|
||||
- value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
|
||||
- ui_out_field_stream (uiout, "old", stb);
|
||||
- ui_out_text (uiout, "\nNew value = ");
|
||||
- value_print (b->val, stb->stream, 0, Val_pretty_default);
|
||||
- ui_out_field_stream (uiout, "new", stb);
|
||||
- do_cleanups (ui_out_chain);
|
||||
- ui_out_text (uiout, "\n");
|
||||
- value_free (bs->old_val);
|
||||
- bs->old_val = NULL;
|
||||
- }
|
||||
+ annotate_watchpoint (b->number);
|
||||
+ if (ui_out_is_mi_like_p (uiout))
|
||||
+ ui_out_field_string
|
||||
+ (uiout, "reason",
|
||||
+ async_reason_lookup (EXEC_ASYNC_WATCHPOINT_TRIGGER));
|
||||
+ mention (b);
|
||||
+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
|
||||
+ ui_out_text (uiout, "\nOld value = ");
|
||||
+ watchpoint_value_print (bs->old_val, stb->stream);
|
||||
+ ui_out_field_stream (uiout, "old", stb);
|
||||
+ ui_out_text (uiout, "\nNew value = ");
|
||||
+ watchpoint_value_print (b->val, stb->stream);
|
||||
+ ui_out_field_stream (uiout, "new", stb);
|
||||
+ do_cleanups (ui_out_chain);
|
||||
+ ui_out_text (uiout, "\n");
|
||||
/* More than one watchpoint may have been triggered. */
|
||||
return PRINT_UNKNOWN;
|
||||
break;
|
||||
@@ -2254,7 +2313,7 @@ print_it_typical (bpstat bs)
|
||||
mention (b);
|
||||
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
|
||||
ui_out_text (uiout, "\nValue = ");
|
||||
- value_print (b->val, stb->stream, 0, Val_pretty_default);
|
||||
+ watchpoint_value_print (b->val, stb->stream);
|
||||
ui_out_field_stream (uiout, "value", stb);
|
||||
do_cleanups (ui_out_chain);
|
||||
ui_out_text (uiout, "\n");
|
||||
@@ -2262,7 +2321,7 @@ print_it_typical (bpstat bs)
|
||||
break;
|
||||
|
||||
case bp_access_watchpoint:
|
||||
- if (bs->old_val != NULL)
|
||||
+ if (bs->old_val != NULL)
|
||||
{
|
||||
annotate_watchpoint (b->number);
|
||||
if (ui_out_is_mi_like_p (uiout))
|
||||
@@ -2272,10 +2331,8 @@ print_it_typical (bpstat bs)
|
||||
mention (b);
|
||||
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
|
||||
ui_out_text (uiout, "\nOld value = ");
|
||||
- value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
|
||||
+ watchpoint_value_print (bs->old_val, stb->stream);
|
||||
ui_out_field_stream (uiout, "old", stb);
|
||||
- value_free (bs->old_val);
|
||||
- bs->old_val = NULL;
|
||||
ui_out_text (uiout, "\nNew value = ");
|
||||
}
|
||||
else
|
||||
@@ -2288,7 +2345,7 @@ print_it_typical (bpstat bs)
|
||||
ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
|
||||
ui_out_text (uiout, "\nValue = ");
|
||||
}
|
||||
- value_print (b->val, stb->stream, 0,Val_pretty_default);
|
||||
+ watchpoint_value_print (b->val, stb->stream);
|
||||
ui_out_field_stream (uiout, "new", stb);
|
||||
do_cleanups (ui_out_chain);
|
||||
ui_out_text (uiout, "\n");
|
||||
@@ -2575,13 +2632,20 @@ watchpoint_check (void *p)
|
||||
we might be in the middle of evaluating a function call. */
|
||||
|
||||
struct value *mark = value_mark ();
|
||||
- struct value *new_val = evaluate_expression (b->exp);
|
||||
- if (!value_equal (b->val, new_val))
|
||||
+ struct value *new_val;
|
||||
+
|
||||
+ fetch_watchpoint_value (b->exp, &new_val, NULL, NULL);
|
||||
+ if ((b->val != NULL) != (new_val != NULL)
|
||||
+ || (b->val != NULL && !value_equal (b->val, new_val)))
|
||||
{
|
||||
- release_value (new_val);
|
||||
- value_free_to_mark (mark);
|
||||
+ if (new_val != NULL)
|
||||
+ {
|
||||
+ release_value (new_val);
|
||||
+ value_free_to_mark (mark);
|
||||
+ }
|
||||
bs->old_val = b->val;
|
||||
b->val = new_val;
|
||||
+ b->val_valid = 1;
|
||||
/* We will stop here */
|
||||
return WP_VALUE_CHANGED;
|
||||
}
|
||||
@@ -5780,10 +5844,9 @@ watch_command_1 (char *arg, int accessfl
|
||||
exp_end = arg;
|
||||
exp_valid_block = innermost_block;
|
||||
mark = value_mark ();
|
||||
- val = evaluate_expression (exp);
|
||||
- release_value (val);
|
||||
- if (value_lazy (val))
|
||||
- value_fetch_lazy (val);
|
||||
+ fetch_watchpoint_value (exp, &val, NULL, NULL);
|
||||
+ if (val != NULL)
|
||||
+ release_value (val);
|
||||
|
||||
tok = arg;
|
||||
while (*tok == ' ' || *tok == '\t')
|
||||
@@ -5872,6 +5935,7 @@ watch_command_1 (char *arg, int accessfl
|
||||
b->exp_valid_block = exp_valid_block;
|
||||
b->exp_string = savestring (exp_start, exp_end - exp_start);
|
||||
b->val = val;
|
||||
+ b->val_valid = 1;
|
||||
b->loc->cond = cond;
|
||||
if (cond_start)
|
||||
b->cond_string = savestring (cond_start, cond_end - cond_start);
|
||||
@@ -7755,11 +7819,11 @@ is valid is not currently in scope.\n"),
|
||||
if (bpt->val)
|
||||
value_free (bpt->val);
|
||||
mark = value_mark ();
|
||||
- bpt->val = evaluate_expression (bpt->exp);
|
||||
- release_value (bpt->val);
|
||||
- if (value_lazy (bpt->val))
|
||||
- value_fetch_lazy (bpt->val);
|
||||
-
|
||||
+ fetch_watchpoint_value (bpt->exp, &bpt->val, NULL, NULL);
|
||||
+ if (bpt->val)
|
||||
+ release_value (bpt->val);
|
||||
+ bpt->val_valid = 1;
|
||||
+
|
||||
if (bpt->type == bp_hardware_watchpoint ||
|
||||
bpt->type == bp_read_watchpoint ||
|
||||
bpt->type == bp_access_watchpoint)
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.50.20080227-orig/gdb/breakpoint.h gdb-6.7.50.20080227-dynwatch/gdb/breakpoint.h
|
||||
--- gdb-6.7.50.20080227-orig/gdb/breakpoint.h 2008-03-03 08:42:10.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227-dynwatch/gdb/breakpoint.h 2008-03-03 08:34:20.000000000 +0100
|
||||
@@ -392,8 +392,13 @@ struct breakpoint
|
||||
/* The largest block within which it is valid, or NULL if it is
|
||||
valid anywhere (e.g. consists just of global symbols). */
|
||||
struct block *exp_valid_block;
|
||||
- /* Value of the watchpoint the last time we checked it. */
|
||||
+ /* Value of the watchpoint the last time we checked it, or NULL
|
||||
+ when we do not know the value yet or the value was not
|
||||
+ readable. VAL is never lazy. */
|
||||
struct value *val;
|
||||
+ /* Nonzero if VAL is valid. If VAL_VALID is set but VAL is NULL,
|
||||
+ then an error occurred reading the value. */
|
||||
+ int val_valid;
|
||||
|
||||
/* Holds the address of the related watchpoint_scope breakpoint
|
||||
when using watchpoints on local variables (might the concept
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.50.20080227-orig/gdb/testsuite/gdb.base/watchpoint.c gdb-6.7.50.20080227-dynwatch/gdb/testsuite/gdb.base/watchpoint.c
|
||||
--- gdb-6.7.50.20080227-orig/gdb/testsuite/gdb.base/watchpoint.c 2003-03-17 20:51:58.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227-dynwatch/gdb/testsuite/gdb.base/watchpoint.c 2008-03-03 08:34:20.000000000 +0100
|
||||
@@ -39,6 +39,8 @@ struct foo struct1, struct2, *ptr1, *ptr
|
||||
|
||||
int doread = 0;
|
||||
|
||||
+char *global_ptr;
|
||||
+
|
||||
void marker1 ()
|
||||
{
|
||||
}
|
||||
@@ -110,6 +112,14 @@ func1 ()
|
||||
return 73;
|
||||
}
|
||||
|
||||
+void
|
||||
+func4 ()
|
||||
+{
|
||||
+ buf[0] = 3;
|
||||
+ global_ptr = buf;
|
||||
+ buf[0] = 7;
|
||||
+}
|
||||
+
|
||||
int main ()
|
||||
{
|
||||
#ifdef usestubs
|
||||
@@ -185,5 +195,7 @@ int main ()
|
||||
|
||||
func3 ();
|
||||
|
||||
+ func4 ();
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
diff -u -X /home/jkratoch/.diffi.list -rup gdb-6.7.50.20080227-orig/gdb/testsuite/gdb.base/watchpoint.exp gdb-6.7.50.20080227-dynwatch/gdb/testsuite/gdb.base/watchpoint.exp
|
||||
--- gdb-6.7.50.20080227-orig/gdb/testsuite/gdb.base/watchpoint.exp 2008-01-01 23:53:19.000000000 +0100
|
||||
+++ gdb-6.7.50.20080227-dynwatch/gdb/testsuite/gdb.base/watchpoint.exp 2008-03-03 08:34:20.000000000 +0100
|
||||
@@ -645,6 +645,30 @@ proc test_watchpoint_and_breakpoint {} {
|
||||
}
|
||||
}
|
||||
|
||||
+proc test_inaccessible_watchpoint {} {
|
||||
+ global gdb_prompt
|
||||
+
|
||||
+ # This is a test for watchpoints on currently inaccessible (but later
|
||||
+ # valid) memory.
|
||||
+
|
||||
+ if [runto func4] then {
|
||||
+ gdb_test "watch *global_ptr" ".*atchpoint \[0-9\]+: \\*global_ptr"
|
||||
+ gdb_test "next" ".*global_ptr = buf.*"
|
||||
+ gdb_test_multiple "next" "next over ptr init" {
|
||||
+ -re ".*atchpoint \[0-9\]+: \\*global_ptr\r\n\r\nOld value = .*\r\nNew value = 3 .*\r\n.*$gdb_prompt $" {
|
||||
+ # We can not test for <unknown> here because NULL may be readable.
|
||||
+ # This test does rely on *NULL != 3.
|
||||
+ pass "next over ptr init"
|
||||
+ }
|
||||
+ }
|
||||
+ gdb_test_multiple "next" "next over buffer set" {
|
||||
+ -re ".*atchpoint \[0-9\]+: \\*global_ptr\r\n\r\nOld value = 3 .*\r\nNew value = 7 .*\r\n.*$gdb_prompt $" {
|
||||
+ pass "next over buffer set"
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
# Start with a fresh gdb.
|
||||
|
||||
gdb_exit
|
||||
@@ -655,6 +679,7 @@ set prev_timeout $timeout
|
||||
set timeout 600
|
||||
verbose "Timeout now 600 sec.\n"
|
||||
|
||||
+gdb_test "set debug solib 1"
|
||||
if [initialize] then {
|
||||
|
||||
test_simple_watchpoint
|
||||
@@ -797,6 +822,8 @@ if [initialize] then {
|
||||
}
|
||||
}
|
||||
|
||||
+ test_inaccessible_watchpoint
|
||||
+
|
||||
# See above.
|
||||
if [istarget "mips-idt-*"] then {
|
||||
gdb_exit
|
76
gdb.spec
76
gdb.spec
@ -8,14 +8,14 @@ Name: gdb%{?_with_debug:-debug}
|
||||
# Set version to contents of gdb/version.in.
|
||||
# NOTE: the FSF gdb versions are numbered N.M for official releases, like 6.3
|
||||
# and, since January 2005, X.Y.Z.date for daily snapshots, like 6.3.50.20050112 # (daily snapshot from mailine), or 6.3.0.20040112 (head of the release branch).
|
||||
Version: 6.7.1
|
||||
Version: 6.7.50.20080227
|
||||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
Release: 16%{?dist}
|
||||
Release: 1%{?dist}
|
||||
|
||||
License: GPL
|
||||
Group: Development/Debuggers
|
||||
Source: ftp://ftp.gnu.org/gnu/gdb/gdb-6.7.1.tar.bz2
|
||||
Source: ftp://sourceware.org/pub/gdb/snapshots/current/gdb-6.7.50.20080227.tar.bz2
|
||||
Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
|
||||
URL: http://gnu.org/software/gdb/
|
||||
|
||||
@ -82,10 +82,6 @@ Patch105: gdb-6.3-ppc64syscall-20040622.patch
|
||||
# Stop a backtrace when a zero PC is encountered.
|
||||
Patch106: gdb-6.3-framepczero-20040927.patch
|
||||
|
||||
# Pass the pc's section into the symbol search code; stops the lookup
|
||||
# finding a symbol from the wrong section.
|
||||
Patch108: gdb-6.3-ppc64section-20041026.patch
|
||||
|
||||
# Include the pc's section when doing a symbol lookup so that the
|
||||
# correct symbol is found.
|
||||
Patch111: gdb-6.3-ppc64displaysymbol-20041124.patch
|
||||
@ -95,9 +91,6 @@ Patch112: gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch
|
||||
# Make upstream `set scheduler-locking step' as default.
|
||||
Patch260: gdb-6.6-scheduler_locking-step-is-default.patch
|
||||
|
||||
# Threaded watchpoint support
|
||||
Patch113: gdb-6.3-threaded-watchpoints-20041213.patch
|
||||
|
||||
# Continue removing breakpoints even when failure occurs.
|
||||
Patch117: gdb-6.3-removebp-20041130.patch
|
||||
|
||||
@ -112,7 +105,6 @@ Patch119: gdb-6.3-lwp-cache-20041216.patch
|
||||
Patch120: gdb-6.3-type-fix-20041213.patch
|
||||
|
||||
# VSYSCALL and PIE
|
||||
Patch122: gdb-6.3-test-pie-20050107.patch
|
||||
Patch124: gdb-6.3-pie-20050110.patch
|
||||
|
||||
# Get selftest working with sep-debug-info
|
||||
@ -140,9 +132,6 @@ Patch259: gdb-6.3-step-thread-exit-20050211-test.patch
|
||||
# Prevent gdb from being pushed into background
|
||||
Patch142: gdb-6.3-terminal-fix-20050214.patch
|
||||
|
||||
# Allow sibling threads to set threaded watchpoints for x86 and x86-64
|
||||
Patch145: gdb-6.3-threaded-watchpoints2-20050225.patch
|
||||
|
||||
# Fix unexpected compiler warning messages.
|
||||
Patch147: gdb-6.3-warnings-20050317.patch
|
||||
|
||||
@ -162,9 +151,6 @@ Patch157: gdb-6.3-security-errata-20050610.patch
|
||||
# IA64 sigtramp prev register patch
|
||||
Patch158: gdb-6.3-ia64-sigtramp-frame-20050708.patch
|
||||
|
||||
# IA64 sigaltstack patch
|
||||
Patch159: gdb-6.3-ia64-sigaltstack-20050711.patch
|
||||
|
||||
# IA64 gcore speed-up patch
|
||||
Patch160: gdb-6.3-ia64-gcore-speedup-20050714.patch
|
||||
|
||||
@ -263,7 +249,7 @@ Patch229: gdb-6.3-bz140532-ppc-unwinding-test.patch
|
||||
Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
|
||||
|
||||
# Backported post gdb-6.7 release fixups.
|
||||
Patch232: gdb-6.7.1-upstream.patch
|
||||
#Patch232: gdb-6.7.1-upstream.patch
|
||||
|
||||
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
|
||||
Patch234: gdb-6.6-bz230000-power6-disassembly-test.patch
|
||||
@ -271,9 +257,6 @@ Patch234: gdb-6.6-bz230000-power6-disassembly-test.patch
|
||||
# Temporary support for shared libraries >2GB on 64bit hosts. (BZ 231832)
|
||||
Patch235: gdb-6.3-bz231832-obstack-2gb.patch
|
||||
|
||||
# Suggest SELinux permissions problem; no assertion failure anymore (BZ 232371).
|
||||
Patch236: gdb-6.6-bz232371-selinux-thread-error.patch
|
||||
|
||||
# Fix prelink(8) testcase for non-root $PATH missing `/usr/sbin' (BZ 225783).
|
||||
Patch240: gdb-6.6-bz225783-prelink-path.patch
|
||||
|
||||
@ -283,18 +266,12 @@ Patch241: gdb-6.6-bz225783-gdb-debuginfo-paths.patch
|
||||
# Allow running `/usr/bin/gcore' with provided but inaccessible tty (BZ 229517).
|
||||
Patch245: gdb-6.6-bz229517-gcore-without-terminal.patch
|
||||
|
||||
# Fix testcase for watchpoints in threads (for BZ 237096).
|
||||
Patch246: gdb-6.6-bz237096-watchthreads-testcasefix.patch
|
||||
|
||||
# Notify user of a child forked process being detached (BZ 235197).
|
||||
Patch247: gdb-6.6-bz235197-fork-detach-info.patch
|
||||
|
||||
# New testcase for gcore of 32bit inferiors on 64bit hosts.
|
||||
Patch249: gdb-6.6-gcore32-test.patch
|
||||
|
||||
# Enable PowerPC to print 128-bit long double variables (BZ 237872).
|
||||
Patch251: gdb-6.5-bz237872-ppc-long-double.patch
|
||||
|
||||
# Avoid too long timeouts on failing cases of "annota1.exp annota3.exp".
|
||||
Patch254: gdb-6.6-testsuite-timeouts.patch
|
||||
|
||||
@ -325,9 +302,6 @@ Patch276: gdb-6.6-bfd-vdso8k.patch
|
||||
# Fixed the kernel i386-on-x86_64 VDSO loading (producing `Lowest section in').
|
||||
Patch277: gdb-6.6-vdso-i386-on-amd64-warning.patch
|
||||
|
||||
# Fix debug load for sparse assembler files (such as vDSO32 for i386-on-x86_64).
|
||||
Patch278: gdb-6.6-cu-ranges.patch
|
||||
|
||||
# Fix hardware watchpoints after inferior forks-off some process.
|
||||
# Threaded `set follow-fork-mode child' still not fixed there, glibc fixes reqd.
|
||||
# `set detach-on-fork off' not fixed there in general - it already assert-fails.
|
||||
@ -362,12 +336,15 @@ Patch298: gdb-6.6-threads-static-test.patch
|
||||
# Fix false `(no debugging symbols found)' on `-readnever' runs.
|
||||
Patch301: gdb-6.6-buildid-readnever-silent.patch
|
||||
|
||||
# ia64 build fixes from Doug Chapman (BZ 428882).
|
||||
Patch303: gdb-6.7-bz428882-ia64-fix.patch
|
||||
|
||||
# Fix #include <asm/ptrace.h> on kernel-headers-2.6.25-0.40.rc1.git2.fc9.x86_64.
|
||||
Patch304: gdb-6.7-kernel-headers-compat.patch
|
||||
|
||||
# Fix/implement the Fortran dynamic arrays support (BZ 377541).
|
||||
Patch305: gdb-6.8-bz377541-fortran-dynamic-arrays.patch
|
||||
|
||||
# Backport fix of a segfault + PIE regression since 6.7.1 on PIE executables.
|
||||
Patch306: gdb-6.8-watchpoint-inaccessible-memory.patch
|
||||
|
||||
BuildRequires: ncurses-devel glibc-devel gcc make gzip texinfo dejagnu gettext
|
||||
BuildRequires: flex bison sharutils expat-devel
|
||||
Requires: readline
|
||||
@ -378,7 +355,7 @@ BuildRequires: rpm-devel
|
||||
# BuildRequires are set here only for the complete testsuite run.
|
||||
%if 0%{?_with_testsuite:1}
|
||||
# gcc-objc++ is not covered by the GDB testsuite.
|
||||
BuildRequires: gcc gcc-c++ gcc-gfortran gcc-java gcc-objc
|
||||
BuildRequires: gcc gcc-c++ gcc-gfortran gcc-java gcc-objc fpc
|
||||
# Copied from gcc-4.1.2-32
|
||||
%ifarch %{ix86} x86_64 ia64 ppc alpha
|
||||
BuildRequires: gcc-gnat
|
||||
@ -429,7 +406,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
|
||||
# Apply patches defined above.
|
||||
|
||||
%patch232 -p1
|
||||
#%patch232 -p1
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
@ -440,15 +417,12 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch104 -p1
|
||||
%patch105 -p1
|
||||
%patch106 -p1
|
||||
%patch108 -p1
|
||||
%patch111 -p1
|
||||
%patch112 -p1
|
||||
%patch113 -p1
|
||||
%patch117 -p1
|
||||
%patch118 -p1
|
||||
%patch119 -p1
|
||||
%patch120 -p1
|
||||
%patch122 -p1
|
||||
%patch124 -p1
|
||||
%patch125 -p1
|
||||
%patch128 -p1
|
||||
@ -458,7 +432,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch141 -p1
|
||||
%patch259 -p1
|
||||
%patch142 -p1
|
||||
%patch145 -p1
|
||||
%patch147 -p1
|
||||
%patch148 -p1
|
||||
%patch150 -p1
|
||||
@ -466,7 +439,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch153 -p1
|
||||
%patch157 -p1
|
||||
%patch158 -p1
|
||||
%patch159 -p1
|
||||
%patch160 -p1
|
||||
%patch161 -p1
|
||||
%patch162 -p1
|
||||
@ -501,14 +473,11 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch231 -p1
|
||||
%patch234 -p1
|
||||
%patch235 -p1
|
||||
%patch236 -p1
|
||||
%patch240 -p1
|
||||
%patch241 -p1
|
||||
%patch245 -p1
|
||||
%patch246 -p1
|
||||
%patch247 -p1
|
||||
%patch249 -p1
|
||||
%patch251 -p1
|
||||
%patch254 -p1
|
||||
%patch256 -p1
|
||||
%patch258 -p1
|
||||
@ -521,7 +490,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch275 -p1
|
||||
%patch276 -p1
|
||||
%patch277 -p1
|
||||
%patch278 -p1
|
||||
%patch280 -p1
|
||||
%patch282 -p1
|
||||
%patch283 -p1
|
||||
@ -533,17 +501,22 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch296 -p1
|
||||
%patch298 -p1
|
||||
%patch301 -p1
|
||||
%patch303 -p1
|
||||
%patch304 -p1
|
||||
%patch305 -p1
|
||||
%patch306 -p1
|
||||
|
||||
# Change the version that gets printed at GDB startup, so it is RedHat
|
||||
find -name "*.orig" | xargs rm -f
|
||||
! find -name "*.rej" # Should not happen.
|
||||
|
||||
# Change the version that gets printed at GDB startup, so it is Fedora
|
||||
# specific.
|
||||
cat > gdb/version.in << _FOO
|
||||
Red Hat Linux (%{version}-%{release}rh)
|
||||
Fedora (%{version}-%{release})
|
||||
_FOO
|
||||
|
||||
# Remove the info and other generated files added by the FSF release
|
||||
# process.
|
||||
rm -f libdecnumber/gstdint.h
|
||||
rm -f bfd/doc/*.info
|
||||
rm -f bfd/doc/*.info-*
|
||||
rm -f gdb/doc/*.info
|
||||
@ -591,6 +564,7 @@ enable_build_warnings="$enable_build_warnings,-Werror"
|
||||
--disable-sim \
|
||||
--disable-rpath \
|
||||
--with-system-readline \
|
||||
--with-expat \
|
||||
%ifarch ia64
|
||||
--with-libunwind \
|
||||
%else
|
||||
@ -763,6 +737,14 @@ fi
|
||||
%{_mandir}/*/gdbserver.1*
|
||||
|
||||
%changelog
|
||||
* Mon Mar 3 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.7.50.20080227-1
|
||||
- Upgrade to the upstream gdb-6.8 prerelease.
|
||||
- Cleanup the leftover `.orig' files during %%prep.
|
||||
- Add expat-devel check by the configure script (for the other-arch builds).
|
||||
- `--with testsuite' now also BuildRequires: fpc
|
||||
- Backport fix of a segfault + PIE regression since 6.7.1 on PIE executables.
|
||||
- Update the printed GDB version string to be Fedora specific.
|
||||
|
||||
* Sat Mar 1 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.7.1-16
|
||||
- Run the full testsuite also in the `-fPIE -pie' mode.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user