From a471c5941e127823b95893176c7c9301c4b4cb32 Mon Sep 17 00:00:00 2001
From: Jan Kratochvil <jan.kratochvil@redhat.com>
Date: Sun, 9 Oct 2011 19:43:41 +0000
Subject: gdb/ 	Display @entry parameter values even for references. 	*
 ada-valprint.c (ada_val_print_1) <TYPE_CODE_REF>: Try also 
 coerce_ref_if_computed. 	* c-valprint.c (c_val_print) <TYPE_CODE_REF>:
 Likewise. 	* dwarf2expr.c (dwarf_block_to_dwarf_reg_deref): New function.
 	(execute_stack_op) <DW_OP_GNU_entry_value>: Add -1 deref_size to the 
 existing push_dwarf_reg_entry_value call.  Add new detection calling 
 dwarf_block_to_dwarf_reg_deref.  Update the error message. 
 (ctx_no_push_dwarf_reg_entry_value): New parameter deref_size. 	*
 dwarf2expr.h 	(struct dwarf_expr_context_funcs)
 <push_dwarf_reg_entry_value>: Add new 	parameter deref_size, describe it in
 the comment. 	(ctx_no_push_dwarf_reg_entry_value): Add new parameter
 deref_size. 	(dwarf_block_to_dwarf_reg_deref): New declaration. 	*
 dwarf2loc.c (dwarf_entry_parameter_to_value): Add new parameter 
 deref_size, describe it in the function comment.  New variables 
 data_src and size, fetch the alternative block accoring to DEREF_SIZE. 
 (dwarf_expr_push_dwarf_reg_entry_value): Add new parameter deref_size, 
 describe it in the function comment.  Fetch the alternative block 
 accoring to DEREF_SIZE. 	(entry_data_value_coerce_ref,
 entry_data_value_copy_closure) 	(entry_data_value_free_closure,
 entry_data_value_funcs): New. 	(value_of_dwarf_reg_entry): New variables
 checked_type, target_type, 	outer_val, target_val, val and addr.  Try to
 fetch and create also 	referenced value content. 	(pieced_value_funcs):
 NULL value for coerce_ref. 	(needs_dwarf_reg_entry_value): Add new
 parameter deref_size. 	* f-valprint.c (f_val_print) <TYPE_CODE_REF>: Try also
 	coerce_ref_if_computed. 	* opencl-lang.c (opencl_value_funcs):
 NULL value for coerce_ref. 	* p-valprint.c (pascal_val_print)
 <TYPE_CODE_REF>: Likewise. 	* stack.c (read_frame_arg): Compare also
 dereferenced values. 	* value.c (value_computed_funcs): Make the parameter v
 const, use 	value_lval_const for it. 	(value_lval_const,
 coerce_ref_if_computed): New function. 	(coerce_ref): New variable
 retval.  Call also coerce_ref_if_computed. 	* value.h (struct lval_funcs):
 New field coerce_ref. 	(value_computed_funcs): Make the parameter v const. 
 (value_lval_const, coerce_ref_if_computed): New declarations.

gdb/testsuite/
	Display @entry parameter values even for references.
	* gdb.arch/amd64-entry-value.cc (reference, datap, datap_input): New
	functions.
	(main): New variables regvar, nodatavarp, stackvar1, stackvar2.  Call
	reference and datap_input.
	* gdb.arch/amd64-entry-value.exp (reference, breakhere_reference): New
	breakpoints.
	(continue to breakpoint: entry_reference: reference)
	(entry_reference: bt at entry)
	(continue to breakpoint: entry_reference: breakhere_reference)
	(entry_reference: bt, entry_reference: ptype regparam)
	(entry_reference: p regparam, entry_reference: ptype regparam@entry)
	(entry_reference: p regparam@entry, entry_reference: p &regparam@entry)
	(entry_reference: p regcopy, entry_reference: p nodataparam)
	(entry_reference: p nodataparam@entry): New tests.
---
 gdb/c-valprint.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

(limited to 'gdb/c-valprint.c')

diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index 76579d2116c..3461b08b921 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -380,10 +380,19 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
 	{
 	  if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
 	    {
-	      struct value *deref_val =
-		value_at
-		(TYPE_TARGET_TYPE (type),
-		 unpack_pointer (type, valaddr + embedded_offset));
+	      struct value *deref_val;
+
+	      deref_val = coerce_ref_if_computed (original_value);
+	      if (deref_val != NULL)
+		{
+		  /* More complicated computed references are not supported.  */
+		  gdb_assert (embedded_offset == 0);
+		}
+	      else
+		deref_val = value_at (TYPE_TARGET_TYPE (type),
+				      unpack_pointer (type,
+						      (valaddr
+						       + embedded_offset)));
 
 	      common_val_print (deref_val, stream, recurse, options,
 				current_language);
-- 
cgit v1.2.1