mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 20:28:28 +08:00
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:
@ -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.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -19,12 +19,22 @@ 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} {
|
||||||
|
set flags [list debug additional_flags=-fgnat-encodings=$scenario]
|
||||||
|
|
||||||
|
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
clean_restart ${testfile}
|
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]
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
|
||||||
runto "foo.adb:$bp_location"
|
runto "foo.adb:$bp_location"
|
||||||
|
|
||||||
@ -52,19 +62,38 @@ gdb_test "print cold'first" " = green"
|
|||||||
# Note the bounds values are still not correctly displayed. So we get
|
# Note the bounds values are still not correctly displayed. So we get
|
||||||
# the enum equivalent of "1 .. 0" (empty range) as the array ranges.
|
# the enum equivalent of "1 .. 0" (empty range) as the array ranges.
|
||||||
# Accept that for now.
|
# Accept that for now.
|
||||||
|
# GNAT >= 11.0 has the needed fix here.
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "ptype small" \
|
gdb_test "ptype small" \
|
||||||
"array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"
|
"array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"
|
||||||
|
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print small" " = \\(red => false, true\\)"
|
gdb_test "print small" " = \\(red => false, true\\)"
|
||||||
|
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print small'first" " = red"
|
gdb_test "print small'first" " = red"
|
||||||
|
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "ptype multi" \
|
gdb_test "ptype multi" \
|
||||||
"array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
|
"array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"
|
||||||
|
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print multi" \
|
gdb_test "print multi" \
|
||||||
" = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"
|
" = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"
|
||||||
|
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print multi'first" " = red"
|
gdb_test "print multi'first" " = red"
|
||||||
|
|
||||||
set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
|
set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
|
||||||
@ -77,6 +106,16 @@ foreach x {1 2 3 4 5 6 7} {
|
|||||||
}
|
}
|
||||||
append matrix "\\)"
|
append matrix "\\)"
|
||||||
|
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
|
gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print multi_multi(1,3)" " = $base"
|
gdb_test "print multi_multi(1,3)" " = $base"
|
||||||
|
if {$old_compiler} {
|
||||||
|
setup_kfail "minimal encodings" *-*-*
|
||||||
|
}
|
||||||
gdb_test "print multi_multi(2)" " = $matrix"
|
gdb_test "print multi_multi(2)" " = $matrix"
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user