Fix bug in assignment to nested packed structure
authorTom Tromey <tromey@adacore.com>
Mon, 29 Apr 2019 15:55:39 +0000 (09:55 -0600)
committerTom Tromey <tromey@adacore.com>
Wed, 1 May 2019 14:09:22 +0000 (08:09 -0600)
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.

gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/packed_array_assign.exp
gdb/testsuite/gdb.ada/packed_array_assign/aggregates.ads

index 1588143646a9e5d16e734b5048023a47fc93e3bf..eba0426463a6fbbd03884f8cd90ca63bf671ce9a 100644 (file)
@@ -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>
 
        * ada-lang.c (ada_value_assign): Correctly compute starting offset
index da70a514784ec278b28913a94d18122f4f96e2b6..1a566635b2dd02222d3614fc374180ee3244a9b2 100644 (file)
@@ -7189,9 +7189,10 @@ ada_value_primitive_field (struct value *arg1, int offset, int fieldno,
   arg_type = ada_check_typedef (arg_type);
   type = TYPE_FIELD_TYPE (arg_type, fieldno);
 
-  /* Handle packed fields.  */
-
-  if (TYPE_FIELD_BITSIZE (arg_type, fieldno) != 0)
+  /* Handle packed fields.  It might be that the field is not packed
+     relative to its containing structure, but the structure itself is
+     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_size = TYPE_FIELD_BITSIZE (arg_type, fieldno);
index 573aa16806c9ef29e5b7d8592832d6cac33a80aa..0f96ea2eccf167aec0826a88831fbcf4f8e6ca06 100644 (file)
@@ -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>
 
        * gdb.ada/packed_array_assign.exp: Add packed assignment
index 8ed2d63ecf362b219e131c168904ccb6fe73ac9e..407ea9cecbb3ed11cb5bf45d595ea8d78ca053ab 100644 (file)
@@ -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\\)"
 gdb_test "print pra(1)" \
     " = \\(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\\)\\)"
index f0d052510e43a4590776cd1d76aa289509b2eac2..d1b0552bbd1c59ccab5bfdca8c73f7e2aa9b44d6 100644 (file)
@@ -25,6 +25,12 @@ package Aggregates is
    type Packed_RecArr is array (Integer range <>) of Packed_Rec;
    pragma Pack (Packed_RecArr);
 
+   type Nested_Packed is record
+      Q000 : Int;
+      R000 : Packed_Rec;
+   end record;
+   pragma Pack (Nested_Packed);
+
    procedure Run_Test;
 
 private
@@ -32,4 +38,5 @@ private
                        Packed_Array_Assign_W => 104,
                        Packed_Array_Assign_X  => 2);
    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;