2004-07-19 Andrew Cagney <cagney@gnu.org>
authorAndrew Cagney <cagney@redhat.com>
Mon, 19 Jul 2004 13:58:21 +0000 (13:58 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 19 Jul 2004 13:58:21 +0000 (13:58 +0000)
* gdb.base/selftest.exp: Copy file from here ...
* gdb.gdb/selftest.exp: ... to here.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/selftest.exp [deleted file]
gdb/testsuite/gdb.gdb/selftest.exp [new file with mode: 0644]

index b22e96e022cb7db9283b2d5c111bc26394333323..f500beafb15baa7a14d382bcefdfec9032529f73 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-19  Andrew Cagney  <cagney@gnu.org>
+
+       * gdb.base/selftest.exp: Copy file from here ...
+       * gdb.gdb/selftest.exp: ... to here.
+
 2004-07-16  Andrew Cagney  <cagney@redhat.com>
 
        * lib/insight-support.exp: Delete file.
diff --git a/gdb/testsuite/gdb.base/selftest.exp b/gdb/testsuite/gdb.base/selftest.exp
deleted file mode 100644 (file)
index 4196b74..0000000
+++ /dev/null
@@ -1,516 +0,0 @@
-#   Copyright 1988, 1990, 1991, 1992, 1994, 1997, 1999, 2000, 2002, 2003
-#   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.  
-
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
-
-# This file was written by Rob Savoye. (rob@cygnus.com)
-
-if $tracelevel then {
-    strace $tracelevel
-}
-
-set prms_id 0
-set bug_id 0
-
-# are we on a target board
-if [is_remote target] {
-    return
-}
-
-# Not all of the lines of code near the start of main are executed for
-# every machine.  Also, optimization may reorder some of the lines.
-# So all we do is try to step or next over everything until we get
-# to a line that we know is always executed.
-
-proc do_steps_and_nexts {} {
-    global gdb_prompt
-    global srcdir
-    gdb_reinitialize_dir $srcdir/..
-
-    for {set count 0} {$count < 32} {incr count} {
-       send_gdb "list\n"
-       # NOTE: carlton/2002-12-11: The "initial brace" and
-       # "current_directory initialization" possibilities happen to
-       # me with GCC 3.1 on i686-pc-linux-gnu when I compile with
-       # optimization.
-       gdb_expect {
-           -re ".*context = data.*$gdb_prompt $" {
-               set description "step over context initialization"
-               set command "step"
-           }
-           -re ".*argc = context->argc.*$gdb_prompt $" {
-               set description "step over argc initialization"
-               set command "step"
-           }
-           -re ".*argv = context->argv.*$gdb_prompt $" {
-               set description "step over argv initialization"
-               set command "step"
-           }
-           -re ".*quiet = 0.*$gdb_prompt $" {
-               set description "step over quiet initialization"
-               set command "step"
-           }
-           -re ".*batch = 0.*$gdb_prompt $" {
-               set description "step over batch initialization"
-               set command "step"
-           }
-           -re ".*symarg = NULL.*$gdb_prompt $" {
-               set description "step over symarg initialization"
-               set command "step"
-           }
-           -re ".*execarg = NULL.*$gdb_prompt $" {
-               set description "step over execarg initialization"
-               set command "step"
-           }
-           -re ".*corearg = NULL.*$gdb_prompt $" {
-               set description "step over corearg initialization"
-               set command "step"
-           }
-           -re ".*cdarg = NULL.*$gdb_prompt $" {
-               set description "step over cdarg initialization"
-               set command "step"
-           }
-           -re ".*ttyarg = NULL.*$gdb_prompt $" {
-               set description "step over ttyarg initialization"
-               set command "step"
-           }
-           -re ".*time_at_startup = get_run_time.*$gdb_prompt $" {
-               set description "next over get_run_time and everything it calls"
-               set command "next"
-           }
-           -re ".*START_PROGRESS.*$gdb_prompt $" {
-               # Note: ezannoni/2004/02/17: This check should be
-               # removed, since as of today that source line is not
-               # in gdb anymore.
-               set description "next over START_PROGRESS and everything it calls"
-               set command "next"
-           }
-           -re ".*mac_init.*$gdb_prompt $" {
-               set description "next over mac_init and everything it calls"
-               set command "next"
-           }
-           -re ".*init_malloc.*$gdb_prompt $" {
-               set description "next over init_malloc and everything it calls"
-               set command "next"
-           }
-           -re ".*lim_at_start.*$gdb_prompt $" {
-               set description "next over lim_at_start initialization"
-               set command "next"
-           }
-           -re ".*count . 0x3.*$gdb_prompt $" {
-               set description "next over conditional stack alignment code 1"
-               set command "next"
-           }
-           -re ".*if .i != 0.*$gdb_prompt $" {
-               set description "next over conditional stack alignment code 2"
-               set command "next"
-           }
-           -re ".*alloca .i - 4.*$gdb_prompt $" {
-               set description "next over conditional stack alignment alloca"
-               set command "next"
-           }
-           -re ".*cmdsize = 1.*$gdb_prompt $" {
-               set description "step over cmdsize initialization"
-               set command "next"
-           }
-           -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" {
-               set description "next over cmdarg initialization via xmalloc"
-               set command "next"
-           }
-           -re ".*ncmd = 0.*$gdb_prompt $" {
-               set description "next over ncmd initialization"
-               set command "next"
-           }
-           -re ".*dirsize = 1.*$gdb_prompt $" {
-               set description "next over dirsize initialization"
-               set command "next"
-           }
-           -re ".*dirarg = .* xmalloc.*$gdb_prompt $" {
-               return
-           }
-           -re ".*setlocale .LC_MESSAGES,.*$gdb_prompt $" {
-               set description "next over setlocale LC_MESSAGES"
-               set command "next"
-           }
-           -re ".*setlocale .LC_CTYPE,.*$gdb_prompt $" {
-               set description "next over setlocale LC_CTYPE"
-               set command "next"
-           }
-           -re ".*bindtextdomain .PACKAGE, LOCALEDIR.;.*$gdb_prompt $" {
-               set description "next over bindtextdomain"
-               set command "next"
-           }
-           -re ".*textdomain .PACKAGE.;.*$gdb_prompt $" {
-               set description "next over textdomain PACKAGE"
-               set command "next"
-           }
-           -re "\[0-9\]*\t\{\r\n$gdb_prompt $" {
-               set description "step over initial brace"
-               set command "step"
-           }
-           -re ".*current_directory = gdb_dirbuf.*$gdb_prompt $" {
-               set description "step over current_directory initialization"
-               set command "step"
-           }
-           -re ".*gdb_sysroot = .*$gdb_prompt $" {
-               # NOTE: carlton/2003-01-15: More optimization reordering,
-               # observed on GCC 3.1.
-               set description "step over gdb_sysroot initialization"
-               set command "step"
-           }
-           -re ".*ndir = 0.*$gdb_prompt $" {
-               set description "step over ndir initialization"
-               set command "step"
-           }
-           -re ".*instream = stdin.*$gdb_prompt $" {
-               set description "step over instream initialization"
-               set command "step"
-           }
-           -re ".*getcwd .gdb_dirbuf, sizeof .gdb_dirbuf..;.*$gdb_prompt $" {
-               set description "next over getcwd"
-               set command "next"
-           }
-           -re "\[ \t\]+\{\r\n$gdb_prompt $" {
-               setup_xfail "mips-*-irix5*"
-               fail "$description ended up at odd location"
-           }
-           -re ".*main.c.*No such file or directory.*$gdb_prompt $" {
-               setup_xfail "rs6000-*-aix3*"
-               fail "must be able to list source lines"
-               return
-           }
-           -re ".*$gdb_prompt $" {
-               fail "unknown source line after $description"
-               return
-           }
-           default {
-               fail "unknown source line near main"
-               return
-           }
-       }
-       send_gdb "$command\n"
-       gdb_expect {
-           -re ".*No such file or directory.\r\n$gdb_prompt $" {
-               fail "$description (no source available)"
-           }
-           -re ".*A file or directory .* does not exist..\r\n$gdb_prompt $" {
-               fail "$description (no source available)"
-           }
-           -re ".*$gdb_prompt $" {
-               pass "$description"
-           }
-           timeout {
-               fail "$description (timeout)"
-           }
-       }
-    }
-}
-
-proc test_with_self { executable } {
-    global gdb_prompt
-    global tool
-    global det_file
-    global decimal
-    global timeout
-
-    # load yourself into the debugger
-    # This can take a relatively long time, particularly for testing where
-    # the executable is being accessed over a network, or where gdb does not
-    # support partial symbols for a particular target and has to load the
-    # entire symbol table.  Set the timeout to 10 minutes, which should be
-    # adequate for most environments (it *has* timed out with 5 min on a
-    # SPARCstation SLC under moderate load, so this isn't unreasonable).
-    # After gdb is started, set the timeout to 30 seconds for the duration
-    # of this test, and then back to the original value.
-
-    set oldtimeout $timeout
-    set timeout 600
-    verbose "Timeout is now $timeout seconds" 2
-    if {[gdb_load $executable] <0} then {
-       set timeout $oldtimeout
-       verbose "Timeout is now $timeout seconds" 2
-       return -1
-    }
-    set timeout $oldtimeout
-    verbose "Timeout is now $timeout seconds" 2
-
-    # disassemble yourself
-    gdb_test "x/10i main" \
-           "x/10i.*main.*main.$decimal.*main.$decimal.*" \
-           "Disassemble main"
-
-    # Set a breakpoint at main
-    gdb_test "break captured_main" \
-           "Breakpoint.*at.* file.*, line.*" \
-           "breakpoint in captured_main"
-
-    # We'll need this when we send a ^C to GDB.  Need to do it before we
-    # run the program and gdb starts saving and restoring tty states.
-    # On Ultrix, we don't need it and it is really slow (because shell_escape
-    # doesn't use vfork).
-    if ![istarget "*-*-ultrix*"] then {
-       gdb_test "shell stty intr '^C'" "" \
-           "set interrupt character in test_with_self"
-    }
-
-    # FIXME: If we put this after the run to main, the first list
-    # command doesn't print the same line as the current line where
-    # gdb is stopped.
-    gdb_test "set listsize 1" "" "set listsize to 1"
-
-    # run yourself
-    # It may take a very long time for the inferior gdb to start (lynx),
-    # so we bump it back up for the duration of this command.
-    set timeout 600
-
-    set description "run until breakpoint at captured_main"
-    send_gdb "run -nw\n"
-    gdb_expect {
-       -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*main.c:.*$gdb_prompt $" {
-           pass "$description"
-       }
-       -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_prompt $" {
-           xfail "$description (line numbers scrambled?)"
-       }
-       -re "vfork: No more processes.*$gdb_prompt $" {
-           fail "$description (out of virtual memory)"
-           set timeout $oldtimeout
-           verbose "Timeout is now $timeout seconds" 2
-           return -1
-       }
-       -re ".*$gdb_prompt $" {
-           fail "$description"
-           set timeout $oldtimeout
-           verbose "Timeout is now $timeout seconds" 2
-           return -1
-       }
-       timeout {
-           fail "$description (timeout)"
-       }
-    }
-
-    set timeout $oldtimeout
-    verbose "Timeout is now $timeout seconds" 2
-
-    # do we have a version number ?
-    send_gdb "print version\n"
-    gdb_expect {
-       -re ".\[0-9\]+ = .\[0-9.\]+.*$gdb_prompt $" {
-           pass "printed version as string"
-       }
-       -re ".\[0-9\]+ = +0x.*\[0-9.\]+.*$gdb_prompt $" {
-           pass "printed version as pointer"
-       }
-       -re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" {
-           pass "printed version with cast"
-       }
-       -re ".*$gdb_prompt $"   { fail "printed version" }
-       timeout         { fail "(timeout) printed version" }
-    }
-
-    do_steps_and_nexts
-
-    gdb_test "print \"foo\"" ".\[0-9\]+ = \"foo\"" "print a string"
-
-    # do_steps_and_nexts left us ready to execute an xmalloc call,
-    # so give that a try.
-    # If we don't actually enter the xmalloc call when we give a
-    # step command that seems like a genuine bug.  It seems to happen
-    # on most RISC processors.
-    # NOTE drow/2003-06-22: However, if we step back to the preceding two
-    # lines, just keep stepping until we enter.
-    set stepped_back 0
-    setup_xfail "alpha-*-*" "mips-*-*"
-    set description "step into xmalloc call"
-    send_gdb "step\n"
-    gdb_expect {
-       -re "ncmd = 0;.*$gdb_prompt $" {
-           set stepped_back 1
-           send_gdb "step\n"
-           exp_continue
-       }
-        -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" {
-           set stepped_back 1
-           send_gdb "step\n"
-           exp_continue
-        }
-       -re "dirsize = 1;.*$gdb_prompt $" {
-           set stepped_back 1
-           send_gdb "step\n"
-           exp_continue
-       }
-       -re ".*dirarg = .* xmalloc.*$gdb_prompt $" {
-           if { $stepped_back == 1 } {
-               send_gdb "step\n"
-               exp_continue
-           } else {
-               fail "$description"
-           }
-       }
-       -re "xmalloc.*size=.*at.*utils.c.*$gdb_prompt $" {
-           pass "$description"
-       }
-       -re ".*No such file or directory.\r\n$gdb_prompt $" {
-           pass "$description (no source available)"
-       }
-       -re "A file or directory .* does not exist..\r\n$gdb_prompt $" {
-           pass "$description (no source available)"
-       }
-       -re ".*$gdb_prompt $" {
-           fail "$description"
-       }
-       timeout {
-           fail "$description (timeout)"
-       }
-    }
-
-    # start the "xgdb" process
-    send_gdb "continue\n"
-    gdb_expect {
-       -re "GNU gdb \[0-9\.\]*.*
-Copyright \[0-9\]* Free Software Foundation, Inc.*
-GDB is free software, covered by the GNU General Public License, and you are.*
-welcome to change it and/or distribute copies of it under certain conditions.*
-Type \"show copying\" to see the conditions.*
-There is absolutely no warranty for GDB.  Type \"show warranty\" for details.*
-This GDB was configured as .*$gdb_prompt $"\
-           { pass "xgdb is at prompt" }
-       -re "GDB is free software and you are welcome to distribute copies of it.*
- under certain conditions; type \"show copying\" to see the conditions..*
-There is absolutely no warranty for GDB; type \"show warranty\" for details..*
-GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
-           { pass "xgdb is at prompt (obsolescent gdb)" }
-       -re ".*$gdb_prompt $"       { fail "xgdb is at prompt" }
-       timeout             { fail "(timeout) xgdb is at prompt" }
-    }
-    
-    # set xgdb prompt so we can tell which is which
-    send_gdb "set prompt (xgdb) \n"
-    gdb_expect {
-       -re "\[(\]xgdb\[)\].*\[(\]xgdb\[)\] $"  { pass "Set xgdb prompt" }
-       -re ".*$gdb_prompt $"           { fail "Set xgdb prompt" }
-       default                         { fail "(timeout) Set xgdb prompt" }
-    }
-    
-    # kill the xgdb process
-    set description "send ^C to child process"
-    send_gdb "\003"
-    gdb_expect {
-       -re "Program received signal SIGINT.*$gdb_prompt $" {
-           pass "$description"
-       }
-       -re ".*$gdb_prompt $" {
-           fail "$description"
-       }
-       timeout {
-           fail "$description (timeout)"
-       }
-    }
-    
-    set description "send SIGINT signal to child process"
-    send_gdb "signal SIGINT\n"
-    gdb_expect {
-       -re "Continuing with signal SIGINT.*$gdb_prompt $" {
-           pass "$description"
-       }
-       -re ".*$gdb_prompt $" {
-           fail "$description"
-       }
-       timeout {
-           fail "$description (timeout)"
-       }
-    }
-    
-    # get a stack trace
-    #
-    # This fails on some linux systems for unknown reasons.  On the
-    # systems where it fails, sometimes it works fine when run manually.
-    # The testsuite failures may not be limited to just aout systems.
-    setup_xfail "i*86-pc-linuxaout-gnu"
-    set description "backtrace through signal handler"
-    send_gdb "backtrace\n"
-    gdb_expect {
-       -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
-           pass "$description"
-       }
-       -re ".*$gdb_prompt $" {
-           # On the alpha, we hit the infamous problem about gdb
-           # being unable to get the frame pointer (mentioned in
-           # gdb/README).  As it is intermittent, there is no way to
-           # XFAIL it which will give us an XPASS if the problem goes
-           # away.
-           setup_xfail "alpha*-*-osf*"
-           fail "$description"
-       }
-       timeout {
-           fail "$description (timeout)"
-       }
-    }
-
-
-    # Set the timeout back to the value it had when we were called.
-    set timeout $oldtimeout
-    verbose "Timeout is now $timeout seconds" 2
-
-    # Restart gdb in case next test expects it to be started already.
-    return 0
-}
-
-# Find a pathname to a file that we would execute if the shell was asked
-# to run $arg using the current PATH.
-
-proc find_gdb { arg } {
-
-    # If the arg directly specifies an existing executable file, then
-    # simply use it.
-
-    if [file executable $arg] then {
-       return $arg
-    }
-
-    set result [which $arg]
-    if [string match "/" [ string range $result 0 0 ]] then {
-       return $result
-    }
-
-    # If everything fails, just return the unqualified pathname as default
-    # and hope for best.
-
-    return $arg
-}
-
-# Run the test with self.
-# Copy the file executable file in case this OS doesn't like to edit its own
-# text space.
-
-set GDB_FULLPATH [find_gdb $GDB]
-
-# Remove any old copy lying around.
-remote_file host delete x$tool
-
-gdb_start
-set file [remote_download host $GDB_FULLPATH x$tool]
-set result [test_with_self $file];
-gdb_exit;
-catch "remote_file host delete $file";
-
-if {$result <0} then {
-    warning "Couldn't test self"
-    return -1
-}
diff --git a/gdb/testsuite/gdb.gdb/selftest.exp b/gdb/testsuite/gdb.gdb/selftest.exp
new file mode 100644 (file)
index 0000000..4196b74
--- /dev/null
@@ -0,0 +1,516 @@
+#   Copyright 1988, 1990, 1991, 1992, 1994, 1997, 1999, 2000, 2002, 2003
+#   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.  
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+
+# This file was written by Rob Savoye. (rob@cygnus.com)
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+set prms_id 0
+set bug_id 0
+
+# are we on a target board
+if [is_remote target] {
+    return
+}
+
+# Not all of the lines of code near the start of main are executed for
+# every machine.  Also, optimization may reorder some of the lines.
+# So all we do is try to step or next over everything until we get
+# to a line that we know is always executed.
+
+proc do_steps_and_nexts {} {
+    global gdb_prompt
+    global srcdir
+    gdb_reinitialize_dir $srcdir/..
+
+    for {set count 0} {$count < 32} {incr count} {
+       send_gdb "list\n"
+       # NOTE: carlton/2002-12-11: The "initial brace" and
+       # "current_directory initialization" possibilities happen to
+       # me with GCC 3.1 on i686-pc-linux-gnu when I compile with
+       # optimization.
+       gdb_expect {
+           -re ".*context = data.*$gdb_prompt $" {
+               set description "step over context initialization"
+               set command "step"
+           }
+           -re ".*argc = context->argc.*$gdb_prompt $" {
+               set description "step over argc initialization"
+               set command "step"
+           }
+           -re ".*argv = context->argv.*$gdb_prompt $" {
+               set description "step over argv initialization"
+               set command "step"
+           }
+           -re ".*quiet = 0.*$gdb_prompt $" {
+               set description "step over quiet initialization"
+               set command "step"
+           }
+           -re ".*batch = 0.*$gdb_prompt $" {
+               set description "step over batch initialization"
+               set command "step"
+           }
+           -re ".*symarg = NULL.*$gdb_prompt $" {
+               set description "step over symarg initialization"
+               set command "step"
+           }
+           -re ".*execarg = NULL.*$gdb_prompt $" {
+               set description "step over execarg initialization"
+               set command "step"
+           }
+           -re ".*corearg = NULL.*$gdb_prompt $" {
+               set description "step over corearg initialization"
+               set command "step"
+           }
+           -re ".*cdarg = NULL.*$gdb_prompt $" {
+               set description "step over cdarg initialization"
+               set command "step"
+           }
+           -re ".*ttyarg = NULL.*$gdb_prompt $" {
+               set description "step over ttyarg initialization"
+               set command "step"
+           }
+           -re ".*time_at_startup = get_run_time.*$gdb_prompt $" {
+               set description "next over get_run_time and everything it calls"
+               set command "next"
+           }
+           -re ".*START_PROGRESS.*$gdb_prompt $" {
+               # Note: ezannoni/2004/02/17: This check should be
+               # removed, since as of today that source line is not
+               # in gdb anymore.
+               set description "next over START_PROGRESS and everything it calls"
+               set command "next"
+           }
+           -re ".*mac_init.*$gdb_prompt $" {
+               set description "next over mac_init and everything it calls"
+               set command "next"
+           }
+           -re ".*init_malloc.*$gdb_prompt $" {
+               set description "next over init_malloc and everything it calls"
+               set command "next"
+           }
+           -re ".*lim_at_start.*$gdb_prompt $" {
+               set description "next over lim_at_start initialization"
+               set command "next"
+           }
+           -re ".*count . 0x3.*$gdb_prompt $" {
+               set description "next over conditional stack alignment code 1"
+               set command "next"
+           }
+           -re ".*if .i != 0.*$gdb_prompt $" {
+               set description "next over conditional stack alignment code 2"
+               set command "next"
+           }
+           -re ".*alloca .i - 4.*$gdb_prompt $" {
+               set description "next over conditional stack alignment alloca"
+               set command "next"
+           }
+           -re ".*cmdsize = 1.*$gdb_prompt $" {
+               set description "step over cmdsize initialization"
+               set command "next"
+           }
+           -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" {
+               set description "next over cmdarg initialization via xmalloc"
+               set command "next"
+           }
+           -re ".*ncmd = 0.*$gdb_prompt $" {
+               set description "next over ncmd initialization"
+               set command "next"
+           }
+           -re ".*dirsize = 1.*$gdb_prompt $" {
+               set description "next over dirsize initialization"
+               set command "next"
+           }
+           -re ".*dirarg = .* xmalloc.*$gdb_prompt $" {
+               return
+           }
+           -re ".*setlocale .LC_MESSAGES,.*$gdb_prompt $" {
+               set description "next over setlocale LC_MESSAGES"
+               set command "next"
+           }
+           -re ".*setlocale .LC_CTYPE,.*$gdb_prompt $" {
+               set description "next over setlocale LC_CTYPE"
+               set command "next"
+           }
+           -re ".*bindtextdomain .PACKAGE, LOCALEDIR.;.*$gdb_prompt $" {
+               set description "next over bindtextdomain"
+               set command "next"
+           }
+           -re ".*textdomain .PACKAGE.;.*$gdb_prompt $" {
+               set description "next over textdomain PACKAGE"
+               set command "next"
+           }
+           -re "\[0-9\]*\t\{\r\n$gdb_prompt $" {
+               set description "step over initial brace"
+               set command "step"
+           }
+           -re ".*current_directory = gdb_dirbuf.*$gdb_prompt $" {
+               set description "step over current_directory initialization"
+               set command "step"
+           }
+           -re ".*gdb_sysroot = .*$gdb_prompt $" {
+               # NOTE: carlton/2003-01-15: More optimization reordering,
+               # observed on GCC 3.1.
+               set description "step over gdb_sysroot initialization"
+               set command "step"
+           }
+           -re ".*ndir = 0.*$gdb_prompt $" {
+               set description "step over ndir initialization"
+               set command "step"
+           }
+           -re ".*instream = stdin.*$gdb_prompt $" {
+               set description "step over instream initialization"
+               set command "step"
+           }
+           -re ".*getcwd .gdb_dirbuf, sizeof .gdb_dirbuf..;.*$gdb_prompt $" {
+               set description "next over getcwd"
+               set command "next"
+           }
+           -re "\[ \t\]+\{\r\n$gdb_prompt $" {
+               setup_xfail "mips-*-irix5*"
+               fail "$description ended up at odd location"
+           }
+           -re ".*main.c.*No such file or directory.*$gdb_prompt $" {
+               setup_xfail "rs6000-*-aix3*"
+               fail "must be able to list source lines"
+               return
+           }
+           -re ".*$gdb_prompt $" {
+               fail "unknown source line after $description"
+               return
+           }
+           default {
+               fail "unknown source line near main"
+               return
+           }
+       }
+       send_gdb "$command\n"
+       gdb_expect {
+           -re ".*No such file or directory.\r\n$gdb_prompt $" {
+               fail "$description (no source available)"
+           }
+           -re ".*A file or directory .* does not exist..\r\n$gdb_prompt $" {
+               fail "$description (no source available)"
+           }
+           -re ".*$gdb_prompt $" {
+               pass "$description"
+           }
+           timeout {
+               fail "$description (timeout)"
+           }
+       }
+    }
+}
+
+proc test_with_self { executable } {
+    global gdb_prompt
+    global tool
+    global det_file
+    global decimal
+    global timeout
+
+    # load yourself into the debugger
+    # This can take a relatively long time, particularly for testing where
+    # the executable is being accessed over a network, or where gdb does not
+    # support partial symbols for a particular target and has to load the
+    # entire symbol table.  Set the timeout to 10 minutes, which should be
+    # adequate for most environments (it *has* timed out with 5 min on a
+    # SPARCstation SLC under moderate load, so this isn't unreasonable).
+    # After gdb is started, set the timeout to 30 seconds for the duration
+    # of this test, and then back to the original value.
+
+    set oldtimeout $timeout
+    set timeout 600
+    verbose "Timeout is now $timeout seconds" 2
+    if {[gdb_load $executable] <0} then {
+       set timeout $oldtimeout
+       verbose "Timeout is now $timeout seconds" 2
+       return -1
+    }
+    set timeout $oldtimeout
+    verbose "Timeout is now $timeout seconds" 2
+
+    # disassemble yourself
+    gdb_test "x/10i main" \
+           "x/10i.*main.*main.$decimal.*main.$decimal.*" \
+           "Disassemble main"
+
+    # Set a breakpoint at main
+    gdb_test "break captured_main" \
+           "Breakpoint.*at.* file.*, line.*" \
+           "breakpoint in captured_main"
+
+    # We'll need this when we send a ^C to GDB.  Need to do it before we
+    # run the program and gdb starts saving and restoring tty states.
+    # On Ultrix, we don't need it and it is really slow (because shell_escape
+    # doesn't use vfork).
+    if ![istarget "*-*-ultrix*"] then {
+       gdb_test "shell stty intr '^C'" "" \
+           "set interrupt character in test_with_self"
+    }
+
+    # FIXME: If we put this after the run to main, the first list
+    # command doesn't print the same line as the current line where
+    # gdb is stopped.
+    gdb_test "set listsize 1" "" "set listsize to 1"
+
+    # run yourself
+    # It may take a very long time for the inferior gdb to start (lynx),
+    # so we bump it back up for the duration of this command.
+    set timeout 600
+
+    set description "run until breakpoint at captured_main"
+    send_gdb "run -nw\n"
+    gdb_expect {
+       -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*main.c:.*$gdb_prompt $" {
+           pass "$description"
+       }
+       -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_prompt $" {
+           xfail "$description (line numbers scrambled?)"
+       }
+       -re "vfork: No more processes.*$gdb_prompt $" {
+           fail "$description (out of virtual memory)"
+           set timeout $oldtimeout
+           verbose "Timeout is now $timeout seconds" 2
+           return -1
+       }
+       -re ".*$gdb_prompt $" {
+           fail "$description"
+           set timeout $oldtimeout
+           verbose "Timeout is now $timeout seconds" 2
+           return -1
+       }
+       timeout {
+           fail "$description (timeout)"
+       }
+    }
+
+    set timeout $oldtimeout
+    verbose "Timeout is now $timeout seconds" 2
+
+    # do we have a version number ?
+    send_gdb "print version\n"
+    gdb_expect {
+       -re ".\[0-9\]+ = .\[0-9.\]+.*$gdb_prompt $" {
+           pass "printed version as string"
+       }
+       -re ".\[0-9\]+ = +0x.*\[0-9.\]+.*$gdb_prompt $" {
+           pass "printed version as pointer"
+       }
+       -re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" {
+           pass "printed version with cast"
+       }
+       -re ".*$gdb_prompt $"   { fail "printed version" }
+       timeout         { fail "(timeout) printed version" }
+    }
+
+    do_steps_and_nexts
+
+    gdb_test "print \"foo\"" ".\[0-9\]+ = \"foo\"" "print a string"
+
+    # do_steps_and_nexts left us ready to execute an xmalloc call,
+    # so give that a try.
+    # If we don't actually enter the xmalloc call when we give a
+    # step command that seems like a genuine bug.  It seems to happen
+    # on most RISC processors.
+    # NOTE drow/2003-06-22: However, if we step back to the preceding two
+    # lines, just keep stepping until we enter.
+    set stepped_back 0
+    setup_xfail "alpha-*-*" "mips-*-*"
+    set description "step into xmalloc call"
+    send_gdb "step\n"
+    gdb_expect {
+       -re "ncmd = 0;.*$gdb_prompt $" {
+           set stepped_back 1
+           send_gdb "step\n"
+           exp_continue
+       }
+        -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" {
+           set stepped_back 1
+           send_gdb "step\n"
+           exp_continue
+        }
+       -re "dirsize = 1;.*$gdb_prompt $" {
+           set stepped_back 1
+           send_gdb "step\n"
+           exp_continue
+       }
+       -re ".*dirarg = .* xmalloc.*$gdb_prompt $" {
+           if { $stepped_back == 1 } {
+               send_gdb "step\n"
+               exp_continue
+           } else {
+               fail "$description"
+           }
+       }
+       -re "xmalloc.*size=.*at.*utils.c.*$gdb_prompt $" {
+           pass "$description"
+       }
+       -re ".*No such file or directory.\r\n$gdb_prompt $" {
+           pass "$description (no source available)"
+       }
+       -re "A file or directory .* does not exist..\r\n$gdb_prompt $" {
+           pass "$description (no source available)"
+       }
+       -re ".*$gdb_prompt $" {
+           fail "$description"
+       }
+       timeout {
+           fail "$description (timeout)"
+       }
+    }
+
+    # start the "xgdb" process
+    send_gdb "continue\n"
+    gdb_expect {
+       -re "GNU gdb \[0-9\.\]*.*
+Copyright \[0-9\]* Free Software Foundation, Inc.*
+GDB is free software, covered by the GNU General Public License, and you are.*
+welcome to change it and/or distribute copies of it under certain conditions.*
+Type \"show copying\" to see the conditions.*
+There is absolutely no warranty for GDB.  Type \"show warranty\" for details.*
+This GDB was configured as .*$gdb_prompt $"\
+           { pass "xgdb is at prompt" }
+       -re "GDB is free software and you are welcome to distribute copies of it.*
+ under certain conditions; type \"show copying\" to see the conditions..*
+There is absolutely no warranty for GDB; type \"show warranty\" for details..*
+GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
+           { pass "xgdb is at prompt (obsolescent gdb)" }
+       -re ".*$gdb_prompt $"       { fail "xgdb is at prompt" }
+       timeout             { fail "(timeout) xgdb is at prompt" }
+    }
+    
+    # set xgdb prompt so we can tell which is which
+    send_gdb "set prompt (xgdb) \n"
+    gdb_expect {
+       -re "\[(\]xgdb\[)\].*\[(\]xgdb\[)\] $"  { pass "Set xgdb prompt" }
+       -re ".*$gdb_prompt $"           { fail "Set xgdb prompt" }
+       default                         { fail "(timeout) Set xgdb prompt" }
+    }
+    
+    # kill the xgdb process
+    set description "send ^C to child process"
+    send_gdb "\003"
+    gdb_expect {
+       -re "Program received signal SIGINT.*$gdb_prompt $" {
+           pass "$description"
+       }
+       -re ".*$gdb_prompt $" {
+           fail "$description"
+       }
+       timeout {
+           fail "$description (timeout)"
+       }
+    }
+    
+    set description "send SIGINT signal to child process"
+    send_gdb "signal SIGINT\n"
+    gdb_expect {
+       -re "Continuing with signal SIGINT.*$gdb_prompt $" {
+           pass "$description"
+       }
+       -re ".*$gdb_prompt $" {
+           fail "$description"
+       }
+       timeout {
+           fail "$description (timeout)"
+       }
+    }
+    
+    # get a stack trace
+    #
+    # This fails on some linux systems for unknown reasons.  On the
+    # systems where it fails, sometimes it works fine when run manually.
+    # The testsuite failures may not be limited to just aout systems.
+    setup_xfail "i*86-pc-linuxaout-gnu"
+    set description "backtrace through signal handler"
+    send_gdb "backtrace\n"
+    gdb_expect {
+       -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
+           pass "$description"
+       }
+       -re ".*$gdb_prompt $" {
+           # On the alpha, we hit the infamous problem about gdb
+           # being unable to get the frame pointer (mentioned in
+           # gdb/README).  As it is intermittent, there is no way to
+           # XFAIL it which will give us an XPASS if the problem goes
+           # away.
+           setup_xfail "alpha*-*-osf*"
+           fail "$description"
+       }
+       timeout {
+           fail "$description (timeout)"
+       }
+    }
+
+
+    # Set the timeout back to the value it had when we were called.
+    set timeout $oldtimeout
+    verbose "Timeout is now $timeout seconds" 2
+
+    # Restart gdb in case next test expects it to be started already.
+    return 0
+}
+
+# Find a pathname to a file that we would execute if the shell was asked
+# to run $arg using the current PATH.
+
+proc find_gdb { arg } {
+
+    # If the arg directly specifies an existing executable file, then
+    # simply use it.
+
+    if [file executable $arg] then {
+       return $arg
+    }
+
+    set result [which $arg]
+    if [string match "/" [ string range $result 0 0 ]] then {
+       return $result
+    }
+
+    # If everything fails, just return the unqualified pathname as default
+    # and hope for best.
+
+    return $arg
+}
+
+# Run the test with self.
+# Copy the file executable file in case this OS doesn't like to edit its own
+# text space.
+
+set GDB_FULLPATH [find_gdb $GDB]
+
+# Remove any old copy lying around.
+remote_file host delete x$tool
+
+gdb_start
+set file [remote_download host $GDB_FULLPATH x$tool]
+set result [test_with_self $file];
+gdb_exit;
+catch "remote_file host delete $file";
+
+if {$result <0} then {
+    warning "Couldn't test self"
+    return -1
+}