]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: use get_current_frame consistently in print_stop_location
authorAndrew Burgess <aburgess@redhat.com>
Tue, 14 Apr 2026 20:36:09 +0000 (22:36 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 14 Apr 2026 20:36:09 +0000 (22:36 +0200)
In print_stop_location, in the PRINT_UNKNOWN case we currently use a
strange mix of get_current_frame and get_selected_frame.  This works
fine because at the point print_stop_location is called the selected
frame will always be the current frame, but calling these two
different functions is confusing, at least for me.

Since bpstat_print selects the frame to print (which usually is the current
frame, but not always), the correct frame to use is the selected frame after
the bpstat_print call.

Assign the selected frame to a variable print_frame, and use it throughout the
function.

There should be no user visible changes after this commit.

Co-Authored-By: Tom de Vries <tdevries@suse.de>
Approved-By: Andrew Burgess <aburgess@redhat.com>
gdb/infrun.c

index dea2a2cbd48cbcc9df80913996befd2062418b4d..19836c4d89e7d1bbe4453cacc3d5d02dbb3739f3 100644 (file)
@@ -9349,7 +9349,12 @@ print_stop_location (const target_waitstatus &ws)
   struct thread_info *tp = inferior_thread ();
 
   bpstat_ret = bpstat_print (tp->control.stop_bpstat, ws.kind ());
-  switch (bpstat_ret)
+  /* Function bpstat_print selects the frame to print.  Typically, that is the
+     stop frame, in other words get_current_frame ().  But bpstat_print may
+     select a different frame, see for instance ada_catchpoint::print_it.  */
+  frame_info_ptr print_frame = get_selected_frame (nullptr);
+
+ switch (bpstat_ret)
     {
     case PRINT_UNKNOWN:
       /* FIXME: cagney/2002-12-01: Given that a frame ID does (or
@@ -9357,10 +9362,10 @@ print_stop_location (const target_waitstatus &ws)
         that when doing a frame comparison.  */
       if (tp->control.stop_step
          && (tp->control.step_frame_id
-             == get_frame_id (get_current_frame ()))
-         && tp->control.in_step_start_function (get_current_frame ()))
+             == get_frame_id (print_frame))
+         && tp->control.in_step_start_function (print_frame))
        {
-         symtab_and_line sal = find_frame_sal (get_selected_frame (nullptr));
+         symtab_and_line sal = find_frame_sal (print_frame);
          if (sal.symtab != tp->current_symtab)
            {
              /* Finished step in same frame but into different file, print
@@ -9403,7 +9408,7 @@ print_stop_location (const target_waitstatus &ws)
      LOCATION: Print only location
      SRC_AND_LOC: Print location and source line.  */
   if (do_frame_printing)
-    print_stack_frame (get_selected_frame (nullptr), 0, source_flag, 1);
+    print_stack_frame (print_frame, 0, source_flag, 1);
 }
 
 /* See `print_stop_event` in infrun.h.  */