* Rename remote-es1800.c to remote-es.c
[deliverable/binutils-gdb.git] / gdb / stack.c
index 7857347adff1f5259c903fac1de803893b3df673..4849e5d047a5969904013ef839fc7afd2f07cb00 100644 (file)
@@ -1,5 +1,5 @@
 /* Print and select stack frames for GDB, the GNU debugger.
-   Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -29,6 +29,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "target.h"
 #include "breakpoint.h"
 #include "demangle.h"
+#include "inferior.h"
 
 static void
 return_command PARAMS ((char *, int));
@@ -139,36 +140,27 @@ print_frame_info (fi, level, source, args)
   struct symtab_and_line sal;
   struct symbol *func;
   register char *funname = 0;
+  enum language funlang = language_unknown;
   int numargs;
 
-#if 0  /* Symbol reading is fast enough now */
-  struct partial_symtab *pst;
-
-  /* Don't give very much information if we haven't readin the
-     symbol table yet.  */
-  pst = find_pc_psymtab (fi->pc);
-  if (pst && !pst->readin)
+  if (PC_IN_CALL_DUMMY (fi->pc, read_register (SP_REGNUM), fi->frame))
     {
-      /* Abbreviated information.  */
-      char *fname;
-
-      if (!find_pc_partial_function (fi->pc, &fname, 0))
-       fname = "??";
-       
-      printf_filtered ("#%-2d ", level);
-      if (addressprint)
-        printf_filtered ("%s in ", local_hex_string(fi->pc));
-
-      fputs_demangled (fname, stdout, 0);
-      fputs_filtered (" (...)\n", stdout);
-      
+      /* Do this regardless of SOURCE because we don't have any source
+        to list for this frame.  */
+      if (level >= 0)
+       printf_filtered ("#%-2d ", level);
+      printf_filtered ("<function called from gdb>\n");
+      return;
+    }
+  if (fi->signal_handler_caller)
+    {
+      /* Do this regardless of SOURCE because we don't have any source
+        to list for this frame.  */
+      if (level >= 0)
+       printf_filtered ("#%-2d ", level);
+      printf_filtered ("<signal handler called>\n");
       return;
     }
-#endif
-
-#ifdef CORE_NEEDS_RELOCATION
-  CORE_NEEDS_RELOCATION(fi->pc);
-#endif
 
   sal = find_pc_line (fi->pc, fi->next_frame);
   func = find_pc_function (fi->pc);
@@ -190,7 +182,7 @@ print_frame_info (fi, level, source, args)
 
       struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
       if (msymbol != NULL
-         && (msymbol -> address
+         && (SYMBOL_VALUE_ADDRESS (msymbol) 
              > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
        {
          /* In this case we have no way of knowing the source file
@@ -199,16 +191,23 @@ print_frame_info (fi, level, source, args)
          /* We also don't know anything about the function besides
             its address and name.  */
          func = 0;
-         funname = msymbol -> name;
+         funname = SYMBOL_NAME (msymbol);
+         funlang = SYMBOL_LANGUAGE (msymbol);
        }
       else
-       funname = SYMBOL_NAME (func);
+       {
+         funname = SYMBOL_NAME (func);
+         funlang = SYMBOL_LANGUAGE (func);
+       }
     }
   else
     {
       register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
       if (msymbol != NULL)
-       funname = msymbol -> name;
+       {
+         funname = SYMBOL_NAME (msymbol);
+         funlang = SYMBOL_LANGUAGE (msymbol);
+       }
     }
 
   if (source >= 0 || !sal.symtab)
@@ -218,7 +217,8 @@ print_frame_info (fi, level, source, args)
       if (addressprint)
        if (fi->pc != sal.pc || !sal.symtab)
          printf_filtered ("%s in ", local_hex_string(fi->pc));
-      fputs_demangled (funname ? funname : "??", stdout, 0);
+      fprintf_symbol_filtered (stdout, funname ? funname : "??", funlang,
+                              DMGL_NO_OPTS);
       wrap_here ("   ");
       fputs_filtered (" (", stdout);
       if (args)
@@ -265,10 +265,6 @@ print_frame_info (fi, level, source, args)
   fflush (stdout);
 }
 
-#ifdef FRAME_SPECIFICATION_DYADIC
-extern FRAME setup_arbitrary_frame ();
-#endif
-
 /*
  * Read a frame specification in whatever the appropriate format is.
  * Call error() if the specification is in any way invalid (i.e.
@@ -279,7 +275,9 @@ parse_frame_specification (frame_exp)
      char *frame_exp;
 {
   int numargs = 0;
-  int arg1, arg2;
+  int arg1, arg2, arg3;
+#define        MAXARGS 4
+  int args[MAXARGS];
   
   if (frame_exp)
     {
@@ -287,27 +285,25 @@ parse_frame_specification (frame_exp)
       struct cleanup *tmp_cleanup;
 
       while (*frame_exp == ' ') frame_exp++;
-      for (p = frame_exp; *p && *p != ' '; p++)
-       ;
 
-      if (*frame_exp)
+      while (*frame_exp)
        {
-         numargs = 1;
+         if (numargs > MAXARGS)
+           error ("Too many args in frame specification");
+         /* Parse an argument.  */
+          for (p = frame_exp; *p && *p != ' '; p++)
+           ;
          addr_string = savestring(frame_exp, p - frame_exp);
 
          {
            tmp_cleanup = make_cleanup (free, addr_string);
-           arg1 = parse_and_eval_address (addr_string);
+           args[numargs++] = parse_and_eval_address (addr_string);
            do_cleanups (tmp_cleanup);
          }
 
+         /* Skip spaces, move to possible next arg.  */
          while (*p == ' ') p++;
-         
-         if (*p)
-           {
-             numargs = 2;
-             arg2 = parse_and_eval_address (p);
-           }
+         frame_exp = p;
        }
     }
 
@@ -320,7 +316,7 @@ parse_frame_specification (frame_exp)
       /* NOTREACHED */
     case 1:
       {
-       int level = arg1;
+       int level = args[0];
        FRAME fid = find_relative_frame (get_current_frame (), &level);
        FRAME tfid;
 
@@ -332,35 +328,33 @@ parse_frame_specification (frame_exp)
           (s)he gets.  Still, give the highest one that matches.  */
 
        for (fid = get_current_frame ();
-            fid && FRAME_FP (fid) != arg1;
+            fid && FRAME_FP (fid) != args[0];
             fid = get_prev_frame (fid))
          ;
 
        if (fid)
          while ((tfid = get_prev_frame (fid)) &&
-                (FRAME_FP (tfid) == arg1))
+                (FRAME_FP (tfid) == args[0]))
            fid = tfid;
          
-#ifdef FRAME_SPECIFICATION_DYADIC
-       if (!fid)
-         error ("Incorrect number of args in frame specification");
-
-       return fid;
-#else
-       return create_new_frame (arg1, 0);
-#endif
+       /* We couldn't identify the frame as an existing frame, but
+          perhaps we can create one with a single argument.
+          Fall through to default case; it's up to SETUP_ARBITRARY_FRAME
+          to complain if it doesn't like a single arg.  */
       }
-      /* NOTREACHED */
-    case 2:
-      /* Must be addresses */
-#ifndef FRAME_SPECIFICATION_DYADIC
-      error ("Incorrect number of args in frame specification");
+
+     default:
+#ifdef SETUP_ARBITRARY_FRAME
+      return SETUP_ARBITRARY_FRAME (numargs, args);
 #else
-      return setup_arbitrary_frame (arg1, arg2);
+      /* Usual case.  Do it here rather than have everyone supply
+        a SETUP_ARBITRARY_FRAME that does this.  */
+      if (numargs == 1)
+       return create_new_frame (args[0], 0);
+      error ("Too many args in frame specification");
 #endif
       /* NOTREACHED */
     }
-  fatal ("Internal: Error in parsing in parse_frame_specification");
   /* NOTREACHED */
 }
 
@@ -391,9 +385,10 @@ frame_info (addr_exp, from_tty)
   FRAME calling_frame;
   int i, count;
   char *funname = 0;
+  enum language funlang = language_unknown;
 
   if (!target_has_stack)
-    error ("No inferior or core file.");
+    error ("No stack.");
 
   frame = parse_frame_specification (addr_exp);
   if (!frame)
@@ -404,12 +399,18 @@ frame_info (addr_exp, from_tty)
   func = get_frame_function (frame);
   s = find_pc_symtab(fi->pc);
   if (func)
-    funname = SYMBOL_NAME (func);
+    {
+      funname = SYMBOL_NAME (func);
+      funlang = SYMBOL_LANGUAGE (func);
+    }
   else
     {
       register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
       if (msymbol != NULL)
-       funname = msymbol -> name;
+       {
+         funname = SYMBOL_NAME (msymbol);
+         funlang = SYMBOL_LANGUAGE (msymbol);
+       }
     }
   calling_frame = get_prev_frame (frame);
 
@@ -429,7 +430,8 @@ frame_info (addr_exp, from_tty)
   if (funname)
     {
       printf_filtered (" in ");
-      fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS);
+      fprintf_symbol_filtered (stdout, funname, funlang,
+                              DMGL_ANSI | DMGL_PARAMS);
     }
   wrap_here ("   ");
   if (sal.symtab)
@@ -461,6 +463,10 @@ frame_info (addr_exp, from_tty)
   if (s)
      printf_filtered(" source language %s.\n", language_str(s->language));
 
+#ifdef PRINT_EXTRA_FRAME_INFO
+  PRINT_EXTRA_FRAME_INFO (fi);
+#endif
+
   {
     /* Address of the argument list for this frame, or 0.  */
     CORE_ADDR arg_list = FRAME_ARGS_ADDRESS_CORRECT (fi);
@@ -624,7 +630,7 @@ backtrace_command (count_exp, from_tty)
          fi = get_frame_info (frame);
          ps = find_pc_psymtab (fi->pc);
          if (ps)
-           (void) PSYMTAB_TO_SYMTAB (ps);      /* Force syms to come in */
+           PSYMTAB_TO_SYMTAB (ps);     /* Force syms to come in */
        }
     }
 
@@ -666,7 +672,7 @@ print_block_frame_locals (b, frame, stream)
          || SYMBOL_CLASS (sym) == LOC_STATIC)
        {
          values_printed = 1;
-         fprint_symbol (stream, SYMBOL_NAME (sym));
+         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          fputs_filtered (" = ", stream);
          print_variable_value (sym, frame, stream);
          fprintf_filtered (stream, "\n");
@@ -693,7 +699,7 @@ print_block_frame_labels (b, have_default, stream)
   for (i = 0; i < nsyms; i++)
     {
       sym = BLOCK_SYM (b, i);
-      if (! strcmp (SYMBOL_NAME (sym), "default"))
+      if (STREQ (SYMBOL_NAME (sym), "default"))
        {
          if (*have_default)
            continue;
@@ -704,7 +710,7 @@ print_block_frame_labels (b, have_default, stream)
          struct symtab_and_line sal;
          sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
          values_printed = 1;
-         fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS);
+         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          if (addressprint)
            fprintf_filtered (stream, " %s", 
                              local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
@@ -779,7 +785,7 @@ print_frame_label_vars (frame, this_level_only, stream)
 
   bl = blockvector_for_pc (BLOCK_END (block) - 4, &index);
   blocks_printed = (char *) alloca (BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
-  (void) memset (blocks_printed, 0, BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
+  memset (blocks_printed, 0, BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
 
   while (block != 0)
     {
@@ -876,15 +882,24 @@ print_frame_arg_vars (frame, stream)
       if (SYMBOL_CLASS (sym) == LOC_ARG
          || SYMBOL_CLASS (sym) == LOC_LOCAL_ARG
          || SYMBOL_CLASS (sym) == LOC_REF_ARG
-         || SYMBOL_CLASS (sym) == LOC_REGPARM)
+         || SYMBOL_CLASS (sym) == LOC_REGPARM
+         || SYMBOL_CLASS (sym) == LOC_REGPARM_ADDR)
        {
          values_printed = 1;
-         fprint_symbol (stream, SYMBOL_NAME (sym));
+         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          fputs_filtered (" = ", stream);
-         /* We have to look up the symbol because arguments often have
-            two entries (one a parameter, one a register) and the one
-            we want is the register, which lookup_symbol will find for
-            us.  */
+
+         /* We have to look up the symbol because arguments can have
+            two entries (one a parameter, one a local) and the one we
+            want is the local, which lookup_symbol will find for us.
+            This includes gcc1 (not gcc2) on the sparc when passing a
+            small structure and gcc2 when the argument type is float
+            and it is passed as a double and converted to float by
+            the prologue (in the latter case the type of the LOC_ARG
+            symbol is double and the type of the LOC_LOCAL symbol is
+            float).  There are also LOC_ARG/LOC_REGISTER pairs which
+            are not combined in symbol-reading.  */
+
          sym2 = lookup_symbol (SYMBOL_NAME (sym),
                        b, VAR_NAMESPACE, (int *)NULL, (struct symtab **)NULL);
          print_variable_value (sym2, frame, stream);
@@ -1066,7 +1081,7 @@ up_silently_command (count_exp, from_tty)
     count = parse_and_eval_address (count_exp);
   count1 = count;
   
-  if (!target_has_stack)
+  if (target_has_stack == 0 || selected_frame == 0)
     error ("No stack.");
 
   frame = find_relative_frame (selected_frame, &count1);
@@ -1099,7 +1114,7 @@ down_silently_command (count_exp, from_tty)
     count = - parse_and_eval_address (count_exp);
   count1 = count;
   
-  if (!target_has_stack)
+  if (target_has_stack == 0 || selected_frame == 0)
     error ("No stack.");
 
   frame = find_relative_frame (selected_frame, &count1);
@@ -1127,8 +1142,7 @@ return_command (retval_exp, from_tty)
   FRAME_ADDR selected_frame_addr;
   CORE_ADDR selected_frame_pc;
   FRAME frame;
-  char *funcname;
-  struct cleanup *back_to;
+  value return_value;
 
   if (selected_frame == NULL)
     error ("No selected frame.");
@@ -1136,20 +1150,27 @@ return_command (retval_exp, from_tty)
   selected_frame_addr = FRAME_FP (selected_frame);
   selected_frame_pc = (get_frame_info (selected_frame))->pc;
 
+  /* Compute the return value (if any -- possibly getting errors here).
+     Call VALUE_CONTENTS to make sure we have fully evaluated it, since
+     it might live in the stack frame we're about to pop.  */
+
+  if (retval_exp)
+    {
+      return_value = parse_and_eval (retval_exp);
+      VALUE_CONTENTS (return_value);
+    }
+
   /* If interactive, require confirmation.  */
 
   if (from_tty)
     {
       if (thisfun != 0)
        {
-         funcname = strdup_demangled (SYMBOL_NAME (thisfun));
-         back_to = make_cleanup (free, funcname);
-         if (!query ("Make %s return now? ", funcname))
+         if (!query ("Make %s return now? ", SYMBOL_SOURCE_NAME (thisfun)))
            {
              error ("Not confirmed.");
              /* NOTREACHED */
            }
-         do_cleanups (back_to);
        }
       else
        if (!query ("Make selected stack frame return now? "))
@@ -1173,7 +1194,7 @@ return_command (retval_exp, from_tty)
      for return values.  */
 
   if (retval_exp)
-    set_return_value (parse_and_eval (retval_exp));
+    set_return_value (return_value);
 
   /* If interactive, print the frame that is now current.  */
 
@@ -1228,6 +1249,7 @@ This is useful in command scripts.");
           "Select and print stack frame called by this one.\n\
 An argument says how many frames down to go.");
   add_com_alias ("do", "down", class_stack, 1);
+  add_com_alias ("dow", "down", class_stack, 1);
   add_com ("down-silently", class_support, down_silently_command,
           "Same as the `down' command, but does not print anything.\n\
 This is useful in command scripts.");
This page took 0.028434 seconds and 4 git commands to generate.