* configure.ac: Use AC_CHECK_DECLS instead of gcc_AC_CHECK_DECLS
[deliverable/binutils-gdb.git] / gdb / stack.c
index f2f9cae4783dd469f9cd8e73c0bbe1c35ade93bd..2d8968c41bca239e2c5b15668483c2491c6af62d 100644 (file)
@@ -43,6 +43,7 @@
 #include "stack.h"
 #include "gdb_assert.h"
 #include "dictionary.h"
+#include "exceptions.h"
 #include "reggroups.h"
 #include "regcache.h"
 
@@ -100,6 +101,8 @@ static void print_frame (struct frame_info *fi,
                         int print_args, 
                         struct symtab_and_line sal);
 
+static void set_current_sal_from_frame (struct frame_info *, int);
+
 static void backtrace_command (char *, int);
 
 static void frame_info (char *, int);
@@ -128,9 +131,12 @@ struct print_stack_frame_args
 static int
 print_stack_frame_stub (void *args)
 {
-  struct print_stack_frame_args *p = (struct print_stack_frame_args *) args;
+  struct print_stack_frame_args *p = args;
+  int center = (p->print_what == SRC_LINE
+                || p->print_what == SRC_AND_LOC);
 
   print_frame_info (p->fi, p->print_level, p->print_what, p->print_args);
+  set_current_sal_from_frame (p->fi, center);
   return 0;
 }
 
@@ -344,11 +350,11 @@ print_frame_args (struct symbol *func, struct frame_info *fi, int num,
             2 for each recurse.  */
          val = read_var_value (sym, fi);
 
-         annotate_arg_value (val == NULL ? NULL : VALUE_TYPE (val));
+         annotate_arg_value (val == NULL ? NULL : value_type (val));
 
          if (val)
            {
-             val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
+             val_print (value_type (val), VALUE_CONTENTS (val), 0,
                         VALUE_ADDRESS (val),
                         stb->stream, 0, 0, 2, Val_no_prettyprint);
              ui_out_field_stream (uiout, "value", stb);
@@ -401,6 +407,24 @@ print_args_stub (void *args)
   return 0;
 }
 
+/* Set the current source and line to the location of the given
+   frame, if possible.  When CENTER is true, adjust so the
+   relevant line is in the center of the next 'list'. */
+
+static void
+set_current_sal_from_frame (struct frame_info *fi, int center)
+{
+  struct symtab_and_line sal;
+
+  find_frame_sal (fi, &sal);
+  if (sal.symtab)
+    {
+      if (center)
+        sal.line = max (sal.line - get_lines_to_list () / 2, 1);
+      set_current_source_symtab_and_line (&sal);
+    }
+}
+
 /* Print information about a frame for frame "fi" at level "level".
    Used in "where" output, also used to emit breakpoint or step
    messages.  
@@ -477,12 +501,8 @@ print_frame_info (struct frame_info *fi, int print_level,
 
   source_print = (print_what == SRC_LINE || print_what == SRC_AND_LOC);
 
-  if (sal.symtab)
-    set_current_source_symtab_and_line (&sal);
-
   if (source_print && sal.symtab)
     {
-      struct symtab_and_line cursal;
       int done = 0;
       int mid_statement = ((print_what == SRC_LINE)
                           && (get_frame_pc (fi) != sal.pc));
@@ -493,7 +513,9 @@ print_frame_info (struct frame_info *fi, int print_level,
       if (!done)
        {
          if (deprecated_print_frame_info_listing_hook)
-           deprecated_print_frame_info_listing_hook (sal.symtab, sal.line, sal.line + 1, 0);
+           deprecated_print_frame_info_listing_hook (sal.symtab, 
+                                                     sal.line, 
+                                                     sal.line + 1, 0);
          else
            {
              /* We used to do this earlier, but that is clearly
@@ -503,7 +525,7 @@ print_frame_info (struct frame_info *fi, int print_level,
                 when we stepi/nexti into the middle of a source
                 line. Only the command line really wants this
                 behavior. Other UIs probably would like the
-                ability to decide for themselves if it is desired. */
+                ability to decide for themselves if it is desired.  */
              if (addressprint && mid_statement)
                {
                  ui_out_field_core_addr (uiout, "addr", get_frame_pc (fi));
@@ -513,11 +535,6 @@ print_frame_info (struct frame_info *fi, int print_level,
              print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
            }
        }
-      /* Make sure we have at least a default source file */
-      set_default_source_symtab_and_line ();
-      cursal = get_current_source_symtab_and_line ();
-      cursal.line = max (sal.line - get_lines_to_list () / 2, 1);
-      set_current_source_symtab_and_line (&cursal);
     }
 
   if (print_what != LOCATION)
@@ -764,7 +781,7 @@ parse_frame_specification_1 (const char *frame_exp, const char *message,
 
   /* None of the remaining use the selected frame.  */
   if (selected_frame_p != NULL)
-    (*selected_frame_p) = 1;
+    (*selected_frame_p) = 0;
 
   /* Assume the single arg[0] is an integer, and try using that to
      select a frame relative to current.  */
@@ -1204,6 +1221,22 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
     printf_filtered ("(More stack frames follow...)\n");
 }
 
+struct backtrace_command_args
+  {
+    char *count_exp;
+    int show_locals;
+    int from_tty;
+  };
+
+/* Stub to call backtrace_command_1 by way of an error catcher.  */
+static int
+backtrace_command_stub (void *data)
+{
+  struct backtrace_command_args *args = (struct backtrace_command_args *)data;
+  backtrace_command_1 (args->count_exp, args->show_locals, args->from_tty);
+  return 0;
+}
+
 static void
 backtrace_command (char *arg, int from_tty)
 {
@@ -1211,6 +1244,7 @@ backtrace_command (char *arg, int from_tty)
   char **argv = (char **) NULL;
   int argIndicatingFullTrace = (-1), totArgLen = 0, argc = 0;
   char *argPtr = arg;
+  struct backtrace_command_args btargs;
 
   if (arg != (char *) NULL)
     {
@@ -1260,7 +1294,10 @@ backtrace_command (char *arg, int from_tty)
        }
     }
 
-  backtrace_command_1 (argPtr, (argIndicatingFullTrace >= 0), from_tty);
+  btargs.count_exp = argPtr;
+  btargs.show_locals = (argIndicatingFullTrace >= 0);
+  btargs.from_tty = from_tty;
+  catch_errors (backtrace_command_stub, (char *)&btargs, "", RETURN_MASK_ERROR);
 
   if (argIndicatingFullTrace >= 0 && totArgLen > 0)
     xfree (argPtr);
@@ -1273,7 +1310,11 @@ static void backtrace_full_command (char *arg, int from_tty);
 static void
 backtrace_full_command (char *arg, int from_tty)
 {
-  backtrace_command_1 (arg, 1, from_tty);
+  struct backtrace_command_args btargs;
+  btargs.count_exp = arg;
+  btargs.show_locals = 1;
+  btargs.from_tty = from_tty;
+  catch_errors (backtrace_command_stub, (char *)&btargs, "", RETURN_MASK_ERROR);
 }
 \f
 
@@ -1859,7 +1900,7 @@ If you continue, the return value that you specified will be ignored.\n";
   /* Store RETURN_VAUE in the just-returned register set.  */
   if (return_value != NULL)
     {
-      struct type *return_type = VALUE_TYPE (return_value);
+      struct type *return_type = value_type (return_value);
       gdb_assert (gdbarch_return_value (current_gdbarch, return_type,
                                        NULL, NULL, NULL)
                  == RETURN_VALUE_REGISTER_CONVENTION);
This page took 0.029905 seconds and 4 git commands to generate.