# Copyright 2011 # 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 . load_lib "trace-support.exp" set testfile "tspeed" set srcfile ${testfile}.c set executable $testfile set binfile $objdir/$subdir/$executable set ipalib $objdir/../gdbserver/libinproctrace.so if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ executable [concat {debug nowarnings c} libs=$ipalib]] != "" } { untested tspeed.exp return -1 } # Typically we need a little extra time for this test. set timeout 180 set ws "\[\r\n\t \]+" set cr "\[\r\n\]+" # # Utility procs # proc prepare_for_trace_test {} { global executable clean_restart $executable runto_main set testline [gdb_get_line_number "set pre-run breakpoint here"] gdb_test "break $testline" ".*" "" set testline [gdb_get_line_number "set post-run breakpoint here"] gdb_test "break $testline" ".*" "" } proc run_trace_experiment {} { gdb_test "continue" \ ".*Breakpoint \[0-9\]+, main .*" \ "advance to trace begin" gdb_test_no_output "tstart" "start trace experiment" gdb_test "continue" \ ".*Breakpoint \[0-9\]+, main .*" \ "advance through tracing" gdb_test "tstatus" ".*Trace .*" "check on trace status" gdb_test "tstop" "" "" } proc gdb_slow_trace_speed_test { } { gdb_delete_tracepoints gdb_test "print iters = init_iters" ".* = .*"; set testline [gdb_get_line_number "set tracepoint here"] gdb_test "trace $testline if (globfoo != 12 && globfoo2 == 45)" \ "Tracepoint \[0-9\]+ at .*" \ "set slow tracepoint" # Begin the test. run_trace_experiment } proc gdb_fast_trace_speed_test { } { gdb_delete_tracepoints gdb_test "print iters = init_iters" ".* = .*"; set run_ftrace 0 set testline [gdb_get_line_number "set tracepoint here"] gdb_test_multiple "ftrace $testline if (globfoo != 12 && globfoo2 == 45)" \ "set conditional fast tracepoint" { -re "Fast tracepoint \[0-9\]+ at .*" { pass "set conditional fast tracepoint, done" set run_ftrace 1 } -re "May not have a fast tracepoint at .*" { pass "set conditional fast tracepoint, not allowed at line" } } # If the fast tracepoint couldn't be set, don't bother with the run. if { $run_ftrace == 1 } then { # Begin the test. run_trace_experiment } } proc gdb_trace_collection_test {} { prepare_for_trace_test gdb_slow_trace_speed_test gdb_fast_trace_speed_test } clean_restart $executable runto_main # We generously give ourselves one "pass" if we successfully # detect that this test cannot be run on this target! if { ![gdb_target_supports_trace] } then { pass "Current target does not support trace" return 1; } # Body of test encased in a proc so we can return prematurely. gdb_trace_collection_test