Fix printing address of packed array

When trying to print the address of a non-packed array, GDB
correctly prints the type name and address:

    (gdb) print &var
    $2 = (access pa.var) 0xbffff1d8

However, it is behaving differently when dealing with a packed
array:

    (gdb) p &var
    (access array (4 .. 8) of boolean <packed: 1-bit elements>) (4 =>
    false, false, false, true, false)

The type description isn't all that bad, but GDB shouldn't be
printing the array value!

This patch fixes the `print` and `ptype` command on packed and
non-packed array.  It also fixes a gdb.ada test to match with
the new ouput.

gdb/ChangeLog (Jean-Charles Delay):

        * ada-typeprint.c (ada_print_type): Fix both PAD type and
        pointer to constrained packed array type output.
        * ada-valprint.c (ada_val_print_1): Fix pointer to constrained
        packed array output.

gdb/testsuite/ChangeLog (Jean-Charles Delay):

        * gdb.ada/packed_array.exp: Fix expected outout.
This commit is contained in:
Joel Brobecker 2011-07-01 18:27:25 +00:00
parent 54ae186fb5
commit d2d43431e8
5 changed files with 18 additions and 15 deletions

View File

@ -1,3 +1,10 @@
2011-07-01 Jean-Charles Delay <delay@adacore.com>
* ada-typeprint.c (ada_print_type): Fix both PAD type and
pointer to constrained packed array type output.
* ada-valprint.c (ada_val_print_1): Fix pointer to constrained
packed array output.
2011-07-01 Jean-Charles Delay <delay@adacore.com>
* ada-typeprint.c (print_array_type): removed if condition on show

View File

@ -761,7 +761,7 @@ ada_print_type (struct type *type0, const char *varstring,
fprintf_filtered (stream, "%.*s: ",
ada_name_prefix_len (varstring), varstring);
if (type_name != NULL && show <= 0)
if (type_name != NULL && show <= 0 && !ada_is_aligner_type (type))
{
fprintf_filtered (stream, "%.*s",
ada_name_prefix_len (type_name), type_name);
@ -770,18 +770,9 @@ ada_print_type (struct type *type0, const char *varstring,
if (ada_is_aligner_type (type))
ada_print_type (ada_aligned_type (type), "", stream, show, level);
else if (ada_is_constrained_packed_array_type (type))
{
if (TYPE_CODE (type) == TYPE_CODE_PTR)
{
fprintf_filtered (stream, "access ");
print_array_type (TYPE_TARGET_TYPE (type), stream, show, level);
}
else
{
print_array_type (type, stream, show, level);
}
}
else if (ada_is_constrained_packed_array_type (type)
&& TYPE_CODE (type) != TYPE_CODE_PTR)
print_array_type (type, stream, show, level);
else
switch (TYPE_CODE (type))
{

View File

@ -682,7 +682,8 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr,
type = ada_check_typedef (type);
if (ada_is_array_descriptor_type (type)
|| ada_is_constrained_packed_array_type (type))
|| (ada_is_constrained_packed_array_type (type)
&& TYPE_CODE (type) != TYPE_CODE_PTR))
{
int retn;
struct value *mark = value_mark ();

View File

@ -1,3 +1,7 @@
2011-07-01 Jean-Charles Delay <delay@adacore.com>
* gdb.ada/packed_array.exp: Fix expected outout.
2011-07-01 Jean-Charles Delay <delay@adacore.com>
* gdb.ada/packed_array.exp: fixed expected output.

View File

@ -48,7 +48,7 @@ gdb_test "ptype &var" \
"ptype &var"
gdb_test "print &var" \
"= \\(access array \\(4 \\.\\. 8\\) of boolean <packed: 1-bit elements>\\) \\(4 => true, false, true, false, true\\)" \
"= \\(access pa.packed_array\\) 0x.*" \
"print &var"
# Print the value of U_Var, an unconstrainted packed array.