+2016-11-08  Yao Qi  <yao.qi@linaro.org>
+
+       * ada-lang.h (ada_val_print): Remove second parameter.  Remove
+       const from "struct value *".
+       * ada-valprint.c (print_field_values): Remove const from
+       "struct value *".
+       (val_print_packed_array_elements): Likewise.
+       (print_variant_part): Likewise.
+       (ada_val_print_string): Likewise.
+       (ada_val_print_gnat_array): Likewise.
+       (ada_val_print_ptr): Likewise.
+       (ada_val_print_num): Likewise.
+       (ada_val_print_enum): Likewise.
+       (ada_val_print_flt): Likewise.
+       (ada_val_print_union): Likewise.
+       (ada_val_print_struct_union): Likewise.
+       (ada_val_print_ref): Likewise.
+       (ada_val_print_1): Remove second parameter.  Remove const from
+       "struct value *".
+       (ada_val_print): Likewise.
+       * c-lang.h (c_val_print): Likewise.
+       * c-valprint.c (c_val_print_array): Remove const from
+       "struct value *".
+       (c_val_print_ptr): Likewise.
+       (c_val_print_struct): Likewise.
+       (c_val_print_union): Likewise.
+       (c_val_print_int): Likewise.
+       (c_val_print_memberptr): Likewise.
+       (c_val_print): Remove second parameter.  Remove const from
+       "struct value *".  All callers updated.
+       * cp-valprint.c (cp_print_value): Remove const from
+       "struct value *".
+       (cp_print_value_fields): Likewise.
+       (c_val_print_value): Likewise.
+       * d-lang.h (d_val_print): Remove second parameter.  Remove const
+       from "struct value *".
+       * d-valprint.c (dynamic_array_type): Likewise.
+       (d_val_print): Likewise.
+       * f-lang.h (f_val_print): Likewise.
+       * f-valprint.c (f_val_print): Likewise.
+       * go-lang.h (go_val_print): Likewise.
+       * go-valprint.c (print_go_string): Likewise.
+       (go_val_print): Likewise.
+       * language.c (unk_lang_val_print): Likewise.
+       * language.h (struct language_defn) <la_val_print>: Likewise.
+       Update comments.
+       (LA_VAL_PRINT): Remove.
+       * m2-lang.h (m2_val_print): Remove const from
+       "struct value *".
+       * m2-valprint.c (m2_print_array_contents): Likewise.
+       (m2_val_print): Likewise.
+       * p-lang.h (pascal_val_print): Remove second parameter.  Remove
+       const from "struct value *".
+       (pascal_object_print_value_fields): Likewise.
+       * p-valprint.c (pascal_val_print): Likewise.
+       (pascal_object_print_value_fields): Likewise.
+       (pascal_object_print_value): Likewise.
+       * rust-lang.c (rust_get_disr_info): Likewise.
+       (val_print_struct): Likewise.
+       (rust_val_print): Likewise.
+       * valprint.c (generic_val_print_array): Likewise.
+       (generic_val_print_ptr): Likewise.
+       (generic_val_print_memberptr): Likewise.
+       (generic_val_print_ref): Likewise.
+       (generic_val_print_enum): Likewise.
+       (generic_val_print_flags): Likewise.
+       (generic_val_print_func): Likewise.
+       (generic_val_print_bool): Likewise.
+       (generic_val_print_int): Likewise.
+       (generic_val_print_char): Likewise.
+       (generic_val_print_float): Likewise.
+       (generic_val_print_decfloat): Likewise.
+       (generic_val_print_complex): Likewise.
+       (generic_val_print): Likewise.
+       (val_print): Likewise.
+       (common_val_print): Likewise.
+       (val_print_type_code_flags): Likewise.
+       (val_print_scalar_formatted): Likewise.
+       (val_print_array_elements): Likewise.
+       * valprint.h (val_print_array_elements): Update declaration.
+       (val_print_scalar_formatted): Likewise.
+       (generic_val_print): Likewise.
+       * value.h (val_print): Likewise.
+
 2016-11-08  Yao Qi  <yao.qi@linaro.org>
 
        * mt-tdep.c (mt_registers_info): Call
 
 extern void ada_print_typedef (struct type *type, struct symbol *new_symbol,
                               struct ui_file *stream);
 
-extern void ada_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
+extern void ada_val_print (struct type *, int, CORE_ADDR,
                           struct ui_file *, int,
-                          const struct value *,
+                          struct value *,
                           const struct value_print_options *);
 
 extern void ada_value_print (struct value *, struct ui_file *,
 
 static int print_field_values (struct type *, const gdb_byte *,
                               int,
                               struct ui_file *, int,
-                              const struct value *,
+                              struct value *,
                               const struct value_print_options *,
                               int, struct type *, int,
                               const struct language_defn *);
                                 int offset,
                                 int bitoffset, struct ui_file *stream,
                                 int recurse,
-                                const struct value *val,
+                                struct value *val,
                                 const struct value_print_options *options)
 {
   unsigned int i;
          struct value_print_options opts = *options;
 
          opts.deref_ref = 0;
-         val_print (elttype, value_contents_for_printing (v0),
+         val_print (elttype,
                     value_embedded_offset (v0), 0, stream,
                     recurse + 1, v0, &opts, current_language);
          annotate_elt_rep (i - i0);
                  maybe_print_array_index (index_type, j + low,
                                           stream, options);
                }
-             val_print (elttype, value_contents_for_printing (v0),
+             val_print (elttype,
                         value_embedded_offset (v0), 0, stream,
                         recurse + 1, v0, &opts, current_language);
              annotate_elt ();
 print_variant_part (struct type *type, int field_num,
                    const gdb_byte *valaddr, int offset,
                    struct ui_file *stream, int recurse,
-                   const struct value *val,
+                   struct value *val,
                    const struct value_print_options *options,
                    int comma_needed,
                    struct type *outer_type, int outer_offset,
 static int
 print_field_values (struct type *type, const gdb_byte *valaddr,
                    int offset, struct ui_file *stream, int recurse,
-                   const struct value *val,
+                   struct value *val,
                    const struct value_print_options *options,
                    int comma_needed,
                    struct type *outer_type, int outer_offset,
 
       if (TYPE_FIELD_PACKED (type, i))
        {
-         struct value *v;
-
          /* Bitfields require special handling, especially due to byte
             order problems.  */
          if (HAVE_CPLUS_STRUCT (type) && TYPE_FIELD_IGNORE (type, i))
            }
          else
            {
+             struct value *v;
              int bit_pos = TYPE_FIELD_BITPOS (type, i);
              int bit_size = TYPE_FIELD_BITSIZE (type, i);
              struct value_print_options opts;
              opts = *options;
              opts.deref_ref = 0;
              val_print (TYPE_FIELD_TYPE (type, i),
-                        value_contents_for_printing (v),
                         value_embedded_offset (v), 0,
                         stream, recurse + 1, v,
                         &opts, language);
          struct value_print_options opts = *options;
 
          opts.deref_ref = 0;
-         val_print (TYPE_FIELD_TYPE (type, i), valaddr,
+         val_print (TYPE_FIELD_TYPE (type, i),
                     (offset + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT),
                     0, stream, recurse + 1, val, &opts, language);
        }
 ada_val_print_string (struct type *type, const gdb_byte *valaddr,
                      int offset, int offset_aligned, CORE_ADDR address,
                      struct ui_file *stream, int recurse,
-                     const struct value *original_value,
+                     struct value *original_value,
                      const struct value_print_options *options)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
 ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
                          int offset, CORE_ADDR address,
                          struct ui_file *stream, int recurse,
-                         const struct value *original_value,
+                         struct value *original_value,
                          const struct value_print_options *options,
                          const struct language_defn *language)
 {
       fprintf_filtered (stream, "0x0");
     }
   else
-    val_print (value_type (val), value_contents_for_printing (val),
+    val_print (value_type (val),
               value_embedded_offset (val), value_address (val),
               stream, recurse, val, options, language);
   value_free_to_mark (mark);
 ada_val_print_ptr (struct type *type, const gdb_byte *valaddr,
                   int offset, int offset_aligned, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options,
                   const struct language_defn *language)
 {
-  val_print (type, valaddr, offset, address, stream, recurse,
+  val_print (type, offset, address, stream, recurse,
             original_value, options, language_def (language_c));
 
   if (ada_is_tag_type (type))
 ada_val_print_num (struct type *type, const gdb_byte *valaddr,
                   int offset, int offset_aligned, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options,
                   const struct language_defn *language)
 {
            = value_from_contents_and_address (type, valaddr + offset, 0);
          struct value *v = value_cast (target_type, v1);
 
-         val_print (target_type, value_contents_for_printing (v),
+         val_print (target_type,
                     value_embedded_offset (v), 0, stream,
                     recurse + 1, v, options, language);
        }
       else
-       val_print (TYPE_TARGET_TYPE (type), valaddr, offset,
+       val_print (TYPE_TARGET_TYPE (type), offset,
                   address, stream, recurse, original_value,
                   options, language);
       return;
          struct value_print_options opts = *options;
 
          opts.format = format;
-         val_print_scalar_formatted (type, valaddr, offset_aligned,
+         val_print_scalar_formatted (type, offset_aligned,
                                      original_value, &opts, 0, stream);
        }
       else if (ada_is_system_address_type (type))
 ada_val_print_enum (struct type *type, const gdb_byte *valaddr,
                    int offset, int offset_aligned, CORE_ADDR address,
                    struct ui_file *stream, int recurse,
-                   const struct value *original_value,
+                   struct value *original_value,
                    const struct value_print_options *options,
                    const struct language_defn *language)
 {
 
   if (options->format)
     {
-      val_print_scalar_formatted (type, valaddr, offset_aligned,
+      val_print_scalar_formatted (type, offset_aligned,
                                  original_value, options, 0, stream);
       return;
     }
 ada_val_print_flt (struct type *type, const gdb_byte *valaddr,
                   int offset, int offset_aligned, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options,
                   const struct language_defn *language)
 {
   if (options->format)
     {
-      val_print (type, valaddr, offset, address, stream, recurse,
+      val_print (type, offset, address, stream, recurse,
                 original_value, options, language_def (language_c));
       return;
     }
 ada_val_print_struct_union
   (struct type *type, const gdb_byte *valaddr, int offset,
    int offset_aligned, CORE_ADDR address, struct ui_file *stream,
-   int recurse, const struct value *original_value,
+   int recurse, struct value *original_value,
    const struct value_print_options *options,
    const struct language_defn *language)
 {
 ada_val_print_array (struct type *type, const gdb_byte *valaddr,
                     int offset, int offset_aligned, CORE_ADDR address,
                     struct ui_file *stream, int recurse,
-                    const struct value *original_value,
+                    struct value *original_value,
                     const struct value_print_options *options)
 {
   /* For an array of characters, print with string syntax.  */
                                     0, stream, recurse,
                                     original_value, options);
   else
-    val_print_array_elements (type, valaddr, offset_aligned, address,
+    val_print_array_elements (type, offset_aligned, address,
                              stream, recurse, original_value,
                              options, 0);
   fprintf_filtered (stream, ")");
 ada_val_print_ref (struct type *type, const gdb_byte *valaddr,
                   int offset, int offset_aligned, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options,
                   const struct language_defn *language)
 {
   ada_ensure_varsize_limit (value_type (deref_val));
 
   val_print (value_type (deref_val),
-            value_contents_for_printing (deref_val),
             value_embedded_offset (deref_val),
             value_address (deref_val), stream, recurse + 1,
             deref_val, options, language);
    does not catch evaluation errors (leaving that to ada_val_print).  */
 
 static void
-ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
+ada_val_print_1 (struct type *type,
                 int offset, CORE_ADDR address,
                 struct ui_file *stream, int recurse,
-                const struct value *original_value,
+                struct value *original_value,
                 const struct value_print_options *options,
                 const struct language_defn *language)
 {
   int offset_aligned;
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   type = ada_check_typedef (type);
 
   switch (TYPE_CODE (type))
     {
     default:
-      val_print (type, valaddr, offset, address, stream, recurse,
+      val_print (type, offset, address, stream, recurse,
                 original_value, options, language_def (language_c));
       break;
 
    function; they are identical.  */
 
 void
-ada_val_print (struct type *type, const gdb_byte *valaddr,
+ada_val_print (struct type *type,
               int embedded_offset, CORE_ADDR address,
               struct ui_file *stream, int recurse,
-              const struct value *val,
+              struct value *val,
               const struct value_print_options *options)
 {
 
   /* XXX: this catches QUIT/ctrl-c as well.  Isn't that busted?  */
   TRY
     {
-      ada_val_print_1 (type, valaddr, embedded_offset, address,
+      ada_val_print_1 (type, embedded_offset, address,
                       stream, recurse, val, options,
                       current_language);
     }
 
   opts = *options;
   opts.deref_ref = 1;
-  val_print (type, value_contents_for_printing (val),
+  val_print (type,
             value_embedded_offset (val), address,
             stream, 0, val, &opts, current_language);
 }
 
                             struct symbol *,
                             struct ui_file *);
 
-extern void c_val_print (struct type *, const gdb_byte *,
+extern void c_val_print (struct type *,
                         int, CORE_ADDR,
                         struct ui_file *, int,
-                        const struct value *,
+                        struct value *,
                         const struct value_print_options *);
 
 extern void c_value_print (struct value *, struct ui_file *,
 extern void cp_print_value_fields (struct type *, struct type *,
                                   const gdb_byte *, LONGEST, CORE_ADDR,
                                   struct ui_file *, int,
-                                  const struct value *,
+                                  struct value *,
                                   const struct value_print_options *,
                                   struct type **, int);
 
 extern void cp_print_value_fields_rtti (struct type *,
                                        const gdb_byte *, LONGEST, CORE_ADDR,
                                        struct ui_file *, int,
-                                       const struct value *,
+                                       struct value *,
                                        const struct value_print_options *,
                                        struct type **, int);
 
 
 c_val_print_array (struct type *type, const gdb_byte *valaddr,
                   int embedded_offset, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options)
 {
   struct type *unresolved_elttype = TYPE_TARGET_TYPE (type);
            {
              i = 0;
            }
-         val_print_array_elements (type, valaddr, embedded_offset,
+         val_print_array_elements (type, embedded_offset,
                                    address, stream,
                                    recurse, original_value, options, i);
          fprintf_filtered (stream, "}");
 static void
 c_val_print_ptr (struct type *type, const gdb_byte *valaddr,
                 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 gdbarch *arch = get_type_arch (type);
 
   if (options->format && options->format != 's')
     {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, options, 0, stream);
     }
   else if (options->vtblprint && cp_is_vtbl_ptr_type (type))
 c_val_print_struct (struct type *type, const gdb_byte *valaddr,
                    int embedded_offset, CORE_ADDR address,
                    struct ui_file *stream, int recurse,
-                   const struct value *original_value,
+                   struct value *original_value,
                    const struct value_print_options *options)
 {
   if (options->vtblprint && cp_is_vtbl_ptr_type (type))
 c_val_print_union (struct type *type, const gdb_byte *valaddr,
                   int embedded_offset, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options)
 {
   if (recurse && !options->unionprint)
 static void
 c_val_print_int (struct type *type, struct type *unresolved_type,
                 const gdb_byte *valaddr, int embedded_offset,
-                struct ui_file *stream, const struct value *original_value,
+                struct ui_file *stream, struct value *original_value,
                 const struct value_print_options *options)
 {
   struct gdbarch *arch = get_type_arch (type);
 
       opts.format = (options->format ? options->format
                     : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, &opts, 0, stream);
     }
   else
 c_val_print_memberptr (struct type *type, const gdb_byte *valaddr,
                       int embedded_offset, CORE_ADDR address,
                       struct ui_file *stream, int recurse,
-                      const struct value *original_value,
+                      struct value *original_value,
                       const struct value_print_options *options)
 {
   if (!options->format)
     }
   else
     {
-      generic_val_print (type, valaddr, embedded_offset, address, stream,
+      generic_val_print (type, embedded_offset, address, stream,
                         recurse, original_value, options, &c_decorations);
     }
 }
    function; they are identical.  */
 
 void
-c_val_print (struct type *type, const gdb_byte *valaddr,
+c_val_print (struct type *type,
             int embedded_offset, CORE_ADDR address,
             struct ui_file *stream, int recurse,
-            const struct value *original_value,
+            struct value *original_value,
             const struct value_print_options *options)
 {
   struct type *unresolved_type = type;
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   type = check_typedef (type);
   switch (TYPE_CODE (type))
     case TYPE_CODE_COMPLEX:
     case TYPE_CODE_CHAR:
     default:
-      generic_val_print (type, valaddr, embedded_offset, address,
+      generic_val_print (type, embedded_offset, address,
                         stream, recurse, original_value, options,
                         &c_decorations);
       break;
          /* Print out object: enclosing type is same as real_type if
             full.  */
          val_print (value_enclosing_type (val),
-                    value_contents_for_printing (val), 0,
+                    0,
                     value_address (val), stream, 0,
                     val, &opts, current_language);
          return;
          fprintf_filtered (stream, "(%s ?) ",
                            TYPE_NAME (value_enclosing_type (val)));
          val_print (value_enclosing_type (val),
-                    value_contents_for_printing (val), 0,
+                    0,
                     value_address (val), stream, 0,
                     val, &opts, current_language);
          return;
       /* Otherwise, we end up at the return outside this "if".  */
     }
 
-  val_print (val_type, value_contents_for_printing (val),
+  val_print (val_type,
             value_embedded_offset (val),
             value_address (val),
             stream, 0,
 
 static void cp_print_value (struct type *, struct type *,
                            const gdb_byte *, LONGEST,
                            CORE_ADDR, struct ui_file *,
-                           int, const struct value *,
+                           int, struct value *,
                            const struct value_print_options *,
                            struct type **);
 
 cp_print_value_fields (struct type *type, struct type *real_type,
                       const gdb_byte *valaddr, LONGEST offset,
                       CORE_ADDR address, struct ui_file *stream,
-                      int recurse, const struct value *val,
+                      int recurse, struct value *val,
                       const struct value_print_options *options,
                       struct type **dont_print_vb,
                       int dont_print_statmem)
 
                  opts.deref_ref = 0;
                  val_print (TYPE_FIELD_TYPE (type, i),
-                            valaddr, 
                             offset + TYPE_FIELD_BITPOS (type, i) / 8,
                             address,
                             stream, recurse + 1, val, &opts,
                            const gdb_byte *valaddr, LONGEST offset,
                            CORE_ADDR address,
                            struct ui_file *stream, int recurse,
-                           const struct value *val,
+                           struct value *val,
                            const struct value_print_options *options,
                            struct type **dont_print_vb, 
                            int dont_print_statmem)
 cp_print_value (struct type *type, struct type *real_type,
                const gdb_byte *valaddr, LONGEST offset,
                CORE_ADDR address, struct ui_file *stream,
-               int recurse, const struct value *val,
+               int recurse, struct value *val,
                const struct value_print_options *options,
                struct type **dont_print_vb)
 {
       struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
       const char *basename = TYPE_NAME (baseclass);
       const gdb_byte *base_valaddr = NULL;
-      const struct value *base_val = NULL;
+      struct value *base_val = NULL;
 
       if (BASETYPE_VIA_VIRTUAL (type, i))
        {
 
   opts = *options;
   opts.deref_ref = 0;
-  val_print (type, value_contents_for_printing (val), 
+  val_print (type,
             value_embedded_offset (val),
             value_address (val),
             stream, recurse, val,
 
 
 /* Defined in d-valprint.c  */
 
-extern void d_val_print (struct type *type, const gdb_byte *valaddr,
+extern void d_val_print (struct type *type,
                         int embedded_offset, CORE_ADDR address,
                         struct ui_file *stream, int recurse,
-                        const struct value *val,
+                        struct value *val,
                         const struct value_print_options *options);
 
 #endif /* !defined (D_LANG_H) */
 
    TYPE is a dynamic array, non-zero otherwise.  */
 
 static int
-dynamic_array_type (struct type *type, const gdb_byte *valaddr,
+dynamic_array_type (struct type *type,
                    LONGEST embedded_offset, CORE_ADDR address,
                    struct ui_file *stream, int recurse,
-                   const struct value *val,
+                   struct value *val,
                    const struct value_print_options *options)
 {
   if (TYPE_NFIELDS (type) == 2
       struct type *ptr_type;
       struct value *ival;
       int length;
+      const gdb_byte *valaddr = value_contents_for_printing (val);
 
       length = unpack_field_as_long (type, valaddr + embedded_offset, 0);
 
       true_type = value_type (ival);
 
       d_val_print (true_type,
-                  value_contents_for_printing (ival),
                   value_embedded_offset (ival), addr,
                   stream, recurse + 1, ival, options);
       return 0;
 
 /* Implements the la_val_print routine for language D.  */
 void
-d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+d_val_print (struct type *type, int embedded_offset,
              CORE_ADDR address, struct ui_file *stream, int recurse,
-            const struct value *val,
+            struct value *val,
              const struct value_print_options *options)
 {
   int ret;
   switch (TYPE_CODE (type))
     {
       case TYPE_CODE_STRUCT:
-        ret = dynamic_array_type (type, valaddr, embedded_offset, address,
+       ret = dynamic_array_type (type, embedded_offset, address,
                                  stream, recurse, val, options);
        if (ret == 0)
          break;
       default:
-       c_val_print (type, valaddr, embedded_offset, address, stream,
+       c_val_print (type, embedded_offset, address, stream,
                     recurse, val, options);
     }
 }
 
 extern void f_print_type (struct type *, const char *, struct ui_file *, int,
                          int, const struct type_print_options *);
 
-extern void f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
+extern void f_val_print (struct type *, int, CORE_ADDR,
                         struct ui_file *, int,
-                        const struct value *,
+                        struct value *,
                         const struct value_print_options *);
 
 /* Language-specific data structures */
 
          struct value *elt = value_subscript ((struct value *)val, i);
 
          val_print (value_type (elt),
-                    value_contents_for_printing (elt),
                     value_embedded_offset (elt),
                     value_address (elt), stream, recurse,
                     elt, options, current_language);
    function; they are identical.  */
 
 void
-f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+f_val_print (struct type *type, int embedded_offset,
             CORE_ADDR address, struct ui_file *stream, int recurse,
-            const struct value *original_value,
+            struct value *original_value,
             const struct value_print_options *options)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
   struct type *elttype;
   CORE_ADDR addr;
   int index;
+  const gdb_byte *valaddr =value_contents_for_printing (original_value);
 
   type = check_typedef (type);
   switch (TYPE_CODE (type))
     case TYPE_CODE_PTR:
       if (options->format && options->format != 's')
        {
-         val_print_scalar_formatted (type, valaddr, embedded_offset,
+         val_print_scalar_formatted (type, embedded_offset,
                                      original_value, options, 0, stream);
          break;
        }
 
          opts.format = (options->format ? options->format
                         : options->output_format);
-         val_print_scalar_formatted (type, valaddr, embedded_offset,
+         val_print_scalar_formatted (type, embedded_offset,
                                      original_value, &opts, 0, stream);
        }
       else
                }
 
              val_print (value_type (field),
-                        value_contents_for_printing (field),
                         value_embedded_offset (field),
                         value_address (field), stream, recurse + 1,
                         field, options, current_language);
     case TYPE_CODE_BOOL:
     case TYPE_CODE_CHAR:
     default:
-      generic_val_print (type, valaddr, embedded_offset, address,
+      generic_val_print (type, embedded_offset, address,
                         stream, recurse, original_value, options,
                         &f_decorations);
       break;
 
 
 /* Defined in go-valprint.c.  */
 
-extern void go_val_print (struct type *type, const gdb_byte *valaddr,
+extern void go_val_print (struct type *type,
                          int embedded_offset, CORE_ADDR address,
                          struct ui_file *stream, int recurse,
-                         const struct value *val,
+                         struct value *val,
                          const struct value_print_options *options);
 
 #endif /* !defined (GO_LANG_H) */
 
    gdb_assert (go_classify_struct_type (type) == GO_TYPE_STRING).  */
 
 static void
-print_go_string (struct type *type, const gdb_byte *valaddr,
+print_go_string (struct type *type,
                 LONGEST embedded_offset, CORE_ADDR address,
                 struct ui_file *stream, int recurse,
-                const struct value *val,
+                struct value *val,
                 const struct value_print_options *options)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
      unpack_value_field_as_pointer.  Do this until we can get
      unpack_value_field_as_pointer.  */
   LONGEST addr;
+  const gdb_byte *valaddr = value_contents_for_printing (val);
 
-  gdb_assert (valaddr == value_contents_for_printing_const (val));
 
   if (! unpack_value_field_as_long (type, valaddr, embedded_offset, 0,
                                    val, &addr))
 /* Implements the la_val_print routine for language Go.  */
 
 void
-go_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+go_val_print (struct type *type, int embedded_offset,
              CORE_ADDR address, struct ui_file *stream, int recurse,
-             const struct value *val,
+             struct value *val,
              const struct value_print_options *options)
 {
   type = check_typedef (type);
            case GO_TYPE_STRING:
              if (! options->raw)
                {
-                 print_go_string (type, valaddr, embedded_offset, address,
+                 print_go_string (type, embedded_offset, address,
                                   stream, recurse, val, options);
                  return;
                }
        /* Fall through.  */
 
       default:
-       c_val_print (type, valaddr, embedded_offset, address, stream,
+       c_val_print (type, embedded_offset, address, stream,
                     recurse, val, options);
        break;
     }
 
       opts.deref_ref = 1;
 
       val_print (regtype,
-                value_contents_for_printing (val),
                 value_embedded_offset (val), 0,
                 file, 0, val, &opts, current_language);
 
       get_formatted_print_options (&opts, 'x');
       opts.deref_ref = 1;
       val_print (regtype,
-                value_contents_for_printing (val),
                 value_embedded_offset (val), 0,
                 file, 0, val, &opts, current_language);
       /* If not a vector register, print it also according to its
          opts.deref_ref = 1;
          fprintf_filtered (file, "\t");
          val_print (regtype,
-                    value_contents_for_printing (val),
                     value_embedded_offset (val), 0,
                     file, 0, val, &opts, current_language);
        }
 
 }
 
 static void
-unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
+unk_lang_val_print (struct type *type,
                    int embedded_offset, CORE_ADDR address,
                    struct ui_file *stream, int recurse,
-                   const struct value *val,
+                   struct value *val,
                    const struct value_print_options *options)
 {
   error (_("internal error - unimplemented "
 
        
        TYPE is the type of the sub-object to be printed.
 
-       CONTENTS holds the bits of the value.  This holds the entire
-       enclosing object.
-
        EMBEDDED_OFFSET is the offset into the outermost object of the
        sub-object represented by TYPE.  This is the object which this
        call should print.  Note that the enclosing type is not
        printing.  */
 
     void (*la_val_print) (struct type *type,
-                         const gdb_byte *contents,
                          int embedded_offset, CORE_ADDR address,
                          struct ui_file *stream, int recurse,
-                         const struct value *val,
+                         struct value *val,
                          const struct value_print_options *options);
 
     /* Print a top-level value using syntax appropriate for this language.  */
 #define LA_PRINT_TYPEDEF(type,new_symbol,stream) \
   (current_language->la_print_typedef(type,new_symbol,stream))
 
-#define LA_VAL_PRINT(type,valaddr,offset,addr,stream,val,recurse,options) \
-  (current_language->la_val_print(type,valaddr,offset,addr,stream, \
-                                 val,recurse,options))
 #define LA_VALUE_PRINT(val,stream,options) \
   (current_language->la_value_print(val,stream,options))
 
 
 extern int m2_is_long_set (struct type *type);
 extern int m2_is_unbounded_array (struct type *type);
 
-extern void m2_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
+extern void m2_val_print (struct type *, int, CORE_ADDR,
                          struct ui_file *, int,
-                         const struct value *,
+                         struct value *,
                          const struct value_print_options *);
 
 extern int get_long_set_bounds (struct type *type, LONGEST *low,
 
 m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
                         int embedded_offset, CORE_ADDR address,
                         struct ui_file *stream, int recurse,
-                        const struct value *val,
+                        struct value *val,
                         const struct value_print_options *options,
                         int len);
 
 m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
                         int embedded_offset, CORE_ADDR address,
                         struct ui_file *stream, int recurse,
-                        const struct value *val,
+                        struct value *val,
                         const struct value_print_options *options,
                         int len)
 {
       else
        {
          fprintf_filtered (stream, "{");
-         val_print_array_elements (type, valaddr, embedded_offset,
+         val_print_array_elements (type, embedded_offset,
                                    address, stream, recurse, val,
                                    options, 0);
          fprintf_filtered (stream, "}");
    function; they are identical.  */
 
 void
-m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+m2_val_print (struct type *type, int embedded_offset,
              CORE_ADDR address, struct ui_file *stream, int recurse,
-             const struct value *original_value,
+             struct value *original_value,
              const struct value_print_options *options)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
   unsigned len;
   struct type *elttype;
   CORE_ADDR addr;
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   type = check_typedef (type);
   switch (TYPE_CODE (type))
          else
            {
              fprintf_filtered (stream, "{");
-             val_print_array_elements (type, valaddr, embedded_offset,
+             val_print_array_elements (type, embedded_offset,
                                        address, stream,
                                        recurse, original_value,
                                        options, 0);
        print_variable_at_address (type, valaddr + embedded_offset,
                                   stream, recurse, options);
       else if (options->format && options->format != 's')
-       val_print_scalar_formatted (type, valaddr, embedded_offset,
+       val_print_scalar_formatted (type, embedded_offset,
                                    original_value, options, 0, stream);
       else
        {
     case TYPE_CODE_RANGE:
       if (TYPE_LENGTH (type) == TYPE_LENGTH (TYPE_TARGET_TYPE (type)))
        {
-         m2_val_print (TYPE_TARGET_TYPE (type), valaddr, embedded_offset,
+         m2_val_print (TYPE_TARGET_TYPE (type), embedded_offset,
                        address, stream, recurse, original_value, options);
          break;
        }
     case TYPE_CODE_BOOL:
     case TYPE_CODE_CHAR:
     default:
-      generic_val_print (type, valaddr, embedded_offset, address,
+      generic_val_print (type, embedded_offset, address,
                         stream, recurse, original_value, options,
                         &m2_decorations);
       break;
 
   get_formatted_print_options (&opts, format);
   opts.deref_ref = 1;
   val_print (value_type (val),
-            value_contents_for_printing (val),
             value_embedded_offset (val), 0,
             stb, 0, val, &opts, current_language);
   ui_out_field_stream (uiout, "value", stb);
 
 
   get_formatted_print_options (&opts, 'x');
   val_print_scalar_formatted (value_type (val),
-                             value_contents_for_printing (val),
                              value_embedded_offset (val),
                              val,
                              &opts, 0, file);
 
          get_no_prettyformat_print_options (&opts);
          opts.deref_ref = 1;
          val_print (register_type (gdbarch, regnum),
-                    value_contents_for_printing (val),
                     0, 0, file, 0, val,
                     &opts, current_language);
          fputs_filtered ("\n", file);
 
 extern void pascal_print_typedef (struct type *, struct symbol *,
                                  struct ui_file *);
 
-extern void pascal_val_print (struct type *, const gdb_byte *, int,
+extern void pascal_val_print (struct type *, int,
                              CORE_ADDR, struct ui_file *, int,
-                             const struct value *,
+                             struct value *,
                              const struct value_print_options *);
 
 extern void pascal_value_print (struct value *, struct ui_file *,
                                              LONGEST,
                                              CORE_ADDR, struct ui_file *,
                                              int,
-                                             const struct value *,
+                                             struct value *,
                                              const struct value_print_options *,
                                              struct type **, int);
 
 
    function; they are identical.  */
 
 void
-pascal_val_print (struct type *type, const gdb_byte *valaddr,
+pascal_val_print (struct type *type,
                  int embedded_offset, CORE_ADDR address,
                  struct ui_file *stream, int recurse,
-                 const struct value *original_value,
+                 struct value *original_value,
                  const struct value_print_options *options)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
   struct type *char_type;
   CORE_ADDR addr;
   int want_space = 0;
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   type = check_typedef (type);
   switch (TYPE_CODE (type))
                {
                  i = 0;
                }
-             val_print_array_elements (type, valaddr, embedded_offset,
+             val_print_array_elements (type, embedded_offset,
                                        address, stream, recurse,
                                        original_value, options, i);
              fprintf_filtered (stream, "}");
     case TYPE_CODE_PTR:
       if (options->format && options->format != 's')
        {
-         val_print_scalar_formatted (type, valaddr, embedded_offset,
+         val_print_scalar_formatted (type, embedded_offset,
                                      original_value, options, 0, stream);
          break;
        }
     case TYPE_CODE_UNDEF:
     case TYPE_CODE_BOOL:
     case TYPE_CODE_CHAR:
-      generic_val_print (type, valaddr, embedded_offset, address,
+      generic_val_print (type, embedded_offset, address,
                         stream, recurse, original_value, options,
                         &p_decorations);
       break;
 static void pascal_object_print_value (struct type *, const gdb_byte *,
                                       LONGEST,
                                       CORE_ADDR, struct ui_file *, int,
-                                      const struct value *,
+                                      struct value *,
                                       const struct value_print_options *,
                                       struct type **);
 
                                  LONGEST offset,
                                  CORE_ADDR address, struct ui_file *stream,
                                  int recurse,
-                                 const struct value *val,
+                                 struct value *val,
                                  const struct value_print_options *options,
                                  struct type **dont_print_vb,
                                  int dont_print_statmem)
                     address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
                     stream, format, 0, recurse + 1, pretty); */
                  val_print (TYPE_FIELD_TYPE (type, i),
-                            valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
+                            offset + TYPE_FIELD_BITPOS (type, i) / 8,
                             address, stream, recurse + 1, val, &opts,
                             current_language);
                }
                           LONGEST offset,
                           CORE_ADDR address, struct ui_file *stream,
                           int recurse,
-                          const struct value *val,
+                          struct value *val,
                           const struct value_print_options *options,
                           struct type **dont_print_vb)
 {
 
     /* User specified format, so don't look to the type to tell us
        what to do.  */
     val_print_scalar_formatted (type,
-                               value_contents_for_printing (val),
                                value_embedded_offset (val),
                                val,
                                options, size, stream);
 
 static struct disr_info
 rust_get_disr_info (struct type *type, const gdb_byte *valaddr,
                     int embedded_offset, CORE_ADDR address,
-                    const struct value *val)
+                    struct value *val)
 {
   int i;
   struct disr_info ret;
   cleanup = make_cleanup_ui_file_delete (temp_file);
   /* The first value of the first field (or any field)
      is the discriminant value.  */
-  c_val_print (TYPE_FIELD_TYPE (disr_type, 0), valaddr,
+  c_val_print (TYPE_FIELD_TYPE (disr_type, 0),
               (embedded_offset + TYPE_FIELD_BITPOS (type, 0) / 8
                + TYPE_FIELD_BITPOS (disr_type, 0) / 8),
               address, temp_file,
 /* rust_print_type branch for structs and untagged unions.  */
 
 static void
-val_print_struct (struct type *type, const gdb_byte *valaddr,
-                 int embedded_offset, CORE_ADDR address, struct ui_file *stream,
-                 int recurse, const struct value *val,
+val_print_struct (struct type *type, int embedded_offset,
+                 CORE_ADDR address, struct ui_file *stream,
+                 int recurse, struct value *val,
                  const struct value_print_options *options)
 {
   int i;
         }
 
       val_print (TYPE_FIELD_TYPE (type, i),
-           valaddr,
            embedded_offset + TYPE_FIELD_BITPOS (type, i) / 8,
            address,
            stream, recurse + 1, val, &opts,
 /* la_val_print implementation for Rust.  */
 
 static void
-rust_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+rust_val_print (struct type *type, int embedded_offset,
                CORE_ADDR address, struct ui_file *stream, int recurse,
-               const struct value *val,
+               struct value *val,
                const struct value_print_options *options)
 {
+  const gdb_byte *valaddr = value_contents_for_printing (val);
+
   type = check_typedef (type);
   switch (TYPE_CODE (type))
     {
 
     case TYPE_CODE_METHODPTR:
     case TYPE_CODE_MEMBERPTR:
-      c_val_print (type, valaddr, embedded_offset, address, stream,
+      c_val_print (type, embedded_offset, address, stream,
                   recurse, val, options);
       break;
 
      fields.  */
   if (rust_union_is_untagged (type))
     {
-      val_print_struct (type, valaddr, embedded_offset, address, stream,
+      val_print_struct (type, embedded_offset, address, stream,
                          recurse, val, options);
       break;
     }
                                TYPE_FIELD_NAME (variant_type, j));
 
            val_print (TYPE_FIELD_TYPE (variant_type, j),
-                      valaddr,
                       (embedded_offset
                        + TYPE_FIELD_BITPOS (type, disr.field_no) / 8
                        + TYPE_FIELD_BITPOS (variant_type, j) / 8),
       break;
 
     case TYPE_CODE_STRUCT:
-      val_print_struct (type, valaddr, embedded_offset, address, stream,
-       recurse, val, options);
+      val_print_struct (type, embedded_offset, address, stream,
+                       recurse, val, options);
       break;
 
     default:
     generic_print:
       /* Nothing special yet.  */
-      generic_val_print (type, valaddr, embedded_offset, address, stream,
+      generic_val_print (type, embedded_offset, address, stream,
                         recurse, val, options, &rust_decorations);
     }
 }
 
   get_formatted_print_options (&opts, 'x');
   opts.deref_ref = 1;
   val_print (register_type (gdbarch, regnum),
-            value_contents_for_printing (val), 0, 0,
+            0, 0,
             file, 0, val, &opts, current_language);
   fprintf_filtered (file, "\t");
   get_formatted_print_options (&opts, 0);
   opts.deref_ref = 1;
   val_print (register_type (gdbarch, regnum),
-            value_contents_for_printing (val), 0, 0,
+            0, 0,
             file, 0, val, &opts, current_language);
   fprintf_filtered (file, "\n");
 }
 
 /* generic_val_print helper for TYPE_CODE_ARRAY.  */
 
 static void
-generic_val_print_array (struct type *type, const gdb_byte *valaddr,
+generic_val_print_array (struct type *type,
                         int embedded_offset, CORE_ADDR address,
                         struct ui_file *stream, int recurse,
-                        const struct value *original_value,
+                        struct value *original_value,
                         const struct value_print_options *options,
                         const struct
                             generic_val_print_decorations *decorations)
        }
 
       fputs_filtered (decorations->array_start, stream);
-      val_print_array_elements (type, valaddr, embedded_offset,
+      val_print_array_elements (type, embedded_offset,
                                address, stream,
                                recurse, original_value, options, 0);
       fputs_filtered (decorations->array_end, stream);
 /* generic_val_print helper for TYPE_CODE_PTR.  */
 
 static void
-generic_val_print_ptr (struct type *type, const gdb_byte *valaddr,
+generic_val_print_ptr (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);
 
   if (options->format && options->format != 's')
     {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, options, 0, stream);
     }
   else
     {
       struct type *unresolved_elttype = TYPE_TARGET_TYPE(type);
       struct type *elttype = check_typedef (unresolved_elttype);
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
       CORE_ADDR addr = unpack_pointer (type,
                                       valaddr + embedded_offset * unit_size);
 
 /* generic_val_print helper for TYPE_CODE_MEMBERPTR.  */
 
 static void
-generic_val_print_memberptr (struct type *type, const gdb_byte *valaddr,
+generic_val_print_memberptr (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)
 {
-  val_print_scalar_formatted (type, valaddr, embedded_offset,
+  val_print_scalar_formatted (type, embedded_offset,
                              original_value, options, 0, stream);
 }
 
 /* generic_val_print helper for TYPE_CODE_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));
   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 gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   if (must_coerce_ref && type_is_defined)
     {
 /* 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;
 
   if (options->format)
     {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, options, 0, stream);
-      return;
     }
-  val = unpack_long (type, valaddr + embedded_offset * unit_size);
+  else
+    {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
+      val = unpack_long (type, valaddr + embedded_offset * unit_size);
 
-  generic_val_print_enum_1 (type, val, stream);
+      generic_val_print_enum_1 (type, val, stream);
+    }
 }
 
 /* generic_val_print helper for TYPE_CODE_FLAGS.  */
 
 static void
-generic_val_print_flags (struct type *type, const gdb_byte *valaddr,
+generic_val_print_flags (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)
 
 {
   if (options->format)
-    val_print_scalar_formatted (type, valaddr, embedded_offset, original_value,
+    val_print_scalar_formatted (type, embedded_offset, original_value,
                                options, 0, stream);
   else
-    val_print_type_code_flags (type, valaddr + embedded_offset, stream);
+    {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
+      val_print_type_code_flags (type, valaddr + embedded_offset, 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,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, options, 0, stream);
     }
   else
 /* generic_val_print helper for TYPE_CODE_BOOL.  */
 
 static void
-generic_val_print_bool (struct type *type, const gdb_byte *valaddr,
+generic_val_print_bool (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,
                        const struct generic_val_print_decorations *decorations)
 {
       struct value_print_options opts = *options;
       opts.format = (options->format ? options->format
                     : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, &opts, 0, stream);
     }
   else
     {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
       val = unpack_long (type, valaddr + embedded_offset * unit_size);
       if (val == 0)
        fputs_filtered (decorations->false_name, stream);
 /* generic_val_print helper for TYPE_CODE_INT.  */
 
 static void
-generic_val_print_int (struct type *type, const gdb_byte *valaddr,
+generic_val_print_int (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);
 
       opts.format = (options->format ? options->format
                     : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, &opts, 0, stream);
     }
   else
-    val_print_type_code_int (type, valaddr + embedded_offset * unit_size,
-                            stream);
+    {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
+      val_print_type_code_int (type, valaddr + embedded_offset * unit_size,
+                              stream);
+    }
 }
 
 /* generic_val_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,
+                       int embedded_offset,
                        struct ui_file *stream,
-                       const struct value *original_value,
+                       struct value *original_value,
                        const struct value_print_options *options)
 {
   LONGEST val;
 
       opts.format = (options->format ? options->format
                     : options->output_format);
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, &opts, 0, stream);
     }
   else
     {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
       val = unpack_long (type, valaddr + embedded_offset * unit_size);
       if (TYPE_UNSIGNED (type))
        fprintf_filtered (stream, "%u", (unsigned int) val);
 /* generic_val_print helper for TYPE_CODE_FLT.  */
 
 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);
 
   if (options->format)
     {
-      val_print_scalar_formatted (type, valaddr, embedded_offset,
+      val_print_scalar_formatted (type, embedded_offset,
                                  original_value, options, 0, stream);
     }
   else
     {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
       print_floating (valaddr + embedded_offset * unit_size, type, stream);
     }
 }
 /* generic_val_print helper for TYPE_CODE_DECFLOAT.  */
 
 static void
-generic_val_print_decfloat (struct type *type, const gdb_byte *valaddr,
+generic_val_print_decfloat (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,
+    val_print_scalar_formatted (type, embedded_offset, original_value,
                                options, 0, stream);
   else
-    print_decimal_floating (valaddr + embedded_offset * unit_size, type,
-                           stream);
+    {
+      const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
+      print_decimal_floating (valaddr + embedded_offset * unit_size, type,
+                             stream);
+    }
 }
 
 /* generic_val_print helper for TYPE_CODE_COMPLEX.  */
 
 static void
-generic_val_print_complex (struct type *type, const gdb_byte *valaddr,
+generic_val_print_complex (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,
                           const struct generic_val_print_decorations
                             *decorations)
 {
   struct gdbarch *gdbarch = get_type_arch (type);
   int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
+  const gdb_byte *valaddr = value_contents_for_printing (original_value);
 
   fprintf_filtered (stream, "%s", decorations->complex_prefix);
   if (options->format)
-    val_print_scalar_formatted (TYPE_TARGET_TYPE (type), valaddr,
+    val_print_scalar_formatted (TYPE_TARGET_TYPE (type),
                                embedded_offset, original_value, options, 0,
                                stream);
   else
                    TYPE_TARGET_TYPE (type), stream);
   fprintf_filtered (stream, "%s", decorations->complex_infix);
   if (options->format)
-    val_print_scalar_formatted (TYPE_TARGET_TYPE (type), valaddr,
+    val_print_scalar_formatted (TYPE_TARGET_TYPE (type),
                                embedded_offset
                                + type_length_units (TYPE_TARGET_TYPE (type)),
                                original_value, options, 0, stream);
    output in some small, language-specific ways.  */
 
 void
-generic_val_print (struct type *type, const gdb_byte *valaddr,
+generic_val_print (struct type *type,
                   int embedded_offset, CORE_ADDR address,
                   struct ui_file *stream, int recurse,
-                  const struct value *original_value,
+                  struct value *original_value,
                   const struct value_print_options *options,
                   const struct generic_val_print_decorations *decorations)
 {
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_ARRAY:
-      generic_val_print_array (type, valaddr, embedded_offset, address, stream,
+      generic_val_print_array (type, embedded_offset, address, stream,
                               recurse, original_value, options, decorations);
       break;
 
     case TYPE_CODE_MEMBERPTR:
-      generic_val_print_memberptr (type, valaddr, embedded_offset, stream,
+      generic_val_print_memberptr (type, embedded_offset, stream,
                                   original_value, options);
       break;
 
     case TYPE_CODE_PTR:
-      generic_val_print_ptr (type, valaddr, embedded_offset, stream,
+      generic_val_print_ptr (type, embedded_offset, stream,
                             original_value, options);
       break;
 
     case TYPE_CODE_REF:
-      generic_val_print_ref (type, valaddr, embedded_offset, stream, recurse,
+      generic_val_print_ref (type, embedded_offset, stream, recurse,
                             original_value, options);
       break;
 
     case TYPE_CODE_ENUM:
-      generic_val_print_enum (type, valaddr, embedded_offset, stream,
+      generic_val_print_enum (type, embedded_offset, stream,
                              original_value, options);
       break;
 
     case TYPE_CODE_FLAGS:
-      generic_val_print_flags (type, valaddr, embedded_offset, stream,
+      generic_val_print_flags (type, embedded_offset, stream,
                               original_value, options);
       break;
 
     case TYPE_CODE_FUNC:
     case TYPE_CODE_METHOD:
-      generic_val_print_func (type, valaddr, embedded_offset, address, stream,
+      generic_val_print_func (type, embedded_offset, address, stream,
                              original_value, options);
       break;
 
     case TYPE_CODE_BOOL:
-      generic_val_print_bool (type, valaddr, embedded_offset, stream,
+      generic_val_print_bool (type, embedded_offset, stream,
                              original_value, options, decorations);
       break;
 
       /* FALLTHROUGH */
 
     case TYPE_CODE_INT:
-      generic_val_print_int (type, valaddr, embedded_offset, stream,
+      generic_val_print_int (type, embedded_offset, stream,
                             original_value, options);
       break;
 
     case TYPE_CODE_CHAR:
-      generic_val_print_char (type, unresolved_type, valaddr, embedded_offset,
+      generic_val_print_char (type, unresolved_type, embedded_offset,
                              stream, original_value, options);
       break;
 
     case TYPE_CODE_FLT:
-      generic_val_print_float (type, valaddr, embedded_offset, stream,
+      generic_val_print_float (type, embedded_offset, stream,
                               original_value, options);
       break;
 
     case TYPE_CODE_DECFLOAT:
-      generic_val_print_decfloat (type, valaddr, embedded_offset, stream,
+      generic_val_print_decfloat (type, embedded_offset, stream,
                                  original_value, options);
       break;
 
       break;
 
     case TYPE_CODE_COMPLEX:
-      generic_val_print_complex (type, valaddr, embedded_offset, stream,
+      generic_val_print_complex (type, embedded_offset, stream,
                                 original_value, options, decorations);
       break;
 
 }
 
 /* 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.
+   VAL's contents buffer + 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.
 
    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
+   such cases, VAL is passed down unadjusted, 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
    RECURSE.  */
 
 void
-val_print (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset,
+val_print (struct type *type, LONGEST embedded_offset,
           CORE_ADDR address, struct ui_file *stream, int recurse,
-          const struct value *val,
+          struct value *val,
           const struct value_print_options *options,
           const struct language_defn *language)
 {
 
   if (!options->raw)
     {
+      const gdb_byte *valaddr = value_contents_for_printing (val);
+
       ret = apply_ext_lang_val_pretty_printer (type, valaddr, embedded_offset,
                                               address, stream, recurse,
                                               val, options, language);
 
   TRY
     {
-      language->la_val_print (type, valaddr, embedded_offset, address,
+      language->la_val_print (type, embedded_offset, address,
                              stream, recurse, val,
                              &local_opts);
     }
        get a fixed representation of our value.  */
     val = ada_to_fixed_value (val);
 
-  val_print (value_type (val), value_contents_for_printing (val),
+  val_print (value_type (val),
             value_embedded_offset (val), value_address (val),
             stream, recurse,
             val, options, language);
 
 void
 val_print_scalar_formatted (struct type *type,
-                           const gdb_byte *valaddr, LONGEST embedded_offset,
-                           const struct value *val,
+                           LONGEST embedded_offset,
+                           struct value *val,
                            const struct value_print_options *options,
                            int size,
                            struct ui_file *stream)
   int unit_size = gdbarch_addressable_memory_unit_size (arch);
 
   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
       struct value_print_options opts = *options;
       opts.format = 0;
       opts.deref_ref = 0;
-      val_print (type, valaddr, embedded_offset, 0, stream, 0, val, &opts,
+      val_print (type, embedded_offset, 0, stream, 0, val, &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,
 
 void
 val_print_array_elements (struct type *type,
-                         const gdb_byte *valaddr, LONGEST embedded_offset,
+                         LONGEST embedded_offset,
                          CORE_ADDR address, struct ui_file *stream,
                          int recurse,
-                         const struct value *val,
+                         struct value *val,
                          const struct value_print_options *options,
                          unsigned int i)
 {
 
       if (reps > options->repeat_count_threshold)
        {
-         val_print (elttype, valaddr, embedded_offset + i * eltlen,
+         val_print (elttype, embedded_offset + i * eltlen,
                     address, stream, recurse + 1, val, options,
                     current_language);
          annotate_elt_rep (reps);
        }
       else
        {
-         val_print (elttype, valaddr, embedded_offset + i * eltlen,
+         val_print (elttype, embedded_offset + i * eltlen,
                     address,
                     stream, recurse + 1, val, options, current_language);
          annotate_elt ();
 
                                      struct ui_file *stream,
                                     const struct value_print_options *);
 
-extern void val_print_array_elements (struct type *, const gdb_byte *, LONGEST,
+extern void val_print_array_elements (struct type *, LONGEST,
                                      CORE_ADDR, struct ui_file *, int,
-                                     const struct value *,
+                                     struct value *,
                                      const struct value_print_options *,
                                      unsigned int);
 
                                     struct ui_file *);
 
 extern void val_print_scalar_formatted (struct type *,
-                                       const gdb_byte *, LONGEST,
-                                       const struct value *,
+                                       LONGEST,
+                                       struct value *,
                                        const struct value_print_options *,
                                        int,
                                        struct ui_file *);
 };
 
 
-extern void generic_val_print (struct type *type, const gdb_byte *valaddr,
+extern void generic_val_print (struct type *type,
                               int embedded_offset, CORE_ADDR address,
                               struct ui_file *stream, int recurse,
-                              const struct value *original_value,
+                              struct value *original_value,
                               const struct value_print_options *options,
                               const struct generic_val_print_decorations *);
 
 
 
 extern struct value *value_release_to_mark (const struct value *mark);
 
-extern void val_print (struct type *type, const gdb_byte *valaddr,
+extern void val_print (struct type *type,
                       LONGEST embedded_offset, CORE_ADDR address,
                       struct ui_file *stream, int recurse,
-                      const struct value *val,
+                      struct value *val,
                       const struct value_print_options *options,
                       const struct language_defn *language);