1 # Copyright 2011-2016 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.
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.
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/>.
15 load_lib "trace-support.exp"
17 if {[skip_shlib_tests]} {
22 set libfile1 "pendshr1"
23 set libfile2 "pendshr2"
24 set executable $testfile
25 set libsrc1 $srcdir/$subdir/$libfile1.c
26 set libsrc2 $srcdir/$subdir/$libfile2.c
27 set lib_sl1 [standard_output_file $libfile1.sl]
28 set lib_sl2 [standard_output_file $libfile2.sl]
30 set lib_opts [gdb_target_symbol_prefix_flags]
32 if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
33 || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} {
34 untested "failed to compile shared library"
38 set exec_opts [list debug shlib=$lib_sl1 shlib_load]
39 if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
40 untested "failed to compile"
44 clean_restart $executable
46 gdb_load_shlib $lib_sl1
47 gdb_load_shlib $lib_sl2
50 fail "can't run to main to check for trace support"
54 if ![gdb_target_supports_trace] {
55 unsupported "current target does not support trace"
59 # Verify pending tracepoint is resolved to running to main.
61 proc pending_tracepoint_resolved { trace_type } {
62 with_test_prefix "$trace_type resolved" {
69 # Start with a fresh gdb.
72 gdb_reinitialize_dir $srcdir/$subdir
74 gdb_test_multiple "$trace_type set_point1" "set pending tracepoint" {
75 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
76 gdb_test "y" "\(Fast t|T\)racepoint.*set_point1.*pending." \
77 "set pending tracepoint (without symbols)"
81 gdb_test "info trace" \
82 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
83 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \
84 "single pending tracepoint info (without symbols)"
88 gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
92 gdb_test "" "Breakpoint 2, main.*"
94 # Run to main which should resolve a pending tracepoint
95 gdb_test "info trace" \
96 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
97 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc.*" \
98 "single tracepoint info"
102 # Verify pending tracepoint is resolved and works as expected.
104 proc pending_tracepoint_works { trace_type } {
105 with_test_prefix "$trace_type works" {
111 # Restart with a fresh gdb.
112 clean_restart $executable
114 # Test setting and querying pending tracepoints
116 gdb_test_multiple "$trace_type set_point1" "set pending tracepoint" {
117 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
119 "\(Fast t|T\)racepoint.*set_point1.*pending." \
120 "set pending tracepoint"
124 gdb_test "info trace" \
125 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
126 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \
127 "single pending tracepoint info"
129 # Run to main which should resolve a pending tracepoint
130 gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
131 "breakpoint function"
133 gdb_test "" "Breakpoint 2, main.*"
135 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
136 "breakpoint on marker"
138 set test "start trace experiment"
139 gdb_test_multiple "tstart" $test {
140 -re "^tstart\r\n$gdb_prompt $" {
143 -re "Target returns error code .* too far .*$gdb_prompt $" {
144 if [string equal $trace_type "ftrace"] {
145 # The target was unable to install the fast tracepoint
146 # (e.g., jump pad too far from tracepoint).
147 pass "$test (too far)"
148 # Skip the rest of the tests.
157 gdb_test "continue" "Continuing.\r\n\r\n(Thread .* hit )?Breakpoint.*marker.*at.*$srcfile.*" \
160 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
162 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
163 gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" \
165 gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" \
168 "Target failed to find requested trace frame..*" \
173 # Verify pending tracepoint is resolved during trace.
175 proc pending_tracepoint_resolved_during_trace { trace_type } \
176 { with_test_prefix "$trace_type resolved_in_trace" \
183 # Start with a fresh gdb.
184 clean_restart $executable
186 fail "can't run to main"
190 gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
191 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
192 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
193 "set pending tracepoint (without symbols)"
197 gdb_test "info trace" \
198 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
199 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \
200 "single pending tracepoint on set_point2"
202 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
203 "breakpoint on marker"
205 gdb_test_no_output "tstart" "start trace experiment"
207 gdb_test "continue" "Continuing.\r\n\r\n(Thread .* hit )?Breakpoint.*marker.*at.*pending.c.*" \
208 "continue to marker 1"
210 set test "continue to marker 2"
211 gdb_test_multiple "continue" $test {
212 -re "Target returns error code .* too far .*$gdb_prompt $" {
213 if [string equal $trace_type "ftrace"] {
214 # Expected if the target was unable to install the
215 # fast tracepoint (e.g., jump pad too far from
217 pass "$test (too far)"
218 # Skip the rest of the tests.
224 -re "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\n(Thread .* hit )?Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
229 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
231 # tracepoint should be resolved.
232 gdb_test "info trace" \
233 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
234 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
235 "tracepoint is resolved"
237 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
238 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
241 # Verify pending tracepoint is resolved and installed during trace.
243 proc pending_tracepoint_installed_during_trace { trace_type } \
244 { with_test_prefix "$trace_type installed_in_trace" \
252 # Start with a fresh gdb.
253 clean_restart $executable
255 fail "can't run to main"
260 gdb_test "trace main" "Tracepoint \[0-9\] at .*" "set tracepoint on main"
262 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
263 "breakpoint on marker"
265 gdb_test_no_output "tstart" "start trace experiment"
267 gdb_test "continue" "Continuing.\r\n\r\n(Thread .* hit )?Breakpoint.*marker.*at.*${srcfile}.*" \
268 "continue to marker 1"
270 # Set a pending tracepoint during a tracing experiment.
271 gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
272 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
273 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
274 "set pending tracepoint"
278 gdb_test "info trace" \
279 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
280 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \t\]+keep y.*PENDING.*set_point2.*" \
281 "single pending tracepoint on set_point2"
283 set test "continue to marker 2"
284 gdb_test_multiple "continue" $test {
285 -re "Target returns error code .* too far .*$gdb_prompt $" {
286 if [string equal $trace_type "ftrace"] {
287 # Expected if the target was unable to install the
288 # fast tracepoint (e.g., jump pad too far from
290 pass "$test (too far)"
291 # Skip the rest of the tests.
297 -re "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\n(Thread .* hit )?Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
302 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
304 # tracepoint should be resolved.
305 gdb_test "info trace" \
306 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
307 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
308 "tracepoint is resolved"
310 # powerpc64 shows "in .pendfunc2" here.
311 gdb_test "tfind start" "#0 $hex in .?pendfunc2 .*" "tfind test frame 0"
312 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
316 # Verify pending tracepoint will no longer work if we disconnect during tracing.
318 proc pending_tracepoint_disconnect_during_trace { trace_type } \
319 { with_test_prefix "$trace_type disconn" \
326 # Start with a fresh gdb.
327 clean_restart $executable
329 fail "can't run to main"
333 gdb_test_multiple "trace pendfunc3" "set pending tracepoint on set_point2" {
334 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
335 gdb_test "y" "\(Fast t|T\)racepoint.*pendfunc3.*pending." \
336 "set pending tracepoint on pendfun3"
340 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
341 "breakpoint on marker"
343 gdb_test_no_output "tstart" "start trace experiment"
345 gdb_test "continue" "Continuing.\r\n\r\n(Thread .* hit )?Breakpoint.*marker.*at.*pending.c.*" \
348 set test "disconnect with pending tracepoint"
349 gdb_test_multiple "disconnect" $test {
350 -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
353 set test "disconnected"
354 gdb_test_multiple "y" $test {
355 -re "$gdb_prompt $" {
364 # Verify disconnect after pending tracepoint has been resolved.
366 proc pending_tracepoint_disconnect_after_resolved { trace_type } \
367 { with_test_prefix "$trace_type disconn_resolved" \
374 # Start with a fresh gdb.
375 clean_restart $executable
377 fail "can't run to main"
381 gdb_test_multiple "trace set_point2" "set pending tracepoint on set_point2" {
382 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
383 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
384 "set pending tracepoint on pendfun2"
388 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
389 "breakpoint on marker"
391 gdb_test_no_output "tstart" "start trace experiment"
393 gdb_test "continue" "Continuing.\r\n\r\n(Thread .* hit )?Breakpoint.*marker.*at.*pending.c.*" \
394 "continue to marker 1"
395 gdb_test "continue" "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\n(Thread .* hit )?Breakpoint.*marker.*at.*pending.c.*" \
396 "continue to marker 2"
398 # There should be no pending tracepoint, so no warning should be emitted.
399 set test "disconnect with resolved tracepoint"
400 gdb_test_multiple "disconnect" $test {
401 -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
404 -re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
408 set test "disconnected"
409 gdb_test_multiple "y" $test {
410 -re "$gdb_prompt $" {
416 # Verify action works properly in resolved tracepoint.
418 proc pending_tracepoint_with_action_resolved { trace_type } \
419 { with_test_prefix "$trace_type action_resolved" \
427 # Start with a fresh gdb.
428 clean_restart $executable
430 fail "can't run to main"
434 gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
435 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
436 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
437 "set pending tracepoint (without symbols)"
441 gdb_trace_setactions "set action for pending tracepoint" "" \
442 "collect \$$pcreg" "^$"
444 gdb_test "info trace" \
445 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
446 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \
447 "single pending tracepoint on set_point2"
449 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
450 "breakpoint on marker"
452 gdb_test_no_output "tstart" "start trace experiment"
454 gdb_test "continue" "Continuing.\r\n\r\n(Thread .* hit )?Breakpoint.*marker.*at.*pending.c.*" \
455 "continue to marker 1"
457 set test "continue to marker 2"
458 gdb_test_multiple "continue" $test {
459 -re "Target returns error code .* too far .*$gdb_prompt $" {
460 if [string equal $trace_type "ftrace"] {
461 # Expected if the target was unable to install the
462 # fast tracepoint (e.g., jump pad too far from
464 pass "$test (too far)"
465 # Skip the rest of the tests.
471 -re "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\n(Thread .* hit )?Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
472 pass "continue to marker 2"
477 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
479 # tracepoint should be resolved.
480 gdb_test "info trace" \
481 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
482 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
483 "tracepoint is resolved"
485 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
486 gdb_test "tdump" "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*"
487 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
490 pending_tracepoint_resolved "trace"
492 pending_tracepoint_works "trace"
494 pending_tracepoint_resolved_during_trace "trace"
496 pending_tracepoint_disconnect_during_trace "trace"
498 pending_tracepoint_disconnect_after_resolved "trace"
500 pending_tracepoint_with_action_resolved "trace"
502 pending_tracepoint_installed_during_trace "trace"
504 # Re-compile test case with IPA.
505 set libipa [get_in_proc_agent]
506 gdb_load_shlib $libipa
508 lappend exec_opts "shlib=$libipa"
510 if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
511 untested "failed to compile with in-process agent library"
515 pending_tracepoint_resolved "ftrace"
516 pending_tracepoint_works "ftrace"
517 pending_tracepoint_resolved_during_trace "ftrace"
518 pending_tracepoint_disconnect_during_trace "ftrace"
519 pending_tracepoint_disconnect_after_resolved "ftrace"
520 pending_tracepoint_with_action_resolved "ftrace"
521 pending_tracepoint_installed_during_trace "ftrace"