Only use stride for final element type
authorTom Tromey <tromey@adacore.com>
Wed, 4 Nov 2020 15:49:16 +0000 (08:49 -0700)
committerTom Tromey <tromey@adacore.com>
Wed, 4 Nov 2020 15:49:18 +0000 (08:49 -0700)
A DWARF array type may specify a stride.  Currently, the DWARF reader
applies this stride to every dimension of an array.  However, this
seems incorrect to me -- only the innermost array ought to use the
stride, while outer arrays should compute a stride based on the size
of the inner arrays.  This patch arranges to apply the stride only to
the innermost array type.  This fixes a bug noticed when running some
Ada tests with -fgnat-encodings=minimal.

gdb/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

* dwarf2/read.c (read_array_type): Only apply stride to innermost
array.

gdb/testsuite/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

* gdb.ada/enum_idx_packed.exp: Add test.
* gdb.ada/enum_idx_packed/foo.adb (Multi_Access):
New variable.
* gdb.ada/enum_idx_packed/pck.ads (Short)
(Multi_Dimension, Multi_Dimension_Access): New types.

gdb/ChangeLog
gdb/dwarf2/read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/enum_idx_packed.exp
gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb
gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads

index 0c6d399989345a9cea30c611480351189ed995c1..a98f89dc137796a3045d6a9934a4b3bc89524bff 100644 (file)
@@ -1,3 +1,8 @@
+2020-11-04  Tom Tromey  <tromey@adacore.com>
+
+       * dwarf2/read.c (read_array_type): Only apply stride to innermost
+       array.
+
 2020-11-04  Tom Tromey  <tromey@adacore.com>
 
        * gdbtypes.c (update_static_array_size): Handle bit stride.
index 364a16d05816c9d541854a05e6ac6bde5e08d47c..a41712765d679636546b5cb81abce6f2eeeec913 100644 (file)
@@ -17097,15 +17097,23 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
       int i = 0;
 
       while (i < range_types.size ())
-       type = create_array_type_with_stride (NULL, type, range_types[i++],
-                                             byte_stride_prop, bit_stride);
+       {
+         type = create_array_type_with_stride (NULL, type, range_types[i++],
+                                               byte_stride_prop, bit_stride);
+         bit_stride = 0;
+         byte_stride_prop = nullptr;
+       }
     }
   else
     {
       size_t ndim = range_types.size ();
       while (ndim-- > 0)
-       type = create_array_type_with_stride (NULL, type, range_types[ndim],
-                                             byte_stride_prop, bit_stride);
+       {
+         type = create_array_type_with_stride (NULL, type, range_types[ndim],
+                                               byte_stride_prop, bit_stride);
+         bit_stride = 0;
+         byte_stride_prop = nullptr;
+       }
     }
 
   /* Understand Dwarf2 support for vector types (like they occur on
index 0bdc3140e1029eb5d18e553a73bfa936730541f9..d18d88fa2fa3788344120a8a832bbf1d8eb14df7 100644 (file)
@@ -1,3 +1,11 @@
+2020-11-04  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/enum_idx_packed.exp: Add test.
+       * gdb.ada/enum_idx_packed/foo.adb (Multi_Access):
+       New variable.
+       * gdb.ada/enum_idx_packed/pck.ads (Short)
+       (Multi_Dimension, Multi_Dimension_Access): New types.
+
 2020-11-04  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/enum_idx_packed.exp: Test two forms of -fgnat-encodings.
index 91859689c4a0f5bcedfcedfe179f1a9111572371..2e5a85e76b3f5eb36053e0734be0dfd9103aabf4 100644 (file)
@@ -118,4 +118,7 @@ foreach_with_prefix scenario {all minimal} {
        setup_kfail "minimal encodings" *-*-*
     }
     gdb_test "print multi_multi(2)" " = $matrix"
+
+    gdb_test "print multi_access.all" \
+       " = \\(\\(8, 13, 21, 34, 55\\), \\(1, 1, 2, 3, 5\\)\\)"
 }
index e9f30747167627004655ffbe0fd86f3436dfd68b..bc82831bb84075b3172f2d495d27177acb1d716a 100644 (file)
@@ -22,6 +22,10 @@ procedure Foo is
    Small : Small_Table := New_Small_Table (Low => Red, High => Green);
    Multi : Multi_Table := New_Multi_Table (Red, Green, Low, Medium);
    Multi_Multi : Multi_Multi_Table := New_Multi_Multi_Table (1, 2, 1, 7, 1, 10);
+   Multi_Access : Multi_Dimension_Access
+     := new Multi_Dimension'(True => (1, 1, 2, 3, 5),
+                             False => (8, 13, 21, 34, 55));
+
 begin
    Do_Nothing (Full'Address);  -- STOP
    Do_Nothing (Primary'Address);
@@ -29,4 +33,5 @@ begin
    Do_Nothing (Small'Address);
    Do_Nothing (Multi'Address);
    Do_Nothing (Multi_Multi'Address);
+   Do_Nothing (Multi_Access'Address);
 end Foo;
index fdfd8bbc4c6052f751d95a276037a861a186b1c3..7fe5a9e01d40315e01a8bb3f047807bebc307202 100644 (file)
@@ -17,6 +17,7 @@ with System;
 package Pck is
    type Color is (Black, Red, Green, Blue, White);
    type Strength is (None, Low, Medium, High);
+   type Short is new Natural range 0 .. 2 ** 8 - 1;
 
    type Full_Table is array (Color) of Boolean;
    pragma Pack (Full_Table);
@@ -43,5 +44,9 @@ package Pck is
    function New_Multi_Multi_Table (L1, H1, L2, H2, L3, H3: Positive)
       return Multi_Multi_Table;
 
+   type Multi_Dimension is array (Boolean, Color) of Short;
+   pragma Pack (Multi_Dimension);
+   type Multi_Dimension_Access is access all Multi_Dimension;
+
    procedure Do_Nothing (A : System.Address);
 end Pck;