1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
# Copyright 2024 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/>.
# Test a binary that uses standard libc memory operation functions. They are
# frequently optimized with specialized instructions, so make sure GDB behaves
# correctly in their presence.
standard_testfile
set options "-fno-builtin-memset -fno-builtin-memcpy -fno-builtin-memmove"
if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
[list debug additional_flags=$options]] } {
return -1
}
set linespec ${srcfile}:[gdb_get_line_number "Break here"]
if ![runto ${linespec}] {
return -1
}
gdb_test "watch -location a\[28\]" \
"(Hardware w|W)atchpoint ${decimal}: -location a\\\[28\\\]" \
"set watch on a"
gdb_test "watch -location b\[28\]" \
"(Hardware w|W)atchpoint ${decimal}: -location b\\\[28\\\]" \
"set watchpoint on b"
gdb_test "watch -location c\[28\]" \
"(Hardware w|W)atchpoint ${decimal}: -location c\\\[28\\\]" \
"set watchpoint on c"
# For the tests below, split the pattern matching in two parts: one for the
# watchpoint trigger, and another for the line showing the function name.
# This is to allow the tests to work if there's a properly named symbol for
# the function, even if there's no libc debug info.
set saw_watch_trigger 0
set saw_function 0
set is_supported 1
set message "continue until memset watchpoint hits"
set watch_trigger \
[multi_line \
"Continuing\\." \
"" \
"(Hardware w|W)atchpoint ${decimal}: -location a\\\[28\\\]" \
"" \
"Old value = 104 'h'" \
"New value = 0 '\\\\000'"]
gdb_test_multiple "continue" $message {
-re $watch_trigger {
set saw_watch_trigger 1
exp_continue
}
-re ".*memset.* \\(\\) at .*:$decimal\r\n" {
set saw_function 1
exp_continue
}
-re ".*memset.* \\(\\) from .*libc\[^\r\n\]+\r\n" {
set saw_function 1
exp_continue
}
-re "in \\?\\? \\(\\) from .*libc\[^\r\n\]+\r\n" {
set is_supported 0
unsupported "symbol for memset not found"
exp_continue
}
-re "$gdb_prompt $" {
if { $is_supported } {
setup_kfail breakpoints/31665 arm*-*-linux*
gdb_assert { $saw_watch_trigger && $saw_function } $message
}
}
}
# Note: Some architectures use memmove for memcpy.
set saw_watch_trigger 0
set saw_function 0
set is_supported 1
set message "continue until memcpy watchpoint hits"
set watch_trigger \
[multi_line \
"Continuing\\." \
"" \
"(Hardware w|W)atchpoint ${decimal}: -location b\\\[28\\\]" \
"" \
"Old value = 101 'e'" \
"New value = 114 'r'"]
gdb_test_multiple "continue" $message {
-re $watch_trigger {
set saw_watch_trigger 1
exp_continue
}
-re ".*(memcpy|memmove).* \\(\\) at .*:$decimal\r\n" {
set saw_function 1
exp_continue
}
-re ".*(memcpy|memmove).* \\(\\) from .*libc\[^\r\n\]+\r\n" {
set saw_function 1
exp_continue
}
-re "in \\?\\? \\(\\) from .*libc\[^\r\n\]+\r\n" {
set is_supported 0
unsupported "symbol for memcpy not found"
exp_continue
}
-re "$gdb_prompt $" {
if { $is_supported } {
setup_kfail breakpoints/31665 arm*-*-linux*
gdb_assert { $saw_watch_trigger && $saw_function } $message
}
}
}
# Note: Some architectures use memcpy for memmove.
set saw_watch_trigger 0
set saw_function 0
set is_supported 1
set message "continue until memmove watchpoint hits"
set watch_trigger \
[multi_line \
"Continuing\\." \
"" \
"(Hardware w|W)atchpoint ${decimal}: -location c\\\[28\\\]" \
"" \
"Old value = 100 'd'" \
"New value = 114 'r'"]
gdb_test_multiple "continue" $message {
-re $watch_trigger {
set saw_watch_trigger 1
exp_continue
}
-re ".*(memcpy|memmove).* \\(\\) at .*:$decimal\r\n" {
set saw_function 1
exp_continue
}
-re ".*(memcpy|memmove).* \\(\\) from .*libc\[^\r\n\]+\r\n" {
set saw_function 1
exp_continue
}
-re "in \\?\\? \\(\\) from .*libc\[^\r\n\]+\r\n" {
set is_supported 0
unsupported "symbol for memmove not found"
exp_continue
}
-re "$gdb_prompt $" {
if { $is_supported } {
setup_kfail breakpoints/31665 arm*-*-linux*
gdb_assert { $saw_watch_trigger && $saw_function } $message
}
}
}
|