Fix Ada value printing on PPC64

The val_print removal patches introduced an Ada regression on PPC64
(probably any big-endian system).

The issue comes because value_field does not understand that Ada
wrapper fields can be bitfields that wrap a non-scalar type.  In this
case the value is already left-justified, so the justification done
there does the wrong thing.

Perhaps it would be good, eventually, to change value_field to
understand this case.  In the meantime this implements an Ada-specific
solution.

gdb/ChangeLog
2020-05-11  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (ada_value_primitive_field): Now public.
	* ada-lang.h (ada_value_primitive_field): Declare.
	* ada-valprint.c (print_field_values): Use
	ada_value_primitive_field for wrapper fields.
This commit is contained in:
Tom Tromey 2020-05-11 14:57:49 -06:00
parent e000211765
commit 5eb68a39a2
4 changed files with 15 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2020-05-11 Tom Tromey <tromey@adacore.com>
* ada-lang.c (ada_value_primitive_field): Now public.
* ada-lang.h (ada_value_primitive_field): Declare.
* ada-valprint.c (print_field_values): Use
ada_value_primitive_field for wrapper fields.
2020-05-11 Tom de Vries <tdevries@suse.de> 2020-05-11 Tom de Vries <tdevries@suse.de>
* dwarf2/index-write.c (debug_names::psymbol_tag): Handle * dwarf2/index-write.c (debug_names::psymbol_tag): Handle

View File

@ -204,9 +204,6 @@ static struct symbol *standard_lookup (const char *, const struct block *,
static struct value *ada_search_struct_field (const char *, struct value *, int, static struct value *ada_search_struct_field (const char *, struct value *, int,
struct type *); struct type *);
static struct value *ada_value_primitive_field (struct value *, int, int,
struct type *);
static int find_struct_field (const char *, struct type *, int, static int find_struct_field (const char *, struct type *, int,
struct type **, int *, int *, int *, int *); struct type **, int *, int *, int *, int *);
@ -7125,7 +7122,7 @@ ada_in_variant (LONGEST val, struct type *type, int field_num)
fields. FIELDNO says which field. Differs from value_primitive_field fields. FIELDNO says which field. Differs from value_primitive_field
only in that it can handle packed values of arbitrary type. */ only in that it can handle packed values of arbitrary type. */
static struct value * struct value *
ada_value_primitive_field (struct value *arg1, int offset, int fieldno, ada_value_primitive_field (struct value *arg1, int offset, int fieldno,
struct type *arg_type) struct type *arg_type)
{ {

View File

@ -234,6 +234,11 @@ extern struct bound_minimal_symbol ada_lookup_simple_minsym (const char *);
extern int ada_scan_number (const char *, int, LONGEST *, int *); extern int ada_scan_number (const char *, int, LONGEST *, int *);
extern struct value *ada_value_primitive_field (struct value *arg1,
int offset,
int fieldno,
struct type *arg_type);
extern struct type *ada_parent_type (struct type *); extern struct type *ada_parent_type (struct type *);
extern int ada_is_ignored_field (struct type *, int); extern int ada_is_ignored_field (struct type *, int);

View File

@ -609,7 +609,8 @@ print_field_values (struct value *value, struct value *outer_value,
if (ada_is_wrapper_field (type, i)) if (ada_is_wrapper_field (type, i))
{ {
struct value *field_val = value_field (value, i); struct value *field_val = ada_value_primitive_field (value, 0,
i, type);
comma_needed = comma_needed =
print_field_values (field_val, field_val, print_field_values (field_val, field_val,
stream, recurse, options, stream, recurse, options,