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