This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [rfc] Simplify gdb remote / simulator testing


On Mon, Feb 26, 2007 at 12:20:20PM -0500, Daniel Jacobowitz wrote:
> Someone (Aman, I think) recently reminded me on gdb@ about this
> problem.  There's a lot of inefficiency in testing gdbserver based on
> the fact that gdb_load starts the server and connects, instead of just
> issuing a "file" command.  So this patch rearranges things until
> gdb_run_cmd does this instead.
> 
> I only rearranged gdbserver for the non-MI tests, but did the
> equivalent fix to all of the supported targets for the MI tests - the
> problem there is that the gdb_load bits are specific to each target
> and hard to adjust.  It would not be too hard to fix the other targets
> either based on the new gdb_reload hook.
> 
> The advantages of this patch are (A) efficiency during testing, and
> (B) once the rest of config is converted, tests can assume that the
> target isn't "running" after gdb_load, which has been a problem with
> writing new tests.
> 
> I tested ARM using remote gdbserver, ARM using the in-tree simulator,
> and x86_64-linux native.  I'm fairly confident I got this right, but
> I'll leave it for a little while in case any interested parties
> want to comment :-)

I should have tested x86_64 using gdbserver.  That turned up a bunch
more problems.  Here's what I've checked in, with a few additional
fixes.

The tests using "start" are now UNTESTED for remote targets, since
there's no obvious way to handle that.

-- 
Daniel Jacobowitz
CodeSourcery

2007-03-27  Daniel Jacobowitz  <dan@codesourcery.com>

	* 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.

Index: config/gdbserver.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/config/gdbserver.exp,v
retrieving revision 1.11
diff -u -p -r1.11 gdbserver.exp
--- config/gdbserver.exp	9 Jan 2007 17:59:08 -0000	1.11
+++ config/gdbserver.exp	27 Mar 2007 17:48:37 -0000
@@ -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 ""]
 }
Index: gdb.ada/exec_changed.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.ada/exec_changed.exp,v
retrieving revision 1.4
diff -u -p -r1.4 exec_changed.exp
--- gdb.ada/exec_changed.exp	12 Jan 2007 11:36:20 -0000	1.4
+++ gdb.ada/exec_changed.exp	27 Mar 2007 17:48:37 -0000
@@ -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"
 }
-
Index: gdb.ada/null_record.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.ada/null_record.exp,v
retrieving revision 1.9
diff -u -p -r1.9 null_record.exp
--- gdb.ada/null_record.exp	12 Jan 2007 11:36:20 -0000	1.9
+++ gdb.ada/null_record.exp	27 Mar 2007 17:48:37 -0000
@@ -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"
 
Index: gdb.ada/start.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.ada/start.exp,v
retrieving revision 1.5
diff -u -p -r1.5 start.exp
--- gdb.ada/start.exp	12 Jan 2007 11:36:20 -0000	1.5
+++ gdb.ada/start.exp	27 Mar 2007 17:48:37 -0000
@@ -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"
-
Index: gdb.base/break.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/break.exp,v
retrieving revision 1.27
diff -u -p -r1.27 break.exp
--- gdb.base/break.exp	9 Jan 2007 17:59:09 -0000	1.27
+++ gdb.base/break.exp	27 Mar 2007 17:48:37 -0000
@@ -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
-    }
-    -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"
+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 "$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
-    }
-    -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"
+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 "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)"
     }
 }
 
Index: gdb.base/charsign.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/charsign.exp,v
retrieving revision 1.1
diff -u -p -r1.1 charsign.exp
--- gdb.base/charsign.exp	26 Jan 2007 20:53:15 -0000	1.1
+++ gdb.base/charsign.exp	27 Mar 2007 17:48:38 -0000
@@ -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" \
Index: gdb.base/dbx.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/dbx.exp,v
retrieving revision 1.7
diff -u -p -r1.7 dbx.exp
--- gdb.base/dbx.exp	9 Jan 2007 17:59:10 -0000	1.7
+++ gdb.base/dbx.exp	27 Mar 2007 17:48:38 -0000
@@ -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];
Index: gdb.base/ending-run.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/ending-run.exp,v
retrieving revision 1.26
diff -u -p -r1.26 ending-run.exp
--- gdb.base/ending-run.exp	9 Jan 2007 17:59:11 -0000	1.26
+++ gdb.base/ending-run.exp	27 Mar 2007 17:48:38 -0000
@@ -67,11 +67,9 @@ gdb_test "b ending-run.c:31" ".*Breakpoi
 # 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 {
Index: gdb.base/pending.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/pending.exp,v
retrieving revision 1.6
diff -u -p -r1.6 pending.exp
--- gdb.base/pending.exp	9 Jan 2007 17:59:11 -0000	1.6
+++ gdb.base/pending.exp	27 Mar 2007 17:48:38 -0000
@@ -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.*" \
Index: gdb.base/sepdebug.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/sepdebug.exp,v
retrieving revision 1.6
diff -u -p -r1.6 sepdebug.exp
--- gdb.base/sepdebug.exp	9 Jan 2007 17:59:11 -0000	1.6
+++ gdb.base/sepdebug.exp	27 Mar 2007 17:48:38 -0000
@@ -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
-    }
-    -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"
+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 "$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
-    }
-    -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"
+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 "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)"
     }
 }
 
Index: gdb.base/start.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/start.exp,v
retrieving revision 1.2
diff -u -p -r1.2 start.exp
--- gdb.base/start.exp	9 Jan 2007 17:59:11 -0000	1.2
+++ gdb.base/start.exp	27 Mar 2007 17:48:38 -0000
@@ -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"
 
Index: gdb.base/unload.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/unload.exp,v
retrieving revision 1.7
diff -u -p -r1.7 unload.exp
--- gdb.base/unload.exp	9 Jan 2007 17:59:11 -0000	1.7
+++ gdb.base/unload.exp	27 Mar 2007 17:48:38 -0000
@@ -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"
 
Index: gdb.objc/objcdecode.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.objc/objcdecode.exp,v
retrieving revision 1.3
diff -u -p -r1.3 objcdecode.exp
--- gdb.objc/objcdecode.exp	9 Jan 2007 17:59:13 -0000	1.3
+++ gdb.objc/objcdecode.exp	27 Mar 2007 17:48:38 -0000
@@ -72,12 +72,13 @@ gdb_test_multiple "break multipleDef" $n
 }
 
 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.
Index: gdb.server/server-mon.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.server/server-mon.exp,v
retrieving revision 1.1
diff -u -p -r1.1 server-mon.exp
--- gdb.server/server-mon.exp	26 Feb 2007 20:10:18 -0000	1.1
+++ gdb.server/server-mon.exp	27 Mar 2007 17:48:38 -0000
@@ -34,10 +34,11 @@ if  { [gdb_compile "${srcdir}/${subdir}/
 
 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"
Index: gdb.server/server-run.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.server/server-run.exp,v
retrieving revision 1.2
diff -u -p -r1.2 server-run.exp
--- gdb.server/server-run.exp	9 Jan 2007 17:59:13 -0000	1.2
+++ gdb.server/server-run.exp	27 Mar 2007 17:48:38 -0000
@@ -34,8 +34,9 @@ if  { [gdb_compile "${srcdir}/${subdir}/
 
 gdb_exit
 gdb_start
+gdb_load $binfile
 
-gdbserver_load $binfile ""
+gdbserver_run ""
 gdb_reinitialize_dir $srcdir/$subdir
 
 gdb_breakpoint main
Index: lib/gdb.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/lib/gdb.exp,v
retrieving revision 1.79
diff -u -p -r1.79 gdb.exp
--- lib/gdb.exp	16 Mar 2007 15:29:00 -0000	1.79
+++ lib/gdb.exp	27 Mar 2007 17:48:38 -0000
@@ -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.
Index: lib/gdbserver-support.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/lib/gdbserver-support.exp,v
retrieving revision 1.3
diff -u -p -r1.3 gdbserver-support.exp
--- lib/gdbserver-support.exp	9 Jan 2007 17:59:14 -0000	1.3
+++ lib/gdbserver-support.exp	27 Mar 2007 17:48:38 -0000
@@ -80,6 +80,11 @@ proc gdb_target_cmd { targetname serialp
 	    -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
     # 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
     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]
 }
Index: lib/mi-support.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/lib/mi-support.exp,v
retrieving revision 1.41
diff -u -p -r1.41 mi-support.exp
--- lib/mi-support.exp	8 Feb 2007 20:35:08 -0000	1.41
+++ lib/mi-support.exp	27 Mar 2007 17:48:38 -0000
@@ -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$" {}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]