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:
parent
e000211765
commit
5eb68a39a2
@ -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
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user