Fix bit strides for -fgnat-encodings=minimal

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.
This commit is contained in:
Tom Tromey
2020-11-04 08:49:16 -07:00
parent 24aa1b0282
commit b72795a8f5
4 changed files with 119 additions and 58 deletions

View 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> 2020-11-04 Tom Tromey <tromey@adacore.com>
* ada-lang.c (ada_value_struct_elt): Resolve dynamic type. * ada-lang.c (ada_value_struct_elt): Resolve dynamic type.

View File

@ -1241,6 +1241,20 @@ update_static_array_size (struct type *type)
TYPE_LENGTH (type) = TYPE_LENGTH (type) =
TYPE_LENGTH (element_type) * (high_bound - low_bound + 1); 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; return true;
} }

View 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> 2020-11-04 Tom Tromey <tromey@adacore.com>
* gdb.ada/set_pckd_arr_elt.exp: Also test * gdb.ada/set_pckd_arr_elt.exp: Also test

View File

@ -19,64 +19,103 @@ if { [skip_ada_tests] } { return -1 }
standard_ada_testfile foo standard_ada_testfile foo
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} { foreach_with_prefix scenario {all minimal} {
return -1 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"
gdb_test "ptype full" \
"type = array \\(black \\.\\. white\\) of boolean <packed: 1-bit elements>"
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 <packed: 1-bit elements>"
gdb_test "print primary" " = \\(red => false, true, false\\)"
gdb_test "print primary'first" " = red"
gdb_test "ptype cold" \
"type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"
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 <packed: 1-bit elements>"
gdb_test "print small" " = \\(red => false, true\\)"
gdb_test "print small'first" " = red"
gdb_test "ptype multi" \
"array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
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 ", "
} }
append matrix $base
}
append matrix "\\)"
gdb_test "print multi_multi" " = \\($matrix, $matrix\\)" clean_restart ${testfile}
gdb_test "print multi_multi(1,3)" " = $base"
gdb_test "print multi_multi(2)" " = $matrix" # 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 <packed: 1-bit elements>"
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 <packed: 1-bit elements>"
gdb_test "print primary" " = \\(red => false, true, false\\)"
gdb_test "print primary'first" " = red"
gdb_test "ptype cold" \
"type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"
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 <packed: 1-bit elements>"
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 <packed: 1-bit elements>"
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"
}