aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-04-29 09:55:39 -0600
committerTom Tromey <tromey@adacore.com>2019-05-01 08:09:22 -0600
commit4504bbdec57c77b6468838276e62b2137eedfdd5 (patch)
treeeabe799da4aabe549b571f5601c2d74b92940d79
parentd48e62f4a263a871b7a62793e8000625735bc2f6 (diff)
downloadbinutils-4504bbdec57c77b6468838276e62b2137eedfdd5.zip
binutils-4504bbdec57c77b6468838276e62b2137eedfdd5.tar.gz
binutils-4504bbdec57c77b6468838276e62b2137eedfdd5.tar.bz2
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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-lang.c7
-rw-r--r--gdb/testsuite/ChangeLog8
-rw-r--r--gdb/testsuite/gdb.ada/packed_array_assign.exp3
-rw-r--r--gdb/testsuite/gdb.ada/packed_array_assign/aggregates.ads7
5 files changed, 27 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1588143..eba0426 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
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
for big-endian copies.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index da70a51..1a56663 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -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);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 573aa16..0f96ea2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,13 @@
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
regression test.
diff --git a/gdb/testsuite/gdb.ada/packed_array_assign.exp b/gdb/testsuite/gdb.ada/packed_array_assign.exp
index 8ed2d63..407ea9c 100644
--- a/gdb/testsuite/gdb.ada/packed_array_assign.exp
+++ b/gdb/testsuite/gdb.ada/packed_array_assign.exp
@@ -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\\)\\)"
diff --git a/gdb/testsuite/gdb.ada/packed_array_assign/aggregates.ads b/gdb/testsuite/gdb.ada/packed_array_assign/aggregates.ads
index f0d0525..d1b0552 100644
--- a/gdb/testsuite/gdb.ada/packed_array_assign/aggregates.ads
+++ b/gdb/testsuite/gdb.ada/packed_array_assign/aggregates.ads
@@ -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;