diff options
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 14 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/enum_idx_packed.exp | 121 |
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" +} |