From 00d4360e1c3b690029405686bd10559da3e44796 Mon Sep 17 00:00:00 2001
From: Ulrich Weigand <uweigand@de.ibm.com>
Date: Thu, 13 May 2004 16:39:11 +0000
Subject: [PATCH] 	* breakpoint.c (bpstat_stop_status): Add new argument 
 STOPPED_BY_WATCHPOINT.  Use it instead of testing 
 target_stopped_data_address agaist 0 to check whether 	or not we stopped due
 to a hardware watchpoint. 	* breakpoint.h (bpstat_stop_status): Adapt
 prototype. 	* infrun.c (handle_inferior_event): Call bpstat_stop_status 
 with new argument.

---
 gdb/ChangeLog    | 10 ++++++++++
 gdb/breakpoint.c |  7 ++++---
 gdb/breakpoint.h |  3 ++-
 gdb/infrun.c     | 10 ++++++----
 4 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7c2a80b40d0..4f45b6f8210 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2004-05-13  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* breakpoint.c (bpstat_stop_status): Add new argument
+	STOPPED_BY_WATCHPOINT.  Use it instead of testing
+	target_stopped_data_address agaist 0 to check whether
+	or not we stopped due to a hardware watchpoint.
+	* breakpoint.h (bpstat_stop_status): Adapt prototype.
+	* infrun.c (handle_inferior_event): Call bpstat_stop_status
+	with new argument.
+
 2004-05-12  Jim Blandy  <jimb@redhat.com>
 
 	* configure.in: When checking whether we should use the -bbigtoc
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 96cf0f9b36e..8d0b3c8116a 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -2559,7 +2559,8 @@ which its expression is valid.\n");
 }
 
 /* Get a bpstat associated with having just stopped at address
-   BP_ADDR.  */
+   BP_ADDR in thread PTID.  STOPPED_BY_WATCHPOINT is true if the
+   target thinks we stopped due to a hardware watchpoint.  */
 
 /* Determine whether we stopped at a breakpoint, etc, or whether we
    don't understand this stop.  Result is a chain of bpstat's such that:
@@ -2576,7 +2577,7 @@ which its expression is valid.\n");
    commands, FIXME??? fields.  */
 
 bpstat
-bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
+bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid, int stopped_by_watchpoint)
 {
   struct breakpoint *b, *temp;
   /* True if we've hit a breakpoint (as opposed to a watchpoint).  */
@@ -2600,7 +2601,7 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
 	&& !((b->type == bp_hardware_watchpoint
 	      || b->type == bp_read_watchpoint
 	      || b->type == bp_access_watchpoint)
-	     && target_stopped_data_address () != 0)
+	     && stopped_by_watchpoint)
 	&& b->type != bp_hardware_breakpoint
 	&& b->type != bp_catch_fork
 	&& b->type != bp_catch_vfork
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index 93b6850661e..67a67e34054 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -414,7 +414,8 @@ extern void bpstat_clear (bpstat *);
    is part of the bpstat is copied as well.  */
 extern bpstat bpstat_copy (bpstat);
 
-extern bpstat bpstat_stop_status (CORE_ADDR pc, ptid_t ptid);
+extern bpstat bpstat_stop_status (CORE_ADDR pc, ptid_t ptid, 
+				  int stopped_by_watchpoint);
 
 /* This bpstat_what stuff tells wait_for_inferior what to do with a
    breakpoint (a challenging task).  */
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 96f38a5cb18..bec87465bdf 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -1356,6 +1356,7 @@ handle_inferior_event (struct execution_control_state *ecs)
      defined in the file "config/pa/nm-hppah.h", accesses the variable
      indirectly.  Mutter something rude about the HP merge.  */
   int sw_single_step_trap_p = 0;
+  int stopped_by_watchpoint = 0;
 
   /* Cache the last pid/waitstatus. */
   target_last_wait_ptid = ecs->ptid;
@@ -1545,7 +1546,7 @@ handle_inferior_event (struct execution_control_state *ecs)
 
       stop_pc = read_pc ();
 
-      stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid);
+      stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid, 0);
 
       ecs->random_signal = !bpstat_explains_signal (stop_bpstat);
 
@@ -1594,7 +1595,7 @@ handle_inferior_event (struct execution_control_state *ecs)
       ecs->saved_inferior_ptid = inferior_ptid;
       inferior_ptid = ecs->ptid;
 
-      stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid);
+      stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid, 0);
 
       ecs->random_signal = !bpstat_explains_signal (stop_bpstat);
       inferior_ptid = ecs->saved_inferior_ptid;
@@ -1910,7 +1911,7 @@ handle_inferior_event (struct execution_control_state *ecs)
 
   /* It may be possible to simply continue after a watchpoint.  */
   if (HAVE_CONTINUABLE_WATCHPOINT)
-    STOPPED_BY_WATCHPOINT (ecs->ws);
+    stopped_by_watchpoint = STOPPED_BY_WATCHPOINT (ecs->ws);
 
   ecs->stop_func_start = 0;
   ecs->stop_func_end = 0;
@@ -1990,7 +1991,8 @@ handle_inferior_event (struct execution_control_state *ecs)
       else
 	{
 	  /* See if there is a breakpoint at the current PC.  */
-	  stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid);
+	  stop_bpstat = bpstat_stop_status (stop_pc, ecs->ptid, 
+					    stopped_by_watchpoint);
 
 	  /* Following in case break condition called a
 	     function.  */
-- 
GitLab