This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix another stale frame_info *


Hi,

ISTM one cannot safely initialize FRAME_CALLER_PC unconditionally.

No regressions on {x86_64,x86_64-m32,i686}-fedora17-linux-gnu.

I will check it in.


Thanks,
Jan


gdb/
2012-02-23  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* breakpoint.c (until_break_command): New variables frame_caller_id,
	frame_caller_pc and frame_caller_arch.  Use them after
	set_momentary_breakpoint.

--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -9853,12 +9853,19 @@ until_break_command (char *arg, int from_tty, int anywhere)
   struct symtabs_and_lines sals;
   struct symtab_and_line sal;
   struct frame_info *frame = get_selected_frame (NULL);
+  struct frame_id frame_caller_id = frame_unwind_caller_id (frame);
+  /* Initialize it just to avoid a GCC false warning.  */
+  CORE_ADDR frame_caller_pc = 0;
+  struct gdbarch *frame_caller_arch = frame_unwind_caller_arch (frame);
   struct breakpoint *breakpoint;
   struct breakpoint *breakpoint2 = NULL;
   struct cleanup *old_chain;
   int thread;
   struct thread_info *tp;
 
+  if (frame_id_p (frame_caller_id))
+    frame_caller_pc = frame_unwind_caller_pc (frame);
+
   clear_proceed_status ();
 
   /* Set a breakpoint where the user wants it and at return from
@@ -9903,17 +9912,15 @@ until_break_command (char *arg, int from_tty, int anywhere)
   /* Keep within the current frame, or in frames called by the current
      one.  */
 
-  if (frame_id_p (frame_unwind_caller_id (frame)))
+  if (frame_id_p (frame_caller_id))
     {
-      sal = find_pc_line (frame_unwind_caller_pc (frame), 0);
-      sal.pc = frame_unwind_caller_pc (frame);
-      breakpoint2 = set_momentary_breakpoint (frame_unwind_caller_arch (frame),
-					      sal,
-					      frame_unwind_caller_id (frame),
-					      bp_until);
+      sal = find_pc_line (frame_caller_pc, 0);
+      sal.pc = frame_caller_pc;
+      breakpoint2 = set_momentary_breakpoint (frame_caller_arch, sal,
+					      frame_caller_id, bp_until);
       make_cleanup_delete_breakpoint (breakpoint2);
 
-      set_longjmp_breakpoint (tp, frame_unwind_caller_id (frame));
+      set_longjmp_breakpoint (tp, frame_caller_id);
       make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
     }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]