2007-06-13 Claudio Fontana <claudio.fontana@gmail.com>
[deliverable/binutils-gdb.git] / gdb / stack.c
index 6eb96dc17c22ecc1a9bb34735420afeb0eeb88fd..2bc5036e0fb8d93798b8e2e039f7a915ebec6766 100644 (file)
@@ -1,7 +1,7 @@
 /* Print and select stack frames for GDB, the GNU debugger.
 
-   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -106,6 +106,8 @@ print_stack_frame (struct frame_info *frame, int print_level,
   args.frame = frame;
   args.print_level = print_level;
   args.print_what = print_what;
+  /* For mi, alway print location and address.  */
+  args.print_what = ui_out_is_mi_like_p (uiout) ? LOC_AND_ADDRESS : print_what;
   args.print_args = 1;
 
   catch_errors (print_stack_frame_stub, &args, "", RETURN_MASK_ALL);
@@ -337,7 +339,7 @@ print_frame_args (struct symbol *func, struct frame_info *frame,
       long start;
 
       if (highest_offset == -1)
-       start = FRAME_ARGS_SKIP;
+       start = gdbarch_frame_args_skip (current_gdbarch);
       else
        start = highest_offset;
 
@@ -356,9 +358,9 @@ print_args_stub (void *args)
   struct print_args_args *p = args;
   int numargs;
 
-  if (FRAME_NUM_ARGS_P ())
+  if (gdbarch_frame_num_args_p (current_gdbarch))
     {
-      numargs = FRAME_NUM_ARGS (p->frame);
+      numargs = gdbarch_frame_num_args (current_gdbarch, p->frame);
       gdb_assert (numargs >= 0);
     }
   else
@@ -842,7 +844,7 @@ frame_info (char *addr_exp, int from_tty)
     /* OK, this is weird.  The PC_REGNUM hardware register's value can
        easily not match that of the internal value returned by
        get_frame_pc().  */
-    pc_regname = REGISTER_NAME (PC_REGNUM);
+    pc_regname = gdbarch_register_name (current_gdbarch, PC_REGNUM);
   else
     /* But then, this is weird to.  Even without PC_REGNUM, an
        architectures will often have a hardware register called "pc",
@@ -923,6 +925,16 @@ frame_info (char *addr_exp, int from_tty)
   deprecated_print_address_numeric (frame_pc_unwind (fi), 1, gdb_stdout);
   printf_filtered ("\n");
 
+  if (calling_frame_info == NULL)
+    {
+      enum unwind_stop_reason reason;
+
+      reason = get_frame_unwind_stop_reason (fi);
+      if (reason != UNWIND_NO_REASON)
+       printf_filtered (_(" Outermost frame: %s\n"),
+                        frame_stop_reason_string (reason));
+    }
+
   if (calling_frame_info)
     {
       printf_filtered (" called by frame at ");
@@ -940,6 +952,7 @@ frame_info (char *addr_exp, int from_tty)
     }
   if (get_next_frame (fi) || calling_frame_info)
     puts_filtered ("\n");
+
   if (s)
     printf_filtered (" source language %s.\n",
                     language_str (s->language));
@@ -958,14 +971,14 @@ frame_info (char *addr_exp, int from_tty)
        deprecated_print_address_numeric (arg_list, 1, gdb_stdout);
        printf_filtered (",");
 
-       if (!FRAME_NUM_ARGS_P ())
+       if (!gdbarch_frame_num_args_p (current_gdbarch))
          {
            numargs = -1;
            puts_filtered (" args: ");
          }
        else
          {
-           numargs = FRAME_NUM_ARGS (fi);
+           numargs = gdbarch_frame_num_args (current_gdbarch, fi);
            gdb_assert (numargs >= 0);
            if (numargs == 0)
              puts_filtered (" no args.");
@@ -1039,14 +1052,15 @@ frame_info (char *addr_exp, int from_tty)
        else if (!optimized && lval == lval_register)
          {
            printf_filtered (" Previous frame's sp in %s\n",
-                            REGISTER_NAME (realnum));
+                            gdbarch_register_name (current_gdbarch, realnum));
            need_nl = 0;
          }
        /* else keep quiet.  */
       }
 
     count = 0;
-    numregs = NUM_REGS + NUM_PSEUDO_REGS;
+    numregs = gdbarch_num_regs (current_gdbarch)
+             + gdbarch_num_pseudo_regs (current_gdbarch);
     for (i = 0; i < numregs; i++)
       if (i != SP_REGNUM
          && gdbarch_register_reggroup_p (current_gdbarch, i, all_reggroup))
@@ -1064,7 +1078,8 @@ frame_info (char *addr_exp, int from_tty)
              else
                puts_filtered (",");
              wrap_here (" ");
-             printf_filtered (" %s at ", REGISTER_NAME (i));
+             printf_filtered (" %s at ",
+                              gdbarch_register_name (current_gdbarch, i));
              deprecated_print_address_numeric (addr, 1, gdb_stdout);
              count++;
            }
@@ -1163,11 +1178,26 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
       print_frame_info (fi, 1, LOCATION, 1);
       if (show_locals)
        print_frame_local_vars (fi, 1, gdb_stdout);
+
+      /* Save the last frame to check for error conditions.  */
+      trailing = fi;
     }
 
   /* If we've stopped before the end, mention that.  */
   if (fi && from_tty)
     printf_filtered (_("(More stack frames follow...)\n"));
+
+  /* If we've run out of frames, and the reason appears to be an error
+     condition, print it.  */
+  if (fi == NULL && trailing != NULL)
+    {
+      enum unwind_stop_reason reason;
+
+      reason = get_frame_unwind_stop_reason (trailing);
+      if (reason > UNWIND_FIRST_ERROR)
+       printf_filtered (_("Backtrace stopped: %s\n"),
+                        frame_stop_reason_string (reason));
+    }
 }
 
 struct backtrace_command_args
@@ -1566,24 +1596,7 @@ get_selected_block (CORE_ADDR *addr_in_block)
   if (!target_has_stack)
     return 0;
 
-  /* NOTE: cagney/2002-11-28: Why go to all this effort to not create
-     a selected/current frame?  Perhaps this function is called,
-     indirectly, by WFI in "infrun.c" where avoiding the creation of
-     an inner most frame is very important (it slows down single
-     step).  I suspect, though that this was true in the deep dark
-     past but is no longer the case.  A mindless look at all the
-     callers tends to support this theory.  I think we should be able
-     to assume that there is always a selcted frame.  */
-  /* gdb_assert (deprecated_selected_frame != NULL); So, do you feel
-     lucky? */
-  if (!deprecated_selected_frame)
-    {
-      CORE_ADDR pc = read_pc ();
-      if (addr_in_block != NULL)
-       *addr_in_block = pc;
-      return block_for_pc (pc);
-    }
-  return get_frame_block (deprecated_selected_frame, addr_in_block);
+  return get_frame_block (get_selected_frame (NULL), addr_in_block);
 }
 
 /* Find a frame a certain number of levels away from FRAME.
@@ -1907,7 +1920,7 @@ func_command (char *arg, int from_tty)
 
   if (!found)
     printf_filtered (_("'%s' not within current stack frame.\n"), arg);
-  else if (frame != deprecated_selected_frame)
+  else if (frame != get_selected_frame (NULL))
     select_and_print_frame (frame);
 }
 
@@ -1916,7 +1929,7 @@ func_command (char *arg, int from_tty)
 enum language
 get_frame_language (void)
 {
-  struct frame_info *frame = deprecated_selected_frame;
+  struct frame_info *frame = deprecated_safe_get_selected_frame ();
 
   if (frame)
     {
This page took 0.025773 seconds and 4 git commands to generate.