1 # Copyright 2011 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 set testfile "trace-break"
18 set executable $testfile
19 set srcfile $testfile.c
20 set binfile $objdir/$subdir/$testfile
21 set expfile $testfile.exp
23 # Some targets have leading underscores on assembly symbols.
24 set additional_flags [gdb_target_symbol_prefix_flags]
26 if [prepare_for_testing $expfile $executable $srcfile \
27 [list debug $additional_flags]] {
28 untested "failed to prepare for trace tests"
33 fail "Can't run to main to check for trace support"
37 if ![gdb_target_supports_trace] {
38 unsupported "target does not support trace"
46 if [is_amd64_regs_target] {
50 } elseif [is_x86_like_target] {
56 # Set breakpoint and tracepoint at the same address.
58 proc break_trace_same_addr_1 { trace_type option } {
63 set old_pf_prefix $pf_prefix
64 set pf_prefix "$pf_prefix 1 $trace_type $option:"
66 # Start with a fresh gdb.
67 clean_restart ${executable}
69 fail "Can't run to main"
70 set pf_prefix $old_pf_prefix
74 gdb_test_no_output "set breakpoint always-inserted ${option}"
76 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
78 gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
79 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
81 gdb_test_no_output "tstart"
83 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to set_point"
85 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
86 gdb_test_no_output "tstop"
88 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
89 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
91 set pf_prefix $old_pf_prefix
94 # Set multiple tracepoints at the same address.
96 proc break_trace_same_addr_2 { trace_type1 trace_type2 option } {
101 set old_pf_prefix $pf_prefix
102 set pf_prefix "$pf_prefix 2 $trace_type1 $trace_type2 $option:"
104 # Start with a fresh gdb.
105 clean_restart ${executable}
107 fail "Can't run to main"
108 set pf_prefix $old_pf_prefix
112 gdb_test_no_output "set breakpoint always-inserted ${option}"
114 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
116 gdb_test "${trace_type1} set_point" \
117 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
118 "${trace_type1} set_point (1)"
120 gdb_test "${trace_type2} set_point" \
121 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
122 "${trace_type2} set_point (2)"
124 gdb_test_no_output "tstart"
125 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
127 gdb_test_no_output "tstop"
129 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
130 gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1"
131 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
133 set pf_prefix $old_pf_prefix
136 # Set breakpoint and tracepoint at the same address. Delete breakpoint, and verify
137 # that tracepoint still works.
139 proc break_trace_same_addr_3 { trace_type option } {
144 set old_pf_prefix $pf_prefix
145 set pf_prefix "$pf_prefix 3 $trace_type $option:"
147 # Start with a fresh gdb.
148 clean_restart ${executable}
150 fail "Can't run to main"
151 set pf_prefix $old_pf_prefix
155 gdb_test_no_output "set breakpoint always-inserted ${option}"
156 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
157 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
159 gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
160 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
162 gdb_test_no_output "tstart"
164 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
165 gdb_test "delete break 4"
167 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
168 gdb_test_no_output "tstop"
170 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
171 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
173 set pf_prefix $old_pf_prefix
176 # Set breakpoint and tracepoint at the same address. Delete tracepoint, and verify
177 # that breakpoint still works.
179 proc break_trace_same_addr_4 { trace_type option } {
184 set old_pf_prefix $pf_prefix
185 set pf_prefix "$pf_prefix 4 $trace_type $option:"
187 # Start with a fresh gdb.
188 clean_restart ${executable}
190 fail "Can't run to main"
191 set pf_prefix $old_pf_prefix
195 gdb_test_no_output "set breakpoint always-inserted ${option}"
196 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
197 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
199 gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
200 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
202 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
203 # Delete tracepoint set on set_point.
204 gdb_test "delete trace 5"
206 gdb_test "tstart" "No tracepoints defined, not starting trace.*"
208 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to set_point"
209 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
210 gdb_test "tstop" "Trace is not running.*"
212 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
214 set pf_prefix $old_pf_prefix
217 # Set two tracepoints TRACE1 and TRACE2 at two locations, and start tracing.
218 # Then, set tracepoint TRACE3 at either of these two locations.
219 # TRACE3_AT_FIRST_LOC is a boolean variable to decide insert TRACE3 at which
220 # of two locations. Verify these tracepoints work as expected.
222 proc break_trace_same_addr_5 { trace1 trace2 trace3 trace3_at_first_loc } {
230 set old_pf_prefix $pf_prefix
231 set pf_prefix "$pf_prefix 5 $trace1 $trace2 ${trace3}@${trace3_at_first_loc}:"
233 # Start with a fresh gdb.
234 clean_restart ${executable}
236 fail "Can't run to main"
237 set pf_prefix $old_pf_prefix
241 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
242 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
244 gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
245 "${trace1} set_point 1"
246 gdb_trace_setactions "set action for tracepoint 1" "" \
247 "collect \$$pcreg" "^$"
248 gdb_test "${trace2} after_set_point" \
249 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
250 "${trace2} after_set_point 1"
252 gdb_trace_setactions "set action for tracepoint 2" "" \
253 "collect \$$spreg" "^$"
255 gdb_test_no_output "tstart"
257 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
259 if [string equal $trace3_at_first_loc "1"] {
260 gdb_test "${trace3} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
261 "${trace3} set_point 2"
263 gdb_test "${trace3} after_set_point" \
264 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
265 "${trace2} after_set_point 2"
267 gdb_trace_setactions "set action for tracepoint 3" "" \
268 "collect \$$fpreg" "^$"
270 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
271 gdb_test_no_output "tstop"
273 gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \
274 "tfind test frame of tracepoint 4"
276 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \
278 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
279 "reset to frame 0 (1)"
280 gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \
281 "tfind test frame of tracepoint 5"
283 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \
285 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
286 "reset to frame 0 (2)"
287 gdb_test "tfind tracepoint 6" "Found trace frame \[0-9\], tracepoint .*" \
288 "tfind test frame of tracepoint 6"
290 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${fpreg} = .*" \
293 set pf_prefix $old_pf_prefix
296 # Set two tracepoints at the same address, and enable/disable them. Verify
297 # tracepoints work as expect.
299 proc break_trace_same_addr_6 { trace1 enable1 trace2 enable2 } {
307 set old_pf_prefix $pf_prefix
308 set pf_prefix "$pf_prefix 6 $trace1 $enable1 $trace2 $enable2:"
310 # Start with a fresh gdb.
311 clean_restart ${executable}
313 fail "Can't run to main"
314 set pf_prefix $old_pf_prefix
318 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
319 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
321 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
323 gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
324 "${trace1} set_point 1"
325 gdb_trace_setactions "set action for tracepoint 1" "" \
326 "collect \$$pcreg" "^$"
327 gdb_test "${trace2} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
328 "${trace2} set_point 2"
329 gdb_trace_setactions "set action for tracepoint 2" "" \
330 "collect \$$spreg" "^$"
332 gdb_test_no_output "$enable1 4"
333 gdb_test_no_output "$enable2 5"
335 gdb_test_no_output "tstart"
336 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
337 gdb_test_no_output "tstop"
340 if [string equal $enable1 "enable"] {
341 gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \
342 "tfind test frame of tracepoint 4"
344 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \
346 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
347 "reset to frame 0 (1)"
349 gdb_test "tfind tracepoint 4" "Target failed to find requested trace frame.*" \
350 "tfind test frame of tracepoint 4"
353 if [string equal $enable2 "enable"] {
354 gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \
355 "tfind test frame of tracepoint 5"
357 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \
359 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
360 "reset to frame 0 (2)"
362 gdb_test "tfind tracepoint 5" "Target failed to find requested trace frame.*" \
363 "tfind test frame of tracepoint 5"
366 set pf_prefix $old_pf_prefix
370 foreach break_always_inserted { "on" "off" } {
371 break_trace_same_addr_1 "trace" ${break_always_inserted}
372 break_trace_same_addr_2 "trace" "trace" ${break_always_inserted}
373 break_trace_same_addr_3 "trace" ${break_always_inserted}
374 break_trace_same_addr_4 "trace" ${break_always_inserted}
377 foreach at_first_loc { "1" "0" } {
378 break_trace_same_addr_5 "trace" "trace" "trace" ${at_first_loc}
381 break_trace_same_addr_6 "trace" "enable" "trace" "disable"
382 break_trace_same_addr_6 "trace" "disable" "trace" "enable"
384 set libipa $objdir/../gdbserver/libinproctrace.so
385 gdb_load_shlibs $libipa
387 # Can't use prepare_for_testing, because that splits compiling into
388 # building objects and then linking, and we'd fail with "linker input
389 # file unused because linking not done" when building the object.
391 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
392 executable [list debug $additional_flags shlib=$libipa] ] != "" } {
393 untested "failed to compile ftrace tests"
396 clean_restart ${executable}
399 fail "Can't run to main for ftrace tests"
403 gdb_reinitialize_dir $srcdir/$subdir
404 if { [gdb_test "info sharedlibrary" ".*libinproctrace\.so.*" "IPA loaded"] != 0 } {
405 untested "Could not find IPA lib loaded"
407 foreach break_always_inserted { "on" "off" } {
408 break_trace_same_addr_1 "ftrace" ${break_always_inserted}
409 break_trace_same_addr_2 "trace" "ftrace" ${break_always_inserted}
410 break_trace_same_addr_2 "ftrace" "trace" ${break_always_inserted}
411 break_trace_same_addr_2 "ftrace" "ftrace" ${break_always_inserted}
412 break_trace_same_addr_3 "ftrace" ${break_always_inserted}
413 break_trace_same_addr_4 "ftrace" ${break_always_inserted}
416 foreach trace1 { "trace" "ftrace" } {
417 foreach trace2 { "trace" "ftrace" } {
418 foreach trace3 { "trace" "ftrace" } {
420 if { [string equal $trace1 "trace"]
421 && [string equal $trace2 "trace"]
422 && [string equal $trace3 "trace"] } {
426 foreach at_first_loc { "1" "0" } {
427 break_trace_same_addr_5 $trace1 $trace2 $trace3 $at_first_loc
433 foreach trace1 { "trace" "ftrace" } {
434 foreach trace2 { "trace" "ftrace" } {
435 if { [string equal $trace1 "trace"]
436 && [string equal $trace2 "trace"] } {
439 break_trace_same_addr_6 $trace1 "enable" $trace2 "disable"
440 break_trace_same_addr_6 $trace1 "disable" $trace2 "enable"