* frame.c (frame_unwind_id): Renamed to ...
authorDaniel Jacobowitz <drow@false.org>
Tue, 15 Jul 2008 18:58:32 +0000 (18:58 +0000)
committerDaniel Jacobowitz <drow@false.org>
Tue, 15 Jul 2008 18:58:32 +0000 (18:58 +0000)
(frame_unwind_caller_id): ... this.  All callers updated.
(frame_pc_unwind): Renamed to ...
(frame_unwind_caller_pc): ... this.  All callers updated.
* frame.h: Document frame_unwind_caller_WHAT functions.
(frame_unwind_id): Renamed to ...
(frame_unwind_caller_id): ... this.
(frame_pc_unwind): Renamed to ...
(frame_unwind_caller_pc): ... this.
* hppa-tdep.c (hppa_find_unwind_entry_in_block): Correct comment.
* stack.c (parse_frame_specification_1): Do not rely on
frame_unwind_id.

gdb/ChangeLog
gdb/frame.c
gdb/frame.h
gdb/glibc-tdep.c
gdb/hppa-tdep.c
gdb/infrun.c
gdb/mips-linux-tdep.c
gdb/obsd-tdep.c
gdb/sol2-tdep.c
gdb/stack.c

index 21ae33586ee9d0259fd2504822348ba486df8bc9..5c43fb6ca2663547c379dd6ea405c8aec71f6eb2 100644 (file)
@@ -1,3 +1,18 @@
+2008-07-15  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * frame.c (frame_unwind_id): Renamed to ...
+       (frame_unwind_caller_id): ... this.  All callers updated.
+       (frame_pc_unwind): Renamed to ...
+       (frame_unwind_caller_pc): ... this.  All callers updated.
+       * frame.h: Document frame_unwind_caller_WHAT functions.
+       (frame_unwind_id): Renamed to ...
+       (frame_unwind_caller_id): ... this.
+       (frame_pc_unwind): Renamed to ...
+       (frame_unwind_caller_pc): ... this.
+       * hppa-tdep.c (hppa_find_unwind_entry_in_block): Correct comment.
+       * stack.c (parse_frame_specification_1): Do not rely on
+       frame_unwind_id.
+
 2008-07-15  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * mn10300-tdep.c (set_reg_offsets): Use get_frame_register_unsigned.
index f5e0fad427bb0181d4ef7b33083156a62029cd5c..5900e22d184d5b3da26bfcf148608e90e7466c29 100644 (file)
@@ -271,7 +271,7 @@ get_frame_id (struct frame_info *fi)
 }
 
 struct frame_id
-frame_unwind_id (struct frame_info *next_frame)
+frame_unwind_caller_id (struct frame_info *next_frame)
 {
   /* Use prev_frame, and not get_prev_frame.  The latter will truncate
      the frame chain, leading to this function unintentionally
@@ -422,7 +422,7 @@ frame_find_by_id (struct frame_id id)
 }
 
 CORE_ADDR
-frame_pc_unwind (struct frame_info *this_frame)
+frame_unwind_caller_pc (struct frame_info *this_frame)
 {
   if (!this_frame->prev_pc.p)
     {
@@ -453,7 +453,7 @@ frame_pc_unwind (struct frame_info *this_frame)
       this_frame->prev_pc.p = 1;
       if (frame_debug)
        fprintf_unfiltered (gdb_stdlog,
-                           "{ frame_pc_unwind (this_frame=%d) -> 0x%s }\n",
+                           "{ frame_unwind_caller_pc (this_frame=%d) -> 0x%s }\n",
                            this_frame->level,
                            paddr_nz (this_frame->prev_pc.value));
     }
@@ -1533,7 +1533,7 @@ CORE_ADDR
 get_frame_pc (struct frame_info *frame)
 {
   gdb_assert (frame->next != NULL);
-  return frame_pc_unwind (frame->next);
+  return frame_unwind_caller_pc (frame->next);
 }
 
 /* Return an address that falls within THIS_FRAME's code block.  */
index 3e8f023109e0c8d3d8ea8de7d367d0b03c66563f..b7ccd300e39b902ed7c5ad19686bf16afcc6a40b 100644 (file)
    frame_unwind_WHAT...(): Unwind THIS frame's WHAT from the NEXT
    frame.
 
+   frame_unwind_caller_WHAT...(): Unwind WHAT for NEXT stack frame's
+   real caller.  Any inlined functions in NEXT's stack frame are
+   skipped.  Use these to ignore any potentially inlined functions,
+   e.g. inlined into the first instruction of a library trampoline.
+
    put_frame_WHAT...(): Put a value into this frame (unsafe, need to
    invalidate the frame / regcache afterwards) (better name more
    strongly hinting at its unsafeness)
@@ -361,7 +366,7 @@ extern CORE_ADDR get_frame_base (struct frame_info *);
 
    instead, since that avoids the bug.  */
 extern struct frame_id get_frame_id (struct frame_info *fi);
-extern struct frame_id frame_unwind_id (struct frame_info *next_frame);
+extern struct frame_id frame_unwind_caller_id (struct frame_info *next_frame);
 
 /* Assuming that a frame is `normal', return its base-address, or 0 if
    the information isn't available.  NOTE: This address is really only
@@ -515,7 +520,7 @@ extern const char *frame_map_regnum_to_name (struct frame_info *frame,
    calling frame.  For GDB, `pc' is the resume address and not a
    specific register.  */
 
-extern CORE_ADDR frame_pc_unwind (struct frame_info *frame);
+extern CORE_ADDR frame_unwind_caller_pc (struct frame_info *frame);
 
 /* Discard the specified frame.  Restoring the registers to the state
    of the caller.  */
index 0ae303b78be66f7771d82cb8a7740f323b8825d0..86046a091f3706bef203d1f75a5ae68cbf51ac73 100644 (file)
@@ -97,7 +97,7 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
         fixup = lookup_minimal_symbol ("fixup", NULL, objfile);
 
       if (fixup && SYMBOL_VALUE_ADDRESS (fixup) == pc)
-       return frame_pc_unwind (get_current_frame ());
+       return frame_unwind_caller_pc (get_current_frame ());
     }
 
   return 0;
index ace04a3d93dc9f177f6694b74d60526eb0b5b3fa..17a0909b90f8fa301d8d4f765788a0c5dbd6d4f7 100644 (file)
@@ -1794,7 +1794,7 @@ hppa_find_unwind_entry_in_block (struct frame_info *this_frame)
   /* FIXME drow/20070101: Calling gdbarch_addr_bits_remove on the
      result of get_frame_address_in_block implies a problem.
      The bits should have been removed earlier, before the return
-     value of frame_pc_unwind.  That might be happening already;
+     value of gdbarch_unwind_pc.  That might be happening already;
      if it isn't, it should be fixed.  Then this call can be
      removed.  */
   pc = gdbarch_addr_bits_remove (get_frame_arch (this_frame), pc);
index 2f32a82b5ba68332958e06d8330172fa7f187fb3..f7ce888c3972406ab77c5624caf2186bfa0eb757 100644 (file)
@@ -3067,7 +3067,8 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
      being equal, so to get into this block, both the current and
      previous frame must have valid frame IDs.  */
   if (!frame_id_eq (get_frame_id (get_current_frame ()), step_frame_id)
-      && frame_id_eq (frame_unwind_id (get_current_frame ()), step_frame_id))
+      && frame_id_eq (frame_unwind_caller_id (get_current_frame ()),
+                     step_frame_id))
     {
       CORE_ADDR real_stop_pc;
 
@@ -3220,7 +3221,7 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
          set step-mode) or we no longer know how to get back
          to the call site.  */
       if (step_stop_if_no_debug
-         || !frame_id_p (frame_unwind_id (get_current_frame ())))
+         || !frame_id_p (frame_unwind_caller_id (get_current_frame ())))
        {
          /* If we have no line number and the step-stop-if-no-debug
             is set, we stop the step so that the user has a chance to
@@ -3469,7 +3470,7 @@ insert_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
    This is a separate function rather than reusing
    insert_step_resume_breakpoint_at_frame in order to avoid
    get_prev_frame, which may stop prematurely (see the implementation
-   of frame_unwind_id for an example).  */
+   of frame_unwind_caller_id for an example).  */
 
 static void
 insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
@@ -3478,15 +3479,16 @@ insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
 
   /* We shouldn't have gotten here if we don't know where the call site
      is.  */
-  gdb_assert (frame_id_p (frame_unwind_id (next_frame)));
+  gdb_assert (frame_id_p (frame_unwind_caller_id (next_frame)));
 
   init_sal (&sr_sal);          /* initialize to zeros */
 
   sr_sal.pc = gdbarch_addr_bits_remove
-               (current_gdbarch, frame_pc_unwind (next_frame));
+               (current_gdbarch, frame_unwind_caller_pc (next_frame));
   sr_sal.section = find_pc_overlay (sr_sal.pc);
 
-  insert_step_resume_breakpoint_at_sal (sr_sal, frame_unwind_id (next_frame));
+  insert_step_resume_breakpoint_at_sal (sr_sal,
+                                       frame_unwind_caller_id (next_frame));
 }
 
 /* Insert a "longjmp-resume" breakpoint at PC.  This is used to set a
index d631a7b3c32d000234567da53a66086e2b823eed..af643ac58dcbf19e6d78acd4079cb2dfdc44b1c1 100644 (file)
@@ -701,7 +701,7 @@ mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
 
   if (resolver && SYMBOL_VALUE_ADDRESS (resolver) == pc)
-    return frame_pc_unwind (get_current_frame ());
+    return frame_unwind_caller_pc (get_current_frame ());
 
   return 0;
 }
index cb941fbc8aaea976f7a0f3c29761d7c01a8f1271..7667bac48a2b6332813bc6746619a3f9b8473a39 100644 (file)
@@ -30,7 +30,7 @@ obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   msym = lookup_minimal_symbol("_dl_bind", NULL, NULL);
   if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
-    return frame_pc_unwind (get_current_frame ());
+    return frame_unwind_caller_pc (get_current_frame ());
   else
     return find_solib_trampoline_target (get_current_frame (), pc);
 }
index 9e9358950f34b7c5d5af9717d343763c487c6f52..f5d3bc8675eb27af8321d55d0461fcee8e762677 100644 (file)
@@ -30,7 +30,7 @@ sol2_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   msym = lookup_minimal_symbol("elf_bndr", NULL, NULL);
   if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
-    return frame_pc_unwind (get_current_frame ());
+    return frame_unwind_caller_pc (get_current_frame ());
 
   return 0;
 }
index 18c4298ed7f73d3c7fe8e0aa0dcdf02f0fa44ea6..7465fbfa39d051194dd8050eeab908b0fddae226 100644 (file)
@@ -855,8 +855,16 @@ parse_frame_specification_1 (const char *frame_exp, const char *message,
        {
          if (frame_id_eq (id, get_frame_id (fid)))
            {
-             while (frame_id_eq (id, frame_unwind_id (fid)))
-               fid = get_prev_frame (fid);
+             struct frame_info *prev_frame;
+
+             while (1)
+               {
+                 prev_frame = get_prev_frame (fid);
+                 if (!prev_frame
+                     || !frame_id_eq (id, get_frame_id (prev_frame)))
+                   break;
+                 fid = prev_frame;
+               }
              return fid;
            }
        }
@@ -985,7 +993,7 @@ frame_info (char *addr_exp, int from_tty)
   puts_filtered ("; ");
   wrap_here ("    ");
   printf_filtered ("saved %s ", pc_regname);
-  fputs_filtered (paddress (frame_pc_unwind (fi)), gdb_stdout);
+  fputs_filtered (paddress (frame_unwind_caller_pc (fi)), gdb_stdout);
   printf_filtered ("\n");
 
   if (calling_frame_info == NULL)