Fix bug in assignment to nested packed structure
A user at AdaCore found a case where assignment to a nested packed structure would fail. The bug is that ada_value_primitive_field doesn't account for the situation where a field is not packed relative to its containing structure, but where the structure itself is packed in its parent. gdb/ChangeLog 2019-05-01 Tom Tromey <tromey@adacore.com> * ada-lang.c (ada_value_primitive_field): Treat more fields as bitfields. gdb/testsuite/ChangeLog 2019-05-01 Tom Tromey <tromey@adacore.com> * gdb.ada/packed_array_assign/aggregates.ads (Nested_Packed): New record. (NPR): New variable. * gdb.ada/packed_array_assign.exp: Add nested packed assignment test.
This commit is contained in:
parent
d48e62f4a2
commit
4504bbdec5
5 changed files with 27 additions and 3 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2019-05-01 Tom Tromey <tromey@adacore.com>
|
||||||
|
|
||||||
|
* ada-lang.c (ada_value_primitive_field): Treat more fields as
|
||||||
|
bitfields.
|
||||||
|
|
||||||
2019-05-01 Tom Tromey <tromey@adacore.com>
|
2019-05-01 Tom Tromey <tromey@adacore.com>
|
||||||
|
|
||||||
* ada-lang.c (ada_value_assign): Correctly compute starting offset
|
* ada-lang.c (ada_value_assign): Correctly compute starting offset
|
||||||
|
|
|
@ -7189,9 +7189,10 @@ ada_value_primitive_field (struct value *arg1, int offset, int fieldno,
|
||||||
arg_type = ada_check_typedef (arg_type);
|
arg_type = ada_check_typedef (arg_type);
|
||||||
type = TYPE_FIELD_TYPE (arg_type, fieldno);
|
type = TYPE_FIELD_TYPE (arg_type, fieldno);
|
||||||
|
|
||||||
/* Handle packed fields. */
|
/* Handle packed fields. It might be that the field is not packed
|
||||||
|
relative to its containing structure, but the structure itself is
|
||||||
if (TYPE_FIELD_BITSIZE (arg_type, fieldno) != 0)
|
packed; in this case we must take the bit-field path. */
|
||||||
|
if (TYPE_FIELD_BITSIZE (arg_type, fieldno) != 0 || value_bitpos (arg1) != 0)
|
||||||
{
|
{
|
||||||
int bit_pos = TYPE_FIELD_BITPOS (arg_type, fieldno);
|
int bit_pos = TYPE_FIELD_BITPOS (arg_type, fieldno);
|
||||||
int bit_size = TYPE_FIELD_BITSIZE (arg_type, fieldno);
|
int bit_size = TYPE_FIELD_BITSIZE (arg_type, fieldno);
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
2019-05-01 Tom Tromey <tromey@adacore.com>
|
||||||
|
|
||||||
|
* gdb.ada/packed_array_assign/aggregates.ads (Nested_Packed): New
|
||||||
|
record.
|
||||||
|
(NPR): New variable.
|
||||||
|
* gdb.ada/packed_array_assign.exp: Add nested packed assignment
|
||||||
|
test.
|
||||||
|
|
||||||
2019-05-01 Tom Tromey <tromey@adacore.com>
|
2019-05-01 Tom Tromey <tromey@adacore.com>
|
||||||
|
|
||||||
* gdb.ada/packed_array_assign.exp: Add packed assignment
|
* gdb.ada/packed_array_assign.exp: Add packed assignment
|
||||||
|
|
|
@ -33,3 +33,6 @@ gdb_test "print pra(1) := pr" \
|
||||||
" = \\(packed_array_assign_w => 104, packed_array_assign_x => 2, packed_array_assign_y => 3\\)"
|
" = \\(packed_array_assign_w => 104, packed_array_assign_x => 2, packed_array_assign_y => 3\\)"
|
||||||
gdb_test "print pra(1)" \
|
gdb_test "print pra(1)" \
|
||||||
" = \\(packed_array_assign_w => 104, packed_array_assign_x => 2, packed_array_assign_y => 3\\)"
|
" = \\(packed_array_assign_w => 104, packed_array_assign_x => 2, packed_array_assign_y => 3\\)"
|
||||||
|
|
||||||
|
gdb_test "print npr := (q000 => 3, r000 => (packed_array_assign_x => 6, packed_array_assign_y => 1, packed_array_assign_w => 117))" \
|
||||||
|
" = \\(q000 => 3, r000 => \\(packed_array_assign_w => 117, packed_array_assign_x => 6, packed_array_assign_y => 1\\)\\)"
|
||||||
|
|
|
@ -25,6 +25,12 @@ package Aggregates is
|
||||||
type Packed_RecArr is array (Integer range <>) of Packed_Rec;
|
type Packed_RecArr is array (Integer range <>) of Packed_Rec;
|
||||||
pragma Pack (Packed_RecArr);
|
pragma Pack (Packed_RecArr);
|
||||||
|
|
||||||
|
type Nested_Packed is record
|
||||||
|
Q000 : Int;
|
||||||
|
R000 : Packed_Rec;
|
||||||
|
end record;
|
||||||
|
pragma Pack (Nested_Packed);
|
||||||
|
|
||||||
procedure Run_Test;
|
procedure Run_Test;
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -32,4 +38,5 @@ private
|
||||||
Packed_Array_Assign_W => 104,
|
Packed_Array_Assign_W => 104,
|
||||||
Packed_Array_Assign_X => 2);
|
Packed_Array_Assign_X => 2);
|
||||||
PRA : Packed_RecArr (1 .. 3);
|
PRA : Packed_RecArr (1 .. 3);
|
||||||
|
NPR : Nested_Packed := (q000 => 3, r000 => (packed_array_assign_x => 6, packed_array_assign_y => 1, packed_array_assign_w => 117));
|
||||||
end Aggregates;
|
end Aggregates;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue