* inftarg.c (child_thread_alive): New function to see if a
[deliverable/binutils-gdb.git] / gdb / stack.c
index 2f2a104b42df8c59e500bc8a7e230da0b25219ea..4d84dafda10ac6c50054aa3fdd389feb50298699 100644 (file)
@@ -101,10 +101,13 @@ FRAME selected_frame;
 
 int selected_frame_level;
 
-/* Nonzero means print the full filename and linenumber
-   when a frame is printed, and do so in a format programs can parse.  */
+/* Zero means do things normally; we are interacting directly with the
+   user.  One means print the full filename and linenumber when a
+   frame is printed, and do so in a format emacs18/emacs19.22 can
+   parse.  Two means print similar annotations, but in many more
+   cases and in a slightly different syntax.  */
 
-int frame_file_full_name = 0;
+int annotation_level = 0;
 
 \f
 struct print_stack_frame_args {
@@ -185,6 +188,9 @@ print_frame_info (fi, level, source, args)
   char buf[MAX_REGISTER_RAW_SIZE];
   CORE_ADDR sp;
 
+#if 0
+  /* On the 68k, this spends too much time in m68k_find_saved_regs.  */
+
   /* Get the value of SP_REGNUM relative to the frame.  */
   get_saved_register (buf, (int *)NULL, (CORE_ADDR *)NULL,
                      FRAME_INFO_ID (fi), SP_REGNUM, (enum lval_type *)NULL);
@@ -195,6 +201,9 @@ print_frame_info (fi, level, source, args)
      will succeed even though there is no call dummy.  Probably best is
      to check for a bp_call_dummy breakpoint.  */
   if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
+#else
+  if (frame_in_dummy (fi))
+#endif
     {
       /* Do this regardless of SOURCE because we don't have any source
         to list for this frame.  */
@@ -216,12 +225,14 @@ print_frame_info (fi, level, source, args)
   /* If fi is not the innermost frame, that normally means that fi->pc
      points to *after* the call instruction, and we want to get the line
      containing the call, never the next line.  But if the next frame is
-     a signal_handler_caller frame, then the next frame was not entered
-     as the result of a call, and we want to get the line containing
-     fi->pc.  */
+     a signal_handler_caller or a dummy frame, then the next frame was
+     not entered as the result of a call, and we want to get the line
+     containing fi->pc.  */
   sal =
     find_pc_line (fi->pc,
-                 fi->next != NULL && fi->next->signal_handler_caller == 0);
+                 fi->next != NULL
+                 && !fi->next->signal_handler_caller
+                 && !frame_in_dummy (fi->next));
 
   func = find_pc_function (fi->pc);
   if (func)
@@ -247,9 +258,14 @@ print_frame_info (fi, level, source, args)
          && (SYMBOL_VALUE_ADDRESS (msymbol) 
              > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
        {
+#if 0
+         /* There is no particular reason to think the line number
+            information is wrong.  Someone might have just put in
+            a label with asm() but left the line numbers alone.  */
          /* In this case we have no way of knowing the source file
             and line number, so don't print them.  */
          sal.symtab = 0;
+#endif
          /* We also don't know anything about the function besides
             its address and name.  */
          func = 0;
@@ -278,9 +294,12 @@ print_frame_info (fi, level, source, args)
        printf_filtered ("#%-2d ", level);
       if (addressprint)
        if (fi->pc != sal.pc || !sal.symtab)
-         printf_filtered ("%s in ", local_hex_string((unsigned long) fi->pc));
+         {
+           print_address_numeric (fi->pc, 1, gdb_stdout);
+           printf_filtered (" in ");
+         }
       fprintf_symbol_filtered (gdb_stdout, funname ? funname : "??", funlang,
-                              DMGL_NO_OPTS);
+                              DMGL_ANSI);
       wrap_here ("   ");
       fputs_filtered (" (", gdb_stdout);
       if (args)
@@ -313,13 +332,16 @@ print_frame_info (fi, level, source, args)
     {
       int done = 0;
       int mid_statement = source < 0 && fi->pc != sal.pc;
-      if (frame_file_full_name)
+      if (annotation_level)
        done = identify_source_line (sal.symtab, sal.line, mid_statement,
                                     fi->pc);
       if (!done)
        {
          if (addressprint && mid_statement)
-           printf_filtered ("%s\t", local_hex_string((unsigned long) fi->pc));
+           {
+             print_address_numeric (fi->pc, 1, gdb_stdout);
+             printf_filtered ("\t");
+           }
          print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
        }
       current_source_line = max (sal.line - lines_to_list/2, 1);
@@ -388,6 +410,22 @@ parse_frame_specification (frame_exp)
          /* find_relative_frame was successful */
          return fid;
 
+       /* If SETUP_ARBITRARY_FRAME is defined, then frame specifications
+          take at least 2 addresses.  It is important to detect this case
+          here so that "frame 100" does not give a confusing error message
+          like "frame specification requires two addresses".  This of course
+          does not solve the "frame 100" problem for machines on which
+          a frame specification can be made with one address.  To solve
+          that, we need a new syntax for a specifying a frame by address.
+          I think the cleanest syntax is $frame(0x45) ($frame(0x23,0x45) for
+          two args, etc.), but people might think that is too much typing,
+          so I guess *0x23,0x45 would be a possible alternative (commas
+          really should be used instead of spaces to delimit; using spaces
+          normally works in an expression).  */
+#ifdef SETUP_ARBITRARY_FRAME
+       error ("No frame %d", args[0]);
+#endif
+
        /* If (s)he specifies the frame with an address, he deserves what
           (s)he gets.  Still, give the highest one that matches.  */
 
@@ -402,9 +440,7 @@ parse_frame_specification (frame_exp)
            fid = tfid;
          
        /* 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.  */
+          perhaps we can create one with a single argument.  */
       }
 
      default:
@@ -460,7 +496,9 @@ frame_info (addr_exp, from_tty)
 
   fi = get_frame_info (frame);
   sal = find_pc_line (fi->pc,
-                     fi->next != NULL && fi->next->signal_handler_caller == 0);
+                     fi->next != NULL
+                     && !fi->next->signal_handler_caller
+                     && !frame_in_dummy (fi->next));
   func = get_frame_function (frame);
   s = find_pc_symtab(fi->pc);
   if (func)
@@ -479,17 +517,21 @@ frame_info (addr_exp, from_tty)
     }
   calling_frame = get_prev_frame (frame);
 
-  if (!addr_exp && selected_frame_level >= 0) {
-    printf_filtered ("Stack level %d, frame at %s:\n",
-                    selected_frame_level, 
-                    local_hex_string((unsigned long) FRAME_FP(frame)));
-  } else {
-    printf_filtered ("Stack frame at %s:\n",
-                    local_hex_string((unsigned long) FRAME_FP(frame)));
-  }
-  printf_filtered (" %s = %s",
-                  reg_names[PC_REGNUM], 
-                  local_hex_string((unsigned long) fi->pc));
+  if (!addr_exp && selected_frame_level >= 0)
+    {
+      printf_filtered ("Stack level %d, frame at ", selected_frame_level);
+      print_address_numeric (FRAME_FP(frame), 1, gdb_stdout);
+      printf_filtered (":\n");
+    }
+  else
+    {
+      printf_filtered ("Stack frame at ");
+      print_address_numeric (FRAME_FP(frame), 1, gdb_stdout);
+      printf_filtered (":\n");
+    }
+  printf_filtered (" %s = ",
+                  reg_names[PC_REGNUM]);
+  print_address_numeric (fi->pc, 1, gdb_stdout);
 
   wrap_here ("   ");
   if (funname)
@@ -503,8 +545,9 @@ frame_info (addr_exp, from_tty)
     printf_filtered (" (%s:%d)", sal.symtab->filename, sal.line);
   puts_filtered ("; ");
   wrap_here ("    ");
-  printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
-                  local_hex_string((unsigned long) FRAME_SAVED_PC (frame)));
+  printf_filtered ("saved %s ", reg_names[PC_REGNUM]);
+  print_address_numeric (FRAME_SAVED_PC (frame), 1, gdb_stdout);
+  printf_filtered ("\n");
 
   {
     int frameless = 0;
@@ -516,18 +559,22 @@ frame_info (addr_exp, from_tty)
   }
 
   if (calling_frame)
-    printf_filtered (" called by frame at %s", 
-                    local_hex_string((unsigned long) FRAME_FP (calling_frame)));
+    {
+      printf_filtered (" called by frame at ");
+      print_address_numeric (FRAME_FP (calling_frame), 1, gdb_stdout);
+    }
   if (fi->next && calling_frame)
     puts_filtered (",");
   wrap_here ("   ");
   if (fi->next)
-    printf_filtered (" caller of frame at %s",
-                    local_hex_string ((unsigned long) fi->next->frame));
+    {
+      printf_filtered (" caller of frame at ");
+      print_address_numeric (fi->next->frame, 1, gdb_stdout);
+    }
   if (fi->next || calling_frame)
     puts_filtered ("\n");
   if (s)
-     printf_filtered(" source language %s.\n", language_str(s->language));
+    printf_filtered (" source language %s.\n", language_str (s->language));
 
 #ifdef PRINT_EXTRA_FRAME_INFO
   PRINT_EXTRA_FRAME_INFO (fi);
@@ -540,11 +587,12 @@ frame_info (addr_exp, from_tty)
     int numargs;
 
     if (arg_list == 0)
-       printf_filtered (" Arglist at unknown address.\n");
+      printf_filtered (" Arglist at unknown address.\n");
     else
       {
-       printf_filtered (" Arglist at %s,",
-                        local_hex_string((unsigned long) arg_list));
+       printf_filtered (" Arglist at ");
+       print_address_numeric (arg_list, 1, gdb_stdout);
+       printf_filtered (",");
 
        FRAME_NUM_ARGS (numargs, fi);
        if (numargs < 0)
@@ -564,18 +612,22 @@ frame_info (addr_exp, from_tty)
     CORE_ADDR arg_list = FRAME_LOCALS_ADDRESS (fi);
 
     if (arg_list == 0)
-       printf_filtered (" Locals at unknown address,");
+      printf_filtered (" Locals at unknown address,");
     else
-       printf_filtered (" Locals at %s,",
-                        local_hex_string((unsigned long) arg_list));
+      {
+       printf_filtered (" Locals at ");
+       print_address_numeric (arg_list, 1, gdb_stdout);
+       printf_filtered (",");
+      }
   }
 
 #if defined (FRAME_FIND_SAVED_REGS)  
   get_frame_saved_regs (fi, &fsr);
   /* The sp is special; what's returned isn't the save address, but
      actually the value of the previous frame's sp.  */
-  printf_filtered (" Previous frame's sp is %s\n", 
-                  local_hex_string((unsigned long) fsr.regs[SP_REGNUM]));
+  printf_filtered (" Previous frame's sp is ");
+  print_address_numeric (fsr.regs[SP_REGNUM], 1, gdb_stdout);
+  printf_filtered ("\n");
   count = 0;
   for (i = 0; i < NUM_REGS; i++)
     if (fsr.regs[i] && i != SP_REGNUM)
@@ -585,12 +637,14 @@ frame_info (addr_exp, from_tty)
        else
          puts_filtered (",");
        wrap_here (" ");
-       printf_filtered (" %s at %s", reg_names[i], 
-                        local_hex_string((unsigned long) fsr.regs[i]));
+       printf_filtered (" %s at ", reg_names[i]);
+       print_address_numeric (fsr.regs[i], 1, gdb_stdout);
        count++;
       }
   if (count)
     puts_filtered ("\n");
+#else  /* Have FRAME_FIND_SAVED_REGS.  */
+  puts_filtered ("\n");
 #endif /* Have FRAME_FIND_SAVED_REGS.  */
 }
 
@@ -740,15 +794,22 @@ print_block_frame_locals (b, frame, stream)
   for (i = 0; i < nsyms; i++)
     {
       sym = BLOCK_SYM (b, i);
-      if (SYMBOL_CLASS (sym) == LOC_LOCAL
-         || SYMBOL_CLASS (sym) == LOC_REGISTER
-         || SYMBOL_CLASS (sym) == LOC_STATIC)
+      switch (SYMBOL_CLASS (sym))
        {
+       case LOC_LOCAL:
+       case LOC_REGISTER:
+       case LOC_STATIC:
+       case LOC_BASEREG:
          values_printed = 1;
          fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          fputs_filtered (" = ", stream);
          print_variable_value (sym, frame, stream);
          fprintf_filtered (stream, "\n");
+         break;
+
+       default:
+         /* Ignore symbols which are not locals.  */
+         break;
        }
     }
   return values_printed;
@@ -785,8 +846,10 @@ print_block_frame_labels (b, have_default, stream)
          values_printed = 1;
          fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          if (addressprint)
-           fprintf_filtered (stream, " %s", 
-                             local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (sym)));
+           {
+             fprintf_filtered (stream, " ");
+             print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 1, stream);
+           }
          fprintf_filtered (stream, " in file %s, line %d\n",
                            sal.symtab->filename, sal.line);
        }
@@ -1231,7 +1294,7 @@ return_command (retval_exp, from_tty)
   FRAME_ADDR selected_frame_addr;
   CORE_ADDR selected_frame_pc;
   FRAME frame;
-  value return_value = NULL;
+  value_ptr return_value = NULL;
 
   if (selected_frame == NULL)
     error ("No selected frame.");
This page took 0.027401 seconds and 4 git commands to generate.