gdb/testsuite/
authorDaniel Jacobowitz <drow@false.org>
Fri, 8 Apr 2005 12:57:00 +0000 (12:57 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 8 Apr 2005 12:57:00 +0000 (12:57 +0000)
* Makefile.in (ALL_SUBDIRS): Add gdb.gdbserver.
* configure.ac: Create gdb.gdbserver/Makefile.
* configure: Regenerated.
* lib/gdbserver-support.exp: New file, derived from
config/gdbserver.exp.
* config/gdbserver.exp: Use gdbserver-support.exp.
* gdb.gdbserver/Makefile.in: New file.
* gdb.gdbserver/server.c: New file.
* gdb.gdbserver/server-run.exp: New file.
gdb/
* config/fnchange.lst: Add testsuite/gdb.gdbserver entries.

gdb/ChangeLog
gdb/config/djgpp/fnchange.lst
gdb/testsuite/ChangeLog
gdb/testsuite/Makefile.in
gdb/testsuite/config/gdbserver.exp
gdb/testsuite/configure
gdb/testsuite/configure.ac
gdb/testsuite/gdb.gdbserver/Makefile.in [new file with mode: 0644]
gdb/testsuite/gdb.gdbserver/server-run.exp [new file with mode: 0644]
gdb/testsuite/gdb.gdbserver/server.c [new file with mode: 0644]
gdb/testsuite/lib/gdbserver-support.exp [new file with mode: 0644]

index af02d972f22024633336983a3eaf41ee548473d1..ad7d5f63c3a7e8d776184d6b7c1f03b962a0d464 100644 (file)
@@ -1,3 +1,7 @@
+2005-04-08  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * config/fnchange.lst: Add testsuite/gdb.gdbserver entries.
+
 2005-04-08  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * dwarf2-frame.c (struct dwarf2_frame_cache): New field
index 70f42e23ce4619ef9567a778b1db51e39cc50ea9..c2b60bafed7a6a843ca9dd42825f5f00e2f5e24d 100644 (file)
 @V@/gdb/testsuite/gdb.base/coremaker2.c @V@/gdb/testsuite/gdb.base/core2maker.c
 @V@/gdb/testsuite/gdb.cp/m-static1.cc @V@/gdb/testsuite/gdb.cp/m-stat1.cc
 @V@/gdb/testsuite/gdb.cp/namespace1.cc @V@/gdb/testsuite/gdb.cp/namesp1.cc
+@V@/gdb/testsuite/gdb.gdbserver/Makefile.in @V@/gdb/testsuite/gdb.srv/Makefile.in
+@V@/gdb/testsuite/gdb.gdbserver/server-run.exp @V@/gdb/testsuite/gdb.srv/server-run.exp
+@V@/gdb/testsuite/gdb.gdbserver/server.c @V@/gdb/testsuite/gdb.srv/server.c
 @V@/gdb/testsuite/gdb.gdbtk/ChangeLog @V@/gdb/testsuite/gdb.tk/ChangeLog
 @V@/gdb/testsuite/gdb.gdbtk/Makefile.in @V@/gdb/testsuite/gdb.tk/Makefile.in
 @V@/gdb/testsuite/gdb.gdbtk/browser.exp @V@/gdb/testsuite/gdb.tk/browser.exp
index 0e4f39c7c9fe5c5266e53193d74d9f5a35cdeae1..7e062f3baea483f4062e88d0de6114d94b75ece6 100644 (file)
@@ -1,3 +1,15 @@
+2005-04-08  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * Makefile.in (ALL_SUBDIRS): Add gdb.gdbserver.
+       * configure.ac: Create gdb.gdbserver/Makefile.
+       * configure: Regenerated.
+       * lib/gdbserver-support.exp: New file, derived from
+       config/gdbserver.exp.
+       * config/gdbserver.exp: Use gdbserver-support.exp.
+       * gdb.gdbserver/Makefile.in: New file.
+       * gdb.gdbserver/server.c: New file.
+       * gdb.gdbserver/server-run.exp: New file.
+
 2005-04-06  Paul Gilliam  <pgilliam@us.ibm.com>
 
         * lib/gdb.exp (test_compiler_info): Return compiler_info
index 5aa82622dd7ed59bd02235832e8377afcc76ead8..dedfe95d756496fb1f86e4d8c50fd2e8ce78372d 100644 (file)
@@ -1,5 +1,6 @@
 # Makefile for regression testing the GNU debugger.
-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002, 2003, 2004
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002, 2003, 2004,
+# 2005
 # Free Software Foundation, Inc.
 
 # This file is part of GDB.
@@ -37,7 +38,8 @@ SUBDIRS = @subdirs@
 RPATH_ENVVAR = @RPATH_ENVVAR@
 ALL_SUBDIRS = gdb.ada gdb.arch gdb.asm gdb.base gdb.cp gdb.disasm \
        gdb.dwarf2 \
-       gdb.fortran gdb.java gdb.mi gdb.objc gdb.threads gdb.trace \
+       gdb.fortran gdb.gdbserver gdb.java gdb.mi \
+       gdb.objc gdb.threads gdb.trace \
        $(SUBDIRS)
 
 EXPECT = `if [ -f $${rootme}/../../expect/expect ] ; then \
index 61db50e3bf32ca91e9778b7b93ef6f577e5d33cb..9d133cfe72285147a0a31631ce76331307638bfe 100644 (file)
@@ -1,7 +1,3 @@
-# Test framework for GDB (remote protocol) using a "gdbserver",
-# ie. a debug agent running as a native process on the same or
-# a different host.
-
 # Copyright 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
 
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
-
-# This file was written by Michael Snyder. (msnyder@redhat.com)
+# Test framework for GDB (remote protocol) using a "gdbserver",
+# ie. a debug agent running as a native process on the same or
+# a different host.
 
 #
 # This module to be used for testing gdb with a "gdbserver" 
 # built either from libremote or from gdb/gdbserver.  
 #
 
-# Load the basic testing library, and the remote stuff.
-load_lib ../config/monitor.exp
-
 #
 # To be addressed or set in your baseboard config file:
 #
@@ -73,148 +65,19 @@ load_lib ../config/monitor.exp
 #      Defaults to "localhost".  Note: old gdbserver requires 
 #      that you define this, but libremote/gdbserver does not.
 #
-#   set_board_info socketport
+#   set_board_info gdb,socketport
 #      Port id to use for socket connection.  If not set explicitly,
 #      it will start at "2345" and increment for each use.
 #
 
+# The guts live in gdbserver-support.exp now.
 
+load_lib gdbserver-support.exp
 
-#
-# gdb_load -- load a file into the debugger.
-#             return a -1 if anything goes wrong.
-#
-
-global server_exec;
-global portnum;
-set portnum "2345";
-
-proc gdbserver_gdb_load { server_exec } {
-    global portnum
-
-    # Port id -- either specified in baseboard file, or managed here.
-    if [target_info exists gdb,socketport] {
-       set portnum [target_info gdb,socketport];
-    } else {
-       # Bump the port number to avoid conflicts with hung ports.
-       incr portnum;
-    }
-
-    # Extract the local and remote host ids from the target board struct.
-
-    if [target_info exists sockethost] {
-       set debughost  [target_info sockethost];
-    } else {
-       set debughost "localhost:";
-    }
-    # Extract the protocol
-    if [target_info exists gdb_protocol] {
-       set protocol [target_info gdb_protocol];
-    } else {
-       set protocol "remote";
-    }
-
-    # Extract the name of the gdbserver, if known (default 'gdbserver').
-    if [target_info exists gdb_server_prog] {
-       set gdbserver [target_info gdb_server_prog];
-    } else {
-       set gdbserver "gdbserver";
-    }
-    # Extract the socket hostname
-    if [target_info exists sockethost] {
-       set sockethost [target_info sockethost];
-    } else {
-       set sockethost ""
-    }
-
-    # Export the host:port pair.
-    set gdbport $debughost$portnum;
-
-    # Fire off the debug agent
-    if [target_info exists gdb_server_args] {
-        # This flavour of gdbserver takes as arguments those specified
-        # in the board configuration file
-        set custom_args [target_info gdb_server_args];
-       set server_spawn_id [remote_spawn target \
-               "$gdbserver $custom_args"]
-    } else {
-        # This flavour of gdbserver takes as arguments the port information
-        # and the name of the executable file to be debugged.
-       set server_spawn_id [remote_spawn target \
-           "$gdbserver $sockethost$portnum $server_exec"]
-    }
-
-    # Wait for the server to produce at least one line and an additional
-    # character of output.  This will wait until any TCP socket has been
-    # created, so that GDB can connect.
-    expect {
-       -i $server_spawn_id
-       -notransfer
-       -re ".*\n." { }
-    }
-
-    # We can't just call close, because if gdbserver is local then that means
-    # that it will get a SIGHUP.  Doing it this way could also allow us to
-    # get at the inferior's input or output if necessary, and means that we
-    # don't need to redirect output.
-    expect_background {
-       -i $server_spawn_id
-       -re "." { }
-       eof {
-           # The spawn ID is already closed now (but not yet waited for).
-           wait -i $expect_out(spawn_id)
-       }
-    }
-
-    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
+proc gdbserver_gdb_load { arg } {
+    return [gdbserver_spawn $arg ""]
 }
 
 proc gdb_load { arg } {
-    global host_exec
-    global server_exec
-
-    if { $arg == "" && $host_exec == "" } {
-       set host_exec [infer_host_exec]
-    } elseif { $arg != "" } {
-       set host_exec $arg
-       if [info exists server_exec] { unset server_exec }
-    }
-
-    if { ! [info exists server_exec] } {
-       if [is_remote target] {
-           set server_exec [remote_download target $host_exec /tmp/[file tail $host_exec].[pid]]
-       } else {
-           set server_exec $host_exec
-       }
-    }
-
-    set res [gdbserver_gdb_load $server_exec]
-    set protocol [lindex $res 0]
-    set gdbport [lindex $res 1]
-
-    if { $arg != "" } {
-       if [gdb_file_cmd $arg] {
-           return -1
-       }
-    }
-    gdb_target_cmd $protocol $gdbport
+    return [gdbserver_load $arg ""]
 }
index cada180bba860fc972ea07fb20b62f7d2f04ddd2..72734f5e590484329d2d513b3bf0cf7946362147 100755 (executable)
@@ -956,7 +956,7 @@ esac
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
     fi
-    cd $ac_popdir
+    cd "$ac_popdir"
   done
 fi
 
@@ -2080,8 +2080,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2139,8 +2138,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2256,8 +2254,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2311,8 +2308,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2357,8 +2353,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2402,8 +2397,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2726,8 +2720,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2897,8 +2890,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2965,8 +2957,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-        { ac_try='test -z "$ac_c_werror_flag"
-                        || test ! -s conftest.err'
+        { ac_try='test -z "$ac_c_werror_flag"                   || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3084,7 +3075,7 @@ done
 
 
 
-                                                                                                                                            ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile"
+                                                                                                                                                      ac_config_files="$ac_config_files Makefile gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile gdb.fortran/Makefile gdb.gdbserver/Makefile gdb.java/Makefile gdb.mi/Makefile gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
@@ -3644,6 +3635,7 @@ do
   "gdb.disasm/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.disasm/Makefile" ;;
   "gdb.dwarf2/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.dwarf2/Makefile" ;;
   "gdb.fortran/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.fortran/Makefile" ;;
+  "gdb.gdbserver/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.gdbserver/Makefile" ;;
   "gdb.java/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.java/Makefile" ;;
   "gdb.mi/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.mi/Makefile" ;;
   "gdb.objc/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdb.objc/Makefile" ;;
@@ -3919,11 +3911,6 @@ esac
 
 
 
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
   # Let's still pretend it is `configure' which instantiates (i.e., don't
   # use $as_me), people would be surprised to read:
   #    /* config.h.  Generated by config.status.  */
@@ -3962,6 +3949,12 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
         fi;;
       esac
     done` || { (exit 1); exit 1; }
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
   sed "$ac_vpsub
@@ -4193,7 +4186,7 @@ echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
    { (exit 1); exit 1; }; }
     fi
 
-    cd $ac_popdir
+    cd "$ac_popdir"
   done
 fi
 
index 28605b449fda267588f5a3ac9c29e6812c169398..814ee8a35260f789fa2f83561fa0a65323057c7b 100644 (file)
@@ -1,7 +1,7 @@
 #                                                       -*- Autoconf -*-
 # Process this file with autoconf to produce a configure script.
 
-# Copyright 2002, 2003, 2004
+# Copyright 2002, 2003, 2004, 2005
 # Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -112,5 +112,6 @@ AC_OUTPUT([Makefile \
   gdb.ada/Makefile \
   gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile \
   gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile \
-  gdb.fortran/Makefile gdb.java/Makefile gdb.mi/Makefile \
+  gdb.fortran/Makefile gdb.gdbserver/Makefile \
+  gdb.java/Makefile gdb.mi/Makefile \
   gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile])
diff --git a/gdb/testsuite/gdb.gdbserver/Makefile.in b/gdb/testsuite/gdb.gdbserver/Makefile.in
new file mode 100644 (file)
index 0000000..0633edf
--- /dev/null
@@ -0,0 +1,24 @@
+VPATH = @srcdir@
+srcdir = @srcdir@
+
+EXECUTABLES =
+
+MISCELLANEOUS =
+
+all info install-info dvi install uninstall installcheck check:
+       @echo "Nothing to be done for $@..."
+
+clean mostlyclean:
+       -find . -name '*.o' -print | xargs rm -f
+       -find . -name '*.ali' -print | xargs rm -f
+       -find . -name 'b~*.ad[sb]' -print | xargs rm -f
+       -rm -f *~ a.out xgdb *.x *.ci *.tmp
+       -rm -f *~ *.o a.out xgdb *.x *.ci *.tmp
+       -rm -f core core.coremaker coremaker.core corefile $(EXECUTABLES)
+       -rm -f $(MISCELLANEOUS) twice-tmp.c
+
+distclean maintainer-clean realclean: clean
+       -rm -f *~ core
+       -rm -f Makefile config.status config.log
+       -rm -f *-init.exp
+       -rm -fr *.log summary detail *.plog *.sum *.psum site.*
diff --git a/gdb/testsuite/gdb.gdbserver/server-run.exp b/gdb/testsuite/gdb.gdbserver/server-run.exp
new file mode 100644 (file)
index 0000000..e0085dc
--- /dev/null
@@ -0,0 +1,42 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+# Test the basic functionality of gdbserver.
+
+load_lib gdbserver-support.exp
+
+set testfile "server"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+if { [skip_gdbserver_tests] } {
+    return 0
+}
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+    return -1
+}
+
+gdb_exit
+gdb_start
+
+gdbserver_load $binfile ""
+gdb_reinitialize_dir $srcdir/$subdir
+
+gdb_breakpoint main
+gdb_test "continue" "Breakpoint.* main .*" "continue to main"
diff --git a/gdb/testsuite/gdb.gdbserver/server.c b/gdb/testsuite/gdb.gdbserver/server.c
new file mode 100644 (file)
index 0000000..b651263
--- /dev/null
@@ -0,0 +1,24 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+int
+main (int argc, char **argv)
+{
+  return 0;
+}
diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp
new file mode 100644 (file)
index 0000000..71535d0
--- /dev/null
@@ -0,0 +1,250 @@
+# Copyright 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+# This file is based on config/gdbserver.exp, which was written by
+# Michael Snyder (msnyder@redhat.com).
+
+#
+# To be addressed or set in your baseboard config file:
+#
+#   set_board_info gdb_protocol "remote"
+#      Unles you have a gdbserver that uses a different protocol...
+#
+#   set_board_info gdb_server_prog
+#      This will be the path to the gdbserver program you want to test.
+#      Defaults to "gdbserver".
+#
+#   set_board_info sockethost
+#      The name of the host computer whose socket is being used.
+#      Defaults to "localhost".  Note: old gdbserver requires 
+#      that you define this, but libremote/gdbserver does not.
+#
+#   set_board_info gdb,socketport
+#      Port id to use for socket connection.  If not set explicitly,
+#      it will start at "2345" and increment for each use.
+#
+
+#
+# gdb_target_cmd
+# Send gdb the "target" command
+#
+proc gdb_target_cmd { targetname serialport } {
+    global gdb_prompt
+
+    for {set i 1} {$i <= 3} {incr i} {
+       send_gdb "target $targetname $serialport\n"
+       gdb_expect 60 {
+           -re "A program is being debugged already.*ill it.*y or n. $" {
+               send_gdb "y\n"
+               exp_continue
+           }
+           -re "Couldn't establish connection to remote.*$gdb_prompt" {
+               verbose "Connection failed"
+           }
+           -re "Remote MIPS debugging.*$gdb_prompt" {
+               verbose "Set target to $targetname"
+               return 0
+           }
+           -re "Remote debugging using .*$serialport.*$gdb_prompt" {
+               verbose "Set target to $targetname"
+               return 0
+           }
+           -re "Remote target $targetname connected to.*$gdb_prompt" {
+               verbose "Set target to $targetname"
+               return 0
+           }
+           -re "Connected to.*$gdb_prompt" { 
+               verbose "Set target to $targetname"
+               return 0
+           }
+           -re "Ending remote.*$gdb_prompt" { }
+           -re "Connection refused.*$gdb_prompt" {
+               verbose "Connection refused by remote target.  Pausing, and trying again."
+               sleep 30
+               continue
+           }
+           -re "Timeout reading from remote system.*$gdb_prompt" {
+               verbose "Got timeout error from gdb."
+           }
+           timeout {
+               send_gdb "\ 3"
+               break
+           }
+       }
+    }
+    return 1
+}
+
+
+global portnum
+set portnum "2345"
+
+# Locate the gdbserver binary.  Returns "" if gdbserver could not be found.
+
+proc find_gdbserver { } {
+  global GDB
+
+  if [target_info exists gdb_server_prog] {
+    return [target_info gdb_server_prog]
+  }
+
+  set gdbserver "${GDB}server"
+  if { [file isdirectory $gdbserver] } {
+    append gdbserver "/gdbserver"
+  }
+
+  if { [file executable $gdbserver] } {
+    return $gdbserver
+  }
+
+  return ""
+}
+
+# Return non-zero if we should skip gdbserver-specific tests.
+
+proc skip_gdbserver_tests { } {
+  if { [find_gdbserver] == "" } {
+    return 1
+  }
+
+  return 0
+}
+
+# Start a gdbserver process running SERVER_EXEC, and connect GDB
+# to it.  CHILD_ARGS are passed to the inferior.
+#
+# Returns the target protocol and socket to connect to.
+
+proc gdbserver_spawn { server_exec child_args } {
+    global portnum
+
+    # Port id -- either specified in baseboard file, or managed here.
+    if [target_info exists gdb,socketport] {
+       set portnum [target_info gdb,socketport]
+    } else {
+       # Bump the port number to avoid conflicts with hung ports.
+       incr portnum
+    }
+
+    # Extract the local and remote host ids from the target board struct.
+    if [target_info exists sockethost] {
+       set debughost  [target_info sockethost]
+    } else {
+       set debughost "localhost:"
+    }
+
+    # Extract the protocol
+    if [target_info exists gdb_protocol] {
+       set protocol [target_info gdb_protocol]
+    } else {
+       set protocol "remote"
+    }
+
+    set gdbserver [find_gdbserver]
+
+    # Export the host:port pair.
+    set gdbport $debughost$portnum
+
+    # 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"
+    if { $child_args != "" } {
+       append gdbserver_command " $child_args"
+    }
+
+    set server_spawn_id [remote_spawn target $gdbserver_command]
+
+    # Wait for the server to produce at least one line and an additional
+    # character of output.  This will wait until any TCP socket has been
+    # created, so that GDB can connect.
+    expect {
+       -i $server_spawn_id
+       -notransfer
+       -re ".*\n." { }
+    }
+
+    # We can't just call close, because if gdbserver is local then that means
+    # that it will get a SIGHUP.  Doing it this way could also allow us to
+    # get at the inferior's input or output if necessary, and means that we
+    # don't need to redirect output.
+    expect_background {
+       -i $server_spawn_id
+       -re "." { }
+       eof {
+           # The spawn ID is already closed now (but not yet waited for).
+           wait -i $expect_out(spawn_id)
+       }
+    }
+
+    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]
+    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
+}