]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2003-07-21 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Mon, 21 Jul 2003 14:28:28 +0000 (14:28 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 21 Jul 2003 14:28:28 +0000 (14:28 +0000)
* dwarf2-frame.h (dwarf2_frame_sniffer): Replace "dwarf2_frame_p".
* dwarf2-frame.c (dwarf2_frame_sniffer): Replace "dwarf2_frame_p".
(dwarf2_frame_cache): Use frame_unwind_address_in_block, instead
of frame_pc_unwind.
* i386-tdep.c (i386_gdbarch_init): Update.
* alpha-tdep.c (alpha_dwarf2_init_abi): Update.

gdb/ChangeLog
gdb/alpha-tdep.c
gdb/dwarf2-frame.c
gdb/dwarf2-frame.h
gdb/i386-tdep.c

index ed69c230dcd9c399b79ff5788ed305e40fd58206..286d6799948c7cf964168546ec2d11199ff89029 100644 (file)
@@ -1,3 +1,12 @@
+2003-07-21  Andrew Cagney  <cagney@redhat.com>
+
+       * dwarf2-frame.h (dwarf2_frame_sniffer): Replace "dwarf2_frame_p".
+       * dwarf2-frame.c (dwarf2_frame_sniffer): Replace "dwarf2_frame_p".
+       (dwarf2_frame_cache): Use frame_unwind_address_in_block, instead
+       of frame_pc_unwind.
+       * i386-tdep.c (i386_gdbarch_init): Update.
+       * alpha-tdep.c (alpha_dwarf2_init_abi): Update.
+
 2003-07-20  Stephane Carrez  <stcarrez@nerim.fr>
 
        * m68hc11-tdep.c (m68hc11_pseudo_register_read): Use 
index fb2ca1851b5cf518ab5d58077b9fc60b5524c786..e8b941ae5354b2d8b05630bc19723461c61d817b 100644 (file)
@@ -1583,7 +1583,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 void
 alpha_dwarf2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  frame_unwind_append_predicate (gdbarch, dwarf2_frame_p);
+  frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
   frame_base_append_predicate (gdbarch, dwarf2_frame_base_p);
   set_gdbarch_dwarf2_build_frame_info (gdbarch, dwarf2_build_frame_info);
 }
index e0b1a0530cb2540f458c89c71b4d6efb28610370..2dea90db65aa3ad4beceb9d31f6b84f83dd15496 100644 (file)
@@ -491,15 +491,12 @@ dwarf2_frame_cache (struct frame_info *next_frame, void **this_cache)
      done for "normal" frames and not for resume-type frames (signal
      handlers, sentinel frames, dummy frames).
 
-     We don't do what GCC's does here (yet).  It's not clear how
-     reliable the method is.  There's also a problem with finding the
-     right FDE; see the comment in dwarf_frame_p.  If dwarf_frame_p
-     selected this frame unwinder because it found the FDE for the
-     next function, using the adjusted return address might not yield
-     a FDE at all.  The problem isn't specific to DWARF CFI; other
-     unwinders loose in similar ways.  Therefore it's probably
-     acceptable to leave things slightly broken for now.  */
-  fs->pc = frame_pc_unwind (next_frame);
+     frame_unwind_address_in_block does just this.
+
+     It's not clear how reliable the method is though - there is the
+     potential for the register state pre-call being different to that
+     on return.  */
+  fs->pc = frame_unwind_address_in_block (next_frame);
 
   /* Find the correct FDE.  */
   fde = dwarf2_frame_find_fde (&fs->pc);
@@ -708,16 +705,13 @@ static const struct frame_unwind dwarf2_frame_unwind =
 };
 
 const struct frame_unwind *
-dwarf2_frame_p (CORE_ADDR pc)
+dwarf2_frame_sniffer (struct frame_info *next_frame)
 {
-  /* The way GDB works, this function can be called with PC just after
-     the last instruction of the function we're supposed to return the
-     unwind methods for.  In that case we won't find the correct FDE;
-     instead we find the FDE for the next function, or we won't find
-     an FDE at all.  There is a possible solution (see the comment in
-     dwarf2_frame_cache), GDB doesn't pass us enough information to
-     implement it.  */
-  if (dwarf2_frame_find_fde (&pc))
+  /* Grab an address that is guarenteed to reside somewhere within the
+     function.  frame_pc_unwind(), for a no-return next function, can
+     end up returning something past the end of this function's body.  */
+  CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
+  if (dwarf2_frame_find_fde (&block_addr))
     return &dwarf2_frame_unwind;
 
   return NULL;
index 4b4c1a5ab2f4ca4cc9700b4b18f9cc2320de25ba..1d47422b45cc89cfcfd3ab7e4faab43e4cd4d1f6 100644 (file)
@@ -29,7 +29,7 @@ struct objfile;
 /* Return the frame unwind methods for the function that contains PC,
    or NULL if it can't be handled by DWARF CFI frame unwinder.  */
 
-const struct frame_unwind *dwarf2_frame_p (CORE_ADDR pc);
+const struct frame_unwind *dwarf2_frame_sniffer (struct frame_info *next_frame);
 
 /* Return the frame base methods for the function that contains PC, or
    NULL if it can't be handled by the DWARF CFI frame unwinder.  */
index 3b981806dc2677d6e56e17d8a0d3750abc05c6bf..1a3d072f740e850200a8eceac208d244012eef83 100644 (file)
@@ -1811,7 +1811,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_fetch_pointer_argument (gdbarch, i386_fetch_pointer_argument);
 
   /* Hook in the DWARF CFI frame unwinder.  */
-  frame_unwind_append_predicate (gdbarch, dwarf2_frame_p);
+  frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
   set_gdbarch_dwarf2_build_frame_info (gdbarch, dwarf2_build_frame_info);
 
   frame_base_set_default (gdbarch, &i386_frame_base);