aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/config/mips/nm-irix5.h4
-rw-r--r--gdb/procfs.c34
3 files changed, 45 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1f70d12..489279e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2002-08-13 Kevin Buettner <kevinb@redhat.com>
+
+ * procfs.c (procfs_can_use_hw_breakpoint): New function.
+ (init_procfs_ops): Define ``to_can_use_hw_breakpoint'' for procfs
+ target vector.
+ * config/mips/nm-irix5.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT):
+ Delete. Add comment regarding this now-deleted target method.
+
2002-08-13 Stephane Carrez <stcarrez@nerim.fr>
* m68hc11-tdep.c (M68HC12_NUM_PSEUDO_REGS): New define.
diff --git a/gdb/config/mips/nm-irix5.h b/gdb/config/mips/nm-irix5.h
index 8e31b59..59749f6 100644
--- a/gdb/config/mips/nm-irix5.h
+++ b/gdb/config/mips/nm-irix5.h
@@ -24,7 +24,9 @@
#define TARGET_HAS_HARDWARE_WATCHPOINTS
-#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1
+/* 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
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 7688899..79f5575 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -136,6 +136,8 @@ static int proc_find_memory_regions (int (*) (CORE_ADDR,
static char * procfs_make_note_section (bfd *, int *);
+static int procfs_can_use_hw_breakpoint (int, int, int);
+
struct target_ops procfs_ops; /* the target vector */
static void
@@ -183,6 +185,7 @@ init_procfs_ops (void)
procfs_ops.to_has_thread_control = tc_schedlock;
procfs_ops.to_find_memory_regions = proc_find_memory_regions;
procfs_ops.to_make_corefile_notes = procfs_make_note_section;
+ procfs_ops.to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
procfs_ops.to_magic = OPS_MAGIC;
}
@@ -5138,6 +5141,37 @@ procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag,
return 0;
}
+/* Return non-zero if we can set a hardware watchpoint of type TYPE. TYPE
+ is one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint,
+ or bp_hardware_watchpoint. CNT is the number of watchpoints used so
+ far.
+
+ Note: procfs_can_use_hw_breakpoint() is not yet used by all
+ procfs.c targets due to the fact that some of them still define
+ TARGET_CAN_USE_HARDWARE_WATCHPOINT. */
+
+static int
+procfs_can_use_hw_breakpoint (int type, int cnt, int othertype)
+{
+#ifndef TARGET_HAS_HARDWARE_WATCHPOINTS
+ return 0;
+#else
+ /* Due to the way that proc_set_watchpoint() is implemented, host
+ and target pointers must be of the same size. If they are not,
+ we can't use hardware watchpoints. This limitation is due to the
+ fact that proc_set_watchpoint() calls address_to_host_pointer();
+ a close inspection of address_to_host_pointer will reveal that
+ an internal error will be generated when the host and target
+ pointer sizes are different. */
+ if (sizeof (void *) != TYPE_LENGTH (builtin_type_void_data_ptr))
+ return 0;
+
+ /* Other tests here??? */
+
+ return 1;
+#endif
+}
+
/*
* Function: stopped_by_watchpoint
*