* elflink.h (elf_bfd_final_link): Check if dynobj is not NULL
[binutils-gdb.git] / gdb / printcmd.c
index 63b74649479bf05436d2776210e3c15109c4aadd..9db15476885d9d3d20146c401f7644fd26a2420a 100644 (file)
@@ -75,7 +75,7 @@ static CORE_ADDR last_examine_address;
 /* Contents of last address examined.
    This is not valid past the end of the `x' command!  */
 
-static value_ptr last_examine_value;
+static struct value *last_examine_value;
 
 /* Largest offset between a symbolic value and an address, that will be
    printed as `0x1234 <symbol+offset>'.  */
@@ -112,7 +112,7 @@ struct display
     /* Innermost block required by this expression when evaluated */
     struct block *block;
     /* Status of this display (enabled or disabled) */
-    enum enable status;
+    int enabled_p;
   };
 
 /* Chain of expressions whose values should be displayed
@@ -172,7 +172,7 @@ static void validate_format (struct format_data, char *);
 static void do_examine (struct format_data, CORE_ADDR addr,
                        asection * section);
 
-static void print_formatted (value_ptr, int, int, struct ui_file *);
+static void print_formatted (struct value *, int, int, struct ui_file *);
 
 static struct format_data decode_format (char **, int, int);
 
@@ -280,7 +280,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 (register value_ptr val, register int format, int size,
+print_formatted (struct value *val, register int format, int size,
                 struct ui_file *stream)
 {
   struct type *type = check_typedef (VALUE_TYPE (val));
@@ -455,10 +455,12 @@ print_scalar_formatted (char *valaddr, struct type *type, int format, int size,
       break;
 
     case 'f':
-      if (len == sizeof (float))
-         type = builtin_type_float;
-      else if (len == sizeof (double))
-         type = builtin_type_double;
+      if (len == TYPE_LENGTH (builtin_type_float))
+        type = builtin_type_float;
+      else if (len == TYPE_LENGTH (builtin_type_double))
+        type = builtin_type_double;
+      else if (len == TYPE_LENGTH (builtin_type_long_double))
+        type = builtin_type_long_double;
       print_floating (valaddr, type, stream);
       break;
 
@@ -894,7 +896,7 @@ print_command_1 (char *exp, int inspect, int voidprint)
   struct expression *expr;
   register struct cleanup *old_chain = 0;
   register char format = 0;
-  register value_ptr val;
+  struct value *val;
   struct format_data fmt;
   int cleanup = 0;
 
@@ -932,7 +934,7 @@ print_command_1 (char *exp, int inspect, int voidprint)
          && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT
              || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_UNION))
        {
-         value_ptr v;
+         struct value *v;
 
          v = value_from_vtable_info (val, TYPE_TARGET_TYPE (type));
          if (v != 0)
@@ -1012,7 +1014,7 @@ output_command (char *exp, int from_tty)
   struct expression *expr;
   register struct cleanup *old_chain;
   register char format = 0;
-  register value_ptr val;
+  struct value *val;
   struct format_data fmt;
 
   if (exp && *exp == '/')
@@ -1348,7 +1350,7 @@ x_command (char *exp, int from_tty)
           && VALUE_LVAL (val) == lval_memory)
        next_address = VALUE_ADDRESS (val);
       else
-       next_address = value_as_pointer (val);
+       next_address = value_as_address (val);
       if (VALUE_BFD_SECTION (val))
        next_section = VALUE_BFD_SECTION (val);
       do_cleanups (old_chain);
@@ -1396,8 +1398,7 @@ display_command (char *exp, int from_tty)
 
 #if defined(TUI)
   if (tui_version && *exp == '$')
-    display_it = ((TuiStatus) tuiDo (
-                 (TuiOpaqueFuncPtr) tui_vSetLayoutTo, exp) == TUI_FAILURE);
+    display_it = (tui_set_layout (exp) == TUI_FAILURE);
 #endif
 
   if (display_it)
@@ -1434,7 +1435,7 @@ display_command (char *exp, int from_tty)
       new->next = display_chain;
       new->number = ++display_number;
       new->format = fmt;
-      new->status = enabled;
+      new->enabled_p = 1;
       display_chain = new;
 
       if (from_tty && target_has_execution)
@@ -1545,7 +1546,7 @@ do_one_display (struct display *d)
 {
   int within_current_scope;
 
-  if (d->status == disabled)
+  if (d->enabled_p == 0)
     return;
 
   if (d->block)
@@ -1564,7 +1565,7 @@ do_one_display (struct display *d)
   if (d->format.size)
     {
       CORE_ADDR addr;
-      value_ptr val;
+      struct value *val;
 
       annotate_display_format ();
 
@@ -1587,7 +1588,7 @@ do_one_display (struct display *d)
        printf_filtered ("  ");
 
       val = evaluate_expression (d->exp);
-      addr = value_as_pointer (val);
+      addr = value_as_address (val);
       if (d->format.format == 'i')
        addr = ADDR_BITS_REMOVE (addr);
 
@@ -1645,7 +1646,7 @@ disable_display (int num)
   for (d = display_chain; d; d = d->next)
     if (d->number == num)
       {
-       d->status = disabled;
+       d->enabled_p = 0;
        return;
       }
   printf_unfiltered ("No display number %d.\n", num);
@@ -1676,7 +1677,7 @@ Num Enb Expression\n");
 
   for (d = display_chain; d; d = d->next)
     {
-      printf_filtered ("%d:   %c  ", d->number, "ny"[(int) d->status]);
+      printf_filtered ("%d:   %c  ", d->number, "ny"[(int) d->enabled_p]);
       if (d->format.size)
        printf_filtered ("/%d%c%c ", d->format.count, d->format.size,
                         d->format.format);
@@ -1701,7 +1702,7 @@ enable_display (char *args, int from_tty)
   if (p == 0)
     {
       for (d = display_chain; d; d = d->next)
-       d->status = enabled;
+       d->enabled_p = 1;
     }
   else
     while (*p)
@@ -1717,7 +1718,7 @@ enable_display (char *args, int from_tty)
        for (d = display_chain; d; d = d->next)
          if (d->number == num)
            {
-             d->status = enabled;
+             d->enabled_p = 1;
              goto win;
            }
        printf_unfiltered ("No display number %d.\n", num);
@@ -1739,7 +1740,7 @@ disable_display_command (char *args, int from_tty)
   if (p == 0)
     {
       for (d = display_chain; d; d = d->next)
-       d->status = disabled;
+       d->enabled_p = 0;
     }
   else
     while (*p)
@@ -1766,7 +1767,7 @@ void
 print_variable_value (struct symbol *var, struct frame_info *frame,
                      struct ui_file *stream)
 {
-  value_ptr val = read_var_value (var, frame);
+  struct value *val = read_var_value (var, frame);
 
   value_print (val, stream, 0, Val_pretty_default);
 }
@@ -1784,11 +1785,10 @@ print_frame_args (struct symbol *func, struct frame_info *fi, int num,
                  struct ui_file *stream)
 {
   struct block *b = NULL;
-  int nsyms = 0;
   int first = 1;
   register int i;
   register struct symbol *sym;
-  register value_ptr val;
+  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.  */
@@ -1807,171 +1807,165 @@ print_frame_args (struct symbol *func, struct frame_info *fi, int num,
   if (func)
     {
       b = SYMBOL_BLOCK_VALUE (func);
-      nsyms = BLOCK_NSYMS (b);
-    }
-
-  for (i = 0; i < nsyms; i++)
-    {
-      QUIT;
-      sym = BLOCK_SYM (b, i);
+      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.  */
+         /* 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);
-         }
+         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:
-         break;
+             /* 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:
+             break;
 
-         /* Other types of symbols we just skip over.  */
-       default:
-         continue;
-       }
+           /* 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 (*SYMBOL_NAME (sym))
-       {
-         struct symbol *nsym;
-         nsym = lookup_symbol
-           (SYMBOL_NAME (sym),
-            b, VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL);
-         if (SYMBOL_CLASS (nsym) == LOC_REGISTER)
+         /* 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 (*SYMBOL_NAME (sym))
            {
-             /* 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.  */
-             ;
+             struct symbol *nsym;
+             nsym = lookup_symbol
+               (SYMBOL_NAME (sym),
+                b, VAR_NAMESPACE, (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;
            }
-         else
-           sym = nsym;
-       }
 
 #ifdef UI_OUT
-      /* 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_SOURCE_NAME (sym),
-                           SYMBOL_LANGUAGE (sym), DMGL_PARAMS | DMGL_ANSI);
-      ui_out_field_stream (uiout, "name", stb);
-      annotate_arg_name_end ();
-      ui_out_text (uiout, "=");
+         /* 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_SOURCE_NAME (sym),
+                                  SYMBOL_LANGUAGE (sym), DMGL_PARAMS | DMGL_ANSI);
+         ui_out_field_stream (uiout, "name", stb);
+         annotate_arg_name_end ();
+         ui_out_text (uiout, "=");
 #else
-      /* Print the current arg.  */
-      if (!first)
-       fprintf_filtered (stream, ", ");
-      wrap_here ("    ");
+         /* Print the current arg.  */
+         if (!first)
+           fprintf_filtered (stream, ", ");
+         wrap_here ("    ");
 
-      annotate_arg_begin ();
+         annotate_arg_begin ();
 
-      fprintf_symbol_filtered (stream, SYMBOL_SOURCE_NAME (sym),
-                           SYMBOL_LANGUAGE (sym), DMGL_PARAMS | DMGL_ANSI);
-      annotate_arg_name_end ();
-      fputs_filtered ("=", stream);
+         fprintf_symbol_filtered (stream, SYMBOL_SOURCE_NAME (sym),
+                                  SYMBOL_LANGUAGE (sym), DMGL_PARAMS | DMGL_ANSI);
+         annotate_arg_name_end ();
+         fputs_filtered ("=", stream);
 #endif
 
-      /* 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);
+         /* 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));
+         annotate_arg_value (val == NULL ? NULL : VALUE_TYPE (val));
 
-      if (val)
-       {
-         if (GDB_TARGET_IS_D10V
-             && SYMBOL_CLASS (sym) == LOC_REGPARM && TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_PTR)
-           TYPE_LENGTH (VALUE_TYPE (val)) = 2;
+         if (val)
+           {
 #ifdef UI_OUT
-         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, "???");
+             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);
+         /* Invoke ui_out_tuple_end.  */
+         do_cleanups (list_chain);
 #else
-         val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
-                    VALUE_ADDRESS (val),
-                    stream, 0, 0, 2, Val_no_prettyprint);
-       }
-      else
-       fputs_filtered ("???", stream);
+             val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
+                        VALUE_ADDRESS (val),
+                        stream, 0, 0, 2, Val_no_prettyprint);
+           }
+         else
+           fputs_filtered ("???", stream);
 #endif
 
-      annotate_arg_end ();
+         annotate_arg_end ();
 
-      first = 0;
+         first = 0;
+       }
     }
 
   /* Don't print nameless args in situations where we don't know
@@ -2044,14 +2038,15 @@ printf_command (char *arg, int from_tty)
   register char *f = NULL;
   register char *s = arg;
   char *string = NULL;
-  value_ptr *val_args;
+  struct value **val_args;
   char *substrings;
   char *current_substring;
   int nargs = 0;
   int allocated_args = 20;
   struct cleanup *old_cleanups;
 
-  val_args = (value_ptr *) xmalloc (allocated_args * sizeof (value_ptr));
+  val_args = (struct value **) xmalloc (allocated_args
+                                       * sizeof (struct value *));
   old_cleanups = make_cleanup (free_current_contents, &val_args);
 
   if (s == 0)
@@ -2215,9 +2210,9 @@ printf_command (char *arg, int from_tty)
       {
        char *s1;
        if (nargs == allocated_args)
-         val_args = (value_ptr *) xrealloc ((char *) val_args,
-                                            (allocated_args *= 2)
-                                            * sizeof (value_ptr));
+         val_args = (struct value **) xrealloc ((char *) val_args,
+                                                (allocated_args *= 2)
+                                                * sizeof (struct value *));
        s1 = s;
        val_args[nargs] = parse_to_comma_and_eval (&s1);
 
@@ -2252,7 +2247,7 @@ printf_command (char *arg, int from_tty)
              char *str;
              CORE_ADDR tem;
              int j;
-             tem = value_as_pointer (val_args[i]);
+             tem = value_as_address (val_args[i]);
 
              /* This is a %s argument.  Find the length of the string.  */
              for (j = 0;; j++)
@@ -2338,9 +2333,7 @@ disassemble_command (char *arg, int from_tty)
        error ("No function contains program counter for selected frame.\n");
 #if defined(TUI)
       else if (tui_version)
-       low = (CORE_ADDR) tuiDo ((TuiOpaqueFuncPtr) tui_vGetLowDisassemblyAddress,
-                                (Opaque) low,
-                                (Opaque) pc);
+       low = tuiGetLowDisassemblyAddress (low, pc);
 #endif
       low += FUNCTION_START_OFFSET;
     }
@@ -2352,9 +2345,7 @@ disassemble_command (char *arg, int from_tty)
        error ("No function contains specified address.\n");
 #if defined(TUI)
       else if (tui_version)
-       low = (CORE_ADDR) tuiDo ((TuiOpaqueFuncPtr) tui_vGetLowDisassemblyAddress,
-                                (Opaque) low,
-                                (Opaque) pc);
+       low = tuiGetLowDisassemblyAddress (low, pc);
 #endif
 #if 0
       if (overlay_debugging)
@@ -2381,8 +2372,7 @@ disassemble_command (char *arg, int from_tty)
     }
 
 #if defined(TUI)
-  if (!tui_version ||
-      m_winPtrIsNull (disassemWin) || !disassemWin->generic.isVisible)
+  if (!tui_is_window_visible (DISASSEM_WIN))
 #endif
     {
       printf_filtered ("Dump of assembler code ");
@@ -2430,8 +2420,7 @@ disassemble_command (char *arg, int from_tty)
 #if defined(TUI)
   else
     {
-      tuiDo ((TuiOpaqueFuncPtr) tui_vAddWinToLayout, DISASSEM_WIN);
-      tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateSourceWindowsWithAddr, low);
+      tui_show_assembly (low);
     }
 #endif
 }
@@ -2451,6 +2440,8 @@ print_insn (CORE_ADDR memaddr, struct ui_file *stream)
     TARGET_PRINT_INSN_INFO->mach = TARGET_ARCHITECTURE->mach;
   /* else: should set .mach=0 but some disassemblers don't grok this */
 
+  TARGET_PRINT_INSN_INFO->stream = stream;
+
   return TARGET_PRINT_INSN (memaddr, TARGET_PRINT_INSN_INFO);
 }
 \f