Eliminate some uses of __STDC__.
[deliverable/binutils-gdb.git] / gdb / stack.c
index 859627671e1ae74f4903353d74b17fbcf777e46c..ebeb4d6311ed9c9951426c8572e8699fa13499aa 100644 (file)
@@ -1,5 +1,6 @@
 /* Print and select stack frames for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991-1996, 1998-2000 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -448,6 +449,7 @@ print_frame (struct frame_info *fi,
 #ifdef UI_OUT
   struct ui_stream *stb;
   struct cleanup *old_chain;
+  struct cleanup *list_chain;
 
   stb = ui_out_stream_new (uiout);
   old_chain = make_cleanup_ui_out_stream_delete (stb);
@@ -532,6 +534,7 @@ print_frame (struct frame_info *fi,
 
 #ifdef UI_OUT
   ui_out_list_begin (uiout, "frame");
+  list_chain = make_cleanup_ui_out_list_end (uiout);
 #endif
 
   if (level >= 0)
@@ -623,24 +626,6 @@ print_frame (struct frame_info *fi,
       annotate_frame_source_end ();
     }
 
-#ifdef PC_LOAD_SEGMENT
-  /* If we couldn't print out function name but if can figure out what
-         load segment this pc value is from, at least print out some info
-         about its load segment. */
-  if (!funname)
-    {
-      annotate_frame_where ();
-#ifdef UI_OUT
-      ui_out_wrap_hint (uiout, "  ");
-      ui_out_text (uiout, " from ");
-      ui_out_field_string (uiout, "from", PC_LOAD_SEGMENT (fi->pc));
-#else
-      wrap_here ("  ");
-      printf_filtered (" from %s", PC_LOAD_SEGMENT (fi->pc));
-#endif
-    }
-#endif /* PC_LOAD_SEGMENT */
-
 #ifdef PC_SOLIB
   if (!funname || (!sal.symtab || !sal.symtab->filename))
     {
@@ -661,7 +646,8 @@ print_frame (struct frame_info *fi,
 #endif /* PC_SOLIB */
 
 #ifdef UI_OUT
-  ui_out_list_end (uiout);
+  /* do_cleanups will call ui_out_list_end() for us.  */
+  do_cleanups (list_chain);
   ui_out_text (uiout, "\n");
   do_cleanups (old_chain);
 #else
@@ -718,6 +704,7 @@ parse_frame_specification (char *frame_exp)
   int numargs = 0;
 #define        MAXARGS 4
   CORE_ADDR args[MAXARGS];
+  int level;
 
   if (frame_exp)
     {
@@ -737,8 +724,20 @@ parse_frame_specification (char *frame_exp)
          addr_string = savestring (frame_exp, p - frame_exp);
 
          {
-           tmp_cleanup = make_cleanup (free, addr_string);
-           args[numargs++] = parse_and_eval_address (addr_string);
+           value_ptr vp;
+
+           tmp_cleanup = make_cleanup (xfree, addr_string);
+
+           /* NOTE: we call parse_and_eval and then both
+              value_as_long and value_as_pointer rather than calling
+              parse_and_eval_long and parse_and_eval_address because
+              of the issue of potential side effects from evaluating
+              the expression.  */
+           vp = parse_and_eval (addr_string);
+           if (numargs == 0)
+             level = value_as_long (vp);
+
+           args[numargs++] = value_as_pointer (vp);
            do_cleanups (tmp_cleanup);
          }
 
@@ -758,7 +757,6 @@ parse_frame_specification (char *frame_exp)
       /* NOTREACHED */
     case 1:
       {
-       int level = args[0];
        struct frame_info *fid =
        find_relative_frame (get_current_frame (), &level);
        struct frame_info *tfid;
@@ -1003,7 +1001,7 @@ frame_info (char *addr_exp, int from_tty)
       print_address_numeric (fi->saved_regs[SP_REGNUM], 1, gdb_stdout);
       printf_filtered ("\n");
       count = 0;
-      numregs = ARCH_NUM_REGS;
+      numregs = NUM_REGS;
       for (i = 0; i < numregs; i++)
        if (fi->saved_regs[i] && i != SP_REGNUM)
          {
@@ -1216,7 +1214,7 @@ backtrace_command (char *arg, int from_tty)
   backtrace_command_1 (argPtr, (argIndicatingFullTrace >= 0), from_tty);
 
   if (argIndicatingFullTrace >= 0 && totArgLen > 0)
-    free (argPtr);
+    xfree (argPtr);
 
   if (old_chain)
     do_cleanups (old_chain);
@@ -1892,6 +1890,12 @@ return_command (char *retval_exp, int from_tty)
   if (retval_exp)
     set_return_value (return_value);
 
+  /* If we are at the end of a call dummy now, pop the dummy frame too.  */
+
+  if (CALL_DUMMY_HAS_COMPLETED (read_pc(), read_sp (),
+                               FRAME_FP (get_current_frame ())))
+    POP_FRAME;
+
   /* If interactive, print the frame that is now current.  */
 
   if (from_tty)
@@ -1953,7 +1957,7 @@ func_command (char *arg, int from_tty)
   while (!found && level == 0);
 
   if (func_bounds)
-    free (func_bounds);
+    xfree (func_bounds);
 
   if (!found)
     printf_filtered ("'%s' not within current stack frame.\n", arg);
This page took 0.026035 seconds and 4 git commands to generate.