- Fix gdb.ada/* regressions (Keith Seitz).
- Disable addon (finish) due to inline-cmds.exp: up from outer_inline2 assert. - Fix i386+x86_64 rwatch+awatch before run, regression against 6.8 (BZ 541866). - Fix crash on stale addrinfo->sectindex (more sensitive due to the PIE patch). - Remove false gdb_assert on $sp underflow. - Workaround ia64 inferior calls clearing SP. - testsuite: Fix long timeout on arches with failing gdb.base/interrupt.exp. - Fix ia64 part of the bt-clone-stop.exp fix.
This commit is contained in:
parent
29da87712f
commit
5a6df07a01
|
@ -164,7 +164,7 @@ 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 =
|
||||
@@ -2122,6 +2122,138 @@ static const struct frame_unwind ia64_frame_unwind =
|
||||
default_frame_sniffer
|
||||
};
|
||||
|
||||
|
@ -228,12 +228,13 @@ Index: gdb-6.8.50.20090802/gdb/amd64-tdep.c
|
|||
+ if (minsym == NULL)
|
||||
+ return 0;
|
||||
+
|
||||
+ instr = slotN_contents (&buf[LINUX_CLONE_PRE_SLOTS * 16], 2);
|
||||
+ instr = slotN_contents (&linux_clone2_code[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);
|
||||
+ replace_slotN_contents (&linux_clone2_code[LINUX_CLONE_PRE_SLOTS * 16], instr,
|
||||
+ 2);
|
||||
+
|
||||
+ if (memcmp (&buf[LINUX_CLONE_PRE_SLOTS * 16],
|
||||
+ &linux_clone2_code[LINUX_CLONE_PRE_SLOTS * 16],
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
From: Keith Seitz <keiths@redhat.com>
|
||||
Message-ID: <4B7F207A.7020102@redhat.com>
|
||||
|
||||
--- gdb-7.0.1-orig/gdb/dwarf2read.c 2010-02-20 01:06:44.000000000 +0100
|
||||
+++ gdb-7.0.1/gdb/dwarf2read.c 2010-02-20 01:08:28.000000000 +0100
|
||||
@@ -7362,6 +7362,10 @@ read_partial_die (struct partial_die_inf
|
||||
break;
|
||||
}
|
||||
break;
|
||||
+ case DW_AT_MIPS_linkage_name:
|
||||
+ if (cu->language == language_ada)
|
||||
+ part_die->name = DW_STRING (&attr);
|
||||
+ break;
|
||||
case DW_AT_comp_dir:
|
||||
if (part_die->dirname == NULL)
|
||||
part_die->dirname = DW_STRING (&attr);
|
||||
@@ -9924,9 +9928,13 @@ dwarf2_canonicalize_name (char *name, st
|
||||
static char *
|
||||
dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
|
||||
{
|
||||
- struct attribute *attr;
|
||||
+ struct attribute *attr = NULL;
|
||||
+
|
||||
+ if (cu->language == language_ada)
|
||||
+ attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
|
||||
|
||||
- attr = dwarf2_attr (die, DW_AT_name, cu);
|
||||
+ if (!attr)
|
||||
+ attr = dwarf2_attr (die, DW_AT_name, cu);
|
||||
if (!attr || !DW_STRING (attr))
|
||||
return NULL;
|
||||
|
|
@ -0,0 +1,639 @@
|
|||
Remove some files accidentally created (and not used) by gdb-archer.patch.
|
||||
|
||||
diff -up -ruNp gdb-7.0.1-orig/gdb/config/i386/nm-i386.h gdb-7.0.1/gdb/config/i386/nm-i386.h
|
||||
--- gdb-7.0.1-orig/gdb/config/i386/nm-i386.h 2010-02-09 11:22:39.000000000 +0100
|
||||
+++ gdb-7.0.1/gdb/config/i386/nm-i386.h 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,125 +0,0 @@
|
||||
-/* Native macro definitions for GDB on an Intel i[3456]86.
|
||||
- Copyright 2001, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
-
|
||||
- This file is part of GDB.
|
||||
-
|
||||
- This program is free software; you can redistribute it and/or modify
|
||||
- it under the terms of the GNU General Public License as published by
|
||||
- the Free Software Foundation; either version 3 of the License, or
|
||||
- (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#ifndef NM_I386_H
|
||||
-#define NM_I386_H 1
|
||||
-
|
||||
-/* Hardware-assisted breakpoints and watchpoints. */
|
||||
-
|
||||
-/* Targets should define this to use the generic x86 watchpoint support. */
|
||||
-#ifdef I386_USE_GENERIC_WATCHPOINTS
|
||||
-
|
||||
-/* Add watchpoint methods to the provided target_ops. Targets which call
|
||||
- this should also define I386_WATCHPOINTS_IN_TARGET_VECTOR. */
|
||||
-struct target_ops;
|
||||
-void i386_use_watchpoints (struct target_ops *);
|
||||
-
|
||||
-/* Clear the reference counts and forget everything we knew about DRi. */
|
||||
-extern void i386_cleanup_dregs (void);
|
||||
-
|
||||
-/* Insert a watchpoint to watch a memory region which starts at
|
||||
- address ADDR and whose length is LEN bytes. Watch memory accesses
|
||||
- of the type TYPE. Return 0 on success, -1 on failure. */
|
||||
-extern int i386_insert_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
-
|
||||
-/* Remove a watchpoint that watched the memory region which starts at
|
||||
- address ADDR, whose length is LEN bytes, and for accesses of the
|
||||
- type TYPE. Return 0 on success, -1 on failure. */
|
||||
-extern int i386_remove_watchpoint (CORE_ADDR addr, int len, int type);
|
||||
-
|
||||
-/* Return non-zero if we can watch a memory region that starts at
|
||||
- address ADDR and whose length is LEN bytes. */
|
||||
-extern int i386_region_ok_for_watchpoint (CORE_ADDR addr, int len);
|
||||
-
|
||||
-/* Return non-zero if the inferior has some break/watchpoint that
|
||||
- triggered. */
|
||||
-extern int i386_stopped_by_hwbp (void);
|
||||
-
|
||||
-/* If the inferior has some break/watchpoint that triggered, set
|
||||
- the address associated with that break/watchpoint and return
|
||||
- true. Otherwise, return false. */
|
||||
-extern int i386_stopped_data_address (struct target_ops *, CORE_ADDR *);
|
||||
-
|
||||
-/* Insert a hardware-assisted breakpoint at BP_TGT->placed_address.
|
||||
- Return 0 on success, EBUSY on failure. */
|
||||
-struct bp_target_info;
|
||||
-extern int i386_insert_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
-
|
||||
-/* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
|
||||
- Return 0 on success, -1 on failure. */
|
||||
-extern int i386_remove_hw_breakpoint (struct bp_target_info *bp_tgt);
|
||||
-
|
||||
-extern int i386_stopped_by_watchpoint (void);
|
||||
-
|
||||
-#ifndef I386_WATCHPOINTS_IN_TARGET_VECTOR
|
||||
-
|
||||
-/* Returns the number of hardware watchpoints of type TYPE that we can
|
||||
- set. Value is positive if we can set CNT watchpoints, zero if
|
||||
- setting watchpoints of type TYPE is not supported, and negative if
|
||||
- CNT is more than the maximum number of watchpoints of type TYPE
|
||||
- that we can support. TYPE is one of bp_hardware_watchpoint,
|
||||
- bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
|
||||
- CNT is the number of such watchpoints used so far (including this
|
||||
- one). OTHERTYPE is non-zero if other types of watchpoints are
|
||||
- currently enabled.
|
||||
-
|
||||
- We always return 1 here because we don't have enough information
|
||||
- about possible overlap of addresses that they want to watch. As an
|
||||
- extreme example, consider the case where all the watchpoints watch
|
||||
- the same address and the same region length: then we can handle a
|
||||
- virtually unlimited number of watchpoints, due to debug register
|
||||
- sharing implemented via reference counts in i386-nat.c. */
|
||||
-
|
||||
-#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1
|
||||
-
|
||||
-/* Returns non-zero if we can use hardware watchpoints to watch a
|
||||
- region whose address is ADDR and whose length is LEN. */
|
||||
-
|
||||
-#define TARGET_REGION_OK_FOR_HW_WATCHPOINT(addr, len) \
|
||||
- i386_region_ok_for_watchpoint (addr, len)
|
||||
-
|
||||
-/* After a watchpoint trap, the PC points to the instruction after the
|
||||
- one that caused the trap. Therefore we don't need to step over it.
|
||||
- But we do need to reset the status register to avoid another trap. */
|
||||
-
|
||||
-#define HAVE_CONTINUABLE_WATCHPOINT 1
|
||||
-
|
||||
-#define STOPPED_BY_WATCHPOINT(W) (i386_stopped_by_watchpoint () != 0)
|
||||
-
|
||||
-#define target_stopped_data_address(target, x) \
|
||||
- i386_stopped_data_address(target, x)
|
||||
-
|
||||
-/* Use these macros for watchpoint insertion/removal. */
|
||||
-
|
||||
-#define target_insert_watchpoint(addr, len, type) \
|
||||
- i386_insert_watchpoint (addr, len, type)
|
||||
-
|
||||
-#define target_remove_watchpoint(addr, len, type) \
|
||||
- i386_remove_watchpoint (addr, len, type)
|
||||
-
|
||||
-#define target_insert_hw_breakpoint(bp_tgt) \
|
||||
- i386_insert_hw_breakpoint (bp_tgt)
|
||||
-
|
||||
-#define target_remove_hw_breakpoint(bp_tgt) \
|
||||
- i386_remove_hw_breakpoint (bp_tgt)
|
||||
-
|
||||
-#endif /* I386_WATCHPOINTS_IN_TARGET_VECTOR */
|
||||
-
|
||||
-#endif /* I386_USE_GENERIC_WATCHPOINTS */
|
||||
-
|
||||
-#endif /* NM_I386_H */
|
||||
diff -up -ruNp gdb-7.0.1-orig/gdb/config/i386/nm-linux64.h gdb-7.0.1/gdb/config/i386/nm-linux64.h
|
||||
--- gdb-7.0.1-orig/gdb/config/i386/nm-linux64.h 2010-02-09 11:22:39.000000000 +0100
|
||||
+++ gdb-7.0.1/gdb/config/i386/nm-linux64.h 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,54 +0,0 @@
|
||||
-/* Native support for GNU/Linux x86-64.
|
||||
-
|
||||
- Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
|
||||
- Free Software Foundation, Inc.
|
||||
-
|
||||
- Contributed by Jiri Smid, SuSE Labs.
|
||||
-
|
||||
- This file is part of GDB.
|
||||
-
|
||||
- This program is free software; you can redistribute it and/or modify
|
||||
- it under the terms of the GNU General Public License as published by
|
||||
- the Free Software Foundation; either version 3 of the License, or
|
||||
- (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#ifndef NM_LINUX64_H
|
||||
-#define NM_LINUX64_H
|
||||
-
|
||||
-/* GNU/Linux supports the i386 hardware debugging registers. */
|
||||
-#define I386_USE_GENERIC_WATCHPOINTS
|
||||
-#define I386_WATCHPOINTS_IN_TARGET_VECTOR
|
||||
-
|
||||
-#include "i386/nm-i386.h"
|
||||
-#include "config/nm-linux.h"
|
||||
-
|
||||
-/* Support for 8-byte wide hardware watchpoints. */
|
||||
-#define TARGET_HAS_DR_LEN_8 1
|
||||
-
|
||||
-/* Provide access to the i386 hardware debugging registers. */
|
||||
-
|
||||
-extern void amd64_linux_dr_set_control (unsigned long control);
|
||||
-#define I386_DR_LOW_SET_CONTROL(control) \
|
||||
- amd64_linux_dr_set_control (control)
|
||||
-
|
||||
-extern void amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr);
|
||||
-#define I386_DR_LOW_SET_ADDR(regnum, addr) \
|
||||
- amd64_linux_dr_set_addr (regnum, addr)
|
||||
-
|
||||
-extern void amd64_linux_dr_reset_addr (int regnum);
|
||||
-#define I386_DR_LOW_RESET_ADDR(regnum) \
|
||||
- amd64_linux_dr_reset_addr (regnum)
|
||||
-
|
||||
-extern unsigned long amd64_linux_dr_get_status (void);
|
||||
-#define I386_DR_LOW_GET_STATUS() \
|
||||
- amd64_linux_dr_get_status ()
|
||||
-
|
||||
-#endif /* nm-linux64.h */
|
||||
diff -up -ruNp gdb-7.0.1-orig/gdb/config/mips/nm-irix5.h gdb-7.0.1/gdb/config/mips/nm-irix5.h
|
||||
--- gdb-7.0.1-orig/gdb/config/mips/nm-irix5.h 2010-02-09 11:22:39.000000000 +0100
|
||||
+++ gdb-7.0.1/gdb/config/mips/nm-irix5.h 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,44 +0,0 @@
|
||||
-/* Definitions for native support of irix5.
|
||||
-
|
||||
- Copyright 1993, 1996, 1998, 1999, 2000, 2007, 2008, 2009
|
||||
- Free Software Foundation, Inc.
|
||||
-
|
||||
- This file is part of GDB.
|
||||
-
|
||||
- This program is free software; you can redistribute it and/or modify
|
||||
- it under the terms of the GNU General Public License as published by
|
||||
- the Free Software Foundation; either version 3 of the License, or
|
||||
- (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#define TARGET_HAS_HARDWARE_WATCHPOINTS
|
||||
-
|
||||
-/* TARGET_CAN_USE_HARDWARE_WATCHPOINT is now defined to go through
|
||||
- the target vector. For Irix5, procfs_can_use_hw_watchpoint()
|
||||
- should be invoked. */
|
||||
-
|
||||
-/* When a hardware watchpoint fires off the PC will be left at the
|
||||
- instruction which caused the watchpoint. It will be necessary for
|
||||
- GDB to step over the watchpoint. */
|
||||
-
|
||||
-#define STOPPED_BY_WATCHPOINT(W) \
|
||||
- procfs_stopped_by_watchpoint(inferior_ptid)
|
||||
-extern int procfs_stopped_by_watchpoint (ptid_t);
|
||||
-
|
||||
-/* Use these macros for watchpoint insertion/deletion. */
|
||||
-/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */
|
||||
-#define target_insert_watchpoint(ADDR, LEN, TYPE) \
|
||||
- procfs_set_watchpoint (inferior_ptid, ADDR, LEN, TYPE, 0)
|
||||
-#define target_remove_watchpoint(ADDR, LEN, TYPE) \
|
||||
- procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0)
|
||||
-extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int);
|
||||
-
|
||||
-#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1
|
||||
-
|
||||
diff -up -ruNp gdb-7.0.1-orig/gdb/gdbserver/linux-i386-low.c gdb-7.0.1/gdb/gdbserver/linux-i386-low.c
|
||||
--- gdb-7.0.1-orig/gdb/gdbserver/linux-i386-low.c 2010-02-09 11:22:39.000000000 +0100
|
||||
+++ gdb-7.0.1/gdb/gdbserver/linux-i386-low.c 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,210 +0,0 @@
|
||||
-/* GNU/Linux/i386 specific low level interface, for the remote server for GDB.
|
||||
- Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006,
|
||||
- 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
-
|
||||
- This file is part of GDB.
|
||||
-
|
||||
- This program is free software; you can redistribute it and/or modify
|
||||
- it under the terms of the GNU General Public License as published by
|
||||
- the Free Software Foundation; either version 3 of the License, or
|
||||
- (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#include "server.h"
|
||||
-#include "linux-low.h"
|
||||
-#include "i387-fp.h"
|
||||
-
|
||||
-#include "gdb_proc_service.h"
|
||||
-
|
||||
-#include <sys/ptrace.h>
|
||||
-
|
||||
-#ifdef HAVE_SYS_REG_H
|
||||
-#include <sys/reg.h>
|
||||
-#endif
|
||||
-
|
||||
-#ifndef PTRACE_GET_THREAD_AREA
|
||||
-#define PTRACE_GET_THREAD_AREA 25
|
||||
-#endif
|
||||
-
|
||||
-/* Defined in auto-generated file reg-i386-linux.c. */
|
||||
-void init_registers_i386_linux (void);
|
||||
-
|
||||
-
|
||||
-/* This module only supports access to the general purpose registers. */
|
||||
-
|
||||
-#define i386_num_regs 16
|
||||
-
|
||||
-/* This stuff comes from i386-linux-nat.c. */
|
||||
-
|
||||
-/* Mapping between the general-purpose registers in `struct user'
|
||||
- format and GDB's register array layout. */
|
||||
-static int i386_regmap[] =
|
||||
-{
|
||||
- EAX * 4, ECX * 4, EDX * 4, EBX * 4,
|
||||
- UESP * 4, EBP * 4, ESI * 4, EDI * 4,
|
||||
- EIP * 4, EFL * 4, CS * 4, SS * 4,
|
||||
- DS * 4, ES * 4, FS * 4, GS * 4
|
||||
-};
|
||||
-
|
||||
-/* Called by libthread_db. */
|
||||
-
|
||||
-ps_err_e
|
||||
-ps_get_thread_area (const struct ps_prochandle *ph,
|
||||
- lwpid_t lwpid, int idx, void **base)
|
||||
-{
|
||||
- unsigned int desc[4];
|
||||
-
|
||||
- if (ptrace (PTRACE_GET_THREAD_AREA, lwpid,
|
||||
- (void *) idx, (unsigned long) &desc) < 0)
|
||||
- return PS_ERR;
|
||||
-
|
||||
- *(int *)base = desc[1];
|
||||
- return PS_OK;
|
||||
-}
|
||||
-
|
||||
-static int
|
||||
-i386_cannot_store_register (int regno)
|
||||
-{
|
||||
- return (regno >= i386_num_regs);
|
||||
-}
|
||||
-
|
||||
-static int
|
||||
-i386_cannot_fetch_register (int regno)
|
||||
-{
|
||||
- return (regno >= i386_num_regs);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-#ifdef HAVE_PTRACE_GETREGS
|
||||
-#include <sys/procfs.h>
|
||||
-#include <sys/ptrace.h>
|
||||
-
|
||||
-static void
|
||||
-i386_fill_gregset (void *buf)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < i386_num_regs; i++)
|
||||
- collect_register (i, ((char *) buf) + i386_regmap[i]);
|
||||
-
|
||||
- collect_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-i386_store_gregset (const void *buf)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < i386_num_regs; i++)
|
||||
- supply_register (i, ((char *) buf) + i386_regmap[i]);
|
||||
-
|
||||
- supply_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-i386_fill_fpregset (void *buf)
|
||||
-{
|
||||
- i387_cache_to_fsave (buf);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-i386_store_fpregset (const void *buf)
|
||||
-{
|
||||
- i387_fsave_to_cache (buf);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-i386_fill_fpxregset (void *buf)
|
||||
-{
|
||||
- i387_cache_to_fxsave (buf);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-i386_store_fpxregset (const void *buf)
|
||||
-{
|
||||
- i387_fxsave_to_cache (buf);
|
||||
-}
|
||||
-
|
||||
-#endif /* HAVE_PTRACE_GETREGS */
|
||||
-
|
||||
-struct regset_info target_regsets[] = {
|
||||
-#ifdef HAVE_PTRACE_GETREGS
|
||||
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
|
||||
- GENERAL_REGS,
|
||||
- i386_fill_gregset, i386_store_gregset },
|
||||
-# ifdef HAVE_PTRACE_GETFPXREGS
|
||||
- { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, sizeof (elf_fpxregset_t),
|
||||
- EXTENDED_REGS,
|
||||
- i386_fill_fpxregset, i386_store_fpxregset },
|
||||
-# endif
|
||||
- { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
|
||||
- FP_REGS,
|
||||
- i386_fill_fpregset, i386_store_fpregset },
|
||||
-#endif /* HAVE_PTRACE_GETREGS */
|
||||
- { 0, 0, -1, -1, NULL, NULL }
|
||||
-};
|
||||
-
|
||||
-static const unsigned char i386_breakpoint[] = { 0xCC };
|
||||
-#define i386_breakpoint_len 1
|
||||
-
|
||||
-extern int debug_threads;
|
||||
-
|
||||
-static CORE_ADDR
|
||||
-i386_get_pc ()
|
||||
-{
|
||||
- unsigned long pc;
|
||||
-
|
||||
- collect_register_by_name ("eip", &pc);
|
||||
-
|
||||
- if (debug_threads)
|
||||
- fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc);
|
||||
- return pc;
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-i386_set_pc (CORE_ADDR newpc)
|
||||
-{
|
||||
- if (debug_threads)
|
||||
- fprintf (stderr, "set pc to %08lx\n", (long) newpc);
|
||||
- supply_register_by_name ("eip", &newpc);
|
||||
-}
|
||||
-
|
||||
-static int
|
||||
-i386_breakpoint_at (CORE_ADDR pc)
|
||||
-{
|
||||
- unsigned char c;
|
||||
-
|
||||
- read_inferior_memory (pc, &c, 1);
|
||||
- if (c == 0xCC)
|
||||
- return 1;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-struct linux_target_ops the_low_target = {
|
||||
- init_registers_i386_linux,
|
||||
- i386_num_regs,
|
||||
- i386_regmap,
|
||||
- i386_cannot_fetch_register,
|
||||
- i386_cannot_store_register,
|
||||
- i386_get_pc,
|
||||
- i386_set_pc,
|
||||
- i386_breakpoint,
|
||||
- i386_breakpoint_len,
|
||||
- NULL,
|
||||
- 1,
|
||||
- i386_breakpoint_at,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
-};
|
||||
diff -up -ruNp gdb-7.0.1-orig/gdb/gdbserver/linux-x86-64-low.c gdb-7.0.1/gdb/gdbserver/linux-x86-64-low.c
|
||||
--- gdb-7.0.1-orig/gdb/gdbserver/linux-x86-64-low.c 2010-02-09 11:22:39.000000000 +0100
|
||||
+++ gdb-7.0.1/gdb/gdbserver/linux-x86-64-low.c 1970-01-01 01:00:00.000000000 +0100
|
||||
@@ -1,184 +0,0 @@
|
||||
-/* GNU/Linux/x86-64 specific low level interface, for the remote server
|
||||
- for GDB.
|
||||
- Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
- Free Software Foundation, Inc.
|
||||
-
|
||||
- This file is part of GDB.
|
||||
-
|
||||
- This program is free software; you can redistribute it and/or modify
|
||||
- it under the terms of the GNU General Public License as published by
|
||||
- the Free Software Foundation; either version 3 of the License, or
|
||||
- (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#include "server.h"
|
||||
-#include "linux-low.h"
|
||||
-#include "i387-fp.h"
|
||||
-
|
||||
-#include "gdb_proc_service.h"
|
||||
-
|
||||
-/* Defined in auto-generated file reg-x86-64-linux.c. */
|
||||
-void init_registers_x86_64_linux (void);
|
||||
-
|
||||
-#include <sys/reg.h>
|
||||
-#include <sys/procfs.h>
|
||||
-#include <sys/ptrace.h>
|
||||
-
|
||||
-/* This definition comes from prctl.h, but some kernels may not have it. */
|
||||
-#ifndef PTRACE_ARCH_PRCTL
|
||||
-#define PTRACE_ARCH_PRCTL 30
|
||||
-#endif
|
||||
-
|
||||
-/* The following definitions come from prctl.h, but may be absent
|
||||
- for certain configurations. */
|
||||
-#ifndef ARCH_GET_FS
|
||||
-#define ARCH_SET_GS 0x1001
|
||||
-#define ARCH_SET_FS 0x1002
|
||||
-#define ARCH_GET_FS 0x1003
|
||||
-#define ARCH_GET_GS 0x1004
|
||||
-#endif
|
||||
-
|
||||
-static int x86_64_regmap[] = {
|
||||
- RAX * 8, RBX * 8, RCX * 8, RDX * 8,
|
||||
- RSI * 8, RDI * 8, RBP * 8, RSP * 8,
|
||||
- R8 * 8, R9 * 8, R10 * 8, R11 * 8,
|
||||
- R12 * 8, R13 * 8, R14 * 8, R15 * 8,
|
||||
- RIP * 8, EFLAGS * 8, CS * 8, SS * 8,
|
||||
- DS * 8, ES * 8, FS * 8, GS * 8,
|
||||
- -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
- -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
- -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
- -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
- ORIG_RAX * 8
|
||||
-};
|
||||
-
|
||||
-#define X86_64_NUM_GREGS (sizeof(x86_64_regmap)/sizeof(int))
|
||||
-
|
||||
-/* Called by libthread_db. */
|
||||
-
|
||||
-ps_err_e
|
||||
-ps_get_thread_area (const struct ps_prochandle *ph,
|
||||
- lwpid_t lwpid, int idx, void **base)
|
||||
-{
|
||||
- switch (idx)
|
||||
- {
|
||||
- case FS:
|
||||
- if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
|
||||
- return PS_OK;
|
||||
- break;
|
||||
- case GS:
|
||||
- if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
|
||||
- return PS_OK;
|
||||
- break;
|
||||
- default:
|
||||
- return PS_BADADDR;
|
||||
- }
|
||||
- return PS_ERR;
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-x86_64_fill_gregset (void *buf)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < X86_64_NUM_GREGS; i++)
|
||||
- if (x86_64_regmap[i] != -1)
|
||||
- collect_register (i, ((char *) buf) + x86_64_regmap[i]);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-x86_64_store_gregset (const void *buf)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < X86_64_NUM_GREGS; i++)
|
||||
- if (x86_64_regmap[i] != -1)
|
||||
- supply_register (i, ((char *) buf) + x86_64_regmap[i]);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-x86_64_fill_fpregset (void *buf)
|
||||
-{
|
||||
- i387_cache_to_fxsave (buf);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-x86_64_store_fpregset (const void *buf)
|
||||
-{
|
||||
- i387_fxsave_to_cache (buf);
|
||||
-}
|
||||
-
|
||||
-struct regset_info target_regsets[] = {
|
||||
- { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
|
||||
- GENERAL_REGS,
|
||||
- x86_64_fill_gregset, x86_64_store_gregset },
|
||||
- { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
|
||||
- FP_REGS,
|
||||
- x86_64_fill_fpregset, x86_64_store_fpregset },
|
||||
- { 0, 0, -1, -1, NULL, NULL }
|
||||
-};
|
||||
-
|
||||
-static const unsigned char x86_64_breakpoint[] = { 0xCC };
|
||||
-#define x86_64_breakpoint_len 1
|
||||
-
|
||||
-extern int debug_threads;
|
||||
-
|
||||
-static CORE_ADDR
|
||||
-x86_64_get_pc ()
|
||||
-{
|
||||
- unsigned long pc;
|
||||
-
|
||||
- collect_register_by_name ("rip", &pc);
|
||||
-
|
||||
- if (debug_threads)
|
||||
- fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc);
|
||||
- return pc;
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-x86_64_set_pc (CORE_ADDR newpc)
|
||||
-{
|
||||
- if (debug_threads)
|
||||
- fprintf (stderr, "set pc to %08lx\n", (long) newpc);
|
||||
- supply_register_by_name ("rip", &newpc);
|
||||
-}
|
||||
-
|
||||
-static int
|
||||
-x86_64_breakpoint_at (CORE_ADDR pc)
|
||||
-{
|
||||
- unsigned char c;
|
||||
-
|
||||
- read_inferior_memory (pc, &c, 1);
|
||||
- if (c == 0xCC)
|
||||
- return 1;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-struct linux_target_ops the_low_target = {
|
||||
- init_registers_x86_64_linux,
|
||||
- -1,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- x86_64_get_pc,
|
||||
- x86_64_set_pc,
|
||||
- x86_64_breakpoint,
|
||||
- x86_64_breakpoint_len,
|
||||
- NULL,
|
||||
- 1,
|
||||
- x86_64_breakpoint_at,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
- NULL,
|
||||
-};
|
|
@ -0,0 +1,194 @@
|
|||
[ Rediffed against gdb-7.0.1. ]
|
||||
|
||||
watchpoint-hw-hit-once.c is a part of:
|
||||
http://sourceware.org/ml/gdb-patches/2009-11/msg00444.html
|
||||
http://sourceware.org/ml/gdb-cvs/2009-11/msg00178.html
|
||||
ec27fce19a16df73e763281ce3a6d0cdb718174e
|
||||
|
||||
|
||||
--- a/gdb/config/i386/linux64.mh
|
||||
+++ b/gdb/config/i386/linux64.mh
|
||||
@@ -2,7 +2,7 @@
|
||||
NATDEPFILES= inf-ptrace.o fork-child.o \
|
||||
i386-nat.o amd64-nat.o amd64-linux-nat.o linux-nat.o \
|
||||
proc-service.o linux-thread-db.o gcore.o linux-fork.o
|
||||
-NAT_FILE= config/nm-linux.h
|
||||
+NAT_FILE= nm-linux64.h
|
||||
|
||||
# The dynamically loaded libthread_db needs access to symbols in the
|
||||
# gdb executable.
|
||||
--- a/gdb/config/i386/nm-linux.h
|
||||
+++ b/gdb/config/i386/nm-linux.h
|
||||
@@ -29,4 +29,7 @@
|
||||
#define FILL_FPXREGSET
|
||||
#endif
|
||||
|
||||
+/* Red Hat backward compatibility with gdb-6.8. */
|
||||
+#define target_can_use_hardware_watchpoint(type, cnt, ot) 1
|
||||
+
|
||||
#endif /* nm-linux.h */
|
||||
--- /dev/null
|
||||
+++ b/gdb/config/i386/nm-linux64.h
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* Native support for GNU/Linux amd64.
|
||||
+
|
||||
+ Copyright 2010 Free Software Foundation, Inc.
|
||||
+
|
||||
+ This file is part of GDB.
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation; either version 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#ifndef NM_LINUX64_H
|
||||
+#define NM_LINUX64_H
|
||||
+
|
||||
+#include "config/nm-linux.h"
|
||||
+
|
||||
+/* Red Hat backward compatibility with gdb-6.8. */
|
||||
+#define target_can_use_hardware_watchpoint(type, cnt, ot) 1
|
||||
+
|
||||
+#endif /* NM_LINUX64_H */
|
||||
--- gdb-7.0.1-orig/gdb/config/ia64/linux.mh 2007-04-26 00:17:48.000000000 +0200
|
||||
+++ gdb-7.0.1/gdb/config/ia64/linux.mh 2010-02-24 01:40:21.000000000 +0100
|
||||
@@ -1,6 +1,6 @@
|
||||
# Host: Intel IA-64 running GNU/Linux
|
||||
|
||||
-NAT_FILE= config/nm-linux.h
|
||||
+NAT_FILE= nm-linux.h
|
||||
NATDEPFILES= inf-ptrace.o fork-child.o corelow.o gcore.o \
|
||||
core-regset.o ia64-linux-nat.o \
|
||||
proc-service.o linux-thread-db.o linux-nat.o linux-fork.o
|
||||
--- /dev/null
|
||||
+++ b/gdb/config/ia64/nm-linux.h
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* Native support for GNU/Linux ia64.
|
||||
+
|
||||
+ Copyright 2010 Free Software Foundation, Inc.
|
||||
+
|
||||
+ This file is part of GDB.
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify
|
||||
+ it under the terms of the GNU General Public License as published by
|
||||
+ the Free Software Foundation; either version 3 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ GNU General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License
|
||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#ifndef NM_LINUX_H
|
||||
+#define NM_LINUX_H
|
||||
+
|
||||
+#include "config/nm-linux.h"
|
||||
+
|
||||
+/* Red Hat backward compatibility with gdb-6.8. */
|
||||
+#define target_can_use_hardware_watchpoint(type, cnt, ot) 1
|
||||
+
|
||||
+#endif /* NM_LINUX_H */
|
||||
--- a/gdb/target.h
|
||||
+++ b/gdb/target.h
|
||||
@@ -1257,8 +1257,10 @@ extern char *normal_pid_to_str (ptid_t ptid);
|
||||
bp_hardware_breakpoint. CNT is the number of such watchpoints used so far
|
||||
(including this one?). OTHERTYPE is who knows what... */
|
||||
|
||||
+#ifndef target_can_use_hardware_watchpoint
|
||||
#define target_can_use_hardware_watchpoint(TYPE,CNT,OTHERTYPE) \
|
||||
(*current_target.to_can_use_hw_breakpoint) (TYPE, CNT, OTHERTYPE);
|
||||
+#endif
|
||||
|
||||
#define target_region_ok_for_hw_watchpoint(addr, len) \
|
||||
(*current_target.to_region_ok_for_hw_watchpoint) (addr, len)
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/watchpoint-hw-before-run.exp
|
||||
@@ -0,0 +1,40 @@
|
||||
+# Copyright 2009, 2010 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/>.
|
||||
+
|
||||
+# Arch not supporting hw watchpoints does not imply no_hardware_watchpoints set.
|
||||
+if {(![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"]
|
||||
+ && ![istarget "ia64-*-*"])
|
||||
+ || [target_info exists gdb,no_hardware_watchpoints]} then {
|
||||
+ verbose "Skipping watchpoint-hw-before-run test."
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+set test watchpoint-hw-before-run
|
||||
+set srcfile watchpoint-hw-hit-once.c
|
||||
+if { [prepare_for_testing ${test}.exp ${test} ${srcfile}] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_test "rwatch watchee" "ardware read watchpoint 1: watchee"
|
||||
+
|
||||
+# `runto_main' or `runto main' would delete the watchpoint created above.
|
||||
+
|
||||
+if { [gdb_start_cmd] < 0 } {
|
||||
+ untested start
|
||||
+ return -1
|
||||
+}
|
||||
+gdb_test "" "main .* at .*" "start"
|
||||
+
|
||||
+gdb_test "continue" "Continuing.\r\nHardware read watchpoint \[0-9\]+: watchee\r\n\r\nValue = 0\r\n.*"
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/watchpoint-hw-hit-once.c
|
||||
@@ -0,0 +1,34 @@
|
||||
+/* 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/>. */
|
||||
+
|
||||
+static int watchee;
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ volatile int dummy;
|
||||
+
|
||||
+ /* Stub lines are present as no breakpoints/watchpoint gets hit if current PC
|
||||
+ already stays on the line PC while entering "step"/"continue". */
|
||||
+
|
||||
+ dummy = 0; /* Stub to catch WATCHEE access after runto_main. */
|
||||
+ dummy = watchee;
|
||||
+ dummy = 1; /* Stub to catch break-at-exit after WATCHEE has been hit. */
|
||||
+ dummy = 2; /* break-at-exit */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
|
@ -0,0 +1,117 @@
|
|||
There was a regression by:
|
||||
|
||||
Re: [rfc, v3] Fix frame_id_inner comparison false positives
|
||||
http://sourceware.org/ml/gdb-patches/2008-08/msg00578.html
|
||||
http://sourceware.org/ml/gdb-cvs/2008-08/msg00182.html
|
||||
916dde5d38b45a659514e47942ece70aec04cd78
|
||||
|
||||
the part:
|
||||
* stack.c (return_command): Directly pop the selected frame.
|
||||
|
||||
Reproducible on:
|
||||
hp-diablo-01.rhts.eng.bos.redhat.com
|
||||
RHEL5.5-Server-20100216.nightly
|
||||
kernel-2.6.18-187.el5.ia64
|
||||
|
||||
Not reproducible on:
|
||||
hp-bl860c-03.rhts.eng.bos.redhat.com
|
||||
RHEL-4.8
|
||||
kernel-2.6.9-89.EL.ia64
|
||||
|
||||
To make ia64-tdep.c compilable +/- this stack.c check-in one must apply:
|
||||
|
||||
Re: [RFC] Remove addr, endaddr, offset from obj_section
|
||||
http://sourceware.org/ml/gdb-patches/2008-09/msg00011.html
|
||||
http://sourceware.org/ml/gdb-cvs/2008-09/msg00009.html
|
||||
99072369ec3c8f94c9a596e5ce30bf1f1c4bf20e
|
||||
|
||||
It is reproducible by:
|
||||
gdb.base/call-signal-resume.exp
|
||||
although one must first remove the gdb_assert by:
|
||||
gdb-infcall-sp-underflow.patch
|
||||
|
||||
Reproducer:
|
||||
set confirm no
|
||||
set breakpoint pending on
|
||||
set height 0
|
||||
set width 0
|
||||
# testcase from: gdb-6.8-37.el5.src
|
||||
file gdb.base/call-signals
|
||||
break stop_one
|
||||
run
|
||||
call gen_signal ()
|
||||
bt
|
||||
frame 3
|
||||
return
|
||||
p/x $sp
|
||||
break stop_two
|
||||
info break
|
||||
p/x $pc
|
||||
p/x $sp
|
||||
bt
|
||||
set debug infrun 1
|
||||
delete 1
|
||||
continue
|
||||
bt
|
||||
p/x $pc
|
||||
echo Bug is reproduced if sp is now 0:\n
|
||||
p/x $sp
|
||||
kill
|
||||
quit
|
||||
|
||||
|
||||
--- ./gdb/frame.c 2010-02-23 21:35:35.000000000 +0100
|
||||
+++ ./gdb/frame.c 2010-02-23 21:46:34.000000000 +0100
|
||||
@@ -517,7 +517,7 @@ frame_id_eq (struct frame_id l, struct f
|
||||
a stack overflow strategy that cause the handler to be run on a
|
||||
different stack. */
|
||||
|
||||
-static int
|
||||
+int
|
||||
frame_id_inner (struct gdbarch *gdbarch, struct frame_id l, struct frame_id r)
|
||||
{
|
||||
int inner;
|
||||
--- ./gdb/frame.h 2009-09-13 18:28:28.000000000 +0200
|
||||
+++ ./gdb/frame.h 2010-02-23 21:46:10.000000000 +0100
|
||||
@@ -708,4 +708,7 @@ extern struct frame_info *create_new_fra
|
||||
extern int frame_unwinder_is (struct frame_info *fi,
|
||||
const struct frame_unwind *unwinder);
|
||||
|
||||
+extern int frame_id_inner (struct gdbarch *gdbarch, struct frame_id l,
|
||||
+ struct frame_id r);
|
||||
+
|
||||
#endif /* !defined (FRAME_H) */
|
||||
--- ./gdb/stack.c 2010-02-23 21:35:34.000000000 +0100
|
||||
+++ ./gdb/stack.c 2010-02-23 21:44:39.000000000 +0100
|
||||
@@ -1967,8 +1967,29 @@ If you continue, the return value that y
|
||||
error (_("Not confirmed"));
|
||||
}
|
||||
|
||||
- /* Discard the selected frame and all frames inner-to it. */
|
||||
- frame_pop (get_selected_frame (NULL));
|
||||
+ /* NOTE: cagney/2003-01-18: Is this silly? Rather than pop each
|
||||
+ frame in turn, should this code just go straight to the relevant
|
||||
+ frame and pop that? */
|
||||
+
|
||||
+ /* First discard all frames inner-to the selected frame (making the
|
||||
+ selected frame current). */
|
||||
+ {
|
||||
+ struct frame_id selected_id = get_frame_id (get_selected_frame (NULL));
|
||||
+ while (!frame_id_eq (selected_id, get_frame_id (get_current_frame ())))
|
||||
+ {
|
||||
+ struct frame_info *frame = get_current_frame ();
|
||||
+ if (frame_id_inner (get_frame_arch (frame), selected_id,
|
||||
+ get_frame_id (frame)))
|
||||
+ /* Caught in the safety net, oops! We've gone way past the
|
||||
+ selected frame. */
|
||||
+ error (_("Problem while popping stack frames (corrupt stack?)"));
|
||||
+ frame_pop (get_current_frame ());
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Second discard the selected frame (which is now also the current
|
||||
+ frame). */
|
||||
+ frame_pop (get_current_frame ());
|
||||
|
||||
/* Store RETURN_VALUE in the just-returned register set. */
|
||||
if (return_value != NULL)
|
|
@ -0,0 +1,81 @@
|
|||
http://sourceware.org/ml/gdb-patches/2010-02/msg00515.html
|
||||
Subject: [patch] infcall: Remove gdb_assert ($sp overflow)
|
||||
|
||||
Hi,
|
||||
|
||||
set $sp=0
|
||||
call something()
|
||||
->
|
||||
../../gdb/infcall.c:521: internal-error: call_function_by_hand: Assertion
|
||||
`(gdbarch_inner_than (gdbarch, 1, 2) && sp <= old_sp) || (gdbarch_inner_than
|
||||
(gdbarch, 2, 1) && sp >= old_sp)' failed.
|
||||
|
||||
as $sp - frame == 0xffffsmth which is not lower than $sp.
|
||||
|
||||
It must not be gdb_assert(). It can be an error() but I left it just to do:
|
||||
(gdb) set $sp=0
|
||||
(gdb) call doubleit (1)
|
||||
Cannot access memory at address 0xffffffffffffff78
|
||||
(gdb) set $sp=-1
|
||||
(gdb) call doubleit (1)
|
||||
Cannot access memory at address 0xffffffffffffff68
|
||||
|
||||
Unaware how inconvenient is an intentional crash of the testcase on some
|
||||
embedded/non-MMU systems.
|
||||
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2010-02-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* infcall.c (call_function_by_hand): Remove gdb_assert on sp and old_sp.
|
||||
New comment.
|
||||
|
||||
gdb/testsuite/
|
||||
2010-02-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.base/callfuncs.exp: New tests for $spval 0 and -1. Remove return.
|
||||
|
||||
--- a/gdb/infcall.c
|
||||
+++ b/gdb/infcall.c
|
||||
@@ -518,10 +518,9 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
|
||||
/* Stack grows up. */
|
||||
sp = gdbarch_frame_align (gdbarch, old_sp + 1);
|
||||
}
|
||||
- gdb_assert ((gdbarch_inner_than (gdbarch, 1, 2)
|
||||
- && sp <= old_sp)
|
||||
- || (gdbarch_inner_than (gdbarch, 2, 1)
|
||||
- && sp >= old_sp));
|
||||
+ /* SP may have overflown address zero here from OLD_SP. Memory access
|
||||
+ functions will probably fail in such case but that is a target's
|
||||
+ problem. */
|
||||
}
|
||||
else
|
||||
/* FIXME: cagney/2002-09-18: Hey, you loose!
|
||||
--- a/gdb/testsuite/gdb.base/callfuncs.exp
|
||||
+++ b/gdb/testsuite/gdb.base/callfuncs.exp
|
||||
@@ -469,5 +469,18 @@ if {$old_reg_content == $new_reg_content} then {
|
||||
fail "nested call dummies preserve register contents"
|
||||
}
|
||||
|
||||
-return 0
|
||||
+# GDB should not crash by internal error on $sp overflow during the inferior
|
||||
+# call. It is OK it will stop on some: Cannot access memory at address 0x$hex.
|
||||
|
||||
+foreach spval {0 -1} {
|
||||
+ set old_ldprefix $pf_prefix
|
||||
+ lappend pf_prefix "sp=$spval:"
|
||||
+
|
||||
+ gdb_test {set $old_sp = $sp}
|
||||
+ gdb_test "set \$sp = $spval"
|
||||
+
|
||||
+ gdb_test "call doubleit (1)"
|
||||
+
|
||||
+ gdb_test {set $sp = $old_sp}
|
||||
+ set pf_prefix $old_ldprefix
|
||||
+}
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
http://sourceware.org/ml/gdb-patches/2010-02/msg00477.html
|
||||
Subject: Re: [patch] Fix crash on stale addrinfo->sectindex
|
||||
|
||||
On Fri, 19 Feb 2010 04:01:05 +0100, Tom Tromey wrote:
|
||||
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
|
||||
> I think you ought to move this comment as well.
|
||||
> It appears to just be hanging at the end of a block after the patch.
|
||||
|
||||
Yes; forgot.
|
||||
|
||||
> This is ok with that change. Thanks.
|
||||
|
||||
Checked-in.
|
||||
|
||||
On Fri, 19 Feb 2010 04:10:30 +0100, Tom Tromey wrote:
|
||||
> Oh, by the way, I think this is reasonable for 7.1. It is
|
||||
> straightforward and fixes a reported crash. If Joel agrees, please put
|
||||
> it on the branch. Thanks.
|
||||
|
||||
OK for the branch?
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
http://sourceware.org/ml/gdb-cvs/2010-02/msg00162.html
|
||||
|
||||
### src/gdb/ChangeLog 2010/02/19 00:35:53 1.11380
|
||||
### src/gdb/ChangeLog 2010/02/19 06:19:44 1.11381
|
||||
## -1,3 +1,10 @@
|
||||
+2010-02-19 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ * symfile.c (addr_info_make_relative): Extend comment. Move SECT to
|
||||
+ a more inner block. Initialize ADDR by LOWER_OFFSET only if it was
|
||||
+ found by bfd_get_section_by_name.
|
||||
+ * symfile.h (struct section_addr_info) <sectindex>: New comment.
|
||||
+
|
||||
2010-02-19 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* NEWS: Add new "[...] since 7.1" section. Rename the "[...] since
|
||||
--- src/gdb/symfile.c 2010/02/18 19:17:00 1.272
|
||||
+++ src/gdb/symfile.c 2010/02/19 06:19:45 1.273
|
||||
@@ -562,13 +562,13 @@
|
||||
}
|
||||
|
||||
/* Relativize absolute addresses in ADDRS into offsets based on ABFD. Fill-in
|
||||
- also SECTINDEXes there. */
|
||||
+ also SECTINDEXes specific to ABFD there. This function can be used to
|
||||
+ rebase ADDRS to start referencing different BFD than before. */
|
||||
|
||||
void
|
||||
addr_info_make_relative (struct section_addr_info *addrs, bfd *abfd)
|
||||
{
|
||||
asection *lower_sect;
|
||||
- asection *sect;
|
||||
CORE_ADDR lower_offset;
|
||||
int i;
|
||||
|
||||
@@ -597,25 +597,29 @@
|
||||
|
||||
for (i = 0; i < addrs->num_sections && addrs->other[i].name; i++)
|
||||
{
|
||||
- if (addrs->other[i].addr != 0)
|
||||
+ asection *sect = bfd_get_section_by_name (abfd, addrs->other[i].name);
|
||||
+
|
||||
+ if (sect)
|
||||
{
|
||||
- sect = bfd_get_section_by_name (abfd, addrs->other[i].name);
|
||||
- if (sect)
|
||||
+ /* This is the index used by BFD. */
|
||||
+ addrs->other[i].sectindex = sect->index;
|
||||
+
|
||||
+ if (addrs->other[i].addr != 0)
|
||||
{
|
||||
addrs->other[i].addr -= bfd_section_vma (abfd, sect);
|
||||
lower_offset = addrs->other[i].addr;
|
||||
- /* This is the index used by BFD. */
|
||||
- addrs->other[i].sectindex = sect->index;
|
||||
}
|
||||
else
|
||||
- {
|
||||
- warning (_("section %s not found in %s"), addrs->other[i].name,
|
||||
- bfd_get_filename (abfd));
|
||||
- addrs->other[i].addr = 0;
|
||||
- }
|
||||
+ addrs->other[i].addr = lower_offset;
|
||||
}
|
||||
else
|
||||
- addrs->other[i].addr = lower_offset;
|
||||
+ {
|
||||
+ warning (_("section %s not found in %s"), addrs->other[i].name,
|
||||
+ bfd_get_filename (abfd));
|
||||
+ addrs->other[i].addr = 0;
|
||||
+
|
||||
+ /* SECTINDEX is invalid if ADDR is zero. */
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--- src/gdb/symfile.h 2010/02/03 14:13:16 1.64
|
||||
+++ src/gdb/symfile.h 2010/02/19 06:19:45 1.65
|
||||
@@ -80,6 +80,8 @@
|
||||
{
|
||||
CORE_ADDR addr;
|
||||
char *name;
|
||||
+
|
||||
+ /* SECTINDEX must be valid for associated BFD if ADDR is not zero. */
|
||||
int sectindex;
|
||||
} other[1];
|
||||
};
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
commit 03729380c318738d19256b219bcc03d333dc54bf
|
||||
Author: Daniel Jacobowitz <dan@debian.org>
|
||||
Date: Mon Feb 1 17:51:18 2010 +0000
|
||||
|
||||
[...]
|
||||
* gdb.base/interrupt.exp: Match unexpected gdb prompt.
|
||||
|
||||
--- a/gdb/testsuite/gdb.base/interrupt.exp
|
||||
+++ b/gdb/testsuite/gdb.base/interrupt.exp
|
||||
@@ -167,6 +167,7 @@ if ![file exists $binfile] then {
|
||||
# here.
|
||||
gdb_expect {
|
||||
-re "^(\r\n|)data\r\n(|data\r\n)$" { pass "echo data" }
|
||||
+ -re "Undefined command.*$gdb_prompt " { fail "echo data" }
|
||||
timeout { fail "echo data (timeout)" }
|
||||
eof { fail "echo data (eof)" }
|
||||
}
|
39
gdb.spec
39
gdb.spec
|
@ -36,7 +36,7 @@ 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: 31%{?_with_upstream:.upstream}%{dist}
|
||||
Release: 32%{?_with_upstream:.upstream}%{dist}
|
||||
|
||||
License: GPLv3+
|
||||
Group: Development/Debuggers
|
||||
|
@ -349,6 +349,7 @@ Patch326: gdb-6.8-tui-singlebinary.patch
|
|||
# Support transparent debugging of inlined functions for an optimized code.
|
||||
# Disable break-by-name on inlined functions due to a regression on parameters
|
||||
# of inlined functions falsely <optimized out> (BZ 556975 Comment 8).
|
||||
# Disable addon (finish) due to inline-cmds.exp: up from outer_inline2 assert.
|
||||
Patch350: gdb-6.8-inlining-addon.patch
|
||||
Patch328: gdb-6.8-inlining-by-name.patch
|
||||
|
||||
|
@ -375,6 +376,8 @@ Patch348: gdb-6.8-bz466901-backtrace-full-prelinked.patch
|
|||
|
||||
# The merged branch `archer' of: http://sourceware.org/gdb/wiki/ProjectArcher
|
||||
Patch349: gdb-archer.patch
|
||||
Patch418: gdb-archer-excessive-files.patch
|
||||
Patch420: gdb-archer-ada.patch
|
||||
|
||||
# Fix parsing elf64-i386 files for kdump PAE vmcore dumps (BZ 457187).
|
||||
# - Turn on 64-bit BFD support, globally enable AC_SYS_LARGEFILE.
|
||||
|
@ -450,6 +453,21 @@ Patch414: gdb-bz559414-pie-assert-fix.patch
|
|||
# Fortran: Fix regression on setting breakpoint at toplevel symbols (BZ 559291).
|
||||
Patch416: gdb-bz559291-fortran-module-toplevel.patch
|
||||
|
||||
# Fix i386+x86_64 rwatch+awatch before run, regression against 6.8 (BZ 541866).
|
||||
Patch417: gdb-bz541866-rwatch-before-run.patch
|
||||
|
||||
# testsuite: Fix long timeout on arches with failing gdb.base/interrupt.exp.
|
||||
Patch419: gdb-test-interrupt.exp-timeout.patch
|
||||
|
||||
# Fix crash on stale addrinfo->sectindex (more sensitive due to the PIE patch).
|
||||
Patch421: gdb-stale-sectindex.patch
|
||||
|
||||
# Remove false gdb_assert on $sp underflow.
|
||||
Patch422: gdb-infcall-sp-underflow.patch
|
||||
|
||||
# Workaround ia64 inferior calls clearing SP.
|
||||
Patch423: gdb-ia64-infcall-workaround.patch
|
||||
|
||||
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
|
||||
Requires: readline%{?_isa}
|
||||
BuildRequires: readline-devel%{?_isa}
|
||||
|
@ -581,6 +599,8 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||
|
||||
%patch232 -p1
|
||||
%patch349 -p1
|
||||
%patch418 -p1
|
||||
%patch420 -p1
|
||||
%patch383 -p1
|
||||
%patch384 -p1
|
||||
%patch385 -p1
|
||||
|
@ -672,7 +692,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||
%patch322 -p1
|
||||
%patch324 -p1
|
||||
%patch326 -p1
|
||||
%patch350 -p1
|
||||
###patch350 -p1
|
||||
###patch328 -p1
|
||||
%patch329 -p1
|
||||
%patch330 -p1
|
||||
|
@ -703,6 +723,11 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
|||
%patch402 -p1
|
||||
%patch414 -p1
|
||||
%patch416 -p1
|
||||
%patch417 -p1
|
||||
%patch419 -p1
|
||||
%patch421 -p1
|
||||
%patch422 -p1
|
||||
%patch423 -p1
|
||||
# Always verify their applicability.
|
||||
%patch393 -p1
|
||||
%patch335 -p1
|
||||
|
@ -1028,6 +1053,16 @@ fi
|
|||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Feb 26 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-32.fc12
|
||||
- Fix gdb.ada/* regressions (Keith Seitz).
|
||||
- Disable addon (finish) due to inline-cmds.exp: up from outer_inline2 assert.
|
||||
- Fix i386+x86_64 rwatch+awatch before run, regression against 6.8 (BZ 541866).
|
||||
- Fix crash on stale addrinfo->sectindex (more sensitive due to the PIE patch).
|
||||
- Remove false gdb_assert on $sp underflow.
|
||||
- Workaround ia64 inferior calls clearing SP.
|
||||
- testsuite: Fix long timeout on arches with failing gdb.base/interrupt.exp.
|
||||
- Fix ia64 part of the bt-clone-stop.exp fix.
|
||||
|
||||
* Wed Feb 3 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.1-31.fc12
|
||||
- Fortran: Fix regression on setting breakpoint at toplevel symbols (BZ 559291).
|
||||
|
||||
|
|
Loading…
Reference in New Issue