aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/gdbtypes.c14
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.ada/enum_idx_packed.exp121
4 files changed, 102 insertions, 41 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 79ee2b9..0c6d399 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,9 @@
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.
2020-11-04 Tom Tromey <tromey@adacore.com>
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 66dceac..686edaf 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -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;
}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 874395a..0bdc314 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,9 @@
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
-fgnat-encodings=minimal. Add tests.
* gdb.ada/set_pckd_arr_elt/foo.adb (Foo): Add VA variable.
diff --git a/gdb/testsuite/gdb.ada/enum_idx_packed.exp b/gdb/testsuite/gdb.ada/enum_idx_packed.exp
index 480de71..9185968 100644
--- a/gdb/testsuite/gdb.ada/enum_idx_packed.exp
+++ b/gdb/testsuite/gdb.ada/enum_idx_packed.exp
@@ -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"
+}