155bfbd30a
Using the gdb.ada/var_rec_arr.exp test, where the program declares an array of variant records... type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; type Array_Type is array (Integer range <>) of Record_Type; ... and then a variable A1 of type Array_Type, the following command ocassionally trigger an internal error trying to allocate more memory than we have left: (gdb) ptype a1(1) [...]/utils.c:1089: internal-error: virtual memory exhausted. A problem internal to GDB has been detected, [...] What happens is that recent versions of GNAT are able to generate DWARF expressions for type Record_Type, and therefore the record's DW_AT_byte_size is not a constant, which unfortunately breaks an assumption made by dwarf2read.c:read_structure_type when it does: attr = dwarf2_attr (die, DW_AT_byte_size, cu); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); } As a result of this, when ada_evaluate_subexp tries to create a value_zero for a1(1) while processing the OP_FUNCALL operator as part of evaluating the subscripting operation in no-side-effect mode, we try to allocate a value with a bogus size, potentially triggering the out-of-memory internal error. This patch avoids this issue by setting the length to zero in this case. Until we decide to start supporting dynamic type lengths in GDB's type struct, and it's not clear yet that this is worth the effort (see added comment), that's probably the best we can do. gdb/ChangeLog: * dwarf2read.c (read_structure_type): Set the type's length to zero if it has a DW_AT_byte_size attribute which is not a constant. gdb/testsuite/ChangeLog: * testsuite/gdb.ada/var_rec_arr.exp: Add "ptype a1(1)" test.
57 lines
1.8 KiB
Text
57 lines
1.8 KiB
Text
# Copyright 2015 Free Software Foundation, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
load_lib "ada.exp"
|
|
|
|
standard_ada_testfile foo_na09_042
|
|
|
|
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${testfile}
|
|
|
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo_na09_042.adb]
|
|
runto "foo_na09_042.adb:$bp_location"
|
|
|
|
gdb_test "print a1" \
|
|
" = \\(\\(i => 0, s => \"\"\\), \\(i => 1, s => \"A\"\\), \\(i => 2, s => \"AB\"\\)\\)"
|
|
|
|
gdb_test "print a1(1)" \
|
|
" = \\(i => 0, s => \"\"\\)"
|
|
|
|
gdb_test "print a1(2)" \
|
|
" = \\(i => 1, s => \"A\"\\)"
|
|
|
|
gdb_test "print a1(3)" \
|
|
" = \\(i => 2, s => \"AB\"\\)"
|
|
|
|
gdb_test "print a2" \
|
|
" = \\(\\(i => 2, s => \"AB\"\\), \\(i => 1, s => \"A\"\\), \\(i => 0, s => \"\"\\)\\)"
|
|
|
|
gdb_test "print a2(1)" \
|
|
" = \\(i => 2, s => \"AB\"\\)"
|
|
|
|
gdb_test "print a2(2)" \
|
|
" = \\(i => 1, s => \"A\"\\)"
|
|
|
|
gdb_test "print a2(3)" \
|
|
" = \\(i => 0, s => \"\"\\)"
|
|
|
|
gdb_test "ptype a1(1)" \
|
|
[multi_line "type = record" \
|
|
" i: pck\\.small_type;" \
|
|
" s: access array \\((<>|1 \\.\\. i)\\) of character;" \
|
|
"end record"]
|