Rewrite ada_value_print_inner

This rewrites ada_value_print_inner, introducing a new
ada_value_print_1, an analogue of ada_val_print_1.  Because it was
simple to do, this also converts ada_val_print_gnat_array to be
valued-based and updates the uses.

gdb/ChangeLog
2020-03-13  Tom Tromey  <tom@tromey.com>

	* ada-valprint.c (ada_val_print_gnat_array): Take a struct value;
	call common_val_print.
	(ada_val_print_1): Update.
	(ada_value_print_1): New function.
	(ada_value_print_inner): Rewrite.
This commit is contained in:
Tom Tromey 2020-03-13 17:39:52 -06:00
parent fbf54e7554
commit 5b5e15ecdd
2 changed files with 112 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2020-03-13 Tom Tromey <tom@tromey.com>
* ada-valprint.c (ada_val_print_gnat_array): Take a struct value;
call common_val_print.
(ada_val_print_1): Update.
(ada_value_print_1): New function.
(ada_value_print_inner): Rewrite.
2020-03-13 Tom Tromey <tom@tromey.com>
* cp-valprint.c (cp_print_value_fields): Update.

View File

@ -762,16 +762,14 @@ ada_val_print_string (struct type *type, const gdb_byte *valaddr,
thin pointers, etc). */
static void
ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
int offset, CORE_ADDR address,
ada_val_print_gnat_array (struct value *val,
struct ui_file *stream, int recurse,
struct value *original_value,
const struct value_print_options *options)
{
struct value *mark = value_mark ();
struct value *val;
scoped_value_mark free_values;
struct type *type = ada_check_typedef (value_type (val));
val = value_from_contents_and_address (type, valaddr + offset, address);
/* If this is a reference, coerce it now. This helps taking care
of the case where ADDRESS is meaningless because original_value
was not an lval. */
@ -786,11 +784,8 @@ ada_val_print_gnat_array (struct type *type, const gdb_byte *valaddr,
fprintf_filtered (stream, "0x0");
}
else
val_print (value_type (val),
value_embedded_offset (val), value_address (val),
stream, recurse, val, options,
language_def (language_ada));
value_free_to_mark (mark);
common_val_print (val, stream, recurse, options,
language_def (language_ada));
}
/* Implement Ada val_print'ing for the case where TYPE is
@ -1135,9 +1130,10 @@ ada_val_print_1 (struct type *type,
|| (ada_is_constrained_packed_array_type (type)
&& TYPE_CODE (type) != TYPE_CODE_PTR))
{
ada_val_print_gnat_array (type, valaddr, offset, address,
stream, recurse, original_value,
options);
struct value *val = value_from_contents_and_address (type,
valaddr + offset,
address);
ada_val_print_gnat_array (val, stream, recurse, options);
return;
}
@ -1222,6 +1218,90 @@ ada_val_print (struct type *type,
}
}
/* See the comment on ada_value_print. This function differs in that
it does not catch evaluation errors (leaving that to
ada_value_print). */
static void
ada_value_print_1 (struct value *val, struct ui_file *stream, int recurse,
const struct value_print_options *options)
{
struct type *type = ada_check_typedef (value_type (val));
if (ada_is_array_descriptor_type (type)
|| (ada_is_constrained_packed_array_type (type)
&& TYPE_CODE (type) != TYPE_CODE_PTR))
{
ada_val_print_gnat_array (val, stream, recurse, options);
return;
}
val = ada_to_fixed_value (val);
type = value_type (val);
struct type *saved_type = type;
const gdb_byte *valaddr = value_contents_for_printing (val);
CORE_ADDR address = value_address (val);
type = ada_check_typedef (resolve_dynamic_type (type, valaddr, address));
if (type != saved_type)
{
val = value_copy (val);
deprecated_set_value_type (val, type);
}
switch (TYPE_CODE (type))
{
default:
common_val_print (val, stream, recurse, options,
language_def (language_c));
break;
case TYPE_CODE_PTR:
ada_val_print_ptr (type, valaddr, 0, 0,
address, stream, recurse, val,
options);
break;
case TYPE_CODE_INT:
case TYPE_CODE_RANGE:
ada_val_print_num (type, valaddr, 0, 0,
address, stream, recurse, val,
options);
break;
case TYPE_CODE_ENUM:
ada_val_print_enum (type, valaddr, 0, 0,
address, stream, recurse, val,
options);
break;
case TYPE_CODE_FLT:
ada_val_print_flt (type, valaddr, 0, 0,
address, stream, recurse, val,
options);
break;
case TYPE_CODE_UNION:
case TYPE_CODE_STRUCT:
ada_val_print_struct_union (type, valaddr, 0, 0,
address, stream, recurse,
val, options);
break;
case TYPE_CODE_ARRAY:
ada_val_print_array (type, valaddr, 0, 0,
address, stream, recurse, val,
options);
return;
case TYPE_CODE_REF:
ada_val_print_ref (type, valaddr, 0, 0,
address, stream, recurse, val,
options);
break;
}
}
/* See ada-lang.h. */
void
@ -1229,8 +1309,16 @@ ada_value_print_inner (struct value *val, struct ui_file *stream,
int recurse,
const struct value_print_options *options)
{
ada_val_print (value_type (val), value_embedded_offset (val),
value_address (val), stream, recurse, val, options);
try
{
ada_value_print_1 (val, stream, recurse, options);
}
catch (const gdb_exception_error &except)
{
fprintf_styled (stream, metadata_style.style (),
_("<error reading variable: %s>"),
except.what ());
}
}
void