diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 79ee2b96c70..0c6d3999893 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-11-04 Tom Tromey + + * gdbtypes.c (update_static_array_size): Handle bit stride. + 2020-11-04 Tom Tromey * ada-lang.c (ada_value_struct_elt): Resolve dynamic type. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 66dceac4a3d..686edafcf64 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 874395af38d..0bdc3140e10 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-11-04 Tom Tromey + + * gdb.ada/enum_idx_packed.exp: Test two forms of -fgnat-encodings. + 2020-11-04 Tom Tromey * gdb.ada/set_pckd_arr_elt.exp: Also test diff --git a/gdb/testsuite/gdb.ada/enum_idx_packed.exp b/gdb/testsuite/gdb.ada/enum_idx_packed.exp index 480de71b7c4..91859689c4a 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} - -set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] -runto "foo.adb:$bp_location" - -gdb_test "ptype full" \ - "type = array \\(black \\.\\. white\\) of boolean " - -gdb_test "print full" " = \\(false, true, false, true, false\\)" - -gdb_test "print full'first" " = black" - -gdb_test "ptype primary" \ - "type = array \\(red \\.\\. blue\\) of boolean " - -gdb_test "print primary" " = \\(red => false, true, false\\)" - -gdb_test "print primary'first" " = red" - -gdb_test "ptype cold" \ - "type = array \\(green \\.\\. blue\\) of boolean " - -gdb_test "print cold" " = \\(green => false, true\\)" - -gdb_test "print cold'first" " = green" - -# 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 " - -gdb_test "print small" " = \\(red => false, true\\)" - -gdb_test "print small'first" " = red" - -gdb_test "ptype multi" \ - "array \\(red \\.\\. green, low .. medium\\) of boolean " - -gdb_test "print multi" \ - " = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)" - -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 ", " + if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} { + return -1 } - append matrix $base -} -append matrix "\\)" -gdb_test "print multi_multi" " = \\($matrix, $matrix\\)" -gdb_test "print multi_multi(1,3)" " = $base" -gdb_test "print multi_multi(2)" " = $matrix" + clean_restart ${testfile} + + # 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 + } + + set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] + runto "foo.adb:$bp_location" + + gdb_test "ptype full" \ + "type = array \\(black \\.\\. white\\) of boolean " + + gdb_test "print full" " = \\(false, true, false, true, false\\)" + + gdb_test "print full'first" " = black" + + gdb_test "ptype primary" \ + "type = array \\(red \\.\\. blue\\) of boolean " + + gdb_test "print primary" " = \\(red => false, true, false\\)" + + gdb_test "print primary'first" " = red" + + gdb_test "ptype cold" \ + "type = array \\(green \\.\\. blue\\) of boolean " + + gdb_test "print cold" " = \\(green => false, true\\)" + + gdb_test "print cold'first" " = green" + + # 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 " + + if {$old_compiler} { + setup_kfail "minimal encodings" *-*-* + } + gdb_test "print small" " = \\(red => false, true\\)" + + if {$old_compiler} { + setup_kfail "minimal encodings" *-*-* + } + gdb_test "print small'first" " = red" + + if {$old_compiler} { + setup_kfail "minimal encodings" *-*-* + } + gdb_test "ptype multi" \ + "array \\(red \\.\\. green, low .. medium\\) of boolean " + + if {$old_compiler} { + setup_kfail "minimal encodings" *-*-* + } + gdb_test "print multi" \ + " = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)" + + 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" +}