1# Copyright 2011-2020 Free Software Foundation, Inc. 2# This program is free software; you can redistribute it and/or modify 3# it under the terms of the GNU General Public License as published by 4# the Free Software Foundation; either version 3 of the License, or 5# (at your option) any later version. 6# 7# This program is distributed in the hope that it will be useful, 8# but WITHOUT ANY WARRANTY; without even the implied warranty of 9# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10# GNU General Public License for more details. 11# 12# You should have received a copy of the GNU General Public License 13# along with this program. If not, see <http://www.gnu.org/licenses/>. 14 15load_lib "trace-support.exp" 16 17standard_testfile 18set executable $testfile 19set expfile $testfile.exp 20 21# Some targets have leading underscores on assembly symbols. 22set additional_flags [gdb_target_symbol_prefix_flags] 23 24if ![gdb_trace_common_supports_arch] { 25 unsupported "no trace-common.h support for arch" 26 return -1 27} 28 29if [prepare_for_testing "failed to prepare" $executable $srcfile \ 30 [list debug $additional_flags]] { 31 return -1 32} 33 34if ![runto_main] { 35 fail "can't run to main to check for trace support" 36 return -1 37} 38 39if ![gdb_target_supports_trace] { 40 unsupported "target does not support trace" 41 return -1 42} 43 44# Set breakpoint and tracepoint at the same address. 45 46proc break_trace_same_addr_1 { trace_type option } \ 47{ with_test_prefix "1 $trace_type $option" \ 48{ 49 global executable 50 global hex 51 52 # Start with a fresh gdb. 53 clean_restart ${executable} 54 if ![runto_main] { 55 fail "can't run to main" 56 return -1 57 } 58 59 gdb_test_no_output "set breakpoint always-inserted ${option}" 60 61 gdb_breakpoint "end" qualified 62 63 gdb_breakpoint "set_point" qualified 64 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" 65 66 gdb_test_no_output "tstart" 67 68 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 69 "continue to set_point" 70 71 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 72 "continue to end" 73 gdb_test_no_output "tstop" 74 75 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0" 76 gdb_test "tfind" "Target failed to find requested trace frame\\..*" 77}} 78 79# Set multiple tracepoints at the same address. 80 81proc break_trace_same_addr_2 { trace_type1 trace_type2 option } \ 82{ with_test_prefix "2 $trace_type1 $trace_type2 $option" \ 83{ 84 global executable 85 global hex 86 87 # Start with a fresh gdb. 88 clean_restart ${executable} 89 if ![runto_main] { 90 fail "can't run to main" 91 return -1 92 } 93 94 gdb_test_no_output "set breakpoint always-inserted ${option}" 95 96 gdb_breakpoint "end" qualified 97 98 gdb_test "${trace_type1} set_point" \ 99 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 100 "${trace_type1} set_point (1)" 101 102 gdb_test "${trace_type2} set_point" \ 103 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 104 "${trace_type2} set_point (2)" 105 106 gdb_test_no_output "tstart" 107 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 108 "continue to end" 109 110 gdb_test_no_output "tstop" 111 112 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0" 113 gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1" 114 gdb_test "tfind" "Target failed to find requested trace frame\\..*" 115}} 116 117# Set breakpoint and tracepoint at the same address. Delete breakpoint, and verify 118# that tracepoint still works. 119 120proc break_trace_same_addr_3 { trace_type option } \ 121{ with_test_prefix "3 $trace_type $option" \ 122{ 123 global executable 124 global hex 125 126 # Start with a fresh gdb. 127 clean_restart ${executable} 128 if ![runto_main] { 129 fail "can't run to main" 130 return -1 131 } 132 133 gdb_test_no_output "set breakpoint always-inserted ${option}" 134 gdb_breakpoint "marker" qualified 135 gdb_breakpoint "end" qualified 136 137 gdb_breakpoint "set_point" qualified 138 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" 139 140 gdb_test_no_output "tstart" 141 142 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 143 "continue to marker" 144 gdb_test "delete break 4" 145 146 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 147 "continue to end" 148 gdb_test_no_output "tstop" 149 150 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0" 151 gdb_test "tfind" "Target failed to find requested trace frame\\..*" 152}} 153 154# Set breakpoint and tracepoint at the same address. Delete tracepoint, and verify 155# that breakpoint still works. 156 157proc break_trace_same_addr_4 { trace_type option } \ 158{ with_test_prefix "4 $trace_type $option" \ 159{ 160 global executable 161 global hex 162 163 164 # Start with a fresh gdb. 165 clean_restart ${executable} 166 if ![runto_main] { 167 fail "can't run to main" 168 return -1 169 } 170 171 gdb_test_no_output "set breakpoint always-inserted ${option}" 172 gdb_breakpoint "marker" qualified 173 gdb_breakpoint "end" qualified 174 175 gdb_breakpoint "set_point" qualified 176 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" 177 178 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 179 "continue to marker" 180 # Delete tracepoint set on set_point. 181 gdb_test "delete trace 5" 182 183 gdb_test "tstart" "No tracepoints defined, not starting trace.*" 184 185 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 186 "continue to set_point" 187 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 188 "continue to end" 189 gdb_test "tstop" "Trace is not running.*" 190 191 gdb_test "tfind" "Target failed to find requested trace frame\\..*" 192}} 193 194# Set two tracepoints TRACE1 and TRACE2 at two locations, and start tracing. 195# Then, set tracepoint TRACE3 at either of these two locations. 196# TRACE3_AT_FIRST_LOC is a boolean variable to decide insert TRACE3 at which 197# of two locations. Verify these tracepoints work as expected. 198 199proc break_trace_same_addr_5 { trace1 trace2 trace3 trace3_at_first_loc } \ 200{ with_test_prefix "5 $trace1 $trace2 ${trace3}@${trace3_at_first_loc}" \ 201{ 202 global executable 203 global hex 204 global fpreg 205 global spreg 206 global pcreg 207 208 # Start with a fresh gdb. 209 clean_restart ${executable} 210 if ![runto_main] { 211 fail "can't run to main" 212 return -1 213 } 214 215 gdb_breakpoint "marker" qualified 216 gdb_breakpoint "end" qualified 217 218 gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 219 "${trace1} set_point 1" 220 gdb_trace_setactions "set action for tracepoint 1" "" \ 221 "collect \$$pcreg" "^$" 222 gdb_test "${trace2} after_set_point" \ 223 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 224 "${trace2} after_set_point 1" 225 226 gdb_trace_setactions "set action for tracepoint 2" "" \ 227 "collect \$$spreg" "^$" 228 229 gdb_test_no_output "tstart" 230 231 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 232 "continue to marker" 233 234 if [string equal $trace3_at_first_loc "1"] { 235 gdb_test "${trace3} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 236 "${trace3} set_point 2" 237 } else { 238 gdb_test "${trace3} after_set_point" \ 239 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 240 "${trace2} after_set_point 2" 241 } 242 gdb_trace_setactions "set action for tracepoint 3" "" \ 243 "collect \$$fpreg" "^$" 244 245 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 246 "continue to end" 247 gdb_test_no_output "tstop" 248 249 gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \ 250 "tfind test frame of tracepoint 4" 251 gdb_test "tdump" \ 252 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \ 253 "tdump 1" 254 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ 255 "reset to frame 0 (1)" 256 gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \ 257 "tfind test frame of tracepoint 5" 258 gdb_test "tdump" \ 259 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \ 260 "tdump 2" 261 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ 262 "reset to frame 0 (2)" 263 gdb_test "tfind tracepoint 6" "Found trace frame \[0-9\], tracepoint .*" \ 264 "tfind test frame of tracepoint 6" 265 gdb_test "tdump" \ 266 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${fpreg} = .*" \ 267 "tdump 3" 268}} 269 270# Set two tracepoints at the same address, and enable/disable them. Verify 271# tracepoints work as expect. 272 273proc break_trace_same_addr_6 { trace1 enable1 trace2 enable2 } \ 274{ with_test_prefix "6 $trace1 $enable1 $trace2 $enable2" \ 275{ 276 global executable 277 global hex 278 global gdb_prompt 279 global spreg 280 global pcreg 281 282 # Start with a fresh gdb. 283 clean_restart ${executable} 284 if ![runto_main] { 285 fail "can't run to main" 286 return -1 287 } 288 289 gdb_breakpoint "marker" qualified 290 gdb_breakpoint "end" qualified 291 292 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 293 "continue to marker" 294 295 gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 296 "${trace1} set_point 1" 297 gdb_trace_setactions "set action for tracepoint 1" "" \ 298 "collect \$$pcreg" "^$" 299 gdb_test "${trace2} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ 300 "${trace2} set_point 2" 301 gdb_trace_setactions "set action for tracepoint 2" "" \ 302 "collect \$$spreg" "^$" 303 304 gdb_test_no_output "$enable1 4" 305 gdb_test_no_output "$enable2 5" 306 307 gdb_test_no_output "tstart" 308 gdb_test "continue" "Continuing\\.\[ \r\n\]+(Thread .* hit )?Breakpoint.*" \ 309 "continue to end" 310 gdb_test_no_output "tstop" 311 312 313 if [string equal $enable1 "enable"] { 314 gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \ 315 "tfind test frame of tracepoint 4" 316 gdb_test "tdump" \ 317 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \ 318 "tdump 1" 319 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ 320 "reset to frame 0 (1)" 321 } else { 322 gdb_test "tfind tracepoint 4" "Target failed to find requested trace frame.*" \ 323 "tfind test frame of tracepoint 4" 324 } 325 326 if [string equal $enable2 "enable"] { 327 gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \ 328 "tfind test frame of tracepoint 5" 329 gdb_test "tdump" \ 330 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \ 331 "tdump 2" 332 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ 333 "reset to frame 0 (2)" 334 } else { 335 gdb_test "tfind tracepoint 5" "Target failed to find requested trace frame.*" \ 336 "tfind test frame of tracepoint 5" 337 } 338}} 339 340 341foreach break_always_inserted { "on" "off" } { 342 break_trace_same_addr_1 "trace" ${break_always_inserted} 343 break_trace_same_addr_2 "trace" "trace" ${break_always_inserted} 344 break_trace_same_addr_3 "trace" ${break_always_inserted} 345 break_trace_same_addr_4 "trace" ${break_always_inserted} 346} 347 348foreach at_first_loc { "1" "0" } { 349 break_trace_same_addr_5 "trace" "trace" "trace" ${at_first_loc} 350} 351 352break_trace_same_addr_6 "trace" "enable" "trace" "disable" 353break_trace_same_addr_6 "trace" "disable" "trace" "enable" 354 355if {[skip_shlib_tests]} { 356 return 0 357} 358 359set libipa [get_in_proc_agent] 360set remote_libipa [gdb_load_shlib $libipa] 361 362# Can't use prepare_for_testing, because that splits compiling into 363# building objects and then linking, and we'd fail with "linker input 364# file unused because linking not done" when building the object. 365 366if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ 367 executable [list debug $additional_flags shlib=$libipa] ] != "" } { 368 untested "failed to compile" 369 return -1 370} 371clean_restart ${executable} 372 373if ![runto_main] { 374 fail "can't run to main for ftrace tests" 375 return 0 376} 377 378gdb_reinitialize_dir $srcdir/$subdir 379if { [gdb_test "info sharedlibrary" ".*${remote_libipa}.*" "IPA loaded"] != 0 } { 380 untested "could not find IPA lib loaded" 381} else { 382 foreach break_always_inserted { "on" "off" } { 383 break_trace_same_addr_1 "ftrace" ${break_always_inserted} 384 break_trace_same_addr_2 "trace" "ftrace" ${break_always_inserted} 385 break_trace_same_addr_2 "ftrace" "trace" ${break_always_inserted} 386 break_trace_same_addr_2 "ftrace" "ftrace" ${break_always_inserted} 387 break_trace_same_addr_3 "ftrace" ${break_always_inserted} 388 break_trace_same_addr_4 "ftrace" ${break_always_inserted} 389 } 390 391 foreach trace1 { "trace" "ftrace" } { 392 foreach trace2 { "trace" "ftrace" } { 393 foreach trace3 { "trace" "ftrace" } { 394 395 if { [string equal $trace1 "trace"] 396 && [string equal $trace2 "trace"] 397 && [string equal $trace3 "trace"] } { 398 continue 399 } 400 401 foreach at_first_loc { "1" "0" } { 402 break_trace_same_addr_5 $trace1 $trace2 $trace3 $at_first_loc 403 } 404 } 405 } 406 } 407 408 foreach trace1 { "trace" "ftrace" } { 409 foreach trace2 { "trace" "ftrace" } { 410 if { [string equal $trace1 "trace"] 411 && [string equal $trace2 "trace"] } { 412 continue 413 } 414 break_trace_same_addr_6 $trace1 "enable" $trace2 "disable" 415 break_trace_same_addr_6 $trace1 "disable" $trace2 "enable" 416 } 417 } 418} 419