gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 4a1ee13f0db1c6565aafb768067cdbadbeeead8c..d678ad3091a46848f47b86a4e0f0b51480a76955 100644 (file)
@@ -1,6 +1,6 @@
 /* Print values for GDB, the GNU debugger.
 
-   Copyright (C) 1986-2016 Free Software Foundation, Inc.
+   Copyright (C) 1986-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "language.h"
 #include "annotate.h"
 #include "valprint.h"
-#include "floatformat.h"
-#include "doublest.h"
-#include "dfp.h"
+#include "target-float.h"
 #include "extension.h"
 #include "ada-lang.h"
 #include "gdb_obstack.h"
 #include "charset.h"
 #include "typeprint.h"
 #include <ctype.h>
+#include <algorithm>
+#include "gdbsupport/byte-vector.h"
+#include "cli/cli-option.h"
+#include "gdbarch.h"
+#include "cli/cli-style.h"
+#include "count-one-bits.h"
 
 /* Maximum number of wchars returned from wchar_iterate.  */
 #define MAX_WCHARS 4
@@ -70,9 +74,6 @@ struct converted_character
   int repeat_count;
 };
 
-typedef struct converted_character converted_character_d;
-DEF_VEC_O (converted_character_d);
-
 /* Command lists for set/show print raw.  */
 struct cmd_list_element *setprintrawlist;
 struct cmd_list_element *showprintrawlist;
@@ -82,29 +83,17 @@ struct cmd_list_element *showprintrawlist;
 static int partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
                                int len, int *errptr);
 
-static void show_print (char *, int);
-
-static void set_print (char *, int);
-
-static void set_radix (char *, int);
-
-static void show_radix (char *, int);
-
-static void set_input_radix (char *, int, struct cmd_list_element *);
-
 static void set_input_radix_1 (int, unsigned);
 
-static void set_output_radix (char *, int, struct cmd_list_element *);
-
 static void set_output_radix_1 (int, unsigned);
 
 static void val_print_type_code_flags (struct type *type,
-                                      const gdb_byte *valaddr,
+                                      struct value *original_value,
+                                      int embedded_offset,
                                       struct ui_file *stream);
 
-void _initialize_valprint (void);
-
 #define PRINT_MAX_DEFAULT 200  /* Start print_max off at this value.  */
+#define PRINT_MAX_DEPTH_DEFAULT 20     /* Start print_max_depth off at this value. */
 
 struct value_print_options user_print_options =
 {
@@ -126,7 +115,9 @@ struct value_print_options user_print_options =
   1,                           /* pascal_static_field_print */
   0,                           /* raw */
   0,                           /* summary */
-  1                            /* symbol_print */
+  1,                           /* symbol_print */
+  PRINT_MAX_DEPTH_DEFAULT,     /* max_depth */
+  1                            /* finish_print */
 };
 
 /* Initialize *OPTS to be a copy of the user print options.  */
@@ -280,12 +271,12 @@ int
 val_print_scalar_type_p (struct type *type)
 {
   type = check_typedef (type);
-  while (TYPE_CODE (type) == TYPE_CODE_REF)
+  while (TYPE_IS_REFERENCE (type))
     {
       type = TYPE_TARGET_TYPE (type);
       type = check_typedef (type);
     }
-  switch (TYPE_CODE (type))
+  switch (type->code ())
     {
     case TYPE_CODE_ARRAY:
     case TYPE_CODE_STRUCT:
@@ -298,6 +289,18 @@ val_print_scalar_type_p (struct type *type)
     }
 }
 
+/* A helper function for val_print.  When printing with limited depth we
+   want to print string and scalar arguments, but not aggregate arguments.
+   This function distinguishes between the two.  */
+
+static bool
+val_print_scalar_or_string_type_p (struct type *type,
+                                  const struct language_defn *language)
+{
+  return (val_print_scalar_type_p (type)
+         || language->la_is_string_type_p (type));
+}
+
 /* See its definition in value.h.  */
 
 int
@@ -320,9 +323,9 @@ valprint_check_validity (struct ui_file *stream,
       return 0;
     }
 
-  if (TYPE_CODE (type) != TYPE_CODE_UNION
-      && TYPE_CODE (type) != TYPE_CODE_STRUCT
-      && TYPE_CODE (type) != TYPE_CODE_ARRAY)
+  if (type->code () != TYPE_CODE_UNION
+      && type->code () != TYPE_CODE_STRUCT
+      && type->code () != TYPE_CODE_ARRAY)
     {
       if (value_bits_any_optimized_out (val,
                                        TARGET_CHAR_BIT * embedded_offset,
@@ -335,7 +338,7 @@ valprint_check_validity (struct ui_file *stream,
       if (value_bits_synthetic_pointer (val, TARGET_CHAR_BIT * embedded_offset,
                                        TARGET_CHAR_BIT * TYPE_LENGTH (type)))
        {
-         const int is_ref = TYPE_CODE (type) == TYPE_CODE_REF;
+         const int is_ref = type->code () == TYPE_CODE_REF;
          int ref_is_addressable = 0;
 
          if (is_ref)
@@ -347,7 +350,8 @@ valprint_check_validity (struct ui_file *stream,
            }
 
          if (!is_ref || !ref_is_addressable)
-           fputs_filtered (_("<synthetic pointer>"), stream);
+           fputs_styled (_("<synthetic pointer>"), metadata_style.style (),
+                         stream);
 
          /* C++ references should be valid even if they're synthetic.  */
          return is_ref;
@@ -369,25 +373,25 @@ val_print_optimized_out (const struct value *val, struct ui_file *stream)
   if (val != NULL && value_lval_const (val) == lval_register)
     val_print_not_saved (stream);
   else
-    fprintf_filtered (stream, _("<optimized out>"));
+    fprintf_styled (stream, metadata_style.style (), _("<optimized out>"));
 }
 
 void
 val_print_not_saved (struct ui_file *stream)
 {
-  fprintf_filtered (stream, _("<not saved>"));
+  fprintf_styled (stream, metadata_style.style (), _("<not saved>"));
 }
 
 void
 val_print_unavailable (struct ui_file *stream)
 {
-  fprintf_filtered (stream, _("<unavailable>"));
+  fprintf_styled (stream, metadata_style.style (), _("<unavailable>"));
 }
 
 void
 val_print_invalid_address (struct ui_file *stream)
 {
-  fprintf_filtered (stream, _("<invalid address>"));
+  fprintf_styled (stream, metadata_style.style (), _("<invalid address>"));
 }
 
 /* Print a pointer based on the type of its target.
@@ -404,7 +408,7 @@ print_unpacked_pointer (struct type *type, struct type *elttype,
 {
   struct gdbarch *gdbarch = get_type_arch (type);
 
-  if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
+  if (elttype->code () == TYPE_CODE_FUNC)
     {
       /* Try to print what function it points to.  */
       print_function_pointer_address (options, gdbarch, address, stream);
@@ -420,14 +424,13 @@ print_unpacked_pointer (struct type *type, struct type *elttype,
 /* generic_val_print helper for TYPE_CODE_ARRAY.  */
 
 static void
-generic_val_print_array (struct type *type, const gdb_byte *valaddr,
-                        int embedded_offset, CORE_ADDR address,
+generic_val_print_array (struct value *val,
                         struct ui_file *stream, int recurse,
-                        const struct value *original_value,
                         const struct value_print_options *options,
                         const struct
                             generic_val_print_decorations *decorations)
 {
+  struct type *type = check_typedef (value_type (val));
   struct type *unresolved_elttype = TYPE_TARGET_TYPE (type);
   struct type *elttype = check_typedef (unresolved_elttype);
 
@@ -438,66 +441,40 @@ generic_val_print_array (struct type *type, const gdb_byte *valaddr,
       if (!get_array_bounds (type, &low_bound, &high_bound))
        error (_("Could not determine the array high bound"));
 
-      if (options->prettyformat_arrays)
-       {
-         print_spaces_filtered (2 + 2 * recurse, stream);
-       }
-
       fputs_filtered (decorations->array_start, stream);
-      val_print_array_elements (type, valaddr, embedded_offset,
-                               address, stream,
-                               recurse, original_value, options, 0);
+      value_print_array_elements (val, stream, recurse, options, 0);
       fputs_filtered (decorations->array_end, stream);
     }
   else
     {
       /* Array of unspecified length: treat like pointer to first elt.  */
-      print_unpacked_pointer (type, elttype, address + embedded_offset, stream,
-                             options);
+      print_unpacked_pointer (type, elttype, value_address (val),
+                             stream, options);
     }
 
 }
 
-/* generic_val_print helper for TYPE_CODE_PTR.  */
+/* generic_value_print helper for TYPE_CODE_PTR.  */
 
 static void
-generic_val_print_ptr (struct type *type, const gdb_byte *valaddr,
-                      int embedded_offset, struct ui_file *stream,
-                      const struct value *original_value,
-                      const struct value_print_options *options)
+generic_value_print_ptr (struct value *val, struct ui_file *stream,
+                        const struct value_print_options *options)
 {
-  struct gdbarch *gdbarch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
 
   if (options->format && options->format != 's')
-    {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, options, 0, stream);
-    }
+    value_print_scalar_formatted (val, options, 0, stream);
   else
     {
-      struct type *unresolved_elttype = TYPE_TARGET_TYPE(type);
-      struct type *elttype = check_typedef (unresolved_elttype);
-      CORE_ADDR addr = unpack_pointer (type,
-                                      valaddr + embedded_offset * unit_size);
+      struct type *type = check_typedef (value_type (val));
+      struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
+      const gdb_byte *valaddr = value_contents_for_printing (val);
+      CORE_ADDR addr = unpack_pointer (type, valaddr);
 
       print_unpacked_pointer (type, elttype, addr, stream, options);
     }
 }
 
 
-/* generic_val_print helper for TYPE_CODE_MEMBERPTR.  */
-
-static void
-generic_val_print_memberptr (struct type *type, const gdb_byte *valaddr,
-                            int embedded_offset, struct ui_file *stream,
-                            const struct value *original_value,
-                            const struct value_print_options *options)
-{
-  val_print_scalar_formatted (type, valaddr, embedded_offset,
-                             original_value, options, 0, stream);
-}
-
 /* Print '@' followed by the address contained in ADDRESS_BUFFER.  */
 
 static void
@@ -534,12 +511,12 @@ get_value_addr_contents (struct value *deref_val)
     }
 }
 
-/* generic_val_print helper for TYPE_CODE_REF.  */
+/* generic_val_print helper for TYPE_CODE_{RVALUE_,}REF.  */
 
 static void
-generic_val_print_ref (struct type *type, const gdb_byte *valaddr,
+generic_val_print_ref (struct type *type,
                       int embedded_offset, struct ui_file *stream, int recurse,
-                      const struct value *original_value,
+                      struct value *original_value,
                       const struct value_print_options *options)
 {
   struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
@@ -550,7 +527,8 @@ generic_val_print_ref (struct type *type, const gdb_byte *valaddr,
                                    TARGET_CHAR_BIT * TYPE_LENGTH (type));
   const int must_coerce_ref = ((options->addressprint && value_is_synthetic)
                               || options->deref_ref);
-  const int type_is_defined = TYPE_CODE (elttype) != TYPE_CODE_UNDEF;
+  const int type_is_defined = elttype->code () != TYPE_CODE_UNDEF;
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   if (must_coerce_ref && type_is_defined)
     {
@@ -609,7 +587,7 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
   unsigned int i;
   unsigned int len;
 
-  len = TYPE_NFIELDS (type);
+  len = type->num_fields ();
   for (i = 0; i < len; i++)
     {
       QUIT;
@@ -620,40 +598,65 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
     }
   if (i < len)
     {
-      fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+      fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (),
+                   stream);
     }
   else if (TYPE_FLAG_ENUM (type))
     {
       int first = 1;
 
-      /* We have a "flag" enum, so we try to decompose it into
-        pieces as appropriate.  A flag enum has disjoint
-        constants by definition.  */
-      fputs_filtered ("(", stream);
+      /* We have a "flag" enum, so we try to decompose it into pieces as
+        appropriate.  The enum may have multiple enumerators representing
+        the same bit, in which case we choose to only print the first one
+        we find.  */
       for (i = 0; i < len; ++i)
        {
          QUIT;
 
-         if ((val & TYPE_FIELD_ENUMVAL (type, i)) != 0)
+         ULONGEST enumval = TYPE_FIELD_ENUMVAL (type, i);
+         int nbits = count_one_bits_ll (enumval);
+
+         gdb_assert (nbits == 0 || nbits == 1);
+
+         if ((val & enumval) != 0)
            {
-             if (!first)
+             if (first)
+               {
+                 fputs_filtered ("(", stream);
+                 first = 0;
+               }
+             else
                fputs_filtered (" | ", stream);
-             first = 0;
 
              val &= ~TYPE_FIELD_ENUMVAL (type, i);
-             fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+             fputs_styled (TYPE_FIELD_NAME (type, i),
+                           variable_name_style.style (), stream);
            }
        }
 
-      if (first || val != 0)
+      if (val != 0)
        {
-         if (!first)
+         /* There are leftover bits, print them.  */
+         if (first)
+           fputs_filtered ("(", stream);
+         else
            fputs_filtered (" | ", stream);
-         fputs_filtered ("unknown: ", stream);
-         print_longest (stream, 'd', 0, val);
-       }
 
-      fputs_filtered (")", stream);
+         fputs_filtered ("unknown: 0x", stream);
+         print_longest (stream, 'x', 0, val);
+         fputs_filtered (")", stream);
+       }
+      else if (first)
+       {
+         /* Nothing has been printed and the value is 0, the enum value must
+            have been 0.  */
+         fputs_filtered ("0", stream);
+       }
+      else
+       {
+         /* Something has been printed, close the parenthesis.  */
+         fputs_filtered (")", stream);
+       }
     }
   else
     print_longest (stream, 'd', 0, val);
@@ -662,95 +665,67 @@ generic_val_print_enum_1 (struct type *type, LONGEST val,
 /* generic_val_print helper for TYPE_CODE_ENUM.  */
 
 static void
-generic_val_print_enum (struct type *type, const gdb_byte *valaddr,
+generic_val_print_enum (struct type *type,
                        int embedded_offset, struct ui_file *stream,
-                       const struct value *original_value,
+                       struct value *original_value,
                        const struct value_print_options *options)
 {
   LONGEST val;
   struct gdbarch *gdbarch = get_type_arch (type);
   int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
 
-  if (options->format)
-    {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, options, 0, stream);
-      return;
-    }
-  val = unpack_long (type, valaddr + embedded_offset * unit_size);
-
-  generic_val_print_enum_1 (type, val, stream);
-}
+  gdb_assert (!options->format);
 
-/* generic_val_print helper for TYPE_CODE_FLAGS.  */
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
-static void
-generic_val_print_flags (struct type *type, const gdb_byte *valaddr,
-                        int embedded_offset, struct ui_file *stream,
-                        const struct value *original_value,
-                        const struct value_print_options *options)
+  val = unpack_long (type, valaddr + embedded_offset * unit_size);
 
-{
-  if (options->format)
-    val_print_scalar_formatted (type, valaddr, embedded_offset, original_value,
-                               options, 0, stream);
-  else
-    val_print_type_code_flags (type, valaddr + embedded_offset, stream);
+  generic_val_print_enum_1 (type, val, stream);
 }
 
 /* generic_val_print helper for TYPE_CODE_FUNC and TYPE_CODE_METHOD.  */
 
 static void
-generic_val_print_func (struct type *type, const gdb_byte *valaddr,
+generic_val_print_func (struct type *type,
                        int embedded_offset, CORE_ADDR address,
                        struct ui_file *stream,
-                       const struct value *original_value,
+                       struct value *original_value,
                        const struct value_print_options *options)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
 
-  if (options->format)
-    {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, options, 0, stream);
-    }
-  else
-    {
-      /* FIXME, we should consider, at least for ANSI C language,
-         eliminating the distinction made between FUNCs and POINTERs
-         to FUNCs.  */
-      fprintf_filtered (stream, "{");
-      type_print (type, "", stream, -1);
-      fprintf_filtered (stream, "} ");
-      /* Try to print what function it points to, and its address.  */
-      print_address_demangle (options, gdbarch, address, stream, demangle);
-    }
+  gdb_assert (!options->format);
+
+  /* FIXME, we should consider, at least for ANSI C language,
+     eliminating the distinction made between FUNCs and POINTERs to
+     FUNCs.  */
+  fprintf_filtered (stream, "{");
+  type_print (type, "", stream, -1);
+  fprintf_filtered (stream, "} ");
+  /* Try to print what function it points to, and its address.  */
+  print_address_demangle (options, gdbarch, address, stream, demangle);
 }
 
-/* generic_val_print helper for TYPE_CODE_BOOL.  */
+/* generic_value_print helper for TYPE_CODE_BOOL.  */
 
 static void
-generic_val_print_bool (struct type *type, const gdb_byte *valaddr,
-                       int embedded_offset, struct ui_file *stream,
-                       const struct value *original_value,
-                       const struct value_print_options *options,
-                       const struct generic_val_print_decorations *decorations)
+generic_value_print_bool
+  (struct value *value, struct ui_file *stream,
+   const struct value_print_options *options,
+   const struct generic_val_print_decorations *decorations)
 {
-  LONGEST val;
-  struct gdbarch *gdbarch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
-
   if (options->format || options->output_format)
     {
       struct value_print_options opts = *options;
       opts.format = (options->format ? options->format
                     : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, &opts, 0, stream);
+      value_print_scalar_formatted (value, &opts, 0, stream);
     }
   else
     {
-      val = unpack_long (type, valaddr + embedded_offset * unit_size);
+      const gdb_byte *valaddr = value_contents_for_printing (value);
+      struct type *type = check_typedef (value_type (value));
+      LONGEST val = unpack_long (type, valaddr);
       if (val == 0)
        fputs_filtered (decorations->false_name, stream);
       else if (val == 1)
@@ -760,56 +735,40 @@ generic_val_print_bool (struct type *type, const gdb_byte *valaddr,
     }
 }
 
-/* generic_val_print helper for TYPE_CODE_INT.  */
+/* generic_value_print helper for TYPE_CODE_INT.  */
 
 static void
-generic_val_print_int (struct type *type, const gdb_byte *valaddr,
-                      int embedded_offset, struct ui_file *stream,
-                      const struct value *original_value,
-                      const struct value_print_options *options)
+generic_value_print_int (struct value *val, struct ui_file *stream,
+                        const struct value_print_options *options)
 {
-  struct gdbarch *gdbarch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
+  struct value_print_options opts = *options;
 
-  if (options->format || options->output_format)
-    {
-      struct value_print_options opts = *options;
-
-      opts.format = (options->format ? options->format
-                    : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, &opts, 0, stream);
-    }
-  else
-    val_print_type_code_int (type, valaddr + embedded_offset * unit_size,
-                            stream);
+  opts.format = (options->format ? options->format
+                : options->output_format);
+  value_print_scalar_formatted (val, &opts, 0, stream);
 }
 
-/* generic_val_print helper for TYPE_CODE_CHAR.  */
+/* generic_value_print helper for TYPE_CODE_CHAR.  */
 
 static void
-generic_val_print_char (struct type *type, struct type *unresolved_type,
-                       const gdb_byte *valaddr, int embedded_offset,
-                       struct ui_file *stream,
-                       const struct value *original_value,
-                       const struct value_print_options *options)
+generic_value_print_char (struct value *value, struct ui_file *stream,
+                         const struct value_print_options *options)
 {
-  LONGEST val;
-  struct gdbarch *gdbarch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
-
   if (options->format || options->output_format)
     {
       struct value_print_options opts = *options;
 
       opts.format = (options->format ? options->format
                     : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, &opts, 0, stream);
+      value_print_scalar_formatted (value, &opts, 0, stream);
     }
   else
     {
-      val = unpack_long (type, valaddr + embedded_offset * unit_size);
+      struct type *unresolved_type = value_type (value);
+      struct type *type = check_typedef (unresolved_type);
+      const gdb_byte *valaddr = value_contents_for_printing (value);
+
+      LONGEST val = unpack_long (type, valaddr);
       if (TYPE_UNSIGNED (type))
        fprintf_filtered (stream, "%u", (unsigned int) val);
       else
@@ -819,144 +778,98 @@ generic_val_print_char (struct type *type, struct type *unresolved_type,
     }
 }
 
-/* generic_val_print helper for TYPE_CODE_FLT.  */
+/* generic_val_print helper for TYPE_CODE_FLT and TYPE_CODE_DECFLOAT.  */
 
 static void
-generic_val_print_float (struct type *type, const gdb_byte *valaddr,
+generic_val_print_float (struct type *type,
                         int embedded_offset, struct ui_file *stream,
-                        const struct value *original_value,
+                        struct value *original_value,
                         const struct value_print_options *options)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
   int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
 
-  if (options->format)
-    {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
-                                 original_value, options, 0, stream);
-    }
-  else
-    {
-      print_floating (valaddr + embedded_offset * unit_size, type, stream);
-    }
-}
+  gdb_assert (!options->format);
 
-/* generic_val_print helper for TYPE_CODE_DECFLOAT.  */
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
-static void
-generic_val_print_decfloat (struct type *type, const gdb_byte *valaddr,
-                           int embedded_offset, struct ui_file *stream,
-                           const struct value *original_value,
-                           const struct value_print_options *options)
-{
-  struct gdbarch *gdbarch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
-
-  if (options->format)
-    val_print_scalar_formatted (type, valaddr, embedded_offset, original_value,
-                               options, 0, stream);
-  else
-    print_decimal_floating (valaddr + embedded_offset * unit_size, type,
-                           stream);
+  print_floating (valaddr + embedded_offset * unit_size, type, stream);
 }
 
-/* generic_val_print helper for TYPE_CODE_COMPLEX.  */
+/* generic_value_print helper for TYPE_CODE_COMPLEX.  */
 
 static void
-generic_val_print_complex (struct type *type, const gdb_byte *valaddr,
-                          int embedded_offset, struct ui_file *stream,
-                          const struct value *original_value,
-                          const struct value_print_options *options,
-                          const struct generic_val_print_decorations
-                            *decorations)
+generic_value_print_complex (struct value *val, struct ui_file *stream,
+                            const struct value_print_options *options,
+                            const struct generic_val_print_decorations
+                              *decorations)
 {
-  struct gdbarch *gdbarch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
-
   fprintf_filtered (stream, "%s", decorations->complex_prefix);
-  if (options->format)
-    val_print_scalar_formatted (TYPE_TARGET_TYPE (type), valaddr,
-                               embedded_offset, original_value, options, 0,
-                               stream);
-  else
-    print_floating (valaddr + embedded_offset * unit_size,
-                   TYPE_TARGET_TYPE (type), stream);
+
+  struct value *real_part = value_real_part (val);
+  value_print_scalar_formatted (real_part, options, 0, stream);
   fprintf_filtered (stream, "%s", decorations->complex_infix);
-  if (options->format)
-    val_print_scalar_formatted (TYPE_TARGET_TYPE (type), valaddr,
-                               embedded_offset
-                               + type_length_units (TYPE_TARGET_TYPE (type)),
-                               original_value, options, 0, stream);
-  else
-    print_floating (valaddr + embedded_offset * unit_size
-                   + TYPE_LENGTH (TYPE_TARGET_TYPE (type)),
-                   TYPE_TARGET_TYPE (type), stream);
+
+  struct value *imag_part = value_imaginary_part (val);
+  value_print_scalar_formatted (imag_part, options, 0, stream);
   fprintf_filtered (stream, "%s", decorations->complex_suffix);
 }
 
-/* A generic val_print that is suitable for use by language
-   implementations of the la_val_print method.  This function can
-   handle most type codes, though not all, notably exception
-   TYPE_CODE_UNION and TYPE_CODE_STRUCT, which must be implemented by
-   the caller.
-   
-   Most arguments are as to val_print.
-   
-   The additional DECORATIONS argument can be used to customize the
-   output in some small, language-specific ways.  */
+/* See valprint.h.  */
 
 void
-generic_val_print (struct type *type, const gdb_byte *valaddr,
-                  int embedded_offset, CORE_ADDR address,
-                  struct ui_file *stream, int recurse,
-                  const struct value *original_value,
-                  const struct value_print_options *options,
-                  const struct generic_val_print_decorations *decorations)
+generic_value_print (struct value *val, struct ui_file *stream, int recurse,
+                    const struct value_print_options *options,
+                    const struct generic_val_print_decorations *decorations)
 {
-  struct type *unresolved_type = type;
+  struct type *type = value_type (val);
 
   type = check_typedef (type);
-  switch (TYPE_CODE (type))
+  switch (type->code ())
     {
     case TYPE_CODE_ARRAY:
-      generic_val_print_array (type, valaddr, embedded_offset, address, stream,
-                              recurse, original_value, options, decorations);
+      generic_val_print_array (val, stream, recurse, options, decorations);
       break;
 
     case TYPE_CODE_MEMBERPTR:
-      generic_val_print_memberptr (type, valaddr, embedded_offset, stream,
-                                  original_value, options);
+      value_print_scalar_formatted (val, options, 0, stream);
       break;
 
     case TYPE_CODE_PTR:
-      generic_val_print_ptr (type, valaddr, embedded_offset, stream,
-                            original_value, options);
+      generic_value_print_ptr (val, stream, options);
       break;
 
     case TYPE_CODE_REF:
-      generic_val_print_ref (type, valaddr, embedded_offset, stream, recurse,
-                            original_value, options);
+    case TYPE_CODE_RVALUE_REF:
+      generic_val_print_ref (type, 0, stream, recurse,
+                            val, options);
       break;
 
     case TYPE_CODE_ENUM:
-      generic_val_print_enum (type, valaddr, embedded_offset, stream,
-                             original_value, options);
+      if (options->format)
+       value_print_scalar_formatted (val, options, 0, stream);
+      else
+       generic_val_print_enum (type, 0, stream, val, options);
       break;
 
     case TYPE_CODE_FLAGS:
-      generic_val_print_flags (type, valaddr, embedded_offset, stream,
-                              original_value, options);
+      if (options->format)
+       value_print_scalar_formatted (val, options, 0, stream);
+      else
+       val_print_type_code_flags (type, val, 0, stream);
       break;
 
     case TYPE_CODE_FUNC:
     case TYPE_CODE_METHOD:
-      generic_val_print_func (type, valaddr, embedded_offset, address, stream,
-                             original_value, options);
+      if (options->format)
+       value_print_scalar_formatted (val, options, 0, stream);
+      else
+       generic_val_print_func (type, 0, value_address (val), stream,
+                               val, options);
       break;
 
     case TYPE_CODE_BOOL:
-      generic_val_print_bool (type, valaddr, embedded_offset, stream,
-                             original_value, options, decorations);
+      generic_value_print_bool (val, stream, options, decorations);
       break;
 
     case TYPE_CODE_RANGE:
@@ -971,23 +884,20 @@ generic_val_print (struct type *type, const gdb_byte *valaddr,
       /* FALLTHROUGH */
 
     case TYPE_CODE_INT:
-      generic_val_print_int (type, valaddr, embedded_offset, stream,
-                            original_value, options);
+      generic_value_print_int (val, stream, options);
       break;
 
     case TYPE_CODE_CHAR:
-      generic_val_print_char (type, unresolved_type, valaddr, embedded_offset,
-                             stream, original_value, options);
+      generic_value_print_char (val, stream, options);
       break;
 
     case TYPE_CODE_FLT:
-      generic_val_print_float (type, valaddr, embedded_offset, stream,
-                              original_value, options);
-      break;
-
     case TYPE_CODE_DECFLOAT:
-      generic_val_print_decfloat (type, valaddr, embedded_offset, stream,
-                                 original_value, options);
+      if (options->format)
+       value_print_scalar_formatted (val, options, 0, stream);
+      else
+       generic_val_print_float (type, 0, stream,
+                                val, options);
       break;
 
     case TYPE_CODE_VOID:
@@ -1002,12 +912,11 @@ generic_val_print (struct type *type, const gdb_byte *valaddr,
       /* This happens (without TYPE_STUB set) on systems which don't use
          dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
          and no complete type for struct foo in that file.  */
-      fprintf_filtered (stream, _("<incomplete type>"));
+      fprintf_styled (stream, metadata_style.style (), _("<incomplete type>"));
       break;
 
     case TYPE_CODE_COMPLEX:
-      generic_val_print_complex (type, valaddr, embedded_offset, stream,
-                                original_value, options, decorations);
+      generic_value_print_complex (val, stream, options, decorations);
       break;
 
     case TYPE_CODE_UNION:
@@ -1015,40 +924,22 @@ generic_val_print (struct type *type, const gdb_byte *valaddr,
     case TYPE_CODE_METHODPTR:
     default:
       error (_("Unhandled type code %d in symbol table."),
-            TYPE_CODE (type));
+            type->code ());
     }
-  gdb_flush (stream);
 }
 
-/* Print using the given LANGUAGE the data of type TYPE located at
-   VALADDR + EMBEDDED_OFFSET (within GDB), which came from the
-   inferior at address ADDRESS + EMBEDDED_OFFSET, onto stdio stream
-   STREAM according to OPTIONS.  VAL is the whole object that came
-   from ADDRESS.  VALADDR must point to the head of VAL's contents
-   buffer.
-
-   The language printers will pass down an adjusted EMBEDDED_OFFSET to
-   further helper subroutines as subfields of TYPE are printed.  In
-   such cases, VALADDR is passed down unadjusted, as well as VAL, so
-   that VAL can be queried for metadata about the contents data being
-   printed, using EMBEDDED_OFFSET as an offset into VAL's contents
-   buffer.  For example: "has this field been optimized out", or "I'm
-   printing an object while inspecting a traceframe; has this
-   particular piece of data been collected?".
-
-   RECURSE indicates the amount of indentation to supply before
-   continuation lines; this amount is roughly twice the value of
-   RECURSE.  */
+/* Helper function for val_print and common_val_print that does the
+   work.  Arguments are as to val_print, but FULL_VALUE, if given, is
+   the value to be printed.  */
 
-void
-val_print (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset,
-          CORE_ADDR address, struct ui_file *stream, int recurse,
-          const struct value *val,
-          const struct value_print_options *options,
-          const struct language_defn *language)
+static void
+do_val_print (struct value *value, struct ui_file *stream, int recurse,
+             const struct value_print_options *options,
+             const struct language_defn *language)
 {
   int ret = 0;
   struct value_print_options local_opts = *options;
+  struct type *type = value_type (value);
   struct type *real_type = check_typedef (type);
 
   if (local_opts.prettyformat == Val_prettyformat_default)
@@ -1063,19 +954,17 @@ val_print (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset,
 
   if (TYPE_STUB (real_type))
     {
-      fprintf_filtered (stream, _("<incomplete type>"));
-      gdb_flush (stream);
+      fprintf_styled (stream, metadata_style.style (), _("<incomplete type>"));
       return;
     }
 
-  if (!valprint_check_validity (stream, real_type, embedded_offset, val))
+  if (!valprint_check_validity (stream, real_type, 0, value))
     return;
 
   if (!options->raw)
     {
-      ret = apply_ext_lang_val_pretty_printer (type, valaddr, embedded_offset,
-                                              address, stream, recurse,
-                                              val, options, language);
+      ret = apply_ext_lang_val_pretty_printer (value, stream, recurse, options,
+                                              language);
       if (ret)
        return;
     }
@@ -1088,17 +977,37 @@ val_print (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset,
       return;
     }
 
-  TRY
+  /* If this value is too deep then don't print it.  */
+  if (!val_print_scalar_or_string_type_p (type, language)
+      && val_print_check_max_depth (stream, recurse, options, language))
+    return;
+
+  try
     {
-      language->la_val_print (type, valaddr, embedded_offset, address,
-                             stream, recurse, val,
-                             &local_opts);
+      language->la_value_print_inner (value, stream, recurse, &local_opts);
     }
-  CATCH (except, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &except)
     {
-      fprintf_filtered (stream, _("<error reading variable>"));
+      fprintf_styled (stream, metadata_style.style (),
+                     _("<error reading variable>"));
     }
-  END_CATCH
+}
+
+/* See valprint.h.  */
+
+bool
+val_print_check_max_depth (struct ui_file *stream, int recurse,
+                          const struct value_print_options *options,
+                          const struct language_defn *language)
+{
+  if (options->max_depth > -1 && recurse >= options->max_depth)
+    {
+      gdb_assert (language->la_struct_too_deep_ellipsis != NULL);
+      fputs_filtered (language->la_struct_too_deep_ellipsis, stream);
+      return true;
+    }
+
+  return false;
 }
 
 /* Check whether the value VAL is printable.  Return 1 if it is;
@@ -1111,7 +1020,8 @@ value_check_printable (struct value *val, struct ui_file *stream,
 {
   if (val == 0)
     {
-      fprintf_filtered (stream, _("<address of value unknown>"));
+      fprintf_styled (stream, metadata_style.style (),
+                     _("<address of value unknown>"));
       return 0;
     }
 
@@ -1133,10 +1043,11 @@ value_check_printable (struct value *val, struct ui_file *stream,
       return 0;
     }
 
-  if (TYPE_CODE (value_type (val)) == TYPE_CODE_INTERNAL_FUNCTION)
+  if (value_type (val)->code () == TYPE_CODE_INTERNAL_FUNCTION)
     {
-      fprintf_filtered (stream, _("<internal function %s>"),
-                       value_internal_function_name (val));
+      fprintf_styled (stream, metadata_style.style (),
+                     _("<internal function %s>"),
+                     value_internal_function_name (val));
       return 0;
     }
 
@@ -1166,9 +1077,6 @@ common_val_print (struct value *val, struct ui_file *stream, int recurse,
                  const struct value_print_options *options,
                  const struct language_defn *language)
 {
-  if (!value_check_printable (val, stream, options))
-    return;
-
   if (language->la_language == language_ada)
     /* The value might have a dynamic type, which would cause trouble
        below when trying to extract the value contents (since the value
@@ -1176,10 +1084,23 @@ common_val_print (struct value *val, struct ui_file *stream, int recurse,
        get a fixed representation of our value.  */
     val = ada_to_fixed_value (val);
 
-  val_print (value_type (val), value_contents_for_printing (val),
-            value_embedded_offset (val), value_address (val),
-            stream, recurse,
-            val, options, language);
+  if (value_lazy (val))
+    value_fetch_lazy (val);
+
+  do_val_print (val, stream, recurse, options, language);
+}
+
+/* See valprint.h.  */
+
+void
+common_val_print_checked (struct value *val, struct ui_file *stream,
+                         int recurse,
+                         const struct value_print_options *options,
+                         const struct language_defn *language)
+{
+  if (!value_check_printable (val, stream, options))
+    return;
+  common_val_print (val, stream, recurse, options, language);
 }
 
 /* Print on stream STREAM the value VAL according to OPTIONS.  The value
@@ -1189,18 +1110,16 @@ void
 value_print (struct value *val, struct ui_file *stream,
             const struct value_print_options *options)
 {
+  scoped_value_mark free_values;
+
   if (!value_check_printable (val, stream, options))
     return;
 
   if (!options->raw)
     {
       int r
-       = apply_ext_lang_val_pretty_printer (value_type (val),
-                                            value_contents_for_printing (val),
-                                            value_embedded_offset (val),
-                                            value_address (val),
-                                            stream, 0,
-                                            val, options, current_language);
+       = apply_ext_lang_val_pretty_printer (val, stream, 0, options,
+                                            current_language);
 
       if (r)
        return;
@@ -1209,49 +1128,14 @@ value_print (struct value *val, struct ui_file *stream,
   LA_VALUE_PRINT (val, stream, options);
 }
 
-/* Called by various <lang>_val_print routines to print
-   TYPE_CODE_INT's.  TYPE is the type.  VALADDR is the address of the
-   value.  STREAM is where to print the value.  */
-
-void
-val_print_type_code_int (struct type *type, const gdb_byte *valaddr,
-                        struct ui_file *stream)
-{
-  enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
-
-  if (TYPE_LENGTH (type) > sizeof (LONGEST))
-    {
-      LONGEST val;
-
-      if (TYPE_UNSIGNED (type)
-         && extract_long_unsigned_integer (valaddr, TYPE_LENGTH (type),
-                                           byte_order, &val))
-       {
-         print_longest (stream, 'u', 0, val);
-       }
-      else
-       {
-         /* Signed, or we couldn't turn an unsigned value into a
-            LONGEST.  For signed values, one could assume two's
-            complement (a reasonable assumption, I think) and do
-            better than this.  */
-         print_hex_chars (stream, (unsigned char *) valaddr,
-                          TYPE_LENGTH (type), byte_order);
-       }
-    }
-  else
-    {
-      print_longest (stream, TYPE_UNSIGNED (type) ? 'u' : 'd', 0,
-                    unpack_long (type, valaddr));
-    }
-}
-
 static void
-val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
-                          struct ui_file *stream)
+val_print_type_code_flags (struct type *type, struct value *original_value,
+                          int embedded_offset, struct ui_file *stream)
 {
+  const gdb_byte *valaddr = (value_contents_for_printing (original_value)
+                            + embedded_offset);
   ULONGEST val = unpack_long (type, valaddr);
-  int field, nfields = TYPE_NFIELDS (type);
+  int field, nfields = type->num_fields ();
   struct gdbarch *gdbarch = get_type_arch (type);
   struct type *bool_type = builtin_type (gdbarch)->builtin_bool;
 
@@ -1270,8 +1154,10 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
              && TYPE_FIELD_BITSIZE (type, field) == 1)
            {
              if (val & ((ULONGEST)1 << TYPE_FIELD_BITPOS (type, field)))
-               fprintf_filtered (stream, " %s",
-                                 TYPE_FIELD_NAME (type, field));
+               fprintf_filtered
+                 (stream, " %ps",
+                  styled_string (variable_name_style.style (),
+                                 TYPE_FIELD_NAME (type, field)));
            }
          else
            {
@@ -1281,9 +1167,10 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
 
              if (field_len < sizeof (ULONGEST) * TARGET_CHAR_BIT)
                field_val &= ((ULONGEST) 1 << field_len) - 1;
-             fprintf_filtered (stream, " %s=",
-                               TYPE_FIELD_NAME (type, field));
-             if (TYPE_CODE (field_type) == TYPE_CODE_ENUM)
+             fprintf_filtered (stream, " %ps=",
+                               styled_string (variable_name_style.style (),
+                                              TYPE_FIELD_NAME (type, field)));
+             if (field_type->code () == TYPE_CODE_ENUM)
                generic_val_print_enum_1 (field_type, field_val, stream);
              else
                print_longest (stream, 'd', 0, field_val);
@@ -1293,26 +1180,17 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
   fputs_filtered (" ]", stream);
 }
 
-/* Print a scalar of data of type TYPE, pointed to in GDB by VALADDR,
-   according to OPTIONS and SIZE on STREAM.  Format i is not supported
-   at this level.
-
-   This is how the elements of an array or structure are printed
-   with a format.  */
+/* See valprint.h.  */
 
 void
-val_print_scalar_formatted (struct type *type,
-                           const gdb_byte *valaddr, LONGEST embedded_offset,
-                           const struct value *val,
-                           const struct value_print_options *options,
-                           int size,
-                           struct ui_file *stream)
+value_print_scalar_formatted (struct value *val,
+                             const struct value_print_options *options,
+                             int size,
+                             struct ui_file *stream)
 {
-  struct gdbarch *arch = get_type_arch (type);
-  int unit_size = gdbarch_addressable_memory_unit_size (arch);
+  struct type *type = check_typedef (value_type (val));
 
   gdb_assert (val != NULL);
-  gdb_assert (valaddr == value_contents_for_printing_const (val));
 
   /* If we get here with a string format, try again without it.  Go
      all the way back to the language printers, which may call us
@@ -1322,22 +1200,24 @@ val_print_scalar_formatted (struct type *type,
       struct value_print_options opts = *options;
       opts.format = 0;
       opts.deref_ref = 0;
-      val_print (type, valaddr, embedded_offset, 0, stream, 0, val, &opts,
-                current_language);
+      common_val_print (val, stream, 0, &opts, current_language);
       return;
     }
 
+  /* value_contents_for_printing fetches all VAL's contents.  They are
+     needed to check whether VAL is optimized-out or unavailable
+     below.  */
+  const gdb_byte *valaddr = value_contents_for_printing (val);
+
   /* A scalar object that does not have all bits available can't be
      printed, because all bits contribute to its representation.  */
-  if (value_bits_any_optimized_out (val,
-                                   TARGET_CHAR_BIT * embedded_offset,
+  if (value_bits_any_optimized_out (val, 0,
                                    TARGET_CHAR_BIT * TYPE_LENGTH (type)))
     val_print_optimized_out (val, stream);
-  else if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type)))
+  else if (!value_bytes_available (val, 0, TYPE_LENGTH (type)))
     val_print_unavailable (stream);
   else
-    print_scalar_formatted (valaddr + embedded_offset * unit_size, type,
-                           options, size, stream);
+    print_scalar_formatted (valaddr, type, options, size, stream);
 }
 
 /* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g.
@@ -1351,7 +1231,7 @@ val_print_scalar_formatted (struct type *type,
    (leading 0 or 0x). 
    
    Hilfinger/2004-09-09: USE_C_FORMAT was originally called USE_LOCAL
-   and was intended to request formating according to the current
+   and was intended to request formatting according to the current
    language and would be used for most integers that GDB prints.  The
    exceptional cases were things like protocols where the format of
    the integer is a protocol thing, not a user-visible thing).  The
@@ -1414,113 +1294,31 @@ longest_to_int (LONGEST arg)
   return (rtnval);
 }
 
-/* Print a floating point value of type TYPE (not always a
-   TYPE_CODE_FLT), pointed to in GDB by VALADDR, on STREAM.  */
+/* Print a floating point value of floating-point type TYPE,
+   pointed to in GDB by VALADDR, on STREAM.  */
 
 void
 print_floating (const gdb_byte *valaddr, struct type *type,
                struct ui_file *stream)
 {
-  DOUBLEST doub;
-  int inv;
-  const struct floatformat *fmt = NULL;
-  unsigned len = TYPE_LENGTH (type);
-  enum float_kind kind;
-
-  /* If it is a floating-point, check for obvious problems.  */
-  if (TYPE_CODE (type) == TYPE_CODE_FLT)
-    fmt = floatformat_from_type (type);
-  if (fmt != NULL)
-    {
-      kind = floatformat_classify (fmt, valaddr);
-      if (kind == float_nan)
-       {
-         if (floatformat_is_negative (fmt, valaddr))
-           fprintf_filtered (stream, "-");
-         fprintf_filtered (stream, "nan(");
-         fputs_filtered ("0x", stream);
-         fputs_filtered (floatformat_mantissa (fmt, valaddr), stream);
-         fprintf_filtered (stream, ")");
-         return;
-       }
-      else if (kind == float_infinite)
-       {
-         if (floatformat_is_negative (fmt, valaddr))
-           fputs_filtered ("-", stream);
-         fputs_filtered ("inf", stream);
-         return;
-       }
-    }
-
-  /* NOTE: cagney/2002-01-15: The TYPE passed into print_floating()
-     isn't necessarily a TYPE_CODE_FLT.  Consequently, unpack_double
-     needs to be used as that takes care of any necessary type
-     conversions.  Such conversions are of course direct to DOUBLEST
-     and disregard any possible target floating point limitations.
-     For instance, a u64 would be converted and displayed exactly on a
-     host with 80 bit DOUBLEST but with loss of information on a host
-     with 64 bit DOUBLEST.  */
-
-  doub = unpack_double (type, valaddr, &inv);
-  if (inv)
-    {
-      fprintf_filtered (stream, "<invalid float value>");
-      return;
-    }
-
-  /* FIXME: kettenis/2001-01-20: The following code makes too much
-     assumptions about the host and target floating point format.  */
-
-  /* NOTE: cagney/2002-02-03: Since the TYPE of what was passed in may
-     not necessarily be a TYPE_CODE_FLT, the below ignores that and
-     instead uses the type's length to determine the precision of the
-     floating-point value being printed.  */
-
-  if (len < sizeof (double))
-      fprintf_filtered (stream, "%.9g", (double) doub);
-  else if (len == sizeof (double))
-      fprintf_filtered (stream, "%.17g", (double) doub);
-  else
-#ifdef PRINTF_HAS_LONG_DOUBLE
-    fprintf_filtered (stream, "%.35Lg", doub);
-#else
-    /* This at least wins with values that are representable as
-       doubles.  */
-    fprintf_filtered (stream, "%.17g", (double) doub);
-#endif
-}
-
-void
-print_decimal_floating (const gdb_byte *valaddr, struct type *type,
-                       struct ui_file *stream)
-{
-  enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
-  char decstr[MAX_DECIMAL_STRING];
-  unsigned len = TYPE_LENGTH (type);
-
-  decimal_to_string (valaddr, len, byte_order, decstr);
-  fputs_filtered (decstr, stream);
-  return;
+  std::string str = target_float_to_string (valaddr, type);
+  fputs_filtered (str.c_str (), stream);
 }
 
 void
 print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
-                   unsigned len, enum bfd_endian byte_order)
+                   unsigned len, enum bfd_endian byte_order, bool zero_pad)
 {
-
-#define BITS_IN_BYTES 8
-
   const gdb_byte *p;
   unsigned int i;
   int b;
+  bool seen_a_one = false;
 
   /* Declared "int" so it will be signed.
      This ensures that right shift will shift in zeros.  */
 
   const int mask = 0x080;
 
-  /* FIXME: We should be not printing leading zeroes in most cases.  */
-
   if (byte_order == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
@@ -1530,14 +1328,17 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
          /* Every byte has 8 binary characters; peel off
             and print from the MSB end.  */
 
-         for (i = 0; i < (BITS_IN_BYTES * sizeof (*p)); i++)
+         for (i = 0; i < (HOST_CHAR_BIT * sizeof (*p)); i++)
            {
              if (*p & (mask >> i))
-               b = 1;
+               b = '1';
              else
-               b = 0;
+               b = '0';
 
-             fprintf_filtered (stream, "%1d", b);
+             if (zero_pad || seen_a_one || b == '1')
+               fputc_filtered (b, stream);
+             if (b == '1')
+               seen_a_one = true;
            }
        }
     }
@@ -1547,17 +1348,37 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
           p >= valaddr;
           p--)
        {
-         for (i = 0; i < (BITS_IN_BYTES * sizeof (*p)); i++)
+         for (i = 0; i < (HOST_CHAR_BIT * sizeof (*p)); i++)
            {
              if (*p & (mask >> i))
-               b = 1;
+               b = '1';
              else
-               b = 0;
+               b = '0';
 
-             fprintf_filtered (stream, "%1d", b);
+             if (zero_pad || seen_a_one || b == '1')
+               fputc_filtered (b, stream);
+             if (b == '1')
+               seen_a_one = true;
            }
        }
     }
+
+  /* When not zero-padding, ensure that something is printed when the
+     input is 0.  */
+  if (!zero_pad && !seen_a_one)
+    fputc_filtered ('0', stream);
+}
+
+/* A helper for print_octal_chars that emits a single octal digit,
+   optionally suppressing it if is zero and updating SEEN_A_ONE.  */
+
+static void
+emit_octal_digit (struct ui_file *stream, bool *seen_a_one, int digit)
+{
+  if (*seen_a_one || digit != 0)
+    fprintf_filtered (stream, "%o", digit);
+  if (digit != 0)
+    *seen_a_one = true;
 }
 
 /* VALADDR points to an integer of LEN bytes.
@@ -1571,9 +1392,6 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
   unsigned char octa1, octa2, octa3, carry;
   int cycle;
 
-  /* FIXME: We should be not printing leading zeroes in most cases.  */
-
-
   /* Octal is 3 bits, which doesn't fit.  Yuk.  So we have to track
    * the extra bits, which cycle every three bytes:
    *
@@ -1591,23 +1409,30 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
    */
 #define BITS_IN_OCTAL 3
 #define HIGH_ZERO     0340
-#define LOW_ZERO      0016
+#define LOW_ZERO      0034
 #define CARRY_ZERO    0003
+  static_assert (HIGH_ZERO + LOW_ZERO + CARRY_ZERO == 0xff,
+                "cycle zero constants are wrong");
 #define HIGH_ONE      0200
 #define MID_ONE       0160
 #define LOW_ONE       0016
 #define CARRY_ONE     0001
+  static_assert (HIGH_ONE + MID_ONE + LOW_ONE + CARRY_ONE == 0xff,
+                "cycle one constants are wrong");
 #define HIGH_TWO      0300
 #define MID_TWO       0070
 #define LOW_TWO       0007
+  static_assert (HIGH_TWO + MID_TWO + LOW_TWO == 0xff,
+                "cycle two constants are wrong");
 
   /* For 32 we start in cycle 2, with two bits and one bit carry;
      for 64 in cycle in cycle 1, with one bit and a two bit carry.  */
 
-  cycle = (len * BITS_IN_BYTES) % BITS_IN_OCTAL;
+  cycle = (len * HOST_CHAR_BIT) % BITS_IN_OCTAL;
   carry = 0;
 
   fputs_filtered ("0", stream);
+  bool seen_a_one = false;
   if (byte_order == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
@@ -1622,8 +1447,8 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
              octa1 = (HIGH_ZERO & *p) >> 5;
              octa2 = (LOW_ZERO & *p) >> 2;
              carry = (CARRY_ZERO & *p);
-             fprintf_filtered (stream, "%o", octa1);
-             fprintf_filtered (stream, "%o", octa2);
+             emit_octal_digit (stream, &seen_a_one, octa1);
+             emit_octal_digit (stream, &seen_a_one, octa2);
              break;
 
            case 1:
@@ -1633,9 +1458,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
              octa2 = (MID_ONE & *p) >> 4;
              octa3 = (LOW_ONE & *p) >> 1;
              carry = (CARRY_ONE & *p);
-             fprintf_filtered (stream, "%o", octa1);
-             fprintf_filtered (stream, "%o", octa2);
-             fprintf_filtered (stream, "%o", octa3);
+             emit_octal_digit (stream, &seen_a_one, octa1);
+             emit_octal_digit (stream, &seen_a_one, octa2);
+             emit_octal_digit (stream, &seen_a_one, octa3);
              break;
 
            case 2:
@@ -1645,9 +1470,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
              octa2 = (MID_TWO & *p) >> 3;
              octa3 = (LOW_TWO & *p);
              carry = 0;
-             fprintf_filtered (stream, "%o", octa1);
-             fprintf_filtered (stream, "%o", octa2);
-             fprintf_filtered (stream, "%o", octa3);
+             emit_octal_digit (stream, &seen_a_one, octa1);
+             emit_octal_digit (stream, &seen_a_one, octa2);
+             emit_octal_digit (stream, &seen_a_one, octa3);
              break;
 
            default:
@@ -1672,8 +1497,8 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
              octa1 = (HIGH_ZERO & *p) >> 5;
              octa2 = (LOW_ZERO & *p) >> 2;
              carry = (CARRY_ZERO & *p);
-             fprintf_filtered (stream, "%o", octa1);
-             fprintf_filtered (stream, "%o", octa2);
+             emit_octal_digit (stream, &seen_a_one, octa1);
+             emit_octal_digit (stream, &seen_a_one, octa2);
              break;
 
            case 1:
@@ -1683,9 +1508,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
              octa2 = (MID_ONE & *p) >> 4;
              octa3 = (LOW_ONE & *p) >> 1;
              carry = (CARRY_ONE & *p);
-             fprintf_filtered (stream, "%o", octa1);
-             fprintf_filtered (stream, "%o", octa2);
-             fprintf_filtered (stream, "%o", octa3);
+             emit_octal_digit (stream, &seen_a_one, octa1);
+             emit_octal_digit (stream, &seen_a_one, octa2);
+             emit_octal_digit (stream, &seen_a_one, octa3);
              break;
 
            case 2:
@@ -1695,9 +1520,9 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
              octa2 = (MID_TWO & *p) >> 3;
              octa3 = (LOW_TWO & *p);
              carry = 0;
-             fprintf_filtered (stream, "%o", octa1);
-             fprintf_filtered (stream, "%o", octa2);
-             fprintf_filtered (stream, "%o", octa3);
+             emit_octal_digit (stream, &seen_a_one, octa1);
+             emit_octal_digit (stream, &seen_a_one, octa2);
+             emit_octal_digit (stream, &seen_a_one, octa3);
              break;
 
            default:
@@ -1711,12 +1536,59 @@ print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
 
 }
 
+/* Possibly negate the integer represented by BYTES.  It contains LEN
+   bytes in the specified byte order.  If the integer is negative,
+   copy it into OUT_VEC, negate it, and return true.  Otherwise, do
+   nothing and return false.  */
+
+static bool
+maybe_negate_by_bytes (const gdb_byte *bytes, unsigned len,
+                      enum bfd_endian byte_order,
+                      gdb::byte_vector *out_vec)
+{
+  gdb_byte sign_byte;
+  gdb_assert (len > 0);
+  if (byte_order == BFD_ENDIAN_BIG)
+    sign_byte = bytes[0];
+  else
+    sign_byte = bytes[len - 1];
+  if ((sign_byte & 0x80) == 0)
+    return false;
+
+  out_vec->resize (len);
+
+  /* Compute -x == 1 + ~x.  */
+  if (byte_order == BFD_ENDIAN_LITTLE)
+    {
+      unsigned carry = 1;
+      for (unsigned i = 0; i < len; ++i)
+       {
+         unsigned tem = (0xff & ~bytes[i]) + carry;
+         (*out_vec)[i] = tem & 0xff;
+         carry = tem / 256;
+       }
+    }
+  else
+    {
+      unsigned carry = 1;
+      for (unsigned i = len; i > 0; --i)
+       {
+         unsigned tem = (0xff & ~bytes[i - 1]) + carry;
+         (*out_vec)[i - 1] = tem & 0xff;
+         carry = tem / 256;
+       }
+    }
+
+  return true;
+}
+
 /* VALADDR points to an integer of LEN bytes.
    Print it in decimal on stream or format it in buf.  */
 
 void
 print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
-                    unsigned len, enum bfd_endian byte_order)
+                    unsigned len, bool is_signed,
+                    enum bfd_endian byte_order)
 {
 #define TEN             10
 #define CARRY_OUT(  x ) ((x) / TEN)    /* extend char to int */
@@ -1726,29 +1598,31 @@ print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
 #define HIGH_NIBBLE( x ) (((x) & 0x0F0) >> 4)
 
   const gdb_byte *p;
-  unsigned char *digits;
   int carry;
   int decimal_len;
   int i, j, decimal_digits;
   int dummy;
   int flip;
 
+  gdb::byte_vector negated_bytes;
+  if (is_signed
+      && maybe_negate_by_bytes (valaddr, len, byte_order, &negated_bytes))
+    {
+      fputs_filtered ("-", stream);
+      valaddr = negated_bytes.data ();
+    }
+
   /* Base-ten number is less than twice as many digits
      as the base 16 number, which is 2 digits per byte.  */
 
   decimal_len = len * 2 * 2;
-  digits = (unsigned char *) xmalloc (decimal_len);
-
-  for (i = 0; i < decimal_len; i++)
-    {
-      digits[i] = 0;
-    }
+  std::vector<unsigned char> digits (decimal_len, 0);
 
   /* Ok, we have an unknown number of bytes of data to be printed in
    * decimal.
    *
    * Given a hex number (in nibbles) as XYZ, we start by taking X and
-   * decemalizing it as "x1 x2" in two decimal nibbles.  Then we multiply
+   * decimalizing it as "x1 x2" in two decimal nibbles.  Then we multiply
    * the nibbles by 16, add Y and re-decimalize.  Repeat with Z.
    *
    * The trick is that "digits" holds a base-10 number, but sometimes
@@ -1836,40 +1710,73 @@ print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
   /* Ok, now "digits" is the decimal representation, with
      the "decimal_digits" actual digits.  Print!  */
 
-  for (i = decimal_digits - 1; i >= 0; i--)
+  for (i = decimal_digits - 1; i > 0 && digits[i] == 0; --i)
+    ;
+
+  for (; i >= 0; i--)
     {
       fprintf_filtered (stream, "%1d", digits[i]);
     }
-  xfree (digits);
 }
 
 /* VALADDR points to an integer of LEN bytes.  Print it in hex on stream.  */
 
 void
 print_hex_chars (struct ui_file *stream, const gdb_byte *valaddr,
-                unsigned len, enum bfd_endian byte_order)
+                unsigned len, enum bfd_endian byte_order,
+                bool zero_pad)
 {
   const gdb_byte *p;
 
-  /* FIXME: We should be not printing leading zeroes in most cases.  */
-
   fputs_filtered ("0x", stream);
   if (byte_order == BFD_ENDIAN_BIG)
     {
-      for (p = valaddr;
+      p = valaddr;
+
+      if (!zero_pad)
+       {
+         /* Strip leading 0 bytes, but be sure to leave at least a
+            single byte at the end.  */
+         for (; p < valaddr + len - 1 && !*p; ++p)
+           ;
+       }
+
+      const gdb_byte *first = p;
+      for (;
           p < valaddr + len;
           p++)
        {
-         fprintf_filtered (stream, "%02x", *p);
+         /* When not zero-padding, use a different format for the
+            very first byte printed.  */
+         if (!zero_pad && p == first)
+           fprintf_filtered (stream, "%x", *p);
+         else
+           fprintf_filtered (stream, "%02x", *p);
        }
     }
   else
     {
-      for (p = valaddr + len - 1;
+      p = valaddr + len - 1;
+
+      if (!zero_pad)
+       {
+         /* Strip leading 0 bytes, but be sure to leave at least a
+            single byte at the end.  */
+         for (; p >= valaddr + 1 && !*p; --p)
+           ;
+       }
+
+      const gdb_byte *first = p;
+      for (;
           p >= valaddr;
           p--)
        {
-         fprintf_filtered (stream, "%02x", *p);
+         /* When not zero-padding, use a different format for the
+            very first byte printed.  */
+         if (!zero_pad && p == first)
+           fprintf_filtered (stream, "%x", *p);
+         else
+           fprintf_filtered (stream, "%02x", *p);
        }
     }
 }
@@ -1922,7 +1829,7 @@ print_function_pointer_address (const struct value_print_options *options,
 {
   CORE_ADDR func_addr
     = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
-                                         &current_target);
+                                         current_top_target ());
 
   /* If the function pointer is represented by a description, print
      the address of the description.  */
@@ -1944,36 +1851,23 @@ maybe_print_array_index (struct type *index_type, LONGEST index,
                          struct ui_file *stream,
                         const struct value_print_options *options)
 {
-  struct value *index_value;
-
   if (!options->print_array_indexes)
     return; 
     
-  index_value = value_from_longest (index_type, index);
-
-  LA_PRINT_ARRAY_INDEX (index_value, stream, options);
+  LA_PRINT_ARRAY_INDEX (index_type, index, stream, options);
 }
 
-/*  Called by various <lang>_val_print routines to print elements of an
-   array in the form "<elem1>, <elem2>, <elem3>, ...".
-
-   (FIXME?)  Assumes array element separator is a comma, which is correct
-   for all languages currently handled.
-   (FIXME?)  Some languages have a notation for repeated array elements,
-   perhaps we should try to use that notation when appropriate.  */
+/* See valprint.h.  */
 
 void
-val_print_array_elements (struct type *type,
-                         const gdb_byte *valaddr, LONGEST embedded_offset,
-                         CORE_ADDR address, struct ui_file *stream,
-                         int recurse,
-                         const struct value *val,
-                         const struct value_print_options *options,
-                         unsigned int i)
+value_print_array_elements (struct value *val, struct ui_file *stream,
+                           int recurse,
+                           const struct value_print_options *options,
+                           unsigned int i)
 {
   unsigned int things_printed = 0;
   unsigned len;
-  struct type *elttype, *index_type, *base_index_type;
+  struct type *elttype, *index_type;
   unsigned eltlen;
   /* Position of the array element we are examining to see
      whether it is repeated.  */
@@ -1981,41 +1875,26 @@ val_print_array_elements (struct type *type,
   /* Number of repetitions we have detected so far.  */
   unsigned int reps;
   LONGEST low_bound, high_bound;
-  LONGEST low_pos, high_pos;
+
+  struct type *type = check_typedef (value_type (val));
 
   elttype = TYPE_TARGET_TYPE (type);
   eltlen = type_length_units (check_typedef (elttype));
   index_type = TYPE_INDEX_TYPE (type);
+  if (index_type->code () == TYPE_CODE_RANGE)
+    index_type = TYPE_TARGET_TYPE (index_type);
 
   if (get_array_bounds (type, &low_bound, &high_bound))
     {
-      if (TYPE_CODE (index_type) == TYPE_CODE_RANGE)
-       base_index_type = TYPE_TARGET_TYPE (index_type);
-      else
-       base_index_type = index_type;
-
-      /* Non-contiguous enumerations types can by used as index types
-        in some languages (e.g. Ada).  In this case, the array length
-        shall be computed from the positions of the first and last
-        literal in the enumeration type, and not from the values
-        of these literals.  */
-      if (!discrete_position (base_index_type, low_bound, &low_pos)
-         || !discrete_position (base_index_type, high_bound, &high_pos))
-       {
-         warning (_("unable to get positions in array, use bounds instead"));
-         low_pos = low_bound;
-         high_pos = high_bound;
-       }
-
-      /* The array length should normally be HIGH_POS - LOW_POS + 1.
-         But we have to be a little extra careful, because some languages
-        such as Ada allow LOW_POS to be greater than HIGH_POS for
-        empty arrays.  In that situation, the array length is just zero,
-        not negative!  */
-      if (low_pos > high_pos)
+      /* The array length should normally be HIGH_BOUND - LOW_BOUND +
+         1.  But we have to be a little extra careful, because some
+         languages such as Ada allow LOW_BOUND to be greater than
+         HIGH_BOUND for empty arrays.  In that situation, the array
+         length is just zero, not negative!  */
+      if (low_bound > high_bound)
        len = 0;
       else
-       len = high_pos - low_pos + 1;
+       len = high_bound - low_bound + 1;
     }
   else
     {
@@ -2028,6 +1907,8 @@ val_print_array_elements (struct type *type,
 
   for (; i < len && things_printed < options->print_max; i++)
     {
+      scoped_value_mark free_values;
+
       if (i != 0)
        {
          if (options->prettyformat_arrays)
@@ -2036,9 +1917,12 @@ val_print_array_elements (struct type *type,
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
          else
-           {
-             fprintf_filtered (stream, ", ");
-           }
+           fprintf_filtered (stream, ", ");
+       }
+      else if (options->prettyformat_arrays)
+       {
+         fprintf_filtered (stream, "\n");
+         print_spaces_filtered (2 + 2 * recurse, stream);
        }
       wrap_here (n_spaces (2 + 2 * recurse));
       maybe_print_array_index (index_type, i + low_bound,
@@ -2051,11 +1935,8 @@ val_print_array_elements (struct type *type,
       if (options->repeat_count_threshold < UINT_MAX)
        {
          while (rep1 < len
-                && value_contents_eq (val,
-                                      embedded_offset + i * eltlen,
-                                      val,
-                                      (embedded_offset
-                                       + rep1 * eltlen),
+                && value_contents_eq (val, i * eltlen,
+                                      val, rep1 * eltlen,
                                       eltlen))
            {
              ++reps;
@@ -2063,13 +1944,15 @@ val_print_array_elements (struct type *type,
            }
        }
 
+      struct value *element = value_from_component (val, elttype, eltlen * i);
+      common_val_print (element, stream, recurse + 1, options,
+                       current_language);
+
       if (reps > options->repeat_count_threshold)
        {
-         val_print (elttype, valaddr, embedded_offset + i * eltlen,
-                    address, stream, recurse + 1, val, options,
-                    current_language);
          annotate_elt_rep (reps);
-         fprintf_filtered (stream, " <repeats %u times>", reps);
+         fprintf_filtered (stream, " %p[<repeats %u times>%p]",
+                           metadata_style.style ().ptr (), reps, nullptr);
          annotate_elt_rep_end ();
 
          i = rep1 - 1;
@@ -2077,17 +1960,17 @@ val_print_array_elements (struct type *type,
        }
       else
        {
-         val_print (elttype, valaddr, embedded_offset + i * eltlen,
-                    address,
-                    stream, recurse + 1, val, options, current_language);
          annotate_elt ();
          things_printed++;
        }
     }
   annotate_array_section_end ();
   if (i < len)
+    fprintf_filtered (stream, "...");
+  if (options->prettyformat_arrays)
     {
-      fprintf_filtered (stream, "...");
+      fprintf_filtered (stream, "\n");
+      print_spaces_filtered (2 * recurse, stream);
     }
 }
 
@@ -2133,10 +2016,10 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
   return (nread);
 }
 
-/* Read a string from the inferior, at ADDR, with LEN characters of WIDTH bytes
-   each.  Fetch at most FETCHLIMIT characters.  BUFFER will be set to a newly
-   allocated buffer containing the string, which the caller is responsible to
-   free, and BYTES_READ will be set to the number of bytes read.  Returns 0 on
+/* Read a string from the inferior, at ADDR, with LEN characters of
+   WIDTH bytes each.  Fetch at most FETCHLIMIT characters.  BUFFER
+   will be set to a newly allocated buffer containing the string, and
+   BYTES_READ will be set to the number of bytes read.  Returns 0 on
    success, or a target_xfer_status on failure.
 
    If LEN > 0, reads the lesser of LEN or FETCHLIMIT characters
@@ -2159,29 +2042,27 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
 
 int
 read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
-            enum bfd_endian byte_order, gdb_byte **buffer, int *bytes_read)
+            enum bfd_endian byte_order, gdb::unique_xmalloc_ptr<gdb_byte> *buffer,
+            int *bytes_read)
 {
   int errcode;                 /* Errno returned from bad reads.  */
   unsigned int nfetch;         /* Chars to fetch / chars fetched.  */
   gdb_byte *bufptr;            /* Pointer to next available byte in
                                   buffer.  */
-  struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain.  */
 
   /* Loop until we either have all the characters, or we encounter
      some error, such as bumping into the end of the address space.  */
 
-  *buffer = NULL;
-
-  old_chain = make_cleanup (free_current_contents, buffer);
+  buffer->reset (nullptr);
 
   if (len > 0)
     {
       /* We want fetchlimit chars, so we might as well read them all in
         one operation.  */
-      unsigned int fetchlen = min (len, fetchlimit);
+      unsigned int fetchlen = std::min ((unsigned) len, fetchlimit);
 
-      *buffer = (gdb_byte *) xmalloc (fetchlen * width);
-      bufptr = *buffer;
+      buffer->reset ((gdb_byte *) xmalloc (fetchlen * width));
+      bufptr = buffer->get ();
 
       nfetch = partial_memory_read (addr, bufptr, fetchlen * width, &errcode)
        / width;
@@ -2202,20 +2083,20 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
         So we choose the minimum of 8 and fetchlimit.  We used to use 200
         instead of 8 but 200 is way too big for remote debugging over a
          serial line.  */
-      chunksize = min (8, fetchlimit);
+      chunksize = std::min (8u, fetchlimit);
 
       do
        {
          QUIT;
-         nfetch = min (chunksize, fetchlimit - bufsize);
+         nfetch = std::min ((unsigned long) chunksize, fetchlimit - bufsize);
 
          if (*buffer == NULL)
-           *buffer = (gdb_byte *) xmalloc (nfetch * width);
+           buffer->reset ((gdb_byte *) xmalloc (nfetch * width));
          else
-           *buffer = (gdb_byte *) xrealloc (*buffer,
-                                            (nfetch + bufsize) * width);
+           buffer->reset ((gdb_byte *) xrealloc (buffer->release (),
+                                                 (nfetch + bufsize) * width));
 
-         bufptr = *buffer + bufsize * width;
+         bufptr = buffer->get () + bufsize * width;
          bufsize += nfetch;
 
          /* Read as much as we can.  */
@@ -2247,24 +2128,23 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
            }
        }
       while (errcode == 0      /* no error */
-            && bufptr - *buffer < fetchlimit * width   /* no overrun */
+            && bufptr - buffer->get () < fetchlimit * width    /* no overrun */
             && !found_nul);    /* haven't found NUL yet */
     }
   else
     {                          /* Length of string is really 0!  */
       /* We always allocate *buffer.  */
-      *buffer = bufptr = (gdb_byte *) xmalloc (1);
+      buffer->reset ((gdb_byte *) xmalloc (1));
+      bufptr = buffer->get ();
       errcode = 0;
     }
 
   /* bufptr and addr now point immediately beyond the last byte which we
      consider part of the string (including a '\0' which ends the string).  */
-  *bytes_read = bufptr - *buffer;
+  *bytes_read = bufptr - buffer->get ();
 
   QUIT;
 
-  discard_cleanups (old_chain);
-
   return errcode;
 }
 
@@ -2399,23 +2279,17 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream,
                   int quoter, const char *encoding)
 {
   enum bfd_endian byte_order
-    = gdbarch_byte_order (get_type_arch (type));
-  struct obstack wchar_buf, output;
-  struct cleanup *cleanups;
-  gdb_byte *buf;
-  struct wchar_iterator *iter;
+    = type_byte_order (type);
+  gdb_byte *c_buf;
   int need_escape = 0;
 
-  buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
-  pack_long (buf, type, c);
+  c_buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
+  pack_long (c_buf, type, c);
 
-  iter = make_wchar_iterator (buf, TYPE_LENGTH (type),
-                             encoding, TYPE_LENGTH (type));
-  cleanups = make_cleanup_wchar_iterator (iter);
+  wchar_iterator iter (c_buf, TYPE_LENGTH (type), encoding, TYPE_LENGTH (type));
 
   /* This holds the printable form of the wchar_t data.  */
-  obstack_init (&wchar_buf);
-  make_cleanup_obstack_free (&wchar_buf);
+  auto_obstack wchar_buf;
 
   while (1)
     {
@@ -2426,7 +2300,7 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream,
       int print_escape = 1;
       enum wchar_iterate_result result;
 
-      num_chars = wchar_iterate (iter, &result, &chars, &buf, &buflen);
+      num_chars = iter.iterate (&result, &chars, &buf, &buflen);
       if (num_chars < 0)
        break;
       if (num_chars > 0)
@@ -2462,8 +2336,7 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream,
     }
 
   /* The output in the host encoding.  */
-  obstack_init (&output);
-  make_cleanup_obstack_free (&output);
+  auto_obstack output;
 
   convert_between_encodings (INTERMEDIATE_ENCODING, host_charset (),
                             (gdb_byte *) obstack_base (&wchar_buf),
@@ -2472,35 +2345,33 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream,
   obstack_1grow (&output, '\0');
 
   fputs_filtered ((const char *) obstack_base (&output), stream);
-
-  do_cleanups (cleanups);
 }
 
 /* Return the repeat count of the next character/byte in ITER,
    storing the result in VEC.  */
 
 static int
-count_next_character (struct wchar_iterator *iter,
-                     VEC (converted_character_d) **vec)
+count_next_character (wchar_iterator *iter,
+                     std::vector<converted_character> *vec)
 {
   struct converted_character *current;
 
-  if (VEC_empty (converted_character_d, *vec))
+  if (vec->empty ())
     {
       struct converted_character tmp;
       gdb_wchar_t *chars;
 
       tmp.num_chars
-       = wchar_iterate (iter, &tmp.result, &chars, &tmp.buf, &tmp.buflen);
+       = iter->iterate (&tmp.result, &chars, &tmp.buf, &tmp.buflen);
       if (tmp.num_chars > 0)
        {
          gdb_assert (tmp.num_chars < MAX_WCHARS);
          memcpy (tmp.chars, chars, tmp.num_chars * sizeof (gdb_wchar_t));
        }
-      VEC_safe_push (converted_character_d, *vec, &tmp);
+      vec->push_back (tmp);
     }
 
-  current = VEC_last (converted_character_d, *vec);
+  current = &vec->back ();
 
   /* Count repeated characters or bytes.  */
   current->repeat_count = 1;
@@ -2520,8 +2391,7 @@ count_next_character (struct wchar_iterator *iter,
       while (1)
        {
          /* Get the next character.  */
-         d.num_chars
-           = wchar_iterate (iter, &d.result, &chars, &d.buf, &d.buflen);
+         d.num_chars = iter->iterate (&d.result, &chars, &d.buf, &d.buflen);
 
          /* If a character was successfully converted, save the character
             into the converted character.  */
@@ -2555,25 +2425,25 @@ count_next_character (struct wchar_iterator *iter,
 
       /* Push this next converted character onto the result vector.  */
       repeat = current->repeat_count;
-      VEC_safe_push (converted_character_d, *vec, &d);
+      vec->push_back (d);
       return repeat;
     }
 }
 
 /* Print the characters in CHARS to the OBSTACK.  QUOTE_CHAR is the quote
    character to use with string output.  WIDTH is the size of the output
-   character type.  BYTE_ORDER is the the target byte order.  OPTIONS
+   character type.  BYTE_ORDER is the target byte order.  OPTIONS
    is the user's print options.  */
 
 static void
 print_converted_chars_to_obstack (struct obstack *obstack,
-                                 VEC (converted_character_d) *chars,
+                                 const std::vector<converted_character> &chars,
                                  int quote_char, int width,
                                  enum bfd_endian byte_order,
                                  const struct value_print_options *options)
 {
   unsigned int idx;
-  struct converted_character *elem;
+  const converted_character *elem;
   enum {START, SINGLE, REPEAT, INCOMPLETE, FINISH} state, last;
   gdb_wchar_t wide_quote_char = gdb_btowc (quote_char);
   int need_escape = 0;
@@ -2622,7 +2492,6 @@ print_converted_chars_to_obstack (struct obstack *obstack,
        case REPEAT:
          {
            int j;
-           char *s;
 
            /* We are outputting a character with a repeat count
               greater than options->repeat_count_threshold.  */
@@ -2645,13 +2514,13 @@ print_converted_chars_to_obstack (struct obstack *obstack,
              print_wchar (gdb_WEOF, elem->buf, elem->buflen, width,
                           byte_order, obstack, quote_char, &need_escape);
            obstack_grow_wstr (obstack, LCST ("'"));
-           s = xstrprintf (_(" <repeats %u times>"), elem->repeat_count);
+           std::string s = string_printf (_(" <repeats %u times>"),
+                                          elem->repeat_count);
            for (j = 0; s[j]; ++j)
              {
                gdb_wchar_t w = gdb_btowc (s[j]);
                obstack_grow (obstack, &w, sizeof (gdb_wchar_t));
              }
-           xfree (s);
          }
          break;
 
@@ -2672,7 +2541,7 @@ print_converted_chars_to_obstack (struct obstack *obstack,
                       obstack, 0, &need_escape);
          obstack_grow_wstr (obstack, LCST (">"));
 
-         /* We do not attempt to outupt anything after this.  */
+         /* We do not attempt to output anything after this.  */
          state = FINISH;
          break;
 
@@ -2690,7 +2559,7 @@ print_converted_chars_to_obstack (struct obstack *obstack,
       last = state;
       if (state != FINISH)
        {
-         elem = VEC_index (converted_character_d, chars, idx++);
+         elem = &chars[idx++];
          switch (elem->result)
            {
            case wchar_iterate_ok:
@@ -2730,15 +2599,11 @@ generic_printstr (struct ui_file *stream, struct type *type,
                  int quote_char, int c_style_terminator,
                  const struct value_print_options *options)
 {
-  enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
+  enum bfd_endian byte_order = type_byte_order (type);
   unsigned int i;
   int width = TYPE_LENGTH (type);
-  struct obstack wchar_buf, output;
-  struct cleanup *cleanup;
-  struct wchar_iterator *iter;
   int finished = 0;
   struct converted_character *last;
-  VEC (converted_character_d) *converted_chars;
 
   if (length == -1)
     {
@@ -2770,10 +2635,8 @@ generic_printstr (struct ui_file *stream, struct type *type,
     }
 
   /* Arrange to iterate over the characters, in wchar_t form.  */
-  iter = make_wchar_iterator (string, length * width, encoding, width);
-  cleanup = make_cleanup_wchar_iterator (iter);
-  converted_chars = NULL;
-  make_cleanup (VEC_cleanup (converted_character_d), &converted_chars);
+  wchar_iterator iter (string, length * width, encoding, width);
+  std::vector<converted_character> converted_chars;
 
   /* Convert characters until the string is over or the maximum
      number of printed characters has been reached.  */
@@ -2785,7 +2648,7 @@ generic_printstr (struct ui_file *stream, struct type *type,
       QUIT;
 
       /* Grab the next character and repeat count.  */
-      r = count_next_character (iter, &converted_chars);
+      r = count_next_character (&iter, &converted_chars);
 
       /* If less than zero, the end of the input string was reached.  */
       if (r < 0)
@@ -2798,7 +2661,7 @@ generic_printstr (struct ui_file *stream, struct type *type,
 
   /* Get the last element and determine if the entire string was
      processed.  */
-  last = VEC_last (converted_character_d, converted_chars);
+  last = &converted_chars.back ();
   finished = (last->result == wchar_iterate_eof);
 
   /* Ensure that CONVERTED_CHARS is terminated.  */
@@ -2806,8 +2669,7 @@ generic_printstr (struct ui_file *stream, struct type *type,
 
   /* WCHAR_BUF is the obstack we use to represent the string in
      wchar_t form.  */
-  obstack_init (&wchar_buf);
-  make_cleanup_obstack_free (&wchar_buf);
+  auto_obstack wchar_buf;
 
   /* Print the output string to the obstack.  */
   print_converted_chars_to_obstack (&wchar_buf, converted_chars, quote_char,
@@ -2817,8 +2679,7 @@ generic_printstr (struct ui_file *stream, struct type *type,
     obstack_grow_wstr (&wchar_buf, LCST ("..."));
 
   /* OUTPUT is where we collect `char's for printing.  */
-  obstack_init (&output);
-  make_cleanup_obstack_free (&output);
+  auto_obstack output;
 
   convert_between_encodings (INTERMEDIATE_ENCODING, host_charset (),
                             (gdb_byte *) obstack_base (&wchar_buf),
@@ -2827,8 +2688,6 @@ generic_printstr (struct ui_file *stream, struct type *type,
   obstack_1grow (&output, '\0');
 
   fputs_filtered ((const char *) obstack_base (&output), stream);
-
-  do_cleanups (cleanup);
 }
 
 /* Print a string from the inferior, starting at ADDR and printing up to LEN
@@ -2850,10 +2709,9 @@ val_print_string (struct type *elttype, const char *encoding,
   int found_nul;               /* Non-zero if we found the nul char.  */
   unsigned int fetchlimit;     /* Maximum number of chars to print.  */
   int bytes_read;
-  gdb_byte *buffer = NULL;     /* Dynamically growable fetch buffer.  */
-  struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain.  */
+  gdb::unique_xmalloc_ptr<gdb_byte> buffer;    /* Dynamically growable fetch buffer.  */
   struct gdbarch *gdbarch = get_type_arch (elttype);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  enum bfd_endian byte_order = type_byte_order (elttype);
   int width = TYPE_LENGTH (elttype);
 
   /* First we need to figure out the limit on the number of characters we are
@@ -2864,12 +2722,11 @@ val_print_string (struct type *elttype, const char *encoding,
      because finding the null byte (or available memory) is what actually
      limits the fetch.  */
 
-  fetchlimit = (len == -1 ? options->print_max : min (len,
-                                                     options->print_max));
+  fetchlimit = (len == -1 ? options->print_max : std::min ((unsigned) len,
+                                                          options->print_max));
 
   err = read_string (addr, len, width, fetchlimit, byte_order,
                     &buffer, &bytes_read);
-  old_chain = make_cleanup (xfree, buffer);
 
   addr += bytes_read;
 
@@ -2880,8 +2737,8 @@ val_print_string (struct type *elttype, const char *encoding,
   /* Determine found_nul by looking at the last character read.  */
   found_nul = 0;
   if (bytes_read >= width)
-    found_nul = extract_unsigned_integer (buffer + bytes_read - width, width,
-                                         byte_order) == 0;
+    found_nul = extract_unsigned_integer (buffer.get () + bytes_read - width,
+                                         width, byte_order) == 0;
   if (len == -1 && !found_nul)
     {
       gdb_byte *peekbuf;
@@ -2909,27 +2766,30 @@ val_print_string (struct type *elttype, const char *encoding,
      and then the error message.  */
   if (err == 0 || bytes_read > 0)
     {
-      LA_PRINT_STRING (stream, elttype, buffer, bytes_read / width,
+      LA_PRINT_STRING (stream, elttype, buffer.get (), bytes_read / width,
                       encoding, force_ellipsis, options);
     }
 
   if (err != 0)
     {
-      char *str;
+      std::string str = memory_error_message (TARGET_XFER_E_IO, gdbarch, addr);
 
-      str = memory_error_message (TARGET_XFER_E_IO, gdbarch, addr);
-      make_cleanup (xfree, str);
-
-      fprintf_filtered (stream, "<error: ");
-      fputs_filtered (str, stream);
-      fprintf_filtered (stream, ">");
+      fprintf_filtered (stream, _("<error: %ps>"),
+                       styled_string (metadata_style.style (),
+                                      str.c_str ()));
     }
 
-  gdb_flush (stream);
-  do_cleanups (old_chain);
-
   return (bytes_read / width);
 }
+
+/* Handle 'show print max-depth'.  */
+
+static void
+show_print_max_depth (struct ui_file *file, int from_tty,
+                     struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Maximum print depth is %s.\n"), value);
+}
 \f
 
 /* The 'set input-radix' command writes to this auxiliary variable.
@@ -2943,7 +2803,7 @@ static unsigned input_radix_1 = 10;
    setting the input radix to "10" never changes it!  */
 
 static void
-set_input_radix (char *args, int from_tty, struct cmd_list_element *c)
+set_input_radix (const char *args, int from_tty, struct cmd_list_element *c)
 {
   set_input_radix_1 (from_tty, input_radix_1);
 }
@@ -2980,7 +2840,7 @@ set_input_radix_1 (int from_tty, unsigned radix)
 static unsigned output_radix_1 = 10;
 
 static void
-set_output_radix (char *args, int from_tty, struct cmd_list_element *c)
+set_output_radix (const char *args, int from_tty, struct cmd_list_element *c)
 {
   set_output_radix_1 (from_tty, output_radix_1);
 }
@@ -3025,7 +2885,7 @@ set_output_radix_1 (int from_tty, unsigned radix)
    the 'set input-radix' command.  */
 
 static void
-set_radix (char *arg, int from_tty)
+set_radix (const char *arg, int from_tty)
 {
   unsigned radix;
 
@@ -3043,7 +2903,7 @@ set_radix (char *arg, int from_tty)
 /* Show both the input and output radices.  */
 
 static void
-show_radix (char *arg, int from_tty)
+show_radix (const char *arg, int from_tty)
 {
   if (from_tty)
     {
@@ -3066,124 +2926,226 @@ show_radix (char *arg, int from_tty)
 }
 \f
 
+/* Controls printing of vtbl's.  */
 static void
-set_print (char *arg, int from_tty)
+show_vtblprint (struct ui_file *file, int from_tty,
+               struct cmd_list_element *c, const char *value)
 {
-  printf_unfiltered (
-     "\"set print\" must be followed by the name of a print subcommand.\n");
-  help_list (setprintlist, "set print ", all_commands, gdb_stdout);
+  fprintf_filtered (file, _("\
+Printing of C++ virtual function tables is %s.\n"),
+                   value);
 }
 
+/* Controls looking up an object's derived type using what we find in
+   its vtables.  */
 static void
-show_print (char *args, int from_tty)
+show_objectprint (struct ui_file *file, int from_tty,
+                 struct cmd_list_element *c,
+                 const char *value)
 {
-  cmd_show_list (showprintlist, from_tty, "");
+  fprintf_filtered (file, _("\
+Printing of object's derived type based on vtable info is %s.\n"),
+                   value);
 }
 
 static void
-set_print_raw (char *arg, int from_tty)
+show_static_field_print (struct ui_file *file, int from_tty,
+                        struct cmd_list_element *c,
+                        const char *value)
 {
-  printf_unfiltered (
-     "\"set print raw\" must be followed by the name of a \"print raw\" subcommand.\n");
-  help_list (setprintrawlist, "set print raw ", all_commands, gdb_stdout);
+  fprintf_filtered (file,
+                   _("Printing of C++ static members is %s.\n"),
+                   value);
 }
 
-static void
-show_print_raw (char *args, int from_tty)
+\f
+
+/* A couple typedefs to make writing the options a bit more
+   convenient.  */
+using boolean_option_def
+  = gdb::option::boolean_option_def<value_print_options>;
+using uinteger_option_def
+  = gdb::option::uinteger_option_def<value_print_options>;
+using zuinteger_unlimited_option_def
+  = gdb::option::zuinteger_unlimited_option_def<value_print_options>;
+
+/* Definitions of options for the "print" and "compile print"
+   commands.  */
+static const gdb::option::option_def value_print_option_defs[] = {
+
+  boolean_option_def {
+    "address",
+    [] (value_print_options *opt) { return &opt->addressprint; },
+    show_addressprint, /* show_cmd_cb */
+    N_("Set printing of addresses."),
+    N_("Show printing of addresses."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "array",
+    [] (value_print_options *opt) { return &opt->prettyformat_arrays; },
+    show_prettyformat_arrays, /* show_cmd_cb */
+    N_("Set pretty formatting of arrays."),
+    N_("Show pretty formatting of arrays."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "array-indexes",
+    [] (value_print_options *opt) { return &opt->print_array_indexes; },
+    show_print_array_indexes, /* show_cmd_cb */
+    N_("Set printing of array indexes."),
+    N_("Show printing of array indexes."),
+    NULL, /* help_doc */
+  },
+
+  uinteger_option_def {
+    "elements",
+    [] (value_print_options *opt) { return &opt->print_max; },
+    show_print_max, /* show_cmd_cb */
+    N_("Set limit on string chars or array elements to print."),
+    N_("Show limit on string chars or array elements to print."),
+    N_("\"unlimited\" causes there to be no limit."),
+  },
+
+  zuinteger_unlimited_option_def {
+    "max-depth",
+    [] (value_print_options *opt) { return &opt->max_depth; },
+    show_print_max_depth, /* show_cmd_cb */
+    N_("Set maximum print depth for nested structures, unions and arrays."),
+    N_("Show maximum print depth for nested structures, unions, and arrays."),
+    N_("When structures, unions, or arrays are nested beyond this depth then they\n\
+will be replaced with either '{...}' or '(...)' depending on the language.\n\
+Use \"unlimited\" to print the complete structure.")
+  },
+
+  boolean_option_def {
+    "null-stop",
+    [] (value_print_options *opt) { return &opt->stop_print_at_null; },
+    show_stop_print_at_null, /* show_cmd_cb */
+    N_("Set printing of char arrays to stop at first null char."),
+    N_("Show printing of char arrays to stop at first null char."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "object",
+    [] (value_print_options *opt) { return &opt->objectprint; },
+    show_objectprint, /* show_cmd_cb */
+    _("Set printing of C++ virtual function tables."),
+    _("Show printing of C++ virtual function tables."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "pretty",
+    [] (value_print_options *opt) { return &opt->prettyformat_structs; },
+    show_prettyformat_structs, /* show_cmd_cb */
+    N_("Set pretty formatting of structures."),
+    N_("Show pretty formatting of structures."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "raw-values",
+    [] (value_print_options *opt) { return &opt->raw; },
+    NULL, /* show_cmd_cb */
+    N_("Set whether to print values in raw form."),
+    N_("Show whether to print values in raw form."),
+    N_("If set, values are printed in raw form, bypassing any\n\
+pretty-printers for that value.")
+  },
+
+  uinteger_option_def {
+    "repeats",
+    [] (value_print_options *opt) { return &opt->repeat_count_threshold; },
+    show_repeat_count_threshold, /* show_cmd_cb */
+    N_("Set threshold for repeated print elements."),
+    N_("Show threshold for repeated print elements."),
+    N_("\"unlimited\" causes all elements to be individually printed."),
+  },
+
+  boolean_option_def {
+    "static-members",
+    [] (value_print_options *opt) { return &opt->static_field_print; },
+    show_static_field_print, /* show_cmd_cb */
+    N_("Set printing of C++ static members."),
+    N_("Show printing of C++ static members."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "symbol",
+    [] (value_print_options *opt) { return &opt->symbol_print; },
+    show_symbol_print, /* show_cmd_cb */
+    N_("Set printing of symbol names when printing pointers."),
+    N_("Show printing of symbol names when printing pointers."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "union",
+    [] (value_print_options *opt) { return &opt->unionprint; },
+    show_unionprint, /* show_cmd_cb */
+    N_("Set printing of unions interior to structures."),
+    N_("Show printing of unions interior to structures."),
+    NULL, /* help_doc */
+  },
+
+  boolean_option_def {
+    "vtbl",
+    [] (value_print_options *opt) { return &opt->vtblprint; },
+    show_vtblprint, /* show_cmd_cb */
+    N_("Set printing of C++ virtual function tables."),
+    N_("Show printing of C++ virtual function tables."),
+    NULL, /* help_doc */
+  },
+};
+
+/* See valprint.h.  */
+
+gdb::option::option_def_group
+make_value_print_options_def_group (value_print_options *opts)
 {
-  cmd_show_list (showprintrawlist, from_tty, "");
+  return {{value_print_option_defs}, opts};
 }
 
-\f
+void _initialize_valprint ();
 void
-_initialize_valprint (void)
+_initialize_valprint ()
 {
-  add_prefix_cmd ("print", no_class, set_print,
-                 _("Generic command for setting how things print."),
-                 &setprintlist, "set print ", 0, &setlist);
+  cmd_list_element *cmd;
+
+  add_basic_prefix_cmd ("print", no_class,
+                       _("Generic command for setting how things print."),
+                       &setprintlist, "set print ", 0, &setlist);
   add_alias_cmd ("p", "print", no_class, 1, &setlist);
   /* Prefer set print to set prompt.  */
   add_alias_cmd ("pr", "print", no_class, 1, &setlist);
 
-  add_prefix_cmd ("print", no_class, show_print,
-                 _("Generic command for showing print settings."),
-                 &showprintlist, "show print ", 0, &showlist);
+  add_show_prefix_cmd ("print", no_class,
+                      _("Generic command for showing print settings."),
+                      &showprintlist, "show print ", 0, &showlist);
   add_alias_cmd ("p", "print", no_class, 1, &showlist);
   add_alias_cmd ("pr", "print", no_class, 1, &showlist);
 
-  add_prefix_cmd ("raw", no_class, set_print_raw,
-                 _("\
+  cmd = add_basic_prefix_cmd ("raw", no_class,
+                             _("\
 Generic command for setting what things to print in \"raw\" mode."),
-                 &setprintrawlist, "set print raw ", 0, &setprintlist);
-  add_prefix_cmd ("raw", no_class, show_print_raw,
-                 _("Generic command for showing \"print raw\" settings."),
-                 &showprintrawlist, "show print raw ", 0, &showprintlist);
-
-  add_setshow_uinteger_cmd ("elements", no_class,
-                           &user_print_options.print_max, _("\
-Set limit on string chars or array elements to print."), _("\
-Show limit on string chars or array elements to print."), _("\
-\"set print elements unlimited\" causes there to be no limit."),
-                           NULL,
-                           show_print_max,
-                           &setprintlist, &showprintlist);
-
-  add_setshow_boolean_cmd ("null-stop", no_class,
-                          &user_print_options.stop_print_at_null, _("\
-Set printing of char arrays to stop at first null char."), _("\
-Show printing of char arrays to stop at first null char."), NULL,
-                          NULL,
-                          show_stop_print_at_null,
-                          &setprintlist, &showprintlist);
-
-  add_setshow_uinteger_cmd ("repeats", no_class,
-                           &user_print_options.repeat_count_threshold, _("\
-Set threshold for repeated print elements."), _("\
-Show threshold for repeated print elements."), _("\
-\"set print repeats unlimited\" causes all elements to be individually printed."),
-                           NULL,
-                           show_repeat_count_threshold,
-                           &setprintlist, &showprintlist);
-
-  add_setshow_boolean_cmd ("pretty", class_support,
-                          &user_print_options.prettyformat_structs, _("\
-Set pretty formatting of structures."), _("\
-Show pretty formatting of structures."), NULL,
-                          NULL,
-                          show_prettyformat_structs,
-                          &setprintlist, &showprintlist);
-
-  add_setshow_boolean_cmd ("union", class_support,
-                          &user_print_options.unionprint, _("\
-Set printing of unions interior to structures."), _("\
-Show printing of unions interior to structures."), NULL,
-                          NULL,
-                          show_unionprint,
-                          &setprintlist, &showprintlist);
-
-  add_setshow_boolean_cmd ("array", class_support,
-                          &user_print_options.prettyformat_arrays, _("\
-Set pretty formatting of arrays."), _("\
-Show pretty formatting of arrays."), NULL,
-                          NULL,
-                          show_prettyformat_arrays,
-                          &setprintlist, &showprintlist);
-
-  add_setshow_boolean_cmd ("address", class_support,
-                          &user_print_options.addressprint, _("\
-Set printing of addresses."), _("\
-Show printing of addresses."), NULL,
-                          NULL,
-                          show_addressprint,
-                          &setprintlist, &showprintlist);
-
-  add_setshow_boolean_cmd ("symbol", class_support,
-                          &user_print_options.symbol_print, _("\
-Set printing of symbol names when printing pointers."), _("\
-Show printing of symbol names when printing pointers."),
-                          NULL, NULL,
-                          show_symbol_print,
-                          &setprintlist, &showprintlist);
+                             &setprintrawlist, "set print raw ", 0,
+                             &setprintlist);
+  deprecate_cmd (cmd, nullptr);
+
+  cmd = add_show_prefix_cmd ("raw", no_class,
+                            _("Generic command for showing \"print raw\" settings."),
+                            &showprintrawlist, "show print raw ", 0,
+                            &showprintlist);
+  deprecate_cmd (cmd, nullptr);
+
+  gdb::option::add_setshow_cmds_for_options
+    (class_support, &user_print_options, value_print_option_defs,
+     &setprintlist, &showprintlist);
 
   add_setshow_zuinteger_cmd ("input-radix", class_support, &input_radix_1,
                             _("\
@@ -3217,10 +3179,4 @@ Without an argument, sets both radices back to the default value of 10."),
 Show the default input and output number radices.\n\
 Use 'show input-radix' or 'show output-radix' to independently show each."),
           &showlist);
-
-  add_setshow_boolean_cmd ("array-indexes", class_support,
-                           &user_print_options.print_array_indexes, _("\
-Set printing of array indexes."), _("\
-Show printing of array indexes"), NULL, NULL, show_print_array_indexes,
-                           &setprintlist, &showprintlist);
 }
This page took 0.066561 seconds and 4 git commands to generate.