binutils-gdb/gdb/testsuite/gdb.base/watchpoint-unaligned.exp
Pedro Alves cce0ae568c gdb: Fix DUPLICATE and PATH regressions throughout
The previous patch to add -prompt/-lbl to gdb_test introduced a
regression: Before, you could specify an explicit empty message to
indicate you didn't want to PASS, like so:

  gdb_test COMMAND PATTERN ""

After said patch, gdb_test no longer distinguishes
no-message-specified vs empty-message, so tests that previously would
be silent on PASS, now started emitting PASS messages based on
COMMAND.  This in turn introduced a number of PATH/DUPLICATE
violations in the testsuite.

This commit fixes all the regressions I could see.

This patch uses the new -nopass feature introduced in the previous
commit, but tries to avoid it if possible.  Most of the patch fixes
DUPLICATE issues the usual way, of using with_test_prefix or explicit
unique messages.

See previous commit's log for more info.

In addition to looking for DUPLICATEs, I also looked for cases where
we would now end up with an empty message in gdb.sum, due to a
gdb_test being passed both no message and empty command.  E.g., this
in gdb.ada/bp_reset.exp:

 gdb_run_cmd
 gdb_test "" "Breakpoint $decimal, foo\\.nested_sub \\(\\).*"

was resulting in this in gdb.sum:

 PASS: gdb.ada/bp_reset.exp:

I fixed such cases by passing an explicit message.  We may want to
make such cases error out.

Tested on x86_64 GNU/Linux, native and native-extended-gdbserver.  I
see zero PATH cases now.  I get zero DUPLICATEs with native testing
now.  I still see some DUPLICATEs with native-extended-gdbserver, but
those were preexisting, unrelated to the gdb_test change.

Change-Id: I5375f23f073493e0672190a0ec2e847938a580b2
2022-05-25 13:44:12 +01:00

188 lines
5.5 KiB
Plaintext

# Copyright 2017-2022 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/>.
#
# This file is part of the gdb testsuite.
# Test inserting read watchpoints on unaligned addresses.
if {[skip_hw_watchpoint_tests]} {
return 0
}
standard_testfile
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
return -1
}
if ![runto_main] {
return -1
}
gdb_breakpoint [gdb_get_line_number "start_again"] "Breakpoint $decimal at $hex" "start_again"
set sizes {1 2 4 8}
array set alignedend {1 1 2 2 3 4 4 4 5 8 6 8 7 8 8 8}
set rwatch "rwatch"
set rwatch_exp "Hardware read watchpoint"
if {[istarget "s390*-*-*"]} {
# Target does not support this type of hardware watchpoint."
set rwatch "watch"
set rwatch_exp "Hardware watchpoint"
}
foreach wpsize $sizes {
for {set wpoffset 0} {$wpoffset < 8 / $wpsize} {incr wpoffset} {
set wpstart [expr $wpoffset * $wpsize]
set wpend [expr ($wpoffset + 1) * $wpsize]
set wpendaligned $alignedend($wpend)
foreach rdsize $sizes {
for {set rdoffset 0} {$rdoffset < 8 / $rdsize} {incr rdoffset} {
set rdstart [expr $rdoffset * $rdsize]
set rdend [expr ($rdoffset + 1) * $rdsize]
set expect_hit [expr max ($wpstart, $rdstart) < min ($wpend, $rdend)]
set test "$rwatch data.u.size$wpsize\[$wpoffset\]"
set wpnum ""
gdb_test_multiple $test $test {
-re "$rwatch_exp (\[0-9\]+): .*\r\n$gdb_prompt $" {
set wpnum $expect_out(1,string)
}
-re "Expression cannot be implemented with read/access watchpoint.\r\n$gdb_prompt $" {
if {$wpsize == 8 && [istarget "arm*-*-*"]} {
untested $test
continue
}
fail $test
}
}
gdb_test_no_output -nopass "set variable size = $rdsize"
gdb_test_no_output -nopass "set variable offset = $rdoffset"
set test "continue"
set got_hit 0
gdb_test_multiple $test $test {
-re "$rwatch_exp $wpnum:.*alue = .*\r\n$gdb_prompt $" {
set got_hit 1
send_gdb "continue\n"
exp_continue
}
-re " start_again .*\r\n$gdb_prompt $" {
}
}
gdb_test_no_output -nopass "delete $wpnum"
set test "wp(size=$wpsize offset=$wpoffset) rd(size=$rdsize offset=$rdoffset) expect=$expect_hit"
if {$expect_hit == $got_hit} {
pass $test
} else {
# We do not know if we run on a fixed Linux kernel
# or not. Report XFAIL only in the FAIL case.
if {$expect_hit == 0 && $rdstart < $wpendaligned} {
setup_xfail external/20207 "aarch64*-*-linux*"
}
if {!$expect_hit && [expr max ($wpstart / 8, $rdstart / 8) < min (($wpend + 7) / 8, ($rdend + 7) / 8)]} {
setup_xfail breakpoints/23131 "powerpc*-*-*"
}
fail $test
}
}
}
}
}
foreach wpcount {4 7} {
array set wpoffset_to_wpnum {}
for {set wpoffset 1} {$wpoffset <= $wpcount} {incr wpoffset} {
set test "$rwatch data.u.size1\[$wpoffset\]"
set wpnum ""
gdb_test_multiple $test $test {
-re "$rwatch_exp (\[0-9\]+): .*\r\n$gdb_prompt $" {
set wpoffset_to_wpnum($wpoffset) $expect_out(1,string)
}
-re "There are not enough available hardware resources for this watchpoint.\r\n$gdb_prompt $" {
if {$wpoffset > 1} {
setup_xfail breakpoints/23131 "powerpc*-*-*"
setup_xfail breakpoints/23131 "arm*-*-*"
}
fail $test
set wpoffset_to_wpnum($wpoffset) 0
}
}
}
gdb_test_no_output -nopass "set variable size = 1"
gdb_test_no_output -nopass "set variable offset = 1"
set test "continue"
set got_hit 0
gdb_test_multiple $test $test {
-re "\r\nCould not insert hardware watchpoint .*\r\n$gdb_prompt $" {
}
-re "$rwatch_exp $wpoffset_to_wpnum(1):.*alue = .*\r\n$gdb_prompt $" {
set got_hit 1
send_gdb "continue\n"
exp_continue
}
-re " start_again .*\r\n$gdb_prompt $" {
}
}
for {set wpoffset 1} {$wpoffset <= $wpcount} {incr wpoffset} {
if {$wpoffset_to_wpnum($wpoffset)} {
gdb_test_no_output "delete $wpoffset_to_wpnum($wpoffset)" ""
}
}
set test "wpcount($wpcount)"
if {!$wpoffset_to_wpnum([expr $wpcount - 1])} {
untested $test
continue
}
if {$wpcount > 4} {
if {![istarget "s390*-*-*"]} {
setup_kfail tdep/22389 *-*-*
}
}
gdb_assert $got_hit $test
}
if ![runto_main] {
return -1
}
gdb_breakpoint [gdb_get_line_number "final_return"] "Breakpoint $decimal at $hex" "final_return"
set test {watch data.u.size8twice[1]}
set wpnum ""
gdb_test_multiple $test $test {
-re "Hardware watchpoint (\[0-9\]+): .*\r\n$gdb_prompt $" {
set wpnum $expect_out(1,string)
}
-re "Watchpoint (\[0-9\]+): .*\r\n$gdb_prompt $" {
if {[istarget "arm*-*-*"]} {
untested $test
set wpnum 0
}
}
}
if {$wpnum} {
set test "continue"
set got_hit 0
gdb_test_multiple $test $test {
-re "\r\nCould not insert hardware watchpoint .*\r\n$gdb_prompt $" {
}
-re "Hardware watchpoint $wpnum:.*New value = .*\r\n$gdb_prompt $" {
set got_hit 1
send_gdb "continue\n"
exp_continue
}
-re " final_return .*\r\n$gdb_prompt $" {
}
}
gdb_assert $got_hit "size8twice write"
}