Fix bit strides for -fgnat-encodings=minimal
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)
With -fgnat-encodings=minimal, the enum_idx_packed.exp test will fail.
In this test case, we have an array (with dynamic length) of arrays,
and the inner array has a bit stride.  In this situation, the outer
array's bit stride must be updated to account for the entire bit
length of the inner array.

Here, again, some tests must be kfail'd when an older version of GNAT
is in use.

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

* gdbtypes.c (update_static_array_size): Handle bit stride.

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

* gdb.ada/enum_idx_packed.exp: Test two forms of -fgnat-encodings.

gdb/ChangeLog
gdb/gdbtypes.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/enum_idx_packed.exp

index 79ee2b96c70508a7405a94d507df4022c2bd97ed..0c6d399989345a9cea30c611480351189ed995c1 100644 (file)
@@ -1,3 +1,7 @@
+2020-11-04  Tom Tromey  <tromey@adacore.com>
+
+       * gdbtypes.c (update_static_array_size): Handle bit stride.
+
 2020-11-04  Tom Tromey  <tromey@adacore.com>
 
        * ada-lang.c (ada_value_struct_elt): Resolve dynamic type.
index 66dceac4a3dc0b178c706573838bd423d70b093a..686edafcf6462cad22dfa89ac30a16f50925cf16 100644 (file)
@@ -1241,6 +1241,20 @@ update_static_array_size (struct type *type)
        TYPE_LENGTH (type) =
          TYPE_LENGTH (element_type) * (high_bound - low_bound + 1);
 
+      /* If this array's element is itself an array with a bit stride,
+        then we want to update this array's bit stride to reflect the
+        size of the sub-array.  Otherwise, we'll end up using the
+        wrong size when trying to find elements of the outer
+        array.  */
+      if (element_type->code () == TYPE_CODE_ARRAY
+         && TYPE_LENGTH (element_type) != 0
+         && TYPE_FIELD_BITSIZE (element_type, 0) != 0
+         && get_array_bounds (element_type, &low_bound, &high_bound) >= 0
+         && high_bound >= low_bound)
+       TYPE_FIELD_BITSIZE (type, 0)
+         = ((high_bound - low_bound + 1)
+            * TYPE_FIELD_BITSIZE (element_type, 0));
+
       return true;
     }
 
index 874395af38db24653b8483f3747852cb04cba514..0bdc3140e1029eb5d18e553a73bfa936730541f9 100644 (file)
@@ -1,3 +1,7 @@
+2020-11-04  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/enum_idx_packed.exp: Test two forms of -fgnat-encodings.
+
 2020-11-04  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/set_pckd_arr_elt.exp: Also test
index 480de71b7c4675fb0eb74815a2e1d4a9d6925344..91859689c4a0f5bcedfcedfe179f1a9111572371 100644 (file)
@@ -19,64 +19,103 @@ if { [skip_ada_tests] } { return -1 }
 
 standard_ada_testfile foo
 
-if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
-    return -1
-}
+foreach_with_prefix scenario {all minimal} {
+    set flags [list debug additional_flags=-fgnat-encodings=$scenario]
 
-clean_restart ${testfile}
+    if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
+       return -1
+    }
 
-set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
-runto "foo.adb:$bp_location"
+    clean_restart ${testfile}
 
-gdb_test "ptype full" \
-    "type = array \\(black \\.\\. white\\) of boolean <packed: 1-bit elements>"
+    # GNAT >= 11.0 has the needed fix here.
+    if {$scenario == "minimal" && ![test_compiler_info {gcc-1[1-9]-*}]} {
+       set old_compiler 1
+    } else {
+       set old_compiler 0
+    }
 
-gdb_test "print full" " = \\(false, true, false, true, false\\)"
+    set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
+    runto "foo.adb:$bp_location"
 
-gdb_test "print full'first" " = black"
+    gdb_test "ptype full" \
+       "type = array \\(black \\.\\. white\\) of boolean <packed: 1-bit elements>"
 
-gdb_test "ptype primary" \
-    "type = array \\(red \\.\\. blue\\) of boolean <packed: 1-bit elements>"
+    gdb_test "print full" " = \\(false, true, false, true, false\\)"
 
-gdb_test "print primary" " = \\(red => false, true, false\\)"
+    gdb_test "print full'first" " = black"
 
-gdb_test "print primary'first" " = red"
+    gdb_test "ptype primary" \
+       "type = array \\(red \\.\\. blue\\) of boolean <packed: 1-bit elements>"
 
-gdb_test "ptype cold" \
-    "type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"
+    gdb_test "print primary" " = \\(red => false, true, false\\)"
 
-gdb_test "print cold" " = \\(green => false, true\\)"
+    gdb_test "print primary'first" " = red"
 
-gdb_test "print cold'first" " = green"
+    gdb_test "ptype cold" \
+       "type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"
 
-# Note the bounds values are still not correctly displayed.  So we get
-# the enum equivalent of "1 .. 0" (empty range) as the array ranges.
-# Accept that for now.
-gdb_test "ptype small" \
-    "array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"
+    gdb_test "print cold" " = \\(green => false, true\\)"
 
-gdb_test "print small" " = \\(red => false, true\\)"
+    gdb_test "print cold'first" " = green"
 
-gdb_test "print small'first" " = red"
+    # Note the bounds values are still not correctly displayed.  So we get
+    # the enum equivalent of "1 .. 0" (empty range) as the array ranges.
+    # Accept that for now.
+    # GNAT >= 11.0 has the needed fix here.
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "ptype small" \
+       "array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"
 
-gdb_test "ptype multi" \
-    "array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print small" " = \\(red => false, true\\)"
 
-gdb_test "print multi" \
-    " = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print small'first" " = red"
 
-gdb_test "print multi'first" " = red"
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "ptype multi" \
+       "array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
 
-set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
-set matrix "\\("
-foreach x {1 2 3 4 5 6 7} {
-    if {$x > 1} {
-       append matrix ", "
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
     }
-    append matrix $base
-}
-append matrix "\\)"
+    gdb_test "print multi" \
+       " = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"
 
-gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
-gdb_test "print multi_multi(1,3)" " = $base"
-gdb_test "print multi_multi(2)" " = $matrix"
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi'first" " = red"
+
+    set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
+    set matrix "\\("
+    foreach x {1 2 3 4 5 6 7} {
+       if {$x > 1} {
+           append matrix ", "
+       }
+       append matrix $base
+    }
+    append matrix "\\)"
+
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi_multi(1,3)" " = $base"
+    if {$old_compiler} {
+       setup_kfail "minimal encodings" *-*-*
+    }
+    gdb_test "print multi_multi(2)" " = $matrix"
+}