merge from gcc
[deliverable/binutils-gdb.git] / gdb / dummy-frame.c
index e6c9ca6199e430dc26ab4fb4d470488bc950a54e..3b10c51640b5f86ee0d73318c46f02904ee1987c 100644 (file)
@@ -29,6 +29,8 @@
 #include "inferior.h"
 #include "gdb_assert.h"
 #include "frame-unwind.h"
+#include "command.h"
+#include "gdbcmd.h"
 
 static void dummy_frame_this_id (struct frame_info *next_frame,
                                 void **this_prologue_cache,
@@ -97,7 +99,7 @@ find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
              FP against the saved SP and FP.  NOTE: If you're trying
              to fix a problem with GDB not correctly finding a dummy
              frame, check the comments that go with FRAME_ALIGN() and
-             SAVE_DUMMY_FRAME_TOS().  */
+             UNWIND_DUMMY_ID().  */
          if (fp != dummyframe->fp && fp != dummyframe->sp)
            continue;
        }
@@ -109,7 +111,7 @@ find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
 }
 
 struct regcache *
-generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
+deprecated_find_dummy_frame_regcache (CORE_ADDR pc, CORE_ADDR fp)
 {
   struct dummy_frame *dummy = find_dummy_frame (pc, fp);
   if (dummy != NULL)
@@ -121,7 +123,7 @@ generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
 char *
 deprecated_generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
 {
-  struct regcache *regcache = generic_find_dummy_frame (pc, fp);
+  struct regcache *regcache = deprecated_find_dummy_frame_regcache (pc, fp);
   if (regcache == NULL)
     return NULL;
   return deprecated_grub_regcache_for_registers (regcache);
@@ -174,14 +176,14 @@ pc_in_dummy_frame (CORE_ADDR pc)
 CORE_ADDR
 deprecated_read_register_dummy (CORE_ADDR pc, CORE_ADDR fp, int regno)
 {
-  struct regcache *dummy_regs = generic_find_dummy_frame (pc, fp);
+  struct regcache *dummy_regs = deprecated_find_dummy_frame_regcache (pc, fp);
 
   if (dummy_regs)
     {
       /* NOTE: cagney/2002-08-12: Replaced a call to
         regcache_raw_read_as_address() with a call to
         regcache_cooked_read_unsigned().  The old, ...as_address
-        function was eventually calling extract_unsigned_integer (via
+        function was eventually calling extract_unsigned_integer (nee
         extract_address) to unpack the registers value.  The below is
         doing an unsigned extract so that it is functionally
         equivalent.  The read needs to be cooked as, otherwise, it
@@ -358,10 +360,6 @@ dummy_frame_this_id (struct frame_info *next_frame,
      just asking for trouble.  */
   if (gdbarch_unwind_dummy_id_p (current_gdbarch))
     {
-      /* Assume call_function_by_hand(), via SAVE_DUMMY_FRAME_TOS,
-        previously saved the dummy frame's ID.  Things only work if
-        the two return the same value.  */
-      gdb_assert (SAVE_DUMMY_FRAME_TOS_P ());
       /* Use an architecture specific method to extract the prev's
         dummy ID from the next frame.  Note that this method uses
         frame_register_unwind to obtain the register values needed to
@@ -389,7 +387,7 @@ dummy_frame_this_id (struct frame_info *next_frame,
     }
   else
     {
-      /* Outch!  We're not trying to find the innermost frame's ID yet
+      /* Ouch!  We're not trying to find the innermost frame's ID yet
         we're trying to unwind to a dummy.  The architecture must
         provide the unwind_dummy_id() method.  Abandon the unwind
         process but only after first warning the user.  */
@@ -410,8 +408,9 @@ static struct frame_unwind dummy_frame_unwind =
 };
 
 const struct frame_unwind *
-dummy_frame_p (CORE_ADDR pc)
+dummy_frame_sniffer (struct frame_info *next_frame)
 {
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
   if (DEPRECATED_PC_IN_CALL_DUMMY_P ()
       ? DEPRECATED_PC_IN_CALL_DUMMY (pc, 0, 0)
       : pc_in_dummy_frame (pc))
@@ -419,3 +418,49 @@ dummy_frame_p (CORE_ADDR pc)
   else
     return NULL;
 }
+
+static void
+fprint_dummy_frames (struct ui_file *file)
+{
+  struct dummy_frame *s;
+  for (s = dummy_frame_stack; s != NULL; s = s->next)
+    {
+      gdb_print_host_address (s, file);
+      fprintf_unfiltered (file, ":");
+      fprintf_unfiltered (file, " pc=0x%s", paddr (s->pc));
+      fprintf_unfiltered (file, " fp=0x%s", paddr (s->fp));
+      fprintf_unfiltered (file, " sp=0x%s", paddr (s->sp));
+      fprintf_unfiltered (file, " top=0x%s", paddr (s->top));
+      fprintf_unfiltered (file, " id=");
+      fprint_frame_id (file, s->id);
+      fprintf_unfiltered (file, " call_lo=0x%s", paddr (s->call_lo));
+      fprintf_unfiltered (file, " call_hi=0x%s", paddr (s->call_hi));
+      fprintf_unfiltered (file, "\n");
+    }
+}
+
+static void
+maintenance_print_dummy_frames (char *args, int from_tty)
+{
+  if (args == NULL)
+    fprint_dummy_frames (gdb_stdout);
+  else
+    {
+      struct ui_file *file = gdb_fopen (args, "w");
+      if (file == NULL)
+       perror_with_name ("maintenance print dummy-frames");
+      fprint_dummy_frames (file);    
+      ui_file_delete (file);
+    }
+}
+
+extern void _initialize_dummy_frame (void);
+
+void
+_initialize_dummy_frame (void)
+{
+  add_cmd ("dummy-frames", class_maintenance, maintenance_print_dummy_frames,
+          "Print the contents of the internal dummy-frame stack.",
+          &maintenanceprintlist);
+
+}
This page took 0.026513 seconds and 4 git commands to generate.