| # Copyright 2018-2021 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 |
| |
| # 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 |
| } |
| |
| if ![runto f1] { |
| return |
| } |
| |
| gdb_test "p a" \ |
| " = <optimized out>" \ |
| "printed optimized out vla" |
| |
| gdb_test "p sizeof (a)" \ |
| " = ($sizeof_result)" \ |
| "printed size of optimized out vla" |
| |
| # 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)" |
| } |
| |
| foreach {test_prefix options} \ |
| { "o1" {{debug optimize=-O1 additional_flags=-DNOCLONE} "6"} \ |
| "o3" {{debug optimize=-O3} "<optimized out>|6"} \ |
| "o3_strict" {{debug optimize=-O3 \ |
| additional_flags=-gstrict-dwarf} \ |
| "<optimized out>|6"}} { |
| with_test_prefix $test_prefix { |
| vla_optimized_out $test_prefix $options |
| } |
| } |
| |