diff mbox

[2/2] Remove parameter valaddr from la_val_print

Message ID CAH=s-PN5Ya4X1jN=Wg3LTVUkTHj8ai0DiFE7Ki2=ondfvFbmiA@mail.gmail.com
State New
Headers show

Commit Message

Yao Qi Nov. 8, 2016, 3:29 p.m. UTC
On Tue, Nov 8, 2016 at 2:01 PM, Ulrich Weigand <uweigand@de.ibm.com> wrote:
> Yao Qi wrote:

>

>> If we go to the direction you suggested, val_print routines shouldn't

>> assume that VAL contents are already fetched.  Before we do printing,

>> optimized-out checking, or available checking, we should make sure VAL

>> is not lazy.  Nowadays, we can't fetch the value partially, because

>> 'lazy' is a bool attribute, we either fetched all contents or haven't

>> fetch all contents.

>

> Right.  But if we ever went to actually create sub-value objects, then

> we might be able to take advantage of only fetching the contents for

> those sub-objects are actually printed.  In any case, I still think

> this new patch is preferable over calling value_fetch_lazy all the

> time ...

>

>> How is the patch below?  I don't write the ChangeLog entry yet.

>> Regression tested on x86_64-linux.

>

> Looks good to me.


Thanks, I'll push it in.

>

>> --- a/gdb/extension.c

>> +++ b/gdb/extension.c

>> @@ -478,9 +478,9 @@ free_ext_lang_type_printers (struct ext_lang_type_print=

>> ers *printers)

>>    xfree (printers);

>>  }

>>  =0C

>> -/* Try to pretty-print a value of type TYPE located at VALADDR

>> -   + EMBEDDED_OFFSET, which came from the inferior at address ADDRESS

>> -   + EMBEDDED_OFFSET, onto stdio stream STREAM according to OPTIONS.

>> +/* Try to pretty-print a value of type TYPE located at VAL's contents

>> +   buffer + EMBEDDED_OFFSET, which came from the inferior at address

>> +   ADDRESS + EMBEDDED_OFFSET, onto stdio stream STREAM according to OPTION=

>> S.

>>     VAL is the whole object that came from ADDRESS.  VALADDR must point to

>>     the head of VAL's contents buffer.

>>     Returns non-zero if the value was successfully pretty-printed.

>

> This changes the comment but not the actual implementation, this seems

> to be an oversight?

>


It is a mistake in patch splitting.  It is removed from this patch.  Patch
attached is pushed in, with ChangeLog entry.

-- 
Yao (齐尧)
diff mbox

Patch

From e6f70b5c128b5179e0841cbe662e0a57b4e94ad5 Mon Sep 17 00:00:00 2001
From: Yao Qi <yao.qi@linaro.org>
Date: Tue, 8 Nov 2016 09:42:13 +0000
Subject: [PATCH] Remove parameter valaddr from la_val_print

Nowadays, we pass both val and return value of
value_contents_for_printing (val) to la_val_print.  The latter is
unnecessary.  This patch removes the second parameter of la_val_print,
and get valaddr in each language's implementation by calling
value_contents_for_printing.  Since value_contents_for_printing calls
value_fetch_lazy, I also make VAL non-const.

Note that
 - I don't clean up the valaddr usages in each language's routines,
 - I don't remove valaddr from apply_ext_lang_val_pretty_printer, and
   extension language ops apply_val_pretty_printer.

They can be done in followup patches.

gdb:

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.
---
 gdb/ChangeLog      |  84 +++++++++++++++++++++++
 gdb/ada-lang.h     |   4 +-
 gdb/ada-valprint.c |  68 ++++++++++---------
 gdb/c-lang.h       |   8 +--
 gdb/c-valprint.c   |  33 +++++-----
 gdb/cp-valprint.c  |  13 ++--
 gdb/d-lang.h       |   4 +-
 gdb/d-valprint.c   |  14 ++--
 gdb/f-lang.h       |   4 +-
 gdb/f-valprint.c   |  13 ++--
 gdb/go-lang.h      |   4 +-
 gdb/go-valprint.c  |  14 ++--
 gdb/infcmd.c       |   3 -
 gdb/language.c     |   4 +-
 gdb/language.h     |   9 +--
 gdb/m2-lang.h      |   4 +-
 gdb/m2-valprint.c  |  19 +++---
 gdb/mi/mi-main.c   |   1 -
 gdb/mips-tdep.c    |   1 -
 gdb/mt-tdep.c      |   1 -
 gdb/p-lang.h       |   6 +-
 gdb/p-valprint.c   |  19 +++---
 gdb/printcmd.c     |   1 -
 gdb/rust-lang.c    |  28 ++++----
 gdb/sh64-tdep.c    |   4 +-
 gdb/valprint.c     | 190 +++++++++++++++++++++++++++++++----------------------
 gdb/valprint.h     |  12 ++--
 gdb/value.h        |   4 +-
 28 files changed, 334 insertions(+), 235 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index cc7f9a0..0fc518c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,89 @@ 
 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>
+
 	* aarch64-tdep.c (aarch64_software_single_step): Return
 	VEC (CORE_ADDR) *.  Return NULL instead of 0.  Don't call
 	insert_single_step_breakpoint.
diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h
index 7de71eb..daa59e5 100644
--- a/gdb/ada-lang.h
+++ b/gdb/ada-lang.h
@@ -168,9 +168,9 @@  extern void ada_print_type (struct type *, const char *, struct ui_file *, int,
 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 *,
diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c
index 6b4b6d4..b001d33 100644
--- a/gdb/ada-valprint.c
+++ b/gdb/ada-valprint.c
@@ -35,7 +35,7 @@ 
 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 *);
@@ -122,7 +122,7 @@  val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
 				 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;
@@ -196,7 +196,7 @@  val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
 	  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);
@@ -227,7 +227,7 @@  val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
 		  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 ();
@@ -533,7 +533,7 @@  static int
 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,
@@ -573,7 +573,7 @@  print_variant_part (struct type *type, int field_num,
 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,
@@ -633,8 +633,6 @@  print_field_values (struct type *type, const gdb_byte *valaddr,
 
       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))
@@ -643,6 +641,7 @@  print_field_values (struct type *type, const gdb_byte *valaddr,
 	    }
 	  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;
@@ -656,7 +655,6 @@  print_field_values (struct type *type, const gdb_byte *valaddr,
 	      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);
@@ -667,7 +665,7 @@  print_field_values (struct type *type, const gdb_byte *valaddr,
 	  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);
 	}
@@ -684,7 +682,7 @@  static void
 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));
@@ -732,7 +730,7 @@  static void
 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)
 {
@@ -754,7 +752,7 @@  ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
       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);
@@ -767,11 +765,11 @@  static void
 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))
@@ -794,7 +792,7 @@  static void
 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)
 {
@@ -820,12 +818,12 @@  ada_val_print_num (struct type *type, const gdb_byte *valaddr,
 	    = 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;
@@ -840,7 +838,7 @@  ada_val_print_num (struct type *type, const gdb_byte *valaddr,
 	  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))
@@ -884,7 +882,7 @@  static void
 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)
 {
@@ -894,7 +892,7 @@  ada_val_print_enum (struct type *type, const gdb_byte *valaddr,
 
   if (options->format)
     {
-      val_print_scalar_formatted (type, valaddr, offset_aligned,
+      val_print_scalar_formatted (type, offset_aligned,
 				  original_value, options, 0, stream);
       return;
     }
@@ -928,13 +926,13 @@  static void
 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;
     }
@@ -949,7 +947,7 @@  static void
 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)
 {
@@ -980,7 +978,7 @@  static void
 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.  */
@@ -1000,7 +998,7 @@  ada_val_print_array (struct type *type, const gdb_byte *valaddr,
 				     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, ")");
@@ -1013,7 +1011,7 @@  static void
 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)
 {
@@ -1063,7 +1061,6 @@  ada_val_print_ref (struct type *type, const gdb_byte *valaddr,
   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);
@@ -1073,14 +1070,15 @@  ada_val_print_ref (struct type *type, const gdb_byte *valaddr,
    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);
 
@@ -1102,7 +1100,7 @@  ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
   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;
 
@@ -1156,17 +1154,17 @@  ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
    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);
     }
@@ -1221,7 +1219,7 @@  ada_value_print (struct value *val0, struct ui_file *stream,
 
   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);
 }
diff --git a/gdb/c-lang.h b/gdb/c-lang.h
index 12be8bf..79f8580 100644
--- a/gdb/c-lang.h
+++ b/gdb/c-lang.h
@@ -76,10 +76,10 @@  extern void c_print_typedef (struct type *,
 			     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 *,
@@ -125,14 +125,14 @@  extern void cp_print_class_member (const gdb_byte *, struct type *,
 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);
 
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index 2cb418d..a90da88 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -233,7 +233,7 @@  static void
 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);
@@ -325,7 +325,7 @@  c_val_print_array (struct type *type, const gdb_byte *valaddr,
 	    {
 	      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, "}");
@@ -345,7 +345,7 @@  c_val_print_array (struct type *type, const gdb_byte *valaddr,
 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);
@@ -353,7 +353,7 @@  c_val_print_ptr (struct type *type, const gdb_byte *valaddr,
 
   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))
@@ -386,7 +386,7 @@  static void
 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))
@@ -418,7 +418,7 @@  static void
 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)
@@ -437,7 +437,7 @@  c_val_print_union (struct type *type, const gdb_byte *valaddr,
 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);
@@ -449,7 +449,7 @@  c_val_print_int (struct type *type, struct type *unresolved_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
@@ -476,7 +476,7 @@  static void
 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)
@@ -485,7 +485,7 @@  c_val_print_memberptr (struct type *type, const gdb_byte *valaddr,
     }
   else
     {
-      generic_val_print (type, valaddr, embedded_offset, address, stream,
+      generic_val_print (type, embedded_offset, address, stream,
 			 recurse, original_value, options, &c_decorations);
     }
 }
@@ -494,13 +494,14 @@  c_val_print_memberptr (struct type *type, const gdb_byte *valaddr,
    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))
@@ -554,7 +555,7 @@  c_val_print (struct type *type, const gdb_byte *valaddr,
     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;
@@ -669,7 +670,7 @@  c_value_print (struct value *val, struct ui_file *stream,
 	  /* 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;
@@ -682,7 +683,7 @@  c_value_print (struct value *val, struct ui_file *stream,
 	  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;
@@ -690,7 +691,7 @@  c_value_print (struct value *val, struct ui_file *stream,
       /* 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,
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index 5fb2561..82e505a 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -82,7 +82,7 @@  static void cp_print_static_field (struct type *, struct value *,
 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 **);
 
@@ -156,7 +156,7 @@  void
 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)
@@ -353,7 +353,6 @@  cp_print_value_fields (struct type *type, struct type *real_type,
 
 		  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,
@@ -420,7 +419,7 @@  cp_print_value_fields_rtti (struct type *type,
 			    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)
@@ -462,7 +461,7 @@  static void
 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)
 {
@@ -489,7 +488,7 @@  cp_print_value (struct type *type, struct type *real_type,
       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))
 	{
@@ -708,7 +707,7 @@  cp_print_static_field (struct type *type,
 
   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,
diff --git a/gdb/d-lang.h b/gdb/d-lang.h
index 74be7a5..52f4e6a 100644
--- a/gdb/d-lang.h
+++ b/gdb/d-lang.h
@@ -80,10 +80,10 @@  extern struct block_symbol d_lookup_nested_symbol (struct type *, const char *,
 
 /* 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) */
diff --git a/gdb/d-valprint.c b/gdb/d-valprint.c
index 620688b..109b54f 100644
--- a/gdb/d-valprint.c
+++ b/gdb/d-valprint.c
@@ -28,10 +28,10 @@ 
    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
@@ -48,6 +48,7 @@  dynamic_array_type (struct type *type, const gdb_byte *valaddr,
       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);
 
@@ -63,7 +64,6 @@  dynamic_array_type (struct type *type, const gdb_byte *valaddr,
       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;
@@ -73,9 +73,9 @@  dynamic_array_type (struct type *type, const gdb_byte *valaddr,
 
 /* 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;
@@ -84,12 +84,12 @@  d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
   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);
     }
 }
diff --git a/gdb/f-lang.h b/gdb/f-lang.h
index 827785a..a086105 100644
--- a/gdb/f-lang.h
+++ b/gdb/f-lang.h
@@ -30,9 +30,9 @@  extern void f_yyerror (char *);	/* Defined in f-exp.y */
 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 */
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
index e1a677e..a39c801 100644
--- a/gdb/f-valprint.c
+++ b/gdb/f-valprint.c
@@ -152,7 +152,6 @@  f77_print_array_1 (int nss, int ndimensions, struct type *type,
 	  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);
@@ -211,9 +210,9 @@  static const struct generic_val_print_decorations f_decorations =
    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);
@@ -222,6 +221,7 @@  f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
   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))
@@ -256,7 +256,7 @@  f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
     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;
 	}
@@ -306,7 +306,7 @@  f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 
 	  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
@@ -355,7 +355,6 @@  f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 		}
 
 	      val_print (value_type (field),
-			 value_contents_for_printing (field),
 			 value_embedded_offset (field),
 			 value_address (field), stream, recurse + 1,
 			 field, options, current_language);
@@ -378,7 +377,7 @@  f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
     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;
diff --git a/gdb/go-lang.h b/gdb/go-lang.h
index 5eb298e..fa96f53 100644
--- a/gdb/go-lang.h
+++ b/gdb/go-lang.h
@@ -84,10 +84,10 @@  extern void go_print_type (struct type *type, const char *varstring,
 
 /* 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) */
diff --git a/gdb/go-valprint.c b/gdb/go-valprint.c
index 34ed8e0..ad954c1 100644
--- a/gdb/go-valprint.c
+++ b/gdb/go-valprint.c
@@ -36,10 +36,10 @@ 
    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);
@@ -51,8 +51,8 @@  print_go_string (struct type *type, const gdb_byte *valaddr,
      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))
@@ -86,9 +86,9 @@  print_go_string (struct type *type, const gdb_byte *valaddr,
 /* 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);
@@ -104,7 +104,7 @@  go_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 	    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;
 		}
@@ -116,7 +116,7 @@  go_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 	/* Fall through.  */
 
       default:
-	c_val_print (type, valaddr, embedded_offset, address, stream,
+	c_val_print (type, embedded_offset, address, stream,
 		     recurse, val, options);
 	break;
     }
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 8e34b7e..05eb89e 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -2320,7 +2320,6 @@  default_print_one_register_info (struct ui_file *file,
       opts.deref_ref = 1;
 
       val_print (regtype,
-		 value_contents_for_printing (val),
 		 value_embedded_offset (val), 0,
 		 file, 0, val, &opts, current_language);
 
@@ -2339,7 +2338,6 @@  default_print_one_register_info (struct ui_file *file,
       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
@@ -2350,7 +2348,6 @@  default_print_one_register_info (struct ui_file *file,
 	  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);
 	}
diff --git a/gdb/language.c b/gdb/language.c
index 39faecc..0e13abe 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -783,10 +783,10 @@  unk_lang_print_type (struct type *type, const char *varstring,
 }
 
 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 "
diff --git a/gdb/language.h b/gdb/language.h
index d6f932e..046664b 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -219,9 +219,6 @@  struct language_defn
        
        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
@@ -237,10 +234,9 @@  struct language_defn
        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.  */
@@ -515,9 +511,6 @@  extern enum language set_language (enum 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))
 
diff --git a/gdb/m2-lang.h b/gdb/m2-lang.h
index b749b21..b35a0ca 100644
--- a/gdb/m2-lang.h
+++ b/gdb/m2-lang.h
@@ -34,9 +34,9 @@  extern void m2_print_typedef (struct type *, struct symbol *,
 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,
diff --git a/gdb/m2-valprint.c b/gdb/m2-valprint.c
index a53aa84..f43a2d2 100644
--- a/gdb/m2-valprint.c
+++ b/gdb/m2-valprint.c
@@ -37,7 +37,7 @@  static void
 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);
 
@@ -262,7 +262,7 @@  static void
 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)
 {
@@ -282,7 +282,7 @@  m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
       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, "}");
@@ -308,15 +308,16 @@  static const struct generic_val_print_decorations m2_decorations =
    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))
@@ -356,7 +357,7 @@  m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 	  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);
@@ -373,7 +374,7 @@  m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 	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
 	{
@@ -469,7 +470,7 @@  m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
     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;
 	}
@@ -494,7 +495,7 @@  m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
     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;
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 3b071af..3901203 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -1290,7 +1290,6 @@  output_register (struct frame_info *frame, int regnum, int format,
   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);
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index c2c88a6..c0c6442 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -6356,7 +6356,6 @@  mips_print_register (struct ui_file *file, struct frame_info *frame,
 
   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);
diff --git a/gdb/mt-tdep.c b/gdb/mt-tdep.c
index c08e805..e958cc4 100644
--- a/gdb/mt-tdep.c
+++ b/gdb/mt-tdep.c
@@ -726,7 +726,6 @@  mt_registers_info (struct gdbarch *gdbarch,
 	  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);
diff --git a/gdb/p-lang.h b/gdb/p-lang.h
index 287c0f4..5d3a685 100644
--- a/gdb/p-lang.h
+++ b/gdb/p-lang.h
@@ -36,9 +36,9 @@  extern void pascal_print_type (struct type *, const char *, struct ui_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 *,
@@ -75,7 +75,7 @@  extern void pascal_object_print_value_fields (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);
 
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c
index f639e29..82abe60 100644
--- a/gdb/p-valprint.c
+++ b/gdb/p-valprint.c
@@ -58,10 +58,10 @@  static const struct generic_val_print_decorations p_decorations =
    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);
@@ -75,6 +75,7 @@  pascal_val_print (struct type *type, const gdb_byte *valaddr,
   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))
@@ -132,7 +133,7 @@  pascal_val_print (struct type *type, const gdb_byte *valaddr,
 		{
 		  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, "}");
@@ -146,7 +147,7 @@  pascal_val_print (struct type *type, const gdb_byte *valaddr,
     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;
 	}
@@ -287,7 +288,7 @@  pascal_val_print (struct type *type, const gdb_byte *valaddr,
     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;
@@ -471,7 +472,7 @@  static void pascal_object_print_static_field (struct value *,
 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 **);
 
@@ -531,7 +532,7 @@  pascal_object_print_value_fields (struct type *type, 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)
@@ -670,7 +671,7 @@  pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
 		     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);
 		}
@@ -703,7 +704,7 @@  pascal_object_print_value (struct type *type, 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)
 {
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index ea36009..db45299 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -322,7 +322,6 @@  print_formatted (struct value *val, int size,
     /* 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);
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 0a49696..3d0b141 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -120,7 +120,7 @@  rust_union_is_untagged (struct type *type)
 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;
@@ -236,7 +236,7 @@  rust_get_disr_info (struct type *type, const gdb_byte *valaddr,
   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,
@@ -481,9 +481,9 @@  rust_printstr (struct ui_file *stream, struct type *type,
 /* 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;
@@ -538,7 +538,6 @@  val_print_struct (struct type *type, const gdb_byte *valaddr,
         }
 
       val_print (TYPE_FIELD_TYPE (type, i),
-           valaddr,
            embedded_offset + TYPE_FIELD_BITPOS (type, i) / 8,
            address,
            stream, recurse + 1, val, &opts,
@@ -574,11 +573,13 @@  static const struct generic_val_print_decorations rust_decorations =
 /* 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))
     {
@@ -615,7 +616,7 @@  rust_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 
     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;
 
@@ -675,7 +676,7 @@  rust_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
      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;
     }
@@ -732,7 +733,6 @@  rust_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
 				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),
@@ -752,14 +752,14 @@  rust_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
       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);
     }
 }
diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c
index 9054e20..bd2d4f7 100644
--- a/gdb/sh64-tdep.c
+++ b/gdb/sh64-tdep.c
@@ -2048,13 +2048,13 @@  sh64_do_register (struct gdbarch *gdbarch, struct ui_file *file,
   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");
 }
diff --git a/gdb/valprint.c b/gdb/valprint.c
index ca30a7f..b18ece3 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -421,10 +421,10 @@  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,
+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)
@@ -445,7 +445,7 @@  generic_val_print_array (struct type *type, const gdb_byte *valaddr,
 	}
 
       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);
@@ -462,9 +462,9 @@  generic_val_print_array (struct type *type, const gdb_byte *valaddr,
 /* 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);
@@ -472,13 +472,14 @@  generic_val_print_ptr (struct type *type, const gdb_byte *valaddr,
 
   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);
 
@@ -490,12 +491,12 @@  generic_val_print_ptr (struct type *type, const gdb_byte *valaddr,
 /* 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);
 }
 
@@ -538,9 +539,9 @@  get_value_addr_contents (struct value *deref_val)
 /* 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));
@@ -552,6 +553,7 @@  generic_val_print_ref (struct type *type, const gdb_byte *valaddr,
   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)
     {
@@ -663,9 +665,9 @@  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;
@@ -674,45 +676,53 @@  generic_val_print_enum (struct type *type, const gdb_byte *valaddr,
 
   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
@@ -731,9 +741,9 @@  generic_val_print_func (struct type *type, const gdb_byte *valaddr,
 /* 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)
 {
@@ -746,11 +756,13 @@  generic_val_print_bool (struct type *type, const gdb_byte *valaddr,
       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);
@@ -764,9 +776,9 @@  generic_val_print_bool (struct type *type, const gdb_byte *valaddr,
 /* 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);
@@ -778,21 +790,25 @@  generic_val_print_int (struct type *type, const gdb_byte *valaddr,
 
       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;
@@ -805,11 +821,13 @@  generic_val_print_char (struct type *type, struct type *unresolved_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
     {
+      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);
@@ -823,9 +841,9 @@  generic_val_print_char (struct type *type, struct type *unresolved_type,
 /* 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);
@@ -833,11 +851,13 @@  generic_val_print_float (struct type *type, const gdb_byte *valaddr,
 
   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);
     }
 }
@@ -845,38 +865,43 @@  generic_val_print_float (struct type *type, const gdb_byte *valaddr,
 /* 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
@@ -884,7 +909,7 @@  generic_val_print_complex (struct type *type, const gdb_byte *valaddr,
 		    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);
@@ -907,10 +932,10 @@  generic_val_print_complex (struct type *type, const gdb_byte *valaddr,
    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)
 {
@@ -920,43 +945,43 @@  generic_val_print (struct type *type, const gdb_byte *valaddr,
   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;
 
@@ -972,22 +997,22 @@  generic_val_print (struct type *type, const gdb_byte *valaddr,
       /* 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;
 
@@ -1007,7 +1032,7 @@  generic_val_print (struct type *type, const gdb_byte *valaddr,
       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;
 
@@ -1022,15 +1047,14 @@  generic_val_print (struct type *type, const gdb_byte *valaddr,
 }
 
 /* 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
@@ -1042,9 +1066,9 @@  generic_val_print (struct type *type, const gdb_byte *valaddr,
    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)
 {
@@ -1074,6 +1098,8 @@  val_print (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset,
 
   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);
@@ -1091,7 +1117,7 @@  val_print (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset,
 
   TRY
     {
-      language->la_val_print (type, valaddr, embedded_offset, address,
+      language->la_val_print (type, embedded_offset, address,
 			      stream, recurse, val,
 			      &local_opts);
     }
@@ -1177,7 +1203,7 @@  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),
+  val_print (value_type (val),
 	     value_embedded_offset (val), value_address (val),
 	     stream, recurse,
 	     val, options, language);
@@ -1303,8 +1329,8 @@  val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
 
 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)
@@ -1313,7 +1339,6 @@  val_print_scalar_formatted (struct type *type,
   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
@@ -1323,11 +1348,16 @@  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,
+      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,
@@ -1965,10 +1995,10 @@  maybe_print_array_index (struct type *index_type, LONGEST index,
 
 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)
 {
@@ -2066,7 +2096,7 @@  val_print_array_elements (struct type *type,
 
       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);
@@ -2078,7 +2108,7 @@  val_print_array_elements (struct type *type,
 	}
       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 ();
diff --git a/gdb/valprint.h b/gdb/valprint.h
index a0f7391..8b640f9 100644
--- a/gdb/valprint.h
+++ b/gdb/valprint.h
@@ -115,9 +115,9 @@  extern void maybe_print_array_index (struct type *index_type, LONGEST index,
                                      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);
 
@@ -125,8 +125,8 @@  extern void val_print_type_code_int (struct type *, const gdb_byte *,
 				     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 *);
@@ -193,10 +193,10 @@  struct generic_val_print_decorations
 };
 
 
-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 *);
 
diff --git a/gdb/value.h b/gdb/value.h
index 3299e87..5805736 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -1016,10 +1016,10 @@  extern void value_print_array_elements (struct value *val,
 
 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);
 
-- 
1.9.1