diff mbox

[rfc] Work around function epilogues in update_watchpoint

Message ID 201103041641.p24GfBAD009375@d06av02.portsmouth.uk.ibm.com
State Accepted
Headers show

Commit Message

Ulrich Weigand March 4, 2011, 4:41 p.m. UTC
http://sourceware.org/ml/gdb-patches/2011-02/msg00424.html


ChangeLog:

	* breakpoint.c (update_watchpoint): Do not attempt to recreate
	per-frame locations while within a function epilogue.
diff mbox

Patch

Index: gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.536
diff -u -p -r1.536 breakpoint.c
--- gdb/breakpoint.c	15 Feb 2011 21:43:25 -0000	1.536
+++ gdb/breakpoint.c	17 Feb 2011 16:07:53 -0000
@@ -1374,11 +1374,6 @@  update_watchpoint (struct breakpoint *b,
   if (!watchpoint_in_thread_scope (b))
     return;
 
-  /* We don't free locations.  They are stored in the bp_location array
-     and update_global_location_list will eventually delete them and
-     remove breakpoints if needed.  */
-  b->loc = NULL;
-
   if (b->disposition == disp_del_at_next_stop)
     return;
  
@@ -1389,7 +1384,15 @@  update_watchpoint (struct breakpoint *b,
     within_current_scope = 1;
   else
     {
-      struct frame_info *fi;
+      struct frame_info *fi = get_current_frame ();
+      struct gdbarch *frame_arch = get_frame_arch (fi);
+      CORE_ADDR frame_pc = get_frame_pc (fi);
+
+      /* If we're in a function epilogue, unwinding may not work
+	 properly, so do not attempt to recreate locations at this
+	 point.  See similar comments in watchpoint_check.  */
+      if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
+	return;
 
       /* Save the current frame's ID so we can restore it after
          evaluating the watchpoint expression on its own frame.  */
@@ -1405,6 +1408,11 @@  update_watchpoint (struct breakpoint *b,
 	select_frame (fi);
     }
 
+  /* We don't free locations.  They are stored in the bp_location array
+     and update_global_location_list will eventually delete them and
+     remove breakpoints if needed.  */
+  b->loc = NULL;
+
   if (within_current_scope && reparse)
     {
       char *s;