OSDN Git Service

* breakpoint.c (update_watchpoint): Do not attempt to recreate
authoruweigand <uweigand>
Mon, 21 Feb 2011 23:59:31 +0000 (23:59 +0000)
committeruweigand <uweigand>
Mon, 21 Feb 2011 23:59:31 +0000 (23:59 +0000)
per-frame locations while within a function epilogue.

gdb/ChangeLog
gdb/breakpoint.c

index 94eaa93..3e67deb 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-21  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * breakpoint.c (update_watchpoint): Do not attempt to recreate
+       per-frame locations while within a function epilogue.
+
 2011-02-21  Pierre Muller  <muller@ics.u-strasbg.fr>
 
        * ser-mingw.c (ser_windows_close): Reformat comment to better conform
index c9e149b..27fbcc6 100644 (file)
@@ -1369,11 +1369,6 @@ update_watchpoint (struct breakpoint *b, int reparse)
   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;
  
@@ -1384,7 +1379,15 @@ update_watchpoint (struct breakpoint *b, int reparse)
     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.  */
@@ -1400,6 +1403,11 @@ update_watchpoint (struct breakpoint *b, int reparse)
        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;