2018-07-03 11:06:45 +02:00
|
|
|
# Copyright 2018 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/>.
|
|
|
|
|
|
|
|
# Check whether we can determine the size of an optimized-out vla.
|
|
|
|
|
|
|
|
standard_testfile
|
|
|
|
|
2018-07-28 21:55:04 +02:00
|
|
|
# The EXE_SUFFIX is a string appended to the name of the test binary
|
|
|
|
# to make it unique per variation.
|
|
|
|
# The OPTIONS is a two item list, the first item is a list of compiler
|
|
|
|
# flags used for building the test binary, and the second item is a
|
|
|
|
# pattern which matches some expected output within this proc.
|
|
|
|
proc vla_optimized_out {exe_suffix options} {
|
|
|
|
global testfile srcfile
|
|
|
|
|
|
|
|
lassign $options compile_flags sizeof_result
|
|
|
|
|
|
|
|
if { [prepare_for_testing "failed to prepare" "$testfile-$exe_suffix" $srcfile \
|
|
|
|
$compile_flags] } {
|
|
|
|
return -1
|
|
|
|
}
|
2018-07-03 11:06:45 +02:00
|
|
|
|
|
|
|
if ![runto f1] {
|
|
|
|
fail "can't run to f1"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
gdb_test "p a" \
|
2018-07-28 21:55:04 +02:00
|
|
|
" = <optimized out>" \
|
2018-07-03 11:06:45 +02:00
|
|
|
"printed optimized out vla"
|
|
|
|
|
|
|
|
gdb_test "p sizeof (a)" \
|
2018-07-28 21:55:04 +02:00
|
|
|
" = $sizeof_result" \
|
2018-07-03 11:06:45 +02:00
|
|
|
"printed size of optimized out vla"
|
gdb: Check element of optimised out vla exists
If a vla is not in memory, and the upper bound is not defined, then we
can't know that an array element exists or not, and we should not try
to access the array element. One case where this happens is for
arrays that have been optimised out, the array will then have
VALUE_LVAL of not_lval, and an undefined upper bound, if we then try
to access an element of this array we will index into random GDB
memory.
An argument could be made that even for arrays that are in inferior
memory, if the upper bound is not defined then we should not try to
access the array element, however, in some of the Fortran tests, it
seems as though we do rely indexing from a base address into an array
which has no bounds defined. In this case GDBs standard protection
for detecting unreadable target memory prevents bad thing happening.
gdb/ChangeLog:
* valarith.c (value_subscripted_rvalue): If an array is not in
memory, and we don't know the upper bound, then we can't know that
the requested element exists or not.
gdb/testsuite/ChangeLog:
* gdb.base/vla-optimized-out.exp: Add new test.
2018-07-25 18:33:08 +02:00
|
|
|
|
|
|
|
# At lower optimisation levels, the upper bound of the array is
|
|
|
|
# still defined, it's just the loctaion that tells GDB the array
|
|
|
|
# is optimised out. In that case, when we access an element that
|
|
|
|
# is within the bounds of the array an answer of '<optimized out>'
|
|
|
|
# is reasonable.
|
|
|
|
#
|
|
|
|
# At higher optimisation levels, the array bounds themselves have
|
|
|
|
# been removed. As such GDB can't be expected to know if the
|
|
|
|
# array contains _any_ elements at all. It seems reasonable in
|
|
|
|
# that case to reply with 'no such vector element'.
|
|
|
|
gdb_test "p a\[0\]" \
|
|
|
|
"(= <optimized out>|no such vector element)" \
|
|
|
|
"print out of range element of vla (0)"
|
|
|
|
|
|
|
|
gdb_test "p a\[6\]" \
|
|
|
|
"no such vector element" \
|
|
|
|
"print out of range element of vla (6)"
|
|
|
|
|
|
|
|
gdb_test "p a\[0xffffffff\]" \
|
|
|
|
"no such vector element" \
|
|
|
|
"print out of range element of vla (0xffffffff)"
|
2018-07-03 11:06:45 +02:00
|
|
|
}
|
|
|
|
|
2018-07-28 21:55:04 +02:00
|
|
|
foreach {test_prefix options} \
|
|
|
|
{ "o1" {{debug optimize=-O1 additional_flags=-DNOCLONE} "6"} \
|
|
|
|
"o3" {{debug optimize=-O3} "<optimized out>"} \
|
|
|
|
"o3_strict" {{debug optimize=-O3 \
|
|
|
|
additional_flags=-gstrict-dwarf} \
|
|
|
|
"<optimized out>"}} {
|
|
|
|
with_test_prefix $test_prefix {
|
|
|
|
vla_optimized_out $test_prefix $options
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|