1# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 3 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 3 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program. If not, see <http://www.gnu.org/licenses/>. 16 17# This file was written by Fred Fish. (fnf@cygnus.com) 18 19if $tracelevel { 20 strace $tracelevel 21} 22 23 24set testfile "funcargs" 25set srcfile ${testfile}.c 26set binfile ${objdir}/${subdir}/${testfile} 27if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 28 untested funcargs.exp 29 return -1 30} 31 32# Create and source the file that provides information about the compiler 33# used to compile the test case. 34if [get_compiler_info ${binfile}] { 35 return -1; 36} 37 38# 39# Locate actual args; integral types. 40# 41 42proc integral_args {} { 43 global gdb_prompt 44 global det_file 45 global gcc_compiled 46 47 delete_breakpoints 48 49 gdb_breakpoint call0a 50 gdb_breakpoint call0b 51 gdb_breakpoint call0c 52 gdb_breakpoint call0d 53 gdb_breakpoint call0e 54 55 # Run; should stop at call0a and print actual arguments. 56 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 57 gdb_run_cmd 58 gdb_expect { 59 -re ".* call0a \\(c=97 'a', s=1, i=2, l=3\\) .*$gdb_prompt $" { 60 pass "run to call0a" 61 } 62 -re "$gdb_prompt $" { fail "run to call0a" ; gdb_suppress_tests } 63 timeout { fail "(timeout) run to call0a" ; gdb_suppress_tests } 64 } 65 66 # Print each arg as a double check to see if we can print 67 # them here as well as with backtrace. 68 gdb_test "print c" ".* = 97 'a'" "print c after run to call0a" 69 gdb_test "print s" ".* = 1" "print s after run to call0a" 70 gdb_test "print i" ".* = 2" "print i after run to call0a" 71 gdb_test "print l " ".* = 3" "print l after run to call0a" 72 73 # Continue; should stop at call0b and print actual arguments. 74 if [gdb_test "cont" ".* call0b \\(s=1, i=2, l=3, c=97 'a'\\) .*" "continue to call0b"] { 75 gdb_suppress_tests; 76 } 77 78 # Continue; should stop at call0c and print actual arguments. 79 if [gdb_test "cont" ".* call0c \\(i=2, l=3, c=97 'a', s=1\\) .*" "continue to call0c"] { 80 gdb_suppress_tests; 81 } 82 83 # Continue; should stop at call0d and print actual arguments. 84 if [gdb_test "cont" ".* call0d \\(l=3, c=97 'a', s=1, i=2\\) .*" "continue to call0d";] { 85 gdb_suppress_tests; 86 } 87 88 # Continue; should stop at call0e and print actual arguments. 89 if [gdb_test "cont" ".* call0e \\(c1=97 'a', l=3, c2=97 'a', i=2, c3=97 'a', s=1, c4=97 'a', c5=97 'a'\\) .*" "continue to call0e" ] { 90 gdb_suppress_tests; 91 } 92 gdb_stop_suppressing_tests; 93} 94 95# 96# Locate actual args; unsigned integral types. 97# 98 99proc unsigned_integral_args {} { 100 global gdb_prompt 101 global det_file 102 global gcc_compiled 103 104 delete_breakpoints 105 106 gdb_breakpoint call1a; 107 gdb_breakpoint call1b; 108 gdb_breakpoint call1c; 109 gdb_breakpoint call1d; 110 gdb_breakpoint call1e; 111 112 # Run; should stop at call1a and print actual arguments. 113 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 114 gdb_run_cmd 115 gdb_expect { 116 -re ".* call1a \\(uc=98 'b', us=6, ui=7, ul=8\\) .*$gdb_prompt $" { 117 pass "run to call1a" 118 } 119 -re "$gdb_prompt $" { fail "run to call1a" ; gdb_suppress_tests; } 120 timeout { fail "(timeout) run to call1a" ; gdb_suppress_tests; } 121 } 122 123 # Print each arg as a double check to see if we can print 124 # them here as well as with backtrace. 125 gdb_test "print uc" ".* = 98 'b'" 126 gdb_test "print us" ".* = 6" 127 gdb_test "print ui" ".* = 7" 128 gdb_test "print ul" ".* = 8" 129 130 # Continue; should stop at call1b and print actual arguments. 131 if [gdb_test "cont" ".* call1b \\(us=6, ui=7, ul=8, uc=98 'b'\\) .*" "continue to call1b"] { 132 gdb_suppress_tests; 133 } 134 135 # Continue; should stop at call1c and print actual arguments. 136 if [gdb_test "cont" ".* call1c \\(ui=7, ul=8, uc=98 'b', us=6\\) .*" "continue to call1c"] { 137 gdb_suppress_tests; 138 } 139 140 # Continue; should stop at call1d and print actual arguments. 141 if [gdb_test "cont" ".* call1d \\(ul=8, uc=98 'b', us=6, ui=7\\) .*" "continue to call1d"] { 142 gdb_suppress_tests; 143 } 144 145 # Continue; should stop at call1e and print actual arguments. 146 if [gdb_test "cont" ".* call1e \\(uc1=98 'b', ul=8, uc2=98 'b', ui=7, uc3=98 'b', us=6, uc4=98 'b', uc5=98 'b'\\) .*" "continue to call1e"] { 147 gdb_suppress_tests; 148 } 149 gdb_stop_suppressing_tests; 150} 151 152# 153# Locate actual args; integrals mixed with floating point. 154# 155 156proc float_and_integral_args {} { 157 global gdb_prompt 158 global det_file 159 global gcc_compiled 160 161 delete_breakpoints 162 163 gdb_breakpoint call2a 164 gdb_breakpoint call2b 165 gdb_breakpoint call2c 166 gdb_breakpoint call2d 167 gdb_breakpoint call2e 168 gdb_breakpoint call2f 169 gdb_breakpoint call2g 170 gdb_breakpoint call2h 171 172 # Run; should stop at call2a and print actual arguments. 173 174 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "mips-sgi-irix5*" } 175 gdb_run_cmd 176 gdb_expect { 177 -re ".* call2a \\(c=97 'a', f1=4, s=1, d1=5, i=2, f2=4, l=3, d2=5\\) .*$gdb_prompt $" { pass "run to call2a" } 178 -re ".* call2a \\(c=97 'a', f1=.*, s=1, d1=5, i=2, f2=4, l=3, d2=5\\) .*$gdb_prompt $" { xfail "run to call2a" } 179 -re "$gdb_prompt $" { fail "run to call2a" ; gdb_suppress_tests; } 180 timeout { fail "(timeout) run to call2a" ; gdb_suppress_tests; } 181 } 182 183 # Print each arg as a double check to see if we can print 184 gdb_test "print c" ".* = 97 'a'" "print c after run to call2a" 185 gdb_test "print f1" ".* = 4" "print f1 after run to call2a" 186 gdb_test "print s" ".* = 1" "print s after run to call2a" 187 gdb_test "print d1" ".* = 5" "print d1 after run to call2a" 188 gdb_test "print i" ".* = 2" "print i after run to call2a" 189 gdb_test "print f2" ".* = 4" "print f2 after run to call2a" 190 gdb_test "print l" ".* = 3" "print l after run to call2a" 191 gdb_test "print d2" ".* = 5" "print d2 after run to call2a" 192 193 setup_xfail "rs6000-*-*" 194 if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" } 195 # Continue; should stop at call2b and print actual arguments. 196 if [gdb_test "cont" ".* call2b \\(f1=4, s=1, d1=5, i=2, f2=4, l=3, d2=5, c=97 'a'\\) .*" "continue to call2b"] { 197 gdb_suppress_tests; 198 } 199 200 # Continue; should stop at call2c and print actual arguments. 201 if [gdb_test "cont" ".* call2c \\(s=1, d1=5, i=2, f2=4, l=3, d2=5, c=97 'a', f1=4\\) .*" "continue to call2c"] { 202 gdb_suppress_tests; 203 } 204 205 # Continue; should stop at call2d and print actual arguments. 206 if [gdb_test "cont" ".* call2d \\(d1=5, i=2, f2=4, l=3, d2=5, c=97 'a', f1=4, s=1\\) .*" "continue to call2d"] { 207 gdb_suppress_tests; 208 } 209 210 # Continue; should stop at call2e and print actual arguments. 211 if [gdb_test "cont" ".* call2e \\(i=2, f2=4, l=3, d2=5, c=97 'a', f1=4, s=1, d1=5\\) .*" "continue to call2e"] { 212 gdb_suppress_tests; 213 } 214 215 # Continue; should stop at call2f and print actual arguments. 216 if [gdb_test "cont" ".* call2f \\(f2=4, l=3, d2=5, c=97 'a', f1=4, s=1, d1=5, i=2\\) .*" "continue to call2f"] { 217 gdb_suppress_tests; 218 } 219 220 # Continue; should stop at call2g and print actual arguments. 221 if [gdb_test "cont" ".* call2g \\(l=3, d2=5, c=97 'a', f1=4, s=1, d1=5, i=2, f2=4\\) .*" "continue to call2g"] { 222 gdb_suppress_tests; 223 } 224 225 # Continue; should stop at call2h and print actual arguments. 226 if [gdb_test "cont" ".* call2h \\(d2=5, c=97 'a', f1=4, s=1, d1=5, i=2, f2=4, l=3\\) .*" "continue to call2h"] { 227 gdb_suppress_tests; 228 } 229 230 # monitor only allows 8 breakpoints; w89k board allows 10, so 231 # break them up into two groups. 232 delete_breakpoints 233 gdb_breakpoint call2i 234 235 # Continue; should stop at call2i and print actual arguments. 236 if [gdb_test "cont" ".* call2i \\(c1=97 'a', f1=4, c2=97 'a', c3=97 'a', d1=5, c4=97 'a', c5=97 'a', c6=97 'a', f2=4, s=1, c7=97 'a', d2=5\\) .*" "continue to call2i"] { 237 gdb_suppress_tests; 238 } 239 gdb_stop_suppressing_tests; 240} 241 242# 243# Locate actual args; dereference pointers to ints and floats. 244# 245 246proc pointer_args {} { 247 global gdb_prompt 248 global hex 249 global det_file 250 251 delete_breakpoints 252 253 gdb_breakpoint call3a 254 gdb_breakpoint call3b 255 gdb_breakpoint call3c 256 257 # Run; should stop at call3a and print actual arguments. 258 # Try dereferencing the arguments. 259 260 gdb_run_cmd 261 gdb_expect { 262 -re ".* call3a \\(cp=$hex \"a.*\", sp=$hex, ip=$hex, lp=$hex\\) .*$gdb_prompt $" { pass "run to call3a" } 263 -re "$gdb_prompt $" { fail "run to call3a" ; gdb_suppress_tests; } 264 timeout { fail "(timeout) run to call3a" ; gdb_suppress_tests; } 265 } 266 267 gdb_test "print *cp" ".* = 97 'a'" 268 gdb_test "print *sp" ".* = 1" 269 gdb_test "print *ip" ".* = 2" 270 gdb_test "print *lp" ".* = 3" 271 272 # Continue; should stop at call3b and print actual arguments. 273 # Try dereferencing the arguments. 274 if [gdb_test "cont" ".* call3b \\(ucp=$hex \"b.*\", usp=$hex, uip=$hex, ulp=$hex\\) .*" "continue to call3b"] { 275 gdb_suppress_tests; 276 } 277 278 gdb_test "print *ucp" ".* = 98 'b'" 279 gdb_test "print *usp" ".* = 6" 280 gdb_test "print *uip" ".* = 7" 281 gdb_test "print *ulp" ".* = 8" 282 283 # Continue; should stop at call3c and print actual arguments. 284 # Try dereferencing the arguments. 285 if [gdb_test "cont" ".* call3c \\(fp=$hex, dp=$hex\\) .*" "continue to call3c"] { 286 gdb_suppress_tests; 287 } 288 289 gdb_test "print *fp" ".* = 4" 290 gdb_test "print *dp" ".* = 5" 291 292# pass "locate actual args, pointer types" 293 gdb_stop_suppressing_tests; 294} 295 296# 297# Locate actual args; structures and unions passed by reference. 298# 299 300proc structs_by_reference {} { 301 global gdb_prompt 302 global hex 303 global det_file 304 global target_sizeof_int 305 global target_sizeof_long 306 global target_bigendian_p 307 308 delete_breakpoints 309 310 gdb_breakpoint call4a 311 gdb_breakpoint call4b 312 313 # Run; should stop at call4a and print actual arguments. 314 # Try dereferencing the arguments. 315 316 gdb_run_cmd 317 gdb_expect { 318 -re ".* call4a \\(stp=$hex\\) .*$gdb_prompt $" { 319 pass "run to call4a" 320 } 321 -re "$gdb_prompt $" { fail "run to call4a" ; gdb_suppress_tests; } 322 timeout { fail "(timeout) run to call4a" ; gdb_suppress_tests; } 323 } 324 325 gdb_test "print *stp" ".* = \{s1 = 101, s2 = 102\}" 326 327 # Continue; should stop at call4b and print actual arguments. 328 329 gdb_test "cont" ".* call4b \\(unp=$hex\\) .*" "continue to call4b" 330 331 # Try dereferencing the arguments. 332 if { $target_sizeof_long == $target_sizeof_int } { 333 gdb_test "print *unp" ".* = \{u1 = 1, u2 = 1\}" \ 334 "print *unp (sizeof long == sizeof int)" 335 } elseif { ! $target_bigendian_p } { 336 gdb_test "print *unp" ".* = \{u1 = 1, u2 = 1\}" \ 337 "print *unp (little-endian, sizeof long != sizeof int)" 338 } elseif { $target_sizeof_long == 8 && $target_sizeof_int == 4 } { 339 gdb_test "print *unp" ".* = \{u1 = 1, u2 = 4294967296\}" \ 340 "print *unp (big-endian, sizeof long == 8, sizeof int = 4)" 341 } elseif { $target_sizeof_long == 4 && $target_sizeof_int == 2 } { 342 gdb_test "print *unp" ".* = \{u1 = 1, u2 = 65536\}" \ 343 "print *unp (big-endian, sizeof long == 4, sizeof int = 2)" 344 } else { 345 fail "print *unp (unknown case)" 346 } 347 348 pass "locate actual args, structs/unions passed by reference" 349 gdb_stop_suppressing_tests; 350} 351 352# 353# Locate actual args; structures and unions passed by value. 354# 355 356proc structs_by_value {} { 357 global gdb_prompt 358 global hex 359 global det_file 360 global target_sizeof_int 361 global target_sizeof_long 362 global target_bigendian_p 363 364 delete_breakpoints 365 366 gdb_breakpoint call5a 367 gdb_breakpoint call5b 368 369 # Run; should stop at call5a and print actual arguments. 370 # Try dereferencing the arguments. 371 372 gdb_run_cmd 373 gdb_expect { 374 -re ".* call5a \\(st=\{s1 = 101, s2 = 102\}\\) .*$gdb_prompt $" { 375 pass "run to call5a" 376 } 377 -re "$gdb_prompt $" { fail "run to call5a" ; gdb_suppress_tests; } 378 timeout { fail "(timeout) run to call5a" ; gdb_suppress_tests; } 379 } 380 381 gdb_test "print st" ".* = \{s1 = 101, s2 = 102\}" 382 383 # Continue; should stop at call5b and print actual arguments. 384 if { $target_sizeof_long == $target_sizeof_int } { 385 gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 2\}\\) .*" \ 386 "continue to call5b (sizeof long == sizeof int)" 387 } elseif { ! $target_bigendian_p } { 388 gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 2\}\\) .*" \ 389 "continue to call5b (little-endian, sizeof long != sizeof int)" 390 } elseif { $target_sizeof_long == 8 && $target_sizeof_int == 4 } { 391 gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 8589934592\}\\) .*" \ 392 "continue to call5b (big-endian, sizeof long == 8, sizeof int = 4)" 393 } elseif { $target_sizeof_long == 4 && $target_sizeof_int == 2 } { 394 gdb_test "cont" ".* call5b \\(un=\{u1 = 2, u2 = 131072\}\\) .*" \ 395 "continue to call5b (big-endian, sizeof long == 4, sizeof int = 2)" 396 } else { 397 fail "continue to call5b (unknown case)" 398 } 399 400 # Try dereferencing the arguments. 401 if { $target_sizeof_long == $target_sizeof_int } { 402 gdb_test "print un" ".* = \{u1 = 2, u2 = 2\}" \ 403 "print un (sizeof long == sizeof int)" 404 } elseif { ! $target_bigendian_p } { 405 gdb_test "print un" ".* = \{u1 = 2, u2 = 2\}" \ 406 "print un (little-endian, sizeof long != sizeof int)" 407 } elseif { $target_sizeof_long == 8 && $target_sizeof_int == 4 } { 408 gdb_test "print un" ".* = \{u1 = 2, u2 = 8589934592\}" \ 409 "print un (big-endian, sizeof long == 8, sizeof int = 4)" 410 } elseif { $target_sizeof_long == 4 && $target_sizeof_int == 2 } { 411 gdb_test "print un" ".* = \{u1 = 2, u2 = 131072\}" \ 412 "print un (big-endian, sizeof long == 4, sizeof int = 2)" 413 } else { 414 fail "print un (unknown case)" 415 } 416 417 gdb_stop_suppressing_tests; 418} 419 420# 421# Locate actual args; discard, shuffle, and call 422# 423 424proc discard_and_shuffle {} { 425 global gdb_prompt 426 global hex 427 global decimal 428 global det_file 429 global gcc_compiled 430 431 delete_breakpoints 432 433 gdb_breakpoint call6a 434 gdb_breakpoint call6b 435 gdb_breakpoint call6c 436 gdb_breakpoint call6d 437 gdb_breakpoint call6e 438 gdb_breakpoint call6f 439 gdb_breakpoint call6g 440 gdb_breakpoint call6h 441 442 # Run; should stop at call6a and print actual arguments. 443 # Print backtrace. 444 445 gdb_run_cmd 446 gdb_expect { 447 -re ".*Breakpoint $decimal, call6a .*$gdb_prompt $" { pass "run to call6a" } 448 -re "$gdb_prompt $" { fail "run to call6a" ; gdb_suppress_tests; } 449 timeout { fail "(timeout) run to call6a" ; gdb_suppress_tests; } 450 } 451 452 setup_xfail "rs6000-*-*" 453 454 if {!$gcc_compiled} { 455 setup_xfail "mips-sgi-irix5*" 456 } 457 458 gdb_test_multiple "backtrace 100" "backtrace from call6a" { 459 -re " call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .* main \\(.*\\) .*$gdb_prompt $" { 460 pass "backtrace from call6a" 461 } 462 -re " call6a \\(c=97 'a', s=1, i=2, l=3, f=.*, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .* main \\(.*\\) .*$gdb_prompt $" { 463 xfail "backtrace from call6a" 464 } 465 } 466 467 # Continue; should stop at call6b and print actual arguments. 468 # Print backtrace. 469 470 gdb_continue call6b 471 472 if [gdb_test_sequence "backtrace 100" "backtrace from call6b" { 473 "\[\r\n\]#0 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 474 "\[\r\n\]#1 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 475 "\[\r\n\]#2 .* main \\(.*\\) at " 476 } ] { 477 gdb_suppress_tests; 478 } 479 480 # Continue; should stop at call6c and print actual arguments. 481 # Print backtrace. 482 483 gdb_continue call6c 484 485 if [gdb_test_sequence "backtrace 100" "backtrace from call6c" { 486 "\[\r\n\]#0 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 487 "\[\r\n\]#1 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 488 "\[\r\n\]#2 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 489 "\[\r\n\]#3 .* main \\(.*\\) at " 490 } ] { 491 gdb_suppress_tests; 492 } 493 # Continue; should stop at call6d and print actual arguments. 494 # Print backtrace. 495 496 gdb_continue call6d 497 498 if [gdb_test_sequence "backtrace 100" "backtrace from call6d" { 499 "\[\r\n\]#0 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 500 "\[\r\n\]#1 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 501 "\[\r\n\]#2 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 502 "\[\r\n\]#3 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 503 "\[\r\n\]#4 .* main \\(.*\\) at " 504 } ] { 505 gdb_suppress_tests; 506 } 507 508 # Continue; should stop at call6e and print actual arguments. 509 # Print backtrace. 510 511 gdb_continue call6e 512 513 if [gdb_test_sequence "backtrace 100" "backtrace from call6e" { 514 "\[\r\n\]#0 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 515 "\[\r\n\]#1 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 516 "\[\r\n\]#2 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 517 "\[\r\n\]#3 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 518 "\[\r\n\]#4 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 519 "\[\r\n\]#5 .* main \\(.*\\) at " 520 } ] { 521 gdb_suppress_tests; 522 } 523 524 # Continue; should stop at call6f and print actual arguments. 525 # Print backtrace. 526 527 gdb_continue call6f 528 529 if [gdb_test_sequence "backtrace 100" "backtrace from call6f" { 530 "\[\r\n\]#0 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 531 "\[\r\n\]#1 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 532 "\[\r\n\]#2 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 533 "\[\r\n\]#3 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 534 "\[\r\n\]#4 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 535 "\[\r\n\]#5 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 536 "\[\r\n\]#6 .* main \\(.*\\) at " 537 } ] { 538 gdb_suppress_tests; 539 } 540 541 # Continue; should stop at call6g and print actual arguments. 542 # Print backtrace. 543 544 gdb_continue call6g 545 546 if [gdb_test_sequence "backtrace 100" "backtrace from call6g" { 547 "\[\r\n\]#0 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) " 548 "\[\r\n\]#1 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 549 "\[\r\n\]#2 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 550 "\[\r\n\]#3 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 551 "\[\r\n\]#4 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 552 "\[\r\n\]#5 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 553 "\[\r\n\]#6 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 554 "\[\r\n\]#7 .* main \\(.*\\) at " 555 } ] { 556 gdb_suppress_tests; 557 } 558 559 # Continue; should stop at call6h and print actual arguments. 560 # Print backtrace. 561 562 gdb_continue call6h 563 564 if [gdb_test_sequence "backtrace 100" "backtrace from call6h" { 565 "\[\r\n\]#0 .* call6h \\(us=6, ui=7, ul=8\\) " 566 "\[\r\n\]#1 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) " 567 "\[\r\n\]#2 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 568 "\[\r\n\]#3 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 569 "\[\r\n\]#4 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 570 "\[\r\n\]#5 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 571 "\[\r\n\]#6 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 572 "\[\r\n\]#7 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 573 "\[\r\n\]#8 .* main \\(.*\\) at " 574 } ] { 575 gdb_suppress_tests; 576 } 577 578 # monitor only allows 8 breakpoints; w89k board allows 10, so 579 # break them up into two groups. 580 delete_breakpoints 581 gdb_breakpoint call6i 582 gdb_breakpoint call6j 583 gdb_breakpoint call6k 584 585 # Continue; should stop at call6i and print actual arguments. 586 # Print backtrace. 587 588 gdb_continue call6i 589 590 if [gdb_test_sequence "backtrace 100" "backtrace from call6i" { 591 "\[\r\n\]#0 .* call6i \\(ui=7, ul=8\\) " 592 "\[\r\n\]#1 .* call6h \\(us=6, ui=7, ul=8\\) " 593 "\[\r\n\]#2 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) " 594 "\[\r\n\]#3 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 595 "\[\r\n\]#4 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 596 "\[\r\n\]#5 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 597 "\[\r\n\]#6 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 598 "\[\r\n\]#7 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 599 "\[\r\n\]#8 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 600 "\[\r\n\]#9 .* main \\(.*\\) at " 601 } ] { 602 gdb_suppress_tests; 603 } 604 605 # Continue; should stop at call6j and print actual arguments. 606 # Print backtrace. 607 608 gdb_continue call6j 609 610 if [gdb_test_sequence "backtrace 100" "backtrace from call6j" { 611 "\[\r\n\]#0 .* call6j \\(ul=8\\) " 612 "\[\r\n\]#1 .* call6i \\(ui=7, ul=8\\) " 613 "\[\r\n\]#2 .* call6h \\(us=6, ui=7, ul=8\\) " 614 "\[\r\n\]#3 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) " 615 "\[\r\n\]#4 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 616 "\[\r\n\]#5 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 617 "\[\r\n\]#6 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 618 "\[\r\n\]#7 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 619 "\[\r\n\]#8 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 620 "\[\r\n\]#9 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 621 "\[\r\n\]#10 .* main \\(.*\\) at " 622 } ] { 623 gdb_suppress_tests; 624 } 625 626 # Continue; should stop at call6k and print actual arguments. 627 # Print backtrace. 628 gdb_continue call6k 629 630 if [gdb_test_sequence "backtrace 100" "backtrace from call6k" { 631 "\[\r\n\]#0 .* call6k \\(\\) " 632 "\[\r\n\]#1 .* call6j \\(ul=8\\) " 633 "\[\r\n\]#2 .* call6i \\(ui=7, ul=8\\) " 634 "\[\r\n\]#3 .* call6h \\(us=6, ui=7, ul=8\\) " 635 "\[\r\n\]#4 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) " 636 "\[\r\n\]#5 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 637 "\[\r\n\]#6 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 638 "\[\r\n\]#7 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 639 "\[\r\n\]#8 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 640 "\[\r\n\]#9 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 641 "\[\r\n\]#10 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) " 642 "\[\r\n\]#11 .* main \\(.*\\) at " 643 } ] { 644 gdb_suppress_tests; 645 } 646 gdb_stop_suppressing_tests; 647} 648 649 650# 651# Locate actual args; shuffle round robin and call 652# 653 654proc shuffle_round_robin {} { 655 global gdb_prompt 656 global hex 657 global decimal 658 global det_file 659 global gcc_compiled 660 661 delete_breakpoints 662 663 gdb_breakpoint call7a 664 gdb_breakpoint call7b 665 gdb_breakpoint call7c 666 gdb_breakpoint call7d 667 gdb_breakpoint call7e 668 gdb_breakpoint call7f 669 gdb_breakpoint call7g 670 gdb_breakpoint call7h 671 672 # Run; should stop at call7a and print actual arguments. 673 # Print backtrace. 674 675 gdb_run_cmd 676 gdb_expect { 677 -re ".*Breakpoint $decimal, call7a .*$gdb_prompt $" { 678 pass "run to call7a" 679 } 680 -re "$gdb_prompt $" { fail "run to call7a" ; gdb_suppress_tests; } 681 timeout { fail "(timeout) run to call7a" ; gdb_suppress_tests; } 682 } 683 684 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" "mips-sgi-irix5*" } 685 gdb_test_multiple "backtrace 100" "backtrace from call7a" { 686 -re " call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .* main \\(.*\\) .*$gdb_prompt $" { 687 pass "backtrace from call7a" 688 } 689 -re " call7a \\(c=97 'a', i=2, s=1, l=3, f=.*, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .* main \\(.*\\) .*$gdb_prompt $" { 690 xfail "backtrace from call7a" 691 } 692 } 693 694 # Continue; should stop at call7b and print actual arguments. 695 # Print backtrace. 696 697 gdb_continue call7b 698 699 if {$gcc_compiled} then { setup_xfail "rs6000-*-*" } 700 701 gdb_test_sequence "backtrace 100" "backtrace from call7b" { 702 "\[\r\n\]#0 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 703 "\[\r\n\]#1 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 704 "\[\r\n\]#2 .* main \\(.*\\) at " 705 } 706 707 # Continue; should stop at call7c and print actual arguments. 708 # Print backtrace. 709 710 gdb_continue call7c 711 712 gdb_test_sequence "backtrace 100" "backtrace from call7c" { 713 "\[\r\n\]#0 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 714 "\[\r\n\]#1 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 715 "\[\r\n\]#2 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 716 "\[\r\n\]#3 .* main \\(.*\\) at " 717 } 718 719 # Continue; should stop at call7d and print actual arguments. 720 # Print backtrace. 721 722 gdb_continue call7d 723 724 gdb_test_sequence "backtrace 100" "backtrace from call7d" { 725 "\[\r\n\]#0 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 726 "\[\r\n\]#1 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 727 "\[\r\n\]#2 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 728 "\[\r\n\]#3 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 729 "\[\r\n\]#4 .* main \\(.*\\) at " 730 } 731 732 gdb_continue call7e 733 734 gdb_test_sequence "backtrace 100" "backtrace from call7e" { 735 "\[\r\n\]#0 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 736 "\[\r\n\]#1 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 737 "\[\r\n\]#2 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 738 "\[\r\n\]#3 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 739 "\[\r\n\]#4 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 740 "\[\r\n\]#5 .* main \\(.*\\) at " 741 } 742 743 # Continue; should stop at call7f and print actual arguments. 744 # Print backtrace. 745 746 gdb_continue call7f 747 748 gdb_test_sequence "backtrace 100" "backtrace from call7f" { 749 "\[\r\n\]#0 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) " 750 "\[\r\n\]#1 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 751 "\[\r\n\]#2 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 752 "\[\r\n\]#3 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 753 "\[\r\n\]#4 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 754 "\[\r\n\]#5 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 755 "\[\r\n\]#6 .* main \\(.*\\) at " 756 } 757 758 # Continue; should stop at call7g and print actual arguments. 759 # Print backtrace. 760 761 gdb_continue call7g 762 763 gdb_test_sequence "backtrace 100" "backtrace from call7g" { 764 "\[\r\n\]#0 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) " 765 "\[\r\n\]#1 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) " 766 "\[\r\n\]#2 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 767 "\[\r\n\]#3 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 768 "\[\r\n\]#4 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 769 "\[\r\n\]#5 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 770 "\[\r\n\]#6 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 771 "\[\r\n\]#7 .* main \\(.*\\) at " 772 } 773 774 gdb_continue call7h 775 776 gdb_test_sequence "backtrace 100" "backtrace from call7h" { 777 "\[\r\n\]#0 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) " 778 "\[\r\n\]#1 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) " 779 "\[\r\n\]#2 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) " 780 "\[\r\n\]#3 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 781 "\[\r\n\]#4 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 782 "\[\r\n\]#5 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 783 "\[\r\n\]#6 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 784 "\[\r\n\]#7 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 785 "\[\r\n\]#8 .* main \\(.*\\) at " 786 } 787 788 # monitor only allows 8 breakpoints; w89k board allows 10, so 789 # break them up into two groups. 790 delete_breakpoints 791 gdb_breakpoint call7i 792 gdb_breakpoint call7j 793 gdb_breakpoint call7k 794 795 # Continue; should stop at call7i and print actual arguments. 796 # Print backtrace. 797 798 gdb_continue call7i 799 800 gdb_test_sequence "backtrace 100" "backtrace from call7i" { 801 "\[\r\n\]#0 .* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) " 802 "\[\r\n\]#1 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) " 803 "\[\r\n\]#2 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) " 804 "\[\r\n\]#3 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) " 805 "\[\r\n\]#4 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 806 "\[\r\n\]#5 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 807 "\[\r\n\]#6 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 808 "\[\r\n\]#7 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 809 "\[\r\n\]#8 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 810 "\[\r\n\]#9 .* main \\(.*\\) at " 811 } 812 813 # Continue; should stop at call7j and print actual arguments. 814 # Print backtrace. 815 816 gdb_continue call7j 817 818 gdb_test_sequence "backtrace 100" "backtrace from call7j" { 819 "\[\r\n\]#0 .* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) " 820 "\[\r\n\]#1 .* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) " 821 "\[\r\n\]#2 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) " 822 "\[\r\n\]#3 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) " 823 "\[\r\n\]#4 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) " 824 "\[\r\n\]#5 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 825 "\[\r\n\]#6 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 826 "\[\r\n\]#7 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 827 "\[\r\n\]#8 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 828 "\[\r\n\]#9 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 829 "\[\r\n\]#10 .* main \\(.*\\) at " 830 } 831 832 # Continue; should stop at call7k and print actual arguments. 833 # Print backtrace. 834 835 gdb_continue call7k 836 837 if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" } 838 gdb_test_sequence "backtrace 100" "backtrace from call7k" { 839 "\[\r\n\]#0 .* call7k \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 840 "\[\r\n\]#1 .* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) " 841 "\[\r\n\]#2 .* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) " 842 "\[\r\n\]#3 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) " 843 "\[\r\n\]#4 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) " 844 "\[\r\n\]#5 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) " 845 "\[\r\n\]#6 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) " 846 "\[\r\n\]#7 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) " 847 "\[\r\n\]#8 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) " 848 "\[\r\n\]#9 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) " 849 "\[\r\n\]#10 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) " 850 "\[\r\n\]#11 .* main \\(.*\\) at " 851 } 852 gdb_stop_suppressing_tests; 853} 854 855# 856# Locate actual args; recursive passing of structs by value 857# 858 859proc recursive_structs_by_value {} { 860 global gdb_prompt 861 global hex 862 global decimal 863 global det_file 864 865 delete_breakpoints 866 867 gdb_breakpoint hitbottom 868 869 # Run; should stop at hitbottom and print actual arguments. 870 # Print backtrace. 871 gdb_run_cmd 872 gdb_expect { 873 -re ".*Breakpoint $decimal, hitbottom .*$gdb_prompt $" { pass "run to hitbottom" } 874 -re "$gdb_prompt $" { fail "run to hitbottom" ; gdb_suppress_tests; } 875 timeout { fail "(timeout) run to hitbottom" ; gdb_suppress_tests; } 876 } 877 878 if ![istarget sparclet-*-*] { 879 gdb_test_sequence "backtrace 100" "recursive passing of structs by value" { 880 "\[\r\n\]#0 .* hitbottom \\(\\) " 881 "\[\r\n\]#1 .* recurse \\(a=\{s = 0, i = 0, l = 0\}, depth=0\\) " 882 "\[\r\n\]#2 .* recurse \\(a=\{s = 1, i = 1, l = 1\}, depth=1\\) " 883 "\[\r\n\]#3 .* recurse \\(a=\{s = 2, i = 2, l = 2\}, depth=2\\) " 884 "\[\r\n\]#4 .* recurse \\(a=\{s = 3, i = 3, l = 3\}, depth=3\\) " 885 "\[\r\n\]#5 .* recurse \\(a=\{s = 4, i = 4, l = 4\}, depth=4\\) " 886 "\[\r\n\]#6 .* test_struct_args \\(\\) " 887 "\[\r\n\]#7 .* main \\(.*\\) at " 888 } 889 } else { 890 fail "recursive passing of structs by value (sparclet)" 891 } 892 gdb_stop_suppressing_tests; 893} 894 895proc funcargs_reload { } { 896 global objdir 897 global subdir 898 global binfile 899 global srcdir 900 901 if [istarget "mips-idt-*"] { 902 # Restart because IDT/SIM runs out of file descriptors. 903 gdb_exit 904 gdb_start 905 gdb_reinitialize_dir $srcdir/$subdir 906 gdb_load ${binfile} 907 } 908} 909 910# 911# Test for accessing local stack variables in functions which call alloca 912# 913proc localvars_after_alloca { } { 914 global gdb_prompt 915 global hex 916 global decimal 917 global gcc_compiled 918 919 if { ! [ runto localvars_after_alloca ] } then { gdb_suppress_tests; } 920 921 # Print each arg as a double check to see if we can print 922 # them here as well as with backtrace. 923 924 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 925 gdb_test "print c" " = 97 'a'" "print c after runto localvars_after_alloca" 926 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 927 gdb_test "print s" " = 1" "print s after runto localvars_after_alloca" 928 gdb_test "print i" " = 2" "print i after runto localvars_after_alloca" 929 gdb_test "print l" " = 3" "print l after runto localvars_after_alloca" 930 931 # Lame regexp. 932 gdb_test "next" ".*" "next in localvars_after_alloca()" 933 934 # Print each arg as a double check to see if we can print 935 # them here as well as with backtrace. 936 937 gdb_test "print c" " = 97 'a'" "print c in localvars_after_alloca" 938 gdb_test "print s" " = 1" "print s in localvars_after_alloca" 939 gdb_test "print i" " = 2" "print i in localvars_after_alloca" 940 gdb_test "print l" " = 3" "print l in localvars_after_alloca" 941 942 gdb_test "backtrace 8" "#0.*localvars_after_alloca \\(c=97 'a', s=1, i=2, l=3\\).*#1.*main.*" "backtrace after alloca" 943 gdb_stop_suppressing_tests; 944} 945 946proc call_after_alloca { } { 947 global gdb_prompt 948 global hex 949 global decimal 950 global gcc_compiled 951 952 if { ! [ runto call_after_alloca_subr ] } then { gdb_suppress_tests; } 953 954 # Print each arg as a double check to see if we can print 955 # them here as well as with backtrace. 956 957 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 958 gdb_test "print c" " = 97 'a'" "print c in call_after_alloca" 959 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 960 gdb_test "print s" " = 1" "print s in call_after_alloca" 961 gdb_test "print i" " = 2" "print i in call_after_alloca" 962 gdb_test "print l" " = 3" "print l in call_after_alloca" 963 964 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 965 gdb_test "backtrace 8" "#0.*call_after_alloca_subr \\(c=97 'a', s=1, i=2, l=3, uc=98 'b', us=11, ui=12, ul=13\\).*#1.*call_after_alloca \\(c=97 'a', s=1, i=2, l=3\\).*#2.*main.*" "backtrace from call_after_alloca_subr" 966 gdb_stop_suppressing_tests; 967} 968 969# 970# Test for accessing local stack variables, backtraces, finish, 971# and finally stepping into indirect calls. The point is that on the PA 972# these use a funky `dyncall' mechanism which GDB needs to know about. 973# 974proc localvars_in_indirect_call { } { 975 global gdb_prompt 976 global hex 977 global decimal 978 global gcc_compiled 979 980 # Can not use "runto call0a" as call0a is called several times 981 # during single run. Instead stop in a marker function and 982 # take control from there. 983 if { ! [ runto marker_indirect_call ] } then { gdb_suppress_tests; } 984 985 # break on the next call to call0a, then delete all the breakpoints 986 # and start testing. 987 gdb_breakpoint call0a 988 gdb_continue call0a 989 delete_breakpoints 990 991 # Print each arg as a double check to see if we can print 992 # them here as well as with backtrace. 993 994 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 995 gdb_test "print c" " = 97 'a'" "print c in localvars_in_indirect_call" 996 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 997 gdb_test "print s" " = 1" "print s in localvars_in_indirect_call" 998 gdb_test "print i" " = 2" "print i in localvars_in_indirect_call" 999 gdb_test "print l" " = 3" "print l in localvars_in_indirect_call" 1000 1001 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 1002 gdb_test "backtrace 8" \ 1003 "#0.*call0a \\(c=97 'a', s=1, i=2, l=3\\).*#1.*main.*" \ 1004 "backtrace in indirectly called function" 1005 1006 # 1007 # "finish" brings us back to main. We then will try to step through 1008 # the second indirect call. 1009 # On some targets (e.g. m68k) gdb will stop from the finish in midline 1010 # of the first indirect call. This is due to stack adjustment instructions 1011 # after the indirect call. In these cases we will step till we hit the 1012 # second indirect call. 1013 # 1014 1015 gdb_test_multiple "finish" "finish from indirectly called function" { 1016 -re "\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*First.*$gdb_prompt $" { 1017 #On hppa2.0w-hp-hpux11.00, gdb finishes at one line earlier than 1018 #hppa1.1-hp-hpux11.00. Therefore, an extra "step" is necessary 1019 #to continue the test. 1020 send_gdb "step\n" 1021 exp_continue 1022 } 1023 -re ".*\\(\\*pointer_to_call0a\\) \\(c, s, i, l\\);.*Second.*$gdb_prompt $" { 1024 pass "finish from indirectly called function" 1025 } 1026 -re ".*$gdb_prompt $" { 1027 fail "finish from indirectly called function" 1028 gdb_suppress_tests; 1029 } 1030 default { 1031 fail "finish from indirectly called function" 1032 gdb_suppress_tests; 1033 } 1034 } 1035 1036 if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } 1037 gdb_test "step" "call0a \\(c=97 'a', s=1, i=2, l=3\\).*" \ 1038 "stepping into indirectly called function" 1039 gdb_stop_suppressing_tests; 1040} 1041 1042# 1043# Test for stepping into indirect calls which may have trampolines (possibly 1044# cascaded) on both the call path and the gdb_suppress_tests; path. 1045# to handle trampolines. 1046# 1047proc test_stepping_over_trampolines { } { 1048 global gdb_prompt 1049 global hex 1050 global decimal 1051 1052 # Stop in a marker function and take control from there. 1053 if { ! [ runto marker_call_with_trampolines ] } then { gdb_suppress_tests; } 1054 1055 # Cater for gdb stopping in midline, see comment for finish above. 1056 gdb_test_multiple "finish" "finish from marker_call_with_trampolines" { 1057 -re "marker_call_with_trampolines ..;.*$gdb_prompt $" { 1058 send_gdb "step\n" 1059 exp_continue 1060 } 1061 -re "pointer_to_call_with_trampolines.*$gdb_prompt $" { 1062 pass "finish from marker_call_with_trampolines" 1063 } 1064 -re ".*$gdb_prompt $" { 1065 fail "finish from marker_call_with_trampolines" 1066 } 1067 default { 1068 fail "finish from marker_call_with_trampolines" 1069 gdb_suppress_tests 1070 } 1071 } 1072 1073 # Try to step into the target function. 1074 gdb_test "step" "call_with_trampolines \\(d1=5\\).*" \ 1075 "stepping into function called with trampolines" 1076 1077 # Make we can backtrace and the argument looks correct. */ 1078 gdb_test "backtrace 8" "#0.*call_with_trampolines \\(d1=5\\).*1.*main.*" \ 1079 "backtrace through call with trampolines" 1080 1081 # Make sure we can get back to main. 1082 # Stepping back to main might stop again after the gdb_suppress_tests; statement 1083 # or immediately transfer control back to main if optimizations 1084 # are performed. 1085 gdb_test_multiple "step" "stepping back to main from function called with trampolines" { 1086 -re "main .* at.*$gdb_prompt $" { 1087 pass "stepping back to main from function called with trampolines" 1088 gdb_suppress_tests 1089 } 1090 -re "\}.*End of call_with_trampolines.*$gdb_prompt $" { 1091 send_gdb "step\n" 1092 exp_continue 1093 } 1094 -re ".*$gdb_prompt $" { 1095 fail "stepping back to main from function called with trampolines" 1096 } 1097 default { 1098 fail "stepping back to main from function called with trampolines" 1099 gdb_suppress_tests 1100 } 1101 } 1102 gdb_stop_suppressing_tests; 1103} 1104 1105# Start with a fresh gdb. 1106 1107gdb_exit 1108gdb_start 1109gdb_reinitialize_dir $srcdir/$subdir 1110gdb_load ${binfile} 1111 1112set prev_timeout $timeout 1113if [istarget "mips*tx39-*"] { 1114 set timeout 300 1115} else { 1116 set timeout 60 1117} 1118 1119# Determine expected output for unsigned long variables, 1120# the output varies with sizeof (unsigned long). 1121 1122gdb_test_multiple "print sizeof (long)" "getting sizeof long" { 1123 -re ".\[0-9\]* = 4.*$gdb_prompt $" { 1124 set target_sizeof_long 4 1125 # pass silently 1126 } 1127 -re ".\[0-9\]* = 8.*$gdb_prompt $" { 1128 set target_sizeof_long 8 1129 # pass silently 1130 } 1131} 1132 1133gdb_test_multiple "print sizeof (int)" "getting sizeof int" { 1134 -re ".\[0-9\]* = 2.*$gdb_prompt $" { 1135 set target_sizeof_int 2 1136 # pass silently 1137 } 1138 -re ".\[0-9\]* = 4.*$gdb_prompt $" { 1139 set target_sizeof_int 4 1140 # pass silently 1141 } 1142 -re ".\[0-9\]* = 8.*$gdb_prompt $" { 1143 set target_sizeof_int 8 1144 # pass silently 1145 } 1146} 1147 1148gdb_test_multiple "show endian" "getting target endian" { 1149 -re ".*little endian.*$gdb_prompt $" { 1150 set target_bigendian_p 0 1151 # pass silently 1152 } 1153 -re ".*big endian.*$gdb_prompt $" { 1154 set target_bigendian_p 1 1155 # pass silently 1156 } 1157} 1158 1159# Perform tests 1160 1161gdb_test_no_output "set print frame-arguments all" 1162 1163integral_args 1164funcargs_reload 1165unsigned_integral_args 1166funcargs_reload 1167if {![target_info exists gdb,skip_float_tests]} { 1168 float_and_integral_args 1169} 1170funcargs_reload 1171pointer_args 1172funcargs_reload 1173structs_by_reference 1174funcargs_reload 1175structs_by_value 1176funcargs_reload 1177discard_and_shuffle 1178funcargs_reload 1179shuffle_round_robin 1180funcargs_reload 1181recursive_structs_by_value 1182funcargs_reload 1183localvars_after_alloca 1184funcargs_reload 1185call_after_alloca 1186funcargs_reload 1187localvars_in_indirect_call 1188funcargs_reload 1189test_stepping_over_trampolines 1190 1191set timeout $prev_timeout 1192