1# Copyright 2011-2017 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 17if {[skip_shlib_tests]} { 18 return 0 19} 20 21standard_testfile 22set libfile1 "change-loc-1" 23set libfile2 "change-loc-2" 24set executable $testfile 25set libsrc1 $srcdir/$subdir/$libfile1.c 26set libsrc2 $srcdir/$subdir/$libfile2.c 27set lib_sl1 [standard_output_file $libfile1.sl] 28set lib_sl2 [standard_output_file $libfile2.sl] 29 30set lib_opts debug 31 32if [get_compiler_info] { 33 return -1 34} 35 36# Some targets have leading underscores on assembly symbols. 37set additional_flags [list debug shlib=$lib_sl1 shlib_load [gdb_target_symbol_prefix_flags]] 38 39if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != "" 40 || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != "" 41 || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags] != ""} { 42 untested "failed to compile" 43 return -1 44} 45 46clean_restart $executable 47 48gdb_load_shlib $lib_sl1 49gdb_load_shlib $lib_sl2 50 51if ![runto_main] { 52 fail "can't run to main to check for trace support" 53 return -1 54} 55 56if { ![gdb_target_supports_trace] } then { 57 unsupported "current target does not support trace" 58 return -1 59} 60 61 62# Set tracepoint during tracing experiment. 63 64proc tracepoint_change_loc_1 { trace_type } { 65 with_test_prefix "1 $trace_type" { 66 global testfile 67 global srcfile 68 global pcreg 69 global gdb_prompt 70 71 clean_restart ${testfile} 72 if ![runto_main] { 73 fail "can't run to main" 74 return -1 75 } 76 gdb_test_no_output "delete break 1" 77 78 # Set a tracepoint we'll never meet. Just to avoid the 79 # complain after type `tstart' later. 80 gdb_test "next" ".*" 81 gdb_test "trace main" \ 82 "Tracepoint \[0-9\] at.* file .*$srcfile, line.*" \ 83 "set tracepoint on main" 84 85 gdb_test "break marker" \ 86 "Breakpoint.*at.* file .*$srcfile, line.*" \ 87 "breakpoint on marker" 88 89 gdb_test_no_output "tstart" 90 91 gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ 92 "continue to marker 1" 93 # Set a tracepoint during tracing. 94 set test "set tracepoint on set_tracepoint" 95 gdb_test_multiple "${trace_type} set_tracepoint" $test { 96 -re "Target returns error code .* too far .*$gdb_prompt $" { 97 if [string equal $trace_type "ftrace"] { 98 # The target was unable to install the fast tracepoint 99 # (e.g., jump pad too far from tracepoint). 100 pass "$test (too far)" 101 } else { 102 fail $test 103 } 104 } 105 -re "\r\n$gdb_prompt $" { 106 pass $test 107 } 108 } 109 110 gdb_trace_setactions "set action for tracepoint" "" \ 111 "collect \$$pcreg" "^$" 112 113 # tracepoint has two locations after shlib change-loc-1 is loaded. 114 gdb_test "info trace" \ 115 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 116\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*4\.2.* in func4.*" \ 117 "tracepoint with two locations" 118 119 set test "continue to marker 2" 120 gdb_test_multiple "continue" $test { 121 -re "Target returns error code .* too far .*$gdb_prompt $" { 122 if [string equal $trace_type "ftrace"] { 123 # Expected if the target was unable to install the 124 # fast tracepoint (e.g., jump pad too far from 125 # tracepoint). 126 pass "$test (too far)" 127 # Skip the rest of the tests. 128 return 129 } else { 130 fail "continue to marker 2" 131 fail $test 132 } 133 134 } 135 -re ".*Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { 136 pass "continue to marker 2" 137 } 138 } 139 140 # tracepoint has three locations after shlib change-loc-2 is 141 # loaded. 142 gdb_test "info trace" \ 143 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 144\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*4\.1.* in func4.*4\.2.* in func4.*4\.3.* in func4 .*" \ 145 "tracepoint with three locations" 146 147 gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ 148 "continue to marker 3" 149 150 # shlib is unloaded, there are still three locations, but one 151 # is pending. 152 gdb_test "info trace" \ 153 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 154\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.* 155(4\.\[1-3].* in func4.*\tinstalled on target.*){2}" \ 156 "tracepoint with two locations - installed (unload)" 157 158 gdb_test "info trace" \ 159 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 160\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.* 1614\.\[1-3].* \<PENDING\>\[\t \]+set_tracepoint.*" \ 162 "tracepoint with two locations - pending (unload)" 163 164 gdb_test_no_output "tstop" 165 166 gdb_test "tfind" "Found trace frame 0, tracepoint 4.*" \ 167 "tfind frame 0" 168 gdb_test "tfind" \ 169 "Target failed to find requested trace frame\\..*" 170 } 171} 172 173# Set pending tracepoint. 174 175proc tracepoint_change_loc_2 { trace_type } { 176 with_test_prefix "2 $trace_type" { 177 global srcdir 178 global srcfile 179 global subdir 180 global pcreg 181 global binfile 182 global gdb_prompt 183 184 gdb_exit 185 gdb_start 186 gdb_reinitialize_dir $srcdir/$subdir 187 188 gdb_test_multiple "${trace_type} set_tracepoint" "set pending tracepoint" { 189 -re ".*Make \(|fast \)tracepoint pending.*y or \\\[n\\\]. $" { 190 gdb_test "y" "\(Fast t|T\)racepoint.*set_tracepoint.*pending." "set pending tracepoint" 191 } 192 } 193 194 gdb_trace_setactions "set action for tracepoint" "" \ 195 "collect \$$pcreg" "^$" 196 197 # tracepoint has no location information now. Make sure nothing 198 # else is displayed. 199 gdb_test "info trace" \ 200 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 201\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*PENDING.*set_tracepoint\r\n\[\t \]+collect \\$$pcreg\r" \ 202 "single pending tracepoint info (without symbols)" 203 204 gdb_load ${binfile} 205 # tracepoint has one location after executable is loaded. 206 gdb_test "info trace" \ 207 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 208\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*func4.*" \ 209 "tracepoint with one location" 210 211 set main_bp 0 212 gdb_test_multiple "break main" "set breakpoint on main" { 213 -re "Breakpoint (\[0-9\]*) at .*, line.*$gdb_prompt $" { 214 set main_bp $expect_out(1,string) 215 } 216 } 217 gdb_run_cmd 218 219 gdb_test "" \ 220 ".*Breakpoint.*main.*at.*$srcfile.*" \ 221 "run to main" 222 gdb_test_no_output "delete break $main_bp" 223 224 # tracepoint has two locations after shlib change-loc-1 is loaded. 225 gdb_test "info trace" \ 226 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 227\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*1\.2.* in func4.*" \ 228 "tracepoint with two locations" 229 230 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ 231 "breakpoint on marker" 232 233 # tracepoint with two locations will be downloaded and installed. 234 set test "tstart" 235 gdb_test_multiple "tstart" $test { 236 -re "^tstart\r\n$gdb_prompt $" { 237 pass "tstart" 238 } 239 -re "Target returns error code .* too far .*$gdb_prompt $" { 240 if [string equal $trace_type "ftrace"] { 241 # The target was unable to install the fast tracepoint 242 # (e.g., jump pad too far from tracepoint). 243 pass "$test (too far)" 244 # Skip the rest of the tests. 245 return 246 } else { 247 fail $test 248 } 249 } 250 } 251 252 gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ 253 "continue to marker 1" 254 255 gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ 256 "continue to marker 2" 257 258 # tracepoint has three locations after shlib change-loc-2 is loaded. 259 gdb_test "info trace" \ 260 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 261\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.*1\.1.* in func4.*1\.2.* in func4.*1\.3.* in func4 .*" \ 262 "tracepoint with three locations" 263 264 gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ 265 "continue to marker 3" 266 267 # shlib is unloaded, there are still three locations, but one is pending. 268 gdb_test "info trace" \ 269 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 270\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.* 271(1\.\[1-3].* in func4.*\tinstalled on target.*){2}" \ 272 "tracepoint with two locations - installed (unload)" 273 274 gdb_test "info trace" \ 275 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 276\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\<MULTIPLE\>.* 2771\.\[1-3].* \<PENDING\>\[\t \]+set_tracepoint.*" \ 278 "tracepoint with two locations - pending (unload)" 279 280 gdb_test_no_output "tstop" 281 282 gdb_test "tfind" "Found trace frame 0, tracepoint 1.*" "tfind frame 0" 283 gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" "tfind frame 1" 284 gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" "tfind frame 2" 285 gdb_test "tfind" "Target failed to find requested trace frame\\..*" 286 } 287} 288 289# Test that setting a tracepoint while the trace experiment is ongoing 290# doesn't work when we force-disable the InstallInTrace RSP feature. 291 292proc tracepoint_install_in_trace_disabled { trace_type } { 293 with_test_prefix "InstallInTrace disabled: $trace_type" { 294 global testfile 295 global srcfile 296 global pcreg 297 global gdb_prompt 298 299 clean_restart ${testfile} 300 if ![runto_main] { 301 fail "can't run to main" 302 return -1 303 } 304 305 # This test only makes sense with the remote target. 306 if ![gdb_is_target_remote] { 307 return 308 } 309 310 gdb_test_no_output "delete break 1" 311 312 # Set a tracepoint we'll never meet. Just to avoid the 313 # complain after `tstart' later. 314 gdb_test "next" ".*" 315 gdb_test "trace main" \ 316 "Tracepoint \[0-9\] at.* file .*$srcfile, line.*" \ 317 "set tracepoint on main" 318 319 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ 320 "breakpoint on marker" 321 322 gdb_test_no_output "tstart" 323 324 # Force-disable the InstallInTrace RSP feature. 325 gdb_test_no_output "set remote install-in-trace-packet off" 326 327 # Set a tracepoint while a trace experiment is ongoing. 328 gdb_test "${trace_type} set_tracepoint" \ 329 "racepoint .* at .* set_tracepoint.*" \ 330 "set tracepoint on set_tracepoint" 331 332 gdb_trace_setactions "set action for tracepoint" "" \ 333 "collect \$$pcreg" "^$" 334 335 # Make sure the tracepoint is _not_ installed on the target. 336 gdb_test "info trace" \ 337 "Num Type\[ \]+Disp Enb Address\[ \]+What.* 338\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*installed on target.*\<MULTIPLE\>.*4\.1.* in func4.*not installed on target.*4\.2.* in func4.*not installed on target.*" \ 339 "tracepoint is not installed" 340 341 gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ 342 "continue to marker" 343 344 gdb_test_no_output "tstop" 345 346 # Nothing should have been collected. 347 gdb_test "tfind" "Target failed to find requested trace frame\\..*" 348 } 349} 350 351tracepoint_change_loc_1 "trace" 352tracepoint_change_loc_2 "trace" 353tracepoint_install_in_trace_disabled "trace" 354 355# Re-compile test case with IPA. 356set libipa [get_in_proc_agent] 357gdb_load_shlib $libipa 358 359if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable \ 360 [list debug nowarnings shlib=$libipa shlib=$lib_sl1 shlib_load] ] != "" } { 361 untested "failed to compile" 362 return -1 363} 364 365tracepoint_change_loc_1 "ftrace" 366tracepoint_change_loc_2 "ftrace" 367tracepoint_install_in_trace_disabled "ftrace" 368