2004-05-17 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / printcmd.c
index 11fd1df94689287770fbfada74e0e2b302bf7c93..9734ec12ed6262de16a5bf982eaeb179295e43e6 100644 (file)
@@ -1,7 +1,7 @@
 /* Print values for GNU debugger GDB.
 
    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
    Foundation, Inc.
 
    This file is part of GDB.
 #include "block.h"
 #include "disasm.h"
 
+#ifdef TUI
+#include "tui/tui.h"           /* For tui_active et.al.   */
+#endif
+
 extern int asm_demangle;       /* Whether to demangle syms in asm printouts */
 extern int addressprint;       /* Whether to print hex addresses in HLL " */
 
@@ -140,9 +144,6 @@ static void disable_display_command (char *, int);
 
 static void printf_command (char *, int);
 
-static void print_frame_nameless_args (struct frame_info *, long,
-                                      int, int, struct ui_file *);
-
 static void display_info (char *, int);
 
 static void do_one_display (struct display *);
@@ -193,7 +194,7 @@ static struct format_data
 decode_format (char **string_ptr, int oformat, int osize)
 {
   struct format_data val;
-  register char *p = *string_ptr;
+  char *p = *string_ptr;
 
   val.format = '?';
   val.size = '?';
@@ -278,7 +279,7 @@ decode_format (char **string_ptr, int oformat, int osize)
    This is used to pad hex numbers so they line up.  */
 
 static void
-print_formatted (struct value *val, register int format, int size,
+print_formatted (struct value *val, int format, int size,
                 struct ui_file *stream)
 {
   struct type *type = check_typedef (VALUE_TYPE (val));
@@ -318,7 +319,8 @@ print_formatted (struct value *val, register int format, int size,
          || TYPE_CODE (type) == TYPE_CODE_ARRAY
          || TYPE_CODE (type) == TYPE_CODE_STRING
          || TYPE_CODE (type) == TYPE_CODE_STRUCT
-         || TYPE_CODE (type) == TYPE_CODE_UNION)
+         || TYPE_CODE (type) == TYPE_CODE_UNION
+         || TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
        /* If format is 0, use the 'natural' format for
         * that type of value.  If the type is non-scalar,
         * we have to use language rules to print it as
@@ -345,47 +347,37 @@ void
 print_scalar_formatted (void *valaddr, struct type *type, int format, int size,
                        struct ui_file *stream)
 {
-  LONGEST val_long;
+  LONGEST val_long = 0;
   unsigned int len = TYPE_LENGTH (type);
 
-  if (len > sizeof (LONGEST)
-      && (format == 't'
-         || format == 'c'
-         || format == 'o'
-         || format == 'u'
-         || format == 'd'
-         || format == 'x'))
+  if (len > sizeof(LONGEST) &&
+      (TYPE_CODE (type) == TYPE_CODE_INT
+       || TYPE_CODE (type) == TYPE_CODE_ENUM))
     {
-      if (!TYPE_UNSIGNED (type)
-         || !extract_long_unsigned_integer (valaddr, len, &val_long))
+      switch (format)
        {
-         /* We can't print it normally, but we can print it in hex.
-            Printing it in the wrong radix is more useful than saying
-            "use /x, you dummy".  */
-         /* FIXME:  we could also do octal or binary if that was the
-            desired format.  */
-         /* FIXME:  we should be using the size field to give us a
-            minimum field width to print.  */
-
-         if (format == 'o')
-           print_octal_chars (stream, valaddr, len);
-         else if (format == 'd')
-           print_decimal_chars (stream, valaddr, len);
-         else if (format == 't')
-           print_binary_chars (stream, valaddr, len);
-         else
-           /* replace with call to print_hex_chars? Looks
-              like val_print_type_code_int is redoing
-              work.  - edie */
-
-           val_print_type_code_int (type, valaddr, stream);
-
+       case 'o':
+         print_octal_chars (stream, valaddr, len);
          return;
-       }
-
-      /* If we get here, extract_long_unsigned_integer set val_long.  */
+       case 'u':
+       case 'd':
+         print_decimal_chars (stream, valaddr, len);
+         return;
+       case 't':
+         print_binary_chars (stream, valaddr, len);
+         return;
+       case 'x':
+         print_hex_chars (stream, valaddr, len);
+         return;
+       case 'c':
+         print_char_chars (stream, valaddr, len);
+         return;
+       default:
+         break;
+       };
     }
-  else if (format != 'f')
+
+  if (format != 'f')
     val_long = unpack_long (type, valaddr);
 
   /* If the value is a pointer, and pointers and addresses are not the
@@ -510,7 +502,7 @@ print_scalar_formatted (void *valaddr, struct type *type, int format, int size,
        strcpy (buf, local_binary_format_prefix ());
        strcat (buf, cp);
        strcat (buf, local_binary_format_suffix ());
-       fprintf_filtered (stream, buf);
+       fputs_filtered (buf, stream);
       }
       break;
 
@@ -775,12 +767,12 @@ static struct type *examine_g_type;
 static void
 do_examine (struct format_data fmt, CORE_ADDR addr, asection *sect)
 {
-  register char format = 0;
-  register char size;
-  register int count = 1;
+  char format = 0;
+  char size;
+  int count = 1;
   struct type *val_type = NULL;
-  register int i;
-  register int maxelts;
+  int i;
+  int maxelts;
 
   format = fmt.format;
   size = fmt.size;
@@ -875,8 +867,8 @@ static void
 print_command_1 (char *exp, int inspect, int voidprint)
 {
   struct expression *expr;
-  register struct cleanup *old_chain = 0;
-  register char format = 0;
+  struct cleanup *old_chain = 0;
+  char format = 0;
   struct value *val;
   struct format_data fmt;
   int cleanup = 0;
@@ -944,7 +936,6 @@ print_command_1 (char *exp, int inspect, int voidprint)
   inspect_it = 0;              /* Reset print routines to normal */
 }
 
-/* ARGSUSED */
 static void
 print_command (char *exp, int from_tty)
 {
@@ -952,7 +943,6 @@ print_command (char *exp, int from_tty)
 }
 
 /* Same as print, except in epoch, it gets its own window */
-/* ARGSUSED */
 static void
 inspect_command (char *exp, int from_tty)
 {
@@ -962,20 +952,18 @@ inspect_command (char *exp, int from_tty)
 }
 
 /* Same as print, except it doesn't print void results. */
-/* ARGSUSED */
 static void
 call_command (char *exp, int from_tty)
 {
   print_command_1 (exp, 0, 0);
 }
 
-/* ARGSUSED */
 void
 output_command (char *exp, int from_tty)
 {
   struct expression *expr;
-  register struct cleanup *old_chain;
-  register char format = 0;
+  struct cleanup *old_chain;
+  char format = 0;
   struct value *val;
   struct format_data fmt;
 
@@ -1004,18 +992,16 @@ output_command (char *exp, int from_tty)
   do_cleanups (old_chain);
 }
 
-/* ARGSUSED */
 static void
 set_command (char *exp, int from_tty)
 {
   struct expression *expr = parse_expression (exp);
-  register struct cleanup *old_chain =
+  struct cleanup *old_chain =
     make_cleanup (free_current_contents, &expr);
   evaluate_expression (expr);
   do_cleanups (old_chain);
 }
 
-/* ARGSUSED */
 static void
 sym_info (char *arg, int from_tty)
 {
@@ -1060,14 +1046,13 @@ sym_info (char *arg, int from_tty)
     printf_filtered ("No symbol matches %s.\n", arg);
 }
 
-/* ARGSUSED */
 static void
 address_info (char *exp, int from_tty)
 {
-  register struct symbol *sym;
-  register struct minimal_symbol *msymbol;
-  register long val;
-  register long basereg;
+  struct symbol *sym;
+  struct minimal_symbol *msymbol;
+  long val;
+  long basereg;
   asection *section;
   CORE_ADDR load_addr;
   int is_a_field_of_this;      /* C++: lookup_symbol sets this to nonzero
@@ -1150,7 +1135,12 @@ address_info (char *exp, int from_tty)
 
     case LOC_COMPUTED:
     case LOC_COMPUTED_ARG:
-      (SYMBOL_LOCATION_FUNCS (sym)->describe_location) (sym, gdb_stdout);
+      /* FIXME: cagney/2004-01-26: It should be possible to
+        unconditionally call the SYMBOL_OPS method when available.
+        Unfortunately DWARF 2 stores the frame-base (instead of the
+        function) location in a function's symbol.  Oops!  For the
+        moment enable this when/where applicable.  */
+      SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
       break;
 
     case LOC_REGISTER:
@@ -1265,12 +1255,6 @@ address_info (char *exp, int from_tty)
                        val, REGISTER_NAME (basereg));
       break;
 
-    case LOC_THREAD_LOCAL_STATIC:
-      printf_filtered ("a thread-local variable at offset %ld in the "
-                       "thread-local storage for `%s'",
-                       val, SYMBOL_OBJFILE (sym)->name);
-      break;
-
     case LOC_OPTIMIZED_OUT:
       printf_filtered ("optimized out");
       break;
@@ -1363,15 +1347,15 @@ static void
 display_command (char *exp, int from_tty)
 {
   struct format_data fmt;
-  register struct expression *expr;
-  register struct display *new;
+  struct expression *expr;
+  struct display *new;
   int display_it = 1;
 
 #if defined(TUI)
   /* NOTE: cagney/2003-02-13 The `tui_active' was previously
      `tui_version'.  */
-  if (tui_active && *exp == '$')
-    display_it = (tui_set_layout (exp) == TUI_FAILURE);
+  if (tui_active && exp != NULL && *exp == '$')
+    display_it = (tui_set_layout_for_display_command (exp) == TUI_FAILURE);
 #endif
 
   if (display_it)
@@ -1432,7 +1416,7 @@ free_display (struct display *d)
 void
 clear_displays (void)
 {
-  register struct display *d;
+  struct display *d;
 
   while ((d = display_chain) != NULL)
     {
@@ -1447,7 +1431,7 @@ clear_displays (void)
 static void
 delete_display (int num)
 {
-  register struct display *d1, *d;
+  struct display *d1, *d;
 
   if (!display_chain)
     error ("No display number %d.", num);
@@ -1479,9 +1463,9 @@ delete_display (int num)
 static void
 undisplay_command (char *args, int from_tty)
 {
-  register char *p = args;
-  register char *p1;
-  register int num;
+  char *p = args;
+  char *p1;
+  int num;
 
   if (args == 0)
     {
@@ -1602,7 +1586,7 @@ do_one_display (struct display *d)
 void
 do_displays (void)
 {
-  register struct display *d;
+  struct display *d;
 
   for (d = display_chain; d; d = d->next)
     do_one_display (d);
@@ -1614,7 +1598,7 @@ do_displays (void)
 void
 disable_display (int num)
 {
-  register struct display *d;
+  struct display *d;
 
   for (d = display_chain; d; d = d->next)
     if (d->number == num)
@@ -1640,7 +1624,7 @@ disable_current_display (void)
 static void
 display_info (char *ignore, int from_tty)
 {
-  register struct display *d;
+  struct display *d;
 
   if (!display_chain)
     printf_unfiltered ("There are no auto-display expressions now.\n");
@@ -1667,10 +1651,10 @@ Num Enb Expression\n");
 static void
 enable_display (char *args, int from_tty)
 {
-  register char *p = args;
-  register char *p1;
-  register int num;
-  register struct display *d;
+  char *p = args;
+  char *p1;
+  int num;
+  struct display *d;
 
   if (p == 0)
     {
@@ -1702,13 +1686,12 @@ enable_display (char *args, int from_tty)
       }
 }
 
-/* ARGSUSED */
 static void
 disable_display_command (char *args, int from_tty)
 {
-  register char *p = args;
-  register char *p1;
-  register struct display *d;
+  char *p = args;
+  char *p1;
+  struct display *d;
 
   if (p == 0)
     {
@@ -1745,234 +1728,11 @@ print_variable_value (struct symbol *var, struct frame_info *frame,
   value_print (val, stream, 0, Val_pretty_default);
 }
 
-/* Print the arguments of a stack frame, given the function FUNC
-   running in that frame (as a symbol), the info on the frame,
-   and the number of args according to the stack frame (or -1 if unknown).  */
-
-/* References here and elsewhere to "number of args according to the
-   stack frame" appear in all cases to refer to "number of ints of args
-   according to the stack frame".  At least for VAX, i386, isi.  */
-
-void
-print_frame_args (struct symbol *func, struct frame_info *fi, int num,
-                 struct ui_file *stream)
-{
-  struct block *b = NULL;
-  int first = 1;
-  register int i;
-  register struct symbol *sym;
-  struct value *val;
-  /* Offset of next stack argument beyond the one we have seen that is
-     at the highest offset.
-     -1 if we haven't come to a stack argument yet.  */
-  long highest_offset = -1;
-  int arg_size;
-  /* Number of ints of arguments that we have printed so far.  */
-  int args_printed = 0;
-  struct cleanup *old_chain, *list_chain;
-  struct ui_stream *stb;
-
-  stb = ui_out_stream_new (uiout);
-  old_chain = make_cleanup_ui_out_stream_delete (stb);
-
-  if (func)
-    {
-      b = SYMBOL_BLOCK_VALUE (func);
-      /* Function blocks are order sensitive, and thus should not be
-        hashed.  */
-      gdb_assert (BLOCK_HASHTABLE (b) == 0);
-
-      ALL_BLOCK_SYMBOLS (b, i, sym)
-        {
-         QUIT;
-
-         /* Keep track of the highest stack argument offset seen, and
-            skip over any kinds of symbols we don't care about.  */
-
-         switch (SYMBOL_CLASS (sym))
-           {
-           case LOC_ARG:
-           case LOC_REF_ARG:
-             {
-               long current_offset = SYMBOL_VALUE (sym);
-               arg_size = TYPE_LENGTH (SYMBOL_TYPE (sym));
-
-               /* Compute address of next argument by adding the size of
-                  this argument and rounding to an int boundary.  */
-               current_offset =
-                 ((current_offset + arg_size + sizeof (int) - 1)
-                  & ~(sizeof (int) - 1));
-
-               /* If this is the highest offset seen yet, set highest_offset.  */
-               if (highest_offset == -1
-                   || (current_offset > highest_offset))
-                 highest_offset = current_offset;
-
-               /* Add the number of ints we're about to print to args_printed.  */
-               args_printed += (arg_size + sizeof (int) - 1) / sizeof (int);
-             }
-
-             /* We care about types of symbols, but don't need to keep track of
-                stack offsets in them.  */
-           case LOC_REGPARM:
-           case LOC_REGPARM_ADDR:
-           case LOC_LOCAL_ARG:
-           case LOC_BASEREG_ARG:
-           case LOC_COMPUTED_ARG:
-             break;
-
-           /* Other types of symbols we just skip over.  */
-           default:
-             continue;
-           }
-
-         /* 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).  */
-         /* But if the parameter name is null, don't try it.
-            Null parameter names occur on the RS/6000, for traceback tables.
-            FIXME, should we even print them?  */
-
-         if (*DEPRECATED_SYMBOL_NAME (sym))
-           {
-             struct symbol *nsym;
-             nsym = lookup_symbol
-               (DEPRECATED_SYMBOL_NAME (sym),
-                b, VAR_DOMAIN, (int *) NULL, (struct symtab **) NULL);
-             if (SYMBOL_CLASS (nsym) == LOC_REGISTER)
-               {
-                 /* There is a LOC_ARG/LOC_REGISTER pair.  This means that
-                    it was passed on the stack and loaded into a register,
-                    or passed in a register and stored in a stack slot.
-                    GDB 3.x used the LOC_ARG; GDB 4.0-4.11 used the LOC_REGISTER.
-
-                    Reasons for using the LOC_ARG:
-                    (1) because find_saved_registers may be slow for remote
-                    debugging,
-                    (2) because registers are often re-used and stack slots
-                    rarely (never?) are.  Therefore using the stack slot is
-                    much less likely to print garbage.
-
-                    Reasons why we might want to use the LOC_REGISTER:
-                    (1) So that the backtrace prints the same value as
-                    "print foo".  I see no compelling reason why this needs
-                    to be the case; having the backtrace print the value which
-                    was passed in, and "print foo" print the value as modified
-                    within the called function, makes perfect sense to me.
-
-                    Additional note:  It might be nice if "info args" displayed
-                    both values.
-                    One more note:  There is a case with sparc structure passing
-                    where we need to use the LOC_REGISTER, but this is dealt with
-                    by creating a single LOC_REGPARM in symbol reading.  */
-
-                 /* Leave sym (the LOC_ARG) alone.  */
-                 ;
-               }
-             else
-               sym = nsym;
-           }
-
-         /* Print the current arg.  */
-         if (!first)
-           ui_out_text (uiout, ", ");
-         ui_out_wrap_hint (uiout, "    ");
-
-         annotate_arg_begin ();
-
-         list_chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
-         fprintf_symbol_filtered (stb->stream, SYMBOL_PRINT_NAME (sym),
-                                  SYMBOL_LANGUAGE (sym), DMGL_PARAMS | DMGL_ANSI);
-         ui_out_field_stream (uiout, "name", stb);
-         annotate_arg_name_end ();
-         ui_out_text (uiout, "=");
-
-         /* Avoid value_print because it will deref ref parameters.  We just
-            want to print their addresses.  Print ??? for args whose address
-            we do not know.  We pass 2 as "recurse" to val_print because our
-            standard indentation here is 4 spaces, and val_print indents
-            2 for each recurse.  */
-         val = read_var_value (sym, fi);
-
-         annotate_arg_value (val == NULL ? NULL : VALUE_TYPE (val));
-
-         if (val)
-           {
-             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);
-           }
-         else
-           ui_out_text (uiout, "???");
-
-         /* Invoke ui_out_tuple_end.  */
-         do_cleanups (list_chain);
-
-         annotate_arg_end ();
-
-         first = 0;
-       }
-    }
-
-  /* Don't print nameless args in situations where we don't know
-     enough about the stack to find them.  */
-  if (num != -1)
-    {
-      long start;
-
-      if (highest_offset == -1)
-       start = FRAME_ARGS_SKIP;
-      else
-       start = highest_offset;
-
-      print_frame_nameless_args (fi, start, num - args_printed,
-                                first, stream);
-    }
-  do_cleanups (old_chain);
-}
-
-/* Print nameless args on STREAM.
-   FI is the frameinfo for this frame, START is the offset
-   of the first nameless arg, and NUM is the number of nameless args to
-   print.  FIRST is nonzero if this is the first argument (not just
-   the first nameless arg).  */
-
-static void
-print_frame_nameless_args (struct frame_info *fi, long start, int num,
-                          int first, struct ui_file *stream)
-{
-  int i;
-  CORE_ADDR argsaddr;
-  long arg_value;
-
-  for (i = 0; i < num; i++)
-    {
-      QUIT;
-      argsaddr = get_frame_args_address (fi);
-      if (!argsaddr)
-       return;
-      arg_value = read_memory_integer (argsaddr + start, sizeof (int));
-      if (!first)
-       fprintf_filtered (stream, ", ");
-      fprintf_filtered (stream, "%ld", arg_value);
-      first = 0;
-      start += sizeof (int);
-    }
-}
-\f
-/* ARGSUSED */
 static void
 printf_command (char *arg, int from_tty)
 {
-  register char *f = NULL;
-  register char *s = arg;
+  char *f = NULL;
+  char *s = arg;
   char *string = NULL;
   struct value **val_args;
   char *substrings;
@@ -2234,7 +1994,7 @@ printf_command (char *arg, int from_tty)
        current_substring += strlen (current_substring) + 1;
       }
     /* Print the portion of the format string after the last argument.  */
-    printf_filtered (last_arg);
+    puts_filtered (last_arg);
   }
   do_cleanups (old_cleanups);
 }
This page took 0.030626 seconds and 4 git commands to generate.