Rebase to: gdb-7.0.1-25.fc12
This commit is contained in:
parent
bef45217a0
commit
0911f375d9
@ -1,2 +1,2 @@
|
||||
libstdc++-v3-python-r151798.tar.xz
|
||||
gdb-6.8.91.20090930.tar.bz2
|
||||
gdb-7.0.1.tar.bz2
|
||||
libstdc++-v3-python-r151798.tar.bz2
|
||||
|
2
Makefile
2
Makefile
@ -1,5 +1,5 @@
|
||||
# Makefile for source rpm: gdb
|
||||
# $Id: Makefile,v 1.3 2007/10/15 18:46:45 notting Exp $
|
||||
# $Id: Makefile,v 1.4 2009/11/26 01:53:59 notting Exp $
|
||||
NAME := gdb
|
||||
SPECFILE = $(firstword $(wildcard *.spec))
|
||||
|
||||
|
@ -1,23 +0,0 @@
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=182116
|
||||
|
||||
|
||||
Index: gdb-6.5/gdb/linux-thread-db.c
|
||||
===================================================================
|
||||
--- gdb-6.5.orig/gdb/linux-thread-db.c 2006-08-24 02:55:24.000000000 -0300
|
||||
+++ gdb-6.5/gdb/linux-thread-db.c 2006-08-24 02:56:16.000000000 -0300
|
||||
@@ -939,6 +939,15 @@ thread_db_wait (ptid_t ptid, struct targ
|
||||
|| ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
|
||||
return pid_to_ptid (-1);
|
||||
|
||||
+ if (ourstatus->kind == TARGET_WAITKIND_EXECD)
|
||||
+ {
|
||||
+ remove_thread_event_breakpoints ();
|
||||
+ unpush_target (&thread_db_ops);
|
||||
+ using_thread_db = 0;
|
||||
+
|
||||
+ return pid_to_ptid (GET_PID (ptid));
|
||||
+ }
|
||||
+
|
||||
if (ourstatus->kind == TARGET_WAITKIND_STOPPED
|
||||
&& (ourstatus->value.sig == TARGET_SIGNAL_TRAP
|
||||
|| ourstatus->value.sig == TARGET_SIGNAL_ILL))
|
@ -1,28 +0,0 @@
|
||||
2005-01-25 Jeff Johnston <jjohnstn@redhat.com>
|
||||
|
||||
* ia64-tdep.c (getunwind_table): Call the low-level xfer
|
||||
unwind table syscall to support backtracing from syscalls in
|
||||
a corefile.
|
||||
|
||||
Index: gdb-6.5/gdb/ia64-tdep.c
|
||||
===================================================================
|
||||
--- gdb-6.5.orig/gdb/ia64-tdep.c 2006-04-18 16:20:06.000000000 -0300
|
||||
+++ gdb-6.5/gdb/ia64-tdep.c 2006-07-07 02:18:40.000000000 -0300
|
||||
@@ -2470,8 +2470,17 @@ getunwind_table (void *buf, size_t len)
|
||||
we want to preserve fall back to the running kernel's table, then
|
||||
we should find a way to override the corefile layer's
|
||||
xfer_partial method. */
|
||||
+#if 0
|
||||
x = target_read_partial (¤t_target, TARGET_OBJECT_UNWIND_TABLE, NULL,
|
||||
buf, 0, len);
|
||||
+#endif
|
||||
+ /* FIXME: This is a temporary solution to backtracing syscalls in corefiles.
|
||||
+ To do this properly, the AUXV section should be used. This
|
||||
+ fix will work as long as the kernel used to generate the corefile
|
||||
+ is equivalent to the kernel used to debug the corefile. */
|
||||
+ x = ia64_linux_xfer_unwind_table (¤t_target,
|
||||
+ TARGET_OBJECT_UNWIND_TABLE, NULL,
|
||||
+ buf, NULL, 0, len);
|
||||
|
||||
return (int)x;
|
||||
}
|
@ -41,7 +41,7 @@ testsuite:
|
||||
+
|
||||
--- gdb-6.3/gdb/testsuite/gdb.arch/ia64-sigtramp.exp.fix 2005-07-25 16:42:50.000000000 -0400
|
||||
+++ gdb-6.3/gdb/testsuite/gdb.arch/ia64-sigtramp.exp 2005-07-25 16:42:01.000000000 -0400
|
||||
@@ -0,0 +1,66 @@
|
||||
@@ -0,0 +1,73 @@
|
||||
+# Copyright 2005 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
@ -90,7 +90,10 @@ testsuite:
|
||||
+}
|
||||
+
|
||||
+gdb_exit
|
||||
+set match_max_old [match_max]
|
||||
+match_max -d 1000000
|
||||
+gdb_start
|
||||
+match_max -d $match_max_old
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
@ -106,5 +109,9 @@ testsuite:
|
||||
+gdb_test "continue" "Breakpoint.*x.*" "continue to x"
|
||||
+
|
||||
+gdb_test "f 1" ".*signal handler called.*" "frame 1"
|
||||
+gdb_test "info frame" "Stack level 1.*p63 at .*" "info sigtramp frame"
|
||||
+
|
||||
+
|
||||
+# gdb-7.0+ no longer prints the pseudo registers as they are computed.
|
||||
+# frame_info says: /* For moment, only display registers that were saved on the
|
||||
+# stack. */
|
||||
+gdb_test "set debug frame 1"
|
||||
+gdb_test "info frame" "Stack level 1, .*frame_unwind_register_value \\(frame=1,regnum=750\\(p63\\),\[^\r\n\]*\r\n\[^\r\n\]*-> computed bytes=.*" "info sigtramp frame"
|
||||
|
@ -29,7 +29,7 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c
|
||||
+ ULONGEST unatN_val;
|
||||
+ ULONGEST unat;
|
||||
+ read_memory (cache->saved_regs[IA64_UNAT_REGNUM], (char *) &unat,
|
||||
+ register_size (current_gdbarch, IA64_UNAT_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_UNAT_REGNUM));
|
||||
+ unatN_val = (unat & (1LL << (regnum - IA64_NAT0_REGNUM))) != 0;
|
||||
+ return frame_unwind_got_constant (this_frame, regnum, unatN_val);
|
||||
+ }
|
||||
@ -45,9 +45,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c
|
||||
+ CORE_ADDR gr_addr = 0, nat_addr = 0;
|
||||
+
|
||||
+ read_memory (cache->saved_regs[IA64_BSP_REGNUM], (char *) &bsp,
|
||||
+ register_size (current_gdbarch, IA64_BSP_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_BSP_REGNUM));
|
||||
+ read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm,
|
||||
+ register_size (current_gdbarch, IA64_CFM_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_CFM_REGNUM));
|
||||
+
|
||||
+ /* The bsp points at the end of the register frame so we
|
||||
+ subtract the size of frame from it to get start of register frame. */
|
||||
@ -71,10 +71,10 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c
|
||||
+ nat_addr = cache->saved_regs[IA64_RNAT_REGNUM];
|
||||
+ if (nat_addr != 0)
|
||||
+ read_memory (nat_addr, (char *) &nat_collection,
|
||||
+ register_size (current_gdbarch, IA64_RNAT_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_RNAT_REGNUM));
|
||||
+ }
|
||||
+ else
|
||||
+ nat_collection = read_memory_integer (nat_addr, 8);
|
||||
+ nat_collection = read_memory_integer (nat_addr, 8, BFD_ENDIAN_LITTLE);
|
||||
+ if (nat_addr != 0)
|
||||
+ {
|
||||
+ nat_bit = (gr_addr >> 3) & 0x3f;
|
||||
@ -97,9 +97,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c
|
||||
+ ULONGEST bof;
|
||||
+
|
||||
+ read_memory (cache->saved_regs[IA64_BSP_REGNUM], (char *) &bsp,
|
||||
+ register_size (current_gdbarch, IA64_BSP_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_BSP_REGNUM));
|
||||
+ read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm,
|
||||
+ register_size (current_gdbarch, IA64_CFM_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_CFM_REGNUM));
|
||||
+
|
||||
+ /* The bsp points at the end of the register frame so we
|
||||
+ subtract the size of frame from it to get beginning of frame. */
|
||||
@ -133,9 +133,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep.c
|
||||
+ ULONGEST cfm;
|
||||
+ ULONGEST prN_val;
|
||||
+ read_memory (pr_addr, (char *) &pr,
|
||||
+ register_size (current_gdbarch, IA64_PR_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_PR_REGNUM));
|
||||
+ read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm,
|
||||
+ register_size (current_gdbarch, IA64_CFM_REGNUM));
|
||||
+ register_size (target_gdbarch, IA64_CFM_REGNUM));
|
||||
+
|
||||
+ /* Get the register rename base for this frame and adjust the
|
||||
+ * register name to take rotation into account. */
|
||||
|
@ -1,119 +0,0 @@
|
||||
[base]
|
||||
|
||||
2007-10-13 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* linux-nat.c (iterate_over_lwps): Fixed missing LWP initialization for
|
||||
current INFERIOR_PTID.
|
||||
|
||||
2007-10-13 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.base/follow-child.exp, gdb.base/follow-child.c: New files.
|
||||
|
||||
2007-10-16 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.7.
|
||||
|
||||
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Port to GDB-6.8pre.
|
||||
|
||||
2008-08-25 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Remove the fix as causing an assertion failure for
|
||||
gdb.base/checkpoint.exp and it is no longer needed for
|
||||
gdb.base/follow-child.exp .
|
||||
|
||||
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.
|
||||
+
|
||||
+ 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 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.
|
||||
+
|
||||
+ Please email any bugs, comments, and/or additions to this file to:
|
||||
+ bug-gdb@prep.ai.mit.edu */
|
||||
+
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+int main()
|
||||
+{
|
||||
+ fork ();
|
||||
+ sleep (60);
|
||||
+ return 0;
|
||||
+}
|
||||
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.
|
||||
+
|
||||
+# 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.
|
||||
+
|
||||
+if $tracelevel then {
|
||||
+ strace $tracelevel
|
||||
+}
|
||||
+
|
||||
+set prms_id 0
|
||||
+set bug_id 0
|
||||
+
|
||||
+set testfile follow-child
|
||||
+set srcfile ${testfile}.c
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
||||
+ untested "Couldn't compile test program"
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+# Get things started.
|
||||
+
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+# For C programs, "start" should stop in main().
|
||||
+
|
||||
+gdb_test "set follow-fork-mode child" ""
|
||||
+set test "started"
|
||||
+# GDB_RUN_CMD already checks for `Starting program:'.
|
||||
+gdb_run_cmd
|
||||
+sleep 5
|
||||
+send_gdb "\003"
|
||||
+set test "break"
|
||||
+gdb_test_multiple "" $test {
|
||||
+ -re "Program received signal SIGINT.*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+ -re "\\\[New process \[0-9\]+\\\]" {
|
||||
+ fail $test
|
||||
+ }
|
||||
+}
|
File diff suppressed because it is too large
Load Diff
@ -11,8 +11,8 @@ Index: gdb-6.8/gdb/testsuite/gdb.gdb/selftest.exp
|
||||
-re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" {
|
||||
pass "printed version with cast"
|
||||
}
|
||||
+ -re ".\[0-9\]+ = .Fedora \[\\(\\)0-9.a-z\\-\]+.*$gdb_prompt $" {
|
||||
+ pass "printed version Fedora only"
|
||||
+ -re ".\[0-9\]+ = .(Fedora|Red Hat Enterprise Linux) \[\\(\\)0-9.a-z\\-\]+.*$gdb_prompt $" {
|
||||
+ pass "printed version Fedora or Red Hat Enterprise Linux only"
|
||||
+ }
|
||||
-re ".*$gdb_prompt $" { fail "printed version" }
|
||||
timeout { fail "(timeout) printed version" }
|
||||
|
@ -1,82 +0,0 @@
|
||||
2005-04-02 Andrew Cagney <cagney@gnu.org>
|
||||
|
||||
* symfile.c (separate_debug_file_exists): When the CRCs mismatch
|
||||
print a warning.
|
||||
(find_separate_debug_file): Pass in the objfile's name.
|
||||
|
||||
Index: gdb-6.8.50.20081128/gdb/symfile.c
|
||||
===================================================================
|
||||
--- gdb-6.8.50.20081128.orig/gdb/symfile.c 2008-10-03 18:36:10.000000000 +0200
|
||||
+++ gdb-6.8.50.20081128/gdb/symfile.c 2008-12-01 16:34:36.000000000 +0100
|
||||
@@ -1296,7 +1296,8 @@ get_debug_link_info (struct objfile *obj
|
||||
}
|
||||
|
||||
static int
|
||||
-separate_debug_file_exists (const char *name, unsigned long crc)
|
||||
+separate_debug_file_exists (const char *name, unsigned long crc,
|
||||
+ const char *parent_name)
|
||||
{
|
||||
unsigned long file_crc = 0;
|
||||
bfd *abfd;
|
||||
@@ -1316,7 +1317,15 @@ separate_debug_file_exists (const char *
|
||||
|
||||
bfd_close (abfd);
|
||||
|
||||
- return crc == file_crc;
|
||||
+ if (crc != file_crc)
|
||||
+ {
|
||||
+ warning (_("the debug information found in \"%s\""
|
||||
+ " does not match \"%s\" (CRC mismatch).\n"),
|
||||
+ name, parent_name);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
char *debug_file_directory = NULL;
|
||||
@@ -1368,6 +1377,8 @@ find_separate_debug_file (struct objfile
|
||||
basename = get_debug_link_info (objfile, &crc32);
|
||||
|
||||
if (basename == NULL)
|
||||
+ /* There's no separate debug info, hence there's no way we could
|
||||
+ load it => no warning. */
|
||||
return NULL;
|
||||
|
||||
dir = xstrdup (objfile->name);
|
||||
@@ -1395,7 +1406,7 @@ find_separate_debug_file (struct objfile
|
||||
strcpy (debugfile, dir);
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1408,7 +1419,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, "/");
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1421,7 +1432,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, dir);
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1440,7 +1451,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, "/");
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (canon_name);
|
||||
xfree (basename);
|
@ -129,7 +129,7 @@ Index: gdb/testsuite/ChangeLog
|
||||
+}
|
||||
--- gdb-6.3/gdb/testsuite/gdb.cp/constructortest.exp.fix Fri Jan 21 17:07:02 2005
|
||||
+++ gdb-6.3/gdb/testsuite/gdb.cp/constructortest.exp Fri Jan 21 17:05:29 2005
|
||||
@@ -0,0 +1,131 @@
|
||||
@@ -0,0 +1,137 @@
|
||||
+# This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+# Copyright 2005, 2007 Free Software Foundation, Inc.
|
||||
@ -179,8 +179,9 @@ Index: gdb/testsuite/ChangeLog
|
||||
+ gdb_suppress_tests
|
||||
+}
|
||||
+
|
||||
+# Break on the various forms of the A::A constructor
|
||||
+gdb_test "break A\:\:A" "Breakpoint 2 at .* \\(2 locations\\)" "breaking on A::A"
|
||||
+# Break on the various forms of the A::A constructor.
|
||||
+# " (2 locations)" is displayed depending on G++ version.
|
||||
+gdb_test "break A\:\:A" "Breakpoint 2 at .*" "breaking on A::A"
|
||||
+
|
||||
+# Verify that we break for the A constructor two times
|
||||
+# Once for new A and once for new B
|
||||
@ -206,7 +207,8 @@ Index: gdb/testsuite/ChangeLog
|
||||
+gdb_test "break 'A::A()'" "" "break in constructor A 2"
|
||||
+gdb_continue_to_breakpoint "First line A"
|
||||
+set second_line [gdb_get_line_number "Second line A"]
|
||||
+gdb_test "break $second_line" "Breakpoint .*, line $second_line. \\(2 locations\\)" "break by line in constructor"
|
||||
+# " (2 locations)" is displayed depending on G++ version.
|
||||
+gdb_test "break $second_line" "Breakpoint .*, line $second_line\\..*" "break by line in constructor"
|
||||
+gdb_continue_to_breakpoint "Second line A"
|
||||
+gdb_test "bt" "#0.*A.*#1.*main.*" "Verify in in-charge A::A second line"
|
||||
+gdb_continue_to_breakpoint "Second line A"
|
||||
@ -217,7 +219,8 @@ Index: gdb/testsuite/ChangeLog
|
||||
+gdb_test "break 'A::~A()'" "" "break in constructor ~A 2"
|
||||
+gdb_continue_to_breakpoint "First line ~A"
|
||||
+set second_line_dtor [gdb_get_line_number "Second line ~A"]
|
||||
+gdb_test "break $second_line_dtor" "Breakpoint .*, line $second_line_dtor. \\(2 locations\\)" "break by line in destructor"
|
||||
+# " (2 locations)" is displayed depending on G++ version.
|
||||
+gdb_test "break $second_line_dtor" "Breakpoint .*, line $second_line_dtor\\..*" "break by line in destructor"
|
||||
+gdb_continue_to_breakpoint "Second line ~A"
|
||||
+gdb_test "bt" "#0.*A.*#1.*main.*" "Verify in in-charge A::~A second line"
|
||||
+# FIXME: Analyse this case better.
|
||||
@ -232,8 +235,11 @@ Index: gdb/testsuite/ChangeLog
|
||||
+gdb_load ${binfile}
|
||||
+runto_main
|
||||
+
|
||||
+set first_line_dtor [gdb_get_line_number "First line ~C"]
|
||||
+set define_line_dtor [gdb_get_line_number "Destructor C"]
|
||||
+# Break on the various forms of the C::~C destructor
|
||||
+gdb_test "break C\:\:~C" "Breakpoint .* \\(3 locations\\)" "breaking on C::~C"
|
||||
+# " ([23] locations)" is displayed depending on G++ version.
|
||||
+gdb_test "break C\:\:~C" "Breakpoint .*, line ($define_line_dtor|$define_line_dtor)\\..*" "breaking on C::~C"
|
||||
+gdb_continue_to_breakpoint "First line ~C"
|
||||
+
|
||||
+# Verify that we can break by line number in a destructor and find
|
||||
@ -242,8 +248,8 @@ Index: gdb/testsuite/ChangeLog
|
||||
+gdb_load ${binfile}
|
||||
+delete_breakpoints
|
||||
+
|
||||
+set first_line_dtor [gdb_get_line_number "First line ~C"]
|
||||
+gdb_test "break $first_line_dtor" "Breakpoint .*, line $first_line_dtor. \\(3 locations\\)" "break by line in destructor"
|
||||
+# " (3 locations)" is displayed depending on G++ version.
|
||||
+gdb_test "break $first_line_dtor" "Breakpoint .*, line $first_line_dtor\\..*" "break by line in destructor"
|
||||
+
|
||||
+# Run to `main' where we begin our tests.
|
||||
+# Set the breakpoints first to test PIE multiple-PC BREAKPOINT_RE_SET.
|
||||
|
@ -436,7 +436,7 @@ Index: gdb-6.8.50.20090909/gdb/testsuite/gdb.pie/attach.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.8.50.20090909/gdb/testsuite/gdb.pie/attach.exp 2009-09-09 19:06:01.000000000 +0200
|
||||
@@ -0,0 +1,432 @@
|
||||
@@ -0,0 +1,433 @@
|
||||
+# Copyright 1997, 1999, 2002 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
@ -817,7 +817,8 @@ Index: gdb-6.8.50.20090909/gdb/testsuite/gdb.pie/attach.exp
|
||||
+ -re ".*warning: reading register.*I.*O error.*$gdb_prompt $" {
|
||||
+ fail "attach call, read register 3 error"
|
||||
+ }
|
||||
+ -re "Attaching to.*process $testpid.*libc.*$gdb_prompt $" {
|
||||
+ -re "Attaching to.*process $testpid.*$gdb_prompt $" {
|
||||
+ # libc is relocated, not relocated, therefore not printed.
|
||||
+ pass "attach call"
|
||||
+ }
|
||||
+ -re "$gdb_prompt $" {fail "attach call"}
|
||||
|
@ -1,55 +0,0 @@
|
||||
Index: gdb-6.8/gdb/testsuite/gdb.base/sepdebug.exp
|
||||
===================================================================
|
||||
--- gdb-6.8.orig/gdb/testsuite/gdb.base/sepdebug.exp 2008-02-26 09:14:11.000000000 +0100
|
||||
+++ gdb-6.8/gdb/testsuite/gdb.base/sepdebug.exp 2008-07-14 10:26:19.000000000 +0200
|
||||
@@ -981,3 +981,40 @@ if ![string compare $build_id_debug_file
|
||||
# Spare debug files may confuse testsuite runs in the future.
|
||||
remote_exec build "rm -f ${objdir}/${subdir}/${build_id_debug_filename}"
|
||||
}
|
||||
+
|
||||
+
|
||||
+# Compile up a second, different, object file. Copy its debug info
|
||||
+# over the top of the new debug info. Note that somewhere in the
|
||||
+# above the "set debug-file-directory" variable is set to
|
||||
+# ${objdir}/${subdir} so need to move things there.
|
||||
+
|
||||
+set existing_binfile $binfile
|
||||
+set testfile "sepdebug2"
|
||||
+set srcfile ${testfile}.c
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+set corrupt_debug_file [separate_debug_filename $binfile]
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-w}] != "" } {
|
||||
+ return -1
|
||||
+}
|
||||
+if [gdb_gnu_strip_debug $binfile] {
|
||||
+ # check that you have a recent version of strip and objcopy installed
|
||||
+ unsupported "cannot produce separate debug info files"
|
||||
+ return -1
|
||||
+}
|
||||
+remote_exec build "cp $corrupt_debug_file ${existing_binfile}.debug"
|
||||
+
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+set test "A corrupt debug file gets a warning"
|
||||
+gdb_test_multiple "file $existing_binfile" "$test" {
|
||||
+ -re "warning:.*mismatch.*" {
|
||||
+ pass "$test"
|
||||
+ }
|
||||
+ -re ".y or n. " {
|
||||
+ send_gdb "y\n"
|
||||
+ exp_continue
|
||||
+ }
|
||||
+}
|
||||
Index: gdb-6.8/gdb/testsuite/gdb.base/sepdebug2.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-6.8/gdb/testsuite/gdb.base/sepdebug2.c 2008-07-14 10:26:19.000000000 +0200
|
||||
@@ -0,0 +1,5 @@
|
||||
+int
|
||||
+main (int argc, char *argv[], char *envp[])
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
@ -1,128 +0,0 @@
|
||||
--- /dev/null 2008-04-03 00:39:30.714021604 +0200
|
||||
+++ gdb-6.3/gdb/testsuite/gdb.base/watchpoint-cond-gone-stripped.c 2008-04-05 20:26:29.000000000 +0200
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ 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 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. */
|
||||
+
|
||||
+void
|
||||
+jumper (void (*jumpto) (void))
|
||||
+{
|
||||
+ (*jumpto) ();
|
||||
+}
|
||||
--- /dev/null 2008-04-03 00:39:30.714021604 +0200
|
||||
+++ gdb-6.3/gdb/testsuite/gdb.base/watchpoint-cond-gone.c 2008-04-05 20:26:48.000000000 +0200
|
||||
@@ -0,0 +1,37 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ 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 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. */
|
||||
+
|
||||
+extern void jumper (void (*jumpto) (void));
|
||||
+
|
||||
+void
|
||||
+func ()
|
||||
+{
|
||||
+ int a, b, c;
|
||||
+
|
||||
+ a = b = c = 5;
|
||||
+ a = b = c = 10; /* watchpoint-here */
|
||||
+ c = a + b;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+ jumper (func);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
--- /dev/null 2008-04-03 00:39:30.714021604 +0200
|
||||
+++ gdb-6.3/gdb/testsuite/gdb.base/watchpoint-cond-gone.exp 2008-04-05 20:33:19.000000000 +0200
|
||||
@@ -0,0 +1,59 @@
|
||||
+# 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 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.
|
||||
+
|
||||
+if $tracelevel then {
|
||||
+ strace $tracelevel
|
||||
+}
|
||||
+
|
||||
+set testfile "watchpoint-cond-gone"
|
||||
+set srcfile ${testfile}.c
|
||||
+set srcfilestripped ${testfile}-stripped.c
|
||||
+set objfilestripped ${objdir}/${subdir}/${testfile}-stripped.o
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+
|
||||
+# We need to generate a function without DWARF to crash older GDB.
|
||||
+# Stepping into a dynamic function trampoline or stepping out of MAIN may work
|
||||
+# but it is not a reliable FAIL case.
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfilestripped}" "${objfilestripped}" object {}] != "" } {
|
||||
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
|
||||
+}
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${objfilestripped}" "${binfile}" executable {debug}] != "" } {
|
||||
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
|
||||
+}
|
||||
+
|
||||
+gdb_exit
|
||||
+gdb_start
|
||||
+gdb_reinitialize_dir $srcdir/$subdir
|
||||
+gdb_load ${binfile}
|
||||
+
|
||||
+# Problem does not occur otherwise.
|
||||
+gdb_test "set can-use-hw-watchpoints 0"
|
||||
+
|
||||
+runto_main
|
||||
+gdb_breakpoint [gdb_get_line_number "watchpoint-here"]
|
||||
+gdb_continue_to_breakpoint "Place to set the watchpoint"
|
||||
+
|
||||
+# The condition `c == 30' is the tested culprit.
|
||||
+gdb_test "watch c if c == 30" "" "Place the watchpoint"
|
||||
+
|
||||
+# No functionality, just to check the state.
|
||||
+gdb_test "backtrace"
|
||||
+
|
||||
+gdb_test "finish" \
|
||||
+ "Watchpoint .* deleted because the program has left the block in.*which its expression is valid..*in (jumper|func).*" \
|
||||
+ "Catch the no longer valid watchpoint"
|
@ -162,6 +162,154 @@ Index: gdb-6.8.50.20090802/gdb/amd64-tdep.c
|
||||
};
|
||||
|
||||
/* Floating-point registers. */
|
||||
--- a/gdb/ia64-tdep.c
|
||||
+++ b/gdb/ia64-tdep.c
|
||||
@@ -2122,6 +2122,137 @@ static const struct frame_unwind ia64_frame_unwind =
|
||||
default_frame_sniffer
|
||||
};
|
||||
|
||||
+/* Detect the outermost frame; during unwind of
|
||||
+ #6 0x2000000000347100 in __clone2 () from /lib/libc.so.6.1
|
||||
+ avoid the additional bogus frame
|
||||
+ #7 0x0000000000000000 in ?? () */
|
||||
+
|
||||
+static char linux_clone2_code[] =
|
||||
+{
|
||||
+/* libc/sysdeps/unix/sysv/linux/ia64/clone2.S */
|
||||
+ 0x09, 0x00, 0x20, 0x12, 0x90, 0x11, 0x00, 0x40,
|
||||
+ 0x28, 0x20, 0x23, 0x00, 0x00, 0x00, 0x04, 0x00,
|
||||
+/* st4 [r9]=r8 */
|
||||
+/* st4 [r10]=r8 */
|
||||
+/* ;; */
|
||||
+/* #endif */
|
||||
+ 0x02, 0x50, 0x21, 0x40, 0x18, 0x14, 0x90, 0x02,
|
||||
+ 0x90, 0x00, 0x42, 0x00, 0x00, 0x00, 0x04, 0x00,
|
||||
+/* 1: ld8 out1=[in0],8 |* Retrieve code pointer. *| */
|
||||
+/* mov out0=in4 |* Pass proper argument to fn *| */
|
||||
+/* ;; */
|
||||
+ 0x11, 0x08, 0x00, 0x40, 0x18, 0x10, 0x60, 0x50,
|
||||
+ 0x05, 0x80, 0x03, 0x00, 0x68, 0x00, 0x80, 0x12,
|
||||
+/* ld8 gp=[in0] |* Load function gp. *| */
|
||||
+/* mov b6=out1 */
|
||||
+/* br.call.dptk.many rp=b6 |* Call fn(arg) in the child *| */
|
||||
+/* ;; */
|
||||
+ 0x10, 0x48, 0x01, 0x10, 0x00, 0x21, 0x10, 0x00,
|
||||
+ 0xa0, 0x00, 0x42, 0x00, 0x98, 0xdf, 0xf7, 0x5b,
|
||||
+/* mov out0=r8 |* Argument to _exit *| */
|
||||
+/* mov gp=loc0 */
|
||||
+/* .globl HIDDEN_JUMPTARGET(_exit) */
|
||||
+/* br.call.dpnt.many rp=HIDDEN_JUMPTARGET(_exit) */
|
||||
+/* |* call _exit with result from fn. *| */
|
||||
+ 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00
|
||||
+/* ret |* Not reached. *| */
|
||||
+};
|
||||
+
|
||||
+#define LINUX_CLONE_PRE_SLOTS 3 /* Number of slots before PC. */
|
||||
+#define LINUX_CLONE_LEN (sizeof linux_clone2_code)
|
||||
+
|
||||
+static int
|
||||
+ia64_linux_clone2_running (struct frame_info *this_frame)
|
||||
+{
|
||||
+ CORE_ADDR pc = get_frame_pc (this_frame);
|
||||
+ char buf[LINUX_CLONE_LEN];
|
||||
+ struct minimal_symbol *minsym;
|
||||
+ long long instr;
|
||||
+
|
||||
+ if (!safe_frame_unwind_memory (this_frame, pc - LINUX_CLONE_PRE_SLOTS * 16,
|
||||
+ buf, LINUX_CLONE_LEN))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (memcmp (buf, linux_clone2_code, LINUX_CLONE_PRE_SLOTS * 16) != 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Adjust the expected "_exit" address. */
|
||||
+ minsym = lookup_minimal_symbol_text ("_exit", NULL);
|
||||
+ if (minsym == NULL)
|
||||
+ return 0;
|
||||
+
|
||||
+ instr = slotN_contents (&buf[LINUX_CLONE_PRE_SLOTS * 16], 2);
|
||||
+ instr &= ~(((1L << 20) - 1) << 13);
|
||||
+ /* Address is relative to the jump instruction slot, not the next one. */
|
||||
+ instr |= (((SYMBOL_VALUE_ADDRESS (minsym) - (pc & ~0xfL)) >> 4)
|
||||
+ & ((1L << 20) - 1)) << 13;
|
||||
+ replace_slotN_contents (&buf[LINUX_CLONE_PRE_SLOTS * 16], instr, 2);
|
||||
+
|
||||
+ if (memcmp (&buf[LINUX_CLONE_PRE_SLOTS * 16],
|
||||
+ &linux_clone2_code[LINUX_CLONE_PRE_SLOTS * 16],
|
||||
+ LINUX_CLONE_LEN - (LINUX_CLONE_PRE_SLOTS * 16)) != 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ia64_outermost_frame (struct frame_info *this_frame)
|
||||
+{
|
||||
+ CORE_ADDR pc = get_frame_pc (this_frame);
|
||||
+ char *name;
|
||||
+
|
||||
+ find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
+
|
||||
+ /* If we have NAME, we can optimize the search.
|
||||
+ `clone' NAME still needs to have the code checked as its name may be
|
||||
+ present in the user code.
|
||||
+ `__clone' NAME should not be present in the user code but in the initial
|
||||
+ parts of the `__clone' implementation the unwind still makes sense.
|
||||
+ More detailed unwinding decision would be too much sensitive to possible
|
||||
+ subtle changes in specific glibc revisions. */
|
||||
+ if (name == NULL || strcmp (name, "clone2") == 0
|
||||
+ || strcmp ("__clone2", name) == 0)
|
||||
+ return (ia64_linux_clone2_running (this_frame) != 0);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+ia64_clone2_frame_this_id (struct frame_info *this_frame, void **this_cache,
|
||||
+ struct frame_id *this_id)
|
||||
+{
|
||||
+ /* Leave the default outermost frame at *THIS_ID. */
|
||||
+}
|
||||
+
|
||||
+static struct value *
|
||||
+ia64_clone2_frame_prev_register (struct frame_info *this_frame,
|
||||
+ void **this_cache, int regnum)
|
||||
+{
|
||||
+ return frame_unwind_got_register (this_frame, regnum, regnum);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ia64_clone2_frame_sniffer (const struct frame_unwind *self,
|
||||
+ struct frame_info *this_frame,
|
||||
+ void **this_prologue_cache)
|
||||
+{
|
||||
+ if (ia64_outermost_frame (this_frame))
|
||||
+ return 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct frame_unwind ia64_clone2_frame_unwind =
|
||||
+{
|
||||
+ NORMAL_FRAME,
|
||||
+ &ia64_clone2_frame_this_id,
|
||||
+ &ia64_clone2_frame_prev_register,
|
||||
+ NULL,
|
||||
+ &ia64_clone2_frame_sniffer
|
||||
+};
|
||||
+
|
||||
/* Signal trampolines. */
|
||||
|
||||
static void
|
||||
@@ -3824,6 +3955,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
set_gdbarch_dummy_id (gdbarch, ia64_dummy_id);
|
||||
|
||||
set_gdbarch_unwind_pc (gdbarch, ia64_unwind_pc);
|
||||
+ frame_unwind_append_unwinder (gdbarch, &ia64_clone2_frame_unwind);
|
||||
#ifdef HAVE_LIBUNWIND_IA64_H
|
||||
frame_unwind_append_unwinder (gdbarch,
|
||||
&ia64_libunwind_sigtramp_frame_unwind);
|
||||
Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
|
@ -48,7 +48,7 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
|
||||
|
||||
|
||||
int (*deprecated_ui_load_progress_hook) (const char *section, unsigned long num);
|
||||
@@ -1673,8 +1675,352 @@ build_id_to_filename (struct build_id *b
|
||||
@@ -1673,8 +1675,353 @@ build_id_to_filename (struct build_id *b
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -258,7 +258,8 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
|
||||
+
|
||||
+ /* Base package name for `debuginfo-install'. We do not use the
|
||||
+ `yum' command directly as the line
|
||||
+ yum --enablerepo='*-debuginfo' install NAME-debuginfo.ARCH
|
||||
+ yum --disablerepo='*' --enablerepo='*-debuginfo' \
|
||||
+ install NAME-debuginfo.ARCH
|
||||
+ would be more complicated than just:
|
||||
+ debuginfo-install NAME-VERSION-RELEASE.ARCH
|
||||
+ Do not supply the rpm base name (derived from .src.rpm name) as
|
||||
@ -398,7 +399,7 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
|
||||
+
|
||||
/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
|
||||
- Try to install the hash file ...
|
||||
+ yum --enablerepo='*-debuginfo' install ...
|
||||
+ yum --disablerepo='*' --enablerepo='*-debuginfo' install ...
|
||||
avoidance. */
|
||||
|
||||
struct missing_filepair
|
||||
@ -420,7 +421,7 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
|
||||
missing_filepair_change ();
|
||||
}
|
||||
|
||||
@@ -1799,14 +2151,33 @@ debug_print_missing (const char *binary,
|
||||
@@ -1799,14 +2151,34 @@ debug_print_missing (const char *binary,
|
||||
|
||||
*slot = missing_filepair;
|
||||
|
||||
@ -456,7 +457,8 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
|
||||
+ _("Missing separate debuginfo for %s\n"), binary);
|
||||
+ if (debug != NULL)
|
||||
+ fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
|
||||
+ "yum --enablerepo='*-debuginfo' install", debug);
|
||||
+ "yum --disablerepo='*' --enablerepo='*-debuginfo'"
|
||||
+ " install", debug);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
Index: gdb-6.8.91.20090925/gdb/corelow.c
|
||||
Index: gdb-7.0/gdb/corelow.c
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/corelow.c 2009-07-31 17:25:21.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/corelow.c 2009-09-25 09:39:09.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/corelow.c 2009-07-31 17:25:21.000000000 +0200
|
||||
+++ gdb-7.0/gdb/corelow.c 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -45,6 +45,10 @@
|
||||
#include "exceptions.h"
|
||||
#include "solib.h"
|
||||
@ -91,11 +91,11 @@ Index: gdb-6.8.91.20090925/gdb/corelow.c
|
||||
+ NULL, NULL, NULL,
|
||||
+ &setlist, &showlist);
|
||||
}
|
||||
Index: gdb-6.8.91.20090925/gdb/doc/gdb.texinfo
|
||||
Index: gdb-7.0/gdb/doc/gdb.texinfo
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/doc/gdb.texinfo 2009-09-25 09:29:58.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/doc/gdb.texinfo 2009-09-25 09:29:58.000000000 +0200
|
||||
@@ -13895,6 +13895,27 @@ information files.
|
||||
--- gdb-7.0.orig/gdb/doc/gdb.texinfo 2009-10-23 00:12:39.000000000 +0200
|
||||
+++ gdb-7.0/gdb/doc/gdb.texinfo 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -13896,6 +13896,27 @@ information files.
|
||||
|
||||
@end table
|
||||
|
||||
@ -123,10 +123,10 @@ Index: gdb-6.8.91.20090925/gdb/doc/gdb.texinfo
|
||||
@cindex @code{.gnu_debuglink} sections
|
||||
@cindex debug link sections
|
||||
A debug link is a special section of the executable file named
|
||||
Index: gdb-6.8.91.20090925/gdb/solib-svr4.c
|
||||
Index: gdb-7.0/gdb/solib-svr4.c
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/solib-svr4.c 2009-09-25 09:29:57.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/solib-svr4.c 2009-09-25 09:43:14.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/solib-svr4.c 2009-10-23 00:12:38.000000000 +0200
|
||||
+++ gdb-7.0/gdb/solib-svr4.c 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -1101,9 +1101,49 @@ svr4_current_sos (void)
|
||||
safe_strerror (errcode));
|
||||
else
|
||||
@ -180,10 +180,10 @@ Index: gdb-6.8.91.20090925/gdb/solib-svr4.c
|
||||
}
|
||||
xfree (buffer);
|
||||
|
||||
Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
Index: gdb-7.0/gdb/symfile.c
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/symfile.c 2009-09-25 09:29:57.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/symfile.c 2009-09-25 09:29:58.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/symfile.c 2009-10-23 00:12:38.000000000 +0200
|
||||
+++ gdb-7.0/gdb/symfile.c 2009-10-23 00:43:28.000000000 +0200
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "elf-bfd.h"
|
||||
#include "solib.h"
|
||||
@ -618,7 +618,7 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
|
||||
if (found == NULL)
|
||||
warning (_("File \"%s\" has no build-id, file skipped"), filename);
|
||||
@@ -1234,8 +1626,9 @@ build_id_verify (const char *filename, s
|
||||
@@ -1234,14 +1626,16 @@ build_id_verify (const char *filename, s
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -628,48 +628,77 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
+build_id_to_filename (struct build_id *build_id, char **link_return,
|
||||
+ int add_debug_suffix)
|
||||
{
|
||||
char *link, *s, *retval = NULL;
|
||||
gdb_byte *data = build_id->data;
|
||||
@@ -1243,7 +1636,9 @@ build_id_to_debug_filename (struct build
|
||||
char *link, *debugdir, *retval = NULL;
|
||||
+ char *link_all = NULL;
|
||||
|
||||
/* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
|
||||
link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
|
||||
- + 2 * size + (sizeof ".debug" - 1) + 1);
|
||||
+ + 2 * size
|
||||
+ + (add_debug_suffix ? sizeof ".debug" - 1 : 0)
|
||||
+ + 1);
|
||||
s = link + sprintf (link, "%s/.build-id/", debug_file_directory);
|
||||
if (size > 0)
|
||||
{
|
||||
@@ -1254,12 +1649,14 @@ build_id_to_debug_filename (struct build
|
||||
*s++ = '/';
|
||||
while (size-- > 0)
|
||||
s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
- strcpy (s, ".debug");
|
||||
+ if (add_debug_suffix)
|
||||
+ strcpy (s, ".debug");
|
||||
+ else
|
||||
+ *s = 0;
|
||||
- link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
|
||||
- + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
|
||||
+ link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
|
||||
+ + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
|
||||
|
||||
/* lrealpath() is expensive even for the usually non-existent files. */
|
||||
if (access (link, F_OK) == 0)
|
||||
retval = lrealpath (link);
|
||||
- xfree (link);
|
||||
/* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
|
||||
cause "/.build-id/..." lookups. */
|
||||
@@ -1272,7 +1666,10 @@ build_id_to_debug_filename (struct build
|
||||
*s++ = '/';
|
||||
while (size-- > 0)
|
||||
s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
- strcpy (s, ".debug");
|
||||
+ if (add_debug_suffix)
|
||||
+ strcpy (s, ".debug");
|
||||
+ else
|
||||
+ *s = 0;
|
||||
|
||||
if (retval != NULL && !build_id_verify (retval, build_id))
|
||||
{
|
||||
@@ -1267,9 +1664,150 @@ build_id_to_debug_filename (struct build
|
||||
retval = NULL;
|
||||
/* lrealpath() is expensive even for the usually non-existent files. */
|
||||
if (access (link, F_OK) == 0)
|
||||
@@ -1285,15 +1682,185 @@ build_id_to_debug_filename (struct build
|
||||
}
|
||||
|
||||
if (retval != NULL)
|
||||
- break;
|
||||
+ {
|
||||
+ /* LINK_ALL is not used below in this non-NULL RETVAL case. */
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (link_all == NULL)
|
||||
+ link_all = xstrdup (link);
|
||||
+ else
|
||||
+ {
|
||||
+ size_t len_orig = strlen (link_all);
|
||||
+
|
||||
+ link_all = xrealloc (link_all, len_orig + 1 + strlen (link) + 1);
|
||||
+
|
||||
+ /* Use whitespace instead of DIRNAME_SEPARATOR to be compatible with
|
||||
+ its possible use as an argument for installation command. */
|
||||
+ link_all[len_orig] = ' ';
|
||||
+
|
||||
+ strcpy (&link_all[len_orig + 1], link);
|
||||
+ }
|
||||
|
||||
debugdir = debugdir_end;
|
||||
}
|
||||
while (*debugdir != 0);
|
||||
|
||||
+ if (link_return != NULL)
|
||||
+ *link_return = link;
|
||||
+ else
|
||||
+ xfree (link);
|
||||
+ {
|
||||
+ if (retval != NULL)
|
||||
+ {
|
||||
+ *link_return = link;
|
||||
+ link = NULL;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ *link_return = link_all;
|
||||
+ link_all = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+ xfree (link);
|
||||
+ xfree (link_all);
|
||||
+
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
return retval;
|
||||
}
|
||||
|
||||
+/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
|
||||
+ Try to install the hash file ...
|
||||
+ avoidance. */
|
||||
@ -692,9 +721,9 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
+
|
||||
+ retval = obstack_alloc (&missing_filepair_obstack, size);
|
||||
+ memset (retval, 0, size);
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
return retval;
|
||||
}
|
||||
|
||||
+static hashval_t
|
||||
+missing_filepair_hash_func (const struct missing_filepair *elem)
|
||||
+{
|
||||
@ -809,20 +838,7 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
static char *
|
||||
get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
|
||||
{
|
||||
@@ -1352,32 +1890,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;
|
||||
@@ -1384,13 +1951,14 @@ find_separate_debug_file (struct objfile
|
||||
unsigned long crc32;
|
||||
int i;
|
||||
struct build_id *build_id;
|
||||
@ -839,123 +855,34 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
xfree (build_id);
|
||||
/* Prevent looping on a stripped .debug file. */
|
||||
if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
|
||||
{
|
||||
- warning (_("\"%s\": separate debug info file has no debug info"),
|
||||
+ warning (_("\"%s\": The separate debug info file has no debug info"),
|
||||
build_id_name);
|
||||
@@ -1400,7 +1968,10 @@ find_separate_debug_file (struct objfile
|
||||
xfree (build_id_name);
|
||||
}
|
||||
else if (build_id_name != NULL)
|
||||
- return build_id_name;
|
||||
+ {
|
||||
+ {
|
||||
+ xfree (build_id_filename);
|
||||
+ return build_id_name;
|
||||
+ }
|
||||
}
|
||||
|
||||
basename = get_debug_link_info (objfile, &crc32);
|
||||
@@ -1385,7 +1927,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;
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
dir = xstrdup (objfile->name);
|
||||
|
||||
@@ -1407,24 +1949,19 @@ find_separate_debug_file (struct objfile
|
||||
if (canon_name && strlen (canon_name) > i)
|
||||
i = strlen (canon_name);
|
||||
|
||||
- debugfile = alloca (strlen (debug_file_directory) + 1
|
||||
- + i
|
||||
- + strlen (DEBUG_SUBDIRECTORY)
|
||||
- + strlen ("/")
|
||||
- + strlen (basename)
|
||||
- + 1);
|
||||
+ debugfile = xmalloc (strlen (debug_file_directory) + 1
|
||||
+ + i
|
||||
+ + 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 (basename);
|
||||
- xfree (dir);
|
||||
- xfree (canon_name);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */
|
||||
strcpy (debugfile, dir);
|
||||
@@ -1433,12 +1970,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- xfree (canon_name);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* Then try in the global debugfile directory. */
|
||||
strcpy (debugfile, debug_file_directory);
|
||||
@@ -1447,12 +1979,7 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- xfree (canon_name);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* If the file is in the sysroot, try using its base path in the
|
||||
global debugfile directory. */
|
||||
@@ -1466,20 +1993,18 @@ find_separate_debug_file (struct objfile
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- {
|
||||
- xfree (canon_name);
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
}
|
||||
@@ -1501,8 +2072,10 @@ find_separate_debug_file (struct objfile
|
||||
|
||||
- if (canon_name)
|
||||
- xfree (canon_name);
|
||||
+ debugfile = NULL;
|
||||
xfree (debugfile);
|
||||
debugfile = NULL;
|
||||
+ debug_print_missing (objfile->name, build_id_filename);
|
||||
|
||||
+cleanup_return_debugfile:
|
||||
cleanup_return_debugfile:
|
||||
+ xfree (build_id_filename);
|
||||
+ xfree (canon_name);
|
||||
xfree (canon_name);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
- return NULL;
|
||||
+ return debugfile;
|
||||
}
|
||||
|
||||
|
||||
@@ -4229,4 +4754,16 @@ the global debug-file directory prepende
|
||||
@@ -4256,4 +4829,16 @@ each global debug-file-directory compone
|
||||
NULL,
|
||||
show_debug_file_directory,
|
||||
&setlist, &showlist);
|
||||
+
|
||||
+
|
||||
+ add_setshow_zinteger_cmd ("build-id-verbose", no_class, &build_id_verbose,
|
||||
+ _("\
|
||||
+ Set debugging level of the build-id locator."), _("\
|
||||
@ -965,13 +892,13 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
|
||||
+ NULL,
|
||||
+ show_build_id_verbose,
|
||||
+ &setlist, &showlist);
|
||||
+
|
||||
+
|
||||
+ observer_attach_executable_changed (debug_print_executable_changed);
|
||||
}
|
||||
Index: gdb-6.8.91.20090925/gdb/symfile.h
|
||||
Index: gdb-7.0/gdb/symfile.h
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/symfile.h 2009-09-25 09:29:57.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/symfile.h 2009-09-25 09:29:58.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/symfile.h 2009-10-23 00:12:38.000000000 +0200
|
||||
+++ gdb-7.0/gdb/symfile.h 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -381,6 +381,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);
|
||||
@ -986,10 +913,10 @@ Index: gdb-6.8.91.20090925/gdb/symfile.h
|
||||
/* From dwarf2read.c */
|
||||
|
||||
extern int dwarf2_has_info (struct objfile *);
|
||||
Index: gdb-6.8.91.20090925/gdb/testsuite/lib/gdb.exp
|
||||
Index: gdb-7.0/gdb/testsuite/lib/gdb.exp
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/testsuite/lib/gdb.exp 2009-09-25 09:29:57.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/testsuite/lib/gdb.exp 2009-09-25 09:29:58.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/testsuite/lib/gdb.exp 2009-10-23 00:12:38.000000000 +0200
|
||||
+++ gdb-7.0/gdb/testsuite/lib/gdb.exp 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -1248,6 +1248,16 @@ proc default_gdb_start { } {
|
||||
warning "Couldn't set the width to 0."
|
||||
}
|
||||
@ -1007,10 +934,10 @@ Index: gdb-6.8.91.20090925/gdb/testsuite/lib/gdb.exp
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index: gdb-6.8.91.20090925/gdb/testsuite/lib/mi-support.exp
|
||||
Index: gdb-7.0/gdb/testsuite/lib/mi-support.exp
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/testsuite/lib/mi-support.exp 2009-09-15 20:51:26.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/testsuite/lib/mi-support.exp 2009-09-25 09:29:58.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/testsuite/lib/mi-support.exp 2009-09-15 20:51:26.000000000 +0200
|
||||
+++ gdb-7.0/gdb/testsuite/lib/mi-support.exp 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -221,6 +221,16 @@ proc default_mi_gdb_start { args } {
|
||||
}
|
||||
}
|
||||
@ -1028,10 +955,10 @@ Index: gdb-6.8.91.20090925/gdb/testsuite/lib/mi-support.exp
|
||||
|
||||
detect_async
|
||||
|
||||
Index: gdb-6.8.91.20090925/gdb/objfiles.h
|
||||
Index: gdb-7.0/gdb/objfiles.h
|
||||
===================================================================
|
||||
--- gdb-6.8.91.20090925.orig/gdb/objfiles.h 2009-09-25 09:29:57.000000000 +0200
|
||||
+++ gdb-6.8.91.20090925/gdb/objfiles.h 2009-09-25 09:38:27.000000000 +0200
|
||||
--- gdb-7.0.orig/gdb/objfiles.h 2009-10-23 00:12:38.000000000 +0200
|
||||
+++ gdb-7.0/gdb/objfiles.h 2009-10-23 00:17:29.000000000 +0200
|
||||
@@ -428,6 +428,10 @@ struct objfile
|
||||
|
||||
#define OBJF_MAIN (1 << 7)
|
||||
|
@ -102,3 +102,154 @@ frames-invalid can happen asynchronously.
|
||||
|
||||
set timeout $oldtimeout
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
http://sourceware.org/ml/gdb-patches/2009-12/msg00234.html
|
||||
Subject: [patch] testsuite: Fix a race by me - watchthreads-reorder.exp
|
||||
|
||||
Hi,
|
||||
|
||||
there is a bug explainable by man pthread_cond_signal:
|
||||
The [...] pthread_cond_signal() functions shall have no effect if
|
||||
there are no threads currently blocked on cond.
|
||||
|
||||
meaning a race for the testcase.
|
||||
+FAIL: gdb.threads/watchthreads-reorder.exp: reorder1: continue a (timeout)
|
||||
|
||||
One can reproduce the race on CVS HEAD by:
|
||||
# --- a/gdb/testsuite/gdb.threads/watchthreads-reorder.c
|
||||
# +++ b/gdb/testsuite/gdb.threads/watchthreads-reorder.c
|
||||
# @@ -89,6 +89,7 @@ thread1_func (void *unused)
|
||||
# int i;
|
||||
# volatile int rwatch_store;
|
||||
#
|
||||
# +sleep(1);
|
||||
# thread1_tid = gettid ();
|
||||
# i = pthread_cond_signal (&thread1_tid_cond);
|
||||
# assert (i == 0);
|
||||
# @@ -317,6 +318,7 @@ main (int argc, char **argv)
|
||||
#
|
||||
# if (thread1_tid == 0)
|
||||
# {
|
||||
# +sleep(2);
|
||||
# i = pthread_cond_wait (&thread1_tid_cond, &thread1_tid_mutex);
|
||||
# assert (i == 0);
|
||||
#
|
||||
|
||||
Fixed; gdbstop_mutex got removed as it became redundant there.
|
||||
|
||||
Going to check it in as obvious in several days (code is by me + it is just
|
||||
a testcase).
|
||||
|
||||
|
||||
Sorry,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/testsuite/
|
||||
2009-12-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.threads/watchthreads-reorder.c (gdbstop_mutex): Remove.
|
||||
(thread1_func): Protect thread1_tid_cond by thread1_tid_mutex. Remove
|
||||
gdbstop_mutex handling.
|
||||
(thread2_func): Protect thread2_tid_cond by thread2_tid_mutex. Remove
|
||||
gdbstop_mutex handling.
|
||||
(main): Move thread1_tid_mutex and thread2_tid_mutex locks before
|
||||
pthread_create. Remove gdbstop_mutex handling. New comment. Remove
|
||||
pthread_cond_wait conditionalizations.
|
||||
|
||||
--- a/gdb/testsuite/gdb.threads/watchthreads-reorder.c
|
||||
+++ b/gdb/testsuite/gdb.threads/watchthreads-reorder.c
|
||||
@@ -34,8 +34,6 @@
|
||||
otherwise. */
|
||||
#define TIMEOUT (gettid () == getpid() ? 10 : 15)
|
||||
|
||||
-static pthread_mutex_t gdbstop_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
|
||||
-
|
||||
static pid_t thread1_tid;
|
||||
static pthread_cond_t thread1_tid_cond = PTHREAD_COND_INITIALIZER;
|
||||
static pthread_mutex_t thread1_tid_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
|
||||
@@ -90,12 +88,11 @@ thread1_func (void *unused)
|
||||
volatile int rwatch_store;
|
||||
|
||||
thread1_tid = gettid ();
|
||||
+
|
||||
+ timed_mutex_lock (&thread1_tid_mutex);
|
||||
i = pthread_cond_signal (&thread1_tid_cond);
|
||||
assert (i == 0);
|
||||
-
|
||||
- /* Be sure GDB is already stopped before continuing. */
|
||||
- timed_mutex_lock (&gdbstop_mutex);
|
||||
- i = pthread_mutex_unlock (&gdbstop_mutex);
|
||||
+ i = pthread_mutex_unlock (&thread1_tid_mutex);
|
||||
assert (i == 0);
|
||||
|
||||
rwatch_store = thread1_rwatch;
|
||||
@@ -115,12 +112,11 @@ thread2_func (void *unused)
|
||||
volatile int rwatch_store;
|
||||
|
||||
thread2_tid = gettid ();
|
||||
+
|
||||
+ timed_mutex_lock (&thread2_tid_mutex);
|
||||
i = pthread_cond_signal (&thread2_tid_cond);
|
||||
assert (i == 0);
|
||||
-
|
||||
- /* Be sure GDB is already stopped before continuing. */
|
||||
- timed_mutex_lock (&gdbstop_mutex);
|
||||
- i = pthread_mutex_unlock (&gdbstop_mutex);
|
||||
+ i = pthread_mutex_unlock (&thread2_tid_mutex);
|
||||
assert (i == 0);
|
||||
|
||||
rwatch_store = thread2_rwatch;
|
||||
@@ -267,7 +263,8 @@ main (int argc, char **argv)
|
||||
|
||||
setbuf (stdout, NULL);
|
||||
|
||||
- timed_mutex_lock (&gdbstop_mutex);
|
||||
+ timed_mutex_lock (&thread1_tid_mutex);
|
||||
+ timed_mutex_lock (&thread2_tid_mutex);
|
||||
|
||||
timed_mutex_lock (&terminate_mutex);
|
||||
|
||||
@@ -306,30 +303,21 @@ main (int argc, char **argv)
|
||||
state_wait (tracer, "T (stopped)");
|
||||
}
|
||||
|
||||
- timed_mutex_lock (&thread1_tid_mutex);
|
||||
- timed_mutex_lock (&thread2_tid_mutex);
|
||||
-
|
||||
- /* Let the threads start. */
|
||||
- i = pthread_mutex_unlock (&gdbstop_mutex);
|
||||
- assert (i == 0);
|
||||
+ /* Threads are now waiting at timed_mutex_lock (thread1_tid_mutex) and so
|
||||
+ they could not trigger the watchpoints before GDB gets unstopped later.
|
||||
+ Threads get resumed at pthread_cond_wait below. */
|
||||
|
||||
printf ("Waiting till the threads initialize their TIDs.\n");
|
||||
|
||||
- if (thread1_tid == 0)
|
||||
- {
|
||||
- i = pthread_cond_wait (&thread1_tid_cond, &thread1_tid_mutex);
|
||||
- assert (i == 0);
|
||||
+ i = pthread_cond_wait (&thread1_tid_cond, &thread1_tid_mutex);
|
||||
+ assert (i == 0);
|
||||
|
||||
- assert (thread1_tid > 0);
|
||||
- }
|
||||
+ assert (thread1_tid > 0);
|
||||
|
||||
- if (thread2_tid == 0)
|
||||
- {
|
||||
- i = pthread_cond_wait (&thread2_tid_cond, &thread2_tid_mutex);
|
||||
- assert (i == 0);
|
||||
+ i = pthread_cond_wait (&thread2_tid_cond, &thread2_tid_mutex);
|
||||
+ assert (i == 0);
|
||||
|
||||
- assert (thread2_tid > 0);
|
||||
- }
|
||||
+ assert (thread2_tid > 0);
|
||||
|
||||
printf ("Thread 1 TID = %lu, thread 2 TID = %lu, PID = %lu.\n",
|
||||
(unsigned long) thread1_tid, (unsigned long) thread2_tid,
|
||||
|
||||
|
@ -236,19 +236,19 @@ Index: gdb-6.8.91.20090917/gdb/breakpoint.c
|
||||
{
|
||||
int value_is_zero = 0;
|
||||
|
||||
@@ -3383,6 +3398,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
|
||||
bs->print = 0;
|
||||
}
|
||||
bs->commands = copy_command_lines (bs->commands);
|
||||
@@ -3399,6 +3399,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
|
||||
bs->print = 0;
|
||||
}
|
||||
bs->commands = copy_command_lines (bs->commands);
|
||||
+
|
||||
+ /* Display the innermost inlined frame at a breakpont as it gives to
|
||||
+ most of the available information. */
|
||||
+ if (b->type != bp_until && b->type != bp_finish)
|
||||
+ while (inline_skipped_frames (ptid))
|
||||
+ step_into_inline_frame (ptid);
|
||||
}
|
||||
+ /* Display the innermost inlined frame at a breakpont as it gives to
|
||||
+ most of the available information. */
|
||||
+ if (b->type != bp_until && b->type != bp_finish)
|
||||
+ while (inline_skipped_frames (ptid))
|
||||
+ step_into_inline_frame (ptid);
|
||||
}
|
||||
|
||||
/* Print nothing for this entry if we dont stop or if we dont print. */
|
||||
/* Print nothing for this entry if we dont stop or if we dont print. */
|
||||
@@ -5572,9 +5593,9 @@ set_momentary_breakpoint (struct gdbarch
|
||||
{
|
||||
struct breakpoint *b;
|
||||
|
229
gdb-7.0-upstream.patch
Normal file
229
gdb-7.0-upstream.patch
Normal file
@ -0,0 +1,229 @@
|
||||
|
||||
|
||||
|
||||
http://sourceware.org/ml/gdb-patches/2009-11/msg00388.html
|
||||
http://sourceware.org/ml/gdb-cvs/2009-11/msg00156.html
|
||||
Subject: [patch] Fix crash on reading stabs
|
||||
|
||||
Hi,
|
||||
|
||||
there is a crash on reading stabs fpc binary:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=537837
|
||||
|
||||
Program received signal SIGSEGV, Segmentation fault.
|
||||
0x000000000069db3d in read_dbx_symtab (objfile=0x1daf5f0) at dbxread.c:1369
|
||||
1369 if ((namestring[0] == '-' && namestring[1] == 'l')
|
||||
|
||||
(gdb) p/x nlist.n_strx
|
||||
$7 = 0xfffffff8
|
||||
(gdb) p sizeof(nlist.n_strx)
|
||||
$10 = 8
|
||||
|
||||
Below the patch context is:
|
||||
namestring = (nlist->n_strx + file_string_table_offset
|
||||
+ DBX_STRINGTAB (objfile));
|
||||
|
||||
so IMO the `(unsigned)' cast is excessive as it does not match the expression
|
||||
below. Such cast is there since the GDB "Initial revision" (1999).
|
||||
|
||||
`n_strx' type:
|
||||
struct internal_nlist
|
||||
{
|
||||
unsigned long n_strx; /* Index into string table of name. */
|
||||
...
|
||||
};
|
||||
|
||||
Regression tested on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu which does not
|
||||
mean anything with the default DWARF debug info. It was hanging for stabs so
|
||||
tried just a large part of gdb.base/*.exp on x86_64-m32 - `unix/-gstabs+/-m32'.
|
||||
|
||||
If it isn't obviously approved please feel free to drop it as one should not
|
||||
use STABS in the first place.
|
||||
|
||||
|
||||
Regards,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-11-17 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* dbxread.c (set_namestring): Remove cast to unsigned. Check N_STRX
|
||||
overflow.
|
||||
|
||||
--- a/gdb/dbxread.c
|
||||
+++ b/gdb/dbxread.c
|
||||
@@ -965,8 +965,9 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
|
||||
{
|
||||
char *namestring;
|
||||
|
||||
- if (((unsigned) nlist->n_strx + file_string_table_offset)
|
||||
- >= DBX_STRINGTAB_SIZE (objfile))
|
||||
+ if (nlist->n_strx + file_string_table_offset
|
||||
+ >= DBX_STRINGTAB_SIZE (objfile)
|
||||
+ || nlist->n_strx + file_string_table_offset < nlist->n_strx)
|
||||
{
|
||||
complaint (&symfile_complaints, _("bad string table offset in symbol %d"),
|
||||
symnum);
|
||||
|
||||
|
||||
|
||||
Re: [RFA] Fix "show convenience" test
|
||||
http://sourceware.org/ml/gdb-patches/2009-09/msg00565.html
|
||||
http://sourceware.org/ml/gdb-cvs/2009-09/msg00099.html
|
||||
|
||||
### src/gdb/testsuite/ChangeLog 2009/09/15 18:51:25 1.1960
|
||||
### src/gdb/testsuite/ChangeLog 2009/09/17 17:49:46 1.1961
|
||||
## -1,3 +1,7 @@
|
||||
+2009-09-17 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||
+
|
||||
+ * gdb.base/default.exp: Fix "show convenience".
|
||||
+
|
||||
2009-09-15 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* lib/mi-support.exp (mi_create_varobj): Update.
|
||||
--- src/gdb/testsuite/gdb.base/default.exp 2009/08/13 14:58:27 1.31
|
||||
+++ src/gdb/testsuite/gdb.base/default.exp 2009/09/17 17:49:46 1.32
|
||||
@@ -598,7 +598,7 @@
|
||||
#test show confirm
|
||||
gdb_test "show confirm" "Whether to confirm potentially dangerous operations is o\[a-z\]*." "show confirm"
|
||||
#test show convenience
|
||||
-gdb_test "show convenience" "No debugger convenience variables now defined.(\[^\r\n\]*\[\r\n\])+Convenience variables have names starting with \".\";(\[^\r\n\]*\[\r\n\])+use \"set\" as in \"set .foo = 5\" to define them." "show convenience"
|
||||
+gdb_test "show convenience" "\\\$_siginfo = void" "show convenience"
|
||||
#test show directories
|
||||
gdb_test "show directories" "Source directories searched: .cdir\[:;\].cwd" "show directories"
|
||||
#test show editing
|
||||
### src/gdb/doc/ChangeLog 2009/09/15 18:51:24 1.953
|
||||
### src/gdb/doc/ChangeLog 2009/09/17 17:49:46 1.954
|
||||
## -1,3 +1,8 @@
|
||||
+2009-09-17 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||
+
|
||||
+ * gdb.texinfo (convenince variables): Mention
|
||||
+ $_siginfo could be empty.
|
||||
+
|
||||
2009-09-15 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* gdb.texinfo (GDB/MI Variable Objects): Document
|
||||
--- src/gdb/doc/gdb.texinfo 2009/09/15 18:51:25 1.624
|
||||
+++ src/gdb/doc/gdb.texinfo 2009/09/17 17:49:46 1.625
|
||||
@@ -7819,8 +7819,10 @@
|
||||
|
||||
@item $_siginfo
|
||||
@vindex $_siginfo@r{, convenience variable}
|
||||
-The variable @code{$_siginfo} is bound to extra signal information
|
||||
-inspection (@pxref{extra signal information}).
|
||||
+The variable @code{$_siginfo} contains extra signal information
|
||||
+(@pxref{extra signal information}). Note that @code{$_siginfo}
|
||||
+could be empty, if the application has not yet received any signals.
|
||||
+For example, it will be empty before you execute the @code{run} command.
|
||||
@end table
|
||||
|
||||
On HP-UX systems, if you refer to a function or variable name that
|
||||
|
||||
|
||||
|
||||
http://sourceware.org/ml/gdb-cvs/2009-12/msg00128.html
|
||||
|
||||
### src/gdb/testsuite/ChangeLog 2009/12/23 23:18:08 1.2054
|
||||
### src/gdb/testsuite/ChangeLog 2009/12/24 21:57:06 1.2055
|
||||
## -1,3 +1,10 @@
|
||||
+2009-12-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ Fix compatibility with G++-4.5.
|
||||
+ * gdb.cp/expand-sals.cc (main): Remove the "exit-line" comment.
|
||||
+ * gdb.cp/expand-sals.exp: Remove breakpoint on "exit-line".
|
||||
+ (uncaught return): Remove.
|
||||
+
|
||||
2009-12-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Phil Muldoon <pmuldoon@redhat.com>
|
||||
|
||||
--- src/gdb/testsuite/gdb.cp/expand-sals.cc 2009/05/11 15:05:56 1.1
|
||||
+++ src/gdb/testsuite/gdb.cp/expand-sals.cc 2009/12/24 21:57:06 1.2
|
||||
@@ -49,5 +49,5 @@
|
||||
A a;
|
||||
B b;
|
||||
|
||||
- return 0; /* exit-line */
|
||||
+ return 0;
|
||||
}
|
||||
--- src/gdb/testsuite/gdb.cp/expand-sals.exp 2009/05/11 15:05:56 1.1
|
||||
+++ src/gdb/testsuite/gdb.cp/expand-sals.exp 2009/12/24 21:57:06 1.2
|
||||
@@ -23,8 +23,6 @@
|
||||
return -1
|
||||
}
|
||||
|
||||
-gdb_breakpoint [gdb_get_line_number "exit-line"]
|
||||
-
|
||||
gdb_breakpoint [gdb_get_line_number "func-line"]
|
||||
gdb_continue_to_breakpoint "func" ".*func-line.*"
|
||||
|
||||
@@ -52,7 +50,3 @@
|
||||
"bt from A"
|
||||
|
||||
gdb_continue_to_breakpoint "next caller func" ".*func-line.*"
|
||||
-
|
||||
-# Verify GDB really could not catch any other breakpoint location.
|
||||
-
|
||||
-gdb_continue_to_breakpoint "uncaught return" ".*exit-line.*"
|
||||
|
||||
|
||||
|
||||
http://sourceware.org/ml/gdb-cvs/2009-11/msg00213.html
|
||||
|
||||
[ cut ]
|
||||
|
||||
--- src/gdb/testsuite/gdb.base/condbreak.exp 2009/01/03 05:58:03 1.13
|
||||
+++ src/gdb/testsuite/gdb.base/condbreak.exp 2009/11/25 20:43:29 1.14
|
||||
@@ -207,10 +207,10 @@
|
||||
setup_xfail hppa2.0w-*-* 11512CLLbs
|
||||
send_gdb "continue\n"
|
||||
gdb_expect {
|
||||
- -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*" {
|
||||
+ -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*$gdb_prompt $" {
|
||||
pass "run until breakpoint at marker2"
|
||||
}
|
||||
- -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*" {
|
||||
+ -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*$gdb_prompt $" {
|
||||
xfail "run until breakpoint at marker2"
|
||||
}
|
||||
-re "$gdb_prompt $" {
|
||||
|
||||
|
||||
|
||||
Fix for gfortran-4.1:
|
||||
-PASS: gdb.mi/mi-var-child-f.exp: mi runto MAIN__
|
||||
+FAIL: gdb.mi/mi-var-child-f.exp: mi runto MAIN__ (unknown output after running)
|
||||
|
||||
RFC: Move language-changed message to verbose
|
||||
http://sourceware.org/ml/gdb-patches/2009-11/msg00031.html
|
||||
http://sourceware.org/ml/gdb-cvs/2009-11/msg00034.html
|
||||
|
||||
### src/gdb/ChangeLog 2009/11/05 19:53:03 1.11030
|
||||
### src/gdb/ChangeLog 2009/11/05 20:43:52 1.11031
|
||||
## -1,3 +1,8 @@
|
||||
+2009-11-05 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
+
|
||||
+ * top.c (execute_command): Select a frame before checking the current
|
||||
+ language. Only output a message if verbose.
|
||||
+
|
||||
2009-11-05 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* symtab.h (SYMBOL_SET_LINKAGE_NAME): Update comment.
|
||||
--- src/gdb/top.c 2009/10/19 09:51:42 1.172
|
||||
+++ src/gdb/top.c 2009/11/05 20:43:52 1.173
|
||||
@@ -457,10 +457,13 @@
|
||||
|
||||
}
|
||||
|
||||
- /* Tell the user if the language has changed (except first time). */
|
||||
+ /* Tell the user if the language has changed (except first time).
|
||||
+ First make sure that a new frame has been selected, in case this
|
||||
+ command or the hooks changed the program state. */
|
||||
+ deprecated_safe_get_selected_frame ();
|
||||
if (current_language != expected_language)
|
||||
{
|
||||
- if (language_mode == language_mode_auto)
|
||||
+ if (language_mode == language_mode_auto && info_verbose)
|
||||
{
|
||||
language_info (1); /* Print what changed. */
|
||||
}
|
122
gdb-archer-pie-addons-keep-disabled.patch
Normal file
122
gdb-archer-pie-addons-keep-disabled.patch
Normal file
@ -0,0 +1,122 @@
|
||||
--- ./gdb/breakpoint.c 2009-12-18 00:13:49.000000000 +0100
|
||||
+++ ./gdb/breakpoint.c 2009-12-18 00:13:16.000000000 +0100
|
||||
@@ -8563,6 +8563,49 @@ update_breakpoint_locations (struct brea
|
||||
update_global_location_list (1);
|
||||
}
|
||||
|
||||
+void
|
||||
+breakpoints_relocate (struct objfile *objfile, struct section_offsets *delta)
|
||||
+{
|
||||
+ struct bp_location *bl, **blp_tmp;
|
||||
+ int changed = 0;
|
||||
+
|
||||
+ gdb_assert (objfile->separate_debug_objfile_backlink == NULL);
|
||||
+
|
||||
+ ALL_BP_LOCATIONS (bl, blp_tmp)
|
||||
+ {
|
||||
+ struct obj_section *osect;
|
||||
+
|
||||
+ /* BL->SECTION can be correctly NULL for breakpoints with multiple
|
||||
+ locations expanded through symtab. */
|
||||
+
|
||||
+ ALL_OBJFILE_OSECTIONS (objfile, osect)
|
||||
+ {
|
||||
+ CORE_ADDR relocated_address;
|
||||
+ CORE_ADDR delta_offset;
|
||||
+
|
||||
+ delta_offset = ANOFFSET (delta, osect->the_bfd_section->index);
|
||||
+ if (delta_offset == 0)
|
||||
+ continue;
|
||||
+ relocated_address = bl->address + delta_offset;
|
||||
+
|
||||
+ if (obj_section_addr (osect) <= relocated_address
|
||||
+ && relocated_address < obj_section_endaddr (osect))
|
||||
+ {
|
||||
+ if (bl->inserted)
|
||||
+ remove_breakpoint (bl, mark_uninserted);
|
||||
+
|
||||
+ bl->address += delta_offset;
|
||||
+ bl->requested_address += delta_offset;
|
||||
+
|
||||
+ changed = 1;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (changed)
|
||||
+ qsort (bp_location, bp_location_count, sizeof (*bp_location),
|
||||
+ bp_location_compare_for_qsort);
|
||||
+}
|
||||
|
||||
/* Reset a breakpoint given it's struct breakpoint * BINT.
|
||||
The value we return ends up being the return value from catch_errors.
|
||||
--- ./gdb/breakpoint.h 2009-12-18 00:13:48.000000000 +0100
|
||||
+++ ./gdb/breakpoint.h 2009-12-17 22:11:10.000000000 +0100
|
||||
@@ -970,4 +970,7 @@ extern struct breakpoint *get_tracepoint
|
||||
is newly allocated; the caller should free when done with it. */
|
||||
extern VEC(breakpoint_p) *all_tracepoints (void);
|
||||
|
||||
+extern void breakpoints_relocate (struct objfile *objfile,
|
||||
+ struct section_offsets *delta);
|
||||
+
|
||||
#endif /* !defined (BREAKPOINT_H) */
|
||||
--- ./gdb/objfiles.c 2009-12-18 00:13:48.000000000 +0100
|
||||
+++ ./gdb/objfiles.c 2009-12-17 23:19:22.000000000 +0100
|
||||
@@ -546,7 +546,7 @@ free_all_objfiles (void)
|
||||
/* Relocate OBJFILE to NEW_OFFSETS. There should be OBJFILE->NUM_SECTIONS
|
||||
entries in new_offsets. SEPARATE_DEBUG_OBJFILE is not touched here. */
|
||||
|
||||
-static void
|
||||
+static int
|
||||
objfile_relocate1 (struct objfile *objfile, struct section_offsets *new_offsets)
|
||||
{
|
||||
struct obj_section *s;
|
||||
@@ -565,7 +565,7 @@ objfile_relocate1 (struct objfile *objfi
|
||||
something_changed = 1;
|
||||
}
|
||||
if (!something_changed)
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/* OK, get all the symtabs. */
|
||||
@@ -706,6 +706,13 @@ objfile_relocate1 (struct objfile *objfi
|
||||
exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
|
||||
obj_section_addr (s));
|
||||
}
|
||||
+
|
||||
+ /* Final call of breakpoint_re_set can keep breakpoint locations disabled if
|
||||
+ their addresses match. */
|
||||
+ if (objfile->separate_debug_objfile_backlink == NULL)
|
||||
+ breakpoints_relocate (objfile, delta);
|
||||
+
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
/* Relocate OBJFILE to NEW_OFFSETS. There should be OBJFILE->NUM_SECTIONS
|
||||
@@ -720,7 +727,9 @@ objfile_relocate1 (struct objfile *objfi
|
||||
void
|
||||
objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
|
||||
{
|
||||
- objfile_relocate1 (objfile, new_offsets);
|
||||
+ int changed = 0;
|
||||
+
|
||||
+ changed |= objfile_relocate1 (objfile, new_offsets);
|
||||
|
||||
if (objfile->separate_debug_objfile != NULL)
|
||||
{
|
||||
@@ -747,11 +756,12 @@ objfile_relocate (struct objfile *objfil
|
||||
objfile_addrs);
|
||||
do_cleanups (my_cleanups);
|
||||
|
||||
- objfile_relocate1 (debug_objfile, new_debug_offsets);
|
||||
+ changed |= objfile_relocate1 (debug_objfile, new_debug_offsets);
|
||||
}
|
||||
|
||||
/* Relocate breakpoints as necessary, after things are relocated. */
|
||||
- breakpoint_re_set ();
|
||||
+ if (changed)
|
||||
+ breakpoint_re_set ();
|
||||
}
|
||||
|
||||
/* Return non-zero if OBJFILE has partial symbols. */
|
312
gdb-archer-pie-addons.patch
Normal file
312
gdb-archer-pie-addons.patch
Normal file
@ -0,0 +1,312 @@
|
||||
--- a/gdb/dwarf2read.c
|
||||
+++ b/gdb/dwarf2read.c
|
||||
@@ -5754,7 +5754,12 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
|
||||
{
|
||||
struct attribute *attr;
|
||||
struct symbol *sym;
|
||||
- CORE_ADDR base = (CORE_ADDR) 0;
|
||||
+ struct objfile *objfile = cu->objfile;
|
||||
+ CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
|
||||
+ SECT_OFF_TEXT (objfile));
|
||||
+ /* This is used only for DW_AT_data_member_location entries. */
|
||||
+ CORE_ADDR base = 0;
|
||||
+ int base_p = 0;
|
||||
|
||||
attr = dwarf2_attr (die, DW_AT_location, cu);
|
||||
if (attr)
|
||||
@@ -5763,6 +5768,7 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
|
||||
if (attr_form_is_block (attr))
|
||||
{
|
||||
base = decode_locdesc (DW_BLOCK (attr), cu);
|
||||
+ base_p = 1;
|
||||
}
|
||||
else if (attr_form_is_section_offset (attr))
|
||||
{
|
||||
@@ -5824,12 +5830,15 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
|
||||
else
|
||||
dwarf2_complex_location_expr_complaint ();
|
||||
|
||||
- SYMBOL_VALUE_ADDRESS (sym) = base + byte_offset;
|
||||
+ if (!base_p)
|
||||
+ dwarf2_invalid_attrib_class_complaint
|
||||
+ ("DW_AT_data_member_location", "common block member");
|
||||
+ SYMBOL_VALUE_ADDRESS (sym) = base + byte_offset + baseaddr;
|
||||
add_symbol_to_list (sym, &global_symbols);
|
||||
}
|
||||
|
||||
if (SYMBOL_CLASS (sym) == LOC_STATIC)
|
||||
- SET_FIELD_PHYSADDR (*field, SYMBOL_VALUE_ADDRESS (sym));
|
||||
+ SET_FIELD_PHYSADDR (*field, SYMBOL_VALUE_ADDRESS (sym) - baseaddr);
|
||||
else
|
||||
SET_FIELD_PHYSNAME (*field, SYMBOL_LINKAGE_NAME (sym));
|
||||
FIELD_TYPE (*field) = SYMBOL_TYPE (sym);
|
||||
@@ -5843,7 +5852,7 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
|
||||
|
||||
sym = new_symbol (die, type, cu);
|
||||
/* SYMBOL_VALUE_ADDRESS never gets used as all its fields are static. */
|
||||
- SYMBOL_VALUE_ADDRESS (sym) = base;
|
||||
+ SYMBOL_VALUE_ADDRESS (sym) = base + baseaddr;
|
||||
|
||||
set_die_type (die, type, cu);
|
||||
}
|
||||
--- a/gdb/exec.c
|
||||
+++ b/gdb/exec.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "exec.h"
|
||||
#include "observer.h"
|
||||
#include "arch-utils.h"
|
||||
+#include "solib.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include "readline/readline.h"
|
||||
@@ -220,6 +221,10 @@ exec_file_attach (char *filename, int from_tty)
|
||||
char *scratch_pathname;
|
||||
int scratch_chan;
|
||||
struct target_section *sections = NULL, *sections_end = NULL;
|
||||
+ struct target_section *p;
|
||||
+ int addr_bit;
|
||||
+ CORE_ADDR mask = CORE_ADDR_MAX;
|
||||
+ CORE_ADDR displacement;
|
||||
|
||||
scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
|
||||
write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
|
||||
@@ -288,12 +293,23 @@ exec_file_attach (char *filename, int from_tty)
|
||||
scratch_pathname, bfd_errmsg (bfd_get_error ()));
|
||||
}
|
||||
|
||||
+ set_gdbarch_from_file (exec_bfd);
|
||||
+
|
||||
+ addr_bit = gdbarch_addr_bit (target_gdbarch);
|
||||
+ if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
|
||||
+ mask = ((CORE_ADDR) 1 << addr_bit) - 1;
|
||||
+
|
||||
+ displacement = solib_exec_displacement ();
|
||||
+ for (p = sections; p < sections_end; p++)
|
||||
+ {
|
||||
+ p->addr = (p->addr + displacement) & mask;
|
||||
+ p->endaddr = (p->endaddr + displacement) & mask;
|
||||
+ }
|
||||
+
|
||||
exec_bfd_mtime = bfd_get_mtime (exec_bfd);
|
||||
|
||||
validate_files ();
|
||||
|
||||
- set_gdbarch_from_file (exec_bfd);
|
||||
-
|
||||
/* Add the executable's sections to the current address spaces'
|
||||
list of sections. */
|
||||
add_target_sections (sections, sections_end);
|
||||
--- a/gdb/gdbtypes.h
|
||||
+++ b/gdb/gdbtypes.h
|
||||
@@ -966,6 +966,7 @@ extern void allocate_cplus_struct_type (struct type *);
|
||||
#define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind)
|
||||
#define FIELD_BITPOS(thisfld) ((thisfld).loc.bitpos)
|
||||
#define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname)
|
||||
+/* This address is unrelocated by the objfile's ANOFFSET. */
|
||||
#define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr)
|
||||
#define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block)
|
||||
#define SET_FIELD_BITPOS(thisfld, bitpos) \
|
||||
@@ -974,6 +975,7 @@ extern void allocate_cplus_struct_type (struct type *);
|
||||
#define SET_FIELD_PHYSNAME(thisfld, name) \
|
||||
(FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME, \
|
||||
FIELD_STATIC_PHYSNAME (thisfld) = (name))
|
||||
+/* This address is unrelocated by the objfile's ANOFFSET. */
|
||||
#define SET_FIELD_PHYSADDR(thisfld, addr) \
|
||||
(FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR, \
|
||||
FIELD_STATIC_PHYSADDR (thisfld) = (addr))
|
||||
@@ -989,6 +991,7 @@ extern void allocate_cplus_struct_type (struct type *);
|
||||
#define TYPE_FIELD_LOC_KIND(thistype, n) FIELD_LOC_KIND (TYPE_FIELD (thistype, n))
|
||||
#define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n))
|
||||
#define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n))
|
||||
+/* This address is unrelocated by the objfile's ANOFFSET. */
|
||||
#define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_STATIC_PHYSADDR (TYPE_FIELD (thistype, n))
|
||||
#define TYPE_FIELD_DWARF_BLOCK(thistype, n) FIELD_DWARF_BLOCK (TYPE_FIELD (thistype, n))
|
||||
#define TYPE_FIELD_ARTIFICIAL(thistype, n) FIELD_ARTIFICIAL(TYPE_FIELD(thistype,n))
|
||||
--- a/gdb/jv-lang.c
|
||||
+++ b/gdb/jv-lang.c
|
||||
@@ -416,7 +416,8 @@ java_link_class_type (struct gdbarch *gdbarch,
|
||||
|
||||
fields = NULL;
|
||||
nfields--; /* First set up dummy "class" field. */
|
||||
- SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas));
|
||||
+ SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas)
|
||||
+ - (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
|
||||
TYPE_FIELD_NAME (type, nfields) = "class";
|
||||
TYPE_FIELD_TYPE (type, nfields) = value_type (clas);
|
||||
SET_TYPE_FIELD_PRIVATE (type, nfields);
|
||||
@@ -462,7 +463,8 @@ java_link_class_type (struct gdbarch *gdbarch,
|
||||
SET_TYPE_FIELD_PROTECTED (type, i);
|
||||
}
|
||||
if (accflags & 0x0008) /* ACC_STATIC */
|
||||
- SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset);
|
||||
+ SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset
|
||||
+ - (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
|
||||
else
|
||||
TYPE_FIELD_BITPOS (type, i) = 8 * boffset;
|
||||
if (accflags & 0x8000) /* FIELD_UNRESOLVED_FLAG */
|
||||
--- a/gdb/solib-svr4.c
|
||||
+++ b/gdb/solib-svr4.c
|
||||
@@ -1672,15 +1672,20 @@ static CORE_ADDR
|
||||
svr4_exec_displacement (void)
|
||||
{
|
||||
int found;
|
||||
+ /* ENTRY_POINT is a possible function descriptor - before
|
||||
+ a call to gdbarch_convert_from_func_ptr_addr. */
|
||||
CORE_ADDR entry_point;
|
||||
|
||||
if (exec_bfd == NULL)
|
||||
return 0;
|
||||
|
||||
if (target_auxv_search (¤t_target, AT_ENTRY, &entry_point) == 1)
|
||||
- return entry_point - exec_entry_point (exec_bfd, ¤t_target);
|
||||
+ return entry_point - bfd_get_start_address (exec_bfd);
|
||||
|
||||
- return svr4_static_exec_displacement ();
|
||||
+ if (!ptid_equal (inferior_ptid, null_ptid))
|
||||
+ return svr4_static_exec_displacement ();
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/* Relocate the main executable. This function should be called upon
|
||||
@@ -1632,7 +1635,7 @@ svr4_exec_displacement (void)
|
||||
static void
|
||||
svr4_relocate_main_executable (void)
|
||||
{
|
||||
- CORE_ADDR displacement = svr4_exec_displacement ();
|
||||
+ CORE_ADDR displacement = solib_exec_displacement ();
|
||||
|
||||
/* Even if DISPLACEMENT is 0 still try to relocate it as this is a new
|
||||
difference of in-memory vs. in-file addresses and we could already
|
||||
@@ -1975,6 +1978,7 @@ _initialize_svr4_solib (void)
|
||||
svr4_so_ops.free_so = svr4_free_so;
|
||||
svr4_so_ops.clear_solib = svr4_clear_solib;
|
||||
svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
|
||||
+ svr4_so_ops.exec_displacement = svr4_exec_displacement;
|
||||
svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
|
||||
svr4_so_ops.current_sos = svr4_current_sos;
|
||||
svr4_so_ops.open_symbol_file_object = open_symbol_file_object;
|
||||
--- a/gdb/solib.c
|
||||
+++ b/gdb/solib.c
|
||||
@@ -1014,6 +1014,19 @@ solib_create_inferior_hook (int from_tty)
|
||||
ops->solib_create_inferior_hook (from_tty);
|
||||
}
|
||||
|
||||
+/* Query the difference of in-memory VMA addresses vs. exec_bfd VMAs. */
|
||||
+
|
||||
+CORE_ADDR
|
||||
+solib_exec_displacement (void)
|
||||
+{
|
||||
+ struct target_so_ops *ops = solib_ops (target_gdbarch);
|
||||
+
|
||||
+ if (ops->exec_displacement != NULL)
|
||||
+ return (*ops->exec_displacement) ();
|
||||
+ else
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* GLOBAL FUNCTION
|
||||
|
||||
in_solib_dynsym_resolve_code -- check to see if an address is in
|
||||
--- a/gdb/solib.h
|
||||
+++ b/gdb/solib.h
|
||||
@@ -43,6 +43,8 @@ extern int solib_read_symbols (struct so_list *, int);
|
||||
|
||||
extern void solib_create_inferior_hook (int from_tty);
|
||||
|
||||
+extern CORE_ADDR solib_exec_displacement (void);
|
||||
+
|
||||
/* If ADDR lies in a shared library, return its name. */
|
||||
|
||||
extern char *solib_name_from_address (CORE_ADDR);
|
||||
--- a/gdb/solist.h
|
||||
+++ b/gdb/solist.h
|
||||
@@ -89,6 +89,9 @@ struct target_so_ops
|
||||
/* Target dependent code to run after child process fork. */
|
||||
void (*solib_create_inferior_hook) (int from_tty);
|
||||
|
||||
+ /* Query the difference of in-memory VMA addresses vs. exec_bfd VMAs. */
|
||||
+ CORE_ADDR (*exec_displacement) (void);
|
||||
+
|
||||
/* Do additional symbol handling, lookup, etc. after symbols
|
||||
for a shared object have been loaded. */
|
||||
void (*special_symbol_handling) (void);
|
||||
--- a/gdb/symfile.c
|
||||
+++ b/gdb/symfile.c
|
||||
@@ -873,15 +873,36 @@ syms_from_objfile (struct objfile *objfile,
|
||||
if an error occurs during symbol reading. */
|
||||
old_chain = make_cleanup_free_objfile (objfile);
|
||||
|
||||
- /* If ADDRS and OFFSETS are both NULL, put together a dummy address
|
||||
- list. We now establish the convention that an addr of zero means
|
||||
- no load address was specified. */
|
||||
+ /* If ADDRS and OFFSETS are both NULL, put together a dummy offset list. */
|
||||
+
|
||||
if (! addrs && ! offsets)
|
||||
{
|
||||
- local_addr
|
||||
- = alloc_section_addr_info (bfd_count_sections (objfile->obfd));
|
||||
- make_cleanup (xfree, local_addr);
|
||||
- addrs = local_addr;
|
||||
+ /* Relocateble files have an exception in default_symfile_offsets which
|
||||
+ applies only for ADDRS. But calling solib_exec_displacement is more
|
||||
+ suitable for OFFSETS. Fortunately we never need the both
|
||||
+ functionalities simultaneously and in other cases zeroed ADDRS and
|
||||
+ zeroed OFFSETS are equivalent. */
|
||||
+
|
||||
+ if ((bfd_get_file_flags (objfile->obfd) & (EXEC_P | DYNAMIC)) == 0)
|
||||
+ {
|
||||
+ local_addr
|
||||
+ = alloc_section_addr_info (bfd_count_sections (objfile->obfd));
|
||||
+ make_cleanup (xfree, local_addr);
|
||||
+ addrs = local_addr;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ CORE_ADDR displacement = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ if (mainline)
|
||||
+ displacement = solib_exec_displacement ();
|
||||
+
|
||||
+ num_offsets = bfd_count_sections (objfile->obfd);
|
||||
+ offsets = alloca (SIZEOF_N_SECTION_OFFSETS (num_offsets));
|
||||
+ for (i = 0; i < num_offsets; i++)
|
||||
+ offsets->offsets[i] = displacement;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Now either addrs or offsets is non-zero. */
|
||||
--- a/gdb/value.c
|
||||
+++ b/gdb/value.c
|
||||
@@ -1890,7 +1890,8 @@ value_static_field (struct type *type, int fieldno)
|
||||
if (TYPE_FIELD_LOC_KIND (type, fieldno) == FIELD_LOC_KIND_PHYSADDR)
|
||||
{
|
||||
retval = value_at (TYPE_FIELD_TYPE (type, fieldno),
|
||||
- TYPE_FIELD_STATIC_PHYSADDR (type, fieldno));
|
||||
+ TYPE_FIELD_STATIC_PHYSADDR (type, fieldno)
|
||||
+ + (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1920,7 +1921,8 @@ value_static_field (struct type *type, int fieldno)
|
||||
}
|
||||
if (retval && VALUE_LVAL (retval) == lval_memory)
|
||||
SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno),
|
||||
- value_address (retval));
|
||||
+ value_address (retval)
|
||||
+ - (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
--- gdb-7.0/gdb/testsuite/gdb.base/valgrind-db-attach.exp-orig 2009-12-21 16:50:42.000000000 +0100
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.base/valgrind-db-attach.exp 2009-12-21 16:51:24.000000000 +0100
|
||||
@@ -67,6 +67,8 @@ gdb_test_multiple "" $test {
|
||||
}
|
||||
}
|
||||
|
||||
+gdb_test "" "" "eat first prompt"
|
||||
+
|
||||
# Initialization from default_gdb_start.
|
||||
gdb_test "set height 0"
|
||||
gdb_test "set width 0"
|
2647
gdb-archer-pie.patch
Normal file
2647
gdb-archer-pie.patch
Normal file
File diff suppressed because it is too large
Load Diff
1484
gdb-archer.patch
1484
gdb-archer.patch
File diff suppressed because it is too large
Load Diff
101
gdb-bitfield-check_typedef.patch
Normal file
101
gdb-bitfield-check_typedef.patch
Normal file
@ -0,0 +1,101 @@
|
||||
http://sourceware.org/ml/gdb-patches/2010-01/msg00030.html
|
||||
Subject: [patch] Re: Regression: field type preservation: 7.0 -> 7.0.1+HEAD
|
||||
|
||||
On Friday 01 January 2010 21:45:05 Jan Kratochvil wrote:
|
||||
> -PASS: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
> +FAIL: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
> -PASS: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
> +FAIL: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
> -PASS: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
|
||||
> +FAIL: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
|
||||
>
|
||||
> due to:
|
||||
> Re: RFA: unbreak typedefed bitfield
|
||||
> http://sourceware.org/ml/gdb-patches/2009-12/msg00295.html
|
||||
> commit fc85da4ee2a7c32afc53b1b334a4f84e2e9bd84e
|
||||
> http://sourceware.org/ml/gdb-cvs/2009-12/msg00100.html
|
||||
|
||||
attached a fix on top of existing HEAD.
|
||||
|
||||
Original PR gdb/10884 was a regression 6.8 -> 7.0 due to:
|
||||
RFC: Lazy bitfields
|
||||
http://sourceware.org/ml/gdb-patches/2009-07/msg00437.html
|
||||
http://sourceware.org/ml/gdb-cvs/2009-07/msg00143.html
|
||||
07491b3409f6ace0b7a9a707775a56ce10fece1c
|
||||
|
||||
No regressions for HEAD on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu. Plus:
|
||||
-FAIL: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
+PASS: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
-FAIL: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
+PASS: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
|
||||
-FAIL: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
|
||||
+PASS: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
|
||||
|
||||
Going to check it in also for gdb_7_0-branch after an approval.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2010-01-02 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* value.c (value_primitive_field): Remove one check_typedef call.
|
||||
Move bitpos and container_bitsize initialization after
|
||||
allocate_value_lazy. New comment before accessing TYPE_LENGTH.
|
||||
|
||||
gdb/testsuite/
|
||||
2010-01-02 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.mi/var-cmd.c (do_bitfield_tests): Change "V.sharable" type to
|
||||
"uint_for_mi_testing".
|
||||
|
||||
--- a/gdb/testsuite/gdb.mi/var-cmd.c
|
||||
+++ b/gdb/testsuite/gdb.mi/var-cmd.c
|
||||
@@ -494,7 +494,7 @@ void do_bitfield_tests ()
|
||||
mi_create_varobj V d "create varobj for Data"
|
||||
mi_list_varobj_children "V" {
|
||||
{"V.alloc" "alloc" "0" "int"}
|
||||
- {"V.sharable" "sharable" "0" "unsigned int"}
|
||||
+ {"V.sharable" "sharable" "0" "uint_for_mi_testing"}
|
||||
} "list children of Data"
|
||||
mi_check_varobj_value V.sharable 3 "access bitfield"
|
||||
:*/
|
||||
--- a/gdb/value.c
|
||||
+++ b/gdb/value.c
|
||||
@@ -1873,7 +1873,6 @@ value_primitive_field (struct value *arg1, int offset,
|
||||
|
||||
CHECK_TYPEDEF (arg_type);
|
||||
type = TYPE_FIELD_TYPE (arg_type, fieldno);
|
||||
- type = check_typedef (type);
|
||||
|
||||
/* Handle packed fields */
|
||||
|
||||
@@ -1885,10 +1884,14 @@ value_primitive_field (struct value *arg1, int offset,
|
||||
Otherwise, adjust offset to the byte containing the first
|
||||
bit. Assume that the address, offset, and embedded offset
|
||||
are sufficiently aligned. */
|
||||
- int bitpos = TYPE_FIELD_BITPOS (arg_type, fieldno);
|
||||
- int container_bitsize = TYPE_LENGTH (type) * 8;
|
||||
+ int bitpos, container_bitsize;
|
||||
|
||||
v = allocate_value_lazy (type);
|
||||
+
|
||||
+ /* TYPE_LENGTH of TYPE gets initialized by allocate_value_lazy. */
|
||||
+ bitpos = TYPE_FIELD_BITPOS (arg_type, fieldno);
|
||||
+ container_bitsize = TYPE_LENGTH (type) * 8;
|
||||
+
|
||||
v->bitsize = TYPE_FIELD_BITSIZE (arg_type, fieldno);
|
||||
if ((bitpos % container_bitsize) + v->bitsize <= container_bitsize
|
||||
&& TYPE_LENGTH (type) <= (int) sizeof (LONGEST))
|
||||
@@ -1939,6 +1942,8 @@ value_primitive_field (struct value *arg1, int offset,
|
||||
else
|
||||
{
|
||||
v = allocate_value (type);
|
||||
+
|
||||
+ /* TYPE_LENGTH of TYPE gets initialized by allocate_value. */
|
||||
memcpy (value_contents_raw (v),
|
||||
value_contents_raw (arg1) + offset,
|
||||
TYPE_LENGTH (type));
|
||||
|
137
gdb-bz528668-symfile-cleanup.patch
Normal file
137
gdb-bz528668-symfile-cleanup.patch
Normal file
@ -0,0 +1,137 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-10/msg00509.html
|
||||
Subject: [patch 2/3] find_separate_debug_file cleanup
|
||||
|
||||
Hi,
|
||||
|
||||
current code was:
|
||||
* difficult to maintain as a new variable required xfree on many places
|
||||
* was causing memory corruptions due to silently misapplied 3rd party patches
|
||||
as the close code fragments unfortunately match patch context
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-10-21 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* symfile.c (find_separate_debug_file): Initialize dir, debugfile and
|
||||
canon_name to NULL. Change alloca to xmalloc, newly call xfree for it.
|
||||
New label cleanup_return_debugfile, jump to it from the failure paths.
|
||||
|
||||
--- a/gdb/symfile.c
|
||||
+++ b/gdb/symfile.c
|
||||
@@ -1333,11 +1333,10 @@ static char *
|
||||
find_separate_debug_file (struct objfile *objfile)
|
||||
{
|
||||
asection *sect;
|
||||
- char *basename;
|
||||
- char *dir;
|
||||
- char *debugfile;
|
||||
- char *name_copy;
|
||||
- char *canon_name;
|
||||
+ char *basename, *name_copy;
|
||||
+ char *dir = NULL;
|
||||
+ char *debugfile = NULL;
|
||||
+ char *canon_name = NULL;
|
||||
bfd_size_type debuglink_size;
|
||||
unsigned long crc32;
|
||||
int i;
|
||||
@@ -1366,7 +1365,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
if (basename == NULL)
|
||||
/* There's no separate debug info, hence there's no way we could
|
||||
load it => no warning. */
|
||||
- return NULL;
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
dir = xstrdup (objfile->name);
|
||||
|
||||
@@ -1388,24 +1387,19 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
if (canon_name && strlen (canon_name) > i)
|
||||
i = strlen (canon_name);
|
||||
|
||||
- debugfile = alloca (strlen (debug_file_directory) + 1
|
||||
- + i
|
||||
- + strlen (DEBUG_SUBDIRECTORY)
|
||||
- + strlen ("/")
|
||||
- + strlen (basename)
|
||||
- + 1);
|
||||
+ debugfile = xmalloc (strlen (debug_file_directory) + 1
|
||||
+ + i
|
||||
+ + 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 (basename);
|
||||
- xfree (dir);
|
||||
- xfree (canon_name);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */
|
||||
strcpy (debugfile, dir);
|
||||
@@ -1414,12 +1408,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- xfree (canon_name);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* Then try in the global debugfile directory. */
|
||||
strcpy (debugfile, debug_file_directory);
|
||||
@@ -1428,12 +1417,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- {
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- xfree (canon_name);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
|
||||
/* If the file is in the sysroot, try using its base path in the
|
||||
global debugfile directory. */
|
||||
@@ -1447,20 +1431,17 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- {
|
||||
- xfree (canon_name);
|
||||
- xfree (basename);
|
||||
- xfree (dir);
|
||||
- return xstrdup (debugfile);
|
||||
- }
|
||||
+ goto cleanup_return_debugfile;
|
||||
}
|
||||
|
||||
- if (canon_name)
|
||||
- xfree (canon_name);
|
||||
+ xfree (debugfile);
|
||||
+ debugfile = NULL;
|
||||
|
||||
+cleanup_return_debugfile:
|
||||
+ xfree (canon_name);
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
- return NULL;
|
||||
+ return debugfile;
|
||||
}
|
||||
|
||||
|
||||
|
271
gdb-bz528668-symfile-multi.patch
Normal file
271
gdb-bz528668-symfile-multi.patch
Normal file
@ -0,0 +1,271 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-10/msg00508.html
|
||||
Subject: [patch 3/3] debug-file-directory with multiple components
|
||||
|
||||
Hi,
|
||||
|
||||
for various reasons `debug-file-directory' would be sometimes useful to have
|
||||
multiple components such as `solib-search-path' has.
|
||||
|
||||
I found it useful myself during various separate debuginfo tests/scripts.
|
||||
|
||||
It was requested for the ABRT bugreporting project at the preceding mail of:
|
||||
https://fedorahosted.org/pipermail/crash-catcher/2009-October/000054.html
|
||||
|
||||
It should be a backward compatible extension as DIRNAME_SEPARATOR should never
|
||||
be a valid part of a single DEBUG_FILE_DIRECTORY component.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/doc/
|
||||
2009-10-22 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.texinfo (set debug-file-directory, show debug-file-directory)
|
||||
(Auto-loading): Use plural and note one can use multiple components now.
|
||||
|
||||
gdb/
|
||||
2009-10-22 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* symfile.c (build_id_to_debug_filename): New variable debugdir. Move
|
||||
variables size, s and data into a new inner block. Change xmalloc for
|
||||
alloca, use direct BUILDID->SIZE there now. Loop for the
|
||||
DEBUG_FILE_DIRECTORY components.
|
||||
(find_separate_debug_file): New variable debugdir and debugdir_end.
|
||||
Loop for the DEBUG_FILE_DIRECTORY components.
|
||||
(_initialize_symfile): For "debug-file-directory" use plural and note
|
||||
one can use multiple components now.
|
||||
|
||||
gdb/testsuite/
|
||||
2009-10-22 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.base/sepdebug.exp: New test_different_dir call for multiple-dirs.
|
||||
|
||||
--- a/gdb/doc/gdb.texinfo
|
||||
+++ b/gdb/doc/gdb.texinfo
|
||||
@@ -14066,13 +14066,14 @@ name @value{GDBN} is currently using.
|
||||
@table @code
|
||||
|
||||
@kindex set debug-file-directory
|
||||
-@item set debug-file-directory @var{directory}
|
||||
-Set the directory which @value{GDBN} searches for separate debugging
|
||||
-information files to @var{directory}.
|
||||
+@item set debug-file-directory @var{directories}
|
||||
+Set the directories which @value{GDBN} searches for separate debugging
|
||||
+information files to @var{directory}. Multiple directory components can be set
|
||||
+concatenating them by a directory separator.
|
||||
|
||||
@kindex show debug-file-directory
|
||||
@item show debug-file-directory
|
||||
-Show the directory @value{GDBN} searches for separate debugging
|
||||
+Show the directories @value{GDBN} searches for separate debugging
|
||||
information files.
|
||||
|
||||
@end table
|
||||
@@ -19336,8 +19337,8 @@ readable, @value{GDBN} will evaluate it as a Python script.
|
||||
|
||||
If this file does not exist, and if the parameter
|
||||
@code{debug-file-directory} is set (@pxref{Separate Debug Files}),
|
||||
-then @value{GDBN} will use the file named
|
||||
-@file{@var{debug-file-directory}/@var{real-name}}, where
|
||||
+then @value{GDBN} will use for its each separated directory component
|
||||
+@code{component} the file named @file{@code{component}/@var{real-name}}, where
|
||||
@var{real-name} is the object file's real name, as described above.
|
||||
|
||||
Finally, if this file does not exist, then @value{GDBN} will look for
|
||||
--- a/gdb/symfile.c
|
||||
+++ b/gdb/symfile.c
|
||||
@@ -1218,35 +1218,59 @@ build_id_verify (const char *filename, struct build_id *check)
|
||||
static char *
|
||||
build_id_to_debug_filename (struct build_id *build_id)
|
||||
{
|
||||
- char *link, *s, *retval = NULL;
|
||||
- gdb_byte *data = build_id->data;
|
||||
- size_t size = build_id->size;
|
||||
+ char *link, *debugdir, *retval = NULL;
|
||||
|
||||
/* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
|
||||
- link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
|
||||
- + 2 * size + (sizeof ".debug" - 1) + 1);
|
||||
- s = link + sprintf (link, "%s/.build-id/", debug_file_directory);
|
||||
- if (size > 0)
|
||||
- {
|
||||
- size--;
|
||||
- s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
- }
|
||||
- if (size > 0)
|
||||
- *s++ = '/';
|
||||
- while (size-- > 0)
|
||||
- s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
- strcpy (s, ".debug");
|
||||
-
|
||||
- /* lrealpath() is expensive even for the usually non-existent files. */
|
||||
- if (access (link, F_OK) == 0)
|
||||
- retval = lrealpath (link);
|
||||
- xfree (link);
|
||||
-
|
||||
- if (retval != NULL && !build_id_verify (retval, build_id))
|
||||
+ link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
|
||||
+ + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
|
||||
+
|
||||
+ /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
|
||||
+ cause "/.build-id/..." lookups. */
|
||||
+
|
||||
+ debugdir = debug_file_directory;
|
||||
+ do
|
||||
{
|
||||
- xfree (retval);
|
||||
- retval = NULL;
|
||||
+ char *s, *debugdir_end;
|
||||
+ gdb_byte *data = build_id->data;
|
||||
+ size_t size = build_id->size;
|
||||
+
|
||||
+ while (*debugdir == DIRNAME_SEPARATOR)
|
||||
+ debugdir++;
|
||||
+
|
||||
+ debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
|
||||
+ if (debugdir_end == NULL)
|
||||
+ debugdir_end = &debugdir[strlen (debugdir)];
|
||||
+
|
||||
+ memcpy (link, debugdir, debugdir_end - debugdir);
|
||||
+ s = &link[debugdir_end - debugdir];
|
||||
+ s += sprintf (s, "/.build-id/");
|
||||
+ if (size > 0)
|
||||
+ {
|
||||
+ size--;
|
||||
+ s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
+ }
|
||||
+ if (size > 0)
|
||||
+ *s++ = '/';
|
||||
+ while (size-- > 0)
|
||||
+ s += sprintf (s, "%02x", (unsigned) *data++);
|
||||
+ strcpy (s, ".debug");
|
||||
+
|
||||
+ /* lrealpath() is expensive even for the usually non-existent files. */
|
||||
+ if (access (link, F_OK) == 0)
|
||||
+ retval = lrealpath (link);
|
||||
+
|
||||
+ if (retval != NULL && !build_id_verify (retval, build_id))
|
||||
+ {
|
||||
+ xfree (retval);
|
||||
+ retval = NULL;
|
||||
+ }
|
||||
+
|
||||
+ if (retval != NULL)
|
||||
+ break;
|
||||
+
|
||||
+ debugdir = debugdir_end;
|
||||
}
|
||||
+ while (*debugdir != 0);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -1333,7 +1357,7 @@ static char *
|
||||
find_separate_debug_file (struct objfile *objfile)
|
||||
{
|
||||
asection *sect;
|
||||
- char *basename, *name_copy;
|
||||
+ char *basename, *name_copy, *debugdir;
|
||||
char *dir = NULL;
|
||||
char *debugfile = NULL;
|
||||
char *canon_name = NULL;
|
||||
@@ -1410,29 +1434,51 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
goto cleanup_return_debugfile;
|
||||
|
||||
- /* Then try in the global debugfile directory. */
|
||||
- strcpy (debugfile, debug_file_directory);
|
||||
- strcat (debugfile, "/");
|
||||
- strcat (debugfile, dir);
|
||||
- strcat (debugfile, basename);
|
||||
-
|
||||
- if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
- goto cleanup_return_debugfile;
|
||||
+ /* Then try in the global debugfile directories.
|
||||
+
|
||||
+ Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
|
||||
+ cause "/..." lookups. */
|
||||
|
||||
- /* If the file is in the sysroot, try using its base path in the
|
||||
- global debugfile directory. */
|
||||
- if (canon_name
|
||||
- && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0
|
||||
- && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)]))
|
||||
+ debugdir = debug_file_directory;
|
||||
+ do
|
||||
{
|
||||
- strcpy (debugfile, debug_file_directory);
|
||||
- strcat (debugfile, canon_name + strlen (gdb_sysroot));
|
||||
+ char *debugdir_end;
|
||||
+
|
||||
+ while (*debugdir == DIRNAME_SEPARATOR)
|
||||
+ debugdir++;
|
||||
+
|
||||
+ debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
|
||||
+ if (debugdir_end == NULL)
|
||||
+ debugdir_end = &debugdir[strlen (debugdir)];
|
||||
+
|
||||
+ memcpy (debugfile, debugdir, debugdir_end - debugdir);
|
||||
+ debugfile[debugdir_end - debugdir] = 0;
|
||||
strcat (debugfile, "/");
|
||||
+ strcat (debugfile, dir);
|
||||
strcat (debugfile, basename);
|
||||
|
||||
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
goto cleanup_return_debugfile;
|
||||
+
|
||||
+ /* If the file is in the sysroot, try using its base path in the
|
||||
+ global debugfile directory. */
|
||||
+ if (canon_name
|
||||
+ && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0
|
||||
+ && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)]))
|
||||
+ {
|
||||
+ memcpy (debugfile, debugdir, debugdir_end - debugdir);
|
||||
+ debugfile[debugdir_end - debugdir] = 0;
|
||||
+ strcat (debugfile, canon_name + strlen (gdb_sysroot));
|
||||
+ strcat (debugfile, "/");
|
||||
+ strcat (debugfile, basename);
|
||||
+
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
+ goto cleanup_return_debugfile;
|
||||
+ }
|
||||
+
|
||||
+ debugdir = debugdir_end;
|
||||
}
|
||||
+ while (*debugdir != 0);
|
||||
|
||||
xfree (debugfile);
|
||||
debugfile = NULL;
|
||||
@@ -4173,12 +4219,12 @@ Usage: set extension-language .foo bar"),
|
||||
|
||||
add_setshow_optional_filename_cmd ("debug-file-directory", class_support,
|
||||
&debug_file_directory, _("\
|
||||
-Set the directory where separate debug symbols are searched for."), _("\
|
||||
-Show the directory where separate debug symbols are searched for."), _("\
|
||||
+Set the directories where separate debug symbols are searched for."), _("\
|
||||
+Show the directories where separate debug symbols are searched for."), _("\
|
||||
Separate debug symbols are first searched for in the same\n\
|
||||
directory as the binary, then in the `" DEBUG_SUBDIRECTORY "' subdirectory,\n\
|
||||
and lastly at the path of the directory of the binary with\n\
|
||||
-the global debug-file directory prepended."),
|
||||
+each global debug-file-directory component prepended."),
|
||||
NULL,
|
||||
show_debug_file_directory,
|
||||
&setlist, &showlist);
|
||||
--- a/gdb/testsuite/gdb.base/sepdebug.exp
|
||||
+++ b/gdb/testsuite/gdb.base/sepdebug.exp
|
||||
@@ -995,6 +995,12 @@ if ![string compare $build_id_debug_filename ""] then {
|
||||
|
||||
test_different_dir build-id "${objdir}/${subdir}" $xfail
|
||||
|
||||
+ # Test also multiple directories can be specified. Without the build-id
|
||||
+ # reference GDB would find the separate debug info just at the same
|
||||
+ # location as the executable file.
|
||||
+
|
||||
+ test_different_dir multiple-dirs "/doesnotexist:${objdir}/${subdir}" $xfail
|
||||
+
|
||||
# Spare debug files may confuse testsuite runs in the future.
|
||||
remote_exec build "rm -f ${objdir}/${subdir}/${build_id_debug_filename}"
|
||||
}
|
||||
|
151
gdb-bz528668-symfile-sepcrc.patch
Normal file
151
gdb-bz528668-symfile-sepcrc.patch
Normal file
@ -0,0 +1,151 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-10/msg00507.html
|
||||
Subject: [patch 1/3] print the .debug file name having CRC mismatch
|
||||
|
||||
Hi,
|
||||
|
||||
this patch is left as is from Andrew Cagney.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2005-04-02 Andrew Cagney <cagney@gnu.org>
|
||||
|
||||
* symfile.c (separate_debug_file_exists): When the CRCs mismatch
|
||||
print a warning.
|
||||
(find_separate_debug_file): Pass in the objfile's name.
|
||||
|
||||
gdb/testsuite/
|
||||
2009-10-21 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.base/sepdebug.exp (CRC mismatch is reported): New test.
|
||||
* gdb.base/sepdebug2.c: New file.
|
||||
|
||||
--- a/gdb/symfile.c
|
||||
+++ b/gdb/symfile.c
|
||||
@@ -1283,7 +1283,8 @@ get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
|
||||
}
|
||||
|
||||
static int
|
||||
-separate_debug_file_exists (const char *name, unsigned long crc)
|
||||
+separate_debug_file_exists (const char *name, unsigned long crc,
|
||||
+ const char *parent_name)
|
||||
{
|
||||
unsigned long file_crc = 0;
|
||||
bfd *abfd;
|
||||
@@ -1303,7 +1304,15 @@ separate_debug_file_exists (const char *name, unsigned long crc)
|
||||
|
||||
bfd_close (abfd);
|
||||
|
||||
- return crc == file_crc;
|
||||
+ if (crc != file_crc)
|
||||
+ {
|
||||
+ warning (_("the debug information found in \"%s\""
|
||||
+ " does not match \"%s\" (CRC mismatch).\n"),
|
||||
+ name, parent_name);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
char *debug_file_directory = NULL;
|
||||
@@ -1355,6 +1364,8 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
basename = get_debug_link_info (objfile, &crc32);
|
||||
|
||||
if (basename == NULL)
|
||||
+ /* There's no separate debug info, hence there's no way we could
|
||||
+ load it => no warning. */
|
||||
return NULL;
|
||||
|
||||
dir = xstrdup (objfile->name);
|
||||
@@ -1388,7 +1399,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcpy (debugfile, dir);
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1402,7 +1413,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcat (debugfile, "/");
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1416,7 +1427,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcat (debugfile, dir);
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (basename);
|
||||
xfree (dir);
|
||||
@@ -1435,7 +1446,7 @@ find_separate_debug_file (struct objfile *objfile)
|
||||
strcat (debugfile, "/");
|
||||
strcat (debugfile, basename);
|
||||
|
||||
- if (separate_debug_file_exists (debugfile, crc32))
|
||||
+ if (separate_debug_file_exists (debugfile, crc32, objfile->name))
|
||||
{
|
||||
xfree (canon_name);
|
||||
xfree (basename);
|
||||
--- a/gdb/testsuite/gdb.base/sepdebug.exp
|
||||
+++ b/gdb/testsuite/gdb.base/sepdebug.exp
|
||||
@@ -952,6 +952,23 @@ set debugfile "${objdir}/${subdir}/${testfile}.debug"
|
||||
test_different_dir debuglink "${objdir}/${subdir}" 0
|
||||
|
||||
|
||||
+# Test CRC mismatch is reported.
|
||||
+
|
||||
+if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1
|
||||
+ && ![gdb_gnu_strip_debug ${objdir}/${subdir}/sepdebug2]} {
|
||||
+
|
||||
+ remote_exec build "cp ${debugfile} ${objdir}/${subdir}/.debug/sepdebug2.debug"
|
||||
+
|
||||
+ gdb_exit
|
||||
+ gdb_start
|
||||
+ gdb_reinitialize_dir $srcdir/$subdir
|
||||
+
|
||||
+ set escapedobjdirsubdir [string_to_regexp ${objdir}/${subdir}]
|
||||
+
|
||||
+ gdb_test "file ${objdir}/${subdir}/sepdebug2" "warning: the debug information found in \"${escapedobjdirsubdir}/\\.debug/sepdebug2\\.debug\" does not match \"${escapedobjdirsubdir}/sepdebug2\" \\(CRC mismatch\\)\\..*\\(no debugging symbols found\\).*" "CRC mismatch is reported"
|
||||
+}
|
||||
+
|
||||
+
|
||||
# NT_GNU_BUILD_ID / .note.gnu.build-id test:
|
||||
|
||||
set build_id_debug_filename [build_id_debug_filename_get $binfile]
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/sepdebug2.c
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2009 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/>. */
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
|
115
gdb-bz533176-fortran-omp-step.patch
Normal file
115
gdb-bz533176-fortran-omp-step.patch
Normal file
@ -0,0 +1,115 @@
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=533176#c4
|
||||
|
||||
I find it a bug in DWARF and gdb behaves correctly according to it. From the
|
||||
current DWARF's point of view the is a function call which you skip by "next".
|
||||
|
||||
If you hide any /usr/lib/debug such as using:
|
||||
gdb -nx -ex 'set debug-file-directory /qwe' -ex 'file ./tpcommon_gfortran44'
|
||||
and use "step" command instead of "next" there it will work.
|
||||
(You need to hide debuginfo from libgomp as you would step into libgomp sources
|
||||
to maintain the threads for execution.)
|
||||
|
||||
There should be some DWARF extension for it, currently tried to detect
|
||||
substring ".omp_fn." as this function is called "MAIN__.omp_fn.0" and do not
|
||||
consider such sub-function as a skippable by "next".
|
||||
|
||||
Another problem is that with "set scheduler-locking" being "off" (default
|
||||
upstream) or "step" (default in F/RHEL) the simultaneous execution of the
|
||||
threads is inconvenient. Setting it to "on" will lockup the debugging as the
|
||||
threads need to get synchronized at some point. This is a more general
|
||||
debugging problem of GOMP outside of the scope of this Bug.
|
||||
|
||||
|
||||
|
||||
--- ./gdb/infrun.c 2009-12-09 22:03:33.000000000 +0100
|
||||
+++ ./gdb/infrun.c 2009-12-09 22:29:56.000000000 +0100
|
||||
@@ -3994,6 +3994,12 @@ infrun: not switching back to stepped th
|
||||
|
||||
if (ecs->event_thread->step_over_calls == STEP_OVER_ALL)
|
||||
{
|
||||
+ struct symbol *stop_fn = find_pc_function (stop_pc);
|
||||
+
|
||||
+ if (stop_fn == NULL
|
||||
+ || strstr (SYMBOL_LINKAGE_NAME (stop_fn), ".omp_fn.") == NULL)
|
||||
+{ /* ".omp_fn." */
|
||||
+
|
||||
/* We're doing a "next".
|
||||
|
||||
Normal (forward) execution: set a breakpoint at the
|
||||
@@ -4020,6 +4026,7 @@ infrun: not switching back to stepped th
|
||||
|
||||
keep_going (ecs);
|
||||
return;
|
||||
+} /* ".omp_fn." */
|
||||
}
|
||||
|
||||
/* If we are in a function call trampoline (a stub between the
|
||||
--- ./gdb/testsuite/gdb.fortran/omp-step.exp 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/omp-step.exp 2009-12-09 22:31:04.000000000 +0100
|
||||
@@ -0,0 +1,31 @@
|
||||
+# Copyright 2009 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/>.
|
||||
+
|
||||
+set testfile "omp-step"
|
||||
+set srcfile ${testfile}.f90
|
||||
+if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77 additional_flags=-fopenmp}] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if ![runto [gdb_get_line_number "start-here"]] {
|
||||
+ perror "Couldn't run to start-here"
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+gdb_test "next" {!\$omp parallel} "step closer"
|
||||
+gdb_test "next" {a\(omp_get_thread_num\(\) \+ 1\) = 1} "step into omp"
|
||||
+
|
||||
+gdb_breakpoint [gdb_get_line_number "success"]
|
||||
+gdb_continue_to_breakpoint "success" ".*success.*"
|
||||
--- ./gdb/testsuite/gdb.fortran/omp-step.f90 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/omp-step.f90 2009-12-09 22:25:35.000000000 +0100
|
||||
@@ -0,0 +1,32 @@
|
||||
+! Copyright 2009 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/>.
|
||||
+
|
||||
+ use omp_lib
|
||||
+ integer nthreads, i, a(1000)
|
||||
+ nthreads = omp_get_num_threads()
|
||||
+ if (nthreads .gt. 1000) call abort
|
||||
+
|
||||
+ do i = 1, nthreads
|
||||
+ a(i) = 0
|
||||
+ end do
|
||||
+ print *, "start-here"
|
||||
+!$omp parallel
|
||||
+ a(omp_get_thread_num() + 1) = 1
|
||||
+!$omp end parallel
|
||||
+ do i = 1, nthreads
|
||||
+ if (a(i) .ne. 1) call abort
|
||||
+ end do
|
||||
+ print *, "success"
|
||||
+ end
|
317
gdb-bz538626-bp_location-accel-bp-cond.patch
Normal file
317
gdb-bz538626-bp_location-accel-bp-cond.patch
Normal file
@ -0,0 +1,317 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-12/msg00180.html
|
||||
Subject: [patch] Fix a regression by me on breakpoint-cond-infcall
|
||||
|
||||
Hi,
|
||||
|
||||
GDB has now a regression since:
|
||||
Re: [patch] Performance optimize large bp_location count
|
||||
http://sourceware.org/ml/gdb-patches/2009-10/msg00632.html
|
||||
=
|
||||
2009-10-25 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Performance optimize large bp_location count.
|
||||
|
||||
on breakpoints with conditions calling inferior.
|
||||
|
||||
Bringing the code back to the state before my acceleration patch.
|
||||
|
||||
The code before already assumed no breakpoints or their bp_locations can
|
||||
change across the inferior call which should be true - trying to do some:
|
||||
break a if b()
|
||||
break b
|
||||
command 1
|
||||
delete 2
|
||||
end
|
||||
or similar cannot work as inside "if b()" evaluation no breakpoints can be
|
||||
added or removed.
|
||||
|
||||
update_global_location_list also does not removed/add `struct bp_location's
|
||||
themselves but only pointers to them in the bp_location array. As the new
|
||||
iteration no longer uses the bp_location array it is no longer a problem.
|
||||
|
||||
Original problem was found by and fixed differently by Phil Muldoon.
|
||||
|
||||
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-12-13 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* breakpoint.c (bpstat_stop_status): Iterate using ALL_BREAKPOINTS and
|
||||
the B->LOC list. Remove gdb_assert on B. Change bp_hardware_watchpoint
|
||||
continue to break. Remove variable update_locations. Remove HIT_COUNT
|
||||
increment protection by an ENABLE_STATE check. Inline the delayed
|
||||
update_global_location_list call.
|
||||
|
||||
gdb/testsuite/
|
||||
2009-12-13 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Phil Muldoon <pmuldoon@redhat.com>
|
||||
|
||||
* gdb.base/condbreak.exp: Put breakpoint on marker3 and marker4.
|
||||
(bp_location13, bp_location14, bp_location17, bp_location18)
|
||||
(marker3_proto, marker4_proto): New variables.
|
||||
(breakpoint info): Update output.
|
||||
(run until breakpoint at marker3, run until breakpoint at marker4): New
|
||||
tests.
|
||||
|
||||
[ Backported for F-12. ]
|
||||
|
||||
--- ./gdb/breakpoint.c 2009-12-14 00:25:55.000000000 +0100
|
||||
+++ ./gdb/breakpoint.c 2009-12-14 00:32:32.000000000 +0100
|
||||
@@ -3298,93 +3298,93 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
|
||||
/* Pointer to the last thing in the chain currently. */
|
||||
bpstat bs = root_bs;
|
||||
int ix;
|
||||
- int need_remove_insert, update_locations = 0;
|
||||
+ int need_remove_insert;
|
||||
|
||||
- ALL_BP_LOCATIONS (bl, blp_tmp)
|
||||
- {
|
||||
- bpstat bs_prev = bs;
|
||||
+ /* ALL_BP_LOCATIONS iteration would break across
|
||||
+ update_global_location_list possibly executed by
|
||||
+ bpstat_check_breakpoint_conditions's inferior call. */
|
||||
|
||||
- b = bl->owner;
|
||||
- gdb_assert (b);
|
||||
- if (!breakpoint_enabled (b) && b->enable_state != bp_permanent)
|
||||
- continue;
|
||||
-
|
||||
- /* For hardware watchpoints, we look only at the first location.
|
||||
- The watchpoint_check function will work on entire expression,
|
||||
- not the individual locations. For read watchopints, the
|
||||
- watchpoints_triggered function have checked all locations
|
||||
- alrea
|
||||
- */
|
||||
- if (b->type == bp_hardware_watchpoint && bl != b->loc)
|
||||
- continue;
|
||||
-
|
||||
- if (!bpstat_check_location (bl, bp_addr))
|
||||
- continue;
|
||||
-
|
||||
- /* Come here if it's a watchpoint, or if the break address matches */
|
||||
-
|
||||
- bs = bpstat_alloc (bl, bs); /* Alloc a bpstat to explain stop */
|
||||
- gdb_assert (bs_prev->next == bs);
|
||||
-
|
||||
- /* Assume we stop. Should we find watchpoint that is not actually
|
||||
- triggered, or if condition of breakpoint is false, we'll reset
|
||||
- 'stop' to 0. */
|
||||
- bs->stop = 1;
|
||||
- bs->print = 1;
|
||||
+ ALL_BREAKPOINTS (b)
|
||||
+ {
|
||||
+ if (!breakpoint_enabled (b) && b->enable_state != bp_permanent)
|
||||
+ continue;
|
||||
|
||||
- if (!bpstat_check_watchpoint (bs))
|
||||
- {
|
||||
- /* Ensure bpstat_explains_signal stays false if this BL could not be
|
||||
- the cause of this trap. */
|
||||
+ for (bl = b->loc; bl != NULL; bl = bl->next)
|
||||
+ {
|
||||
+ bpstat bs_prev = bs;
|
||||
+
|
||||
+ /* For hardware watchpoints, we look only at the first location.
|
||||
+ The watchpoint_check function will work on entire expression,
|
||||
+ not the individual locations. For read watchopints, the
|
||||
+ watchpoints_triggered function have checked all locations
|
||||
+ alrea
|
||||
+ */
|
||||
+ if (b->type == bp_hardware_watchpoint && bl != b->loc)
|
||||
+ break;
|
||||
|
||||
- gdb_assert (bs->print_it == print_it_noop);
|
||||
- gdb_assert (!bs->stop);
|
||||
- xfree (bs);
|
||||
- bs = bs_prev;
|
||||
- bs->next = NULL;
|
||||
- continue;
|
||||
- }
|
||||
+ if (!bpstat_check_location (bl, bp_addr))
|
||||
+ continue;
|
||||
|
||||
- if (b->type == bp_thread_event || b->type == bp_overlay_event
|
||||
- || b->type == bp_longjmp_master || b->type == bp_exception_master)
|
||||
- /* We do not stop for these. */
|
||||
- bs->stop = 0;
|
||||
- else
|
||||
- bpstat_check_breakpoint_conditions (bs, ptid);
|
||||
-
|
||||
- if (bs->stop)
|
||||
- {
|
||||
- if (b->enable_state != bp_disabled)
|
||||
- ++(b->hit_count);
|
||||
+ /* Come here if it's a watchpoint, or if the break address matches */
|
||||
|
||||
- /* We will stop here */
|
||||
- if (b->disposition == disp_disable)
|
||||
- {
|
||||
- if (b->enable_state != bp_permanent)
|
||||
- b->enable_state = bp_disabled;
|
||||
- update_locations = 1;
|
||||
- }
|
||||
- if (b->silent)
|
||||
- bs->print = 0;
|
||||
- bs->commands = b->commands;
|
||||
- if (bs->commands
|
||||
- && (strcmp ("silent", bs->commands->line) == 0
|
||||
- || (xdb_commands && strcmp ("Q", bs->commands->line) == 0)))
|
||||
- {
|
||||
- bs->commands = bs->commands->next;
|
||||
- bs->print = 0;
|
||||
- }
|
||||
- bs->commands = copy_command_lines (bs->commands);
|
||||
- }
|
||||
+ bs = bpstat_alloc (bl, bs); /* Alloc a bpstat to explain stop */
|
||||
+ gdb_assert (bs_prev->next == bs);
|
||||
|
||||
- /* Print nothing for this entry if we dont stop or if we dont print. */
|
||||
- if (bs->stop == 0 || bs->print == 0)
|
||||
- bs->print_it = print_it_noop;
|
||||
- }
|
||||
+ /* Assume we stop. Should we find watchpoint that is not actually
|
||||
+ triggered, or if condition of breakpoint is false, we'll reset
|
||||
+ 'stop' to 0. */
|
||||
+ bs->stop = 1;
|
||||
+ bs->print = 1;
|
||||
|
||||
- /* Delay this call which would break the ALL_BP_LOCATIONS iteration above. */
|
||||
- if (update_locations)
|
||||
- update_global_location_list (0);
|
||||
+ if (!bpstat_check_watchpoint (bs))
|
||||
+ {
|
||||
+ /* Ensure bpstat_explains_signal stays false if this BL could not be
|
||||
+ the cause of this trap. */
|
||||
+
|
||||
+ gdb_assert (bs->print_it == print_it_noop);
|
||||
+ gdb_assert (!bs->stop);
|
||||
+ xfree (bs);
|
||||
+ bs = bs_prev;
|
||||
+ bs->next = NULL;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (b->type == bp_thread_event || b->type == bp_overlay_event
|
||||
+ || b->type == bp_longjmp_master || b->type == bp_exception_master)
|
||||
+ /* We do not stop for these. */
|
||||
+ bs->stop = 0;
|
||||
+ else
|
||||
+ bpstat_check_breakpoint_conditions (bs, ptid);
|
||||
+
|
||||
+ if (bs->stop)
|
||||
+ {
|
||||
+ ++(b->hit_count);
|
||||
+
|
||||
+ /* We will stop here */
|
||||
+ if (b->disposition == disp_disable)
|
||||
+ {
|
||||
+ if (b->enable_state != bp_permanent)
|
||||
+ b->enable_state = bp_disabled;
|
||||
+ update_global_location_list (0);
|
||||
+ }
|
||||
+ if (b->silent)
|
||||
+ bs->print = 0;
|
||||
+ bs->commands = b->commands;
|
||||
+ if (bs->commands
|
||||
+ && (strcmp ("silent", bs->commands->line) == 0
|
||||
+ || (xdb_commands && strcmp ("Q", bs->commands->line) == 0)))
|
||||
+ {
|
||||
+ bs->commands = bs->commands->next;
|
||||
+ bs->print = 0;
|
||||
+ }
|
||||
+ bs->commands = copy_command_lines (bs->commands);
|
||||
+ }
|
||||
+
|
||||
+ /* Print nothing for this entry if we dont stop or if we dont print. */
|
||||
+ if (bs->stop == 0 || bs->print == 0)
|
||||
+ bs->print_it = print_it_noop;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
for (ix = 0; VEC_iterate (bp_location_p, moribund_locations, ix, loc); ++ix)
|
||||
{
|
||||
--- ./gdb/testsuite/gdb.base/condbreak.exp 2009-01-03 06:58:03.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.base/condbreak.exp 2009-12-14 00:27:21.000000000 +0100
|
||||
@@ -68,8 +68,12 @@ set bp_location1 [gdb_get_line_number "
|
||||
set bp_location6 [gdb_get_line_number "set breakpoint 6 here"]
|
||||
set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile1]
|
||||
set bp_location9 [gdb_get_line_number "set breakpoint 9 here" $srcfile1]
|
||||
+set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile1]
|
||||
+set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile1]
|
||||
set bp_location15 [gdb_get_line_number "set breakpoint 15 here" $srcfile1]
|
||||
set bp_location16 [gdb_get_line_number "set breakpoint 16 here" $srcfile1]
|
||||
+set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile1]
|
||||
+set bp_location18 [gdb_get_line_number "set breakpoint 18 here" $srcfile1]
|
||||
|
||||
#
|
||||
# test break at function
|
||||
@@ -110,15 +114,29 @@ gdb_test "break marker2 if (a==43)" \
|
||||
"Breakpoint.*at.* file .*$srcfile1, line.*"
|
||||
|
||||
#
|
||||
+# Check break involving inferior function call.
|
||||
+# Ensure there is at least one additional breakpoint with higher VMA.
|
||||
+#
|
||||
+gdb_test "break marker3 if (multi_line_if_conditional(1,1,1)==0)" \
|
||||
+ "Breakpoint.*at.* file .*$srcfile1, line.*"
|
||||
+gdb_test "break marker4" \
|
||||
+ "Breakpoint.*at.* file .*$srcfile1, line.*"
|
||||
+
|
||||
+#
|
||||
# check to see what breakpoints are set
|
||||
#
|
||||
|
||||
if {$hp_aCC_compiler} {
|
||||
set marker1_proto "\\(void\\)"
|
||||
set marker2_proto "\\(int\\)"
|
||||
+ # Not checked.
|
||||
+ set marker3_proto "\\(char \\*, char \\*\\)"
|
||||
+ set marker4_proto "\\(long\\)"
|
||||
} else {
|
||||
set marker1_proto ""
|
||||
set marker2_proto ""
|
||||
+ set marker3_proto ""
|
||||
+ set marker4_proto ""
|
||||
}
|
||||
|
||||
gdb_test "info break" \
|
||||
@@ -129,7 +147,10 @@ gdb_test "info break" \
|
||||
\[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location1.*
|
||||
\[\t \]+stop only if \\(1==1\\).*
|
||||
\[0-9\]+\[\t \]+breakpoint keep y.* in marker2$marker2_proto at .*$srcfile1:($bp_location8|$bp_location9).*
|
||||
-\[\t \]+stop only if \\(a==43\\).*" \
|
||||
+\[\t \]+stop only if \\(a==43\\).*
|
||||
+\[0-9\]+\[\t \]+breakpoint keep y.* in marker3$marker3_proto at .*$srcfile1:($bp_location17|$bp_location18).*
|
||||
+\[\t \]+stop only if \\(multi_line_if_conditional\\(1,1,1\\)==0\\).*
|
||||
+\[0-9\]+\[\t \]+breakpoint keep y.* in marker4$marker4_proto at .*$srcfile1:($bp_location13|$bp_location14).*" \
|
||||
"breakpoint info"
|
||||
|
||||
|
||||
@@ -220,3 +241,23 @@ gdb_expect {
|
||||
fail "(timeout) run until breakpoint at marker2"
|
||||
}
|
||||
}
|
||||
+
|
||||
+set test "run until breakpoint at marker3"
|
||||
+gdb_test_multiple "continue" $test {
|
||||
+ -re "Continuing\\..*Breakpoint \[0-9\]+, marker3 \\(a=$hex \"stack\", b=$hex \"trace\"\\) at .*$srcfile1:($bp_location17|$bp_location18).*($bp_location17|$bp_location18)\[\t \]+.*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+ -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker3 \\(a=$hex \"stack\", b=$hex \"trace\"\\) at .*$srcfile1:($bp_location17|$bp_location18).*($bp_location17|$bp_location18)\[\t \]+.*$gdb_prompt $" {
|
||||
+ xfail $test
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+set test "run until breakpoint at marker4"
|
||||
+gdb_test_multiple "continue" $test {
|
||||
+ -re "Continuing\\..*Breakpoint \[0-9\]+, marker4 \\(d=177601976\\) at .*$srcfile1:($bp_location13|$bp_location14).*($bp_location13|$bp_location14)\[\t \]+.*$gdb_prompt $" {
|
||||
+ pass $test
|
||||
+ }
|
||||
+ -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker4 \\(d=177601976\\) at .*$srcfile1:($bp_location13|$bp_location14).*($bp_location13|$bp_location14)\[\t \]+.*$gdb_prompt $" {
|
||||
+ xfail $test
|
||||
+ }
|
||||
+}
|
511
gdb-bz539590-gnu-ifunc.patch
Normal file
511
gdb-bz539590-gnu-ifunc.patch
Normal file
@ -0,0 +1,511 @@
|
||||
gdb/
|
||||
2009-11-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Transparent GNU-IFUNCs support.
|
||||
* elfread.c (record_minimal_symbol): Apply also for mst_text_gnu_ifunc.
|
||||
(elf_symtab_read): Set also mst_text_gnu_ifunc.
|
||||
* gdbtypes.c (init_type): Support TYPE_FLAG_GNU_IFUNC.
|
||||
(gdbtypes_post_init): Initialize builtin_func_func_ptr.
|
||||
(objfile_type): Initialize nodebug_text_gnu_ifunc_symbol.
|
||||
* gdbtypes.h (enum type_flag_value <TYPE_FLAG_GNU_IFUNC>)
|
||||
(TYPE_GNU_IFUNC, struct main_type <flag_gnu_ifunc>)
|
||||
(struct builtin_type <builtin_func_func_ptr>)
|
||||
(struct objfile_type <nodebug_text_gnu_ifunc_symbol>): New.
|
||||
* infcall.c (find_function_addr <TYPE_GNU_IFUNC (ftype)>): New.
|
||||
* minsyms.c (lookup_minimal_symbol_text, prim_record_minimal_symbol)
|
||||
(find_solib_trampoline_target): Support also mst_text_gnu_ifunc.
|
||||
(in_gnu_ifunc_stub): New.
|
||||
* parse.c (write_exp_msymbol <mst_text_gnu_ifunc>): New.
|
||||
* solib-svr4.c (svr4_in_dynsym_resolve_code): Call also
|
||||
in_gnu_ifunc_stub.
|
||||
* symmisc.c (dump_msymbols <mst_text_gnu_ifunc>): New.
|
||||
* symtab.c (search_symbols): Support also mst_text_gnu_ifunc.
|
||||
* symtab.h (enum minimal_symbol_type <mst_text_gnu_ifunc>)
|
||||
(in_gnu_ifunc_stub): New.
|
||||
* linespec.c: Include infcall.h.
|
||||
(minsym_found <MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc>): New.
|
||||
|
||||
gdb/testsuite/
|
||||
2009-11-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Transparent GNU-IFUNCs support.
|
||||
* gdb.base/gnu-ifunc-lib.c, gdb.base/gnu-ifunc.c,
|
||||
gdb.base/gnu-ifunc.exp: New.
|
||||
|
||||
Index: gdb-7.0/gdb/elfread.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/elfread.c 2009-11-25 10:24:45.000000000 +0100
|
||||
+++ gdb-7.0/gdb/elfread.c 2009-11-25 10:25:50.000000000 +0100
|
||||
@@ -168,7 +168,8 @@ record_minimal_symbol (char *name, CORE_
|
||||
{
|
||||
struct gdbarch *gdbarch = get_objfile_arch (objfile);
|
||||
|
||||
- if (ms_type == mst_text || ms_type == mst_file_text)
|
||||
+ if (ms_type == mst_text || ms_type == mst_file_text
|
||||
+ || ms_type == mst_text_gnu_ifunc)
|
||||
address = gdbarch_smash_text_address (gdbarch, address);
|
||||
|
||||
return prim_record_minimal_symbol_and_info
|
||||
@@ -373,7 +374,10 @@ elf_symtab_read (struct objfile *objfile
|
||||
{
|
||||
if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
|
||||
{
|
||||
- ms_type = mst_text;
|
||||
+ if (sym->flags & BSF_GNU_INDIRECT_FUNCTION)
|
||||
+ ms_type = mst_text_gnu_ifunc;
|
||||
+ else
|
||||
+ ms_type = mst_text;
|
||||
}
|
||||
else if ((sym->name[0] == '.' && sym->name[1] == 'L')
|
||||
|| ((sym->flags & BSF_LOCAL)
|
||||
Index: gdb-7.0/gdb/gdbtypes.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/gdbtypes.c 2009-11-25 10:24:47.000000000 +0100
|
||||
+++ gdb-7.0/gdb/gdbtypes.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -1904,6 +1904,8 @@ init_type (enum type_code code, int leng
|
||||
TYPE_NOTTEXT (type) = 1;
|
||||
if (flags & TYPE_FLAG_FIXED_INSTANCE)
|
||||
TYPE_FIXED_INSTANCE (type) = 1;
|
||||
+ if (flags & TYPE_FLAG_GNU_IFUNC)
|
||||
+ TYPE_GNU_IFUNC (type) = 1;
|
||||
|
||||
if (name)
|
||||
TYPE_NAME (type) = obsavestring (name, strlen (name),
|
||||
@@ -3762,6 +3764,8 @@ gdbtypes_post_init (struct gdbarch *gdba
|
||||
= lookup_pointer_type (builtin_type->builtin_void);
|
||||
builtin_type->builtin_func_ptr
|
||||
= lookup_pointer_type (lookup_function_type (builtin_type->builtin_void));
|
||||
+ builtin_type->builtin_func_func_ptr
|
||||
+ = lookup_pointer_type (lookup_function_type (builtin_type->builtin_func_ptr));
|
||||
|
||||
/* This type represents a GDB internal function. */
|
||||
builtin_type->internal_fn
|
||||
@@ -3878,6 +3882,11 @@ objfile_type (struct objfile *objfile)
|
||||
"<text variable, no debug info>", objfile);
|
||||
TYPE_TARGET_TYPE (objfile_type->nodebug_text_symbol)
|
||||
= objfile_type->builtin_int;
|
||||
+ objfile_type->nodebug_text_gnu_ifunc_symbol
|
||||
+ = init_type (TYPE_CODE_FUNC, 1, TYPE_FLAG_GNU_IFUNC,
|
||||
+ "<text gnu-ifunc variable, no debug info>", objfile);
|
||||
+ TYPE_TARGET_TYPE (objfile_type->nodebug_text_gnu_ifunc_symbol)
|
||||
+ = objfile_type->nodebug_text_symbol;
|
||||
objfile_type->nodebug_data_symbol
|
||||
= init_type (TYPE_CODE_INT,
|
||||
gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
|
||||
Index: gdb-7.0/gdb/gdbtypes.h
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/gdbtypes.h 2009-11-25 10:24:48.000000000 +0100
|
||||
+++ gdb-7.0/gdb/gdbtypes.h 2009-11-25 10:25:17.000000000 +0100
|
||||
@@ -187,6 +187,7 @@ enum type_flag_value
|
||||
TYPE_FLAG_FIXED_INSTANCE = (1 << 15),
|
||||
TYPE_FLAG_STUB_SUPPORTED = (1 << 16),
|
||||
TYPE_FLAG_NOTTEXT = (1 << 17),
|
||||
+ TYPE_FLAG_GNU_IFUNC = (1 << 18),
|
||||
|
||||
/* Used for error-checking. */
|
||||
TYPE_FLAG_MIN = TYPE_FLAG_UNSIGNED
|
||||
@@ -292,6 +293,12 @@ enum type_instance_flag_value
|
||||
|
||||
#define TYPE_NOTTEXT(t) (TYPE_MAIN_TYPE (t)->flag_nottext)
|
||||
|
||||
+/* Currently used only for TYPE_CODE_FUNC where specifies the real function
|
||||
+ address is returned by this function call. TYPE_TARGET_TYPE determines the
|
||||
+ final returned function type to be presented to user. */
|
||||
+
|
||||
+#define TYPE_GNU_IFUNC(t) (TYPE_MAIN_TYPE (t)->flag_gnu_ifunc)
|
||||
+
|
||||
/* Type owner. If TYPE_OBJFILE_OWNED is true, the type is owned by
|
||||
the objfile retrieved as TYPE_OBJFILE. Otherweise, the type is
|
||||
owned by an architecture; TYPE_OBJFILE is NULL in this case. */
|
||||
@@ -427,6 +434,7 @@ struct main_type
|
||||
unsigned int flag_vector : 1;
|
||||
unsigned int flag_stub_supported : 1;
|
||||
unsigned int flag_nottext : 1;
|
||||
+ unsigned int flag_gnu_ifunc : 1;
|
||||
unsigned int flag_fixed_instance : 1;
|
||||
unsigned int flag_objfile_owned : 1;
|
||||
unsigned int flag_discardable : 1;
|
||||
@@ -1144,6 +1152,10 @@ struct builtin_type
|
||||
(*) () can server as a generic function pointer. */
|
||||
struct type *builtin_func_ptr;
|
||||
|
||||
+ /* `pointer to function returning pointer to function (returning void)' type.
|
||||
+ The final void return type is not significant for it. */
|
||||
+ struct type *builtin_func_func_ptr;
|
||||
+
|
||||
|
||||
/* Special-purpose types. */
|
||||
|
||||
@@ -1186,6 +1198,7 @@ struct objfile_type
|
||||
|
||||
/* Types used for symbols with no debug information. */
|
||||
struct type *nodebug_text_symbol;
|
||||
+ struct type *nodebug_text_gnu_ifunc_symbol;
|
||||
struct type *nodebug_data_symbol;
|
||||
struct type *nodebug_unknown_symbol;
|
||||
struct type *nodebug_tls_symbol;
|
||||
Index: gdb-7.0/gdb/infcall.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/infcall.c 2009-11-25 10:24:45.000000000 +0100
|
||||
+++ gdb-7.0/gdb/infcall.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -286,6 +286,27 @@ find_function_addr (struct value *functi
|
||||
else
|
||||
error (_("Invalid data type for function to be called."));
|
||||
|
||||
+ if (TYPE_GNU_IFUNC (ftype))
|
||||
+ {
|
||||
+ struct type *func_func_ptr;
|
||||
+
|
||||
+ funaddr += gdbarch_deprecated_function_start_offset (gdbarch);
|
||||
+
|
||||
+ /* Cast FUNADDR to drop TYPE_GNU_IFUNC and being able to call gnu-ifunc
|
||||
+ FUNADDR without causing deadlock by this block of code. */
|
||||
+
|
||||
+ func_func_ptr = builtin_type (gdbarch)->builtin_func_func_ptr;
|
||||
+ function = value_from_pointer (func_func_ptr, funaddr);
|
||||
+
|
||||
+ /* gnu-ifuncs have no arguments. */
|
||||
+ function = call_function_by_hand (function, 0, NULL);
|
||||
+
|
||||
+ funaddr = value_as_address (function);
|
||||
+
|
||||
+ /* This is `int' as the return type of the final function. */
|
||||
+ value_type = TYPE_TARGET_TYPE (value_type);
|
||||
+ }
|
||||
+
|
||||
if (retval_type != NULL)
|
||||
*retval_type = value_type;
|
||||
return funaddr + gdbarch_deprecated_function_start_offset (gdbarch);
|
||||
Index: gdb-7.0/gdb/linespec.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/linespec.c 2009-11-25 10:24:45.000000000 +0100
|
||||
+++ gdb-7.0/gdb/linespec.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "interps.h"
|
||||
#include "mi/mi-cmds.h"
|
||||
#include "target.h"
|
||||
+#include "infcall.h"
|
||||
|
||||
/* We share this one with symtab.c, but it is not exported widely. */
|
||||
|
||||
@@ -1875,6 +1876,22 @@ minsym_found (int funfirstline, struct m
|
||||
pc = gdbarch_convert_from_func_ptr_addr (gdbarch,
|
||||
values.sals[0].pc,
|
||||
¤t_target);
|
||||
+
|
||||
+ /* Call gnu-ifunc to resolve breakpoint at its returned function. */
|
||||
+ if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
|
||||
+ {
|
||||
+ struct type *func_func_ptr;
|
||||
+ struct value *function;
|
||||
+
|
||||
+ func_func_ptr = builtin_type (gdbarch)->builtin_func_func_ptr;
|
||||
+ function = value_from_pointer (func_func_ptr, pc);
|
||||
+
|
||||
+ /* gnu-ifuncs have no arguments. */
|
||||
+ function = call_function_by_hand (function, 0, NULL);
|
||||
+
|
||||
+ pc = value_as_address (function);
|
||||
+ }
|
||||
+
|
||||
if (pc != values.sals[0].pc)
|
||||
values.sals[0] = find_pc_sect_line (pc, NULL, 0);
|
||||
|
||||
Index: gdb-7.0/gdb/minsyms.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/minsyms.c 2009-11-25 10:24:47.000000000 +0100
|
||||
+++ gdb-7.0/gdb/minsyms.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -331,8 +331,9 @@ lookup_minimal_symbol_text (const char *
|
||||
msymbol = msymbol->hash_next)
|
||||
{
|
||||
if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
|
||||
- (MSYMBOL_TYPE (msymbol) == mst_text ||
|
||||
- MSYMBOL_TYPE (msymbol) == mst_file_text))
|
||||
+ (MSYMBOL_TYPE (msymbol) == mst_text
|
||||
+ || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
|
||||
+ || MSYMBOL_TYPE (msymbol) == mst_file_text))
|
||||
{
|
||||
switch (MSYMBOL_TYPE (msymbol))
|
||||
{
|
||||
@@ -699,6 +700,16 @@ lookup_minimal_symbol_by_pc (CORE_ADDR p
|
||||
{
|
||||
return lookup_minimal_symbol_by_pc_section (pc, NULL);
|
||||
}
|
||||
+
|
||||
+/* Return non-zero iff PC is in function implementing gnu-ifunc selection. */
|
||||
+
|
||||
+int
|
||||
+in_gnu_ifunc_stub (CORE_ADDR pc)
|
||||
+{
|
||||
+ struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
|
||||
+
|
||||
+ return msymbol && MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc;
|
||||
+}
|
||||
|
||||
|
||||
/* Return leading symbol character for a BFD. If BFD is NULL,
|
||||
@@ -738,6 +749,7 @@ prim_record_minimal_symbol (const char *
|
||||
switch (ms_type)
|
||||
{
|
||||
case mst_text:
|
||||
+ case mst_text_gnu_ifunc:
|
||||
case mst_file_text:
|
||||
case mst_solib_trampoline:
|
||||
section = SECT_OFF_TEXT (objfile);
|
||||
@@ -1184,7 +1196,8 @@ find_solib_trampoline_target (struct fra
|
||||
{
|
||||
ALL_MSYMBOLS (objfile, msymbol)
|
||||
{
|
||||
- if (MSYMBOL_TYPE (msymbol) == mst_text
|
||||
+ if ((MSYMBOL_TYPE (msymbol) == mst_text
|
||||
+ || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
|
||||
&& strcmp (SYMBOL_LINKAGE_NAME (msymbol),
|
||||
SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
|
||||
return SYMBOL_VALUE_ADDRESS (msymbol);
|
||||
Index: gdb-7.0/gdb/parse.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/parse.c 2009-11-25 10:24:47.000000000 +0100
|
||||
+++ gdb-7.0/gdb/parse.c 2009-11-25 10:26:16.000000000 +0100
|
||||
@@ -517,6 +517,11 @@ write_exp_msymbol (struct minimal_symbol
|
||||
write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol);
|
||||
break;
|
||||
|
||||
+ case mst_text_gnu_ifunc:
|
||||
+ write_exp_elt_type (objfile_type (objfile)
|
||||
+ ->nodebug_text_gnu_ifunc_symbol);
|
||||
+ break;
|
||||
+
|
||||
case mst_data:
|
||||
case mst_file_data:
|
||||
case mst_bss:
|
||||
Index: gdb-7.0/gdb/solib-svr4.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/solib-svr4.c 2009-11-25 10:24:49.000000000 +0100
|
||||
+++ gdb-7.0/gdb/solib-svr4.c 2009-11-25 10:26:41.000000000 +0100
|
||||
@@ -1242,7 +1242,8 @@ svr4_in_dynsym_resolve_code (CORE_ADDR p
|
||||
{
|
||||
return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
|
||||
|| (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
|
||||
- || in_plt_section (pc, NULL));
|
||||
+ || in_plt_section (pc, NULL)
|
||||
+ || in_gnu_ifunc_stub (pc));
|
||||
}
|
||||
|
||||
/* Given an executable's ABFD and target, compute the entry-point
|
||||
Index: gdb-7.0/gdb/symmisc.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/symmisc.c 2009-11-25 10:24:47.000000000 +0100
|
||||
+++ gdb-7.0/gdb/symmisc.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -287,6 +287,9 @@ dump_msymbols (struct objfile *objfile,
|
||||
case mst_text:
|
||||
ms_type = 'T';
|
||||
break;
|
||||
+ case mst_text_gnu_ifunc:
|
||||
+ ms_type = 'i';
|
||||
+ break;
|
||||
case mst_solib_trampoline:
|
||||
ms_type = 'S';
|
||||
break;
|
||||
Index: gdb-7.0/gdb/symtab.c
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/symtab.c 2009-11-25 10:24:47.000000000 +0100
|
||||
+++ gdb-7.0/gdb/symtab.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -3155,7 +3155,7 @@ search_symbols (char *regexp, domain_enu
|
||||
{mst_file_data, mst_solib_trampoline, mst_abs, mst_unknown};
|
||||
static enum minimal_symbol_type types4[]
|
||||
=
|
||||
- {mst_file_bss, mst_text, mst_abs, mst_unknown};
|
||||
+ {mst_file_bss, mst_text_gnu_ifunc, mst_abs, mst_unknown};
|
||||
enum minimal_symbol_type ourtype;
|
||||
enum minimal_symbol_type ourtype2;
|
||||
enum minimal_symbol_type ourtype3;
|
||||
Index: gdb-7.0/gdb/symtab.h
|
||||
===================================================================
|
||||
--- gdb-7.0.orig/gdb/symtab.h 2009-11-25 10:24:45.000000000 +0100
|
||||
+++ gdb-7.0/gdb/symtab.h 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -275,6 +275,8 @@ enum minimal_symbol_type
|
||||
{
|
||||
mst_unknown = 0, /* Unknown type, the default */
|
||||
mst_text, /* Generally executable instructions */
|
||||
+ mst_text_gnu_ifunc, /* Executable code returning address
|
||||
+ of executable code */
|
||||
mst_data, /* Generally initialized data */
|
||||
mst_bss, /* Generally uninitialized data */
|
||||
mst_abs, /* Generally absolute (nonrelocatable) */
|
||||
@@ -1149,6 +1151,8 @@ extern struct minimal_symbol *lookup_min
|
||||
|
||||
extern struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
|
||||
|
||||
+extern int in_gnu_ifunc_stub (CORE_ADDR pc);
|
||||
+
|
||||
extern struct minimal_symbol
|
||||
*lookup_minimal_symbol_by_pc_section (CORE_ADDR, struct obj_section *);
|
||||
|
||||
Index: gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc-lib.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -0,0 +1,45 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2009 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/>. */
|
||||
+
|
||||
+#include <assert.h>
|
||||
+
|
||||
+typedef int (*final_t) (int arg);
|
||||
+
|
||||
+static int
|
||||
+final (int arg)
|
||||
+{
|
||||
+ return arg + 1;
|
||||
+}
|
||||
+
|
||||
+static volatile int gnu_ifunc_initialized;
|
||||
+
|
||||
+void
|
||||
+gnu_ifunc_pre (void)
|
||||
+{
|
||||
+ assert (!gnu_ifunc_initialized);
|
||||
+}
|
||||
+
|
||||
+final_t gnu_ifuncX (void) asm ("gnu_ifunc");
|
||||
+asm (".type gnu_ifunc, @gnu_indirect_function");
|
||||
+
|
||||
+final_t
|
||||
+gnu_ifuncX (void)
|
||||
+{
|
||||
+ gnu_ifunc_initialized = 1;
|
||||
+
|
||||
+ return final;
|
||||
+}
|
||||
Index: gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.c
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.c 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -0,0 +1,36 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2009 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/>. */
|
||||
+
|
||||
+#include <assert.h>
|
||||
+
|
||||
+extern int gnu_ifunc (int arg);
|
||||
+extern void gnu_ifunc_pre (void);
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ gnu_ifunc_pre ();
|
||||
+
|
||||
+ i = gnu_ifunc (1); /* break-at-call */
|
||||
+ assert (i == 2);
|
||||
+
|
||||
+ gnu_ifunc (2); /* break-at-nextcall */
|
||||
+
|
||||
+ return 0; /* break-at-exit */
|
||||
+}
|
||||
Index: gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.exp
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.exp 2009-11-25 10:24:56.000000000 +0100
|
||||
@@ -0,0 +1,72 @@
|
||||
+# Copyright (C) 2009 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/>.
|
||||
+
|
||||
+if {[skip_shlib_tests]} {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+set testfile "gnu-ifunc"
|
||||
+set srcfile ${testfile}.c
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+
|
||||
+set libfile "${testfile}-lib"
|
||||
+set libsrc ${libfile}.c
|
||||
+set lib_so ${objdir}/${subdir}/${libfile}.so
|
||||
+
|
||||
+set lib_opts [list debug]
|
||||
+set exec_opts [list debug shlib=$lib_so]
|
||||
+
|
||||
+if [get_compiler_info ${binfile}] {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if { [gdb_compile_shlib ${srcdir}/${subdir}/$libsrc $lib_so $lib_opts] != ""
|
||||
+ || [gdb_compile ${srcdir}/${subdir}/$srcfile $binfile executable $exec_opts] != ""} {
|
||||
+ untested "Could not compile either $libsrc or $srcfile."
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+# Start with a fresh gdb.
|
||||
+
|
||||
+clean_restart $testfile
|
||||
+gdb_load_shlibs ${lib_so}
|
||||
+
|
||||
+if ![runto_main] then {
|
||||
+ fail "Can't run to main"
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+gdb_breakpoint [gdb_get_line_number "break-at-nextcall"]
|
||||
+
|
||||
+gdb_breakpoint [gdb_get_line_number "break-at-call"]
|
||||
+gdb_continue_to_breakpoint "break-at-call" ".*break-at-call.*"
|
||||
+
|
||||
+# Test GDB will automatically indirect the call.
|
||||
+
|
||||
+gdb_test "p gnu_ifunc (3)" " = 4"
|
||||
+
|
||||
+# Test GDB will skip the gnu_ifunc resolver on first call.
|
||||
+
|
||||
+gdb_test "step" "\r\nfinal .*"
|
||||
+
|
||||
+# Test GDB will not break before the final chosen implementation.
|
||||
+
|
||||
+gdb_continue_to_breakpoint "break-at-nextcall" ".*break-at-nextcall.*"
|
||||
+
|
||||
+gdb_breakpoint "gnu_ifunc"
|
||||
+
|
||||
+gdb_continue_to_breakpoint "nextcall gnu_ifunc"
|
||||
+
|
||||
+gdb_test "frame" "#0 +final \\(.*" "nextcall gnu_ifunc skipped"
|
82
gdb-core-open-vdso-warning.patch
Normal file
82
gdb-core-open-vdso-warning.patch
Normal file
@ -0,0 +1,82 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-10/msg00142.html
|
||||
Subject: [patch] Fix GNU/Linux core open: Can't read pathname for load map: Input/output error.
|
||||
|
||||
Hi,
|
||||
|
||||
GDB currently always prints on loading a core file:
|
||||
warning: Can't read pathname for load map: Input/output error.
|
||||
|
||||
The patch is not nice but it was WONTFIXed on the glibc side in:
|
||||
http://sourceware.org/ml/libc-alpha/2009-10/msg00001.html
|
||||
|
||||
The same message in GDB PR 8882 and glibc PR 387 was for ld-linux.so.2 l_name
|
||||
but that one is now ignored thanks to IGNORE_FIRST_LINK_MAP_ENTRY.
|
||||
|
||||
This fix is intended for Linux system vDSO l_name which is a second entry in
|
||||
the DSO list.
|
||||
|
||||
Regression tested on {x86_86,x86_64-m32,i686}-fedora11-linux-gnu.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-10-06 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Do not print false warning on reading core file with vDSO on GNU/Linux.
|
||||
* solib-svr4.c (svr4_current_sos): Suppress the warning if
|
||||
MASTER_SO_LIST is still NULL.
|
||||
* solib.c (update_solib_list): New variable saved_so_list_head.
|
||||
Conditionally restart the function.
|
||||
|
||||
[ Context backport. ]
|
||||
|
||||
--- a/gdb/solib-svr4.c
|
||||
+++ b/gdb/solib-svr4.c
|
||||
@@ -1097,8 +1097,18 @@ svr4_current_sos (void)
|
||||
target_read_string (LM_NAME (new), &buffer,
|
||||
SO_NAME_MAX_PATH_SIZE - 1, &errcode);
|
||||
if (errcode != 0)
|
||||
- warning (_("Can't read pathname for load map: %s."),
|
||||
- safe_strerror (errcode));
|
||||
+ {
|
||||
+ /* During the first ever DSO list reading some strings may be
|
||||
+ unreadable as residing in the ld.so readonly memory not being
|
||||
+ present in a dumped core file. Delay the error check after
|
||||
+ the first pass of DSO list scanning when ld.so should be
|
||||
+ already mapped in and all the DSO list l_name memory gets
|
||||
+ readable. */
|
||||
+
|
||||
+ if (master_so_list () != NULL)
|
||||
+ warning (_("Can't read pathname for load map: %s."),
|
||||
+ safe_strerror (errcode));
|
||||
+ }
|
||||
else
|
||||
{
|
||||
struct build_id *build_id;
|
||||
--- a/gdb/solib.c
|
||||
+++ b/gdb/solib.c
|
||||
@@ -538,6 +538,7 @@ update_solib_list (int from_tty, struct target_ops *target)
|
||||
struct target_so_ops *ops = solib_ops (target_gdbarch);
|
||||
struct so_list *inferior = ops->current_sos();
|
||||
struct so_list *gdb, **gdb_link;
|
||||
+ struct so_list *saved_so_list_head = so_list_head;
|
||||
|
||||
/* We can reach here due to changing solib-search-path or the
|
||||
sysroot, before having any inferior. */
|
||||
@@ -668,6 +669,12 @@ update_solib_list (int from_tty, struct target_ops *target)
|
||||
observer_notify_solib_loaded (i);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ /* If this was the very first DSO list scan and we possibly read in ld.so
|
||||
+ recheck all the formerly unreadable DSO names strings. */
|
||||
+
|
||||
+ if (saved_so_list_head == NULL && so_list_head != NULL)
|
||||
+ update_solib_list (from_tty, target);
|
||||
}
|
||||
|
||||
|
||||
|
204
gdb-empty-namespace.patch
Normal file
204
gdb-empty-namespace.patch
Normal file
@ -0,0 +1,204 @@
|
||||
gdb/
|
||||
2009-12-20 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Fix compatibility with G++-4.1.
|
||||
* dwarf2read.c (partial_die_parent_scope): New variable PARENT_NAME.
|
||||
Ignore parent namespaces with name "::".
|
||||
(physname_prefix_1): Ignore namespaces with name "::".
|
||||
|
||||
gdb/testsuite/
|
||||
2009-12-20 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.dwarf2/dw2-empty-namespace.exp, gdb.dwarf2/dw2-empty-namespace.S:
|
||||
New.
|
||||
|
||||
--- a/gdb/dwarf2read.c
|
||||
+++ b/gdb/dwarf2read.c
|
||||
@@ -2355,11 +2355,18 @@ partial_die_parent_scope (struct partial_die_info *pdi,
|
||||
|| parent->tag == DW_TAG_interface_type
|
||||
|| parent->tag == DW_TAG_union_type)
|
||||
{
|
||||
+ char *parent_name = parent->name;
|
||||
+
|
||||
+ /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::". */
|
||||
+ if (parent->tag == DW_TAG_namespace && parent_name != NULL
|
||||
+ && strcmp (parent_name, "::") == 0)
|
||||
+ parent_name = NULL;
|
||||
+
|
||||
if (grandparent_scope == NULL)
|
||||
- parent->scope = parent->name;
|
||||
+ parent->scope = parent_name;
|
||||
else
|
||||
parent->scope = typename_concat (&cu->comp_unit_obstack, grandparent_scope,
|
||||
- parent->name, cu);
|
||||
+ parent_name, cu);
|
||||
}
|
||||
else if (parent->tag == DW_TAG_enumeration_type)
|
||||
/* Enumerators should not get the name of the enumeration as a prefix. */
|
||||
@@ -9008,6 +9015,9 @@ physname_prefix_1 (struct ui_file *buf, struct die_info *die,
|
||||
name = dwarf2_name (die, cu);
|
||||
if (name == NULL)
|
||||
name = "(anonymous namespace)";
|
||||
+ /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::". */
|
||||
+ else if (strcmp (name, "::") == 0)
|
||||
+ name = NULL;
|
||||
break;
|
||||
|
||||
case DW_TAG_class_type:
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S
|
||||
@@ -0,0 +1,108 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2009 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 G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::". */
|
||||
+
|
||||
+ .data
|
||||
+var: .4byte 1
|
||||
+
|
||||
+ .section .debug_info
|
||||
+.Lcu1_begin:
|
||||
+ /* CU header */
|
||||
+ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
|
||||
+.Lcu1_start:
|
||||
+ .2byte 2 /* DWARF Version */
|
||||
+ .4byte .Labbrev1_begin /* Offset into abbrev section */
|
||||
+ .byte 4 /* Pointer size */
|
||||
+
|
||||
+ /* CU die */
|
||||
+ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */
|
||||
+ .ascii "file1.txt\0" /* DW_AT_name */
|
||||
+ .ascii "GNU C 3.3.3\0" /* DW_AT_producer */
|
||||
+ .byte 4 /* DW_LANG_C_plus_plus (C++) */
|
||||
+
|
||||
+.Ltype_int:
|
||||
+ .uleb128 2 /* Abbrev: DW_TAG_base_type */
|
||||
+ .ascii "int\0" /* DW_AT_name */
|
||||
+ .byte 4 /* DW_AT_byte_size */
|
||||
+ .byte 5 /* DW_AT_encoding */
|
||||
+
|
||||
+ .uleb128 3 /* Abbrev: DW_TAG_namespace */
|
||||
+ .ascii "::\0" /* DW_AT_name */
|
||||
+
|
||||
+ .uleb128 7 /* Abbrev: DW_TAG_variable (location) */
|
||||
+ .ascii "var\0" /* DW_AT_name */
|
||||
+ .byte 2f - 1f /* DW_AT_location */
|
||||
+1: .byte 3 /* DW_OP_addr */
|
||||
+ .4byte var /* <addr> */
|
||||
+2: .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */
|
||||
+
|
||||
+ .byte 0 /* End of children of DW_TAG_namespace */
|
||||
+
|
||||
+ .byte 0 /* End of children of CU */
|
||||
+
|
||||
+.Lcu1_end:
|
||||
+
|
||||
+/* Abbrev table */
|
||||
+ .section .debug_abbrev
|
||||
+.Labbrev1_begin:
|
||||
+ .uleb128 1 /* Abbrev code */
|
||||
+ .uleb128 0x11 /* DW_TAG_compile_unit */
|
||||
+ .byte 1 /* has_children */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x25 /* DW_AT_producer */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x13 /* DW_AT_language */
|
||||
+ .uleb128 0xb /* DW_FORM_data1 */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+
|
||||
+ .uleb128 2 /* Abbrev code */
|
||||
+ .uleb128 0x24 /* DW_TAG_base_type */
|
||||
+ .byte 0 /* has_children */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0xb /* DW_AT_byte_size */
|
||||
+ .uleb128 0xb /* DW_FORM_data1 */
|
||||
+ .uleb128 0x3e /* DW_AT_encoding */
|
||||
+ .uleb128 0xb /* DW_FORM_data1 */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+
|
||||
+ .uleb128 3 /* Abbrev code */
|
||||
+ .uleb128 0x39 /* DW_TAG_namespace */
|
||||
+ .byte 1 /* has_children */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+
|
||||
+ .uleb128 7 /* Abbrev code (location) */
|
||||
+ .uleb128 0x34 /* DW_TAG_variable */
|
||||
+ .byte 0 /* has_children */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x2 /* DW_AT_location */
|
||||
+ .uleb128 0xa /* DW_FORM_block1 */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp
|
||||
@@ -0,0 +1,43 @@
|
||||
+# Copyright 2009 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 G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".
|
||||
+
|
||||
+# 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*]} {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+set testfile "dw2-empty-namespace"
|
||||
+set srcfile ${testfile}.S
|
||||
+set executable ${testfile}.x
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${executable}" object {nodebug}] != "" } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+clean_restart $executable
|
||||
+
|
||||
+# `p var' below can work without identified DWARF DIE just based on its ELF symbol.
|
||||
+# Catch it here as `type = <data variable, no debug info>'.
|
||||
+gdb_test "ptype var" "type = int"
|
||||
+
|
||||
+gdb_test "p var" " = 1"
|
27
gdb-follow-child-stale-parent.patch
Normal file
27
gdb-follow-child-stale-parent.patch
Normal file
@ -0,0 +1,27 @@
|
||||
Problem occurs with python and its get_current_arch () as it selects
|
||||
selected_frame and current_frame while still inferior_ptid is valid for the
|
||||
original parent. But since this place it is already attached and later
|
||||
unwinders try to access it, breaking:
|
||||
-PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the first fork
|
||||
-PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the first fork
|
||||
-PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the second fork
|
||||
-PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the second fork
|
||||
-PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: finish
|
||||
+FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the first fork
|
||||
+FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the first fork
|
||||
+FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the second fork
|
||||
+FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the second fork
|
||||
+FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: finish
|
||||
|
||||
--- ./gdb/infrun.c 2009-12-21 20:26:30.000000000 +0100
|
||||
+++ ./gdb/infrun.c 2009-12-21 20:26:11.000000000 +0100
|
||||
@@ -375,6 +375,9 @@ follow_fork (void)
|
||||
}
|
||||
else
|
||||
{
|
||||
+ /* Possibly referenced PARENT is no longer valid. */
|
||||
+ reinit_frame_cache ();
|
||||
+
|
||||
/* This pending follow fork event is now handled, one way
|
||||
or another. The previous selected thread may be gone
|
||||
from the lists by now, but if it is still around, need
|
@ -276,12 +276,16 @@ static int spawn (char **argv, int timeout)
|
||||
|
||||
assert (signal_chld_hit != 0);
|
||||
|
||||
/* Do not unset O_NONBLOCK as a stale child (the whole purpose of this
|
||||
program) having open its output pty would block us in read_out. */
|
||||
#if 0
|
||||
i = fcntl (amaster, F_SETFL, O_RDONLY /* !O_NONBLOCK */);
|
||||
if (i != 0)
|
||||
{
|
||||
perror ("fcntl (amaster, F_SETFL, O_RDONLY /* !O_NONBLOCK */)");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
#endif
|
||||
|
||||
while (read_out (amaster));
|
||||
|
||||
|
21
gdb-ppc-hw-watchpoint-twice.patch
Normal file
21
gdb-ppc-hw-watchpoint-twice.patch
Normal file
@ -0,0 +1,21 @@
|
||||
pcc regression from:
|
||||
http://sourceware.org/ml/gdb-patches/2008-12/msg00143.html
|
||||
|
||||
gdb/
|
||||
2009-12-21 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* breakpoint.c (update_watchpoint): Set B->TYPE to bp_watchpoint before
|
||||
calling hw_watchpoint_used_count.
|
||||
|
||||
--- a/gdb/breakpoint.c
|
||||
+++ b/gdb/breakpoint.c
|
||||
@@ -1152,6 +1152,9 @@ update_watchpoint (struct breakpoint *b, int reparse)
|
||||
{
|
||||
int i, mem_cnt, other_type_used;
|
||||
|
||||
+ /* Do not count with B twice below. */
|
||||
+ b->type = bp_watchpoint;
|
||||
+
|
||||
i = hw_watchpoint_used_count (bp_hardware_watchpoint,
|
||||
&other_type_used);
|
||||
mem_cnt = can_use_hardware_watchpoint (val_chain);
|
312
gdb-readline-6.0-signal.patch
Normal file
312
gdb-readline-6.0-signal.patch
Normal file
@ -0,0 +1,312 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-11/msg00596.html
|
||||
Subject: [gdb FYI-patch] callback-mode readline-6.0 regression
|
||||
|
||||
Hi Chet,
|
||||
|
||||
FSF GDB currently ships bundled with readline-5.2 which works fine.
|
||||
But using --with-system-readline and readline-6.0-patchlevel4 has
|
||||
a regression:
|
||||
|
||||
readline-5.2: Run `gdb -nx -q' and type CTRL-C:
|
||||
(gdb) Quit
|
||||
(gdb) _
|
||||
|
||||
readline-6.0: Run `gdb -nx -q' and type CTRL-C:
|
||||
(gdb) _
|
||||
= nothing happens (it gets buffered and executed later)
|
||||
(It does also FAIL on gdb.gdb/selftest.exp.)
|
||||
|
||||
It is because GDB waits in its own poll() mainloop and readline uses via
|
||||
rl_callback_handler_install and rl_callback_handler_remove. This way the
|
||||
readline internal variable _rl_interrupt_immediately remains 0 and CTRL-C gets
|
||||
only stored to _rl_caught_signal but not executed.
|
||||
|
||||
Seen in rl_signal_handler even if _rl_interrupt_immediately is set and
|
||||
_rl_handle_signal is called then the signal is still stored to
|
||||
_rl_caught_signal. In the _rl_interrupt_immediately case it should not be
|
||||
stored when it was already processed.
|
||||
|
||||
rl_signal_handler does `_rl_interrupt_immediately = 0;' - while I am not aware
|
||||
of its meaning it breaks the nest-counting of other routines which do
|
||||
`_rl_interrupt_immediately++;' and `_rl_interrupt_immediately--;' possibly
|
||||
creating problematic `_rl_interrupt_immediately == -1'.
|
||||
|
||||
`_rl_interrupt_immediately' is an internal variable, how it could be accessed
|
||||
by a readline application? (OK, maybe it should not be used.)
|
||||
|
||||
Attaching a current GDB-side patch but it must access readline internal
|
||||
variable _rl_caught_signal and it is generally just a workaround. Could you
|
||||
please include support for signals in this asynchronous mode in readline-6.1?
|
||||
I find it would be enough to make RL_CHECK_SIGNALS public?
|
||||
|
||||
|
||||
GDB: No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
|
||||
But this is not a patch intended to be accepted.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* config.in, configure: Regenerate.
|
||||
* configure.ac (for readline_echoing_p): Move inside $LIBS change.
|
||||
(for _rl_caught_signal): New.
|
||||
* event-loop.c: Include readline/readline.h.
|
||||
(gdb_do_one_event) [HAVE_READLINE_CAUGHT_SIGNAL]: New.
|
||||
|
||||
gdb/testsuite/
|
||||
2009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.gdb/selftest.exp (backtrace through signal handler): Move before
|
||||
SIGINT pass, drop the timeout case.
|
||||
(send SIGINT signal to child process): Use gdb_test.
|
||||
(backtrace through readline handler): New.
|
||||
|
||||
--- a/gdb/config.in
|
||||
+++ b/gdb/config.in
|
||||
@@ -351,6 +351,9 @@
|
||||
/* Define if Python interpreter is being linked in. */
|
||||
#undef HAVE_PYTHON
|
||||
|
||||
+/* readline-6.0 workaround of blocked signals. */
|
||||
+#undef HAVE_READLINE_CAUGHT_SIGNAL
|
||||
+
|
||||
/* Define to 1 if you have the `realpath' function. */
|
||||
#undef HAVE_REALPATH
|
||||
|
||||
--- a/gdb/configure.ac
|
||||
+++ b/gdb/configure.ac
|
||||
@@ -539,17 +539,25 @@ if test "$with_system_readline" = yes; then
|
||||
# readline-6.0 started to use the name `_rl_echoing_p'.
|
||||
# `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
|
||||
|
||||
- AC_MSG_CHECKING([for readline_echoing_p])
|
||||
save_LIBS=$LIBS
|
||||
LIBS="$LIBS $READLINE"
|
||||
+ AC_MSG_CHECKING([for readline_echoing_p])
|
||||
AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int readline_echoing_p;
|
||||
return readline_echoing_p;]]),
|
||||
[READLINE_ECHOING_P=yes],
|
||||
[READLINE_ECHOING_P=no
|
||||
AC_DEFINE([readline_echoing_p], [_rl_echoing_p],
|
||||
[readline-6.0 started to use different name.])])
|
||||
- LIBS="$save_LIBS"
|
||||
AC_MSG_RESULT([$READLINE_ECHOING_P])
|
||||
+ AC_MSG_CHECKING([for _rl_caught_signal])
|
||||
+ AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int volatile _rl_caught_signal;
|
||||
+ return _rl_caught_signal;]]),
|
||||
+ [READLINE_CAUGHT_SIGNAL=yes
|
||||
+ AC_DEFINE([HAVE_READLINE_CAUGHT_SIGNAL],,
|
||||
+ [readline-6.0 workaround of blocked signals.])],
|
||||
+ [READLINE_CAUGHT_SIGNAL=no])
|
||||
+ AC_MSG_RESULT([$READLINE_CAUGHT_SIGNAL])
|
||||
+ LIBS="$save_LIBS"
|
||||
else
|
||||
READLINE='$(READLINE_DIR)/libreadline.a'
|
||||
READLINE_DEPS='$(READLINE)'
|
||||
--- a/gdb/event-loop.c
|
||||
+++ b/gdb/event-loop.c
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "exceptions.h"
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_select.h"
|
||||
+#include "readline/readline.h"
|
||||
|
||||
/* Data point to pass to the event handler. */
|
||||
typedef union event_data
|
||||
@@ -411,6 +412,9 @@ gdb_do_one_event (void *data)
|
||||
static int event_source_head = 0;
|
||||
const int number_of_sources = 3;
|
||||
int current = 0;
|
||||
+#ifdef HAVE_READLINE_CAUGHT_SIGNAL
|
||||
+ extern int volatile _rl_caught_signal;
|
||||
+#endif
|
||||
|
||||
/* Any events already waiting in the queue? */
|
||||
if (process_event ())
|
||||
@@ -455,6 +459,16 @@ gdb_do_one_event (void *data)
|
||||
if (gdb_wait_for_event (1) < 0)
|
||||
return -1;
|
||||
|
||||
+#ifdef HAVE_READLINE_CAUGHT_SIGNAL
|
||||
+ if (async_command_editing_p && RL_ISSTATE (RL_STATE_CALLBACK)
|
||||
+ && _rl_caught_signal)
|
||||
+ {
|
||||
+ /* Call RL_CHECK_SIGNALS this way. */
|
||||
+ rl_callback_handler_remove ();
|
||||
+ rl_callback_handler_install (NULL, input_handler);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* Handle any new events occurred while waiting. */
|
||||
if (process_event ())
|
||||
return 1;
|
||||
--- a/gdb/testsuite/gdb.gdb/selftest.exp
|
||||
+++ b/gdb/testsuite/gdb.gdb/selftest.exp
|
||||
@@ -464,31 +464,42 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
|
||||
fail "$description (timeout)"
|
||||
}
|
||||
}
|
||||
-
|
||||
- set description "send SIGINT signal to child process"
|
||||
- send_gdb "signal SIGINT\n"
|
||||
- gdb_expect {
|
||||
- -re "Continuing with signal SIGINT.*$gdb_prompt $" {
|
||||
+
|
||||
+ # get a stack trace with the poll function
|
||||
+ #
|
||||
+ # This fails on some linux systems for unknown reasons. On the
|
||||
+ # systems where it fails, sometimes it works fine when run manually.
|
||||
+ # The testsuite failures may not be limited to just aout systems.
|
||||
+ setup_xfail "i*86-pc-linuxaout-gnu"
|
||||
+ set description "backtrace through signal handler"
|
||||
+ gdb_test_multiple "backtrace" $description {
|
||||
+ -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
|
||||
pass "$description"
|
||||
}
|
||||
-re ".*$gdb_prompt $" {
|
||||
+ # On the alpha, we hit the infamous problem about gdb
|
||||
+ # being unable to get the frame pointer (mentioned in
|
||||
+ # gdb/README). As it is intermittent, there is no way to
|
||||
+ # XFAIL it which will give us an XPASS if the problem goes
|
||||
+ # away.
|
||||
+ setup_xfail "alpha*-*-osf*"
|
||||
fail "$description"
|
||||
}
|
||||
- timeout {
|
||||
- fail "$description (timeout)"
|
||||
- }
|
||||
}
|
||||
|
||||
- # get a stack trace
|
||||
+ gdb_test "signal SIGINT" "Continuing with signal SIGINT.*" \
|
||||
+ "send SIGINT signal to child process"
|
||||
+
|
||||
+ # get a stack trace being redelivered by readline
|
||||
#
|
||||
# This fails on some linux systems for unknown reasons. On the
|
||||
# systems where it fails, sometimes it works fine when run manually.
|
||||
# The testsuite failures may not be limited to just aout systems.
|
||||
+ # Optional system readline may not have symbols to be shown.
|
||||
setup_xfail "i*86-pc-linuxaout-gnu"
|
||||
- set description "backtrace through signal handler"
|
||||
- send_gdb "backtrace\n"
|
||||
- gdb_expect {
|
||||
- -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
|
||||
+ set description "backtrace through readline handler"
|
||||
+ gdb_test_multiple "backtrace" $description {
|
||||
+ -re "#0.*gdb_do_one_event.*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
|
||||
pass "$description"
|
||||
}
|
||||
-re ".*$gdb_prompt $" {
|
||||
@@ -500,9 +510,6 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
|
||||
setup_xfail "alpha*-*-osf*"
|
||||
fail "$description"
|
||||
}
|
||||
- timeout {
|
||||
- fail "$description (timeout)"
|
||||
- }
|
||||
}
|
||||
|
||||
|
||||
--- gdb-7.0/gdb/configure 2009-12-07 18:53:30.000000000 +0100
|
||||
+++ gdb-7.0-x/gdb/configure 2009-12-07 18:53:14.000000000 +0100
|
||||
@@ -9201,15 +9201,11 @@ if test "$with_system_readline" = yes; t
|
||||
# readline-6.0 started to use the name `_rl_echoing_p'.
|
||||
# `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
|
||||
|
||||
- echo "$as_me:$LINENO: checking for readline_echoing_p" >&5
|
||||
-echo $ECHO_N "checking for readline_echoing_p... $ECHO_C" >&6
|
||||
save_LIBS=$LIBS
|
||||
LIBS="$LIBS $READLINE"
|
||||
- cat >conftest.$ac_ext <<_ACEOF
|
||||
-/* confdefs.h. */
|
||||
-_ACEOF
|
||||
-cat confdefs.h >>conftest.$ac_ext
|
||||
-cat >>conftest.$ac_ext <<_ACEOF
|
||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5
|
||||
+$as_echo_n "checking for readline_echoing_p... " >&6; }
|
||||
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
int
|
||||
@@ -9221,45 +9217,45 @@ extern int readline_echoing_p;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
-rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
- (eval $ac_link) 2>conftest.er1
|
||||
- ac_status=$?
|
||||
- grep -v '^ *+' conftest.er1 >conftest.err
|
||||
- rm -f conftest.er1
|
||||
- cat conftest.err >&5
|
||||
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
- (exit $ac_status); } &&
|
||||
- { ac_try='test -z "$ac_c_werror_flag"
|
||||
- || test ! -s conftest.err'
|
||||
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
- (eval $ac_try) 2>&5
|
||||
- ac_status=$?
|
||||
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
- (exit $ac_status); }; } &&
|
||||
- { ac_try='test -s conftest$ac_exeext'
|
||||
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
- (eval $ac_try) 2>&5
|
||||
- ac_status=$?
|
||||
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
- (exit $ac_status); }; }; then
|
||||
+if ac_fn_c_try_link "$LINENO"; then :
|
||||
READLINE_ECHOING_P=yes
|
||||
else
|
||||
- echo "$as_me: failed program was:" >&5
|
||||
-sed 's/^/| /' conftest.$ac_ext >&5
|
||||
+ READLINE_ECHOING_P=no
|
||||
|
||||
-READLINE_ECHOING_P=no
|
||||
+$as_echo "#define readline_echoing_p _rl_echoing_p" >>confdefs.h
|
||||
+
|
||||
+fi
|
||||
+rm -f core conftest.err conftest.$ac_objext \
|
||||
+ conftest$ac_exeext conftest.$ac_ext
|
||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_ECHOING_P" >&5
|
||||
+$as_echo "$READLINE_ECHOING_P" >&6; }
|
||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rl_caught_signal" >&5
|
||||
+$as_echo_n "checking for _rl_caught_signal... " >&6; }
|
||||
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
+/* end confdefs.h. */
|
||||
|
||||
-cat >>confdefs.h <<\_ACEOF
|
||||
-#define readline_echoing_p _rl_echoing_p
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+extern int volatile _rl_caught_signal;
|
||||
+ return _rl_caught_signal;
|
||||
+ ;
|
||||
+ return 0;
|
||||
+}
|
||||
_ACEOF
|
||||
+if ac_fn_c_try_link "$LINENO"; then :
|
||||
+ READLINE_CAUGHT_SIGNAL=yes
|
||||
+
|
||||
+$as_echo "#define HAVE_READLINE_CAUGHT_SIGNAL /**/" >>confdefs.h
|
||||
|
||||
+else
|
||||
+ READLINE_CAUGHT_SIGNAL=no
|
||||
fi
|
||||
-rm -f conftest.err conftest.$ac_objext \
|
||||
- conftest$ac_exeext conftest.$ac_ext
|
||||
+rm -f core conftest.err conftest.$ac_objext \
|
||||
+ conftest$ac_exeext conftest.$ac_ext
|
||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_CAUGHT_SIGNAL" >&5
|
||||
+$as_echo "$READLINE_CAUGHT_SIGNAL" >&6; }
|
||||
LIBS="$save_LIBS"
|
||||
- echo "$as_me:$LINENO: result: $READLINE_ECHOING_P" >&5
|
||||
-echo "${ECHO_T}$READLINE_ECHOING_P" >&6
|
||||
else
|
||||
READLINE='$(READLINE_DIR)/libreadline.a'
|
||||
READLINE_DEPS='$(READLINE)'
|
65
gdb-rhel5-compat.patch
Normal file
65
gdb-rhel5-compat.patch
Normal file
@ -0,0 +1,65 @@
|
||||
gdb/linux-nat.c:
|
||||
- Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).
|
||||
|
||||
--- gdb-6.8/gdb-orig/symfile.c 2008-08-21 00:06:50.000000000 +0200
|
||||
+++ gdb-6.8/gdb/symfile.c 2008-08-21 22:31:00.000000000 +0200
|
||||
@@ -1456,8 +1456,10 @@ find_separate_debug_file (struct objfile
|
||||
/* Prevent looping on a stripped .debug file. */
|
||||
if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
|
||||
{
|
||||
+#if 0 /* RHEL-5 backward behavior compatibility. */
|
||||
warning (_("\"%s\": separate debug info file has no debug info"),
|
||||
build_id_name);
|
||||
+#endif
|
||||
xfree (build_id_name);
|
||||
}
|
||||
else if (build_id_name != NULL)
|
||||
--- ./gdb/corelow.c 2010-01-01 16:04:34.000000000 +0100
|
||||
+++ ./gdb/corelow.c 2010-01-01 16:06:26.000000000 +0100
|
||||
@@ -277,7 +277,7 @@ add_to_thread_list (bfd *abfd, asection
|
||||
inferior_ptid = ptid; /* Yes, make it current */
|
||||
}
|
||||
|
||||
-static int build_id_core_loads = 1;
|
||||
+static int build_id_core_loads = 0;
|
||||
|
||||
static void
|
||||
build_id_locate_exec (int from_tty)
|
||||
--- ./gdb/symfile.c 2010-01-01 16:04:35.000000000 +0100
|
||||
+++ ./gdb/symfile.c 2010-01-01 16:06:12.000000000 +0100
|
||||
@@ -1249,7 +1249,7 @@ symbol_file_clear (int from_tty)
|
||||
#define BUILD_ID_VERBOSE_NONE 0
|
||||
#define BUILD_ID_VERBOSE_FILENAMES 1
|
||||
#define BUILD_ID_VERBOSE_BINARY_PARSE 2
|
||||
-static int build_id_verbose = BUILD_ID_VERBOSE_FILENAMES;
|
||||
+static int build_id_verbose = BUILD_ID_VERBOSE_NONE;
|
||||
static void
|
||||
show_build_id_verbose (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
--- gdb-7.0-orig/gdb/linux-nat.c 2009-12-19 20:53:46.000000000 +0100
|
||||
+++ gdb-7.0/gdb/linux-nat.c 2009-12-19 20:55:02.000000000 +0100
|
||||
@@ -1604,8 +1604,22 @@ GPT: lwp %s had signal %s, but it is in
|
||||
*status = lp->status;
|
||||
}
|
||||
|
||||
- if (*status == 0 && GET_PID (lp->ptid) == pid_was_stopped)
|
||||
- *status = W_STOPCODE (SIGSTOP);
|
||||
+ /* Workaround RHEL-5 kernel which has unreliable PTRACE_DETACH, SIGSTOP (that
|
||||
+ many TIDs are left unstopped). See RH Bug 496732. */
|
||||
+ if (GET_PID (lp->ptid) == pid_was_stopped)
|
||||
+ {
|
||||
+ int err;
|
||||
+
|
||||
+ errno = 0;
|
||||
+ err = kill_lwp (GET_LWP (lp->ptid), SIGSTOP);
|
||||
+ if (debug_linux_nat)
|
||||
+ {
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "SC: lwp kill %d %s\n",
|
||||
+ err,
|
||||
+ errno ? safe_strerror (errno) : "ERRNO-OK");
|
||||
+ }
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
405
gdb-rhel5-gcc44.patch
Normal file
405
gdb-rhel5-gcc44.patch
Normal file
@ -0,0 +1,405 @@
|
||||
Some functionality is available on RHEL-5.4+ only with gcc44 and gfortran44 as
|
||||
the default gcc and gfortran binaries are from gcc-4.1.
|
||||
|
||||
--- gdb-7.0/gdb/testsuite/gdb.base/vla.exp-orig 2009-12-20 00:38:13.000000000 +0100
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.base/vla.exp 2009-12-20 00:54:19.000000000 +0100
|
||||
@@ -16,7 +16,25 @@
|
||||
set testfile vla
|
||||
set srcfile ${testfile}.c
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
||||
+# Temporarily provide compiler=gcc44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists compiler] {
|
||||
+ set old_compiler [board_info $board compiler]
|
||||
+ unset_board_info compiler
|
||||
+} elseif [info exists old_compiler] {
|
||||
+ unset old_compiler
|
||||
+}
|
||||
+set_board_info compiler gcc44
|
||||
+
|
||||
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug quiet}]
|
||||
+
|
||||
+unset_board_info compiler
|
||||
+if [info exists old_compiler] {
|
||||
+ set_board_info compiler $old_compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile test program"
|
||||
return -1
|
||||
}
|
||||
--- gdb-7.0/gdb/testsuite/gdb.base/break-interp.exp-orig 2009-12-20 00:38:13.000000000 +0100
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.base/break-interp.exp 2009-12-20 01:11:47.000000000 +0100
|
||||
@@ -31,10 +31,30 @@ if [get_compiler_info ${binfile_lib}] {
|
||||
return -1
|
||||
}
|
||||
|
||||
+# Temporarily provide compiler=gcc44 saving the original value around.
|
||||
+# RHEL-5 workaround of its:
|
||||
+# gcc: -soname: linker input file unused because linking not done
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists compiler] {
|
||||
+ set old_compiler [board_info $board compiler]
|
||||
+ unset_board_info compiler
|
||||
+} elseif [info exists old_compiler] {
|
||||
+ unset old_compiler
|
||||
+}
|
||||
+set_board_info compiler gcc44
|
||||
+
|
||||
# Use -soname so that it is listed with " => " by ldd and this testcase makes
|
||||
# a copy of ${binfile_lib} for each prelink variant.
|
||||
|
||||
-if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug additional_flags=-Wl,-soname,${test}.so]] != ""} {
|
||||
+set err [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug additional_flags=-Wl,-soname,${test}.so]]
|
||||
+
|
||||
+unset_board_info compiler
|
||||
+if [info exists old_compiler] {
|
||||
+ set_board_info compiler $old_compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
return -1
|
||||
}
|
||||
|
||||
@@ -483,9 +503,33 @@ foreach ldprelink {NO YES} {
|
||||
if {$binpie == "YES"} {
|
||||
lappend opts {additional_flags=-fPIE -pie}
|
||||
}
|
||||
- if {[build_executable ${test}.exp [file tail $exec] $srcfile $opts] == -1} {
|
||||
- continue;
|
||||
+
|
||||
+
|
||||
+ # Temporarily provide compiler=gcc44 saving the original value around.
|
||||
+ # RHEL-5 workaround of its:
|
||||
+ # gcc: -rpath: linker input file unused because linking not done
|
||||
+ # gcc: --dynamic-linker: linker input file unused because linking not done
|
||||
+
|
||||
+ set board [target_info name]
|
||||
+ if [board_info $board exists compiler] {
|
||||
+ set old_compiler [board_info $board compiler]
|
||||
+ unset_board_info compiler
|
||||
+ } elseif [info exists old_compiler] {
|
||||
+ unset old_compiler
|
||||
+ }
|
||||
+ set_board_info compiler gcc44
|
||||
+
|
||||
+ set err [build_executable ${test}.exp [file tail $exec] $srcfile $opts]
|
||||
+
|
||||
+ unset_board_info compiler
|
||||
+ if [info exists old_compiler] {
|
||||
+ set_board_info compiler $old_compiler
|
||||
}
|
||||
+
|
||||
+ if { $err == -1 } {
|
||||
+ continue
|
||||
+ }
|
||||
+
|
||||
if {$binsepdebug == "SEP"} {
|
||||
gdb_gnu_strip_debug $exec
|
||||
# Just a sanity check. As gdb_gnu_strip_debug uses the
|
||||
--- ./gdb/testsuite/gdb.fortran/common-block.exp 2009-12-15 05:13:56.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/common-block.exp 2009-12-15 05:21:00.000000000 +0100
|
||||
@@ -20,7 +20,25 @@ set testfile "common-block"
|
||||
set srcfile ${testfile}.f90
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
|
||||
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile ${srcfile}"
|
||||
return -1
|
||||
}
|
||||
--- ./gdb/testsuite/gdb.fortran/dwarf-stride.exp 2009-12-15 05:13:56.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/dwarf-stride.exp 2009-12-15 05:20:07.000000000 +0100
|
||||
@@ -27,7 +27,25 @@
|
||||
set testfile dwarf-stride
|
||||
set srcfile ${testfile}.f90
|
||||
|
||||
-if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77}] } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if $err {
|
||||
return -1
|
||||
}
|
||||
|
||||
--- ./gdb/testsuite/gdb.fortran/dynamic.exp 2009-12-15 05:13:56.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/dynamic.exp 2009-12-15 05:17:21.000000000 +0100
|
||||
@@ -25,7 +25,25 @@ set testfile "dynamic"
|
||||
set srcfile ${testfile}.f90
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
|
||||
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile ${srcfile}"
|
||||
return -1
|
||||
}
|
||||
--- ./gdb/testsuite/gdb.fortran/library-module.exp 2009-12-15 05:13:56.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/library-module.exp 2009-12-15 05:22:37.000000000 +0100
|
||||
@@ -25,16 +25,34 @@ if [get_compiler_info not-used] {
|
||||
return -1
|
||||
}
|
||||
|
||||
-if { [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}] != "" } {
|
||||
- untested "Couldn't compile ${srclibfile}"
|
||||
- return -1
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
}
|
||||
+set_board_info f77compiler gfortran44
|
||||
|
||||
# prepare_for_testing cannot be used as linking with $libfile cannot be passed
|
||||
# just for the linking phase (and not the source compilation phase). And any
|
||||
# warnings on ignored $libfile abort the process.
|
||||
|
||||
-if { [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}] != "" } {
|
||||
+set err1 [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}]
|
||||
+set err2 [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if { $err1 != "" } {
|
||||
+ untested "Couldn't compile ${srclibfile}"
|
||||
+ return -1
|
||||
+}
|
||||
+if { $err2 != "" } {
|
||||
untested "Couldn't compile ${srcfile}"
|
||||
return -1
|
||||
}
|
||||
--- ./gdb/testsuite/gdb.fortran/module.exp 2009-12-15 05:13:56.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/module.exp 2009-12-15 05:28:49.000000000 +0100
|
||||
@@ -16,7 +16,25 @@
|
||||
set testfile "module"
|
||||
set srcfile ${testfile}.f90
|
||||
|
||||
-if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77}] } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if $err {
|
||||
return -1
|
||||
}
|
||||
|
||||
--- ./gdb/testsuite/gdb.fortran/string.exp 2009-12-15 05:13:56.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/string.exp 2009-12-15 05:18:13.000000000 +0100
|
||||
@@ -23,7 +23,25 @@ set testfile "string"
|
||||
set srcfile ${testfile}.f90
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
|
||||
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile ${srcfile}"
|
||||
return -1
|
||||
}
|
||||
--- gdb-7.0/gdb/testsuite/gdb.fortran/omp-step.exp-orig 2009-12-20 09:47:04.000000000 +0100
|
||||
+++ gdb-7.0/gdb/testsuite/gdb.fortran/omp-step.exp 2009-12-20 09:50:06.000000000 +0100
|
||||
@@ -15,7 +15,26 @@
|
||||
|
||||
set testfile "omp-step"
|
||||
set srcfile ${testfile}.f90
|
||||
-if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77 additional_flags=-fopenmp}] } {
|
||||
+
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77 additional_flags=-fopenmp}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if $err {
|
||||
return -1
|
||||
}
|
||||
|
||||
--- ./gdb/testsuite/gdb.fortran/derived-type.exp 2009-01-07 13:39:13.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/derived-type.exp 2009-12-20 12:37:12.000000000 +0100
|
||||
@@ -26,7 +26,25 @@ set testfile "derived-type"
|
||||
set srcfile ${testfile}.f90
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
|
||||
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile ${srcfile}"
|
||||
return -1
|
||||
}
|
||||
--- ./gdb/testsuite/gdb.fortran/subarray.exp 2009-01-07 13:39:13.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.fortran/subarray.exp 2009-12-20 12:38:00.000000000 +0100
|
||||
@@ -26,7 +26,25 @@ set testfile "subarray"
|
||||
set srcfile ${testfile}.f
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
|
||||
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
|
||||
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists f77compiler] {
|
||||
+ set old_f77compiler [board_info $board f77compiler]
|
||||
+ unset_board_info f77compiler
|
||||
+} elseif [info exists old_f77compiler] {
|
||||
+ unset old_f77compiler
|
||||
+}
|
||||
+set_board_info f77compiler gfortran44
|
||||
+
|
||||
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
|
||||
+
|
||||
+unset_board_info f77compiler
|
||||
+if [info exists old_f77compiler] {
|
||||
+ set_board_info f77compiler $old_f77compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile ${srcfile}"
|
||||
return -1
|
||||
}
|
||||
--- ./gdb/testsuite/gdb.threads/tls-sepdebug.exp 2009-12-20 12:22:18.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.threads/tls-sepdebug.exp 2009-12-20 12:39:53.000000000 +0100
|
||||
@@ -32,7 +32,25 @@ set binshareddebugfile ${objdir}/${subdi
|
||||
|
||||
# FIXME: gcc dependency (-Wl,-soname).
|
||||
|
||||
-if { [gdb_compile_shlib "${srcdir}/${subdir}/${srcsharedfile}" "${binsharedfile}" [list debug additional_flags=-Wl,-soname=${binsharedbase}]] != "" } {
|
||||
+# Temporarily provide compiler=gcc44 saving the original value around.
|
||||
+
|
||||
+set board [target_info name]
|
||||
+if [board_info $board exists compiler] {
|
||||
+ set old_compiler [board_info $board compiler]
|
||||
+ unset_board_info compiler
|
||||
+} elseif [info exists old_compiler] {
|
||||
+ unset old_compiler
|
||||
+}
|
||||
+set_board_info compiler gcc44
|
||||
+
|
||||
+set err [gdb_compile_shlib "${srcdir}/${subdir}/${srcsharedfile}" "${binsharedfile}" [list debug additional_flags=-Wl,-soname=${binsharedbase}]]
|
||||
+
|
||||
+unset_board_info compiler
|
||||
+if [info exists old_compiler] {
|
||||
+ set_board_info compiler $old_compiler
|
||||
+}
|
||||
+
|
||||
+if { $err != "" } {
|
||||
untested "Couldn't compile test library"
|
||||
return -1
|
||||
}
|
70
gdb-stabs-read_args.patch
Normal file
70
gdb-stabs-read_args.patch
Normal file
@ -0,0 +1,70 @@
|
||||
http://sourceware.org/ml/gdb-patches/2010-01/msg00142.html
|
||||
Subject: [patch] Fix crash reading broken stabs
|
||||
|
||||
Hi,
|
||||
|
||||
seen this stabs from unknown variant of gcc-4.1.2:
|
||||
|
||||
1176586 LSYM 0 154 00000000 16682076 basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep:Tt(0,34)=s12!1,020,(0,35)=xs_Rep_base:;_S_max_size:/2(0,36)=k(0,30):_ZNSs4_Rep11_S_max_sizeE;_S_terminal:/2(0,22):_ZNSs4_Rep11_S_terminalE;_S_empty_rep_storage:/2(0,37)=ar(0,38)=r(0,38);0;037777777777;;0;3;(0,30):_ZNSs4_Rep20_S_empty_rep_storageE;_S_empty_rep::(0,39)=f(0,40)=&(0,34):_ZNSs4_Rep12_S_empty_repEv;2A?;_M_is_leaked::(0,41)=#(0,34),(0,42)=@s8;-16;,(0,43)=*(0,44)=k(0,34),(0,1);:_ZNKSs4_Rep12_M_is_leakedEv;2B.;_M_is_shared::(0,41):_ZNKSs4_Rep12_M_is_sharedEv;2B.;_M_set_leaked::(0,45)=#(0,34),(0,1),(0,33),(0,1);:_ZNSs4_Rep13_M_set_leakedEv;2A.;_M_set_sharable::(0,45):_ZNSs4_Rep15_M_set_sharableEv;2A.;_M_set_length_and_sharable::(0,46)=#(0,34),(0,1),(0,33),(0,25),(0,1);:_ZNSs4_Rep26_M_set_length_and_sharableEj;2A.;_M_refdata::(0,47)=#(0,34),(0,3),(0,33),(0,1);:_ZNSs4_Rep10_M_refdataEv;2A.;_M_grab::(0,48)=#(0,34),(0,3),(0,33),(0,5),(0,5),(0,1);:_ZNSs4_Rep7_M_grabERKSaIcES2_;2A.;_S_create::(0,49)=f(0,33):_ZNSs4_Rep9_S_createEjjRKSaIcE;2A?;_M_dispose::(0,50)=#(0,34),(0,1),(0,33),(0,5),(0,1);:_ZNSs4_Rep10_M_disposeERKSaIcE;2A.;_M_destroy::(0,51)=#(0,34),(0,1),(0,33),(0,5),(0,1);:_ZNSs4_Rep10_M_destroyERKSaIcE;2A.;_M_refcopy::(0,47):_ZNSs4_Rep10_M_refcopyEv;2A.;_M_clone::(0,52)=#(0,34),(0,3),(0,33),(0,5),(0,25),(0,1);:_ZNSs4_Rep8_M_cloneERKSaIcEj;2A.;;
|
||||
|
||||
There is a GDB crash at:
|
||||
_M_is_leaked::(0,41)=#(0,34),(0,42)=@s8;-16;,(0,43)=*(0,44)=k(0,34),(0,1);
|
||||
^^
|
||||
+ [...] Some broken stabs
|
||||
+ output contained `(0,41),(0,42)=@s8;-16;,(0,43),(0,1);' where should
|
||||
+ have been present ";-16,(0,43)" reference instead. This way the
|
||||
+ excessive ";" marker prematurely stops the parameters parsing. */
|
||||
|
||||
Still I was unable to reproduce producing such STABS output.
|
||||
|
||||
So this patch does not try to compensate the - presumably - buggy STABS output
|
||||
and parses such record incorrectly. But it no longer crashes.
|
||||
|
||||
No regressions on {x86_64-m32,i686}-fedora12-linux-gnu
|
||||
using --target_board unix/-gstabs+/-m32.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2010-01-07 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* stabsread.c (read_args): Handle zero arguments.
|
||||
|
||||
gdb/testsuite/
|
||||
2010-01-07 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.stabs/weird.def (args93): New.
|
||||
|
||||
--- a/gdb/stabsread.c
|
||||
+++ b/gdb/stabsread.c
|
||||
@@ -4111,7 +4111,17 @@ read_args (char **pp, int end, struct objfile *objfile, int *nargsp,
|
||||
}
|
||||
(*pp)++; /* get past `end' (the ':' character) */
|
||||
|
||||
- if (TYPE_CODE (types[n - 1]) != TYPE_CODE_VOID)
|
||||
+ if (n == 0)
|
||||
+ {
|
||||
+ /* We should read at least the THIS parameter here. Some broken stabs
|
||||
+ output contained `(0,41),(0,42)=@s8;-16;,(0,43),(0,1);' where should
|
||||
+ have been present ";-16,(0,43)" reference instead. This way the
|
||||
+ excessive ";" marker prematurely stops the parameters parsing. */
|
||||
+
|
||||
+ complaint (&symfile_complaints, _("Invalid (empty) method arguments"));
|
||||
+ *varargsp = 0;
|
||||
+ }
|
||||
+ else if (TYPE_CODE (types[n - 1]) != TYPE_CODE_VOID)
|
||||
*varargsp = 1;
|
||||
else
|
||||
{
|
||||
--- a/gdb/testsuite/gdb.stabs/weird.def
|
||||
+++ b/gdb/testsuite/gdb.stabs/weird.def
|
||||
@@ -880,3 +880,6 @@ var3:
|
||||
.stabs "sym92:\ !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",N_LSYM,0,0,0
|
||||
.stabs "type92:t92=\ !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",N_LSYM,0,0,0
|
||||
.stabs "attr92:G392=@\ !#$%&'()*+,-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~;1",N_GSYM,0,0, 0
|
||||
+
|
||||
+# See read_args "Invalid (empty) method arguments" error.
|
||||
+.stabs "args93:G93=#(0,93),(0,93)=@s8;-16;,(0,93),(0,93);",N_GSYM,0,0,0
|
154
gdb-stale-related_breakpoint.patch
Normal file
154
gdb-stale-related_breakpoint.patch
Normal file
@ -0,0 +1,154 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-12/msg00364.html
|
||||
Subject: [patch] related_breakpoint stale ref crash fix
|
||||
|
||||
Hi,
|
||||
|
||||
getting occasional random:
|
||||
PASS: gdb.threads/local-watch-wrong-thread.exp: local watchpoint still triggers
|
||||
PASS: gdb.threads/local-watch-wrong-thread.exp: let thread_function0 return
|
||||
PASS: gdb.threads/local-watch-wrong-thread.exp: breakpoint on thread_function0's caller
|
||||
-PASS: gdb.threads/local-watch-wrong-thread.exp: local watchpoint automatically deleted
|
||||
+ERROR: Process no longer exists
|
||||
+UNRESOLVED: gdb.threads/local-watch-wrong-thread.exp: local watchpoint automatically deleted
|
||||
|
||||
It is even reproducible on HEAD using "input" file below and:
|
||||
valgrind ../gdb -nx <input
|
||||
|
||||
(gdb) (gdb) Breakpoint 6 at 0x400685: file ./gdb.threads/local-watch-wrong-thread.c, line 47.
|
||||
(gdb) ==31759== Invalid write of size 4
|
||||
==31759== at 0x601A11: bpstat_check_breakpoint_conditions (breakpoint.c:3482)
|
||||
==31759== by 0x601C70: bpstat_stop_status (breakpoint.c:3596)
|
||||
==31759== by 0x65D228: handle_inferior_event (infrun.c:3589)
|
||||
==31759== by 0x65A563: wait_for_inferior (infrun.c:2281)
|
||||
==31759== by 0x659AA0: proceed (infrun.c:1883)
|
||||
==31759== by 0x65300B: continue_1 (infcmd.c:668)
|
||||
==31759== by 0x653282: continue_command (infcmd.c:760)
|
||||
==31759== by 0x5C51D8: do_cfunc (cli-decode.c:67)
|
||||
==31759== by 0x5C824F: cmd_func (cli-decode.c:1738)
|
||||
==31759== by 0x48335A: execute_command (top.c:450)
|
||||
==31759== by 0x67273E: command_handler (event-top.c:511)
|
||||
==31759== by 0x672E53: command_line_handler (event-top.c:736)
|
||||
==31759== Address 0xbbdc950 is 240 bytes inside a block of size 336 free'd
|
||||
==31759== at 0x4A04D72: free (vg_replace_malloc.c:325)
|
||||
==31759== by 0x486E4B: xfree (utils.c:1286)
|
||||
==31759== by 0x60BC35: delete_breakpoint (breakpoint.c:8708)
|
||||
==31759== by 0x60BDAF: delete_command (breakpoint.c:8765)
|
||||
==31759== by 0x5C51D8: do_cfunc (cli-decode.c:67)
|
||||
==31759== by 0x5C824F: cmd_func (cli-decode.c:1738)
|
||||
==31759== by 0x48335A: execute_command (top.c:450)
|
||||
==31759== by 0x67273E: command_handler (event-top.c:511)
|
||||
==31759== by 0x672E53: command_line_handler (event-top.c:736)
|
||||
==31759== by 0x672FCF: gdb_readline2 (event-top.c:817)
|
||||
==31759== by 0x6725F7: stdin_event_handler (event-top.c:433)
|
||||
==31759== by 0x670CDE: handle_file_event (event-loop.c:812)
|
||||
==31759==
|
||||
|
||||
Watchpoint 4 deleted because the program has left the block in
|
||||
which its expression is valid.
|
||||
|
||||
|
||||
There is already automatic deletion of RELATED_BREAKPOINT in
|
||||
map_breakpoint_numbers but "delete breakpoints" (for all the breakpoints)
|
||||
calls delete_breakpoint from delete_command directly without calling
|
||||
map_breakpoint_numbers and it does not delete the associated
|
||||
bp_watchpoint_scope.
|
||||
|
||||
I find the attached patch is right for delete_breakpoint itself as such
|
||||
function should not leave stale references in the leftover data structures.
|
||||
How well could be other code cleaned up with this patch in place I have not
|
||||
targeted by this patch.
|
||||
|
||||
|
||||
The existing code expects accessibility of freed memory and discusses the
|
||||
current stale references problem:
|
||||
|
||||
void
|
||||
delete_breakpoint (struct breakpoint *bpt)
|
||||
[...]
|
||||
/* Has this bp already been deleted? This can happen because multiple
|
||||
lists can hold pointers to bp's. bpstat lists are especial culprits.
|
||||
|
||||
One example of this happening is a watchpoint's scope bp. When the
|
||||
scope bp triggers, we notice that the watchpoint is out of scope, and
|
||||
delete it. We also delete its scope bp. But the scope bp is marked
|
||||
"auto-deleting", and is already on a bpstat. That bpstat is then
|
||||
checked for auto-deleting bp's, which are deleted.
|
||||
|
||||
A real solution to this problem might involve reference counts in bp's,
|
||||
and/or giving them pointers back to their referencing bpstat's, and
|
||||
teaching delete_breakpoint to only free a bp's storage when no more
|
||||
references were extent. A cheaper bandaid was chosen. */
|
||||
if (bpt->type == bp_none)
|
||||
return;
|
||||
[...]
|
||||
bpt->type = bp_none;
|
||||
|
||||
xfree (bpt);
|
||||
}
|
||||
|
||||
|
||||
While fixing this part may be difficult I find the attached patch easy enough
|
||||
fixing the IMO currently most common crash due to it.
|
||||
|
||||
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
"input":
|
||||
set height 0
|
||||
set width 0
|
||||
set confirm no
|
||||
file ../testsuite/gdb.threads/local-watch-wrong-thread
|
||||
set can-use-hw-watchpoints 1
|
||||
break main
|
||||
run
|
||||
break local-watch-wrong-thread.c:36
|
||||
continue
|
||||
delete breakpoints
|
||||
watch *myp
|
||||
continue
|
||||
delete breakpoints
|
||||
echo MAKE watch\n
|
||||
watch *myp if trigger != 0
|
||||
echo MAKE break\n
|
||||
break local-watch-wrong-thread.c:60
|
||||
info break
|
||||
continue
|
||||
echo DELETE five\n
|
||||
delete 5
|
||||
set trigger=1
|
||||
continue
|
||||
set *myp=0
|
||||
break local-watch-wrong-thread.c:47
|
||||
continue
|
||||
|
||||
|
||||
|
||||
2009-12-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* breakpoint.c (delete_breakpoint <bpt->related_breakpoint != NULL>):
|
||||
New.
|
||||
|
||||
--- a/gdb/breakpoint.c
|
||||
+++ b/gdb/breakpoint.c
|
||||
@@ -8649,6 +8649,16 @@ delete_breakpoint (struct breakpoint *bpt)
|
||||
if (bpt->type == bp_none)
|
||||
return;
|
||||
|
||||
+ /* At least avoid this stale reference until the reference counting of
|
||||
+ breakpoints gets resolved. */
|
||||
+ if (bpt->related_breakpoint != NULL)
|
||||
+ {
|
||||
+ gdb_assert (bpt->related_breakpoint->related_breakpoint == bpt);
|
||||
+ bpt->related_breakpoint->disposition = disp_del_at_next_stop;
|
||||
+ bpt->related_breakpoint->related_breakpoint = NULL;
|
||||
+ bpt->related_breakpoint = NULL;
|
||||
+ }
|
||||
+
|
||||
observer_notify_breakpoint_deleted (bpt->number);
|
||||
|
||||
if (breakpoint_chain == bpt)
|
||||
|
69
gdb-testsuite-unknown-output.patch
Normal file
69
gdb-testsuite-unknown-output.patch
Normal file
@ -0,0 +1,69 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-12/msg00473.html
|
||||
Subject: [patch] testsuite: false MI "unknown output after running" regression
|
||||
|
||||
Hi,
|
||||
|
||||
the attached patch will turn the results this way:
|
||||
-KFAIL: gdb.mi/mi-until.exp: until after while loop (unknown output after running) (PRMS: gdb/2104)
|
||||
+KFAIL: gdb.mi/mi-until.exp: until after while loop (stopped at wrong place) (PRMS: gdb/2104)
|
||||
-XFAIL: gdb.mi/mi-watch.exp: sw: watchpoint trigger (unknown output after running)
|
||||
+XFAIL: gdb.mi/mi-watch.exp: sw: watchpoint trigger (stopped at wrong place)
|
||||
-KFAIL: gdb.mi/mi2-until.exp: until after while loop (unknown output after running) (PRMS: gdb/2104)
|
||||
+KFAIL: gdb.mi/mi2-until.exp: until after while loop (stopped at wrong place) (PRMS: gdb/2104)
|
||||
-XFAIL: gdb.mi/mi2-watch.exp: sw: watchpoint trigger (unknown output after running)
|
||||
+XFAIL: gdb.mi/mi2-watch.exp: sw: watchpoint trigger (stopped at wrong place)
|
||||
|
||||
This is a fix of KFAIL-kind regression due to:
|
||||
commit 26d086d741fb1bb0eee9d50e0bafa7c5e388023f
|
||||
Re: [RFA] fix *stopped for CLI commands
|
||||
http://sourceware.org/ml/gdb-patches/2009-02/msg00278.html
|
||||
http://sourceware.org/ml/gdb-cvs/2009-02/msg00084.html
|
||||
part:
|
||||
gdb/testsuite/
|
||||
2009-02-14 Vladimir Prus <vladimir@codesourcery.com>
|
||||
* lib/mi-support.exp (mi_expect_stop): Adjust the order of fields.
|
||||
(mi_expect_interrupt): Likewise.
|
||||
* gdb.mi/mi-cli.exp: Check that "step" results in proper *stopped
|
||||
response.
|
||||
|
||||
re-wdiff-ed for your convenience as:
|
||||
verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}[-thread-id=\"$decimal\",stopped-threads=$any,-]frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped{+,thread-id=\"$decimal\",stopped-threads=$any+}\r\n($thread_selected_re)?$prompt_re"
|
||||
-re "\\*stopped,${r}${a}${bn}[-thread-id=\"$decimal\",stopped-threads=$any,-]frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped{+,thread-id=\"$decimal\",stopped-threads=$any+}\r\n($thread_selected_re)?$prompt_re" {
|
||||
-re "\\*stopped,${r}${a}${bn}[-thread-id=\"$decimal\",stopped-threads=$any,-]frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}[-$any-]{+thread-id=\"$decimal\",stopped-threads=$any+}\r\n$prompt_re" {
|
||||
|
||||
FYI there is: set any "\[^\n\]*"
|
||||
|
||||
"stopped at wrong place" is the right kind of KFAIL/XFAIL (tested
|
||||
gcc-4.1.2-46.el5_4.1.x86_64 and gcc-4.4.2-20.fc12.x86_64) as discussed
|
||||
in PR gdb/2104.
|
||||
|
||||
In the last case there is missing comma (,) after the former patch above.
|
||||
|
||||
$after_stopped was IMO missing there even before. It is in use only by
|
||||
gdb.mi/mi-simplerun.exp and gdb.mi/mi2-simplerun.exp. Also fixed below.
|
||||
|
||||
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/testsuite/
|
||||
2009-12-31 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* lib/mi-support.exp (mi_expect_stop <stopped at wrong place>): Insert
|
||||
missing $after_stopped and comma (,) expectation.
|
||||
|
||||
--- a/gdb/testsuite/lib/mi-support.exp
|
||||
+++ b/gdb/testsuite/lib/mi-support.exp
|
||||
@@ -1038,7 +1038,7 @@ proc mi_expect_stop { reason func args file line extra test } {
|
||||
pass "$test"
|
||||
return $expect_out(2,string)
|
||||
}
|
||||
- -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" {
|
||||
+ -re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" {
|
||||
verbose -log "got $expect_out(buffer)"
|
||||
fail "$test (stopped at wrong place)"
|
||||
return -1
|
||||
|
231
gdb-watchpoint-cond-gone.patch
Normal file
231
gdb-watchpoint-cond-gone.patch
Normal file
@ -0,0 +1,231 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-12/msg00394.html
|
||||
Subject: [patch] Fix watchpoint-at-epilogue 7.0 regression (s390x)
|
||||
|
||||
Hi,
|
||||
|
||||
attached testcase regressed 6.8->7.0 on some s390x systems.
|
||||
|
||||
At the moment PC is at epilogue (after frame pointer got destroyed and PC is
|
||||
still in the calleed function) we must not try any unwinding as it can try to
|
||||
unwind a garbage.
|
||||
|
||||
Correct way would be to implement epilogue unwinder (such as
|
||||
amd64_epilogue_frame_unwind or i386_epilogue_frame_unwind ones) but it would
|
||||
not be so easy on s390x as it would need full prologue-analyzer: After SP gets
|
||||
restored there can be various instructions before the last jump - GDB needs to
|
||||
interpret the jump to find the register value where it is going to jump to.
|
||||
00000048279aa09c <round_and_return>:
|
||||
[...]
|
||||
48279aa1b8: eb 6f f0 d0 00 04 lmg %r6,%r15,208(%r15)
|
||||
48279aa1be: 50 32 10 00 st %r3,0(%r2,%r1) # SP (%r15) is gone hone
|
||||
48279aa1c2: b3 74 00 00 lzer %r0
|
||||
48279aa1c6: 07 f4 br %r4 # %r4 is the target
|
||||
[...]
|
||||
|
||||
Just an easy fix is to be more careful and do not try any unwinding if we find
|
||||
PC is in the epilogue (previous instruction modifies SP=%r15).
|
||||
|
||||
It is even a performance optimization and I see no regression risk there.
|
||||
|
||||
The specific s390x error is:
|
||||
#0 throw_error (error=MEMORY_ERROR, fmt=0x8042676a "Cannot access memory at address %s") at exceptions.c:415
|
||||
#1 in memory_error (status=5, memaddr=0) at corefile.c:220
|
||||
#2 in read_memory (memaddr=0, myaddr=0x3ffffc7f7f0 "", len=8) at corefile.c:238
|
||||
#3 in read_memory_unsigned_integer (memaddr=0, len=8, byte_order=BFD_ENDIAN_BIG) at corefile.c:321
|
||||
#4 in s390_backchain_frame_unwind_cache (this_frame=0x80608958, info=0x80608a08) at s390-tdep.c:1525
|
||||
#5 in s390_frame_unwind_cache (this_frame=0x80608958, this_prologue_cache=0x80608970) at s390-tdep.c:1572
|
||||
#6 in s390_frame_this_id (this_frame=0x80608958, this_prologue_cache=0x80608970, this_id=0x806089b8) at s390-tdep.c:1583
|
||||
#7 in get_frame_id (fi=0x80608958) at frame.c:335
|
||||
#8 in frame_find_by_id (id={stack_addr = 4398044824952, code_addr = 2147484952, special_addr = 0, stack_addr_p = 1, code_addr_p = 1, special_addr_p = 0, inline_depth = 0}) at frame.c:587
|
||||
#9 in watchpoint_check (p=0x8095bbc0) at breakpoint.c:3203
|
||||
#10 in catch_errors (func=0x801262c0 <watchpoint_check>, func_args=0x8095bbc0, errstring=0x80a26410 "Error evaluating expression for watchpoint 3\n", mask=6) at exceptions.c:510
|
||||
#11 in bpstat_check_watchpoint (bs=0x8095bbc0) at breakpoint.c:3404
|
||||
#12 in bpstat_stop_status (aspace=0x8061fcb0, bp_addr=2147485040, ptid={pid = 17372, lwp = 17372, tid = 0}) at breakpoint.c:3594
|
||||
#13 in handle_inferior_event (ecs=0x3ffffc80520) at infrun.c:3588
|
||||
|
||||
I did not analyze why 6.8 did not error out, the GDB code is similar there.
|
||||
|
||||
No regressions on:
|
||||
{x86_64,x86_64-m32,i686}-fedora12-linux-gnu (CVS HEAD GDB)
|
||||
s390x-rhel48-linux-gnu (CVS HEAD GDB)
|
||||
s390-rhel48-linux-gnu (CVS HEAD GDB)
|
||||
s390x-rhel54-linux-gnu (Fedora 12 GDB)
|
||||
s390-rhel54-linux-gnu (Fedora 12 GDB)
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-12-25 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* breakpoint.c (watchpoint_check): Check the call
|
||||
gdbarch_in_function_epilogue_p before calling frame_find_by_id.
|
||||
Extend the comment.
|
||||
|
||||
gdb/testsuite/
|
||||
2009-12-25 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.base/watchpoint-cond-gone.exp, gdb.base/watchpoint-cond-gone.c,
|
||||
gdb.base/watchpoint-cond-gone-stripped.c: New.
|
||||
|
||||
--- a/gdb/breakpoint.c
|
||||
+++ b/gdb/breakpoint.c
|
||||
@@ -3200,6 +3200,17 @@ watchpoint_check (void *p)
|
||||
struct gdbarch *frame_arch = get_frame_arch (frame);
|
||||
CORE_ADDR frame_pc = get_frame_pc (frame);
|
||||
|
||||
+ /* in_function_epilogue_p() returns a non-zero value if we're still
|
||||
+ in the function but the stack frame has already been invalidated.
|
||||
+ Since we can't rely on the values of local variables after the
|
||||
+ stack has been destroyed, we are treating the watchpoint in that
|
||||
+ state as `not changed' without further checking. Don't mark
|
||||
+ watchpoints as changed if the current frame is in an epilogue -
|
||||
+ even if they are in some other frame, our view of the stack
|
||||
+ is likely to be wrong and frame_find_by_id could error out. */
|
||||
+ if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
|
||||
+ return WP_VALUE_NOT_CHANGED;
|
||||
+
|
||||
fr = frame_find_by_id (b->watchpoint_frame);
|
||||
within_current_scope = (fr != NULL);
|
||||
|
||||
@@ -3216,17 +3227,6 @@ watchpoint_check (void *p)
|
||||
within_current_scope = 0;
|
||||
}
|
||||
|
||||
- /* in_function_epilogue_p() returns a non-zero value if we're still
|
||||
- in the function but the stack frame has already been invalidated.
|
||||
- Since we can't rely on the values of local variables after the
|
||||
- stack has been destroyed, we are treating the watchpoint in that
|
||||
- state as `not changed' without further checking. Don't mark
|
||||
- watchpoints as changed if the current frame is in an epilogue -
|
||||
- even if they are in some other frame, our view of the stack
|
||||
- is likely to be wrong. */
|
||||
- if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
|
||||
- return WP_VALUE_NOT_CHANGED;
|
||||
-
|
||||
if (within_current_scope)
|
||||
/* If we end up stopping, the current frame will get selected
|
||||
in normal_stop. So this call to select_frame won't affect
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone-stripped.c
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2009 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. */
|
||||
+
|
||||
+void
|
||||
+jumper (void (*jumpto) (void))
|
||||
+{
|
||||
+ (*jumpto) ();
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone.c
|
||||
@@ -0,0 +1,37 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2009 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. */
|
||||
+
|
||||
+extern void jumper (void (*jumpto) (void));
|
||||
+
|
||||
+static void
|
||||
+func (void)
|
||||
+{
|
||||
+ volatile int c;
|
||||
+
|
||||
+ c = 5;
|
||||
+ c = 10; /* watchpoint-here */
|
||||
+ c = 20;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ jumper (func);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone.exp
|
||||
@@ -0,0 +1,51 @@
|
||||
+# Copyright 2009 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.
|
||||
+
|
||||
+set testfile "watchpoint-cond-gone"
|
||||
+set srcfile ${testfile}.c
|
||||
+set srcfilestripped ${testfile}-stripped.c
|
||||
+set objfilestripped ${objdir}/${subdir}/${testfile}-stripped.o
|
||||
+set binfile ${objdir}/${subdir}/${testfile}
|
||||
+
|
||||
+# We need to generate a function without DWARF to crash older GDB.
|
||||
+# Stepping into a dynamic function trampoline or stepping out of MAIN may work
|
||||
+# but it is not a reliable FAIL case.
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfilestripped}" "${objfilestripped}" object {}] != ""
|
||||
+ || [gdb_compile "${srcdir}/${subdir}/${srcfile} ${objfilestripped}" "${binfile}" executable {debug}] != "" } {
|
||||
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
|
||||
+}
|
||||
+
|
||||
+clean_restart ${testfile}
|
||||
+
|
||||
+# Problem does not occur otherwise.
|
||||
+gdb_test "set can-use-hw-watchpoints 0"
|
||||
+
|
||||
+if ![runto_main] {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_breakpoint [gdb_get_line_number "watchpoint-here"]
|
||||
+gdb_continue_to_breakpoint "Place to set the watchpoint"
|
||||
+
|
||||
+# The condition `c == 30' is the subject being tested.
|
||||
+gdb_test "watch c if c == 30" "" "Place the watchpoint"
|
||||
+
|
||||
+# We may stay either in the function itself or only at the first instruction of
|
||||
+# its caller depending on the epilogue unwinder (or valid epilogue CFI) presence.
|
||||
+gdb_test "finish" \
|
||||
+ "Watchpoint .* deleted because the program has left the block in.*which its expression is valid..*in (jumper|func).*" \
|
||||
+ "Catch the no longer valid watchpoint"
|
||||
|
121
gdb-x86_64-i386-syscall-restart.patch
Normal file
121
gdb-x86_64-i386-syscall-restart.patch
Normal file
@ -0,0 +1,121 @@
|
||||
http://sourceware.org/ml/gdb-patches/2009-11/msg00592.html
|
||||
Subject: [patch] Fix syscall restarts for amd64->i386 biarch
|
||||
|
||||
Hi,
|
||||
|
||||
tested only on recent Linux kernels, it should apply also on vanilla ones.
|
||||
There were various changes of the kernels behavior in the past.
|
||||
|
||||
FSF GDB HEAD state:
|
||||
kernel debugger inferior state
|
||||
x86_64 x86_64 x86_64 PASS
|
||||
x86_64 x86_64 i386 FAIL without this patch, PASS with this patch
|
||||
x86_64 i386 i386 PASS on recent kernels
|
||||
(FAIL: kernel-2.6.31.5-127.fc12.x86_64 - Fedora 12)
|
||||
(PASS: kernel-2.6.32-0.55.rc8.git1.fc13.x86_64)
|
||||
i386 i386 i386 PASS
|
||||
|
||||
|
||||
Currently gdb.base/interrupt.exp fails on amd64 host running under
|
||||
--target_board unix/-m32 with:
|
||||
continue
|
||||
Continuing.
|
||||
Unknown error 512
|
||||
|
||||
<linux/errno.h>:
|
||||
/*
|
||||
* These should never be seen by user programs. To return one of ERESTART*
|
||||
* codes, signal_pending() MUST be set. Note that ptrace can observe these
|
||||
* at syscall exit tracing, but they will never be left for the debugged user
|
||||
* process to see.
|
||||
*/
|
||||
#define ERESTARTSYS 512
|
||||
|
||||
"Unknown error 512" printed above is printed by the inferior itself, not by GDB.
|
||||
|
||||
It is because GDB reads it as 0xfffffffffffffe00 but writes it back as
|
||||
0xfffffe00.
|
||||
+ /* Sign-extend %eax as during return from a syscall it is being checked
|
||||
+ for -ERESTART* values -512 being above 0xfffffffffffffe00; tested by
|
||||
+ interrupt.exp. */
|
||||
|
||||
|
||||
Quote of Roland McGrath from IRC:
|
||||
|
||||
roland: in the user_regset model, there are 64-bit user_regset flavors and
|
||||
32-bit user_regset flavors, so at the kabi level the (kernel) caller can say
|
||||
what it means: calls on the 32-bit user_regset flavor will behave as if on
|
||||
a 32-bit kernel/userland. in ptrace, there is no way for x86_64 ptrace calls
|
||||
to say "i think of the inferior as being 32 bits, so act accordingly" (tho ppc
|
||||
and/or sparc have ptr
|
||||
roland: ace requests that do that iirc)
|
||||
roland: ergo 64-bit ptrace callers must either save/restore full 64-bits so
|
||||
the kernel's sign-extension choices are preserved, or else grok magic ways to
|
||||
expand stored 32-bit register contents to 64-bit values to stuff via 64-bit
|
||||
ptrace
|
||||
[...]
|
||||
roland: there is a "32-bit-flavored task", but it's not really true that it
|
||||
has 32-bit registers. there is no 32-bit-only userland condition. any task
|
||||
can always ljmp to the 64-bit code segment and run 64-bit insns including
|
||||
a 64-bit syscall
|
||||
roland: so a 64-bit debugger should see and be able to fiddle the full
|
||||
registers. it can even change cs via ptrace to force the inferior into
|
||||
running 32 or 64 bit code.
|
||||
|
||||
|
||||
Saving whole 64bits for i386 targets on x86_64 hosts does not much match the
|
||||
GDB architecture as `struct type' for these registers still should be 32bit
|
||||
etc. Therefore provided just this exception.
|
||||
|
||||
The problem is reproducible only if one does an inferior call during the
|
||||
interruption to do full inferior save/restore from GDB regcache.
|
||||
|
||||
Regression tested on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* amd64-nat.c (amd64_collect_native_gregset): Do not pre-clear %eax.
|
||||
Sign extend it afterwards.
|
||||
|
||||
--- a/gdb/amd64-nat.c
|
||||
+++ b/gdb/amd64-nat.c
|
||||
@@ -131,9 +131,9 @@ amd64_collect_native_gregset (const struct regcache *regcache,
|
||||
{
|
||||
num_regs = amd64_native_gregset32_num_regs;
|
||||
|
||||
- /* Make sure %eax, %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp and
|
||||
+ /* Make sure %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp and
|
||||
%eip get zero-extended to 64 bits. */
|
||||
- for (i = 0; i <= I386_EIP_REGNUM; i++)
|
||||
+ for (i = I386_ECX_REGNUM; i <= I386_EIP_REGNUM; i++)
|
||||
{
|
||||
if (regnum == -1 || regnum == i)
|
||||
memset (regs + amd64_native_gregset_reg_offset (gdbarch, i), 0, 8);
|
||||
@@ -159,4 +159,20 @@ amd64_collect_native_gregset (const struct regcache *regcache,
|
||||
regcache_raw_collect (regcache, i, regs + offset);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (gdbarch_ptr_bit (gdbarch) == 32)
|
||||
+ {
|
||||
+ /* Sign-extend %eax as during return from a syscall it is being checked
|
||||
+ for -ERESTART* values -512 being above 0xfffffffffffffe00; tested by
|
||||
+ interrupt.exp. */
|
||||
+
|
||||
+ int i = I386_EAX_REGNUM;
|
||||
+
|
||||
+ if (regnum == -1 || regnum == i)
|
||||
+ {
|
||||
+ void *ptr = regs + amd64_native_gregset_reg_offset (gdbarch, i);
|
||||
+
|
||||
+ *(int64_t *) ptr = *(int32_t *) ptr;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
605
gdb.spec
605
gdb.spec
@ -4,21 +4,45 @@
|
||||
# --with upstream: No Fedora specific patches get applied.
|
||||
# --without python: No python support.
|
||||
|
||||
# RHEL-5 was the last not providing `/etc/rpm/macros.dist'.
|
||||
%if 0%{!?dist:1}
|
||||
%define rhel 5
|
||||
%define dist .el5
|
||||
%define el5 1
|
||||
%endif
|
||||
# RHEL-5 Brew does not set %{el5}.
|
||||
%if "%{dist}" == ".el5"
|
||||
# RHEL-5 ppc* python .so files are shipped only as ppc but gdb is ppc64 there.
|
||||
# Brew builds it fine as its ppc64 buildroot has full ppc64 package set.
|
||||
# Make this conditional so that Brew-built GDB has no python on any arch but
|
||||
# GDB rebuilt on native non-ppc64 host does have it.
|
||||
%if 0%{!?el5:1}
|
||||
%define _without_python 1
|
||||
%else
|
||||
%ifarch ppc64
|
||||
%define _without_python 1
|
||||
%endif
|
||||
%endif
|
||||
%define el5 1
|
||||
%endif
|
||||
|
||||
Summary: A GNU source-level debugger for C, C++, Java and other languages
|
||||
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
|
||||
# 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.8.91.20090930
|
||||
Version: 7.0.1
|
||||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
Release: 1%{?_with_upstream:.upstream}%{?dist}
|
||||
Release: 25%{?_with_upstream:.upstream}%{dist}
|
||||
|
||||
License: GPLv3+
|
||||
Group: Development/Debuggers
|
||||
Source: ftp://sourceware.org/pub/gdb/snapshots/branch/gdb-%{version}.tar.bz2
|
||||
# ftp://sourceware.org/pub/gdb/snapshots/branch/gdb-%{version}.tar.bz2
|
||||
# ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.bz2
|
||||
Source: ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.bz2
|
||||
Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
|
||||
URL: http://gnu.org/software/gdb/
|
||||
|
||||
@ -39,11 +63,13 @@ URL: http://gnu.org/software/gdb/
|
||||
Obsoletes: gdb64 < 5.3.91
|
||||
%endif
|
||||
|
||||
%if 0%{!?el5:1}
|
||||
%if 0%{!?_with_upstream:1}
|
||||
# The last Rawhide release was (no dist tag) pstack-1.2-7.2.2
|
||||
Obsoletes: pstack < 1.2-7.2.2.1
|
||||
Provides: pstack = 1.2-7.2.2.1
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%endif # 0%{!?el5:1}
|
||||
|
||||
# GDB patches have the format `gdb-<version>-bz<red-hat-bz-#>-<desc>.patch'.
|
||||
# They should be created using patch level 1: diff -up ./gdb (or gdb-6.3/gdb).
|
||||
@ -56,7 +82,7 @@ Source3: gdb-gstack.man
|
||||
|
||||
# libstdc++ pretty printers from GCC SVN HEAD (4.5 experimental).
|
||||
%define libstdcxxpython libstdc++-v3-python-r151798
|
||||
Source4: %{libstdcxxpython}.tar.xz
|
||||
Source4: %{libstdcxxpython}.tar.bz2
|
||||
|
||||
# Work around out-of-date dejagnu that does not have KFAIL
|
||||
Patch1: gdb-6.3-rh-dummykfail-20041202.patch
|
||||
@ -92,14 +118,13 @@ Patch118: gdb-6.3-gstack-20050411.patch
|
||||
|
||||
# VSYSCALL and PIE
|
||||
Patch122: gdb-6.3-test-pie-20050107.patch
|
||||
Patch124: gdb-6.3-pie-20050110.patch
|
||||
Patch124: gdb-archer-pie.patch
|
||||
Patch389: gdb-archer-pie-addons.patch
|
||||
Patch394: gdb-archer-pie-addons-keep-disabled.patch
|
||||
|
||||
# Get selftest working with sep-debug-info
|
||||
Patch125: gdb-6.3-test-self-20050110.patch
|
||||
|
||||
# Fix for non-threaded watchpoints.
|
||||
Patch128: gdb-6.3-nonthreaded-wp-20050117.patch
|
||||
|
||||
# Test support of multiple destructors just like multiple constructors
|
||||
Patch133: gdb-6.3-test-dtorfix-20050121.patch
|
||||
|
||||
@ -125,10 +150,6 @@ Patch145: gdb-6.3-threaded-watchpoints2-20050225.patch
|
||||
# Fix printing of inherited members
|
||||
Patch148: gdb-6.3-inheritance-20050324.patch
|
||||
|
||||
# Print a warning when the separate debug info's CRC doesn't match.
|
||||
Patch150: gdb-6.3-test-sepcrc-20050402.patch
|
||||
Patch151: gdb-6.3-sepcrc-20050402.patch
|
||||
|
||||
# Do not issue warning message about first page of storage for ia64 gcore
|
||||
Patch153: gdb-6.3-ia64-gcore-page0-20050421.patch
|
||||
|
||||
@ -219,8 +240,8 @@ Patch229: gdb-6.3-bz140532-ppc-unwinding-test.patch
|
||||
# Testcase for exec() from threaded program (BZ 202689).
|
||||
Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
|
||||
|
||||
# Backported post gdb-6.8.50.20090991 snapshot fixups.
|
||||
#Patch232: gdb-6.8.50.20090921-upstream.patch
|
||||
# Backported post gdb-7.0 fixups.
|
||||
Patch232: gdb-7.0-upstream.patch
|
||||
|
||||
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
|
||||
Patch234: gdb-6.6-bz230000-power6-disassembly-test.patch
|
||||
@ -301,8 +322,8 @@ Patch309: gdb-6.3-mapping-zero-inode-test.patch
|
||||
# Test a crash on `focus cmd', `focus prev' commands.
|
||||
Patch311: gdb-6.3-focus-cmd-prev-test.patch
|
||||
|
||||
# Test crash on a sw watchpoint condition getting out of the scope.
|
||||
Patch314: gdb-6.3-watchpoint-cond-gone-test.patch
|
||||
# Fix error on a sw watchpoint active at function epilogue (hit on s390x).
|
||||
Patch314: gdb-watchpoint-cond-gone.patch
|
||||
|
||||
# Test various forms of threads tracking across exec() (BZ 442765).
|
||||
Patch315: gdb-6.8-bz442765-threaded-exec-test.patch
|
||||
@ -367,54 +388,144 @@ Patch376: libstdc++-v3-python-common-prefix.patch
|
||||
# New test for step-resume breakpoint placed in multiple threads at once.
|
||||
Patch381: gdb-simultaneous-step-resume-breakpoint-test.patch
|
||||
|
||||
BuildRequires: ncurses-devel texinfo gettext flex bison expat-devel
|
||||
Requires: readline
|
||||
BuildRequires: readline-devel
|
||||
# Fix GNU/Linux core open: Can't read pathname for load map: Input/output error.
|
||||
Patch382: gdb-core-open-vdso-warning.patch
|
||||
|
||||
# Support multiple directories for `set debug-file-directory' (BZ 528668).
|
||||
Patch383: gdb-bz528668-symfile-sepcrc.patch
|
||||
Patch384: gdb-bz528668-symfile-cleanup.patch
|
||||
Patch385: gdb-bz528668-symfile-multi.patch
|
||||
|
||||
# Support GNU IFUNCs - indirect functions (BZ 539590).
|
||||
Patch387: gdb-bz539590-gnu-ifunc.patch
|
||||
|
||||
# Fix bp conditionals [bp_location-accel] regression (BZ 538626).
|
||||
Patch388: gdb-bz538626-bp_location-accel-bp-cond.patch
|
||||
|
||||
# Fix callback-mode readline-6.0 regression for CTRL-C.
|
||||
Patch390: gdb-readline-6.0-signal.patch
|
||||
|
||||
# Fix syscall restarts for amd64->i386 biarch.
|
||||
Patch391: gdb-x86_64-i386-syscall-restart.patch
|
||||
|
||||
# Fix stepping with OMP parallel Fortran sections (BZ 533176).
|
||||
Patch392: gdb-bz533176-fortran-omp-step.patch
|
||||
|
||||
# Use gfortran44 when running the testsuite on RHEL-5.
|
||||
Patch393: gdb-rhel5-gcc44.patch
|
||||
|
||||
# Disable warning messages new for gdb-6.8+ for RHEL-5 backward compatibility.
|
||||
# Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).
|
||||
Patch335: gdb-rhel5-compat.patch
|
||||
|
||||
# Fix backward compatibility with G++ 4.1 namespaces "::".
|
||||
Patch395: gdb-empty-namespace.patch
|
||||
|
||||
# Fix regression on re-setting the single ppc watchpoint slot.
|
||||
Patch396: gdb-ppc-hw-watchpoint-twice.patch
|
||||
|
||||
# Fix regression by python on ia64 due to stale current frame.
|
||||
Patch397: gdb-follow-child-stale-parent.patch
|
||||
|
||||
# testsuite: Fix false MI "unknown output after running" regression.
|
||||
Patch398: gdb-testsuite-unknown-output.patch
|
||||
|
||||
# Fix regression of gdb-7.0.1 not preserving typedef of a field.
|
||||
Patch399: gdb-bitfield-check_typedef.patch
|
||||
|
||||
# Fix related_breakpoint stale ref crash.
|
||||
Patch400: gdb-stale-related_breakpoint.patch
|
||||
|
||||
# Fix crash reading broken stabs (it377671).
|
||||
Patch401: gdb-stabs-read_args.patch
|
||||
|
||||
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
|
||||
Requires: readline%{?_isa}
|
||||
BuildRequires: readline-devel%{?_isa}
|
||||
%if 0%{!?el5:1}
|
||||
# dlopen() no longer makes rpm-libs a mandatory dependency.
|
||||
#Requires: rpm-libs
|
||||
BuildRequires: rpm-devel
|
||||
#Requires: rpm-libs%{?_isa}
|
||||
BuildRequires: rpm-devel%{?_isa}
|
||||
%endif # 0%{!?el5:1}
|
||||
Requires: zlib%{?_isa}
|
||||
BuildRequires: zlib-devel%{?_isa}
|
||||
%if 0%{!?_without_python:1}
|
||||
Requires: python-libs
|
||||
BuildRequires: python-devel
|
||||
# Temporarily before it gets moved to libstdc++.rpm
|
||||
BuildRequires: libstdc++
|
||||
%endif # 0%{!?_without_python:1}
|
||||
%if 0%{!?el5:1}
|
||||
Requires: python-libs%{?_isa}
|
||||
%else
|
||||
Requires: python%{?_isa}
|
||||
%endif
|
||||
BuildRequires: python-devel%{?_isa}
|
||||
# Temporarily before python files get moved to libstdc++.rpm
|
||||
# libstdc++%{bits_other} is not present in Koji, the .spec script generating
|
||||
# gdb/python/libstdcxx/ also does not depend on the %{bits_other} files.
|
||||
BuildRequires: libstdc++%{?_isa}
|
||||
%endif # 0%{!?_without_python:1}
|
||||
|
||||
%if 0%{?_with_testsuite:1}
|
||||
|
||||
# Ensure the devel libraries are installed for both multilib arches.
|
||||
%define bits_local %{?_isa}
|
||||
%define bits_other %{?_isa}
|
||||
%ifarch s390x
|
||||
%define bits_other (%{__isa_name}-31)
|
||||
%else #!s390x
|
||||
%ifarch ppc
|
||||
%define bits_other (%{__isa_name}-64)
|
||||
%else #!ppc
|
||||
%ifarch sparc64 ppc64 s390x x86_64
|
||||
%define bits_other (%{__isa_name}-32)
|
||||
%endif #sparc64 ppc64 s390x x86_64
|
||||
%endif #!ppc
|
||||
%endif #!s390x
|
||||
|
||||
BuildRequires: sharutils dejagnu
|
||||
# gcc-objc++ is not covered by the GDB testsuite.
|
||||
BuildRequires: gcc gcc-c++ gcc-gfortran gcc-java gcc-objc fpc glibc-static
|
||||
# Ensure the devel libraries are installed for both multilib arches.
|
||||
%define multilib_64_archs sparc64 ppc64 s390x x86_64
|
||||
# Copied from gcc-4.1.2-32
|
||||
%ifarch %{ix86} x86_64 ia64 ppc alpha
|
||||
BuildRequires: gcc-gnat
|
||||
%ifarch %{multilib_64_archs} ppc
|
||||
BuildRequires: %{_exec_prefix}/lib64/libgnat-4.4.so %{_exec_prefix}/lib/libgnat-4.4.so
|
||||
%endif
|
||||
%endif
|
||||
%ifarch %{multilib_64_archs} sparc sparcv9 ppc
|
||||
BuildRequires: /lib/libc.so.6 %{_exec_prefix}/lib/libc.so /lib64/libc.so.6 %{_exec_prefix}/lib64/libc.so
|
||||
BuildRequires: /lib/libgcc_s.so.1 /lib64/libgcc_s.so.1
|
||||
BuildRequires: %{_exec_prefix}/lib/libstdc++.so.6 %{_exec_prefix}/lib64/libstdc++.so.6
|
||||
BuildRequires: %{_exec_prefix}/lib64/libgcj.so.10 %{_exec_prefix}/lib/libgcj.so.10
|
||||
# multilib glibc-static is open Bug 488472:
|
||||
#BuildRequires: %{_exec_prefix}/lib64/libc.a %{_exec_prefix}/lib/libc.a
|
||||
# for gcc-java:
|
||||
BuildRequires: %{_exec_prefix}/lib64/libz.so %{_exec_prefix}/lib/libz.so
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%ifarch ia64
|
||||
BuildRequires: libunwind-devel >= 0.99-0.1.frysk20070405cvs
|
||||
Requires: libunwind >= 0.99-0.1.frysk20070405cvs
|
||||
%else
|
||||
# Prelink is broken on sparcv9/sparc64
|
||||
BuildRequires: gcc gcc-c++ gcc-gfortran gcc-java gcc-objc
|
||||
# Copied from prelink-0.4.2-3.fc13.
|
||||
%ifarch %{ix86} alpha sparc sparcv9 sparc64 s390 s390x x86_64 ppc ppc64
|
||||
# Prelink is broken on sparcv9/sparc64.
|
||||
%ifnarch sparcv9 sparc64
|
||||
BuildRequires: prelink
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%if 0%{!?rhel:1}
|
||||
BuildRequires: fpc
|
||||
%endif
|
||||
%if 0%{?el5:1}
|
||||
BuildRequires: gcc44 gcc44-gfortran
|
||||
%endif
|
||||
# Copied from gcc-4.1.2-32.
|
||||
%ifarch %{ix86} x86_64 ia64 ppc alpha
|
||||
BuildRequires: gcc-gnat
|
||||
BuildRequires: libgnat%{bits_local} libgnat%{bits_other}
|
||||
%endif
|
||||
BuildRequires: glibc-devel%{bits_local} glibc-devel%{bits_other}
|
||||
BuildRequires: libgcc%{bits_local} libgcc%{bits_other}
|
||||
# libstdc++-devel of matching bits is required only for g++ -static.
|
||||
BuildRequires: libstdc++%{bits_local} libstdc++%{bits_other}
|
||||
BuildRequires: libgcj%{bits_local} libgcj%{bits_other}
|
||||
BuildRequires: glibc-static%{bits_local}
|
||||
# multilib glibc-static is open Bug 488472:
|
||||
%if 0%{?el5:1}
|
||||
BuildRequires: glibc-static%{bits_other}
|
||||
%endif
|
||||
# for gcc-java linkage:
|
||||
BuildRequires: zlib-devel%{bits_local} zlib-devel%{bits_other}
|
||||
BuildRequires: valgrind%{bits_local} valgrind%{bits_other}
|
||||
|
||||
%endif # 0%{?_with_testsuite:1}
|
||||
|
||||
%ifarch ia64
|
||||
%if 0%{!?el5:1}
|
||||
BuildRequires: libunwind-devel >= 0.99-0.1.frysk20070405cvs
|
||||
Requires: libunwind >= 0.99-0.1.frysk20070405cvs
|
||||
%else
|
||||
BuildRequires: libunwind >= 0.96-3
|
||||
Requires: libunwind >= 0.96-3
|
||||
%endif
|
||||
%endif
|
||||
|
||||
Requires(post): /sbin/install-info
|
||||
Requires(preun): /sbin/install-info
|
||||
|
||||
@ -423,6 +534,7 @@ GDB, the GNU debugger, allows you to debug programs written in C, C++,
|
||||
Java, and other languages, by executing them in a controlled fashion
|
||||
and printing their data.
|
||||
|
||||
%if 0%{!?el5:1}
|
||||
%package gdbserver
|
||||
Summary: A standalone server for GDB (the GNU source-level debugger)
|
||||
Group: Development/Debuggers
|
||||
@ -433,6 +545,7 @@ Java, and other languages, by executing them in a controlled fashion
|
||||
and printing their data.
|
||||
|
||||
This package provides a program that allows you to run GDB on a different machine than the one which is running the program being debugged.
|
||||
%endif # 0%{!?el5:1}
|
||||
|
||||
%prep
|
||||
|
||||
@ -442,7 +555,7 @@ This package provides a program that allows you to run GDB on a different machin
|
||||
%setup -q -n %{gdb_src}
|
||||
|
||||
# libstdc++ pretty printers.
|
||||
xz -dc %{SOURCE4} | tar xf -
|
||||
tar xjf %{SOURCE4}
|
||||
|
||||
# Files have `# <number> <file>' statements breaking VPATH / find-debuginfo.sh .
|
||||
rm -f gdb/ada-exp.c gdb/ada-lex.c gdb/c-exp.c gdb/cp-name-parser.c gdb/f-exp.c
|
||||
@ -455,8 +568,13 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
|
||||
%if 0%{!?_with_upstream:1}
|
||||
|
||||
#patch232 -p1
|
||||
%patch232 -p1
|
||||
%patch349 -p1
|
||||
%patch383 -p1
|
||||
%patch384 -p1
|
||||
%patch385 -p1
|
||||
%patch388 -p1
|
||||
%patch124 -p1
|
||||
%patch1 -p1
|
||||
%patch3 -p1
|
||||
|
||||
@ -468,7 +586,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch118 -p1
|
||||
%patch122 -p1
|
||||
%patch125 -p1
|
||||
%patch128 -p1
|
||||
%patch133 -p1
|
||||
%patch136 -p1
|
||||
%patch140 -p1
|
||||
@ -477,8 +594,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch142 -p1
|
||||
%patch145 -p1
|
||||
%patch148 -p1
|
||||
%patch150 -p1
|
||||
%patch151 -p1
|
||||
%patch153 -p1
|
||||
%patch157 -p1
|
||||
%patch158 -p1
|
||||
@ -560,15 +675,37 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch375 -p1
|
||||
%patch376 -p1
|
||||
%patch381 -p1
|
||||
%patch124 -p1
|
||||
%patch382 -p1
|
||||
%patch387 -p1
|
||||
%patch389 -p1
|
||||
%patch390 -p1
|
||||
%patch391 -p1
|
||||
%patch392 -p1
|
||||
# Always verify its applicability.
|
||||
%patch393 -p1
|
||||
%patch335 -p1
|
||||
%if 0%{!?el5:1}
|
||||
%patch393 -p1 -R
|
||||
%patch335 -p1 -R
|
||||
%endif
|
||||
%patch394 -p1
|
||||
%patch395 -p1
|
||||
%patch396 -p1
|
||||
%patch397 -p1
|
||||
%patch398 -p1
|
||||
%patch399 -p1
|
||||
%patch400 -p1
|
||||
%patch401 -p1
|
||||
|
||||
find -name "*.orig" | xargs rm -f
|
||||
! find -name "*.rej" # Should not happen.
|
||||
! find -name "*.rej" # Should not happen.
|
||||
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
|
||||
# Change the version that gets printed at GDB startup, so it is Fedora
|
||||
# specific.
|
||||
# Fedora (%{version}-%{release})
|
||||
# Red Hat Enterprise Linux (%{version}-%{release})
|
||||
cat > gdb/version.in << _FOO
|
||||
Fedora (%{version}-%{release})
|
||||
_FOO
|
||||
@ -604,44 +741,52 @@ export CFLAGS="$RPM_OPT_FLAGS"
|
||||
CFLAGS="$CFLAGS -O0 -ggdb2"
|
||||
%endif
|
||||
|
||||
../configure \
|
||||
--prefix=%{_prefix} \
|
||||
--libdir=%{_libdir} \
|
||||
--sysconfdir=%{_sysconfdir} \
|
||||
--mandir=%{_mandir} \
|
||||
--infodir=%{_infodir} \
|
||||
--with-gdb-datadir=%{_datadir}/gdb \
|
||||
--with-pythondir=%{_datadir}/gdb/python \
|
||||
--enable-gdb-build-warnings=,-Wno-unused \
|
||||
../configure \
|
||||
--prefix=%{_prefix} \
|
||||
--libdir=%{_libdir} \
|
||||
--sysconfdir=%{_sysconfdir} \
|
||||
--mandir=%{_mandir} \
|
||||
--infodir=%{_infodir} \
|
||||
--with-gdb-datadir=%{_datadir}/gdb \
|
||||
--with-pythondir=%{_datadir}/gdb/python \
|
||||
--enable-gdb-build-warnings=,-Wno-unused \
|
||||
%ifnarch %{ix86} alpha ia64 ppc s390 s390x x86_64 ppc64 sparcv9 sparc64
|
||||
--disable-werror \
|
||||
%else
|
||||
--disable-werror \
|
||||
%else
|
||||
%if 0%{?_with_upstream:1}
|
||||
--disable-werror \
|
||||
--disable-werror \
|
||||
%else
|
||||
--enable-werror \
|
||||
--enable-werror \
|
||||
%endif
|
||||
%endif
|
||||
--with-separate-debug-dir=/usr/lib/debug \
|
||||
--disable-sim \
|
||||
--disable-rpath \
|
||||
--with-system-readline \
|
||||
--with-expat \
|
||||
--enable-tui \
|
||||
--with-separate-debug-dir=/usr/lib/debug \
|
||||
--disable-sim \
|
||||
--disable-rpath \
|
||||
--with-system-readline \
|
||||
--with-expat \
|
||||
$(: ppc64 host build crashes on ppc variant of libexpat.so ) \
|
||||
--without-libexpat-prefix \
|
||||
--enable-tui \
|
||||
%if 0%{!?_without_python:1}
|
||||
--with-python \
|
||||
--with-python \
|
||||
%else
|
||||
--without-python \
|
||||
--without-python \
|
||||
%endif
|
||||
$(: Workaround rpm.org#76, BZ 508193 on recent OSes. ) \
|
||||
$(: RHEL-5 librpm has incompatible API. ) \
|
||||
%if 0%{?el5:1}
|
||||
--without-rpm \
|
||||
%else
|
||||
--with-rpm=librpm.so.0 \
|
||||
%endif
|
||||
--with-rpm=librpm.so.0 \
|
||||
%ifarch ia64
|
||||
--with-libunwind \
|
||||
--with-libunwind \
|
||||
%else
|
||||
--without-libunwind \
|
||||
--without-libunwind \
|
||||
%endif
|
||||
--enable-64-bit-bfd \
|
||||
--enable-64-bit-bfd \
|
||||
%if 0%{?_with_debug:1}
|
||||
--enable-static --disable-shared --enable-debug \
|
||||
--enable-static --disable-shared --enable-debug \
|
||||
%endif
|
||||
%ifarch sparcv9
|
||||
sparc-%{_vendor}-%{_target_os}%{?_gnu}
|
||||
@ -652,6 +797,8 @@ CFLAGS="$CFLAGS -O0 -ggdb2"
|
||||
make %{?_smp_mflags}
|
||||
make %{?_smp_mflags} info
|
||||
|
||||
grep '#define HAVE_ZLIB_H 1' gdb/config.h
|
||||
|
||||
# Copy the <sourcetree>/gdb/NEWS file to the directory above it.
|
||||
cp $RPM_BUILD_DIR/%{gdb_src}/gdb/NEWS $RPM_BUILD_DIR/%{gdb_src}
|
||||
|
||||
@ -664,7 +811,7 @@ echo ====================TESTSUITE DISABLED=========================
|
||||
%else
|
||||
echo ====================TESTING=========================
|
||||
cd gdb
|
||||
gcc -o ./orphanripper %{SOURCE2} -Wall -lutil
|
||||
gcc -o ./orphanripper %{SOURCE2} -Wall -lutil -ggdb2
|
||||
# Need to use a single --ignore option, second use overrides first.
|
||||
# No `%{?_smp_mflags}' here as it may race.
|
||||
# WARNING: can't generate a core file - core tests suppressed - check ulimit
|
||||
@ -719,10 +866,14 @@ gcc -o ./orphanripper %{SOURCE2} -Wall -lutil
|
||||
# Run all the scheduled testsuite runs also in the PIE mode.
|
||||
# Upstream GDB would lock up the testsuite run for too long on its failures.
|
||||
CHECK="$(echo $CHECK|sed 's#check//unix/[^ ]*#& &/-fPIE/-pie#g')"
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
|
||||
# FIXME: Temporary F12 disable: ./orphanripper
|
||||
make %{?_smp_mflags} -k $CHECK || :
|
||||
./orphanripper make %{?_smp_mflags} -k $CHECK \
|
||||
$(: Serialize the output to keep the order for regression checks. ) \
|
||||
%if 0%{?el5:1}
|
||||
RUNTESTFLAGS="--tool gdb" \
|
||||
%endif
|
||||
|| :
|
||||
)
|
||||
for t in sum log
|
||||
do
|
||||
@ -771,7 +922,7 @@ done
|
||||
test ! -e $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx
|
||||
cp -a $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/libstdcxx \
|
||||
$RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx
|
||||
%endif # 0%{!?_without_python:1}
|
||||
%endif # 0%{!?_without_python:1}
|
||||
|
||||
# Remove the files that are part of a gdb build but that are owned and
|
||||
# provided by other packages.
|
||||
@ -794,9 +945,11 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/dir
|
||||
# pstack obsoletion
|
||||
|
||||
cp -p %{SOURCE3} $RPM_BUILD_ROOT%{_mandir}/man1/gstack.1
|
||||
%if 0%{!?el5:1}
|
||||
ln -s gstack.1.gz $RPM_BUILD_ROOT%{_mandir}/man1/pstack.1.gz
|
||||
ln -s gstack $RPM_BUILD_ROOT%{_bindir}/pstack
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%endif # 0%{!?el5:1}
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
@ -805,17 +958,26 @@ rm -rf $RPM_BUILD_ROOT
|
||||
# This step is part of the installation of the RPM. Not to be confused
|
||||
# with the 'make install ' of the build (rpmbuild) process.
|
||||
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
|
||||
# For --excludedocs:
|
||||
if [ -e %{_infodir}/gdb.info.gz ]
|
||||
then
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
|
||||
/sbin/install-info --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
|
||||
fi
|
||||
|
||||
%preun
|
||||
if [ $1 = 0 ]; then
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
|
||||
if [ $1 = 0 ]
|
||||
then
|
||||
# For --excludedocs:
|
||||
if [ -e %{_infodir}/gdb.info.gz ]
|
||||
then
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
|
||||
/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
|
||||
fi
|
||||
fi
|
||||
|
||||
%files
|
||||
@ -828,10 +990,12 @@ fi
|
||||
%{_mandir}/*/gdbtui.1*
|
||||
%if 0%{!?_with_upstream:1}
|
||||
%{_bindir}/gstack
|
||||
%{_bindir}/pstack
|
||||
%{_mandir}/*/gstack.1*
|
||||
%if 0%{!?el5:1}
|
||||
%{_bindir}/pstack
|
||||
%{_mandir}/*/pstack.1*
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%endif # 0%{!?el5:1}
|
||||
%endif # 0%{!?_with_upstream:1}
|
||||
%{_datadir}/gdb
|
||||
%{_infodir}/annotate.info*
|
||||
%{_infodir}/gdb.info*
|
||||
@ -840,13 +1004,148 @@ fi
|
||||
|
||||
# don't include the files in include, they are part of binutils
|
||||
|
||||
%ifnarch sparcv9
|
||||
%ifnarch sparcv9
|
||||
%if 0%{!?el5:1}
|
||||
%files gdbserver
|
||||
%defattr(-,root,root)
|
||||
%endif
|
||||
%{_bindir}/gdbserver
|
||||
%{_mandir}/*/gdbserver.1*
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Tue Jan 12 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-25.fc12
|
||||
- non-librpm missing debuginfo yumcommand now prints also --disablerepo='*'
|
||||
to save some bandwidth by yum (Robin Green, BZ 554152).
|
||||
|
||||
* Sun Jan 10 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-24.fc12
|
||||
- testsuite: BuildRequires also valgrind.
|
||||
|
||||
* Fri Jan 8 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-23.fc12
|
||||
- Workaround missing libstdc++%%{bits_other} in Koji.
|
||||
|
||||
* Fri Jan 8 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-22.fc12
|
||||
- Comply with new package review:
|
||||
- Fix .spec Source as this is not a snapshot now.
|
||||
- Convert all spaces to tabs.
|
||||
- Fix missing %%defattr at %%files for gdbserver.
|
||||
- Replace all hardcoded-library-path by variants of %%{_isa}.
|
||||
- Include %%{_isa} for appropriate Requires and BuildRequires.
|
||||
|
||||
* Thu Jan 7 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-21.fc12
|
||||
- [vla] Fix regression on fields of structs in internal vars (BZ 553338).
|
||||
- archer-jankratochvil-fedora12 commit: 6e73988f653ba986e8742f208f17ec084292cbd5
|
||||
|
||||
* Thu Jan 7 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-20.fc12
|
||||
- Fix crash reading broken stabs (it377671).
|
||||
|
||||
* Sun Jan 3 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-19.fc12
|
||||
- testsuite: Fixup false FAILs for gdb.cp/constructortest.exp.
|
||||
|
||||
* Sat Jan 2 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-18.fc12
|
||||
- Fix regression of gdb-7.0 (from 6.8) crashing on typedefed bitfields.
|
||||
- Fix related_breakpoint stale ref crash.
|
||||
|
||||
* Fri Jan 1 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-17.fc12
|
||||
- Formal upgrade to the FSF GDB release gdb-7.0.1.
|
||||
- Fix regression of gdb-7.0.1 not preserving typedef of a field.
|
||||
|
||||
* Fri Jan 1 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-16.fc12
|
||||
- More RHEL-5 compatibility updates.
|
||||
- Disable the build-id support by default.
|
||||
- Bundle back gdbserver to the base gdb package.
|
||||
- Remove bundled pstack.
|
||||
- Drop the BuildRequires of rpm-devel.
|
||||
|
||||
* Fri Jan 1 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-15.fc12
|
||||
- Fix error on a sw watchpoint active at function epilogue (hit on s390x).
|
||||
- testsuite: Fix false MI "unknown output after running" regression.
|
||||
- testsuite: Update ia64-sigtramp.exp for recent GDB.
|
||||
- Implement bt-clone-stop.exp fix also for ia64.
|
||||
- testsuite: Upstream condbreak.exp results stability fix (Daniel Jacobowitz).
|
||||
|
||||
* Thu Dec 24 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-14.fc12
|
||||
- testsuite: Fix constructortest.exp and expand-sals.exp for gcc-4.4.2-20.fc12.
|
||||
|
||||
* Mon Dec 21 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-13.fc12
|
||||
- [pie] Fix a race in testcase gdb.base/valgrind-db-attach.exp.
|
||||
- Fix regression by python on ia64 due to stale current frame.
|
||||
- Disable python iff RHEL-5 && (Brew || ppc64).
|
||||
|
||||
* Mon Dec 21 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-12.fc12
|
||||
- Workaround build on native ppc64 host.
|
||||
- More RHEL-5 compatibility updates.
|
||||
- Disable warning messages new for gdb-6.8+ for RHEL-5 backward compatibility.
|
||||
- Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).
|
||||
- Serialize the testsuite output to keep the order for regression checks.
|
||||
- Re-enable python for all non-ppc* arches.
|
||||
- More gcc44 stack exceptions when running the testsuite on RHEL-5.
|
||||
- Fix backward compatibility with G++ 4.1 namespaces "::".
|
||||
- Fix regression on re-setting the single ppc watchpoint slot.
|
||||
- Update snapshot of FSF gdb-7.0.x branch.
|
||||
- Backport fix of dcache invalidation locking up GDB on ppc64 targets.
|
||||
|
||||
* Fri Dec 18 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-11.fc12
|
||||
- [pie] Fix general ppc64 regression due to a function descriptors bug.
|
||||
- [pie] Fix also keeping breakpoints disabled in PIE mode.
|
||||
- Import upstream <tab>-completion crash fix.
|
||||
- Drop some unused patches from the repository.
|
||||
- More RHEL-5 build compatibility updates.
|
||||
- Use gfortran44 when running the testsuite on RHEL-5.
|
||||
- Disable python there due to insufficient ppc multilib.
|
||||
- Fix orphanripper hangs and thus enable it again.
|
||||
|
||||
* Mon Dec 14 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-10.fc12
|
||||
- Make gdb-6.3-rh-testversion-20041202.patch to accept both RHEL and Fedora GDB.
|
||||
- Adjust BuildRequires for Fedora-12, RHEL-6 and RHEL-5 builds.
|
||||
- [vla] Fix compatibility of dynamic arrays with iFort (BZ 514287).
|
||||
- Fix stepping through OMP parallel Fortran sections (BZ 533176).
|
||||
- New fix of bp conditionals [bp_location-accel] regression (BZ 538626).
|
||||
|
||||
* Mon Dec 7 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-9.fc12
|
||||
- Replace the PIE (Position Indepdent Executable) support patch by a new one.
|
||||
- Drop gdb-6.3-nonthreaded-wp-20050117.patch as fuzzy + redundant.
|
||||
- Fix callback-mode readline-6.0 regression for CTRL-C.
|
||||
- Fix syscall restarts for amd64->i386 biarch.
|
||||
- Various testsuite results stability fixes.
|
||||
- Fix crash on reading stabs on 64bit (BZ 537837).
|
||||
- archer-jankratochvil-fedora12 commit: 16276c1aad1366b92e687c72cab30192280e1906
|
||||
- archer-jankratochvil-pie-fedora12 ct: 2ae60b5156d43aabfe5757940eaf7b4370fb05d2
|
||||
|
||||
* Thu Dec 3 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-8.fc12
|
||||
- Fix slowness/hang when printing some variables (Sami Wagiaalla, BZ 541093).
|
||||
- archer-jankratochvil-fedora12 commit: 6817a81cd411acc9579f04dcc105e9bce72859ff
|
||||
|
||||
* Wed Nov 25 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-7.fc12
|
||||
- Support GNU IFUNCs - indirect functions (BZ 539590).
|
||||
- Fix bp conditionals [bp_location-accel] regression (Phil Muldoon, BZ 538626).
|
||||
- Fix missed breakpoint location [bp_location-accel] regression (upstream).
|
||||
|
||||
* Fri Oct 30 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-6
|
||||
- Fix missing zlib-devel BuildRequires to support compressed DWARF sections.
|
||||
- Include post-7.0 FSF GDB fixes.
|
||||
|
||||
* Fri Oct 23 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-5
|
||||
- Make the package buildable on RHEL-5/CentOS-5 (without librpm there).
|
||||
- archer-jankratochvil-fedora12 commit: 5b73ea6a0f74e63db3b504792fc1d37f548bdf5c
|
||||
|
||||
* Fri Oct 23 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-4
|
||||
- Fix rpm --excludedocs (BZ 515998).
|
||||
|
||||
* Thu Oct 22 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-3
|
||||
- Support multiple directories for `set debug-file-directory' (BZ 528668).
|
||||
|
||||
* Mon Oct 19 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-2
|
||||
- Sync the .spec with RHEL/CentOS without EPEL, do not BuildRequires: fpc there.
|
||||
|
||||
* Wed Oct 7 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0-1
|
||||
- Formal upgrade to the final FSF GDB release gdb-7.0.
|
||||
- Fix GNU/Linux core open: Can't read pathname for load map: Input/output error.
|
||||
- archer-jankratochvil-fedora12 commit: ce4ead356654b951a49ca78d81ebfff95e758bf5
|
||||
|
||||
* Wed Sep 30 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.91.20090930-2
|
||||
- Bump release.
|
||||
|
||||
* Wed Sep 30 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.91.20090930-1
|
||||
- Fix broken python "help()" command "modules" (BZ 526552).
|
||||
- Upgrade to the FSF GDB gdb-7.0 snapshot: 6.8.91.20090930
|
||||
@ -1006,7 +1305,7 @@ fi
|
||||
- Archer backport: c2d5c4a39b10994d86d8f2f90dfed769e8f216f3
|
||||
- Fix parsing DW_AT_const_value using DW_FORM_string
|
||||
- Archer backport: 8d9ab68fc0955c9de6320bec2821a21e3244600d
|
||||
+ db41e11ae0a3aec7120ad6ce86450d838af74dd6
|
||||
+ db41e11ae0a3aec7120ad6ce86450d838af74dd6
|
||||
- Fix Fortran modules/namespaces parsing (but no change was visible in F11).
|
||||
- Archer backport: 000db8b7bfef8581ef099ccca8689cfddfea1be8
|
||||
- Fix "some Python error when displaying some C++ objects" (BZ 504356).
|
||||
@ -1014,7 +1313,7 @@ fi
|
||||
- testsuite: gdb-orphanripper.c: Fix uninitialized `termios.c_line'.
|
||||
- Fix crashes due to (missing) varobj revalidation, for VLA (for BZ 377541).
|
||||
- Archer backport: 58dcda94ac5d6398f47382505e9d3d9d866d79bf
|
||||
+ f3de7bbd655337fe6705aeaafcc970deff3dd5d5
|
||||
+ f3de7bbd655337fe6705aeaafcc970deff3dd5d5
|
||||
- Implement Fortran modules namespaces (BZ 466118).
|
||||
- Fix crash in the charset support.
|
||||
|
||||
@ -1055,7 +1354,7 @@ fi
|
||||
- Archer backport: c14d9ab7eef43281b2052c885f89d2db96fb5f8e
|
||||
- Revert a change regressing: gdb.objc/basicclass.exp
|
||||
- Archer backport: ebd649b96e61a1fb481801b65d827bca998c6633
|
||||
+ 1f080e897996d60ab7fde20423e2947512115667
|
||||
+ 1f080e897996d60ab7fde20423e2947512115667
|
||||
+ 1948198702b51b31d79793fc49434b529b4e245f
|
||||
+ e107fb9687bb1e7f74170aa3d19c4a8f6edbb10f
|
||||
+ 1e012c996e121cb35053d239a46bd5dc65b0ce60
|
||||
@ -1784,85 +2083,85 @@ prelink base addresses. Fixes BZ 175075, BZ 190545.
|
||||
* Fri Dec 16 2005 Jesse Keating <jkeating@redhat.com>
|
||||
- rebuilt for new gcj
|
||||
|
||||
* Thu Dec 01 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.93
|
||||
* Thu Dec 01 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.93
|
||||
- Bump up release number.
|
||||
|
||||
* Thu Dec 01 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.90
|
||||
* Thu Dec 01 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.90
|
||||
- Add option to allow backtracing past zero pc value.
|
||||
- Bugzilla 170275
|
||||
|
||||
* Tue Nov 15 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.89
|
||||
* Tue Nov 15 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.89
|
||||
- Bump up release number.
|
||||
|
||||
* Tue Nov 15 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.86
|
||||
* Tue Nov 15 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.86
|
||||
- Fix ia64 user-specified SIGILL handling error.
|
||||
- Bugzilla 165038.
|
||||
|
||||
* Tue Oct 18 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.85
|
||||
* Tue Oct 18 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.85
|
||||
- Bump up release number.
|
||||
|
||||
* Tue Oct 18 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.82
|
||||
* Tue Oct 18 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.82
|
||||
- Modify attach patch to add missing fclose.
|
||||
- Bugzilla 166712
|
||||
|
||||
* Tue Oct 11 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.81
|
||||
* Tue Oct 11 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.81
|
||||
- Bump up release number.
|
||||
|
||||
* Tue Oct 11 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.78
|
||||
* Tue Oct 11 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.78
|
||||
- Support gdb attaching to a stopped process.
|
||||
|
||||
* Thu Sep 29 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.77
|
||||
* Thu Sep 29 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.77
|
||||
- Bump up release number.
|
||||
|
||||
* Thu Sep 29 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.74
|
||||
* Thu Sep 29 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.74
|
||||
- Fix up DSO read logic when process is attached.
|
||||
|
||||
* Mon Sep 26 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.73
|
||||
* Mon Sep 26 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.73
|
||||
- Bump up release number.
|
||||
|
||||
* Mon Sep 26 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.70
|
||||
* Mon Sep 26 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.70
|
||||
- Fix frame pointer calculation for ia64 sigtramp frame.
|
||||
|
||||
* Thu Sep 22 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.69
|
||||
* Thu Sep 22 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.69
|
||||
- Bump up release number.
|
||||
|
||||
* Thu Sep 22 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.66
|
||||
* Thu Sep 22 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.66
|
||||
- Remove extraneous xfree.
|
||||
|
||||
* Wed Sep 07 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.65
|
||||
* Wed Sep 07 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.65
|
||||
- Bump up release number.
|
||||
|
||||
* Wed Sep 07 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.62
|
||||
* Wed Sep 07 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.62
|
||||
- Readd readnever option
|
||||
|
||||
* Wed Jul 27 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.61
|
||||
- Bump up release number.
|
||||
|
||||
|
||||
* Tue Jul 26 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.57
|
||||
- Bump up release number.
|
||||
|
||||
|
||||
* Tue Jul 26 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.54
|
||||
- Add testcase to verify printing of inherited members
|
||||
- Bugzilla 146835
|
||||
|
||||
|
||||
* Mon Jul 25 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.53
|
||||
- Bump up release number.
|
||||
|
||||
|
||||
* Mon Jul 25 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.50
|
||||
- Fix bug with info frame and cursor address on ia64.
|
||||
- Add testcase to verify pseudo-registers calculated for ia64 sigtramp.
|
||||
- Bugzilla 160339
|
||||
|
||||
|
||||
* Fri Jul 22 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.49
|
||||
- Bump up release number.
|
||||
|
||||
|
||||
* Fri Jul 22 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.46
|
||||
- Fix attaching to 32-bit processes on 64-bit systems.
|
||||
- Bugzilla 160254
|
||||
|
||||
|
||||
* Thu Jul 14 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.45
|
||||
- Bump up release number.
|
||||
|
||||
|
||||
* Thu Jul 14 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.42
|
||||
- Add work-around to make ia64 gcore work faster.
|
||||
- Bugzilla 147436
|
||||
@ -1893,7 +2192,7 @@ prelink base addresses. Fixes BZ 175075, BZ 190545.
|
||||
|
||||
* Fri Jun 10 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.28
|
||||
- Security errata for bfd and .gdbinit file usage
|
||||
- Bugzilla 158680
|
||||
- Bugzilla 158680
|
||||
|
||||
* Wed May 18 2005 Jeff Johnston <jjohnstn@redhat.com> - 6.3.0.0-1.24
|
||||
- Bump up release number.
|
||||
@ -2088,8 +2387,8 @@ prelink base addresses. Fixes BZ 175075, BZ 190545.
|
||||
- Enable PPC CFI, remove merged ppc patches.
|
||||
|
||||
* Wed Jan 12 2005 Elena Zannoni <ezannoni@redhat.com> - 6.3.0.0-0.1
|
||||
Andrew Cagney <cagney@redhat.com>
|
||||
Jeff Johnston <jjohnstn@redhat.com>
|
||||
Andrew Cagney <cagney@redhat.com>
|
||||
Jeff Johnston <jjohnstn@redhat.com>
|
||||
- Various fixes to complete the import and merge.
|
||||
|
||||
* Wed Dec 01 2004 Andrew Cagney <cagney@redhat.com> - 6.3.0.0
|
||||
@ -2142,7 +2441,7 @@ prelink base addresses. Fixes BZ 175075, BZ 190545.
|
||||
- Bump up release number
|
||||
|
||||
* Thu Nov 11 2004 Elena Zannoni <ezannoni@redhat.com> - 1.200400607.51
|
||||
- Modify configure line to not use absolute paths. This was
|
||||
- Modify configure line to not use absolute paths. This was
|
||||
creating problems with makeinfo/texinfo.
|
||||
- Get rid of makeinfo hack.
|
||||
Bugzilla 135633
|
||||
@ -2187,7 +2486,7 @@ Bugzilla 135633
|
||||
* Mon Oct 10 2004 Andrew Cagney <cagney@redhat.com> - 1.200400607.39
|
||||
- Fix comment bug in sigstep.exp.
|
||||
|
||||
* Thu Oct 07 2004 Jeff Johnston <jjohnstn@redhat.com> - 1.200400607.38
|
||||
* Thu Oct 07 2004 Jeff Johnston <jjohnstn@redhat.com> - 1.200400607.38
|
||||
- Do not invalidate cached thread info when resuming threads.
|
||||
- Bump up release number.
|
||||
|
||||
@ -2438,7 +2737,7 @@ Bugzilla 135633
|
||||
|
||||
* Tue Nov 18 2003 Elena Zannoni <ezannoni@redhat.com> - 0.20031117.1
|
||||
- Import new gdb snapshot from mainline FSF.
|
||||
- Fix some testfiles.
|
||||
- Fix some testfiles.
|
||||
- Add fixes for gcore, and patch for libunwind support on ia64.
|
||||
- Add tests to see what versions of gcc, binutils, glibc and kernel we
|
||||
are running with.
|
||||
@ -2504,7 +2803,7 @@ to pointers when the address is in the ".opd" section.
|
||||
|
||||
* Tue Aug 26 2003 Andrew Cagney <cagney@redhat.com> - 0.20030710.24
|
||||
- skip the ppc64 and x86-64 frame redzone.
|
||||
|
||||
|
||||
* Fri Aug 22 2003 Elena Zannoni <ezannoni@redhat.com> - 0.20030710.23
|
||||
- Relax one testcase in selftest.exp a bit.
|
||||
- Accept different output as well in thread bt (platform dependent).
|
||||
@ -2529,10 +2828,10 @@ to pointers when the address is in the ".opd" section.
|
||||
|
||||
* Tue Aug 19 2003 Jeff Johnston <jjohnstn@redhat.com> - 0.20030710.18
|
||||
- Fix ia64 pc unwinding to include psr slot.
|
||||
|
||||
|
||||
* Mon Aug 18 2003 Elena Zannoni <ezannoni@redhat.com> - 0.20030710.17
|
||||
- Fix info installation for annotate.texi. (Bugzilla 102521)
|
||||
|
||||
|
||||
* Fri Aug 15 2003 Elena Zannoni <ezannoni@redhat.com> - 0.20030710.16
|
||||
- revamp tls tests a bit.
|
||||
- Handle new output from gdb in relocate.exp
|
||||
@ -2743,7 +3042,7 @@ to pointers when the address is in the ".opd" section.
|
||||
- Add patch for --args with zero-length arguments. Fix for bug 79833.
|
||||
|
||||
* Tue Dec 17 2002 Elliot Lee <sopwith@redhat.com> - 0.20021129.4
|
||||
- The define directive to rpm is significant even if the line it is
|
||||
- The define directive to rpm is significant even if the line it is
|
||||
in happens to start with a '#' character. Fixed.
|
||||
|
||||
* Fri Dec 13 2002 Elena Zannoni <ezannoni@redhat.com> - 0.20021129.3
|
||||
@ -2785,7 +3084,7 @@ to pointers when the address is in the ".opd" section.
|
||||
- Upgrade patches.
|
||||
- Build gdb/gdbserver as well.
|
||||
- Define and use 'cvsdate'.
|
||||
- Do %%setup specifying the source directory name.
|
||||
- Do %%setup specifying the source directory name.
|
||||
- Don't cd up one dir before removing tcl and friends.
|
||||
- Change the configure command to allow for the new source tree name.
|
||||
- Ditto for the copy of NEWS.
|
||||
@ -2857,7 +3156,7 @@ General revamp.
|
||||
- Update to current
|
||||
|
||||
* Wed Mar 13 2002 Trond Eivind Glomsrod <teg@redhat.com> 5.1.90CVS-1
|
||||
- Update to current 5.2 branch
|
||||
- Update to current 5.2 branch
|
||||
|
||||
* Thu Jan 24 2002 Trond Eivind Glomsrod <teg@redhat.com> 5.1.1-1
|
||||
- 5.1.1
|
||||
@ -2879,7 +3178,7 @@ General revamp.
|
||||
- Add patch from jakub@redhat.com to improve handling of DWARF
|
||||
|
||||
* Mon Nov 12 2001 Trond Eivind Glomsrod <teg@redhat.com> 5.0.93-1
|
||||
- 5.0.93
|
||||
- 5.0.93
|
||||
- handle missing info pages in post/pre scripts
|
||||
|
||||
* Wed Oct 31 2001 Trond Eivind Glomsrod <teg@redhat.com> 5.0.92-1
|
||||
@ -2892,11 +3191,11 @@ General revamp.
|
||||
* Wed Oct 17 2001 Trond Eivind Glomsrod <teg@redhat.com> 5.0rh-17
|
||||
- New snapshot
|
||||
|
||||
* Thu Sep 27 2001 Trond Eivind Glomsrod <teg@redhat.com>
|
||||
* Thu Sep 27 2001 Trond Eivind Glomsrod <teg@redhat.com>
|
||||
- New snapshot
|
||||
|
||||
* Wed Sep 12 2001 Trond Eivind Glomsrod <teg@redhat.com> 5.0rh-16
|
||||
- New snapshot
|
||||
- New snapshot
|
||||
|
||||
* Mon Aug 13 2001 Trond Eivind Glomsrod <teg@redhat.com> 5.0rh-15
|
||||
- Don't buildrequire compat-glibc (#51690)
|
||||
@ -2914,7 +3213,7 @@ General revamp.
|
||||
* Fri Jun 15 2001 Trond Eivind Glomsrod <teg@redhat.com>
|
||||
- New snapshot
|
||||
- Add ncurses-devel to buildprereq
|
||||
- Remove perl from buildprereq, as gdb changed the way
|
||||
- Remove perl from buildprereq, as gdb changed the way
|
||||
version strings are generated
|
||||
|
||||
* Thu Jun 14 2001 Trond Eivind Glomsrod <teg@redhat.com>
|
||||
@ -2929,7 +3228,7 @@ General revamp.
|
||||
- Kevin's patch is now part of gdb
|
||||
|
||||
* Mon Apr 9 2001 Trond Eivind Glomsrod <teg@redhat.com>
|
||||
- Add patch from kevinb@redhat.com to fix floating point + thread
|
||||
- Add patch from kevinb@redhat.com to fix floating point + thread
|
||||
problem (#24310)
|
||||
- remove old workarounds
|
||||
- new snapshot
|
||||
@ -3052,7 +3351,7 @@ from code fusion CD-ROM).
|
||||
* Thu Apr 1 1999 Jeff Johnson <jbj@redhat.com>
|
||||
- sparc with 2.2 kernels no longer uses sunos ptrace (davem)
|
||||
|
||||
* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com>
|
||||
* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com>
|
||||
- auto rebuild in the new build environment (release 3)
|
||||
|
||||
* Mon Mar 8 1999 Jeff Johnson <jbj@redhat.com>
|
||||
|
@ -1,5 +1,5 @@
|
||||
#! /usr/bin/perl
|
||||
# $Id: gdbcompare,v 1.4 2007/04/22 08:52:09 jkratoch Exp $
|
||||
# $Id: gdbcompare,v 1.5 2008/03/01 08:01:57 jkratoch Exp $
|
||||
|
||||
|
||||
use strict;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# $Id: gdbpatchno,v 1.1 2006/12/29 20:35:43 jkratoch Exp $
|
||||
# Print the first unused patch number across all the current package's branches.
|
||||
|
||||
echo $[1+$(cat ../*/*.spec|sed -n 's/^[# %]*patch\([0-9]*\).*$/\1/p'|sort -rnu|head -n1)]
|
||||
|
Loading…
Reference in New Issue
Block a user