From: Daniel Jacobowitz Date: Tue, 27 Mar 2007 17:59:38 +0000 (+0000) Subject: * config/gdbserver.exp (gdbserver_gdb_load): Update argument list. X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=b741e217929039042129802a61e4510c580ecc79;p=deliverable%2Fbinutils-gdb.git * config/gdbserver.exp (gdbserver_gdb_load): Update argument list. (gdb_load): Delete, replace with... (gdb_reload): ...this. * gdb.server/server-run.exp: Use gdb_load and gdbserver_run. * gdb.server/server-mon.exp: Likewise. * lib/gdb.exp (gdb_run_cmd): Use gdb_reload. (gdb_start_cmd): New. (gdb_file_cmd): Save the last loaded file. (gdb_reload): New. (gdb_gnu_strip_debug): Use transform. * lib/gdbserver-support.exp (gdbserver_spawn): Move file download support here. Use new $last_loaded_file. Check mtime. (gdb_target_cmd): Handle ObjC failure case. (infer_host_exec): Delete. (gdbserver_load): Rename to... (gdbserver_run): ...this. Simplify. * lib/mi-support.exp (mi_gdb_file_cmd): Set last_loaded_file. (mi_gdb_load): Move most contents to a new function... (mi_gdb_target_load): ...here. Simplify call to gdbserver_gdb_load. (mi_run_cmd): Use mi_gdb_target_load. * gdb.base/break.exp, gdb.base/ending-run.exp, gdb.base/pending.exp, gdb.base/sepdebug.exp, gdb.base/unload.exp, gdb.objc/objcdecode.exp: Use gdb_run_cmd. * gdb.base/charsign.exp: Remove incorrect comment. * gdb.base/dbx.exp (gdb_file_cmd): Set last_loaded_file. * gdb.ada/exec_changed.exp, gdb.ada/null_record.exp, gdb.ada/start.exp, gdb.base/start.exp: Use gdb_start_cmd. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ec773407d4..bc82912d63 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,33 @@ +2007-03-27 Daniel Jacobowitz + + * config/gdbserver.exp (gdbserver_gdb_load): Update argument list. + (gdb_load): Delete, replace with... + (gdb_reload): ...this. + * gdb.server/server-run.exp: Use gdb_load and gdbserver_run. + * gdb.server/server-mon.exp: Likewise. + * lib/gdb.exp (gdb_run_cmd): Use gdb_reload. + (gdb_start_cmd): New. + (gdb_file_cmd): Save the last loaded file. + (gdb_reload): New. + (gdb_gnu_strip_debug): Use transform. + * lib/gdbserver-support.exp (gdbserver_spawn): Move file download + support here. Use new $last_loaded_file. Check mtime. + (gdb_target_cmd): Handle ObjC failure case. + (infer_host_exec): Delete. + (gdbserver_load): Rename to... + (gdbserver_run): ...this. Simplify. + * lib/mi-support.exp (mi_gdb_file_cmd): Set last_loaded_file. + (mi_gdb_load): Move most contents to a new function... + (mi_gdb_target_load): ...here. Simplify call to gdbserver_gdb_load. + (mi_run_cmd): Use mi_gdb_target_load. + * gdb.base/break.exp, gdb.base/ending-run.exp, gdb.base/pending.exp, + gdb.base/sepdebug.exp, gdb.base/unload.exp, gdb.objc/objcdecode.exp: + Use gdb_run_cmd. + * gdb.base/charsign.exp: Remove incorrect comment. + * gdb.base/dbx.exp (gdb_file_cmd): Set last_loaded_file. + * gdb.ada/exec_changed.exp, gdb.ada/null_record.exp, gdb.ada/start.exp, + gdb.base/start.exp: Use gdb_start_cmd. + 2007-03-23 Nigel Stephens Maciej W. Rozycki diff --git a/gdb/testsuite/config/gdbserver.exp b/gdb/testsuite/config/gdbserver.exp index 9d32e5e799..0e7e7b07c4 100644 --- a/gdb/testsuite/config/gdbserver.exp +++ b/gdb/testsuite/config/gdbserver.exp @@ -74,10 +74,10 @@ load_lib gdbserver-support.exp -proc gdbserver_gdb_load { arg } { - return [gdbserver_spawn $arg ""] +proc gdbserver_gdb_load { } { + return [gdbserver_spawn ""] } -proc gdb_load { arg } { - return [gdbserver_load $arg ""] +proc gdb_reload { } { + return [gdbserver_run ""] } diff --git a/gdb/testsuite/gdb.ada/exec_changed.exp b/gdb/testsuite/gdb.ada/exec_changed.exp index a4f4d9bda2..07f247680d 100644 --- a/gdb/testsuite/gdb.ada/exec_changed.exp +++ b/gdb/testsuite/gdb.ada/exec_changed.exp @@ -55,7 +55,12 @@ gdb_test "shell mv ${binfile1} ${binfile}" "" "" gdb_load ${binfile} # Start the program, we should land in the program main procedure -gdb_test "start" \ +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} + +gdb_test "" \ "first \\(\\) at .*first.adb.*" \ "start first" @@ -76,12 +81,10 @@ gdb_test "set confirm off" "" "" # Start the program a second time, GDB should land in procedure Second # this time. -if [is_remote target] { - unsupported "start the program a second time "; +if { [gdb_start_cmd] < 0 } { + fail "start second" } else { - # Start the program, we should land in the program main procedure - gdb_test "start" \ + gdb_test "" \ "second \\(\\) at .*second.adb.*" \ "start second" } - diff --git a/gdb/testsuite/gdb.ada/null_record.exp b/gdb/testsuite/gdb.ada/null_record.exp index 8f5cb86cb9..a403d4a518 100644 --- a/gdb/testsuite/gdb.ada/null_record.exp +++ b/gdb/testsuite/gdb.ada/null_record.exp @@ -36,7 +36,12 @@ gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} -gdb_test "start" \ +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} + +gdb_test "" \ "null_record \\(\\) at .*null_record.adb.*" \ "start" diff --git a/gdb/testsuite/gdb.ada/start.exp b/gdb/testsuite/gdb.ada/start.exp index a658bd7cdf..4e1da51079 100644 --- a/gdb/testsuite/gdb.ada/start.exp +++ b/gdb/testsuite/gdb.ada/start.exp @@ -37,7 +37,11 @@ gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} # Verify that "start" lands inside the right procedure. -gdb_test "start" \ +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} + +gdb_test "" \ "dummy \\(\\) at .*dummy.adb.*" \ "start" - diff --git a/gdb/testsuite/gdb.base/break.exp b/gdb/testsuite/gdb.base/break.exp index aba80edf0c..16d05b758e 100644 --- a/gdb/testsuite/gdb.base/break.exp +++ b/gdb/testsuite/gdb.base/break.exp @@ -202,27 +202,16 @@ if [istarget "mips-idt-*"] then { # # run until the breakpoint at main is hit. For non-stubs-using targets. # -if ![target_info exists use_gdb_stub] { - if [istarget "*-*-vxworks*"] then { - send_gdb "run vxmain \"2\"\n" - set timeout 120 - verbose "Timeout is now $timeout seconds" 2 - } else { - send_gdb "run\n" - } - gdb_expect { - -re "The program .* has been started already.*y or n. $" { - send_gdb "y\n" - exp_continue +gdb_run_cmd +gdb_expect { + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" { + pass "run until function breakpoint" } - -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\ - { pass "run until function breakpoint" } - -re ".*$gdb_prompt $" { fail "run until function breakpoint" } - timeout { fail "run until function breakpoint (timeout)" } - } -} else { - if ![target_info exists gdb_stub] { - gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue" + -re "$gdb_prompt $" { + fail "run until function breakpoint" + } + timeout { + fail "run until function breakpoint (timeout)" } } @@ -773,26 +762,14 @@ proc test_next_with_recursion {} { global decimal global binfile - if [target_info exists use_gdb_stub] { - # Reload the program. - delete_breakpoints - gdb_load ${binfile}; - } else { - # FIXME: should be using runto - gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y" - - delete_breakpoints - } + gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y" + delete_breakpoints gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial" # Run until we call factorial with 6 - if [istarget "*-*-vxworks*"] then { - send_gdb "run vxmain \"6\"\n" - } else { - gdb_run_cmd - } + gdb_run_cmd gdb_expect { -re "Break.* factorial .value=6. .*$gdb_prompt $" {} -re ".*$gdb_prompt $" { @@ -916,29 +893,19 @@ gdb_test "break marker4" \ # # run until the breakpoint at main is hit. For non-stubs-using targets. # -if ![target_info exists use_gdb_stub] { - if [istarget "*-*-vxworks*"] then { - send_gdb "run vxmain \"2\"\n" - set timeout 120 - verbose "Timeout is now $timeout seconds" 2 - } else { - send_gdb "run\n" - } - gdb_expect { - -re "The program .* has been started already.*y or n. $" { - send_gdb "y\n" - exp_continue +gdb_run_cmd +gdb_expect { + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" { + pass "run until function breakpoint, optimized file" } - -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\ - { pass "run until function breakpoint, optimized file" } - -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $"\ - { pass "run until function breakpoint, optimized file (code motion)" } - -re ".*$gdb_prompt $" { fail "run until function breakpoint, optimized file" } - timeout { fail "run until function breakpoint, optimized file (timeout)" } - } -} else { - if ![target_info exists gdb_stub] { - gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue, optimized file" + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $" { + pass "run until function breakpoint, optimized file (code motion)" + } + -re "$gdb_prompt $" { + fail "run until function breakpoint, optimized file" + } + timeout { + fail "run until function breakpoint, optimized file (timeout)" } } diff --git a/gdb/testsuite/gdb.base/charsign.exp b/gdb/testsuite/gdb.base/charsign.exp index 7383fd6728..e3d4cd71c9 100644 --- a/gdb/testsuite/gdb.base/charsign.exp +++ b/gdb/testsuite/gdb.base/charsign.exp @@ -44,8 +44,6 @@ proc do_test { cflags } { gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} - # For C programs, "start" should stop in main(). - gdb_test "p n" \ "= \"A\"" gdb_test "p s" \ diff --git a/gdb/testsuite/gdb.base/dbx.exp b/gdb/testsuite/gdb.base/dbx.exp index 5c0610fa56..cd63c667fb 100644 --- a/gdb/testsuite/gdb.base/dbx.exp +++ b/gdb/testsuite/gdb.base/dbx.exp @@ -184,6 +184,9 @@ proc gdb_file_cmd {arg} { global gdb_prompt global spawn_id upvar timeout timeout + global last_loaded_file + + set last_loaded_file $arg if [is_remote host] { set arg [remote_download host $arg]; diff --git a/gdb/testsuite/gdb.base/ending-run.exp b/gdb/testsuite/gdb.base/ending-run.exp index acf0d79173..edf1181cf9 100644 --- a/gdb/testsuite/gdb.base/ending-run.exp +++ b/gdb/testsuite/gdb.base/ending-run.exp @@ -67,11 +67,9 @@ gdb_test "b ending-run.c:31" ".*Breakpoint 3.*ending-run.c, line 31.*" # Expect to hit the bp at line "1", but symbolize this # as line "13". Then try to clear it--this should work. # -if [target_info exists use_gdb_stub] { - gdb_test "continue" ".*Breakpoint.*1.*callee.*13.*" -} else { - gdb_test "r" ".*Breakpoint.*1.*callee.*13.*" -} +gdb_run_cmd +gdb_test "" ".*Breakpoint.*1.*callee.*13.*" "run" + gdb_test "cle" ".*Deleted breakpoints 2 1.*" "clear worked" send_gdb "i b\n" gdb_expect { diff --git a/gdb/testsuite/gdb.base/pending.exp b/gdb/testsuite/gdb.base/pending.exp index c3351e68ac..3ba5176724 100644 --- a/gdb/testsuite/gdb.base/pending.exp +++ b/gdb/testsuite/gdb.base/pending.exp @@ -191,7 +191,8 @@ gdb_test "info break" \ # Run to main which should resolve a pending breakpoint # -gdb_test "run" \ +gdb_run_cmd +gdb_test "" \ "Breakpoint.*at.* Pending breakpoint \"pendshr.c:26 if x > 3\" resolved.* Breakpoint.*, main.*$mainline.*" \ diff --git a/gdb/testsuite/gdb.base/sepdebug.exp b/gdb/testsuite/gdb.base/sepdebug.exp index 8911f51289..e0a36ac7cb 100644 --- a/gdb/testsuite/gdb.base/sepdebug.exp +++ b/gdb/testsuite/gdb.base/sepdebug.exp @@ -199,27 +199,16 @@ if [istarget "mips-idt-*"] then { # # run until the breakpoint at main is hit. For non-stubs-using targets. # -if ![target_info exists use_gdb_stub] { - if [istarget "*-*-vxworks*"] then { - send_gdb "run vxmain \"2\"\n" - set timeout 120 - verbose "Timeout is now $timeout seconds" 2 - } else { - send_gdb "run\n" - } - gdb_expect { - -re "The program .* has been started already.*y or n. $" { - send_gdb "y\n" - exp_continue +gdb_run_cmd +gdb_expect { + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" { + pass "run until function breakpoint" } - -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\ - { pass "run until function breakpoint" } - -re ".*$gdb_prompt $" { fail "run until function breakpoint" } - timeout { fail "run until function breakpoint (timeout)" } - } -} else { - if ![target_info exists gdb_stub] { - gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue" + -re "$gdb_prompt $" { + fail "run until function breakpoint" + } + timeout { + fail "run until function breakpoint (timeout)" } } @@ -759,26 +748,14 @@ proc test_next_with_recursion {} { global decimal global binfile - if [target_info exists use_gdb_stub] { - # Reload the program. - delete_breakpoints - gdb_load ${binfile}; - } else { - # FIXME: should be using runto - gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y" - - delete_breakpoints - } + gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y" + delete_breakpoints gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial" # Run until we call factorial with 6 - if [istarget "*-*-vxworks*"] then { - send_gdb "run vxmain \"6\"\n" - } else { - gdb_run_cmd - } + gdb_run_cmd gdb_expect { -re "Break.* factorial .value=6. .*$gdb_prompt $" {} -re ".*$gdb_prompt $" { @@ -883,29 +860,19 @@ gdb_test "break marker4" \ # # run until the breakpoint at main is hit. For non-stubs-using targets. # -if ![target_info exists use_gdb_stub] { - if [istarget "*-*-vxworks*"] then { - send_gdb "run vxmain \"2\"\n" - set timeout 120 - verbose "Timeout is now $timeout seconds" 2 - } else { - send_gdb "run\n" - } - gdb_expect { - -re "The program .* has been started already.*y or n. $" { - send_gdb "y\n" - exp_continue +gdb_run_cmd +gdb_expect { + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" { + pass "run until function breakpoint, optimized file" } - -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\ - { pass "run until function breakpoint, optimized file" } - -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $"\ - { pass "run until function breakpoint, optimized file (code motion)" } - -re ".*$gdb_prompt $" { fail "run until function breakpoint, optimized file" } - timeout { fail "run until function breakpoint, optimized file (timeout)" } - } -} else { - if ![target_info exists gdb_stub] { - gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue, optimized file" + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $" { + pass "run until function breakpoint, optimized file (code motion)" + } + -re "$gdb_prompt $" { + fail "run until function breakpoint, optimized file" + } + timeout { + fail "run until function breakpoint, optimized file (timeout)" } } diff --git a/gdb/testsuite/gdb.base/start.exp b/gdb/testsuite/gdb.base/start.exp index e8e21d6c82..27b2bde1ca 100644 --- a/gdb/testsuite/gdb.base/start.exp +++ b/gdb/testsuite/gdb.base/start.exp @@ -37,8 +37,12 @@ gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} # For C programs, "start" should stop in main(). +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} -gdb_test "start" \ +gdb_test "" \ "main \\(\\) at .*start.c.*" \ "start" diff --git a/gdb/testsuite/gdb.base/unload.exp b/gdb/testsuite/gdb.base/unload.exp index 665cd06df4..105ddc4072 100644 --- a/gdb/testsuite/gdb.base/unload.exp +++ b/gdb/testsuite/gdb.base/unload.exp @@ -90,26 +90,27 @@ gdb_test "info break" \ set unloadshr_line [gdb_get_line_number "unloadshr break" ${libsrcfile}] -gdb_test "run" \ -"Starting program.*unload.* -Breakpoint.*at.* +gdb_run_cmd +gdb_test "" \ +"Breakpoint.*at.* Pending breakpoint \"shrfunc1\" resolved.* Breakpoint.*, shrfunc1 \\\(x=3\\\).*unloadshr.c:$unloadshr_line.*" \ "running program" gdb_test "continue" \ -"Continuing.*y is 7.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \ +"Continuing.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \ "continuing to end of program" # # Try to rerun program and verify that shared breakpoint is reset properly # -gdb_test "run" \ +gdb_run_cmd +gdb_test "" \ ".*Breakpoint.*shrfunc1.*at.*unloadshr.c:$unloadshr_line.*" \ "rerun to shared library breakpoint" gdb_test "continue" \ -"Continuing.*y is 7.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \ +"Continuing.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \ "continuing to end of program second time" diff --git a/gdb/testsuite/gdb.objc/objcdecode.exp b/gdb/testsuite/gdb.objc/objcdecode.exp index 0aee7859c9..e860c4204d 100644 --- a/gdb/testsuite/gdb.objc/objcdecode.exp +++ b/gdb/testsuite/gdb.objc/objcdecode.exp @@ -72,12 +72,13 @@ gdb_test_multiple "break multipleDef" $name \ } set name "continue after break on multiply defined symbol" -gdb_test_multiple "run" $name \ +gdb_run_cmd +gdb_test_multiple "" $name \ { - -re "Starting program.*Breakpoint \[0-9\]+, multipleDef \\\(\\\) at .*\r\n$gdb_prompt $" { + -re "Breakpoint \[0-9\]+, multipleDef \\\(\\\) at .*\r\n$gdb_prompt $" { pass $name } - -re "Starting program.*\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] -.Decode multipleDef. at .*\r\n\\\[3\\\] multipleDef at .*\r\n> $" { + -re "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] -.Decode multipleDef. at .*\r\n\\\[3\\\] multipleDef at .*\r\n> $" { send_gdb "0\n" kfail "gdb/1238" $name # gdb is in a bad state here. diff --git a/gdb/testsuite/gdb.server/server-mon.exp b/gdb/testsuite/gdb.server/server-mon.exp index 579c13ed37..d014a98eb6 100644 --- a/gdb/testsuite/gdb.server/server-mon.exp +++ b/gdb/testsuite/gdb.server/server-mon.exp @@ -34,10 +34,11 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb gdb_exit gdb_start - -gdbserver_load $binfile "" +gdb_load $binfile gdb_reinitialize_dir $srcdir/$subdir +gdbserver_run "" + gdb_test_multiple "monitor help" "" { -re "Unknown monitor command.*$gdb_prompt $" { fail "monitor help" diff --git a/gdb/testsuite/gdb.server/server-run.exp b/gdb/testsuite/gdb.server/server-run.exp index 039da5c32a..4cd8e62f3f 100644 --- a/gdb/testsuite/gdb.server/server-run.exp +++ b/gdb/testsuite/gdb.server/server-run.exp @@ -34,8 +34,9 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb gdb_exit gdb_start +gdb_load $binfile -gdbserver_load $binfile "" +gdbserver_run "" gdb_reinitialize_dir $srcdir/$subdir gdb_breakpoint main diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 40f19b8a72..4cf763dac9 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -203,9 +203,7 @@ proc gdb_run_cmd {args} { if [target_info exists use_gdb_stub] { if [target_info exists gdb,do_reload_on_run] { - # Specifying no file, defaults to the executable - # currently being debugged. - if { [gdb_load ""] != 0 } { + if { [gdb_reload] != 0 } { return; } send_gdb "continue\n"; @@ -250,7 +248,7 @@ proc gdb_run_cmd {args} { send_gdb "y\n" } -re "The program is not being run.*$gdb_prompt $" { - if { [gdb_load ""] != 0 } { + if { [gdb_reload] != 0 } { return; } send_gdb "jump *$start\n"; @@ -272,7 +270,7 @@ proc gdb_run_cmd {args} { } if [target_info exists gdb,do_reload_on_run] { - if { [gdb_load ""] != 0 } { + if { [gdb_reload] != 0 } { return; } } @@ -289,6 +287,42 @@ proc gdb_run_cmd {args} { } } +# Generic start command. Return 0 if we could start the program, -1 +# if we could not. + +proc gdb_start_cmd {args} { + global gdb_prompt + + if [target_info exists gdb_init_command] { + send_gdb "[target_info gdb_init_command]\n"; + gdb_expect 30 { + -re "$gdb_prompt $" { } + default { + perror "gdb_init_command for target failed"; + return; + } + } + } + + if [target_info exists use_gdb_stub] { + return -1 + } + + send_gdb "start $args\n" + gdb_expect 60 { + -re "The program .* has been started already.*y or n. $" { + send_gdb "y\n" + exp_continue + } + # Use -notransfer here so that test cases (like chng-sym.exp) + # may test for additional start-up messages. + -notransfer -re "Starting program: \[^\r\n\]*" { + return 0 + } + } + return -1 +} + # Set a breakpoint at FUNCTION. If there is an additional argument it is # a list of options; the only currently supported option is allow-pending. @@ -1001,6 +1035,9 @@ proc gdb_file_cmd { arg } { global gdb_prompt global verbose global GDB + global last_loaded_file + + set last_loaded_file $arg # Set whether debug info was found. # Default to "fail". @@ -1937,6 +1974,18 @@ proc gdb_load { arg } { return [gdb_file_cmd $arg] } +# gdb_reload -- load a file into the target. Called before "running", +# either the first time or after already starting the program once, +# for remote targets. Most files that override gdb_load should now +# override this instead. + +proc gdb_reload { } { + # For the benefit of existing configurations, default to gdb_load. + # Specifying no file defaults to the executable currently being + # debugged. + return [gdb_load ""] +} + proc gdb_continue { function } { global decimal @@ -2381,8 +2430,8 @@ proc gdb_gnu_strip_debug { dest args } { gdb_exit set debug_file [separate_debug_filename $dest] - set strip_to_file_program strip - set objcopy_program objcopy + set strip_to_file_program [transform strip] + set objcopy_program [transform objcopy] # Make sure the directory that will hold the separated debug # info actually exists. diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp index 12b14a299e..3bf974d319 100644 --- a/gdb/testsuite/lib/gdbserver-support.exp +++ b/gdb/testsuite/lib/gdbserver-support.exp @@ -80,6 +80,11 @@ proc gdb_target_cmd { targetname serialport } { -re "Timeout reading from remote system.*$gdb_prompt $" { verbose "Got timeout error from gdb." } + -notransfer -re "Remote debugging using .*\r\n> $" { + # We got an unexpected prompt while creating the target. + # Leave it there for the test to diagnose. + return 1 + } timeout { send_gdb "" break @@ -129,8 +134,40 @@ proc skip_gdbserver_tests { } { # # Returns the target protocol and socket to connect to. -proc gdbserver_spawn { server_exec child_args } { +proc gdbserver_spawn { child_args } { global portnum + global gdbserver_host_exec + global gdbserver_host_mtime + global gdbserver_server_exec + global last_loaded_file + + set host_exec $last_loaded_file + + # If we already downloaded a file to the target, see if we can reuse it. + set reuse 0 + if { [info exists gdbserver_server_exec] } { + set reuse 1 + + # If the file has changed, we can not. + if { $host_exec != $gdbserver_host_exec } { + set reuse 0 + } + + # If the mtime has changed, we can not. + if { [file mtime $host_exec] != $gdbserver_host_mtime } { + set reuse 0 + } + } + + if { $reuse == 0 } { + set gdbserver_host_exec $host_exec + set gdbserver_host_mtime [file mtime $host_exec] + if [is_remote target] { + set gdbserver_server_exec [remote_download target $host_exec /tmp/[file tail $host_exec].[pid]] + } else { + set gdbserver_server_exec $host_exec + } + } # Port id -- either specified in baseboard file, or managed here. if [target_info exists gdb,socketport] { @@ -162,7 +199,7 @@ proc gdbserver_spawn { server_exec child_args } { # Fire off the debug agent. This flavour of gdbserver takes as # arguments the port information, the name of the executable file to # be debugged, and any arguments. - set gdbserver_command "$gdbserver :$portnum $server_exec" + set gdbserver_command "$gdbserver :$portnum $gdbserver_server_exec" if { $child_args != "" } { append gdbserver_command " $child_args" } @@ -194,58 +231,13 @@ proc gdbserver_spawn { server_exec child_args } { return [list $protocol $gdbport] } -proc infer_host_exec { } { - set host_exec "" - - send_gdb "info files\n" - gdb_expect 30 { - -re "Symbols from \"(\[^\"\]+)\"" { - set host_exec $expect_out(1,string) - exp_continue - } - -re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," { - set host_exec $expect_out(1,string) - exp_continue - } - -re "$gdb_prompt $" { } - } - - return $host_exec -} - # Start a gdbserver process running HOST_EXEC and pass CHILD_ARGS # to it. Return 0 on success, or non-zero on failure. -proc gdbserver_load { host_exec child_args } { - global gdbserver_host_exec - global gdbserver_server_exec - - # If we weren't passed an explicit binary, try to reuse the current - # one. If we were, be sure to redownload it. - - if { $host_exec == "" && $gdbserver_host_exec == "" } { - set gdbserver_host_exec [infer_host_exec] - } elseif { $host_exec != "" } { - set gdbserver_host_exec $host_exec - if [info exists gdbserver_server_exec] { unset gdbserver_server_exec } - } - - if { ! [info exists gdbserver_server_exec] } { - if [is_remote target] { - set gdbserver_server_exec [remote_download target $host_exec /tmp/[file tail $gdbserver_host_exec].[pid]] - } else { - set gdbserver_server_exec $gdbserver_host_exec - } - } - - set res [gdbserver_spawn $gdbserver_server_exec $child_args] +proc gdbserver_run { child_args } { + set res [gdbserver_spawn $child_args] set protocol [lindex $res 0] set gdbport [lindex $res 1] - if { $host_exec != "" } { - if [gdb_file_cmd $host_exec] { - return -1 - } - } - gdb_target_cmd $protocol $gdbport + return [gdb_target_cmd $protocol $gdbport] } diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index 111bc840a4..d94d0d79c1 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -379,18 +379,10 @@ proc mi_gdb_file_cmd { arg } { global loadfile global GDB global mi_gdb_prompt - global last_mi_gdb_file - global last_mi_remote_file + global last_loaded_file upvar timeout timeout - if { $arg == "" } { - set arg $last_mi_gdb_file; - } else { - set last_mi_gdb_file $arg - if { [ info exists last_mi_remote_file ] } { - unset last_mi_remote_file - } - } + set last_loaded_file $arg if [is_remote host] { set arg [remote_download host $arg]; @@ -449,10 +441,10 @@ proc mi_gdb_file_cmd { arg } { } # -# load a file into the debugger. +# connect to the target and download a file, if necessary. # return a -1 if anything goes wrong. # -proc mi_gdb_load { arg } { +proc mi_gdb_target_load { } { global verbose global loadpath global loadfile @@ -460,25 +452,8 @@ proc mi_gdb_load { arg } { global mi_gdb_prompt upvar timeout timeout - # ``gdb_unload'' - if { $arg != "" } { - mi_gdb_file_cmd $arg - } - - # ``load'' if { [info procs gdbserver_gdb_load] != "" } { - global last_mi_gdb_file - global last_mi_remote_file - - if { ! [info exists last_mi_remote_file] } { - if [is_remote target] { - set last_mi_remote_file [remote_download target $arg /tmp/[file tail $arg].[pid]] - } else { - set last_mi_remote_file $last_mi_gdb_file - } - } - - set res [gdbserver_gdb_load $last_mi_remote_file] + set res [gdbserver_gdb_load] set protocol [lindex $res 0] set gdbport [lindex $res 1] @@ -544,6 +519,17 @@ proc mi_gdb_load { arg } { return 0 } +# +# load a file into the debugger. +# return a -1 if anything goes wrong. +# +proc mi_gdb_load { arg } { + if { $arg != "" } { + return [mi_gdb_file_cmd $arg] + } + return 0 +} + # mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb; # test the result. # @@ -786,13 +772,12 @@ proc mi_run_cmd {args} { } } + if { [mi_gdb_target_load] < 0 } { + return + } + if [target_info exists use_gdb_stub] { if [target_info exists gdb,do_reload_on_run] { - # Specifying no file, defaults to the executable - # currently being debugged. - if { [mi_gdb_load ""] < 0 } { - return; - } send_gdb "000-exec-continue\n"; gdb_expect 60 { -re "000\\^running\[\r\n\]+$mi_gdb_prompt$" {}