| # Copyright 2011-2012 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/>. |
| |
| load_lib "trace-support.exp"; |
| |
| if {[skip_shlib_tests]} { |
| return 0 |
| } |
| |
| standard_testfile |
| set libfile1 "change-loc-1" |
| set libfile2 "change-loc-2" |
| set executable $testfile |
| set libsrc1 $srcdir/$subdir/$libfile1.c |
| set libsrc2 $srcdir/$subdir/$libfile2.c |
| set lib_sl1 [standard_output_file $libfile1.sl] |
| set lib_sl2 [standard_output_file $libfile2.sl] |
| |
| set lib_opts debug |
| |
| if [get_compiler_info] { |
| return -1 |
| } |
| |
| # Some targets have leading underscores on assembly symbols. |
| set additional_flags [list debug shlib=$lib_sl1 shlib_load [gdb_target_symbol_prefix_flags]] |
| |
| if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != "" |
| || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != "" |
| || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags] != ""} { |
| untested "Could not compile either $libsrc1 or $srcdir/$subdir/$srcfile." |
| return -1 |
| } |
| |
| clean_restart $executable |
| |
| gdb_load_shlibs $lib_sl1 |
| gdb_load_shlibs $lib_sl2 |
| |
| if ![runto_main] { |
| fail "Can't run to main to check for trace support" |
| return -1 |
| } |
| |
| if { ![gdb_target_supports_trace] } then { |
| unsupported "Current target does not support trace" |
| return -1; |
| } |
| |
| if [is_amd64_regs_target] { |
| set pcreg "rip" |
| } elseif [is_x86_like_target] { |
| set pcreg "eip" |
| } else { |
| set pcreg "pc" |
| } |
| |
| |
| # Set tracepoint during tracing experiment. |
| |
| proc tracepoint_change_loc_1 { trace_type } { with_test_prefix "1 $trace_type" { |
| global testfile |
| global srcfile |
| global pcreg |
| global gdb_prompt |
| |
| clean_restart ${testfile} |
| if ![runto_main] { |
| fail "Can't run to main" |
| return -1 |
| } |
| gdb_test_no_output "delete break 1" |
| |
| # Set a tracepoint we'll never meet. Just to avoid the complain after |
| # type `tstart' later. |
| gdb_test "next" ".*" |
| gdb_test "trace main" "Tracepoint \[0-9\] at.* file .*$srcfile, line.*" \ |
| "set tracepoint on main" |
| |
| gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ |
| "breakpoint on marker" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ |
| "continue to marker 1" |
| # Set a tracepoint during tracing. |
| set test "set tracepoint on set_tracepoint" |
| gdb_test_multiple "${trace_type} set_tracepoint" $test { |
| -re "Target returns error code .* too far .*$gdb_prompt $" { |
| if [string equal $trace_type "ftrace"] { |
| # The target was unable to install the fast tracepoint |
| # (e.g., jump pad too far from tracepoint). |
| pass "$test (too far)" |
| } else { |
| fail $test |
| } |
| } |
| -re "\r\n$gdb_prompt $" { |
| pass $test |
| } |
| } |
| |
| gdb_trace_setactions "set action for tracepoint" "" \ |
| "collect \$$pcreg" "^$" |
| |
| # tracepoint has two locations after shlib change-loc-1 is loaded. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*4\.2.* in func4.*" \ |
| "tracepoint with two locations" |
| |
| set test "continue to marker 2" |
| gdb_test_multiple "continue" $test { |
| -re "Target returns error code .* too far .*$gdb_prompt $" { |
| if [string equal $trace_type "ftrace"] { |
| # Expected if the target was unable to install the |
| # fast tracepoint (e.g., jump pad too far from |
| # tracepoint). |
| pass "$test (too far)" |
| # Skip the rest of the tests. |
| return |
| } else { |
| fail "continue to marker 2" |
| fail $test |
| } |
| |
| } |
| -re ".*Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { |
| pass "continue to marker 2" |
| } |
| } |
| |
| # tracepoint has three locations after shlib change-loc-2 is loaded. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*4\.2.* in func4.*4\.3.* in func4 .*" \ |
| "tracepoint with three locations" |
| |
| gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ |
| "continue to marker 3" |
| |
| # shlib is unloaded, there are still three locations, but one is pending. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*(4\.2.* in func4.*4\.3.* \<PENDING\>\[\t \]+set_tracepoint|4\.2.* \<PENDING\>\[\t \]+set_tracepoint\r\n4\.3.* in func4).*" \ |
| "tracepoint with two locations (unload)" |
| |
| gdb_test_no_output "tstop" |
| |
| gdb_test "tfind" "Found trace frame 0, tracepoint 4.*" "tfind frame 0" |
| gdb_test "tfind" "Target failed to find requested trace frame\\..*" |
| }} |
| |
| # Set pending tracepoint. |
| |
| proc tracepoint_change_loc_2 { trace_type } { with_test_prefix "2 $trace_type" { |
| global srcdir |
| global srcfile |
| global subdir |
| global pcreg |
| global binfile |
| global gdb_prompt |
| |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| |
| gdb_test_multiple "${trace_type} set_tracepoint" "set pending tracepoint" { |
| -re ".*Make \(|fast \)tracepoint pending.*y or \\\[n\\\]. $" { |
| gdb_test "y" "\(Fast t|T\)racepoint.*set_tracepoint.*pending." "set pending tracepoint" |
| } |
| } |
| |
| gdb_trace_setactions "set action for tracepoint" "" \ |
| "collect \$$pcreg" "^$" |
| |
| # tracepoint has no location information now. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*PENDING.*set_tracepoint.*" \ |
| "single pending tracepoint info (without symbols)" |
| |
| gdb_load ${binfile} |
| # tracepoint has one location after executable is loaded. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*func4.*" \ |
| "tracepoint with one location" |
| |
| set main_bp 0 |
| gdb_test_multiple "break main" "set breakpoint on main" { |
| -re "Breakpoint (\[0-9\]*) at .*, line.*$gdb_prompt $" { |
| set main_bp $expect_out(1,string) |
| } |
| } |
| gdb_run_cmd |
| |
| gdb_test "" \ |
| ".*Breakpoint.*main.*at.*$srcfile.*" \ |
| "run to main" |
| gdb_test_no_output "delete break $main_bp" |
| |
| # tracepoint has two locations after shlib change-loc-1 is loaded. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*1\.2.* in func4.*" \ |
| "tracepoint with two locations" |
| |
| gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ |
| "breakpoint on marker" |
| |
| # tracepoint with two locations will be downloaded and installed. |
| set test "tstart" |
| gdb_test_multiple "tstart" $test { |
| -re "^tstart\r\n$gdb_prompt $" { |
| pass "tstart" |
| } |
| -re "Target returns error code .* too far .*$gdb_prompt $" { |
| if [string equal $trace_type "ftrace"] { |
| # The target was unable to install the fast tracepoint |
| # (e.g., jump pad too far from tracepoint). |
| pass "$test (too far)" |
| # Skip the rest of the tests. |
| return |
| } else { |
| fail $test |
| } |
| } |
| } |
| |
| gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ |
| "continue to marker 1" |
| |
| gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ |
| "continue to marker 2" |
| |
| # tracepoint has three locations after shlib change-loc-2 is loaded. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*1\.2.* in func4.*1\.3.* in func4 .*" \ |
| "tracepoint with three locations" |
| |
| gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ |
| "continue to marker 3" |
| |
| # shlib is unloaded, there are still three locations, but one is pending. |
| gdb_test "info trace" \ |
| "Num Type\[ \]+Disp Enb Address\[ \]+What.* |
| \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*(1\.2.* in func4.*1\.3.* \<PENDING\>\[\t \]+set_tracepoint|1\.2.* \<PENDING\>\[\t \]+set_tracepoint\r\n1\.3.* in func4).*" \ |
| "tracepoint with two locations (unload)" |
| |
| gdb_test_no_output "tstop" |
| |
| gdb_test "tfind" "Found trace frame 0, tracepoint 1.*" "tfind frame 0" |
| gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" "tfind frame 1" |
| gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" "tfind frame 2" |
| gdb_test "tfind" "Target failed to find requested trace frame\\..*" |
| }} |
| |
| tracepoint_change_loc_1 "trace" |
| tracepoint_change_loc_2 "trace" |
| |
| # Re-compile test case with IPA. |
| set libipa [get_in_proc_agent] |
| gdb_load_shlibs $libipa |
| |
| if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable \ |
| [list debug nowarnings shlib=$libipa shlib=$lib_sl1 shlib_load] ] != "" } { |
| untested change-loc.exp |
| return -1 |
| } |
| |
| tracepoint_change_loc_1 "ftrace" |
| tracepoint_change_loc_2 "ftrace" |