#   Copyright 1988, 1990, 1991, 1992, 1994, 1997, 1999, 2000, 2002
#   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
}

if [istarget "m68k*-*-hpux*"] then {
    # The top-level makefile passes CFLAGS= (no -g) for hp300.  This probably
    # should be fixed (it is only needed for gcc bootstrapping, not gdb),
    # but until then.....
    setup_xfail "*-*-*"
    fail "cannot test self if compiled without debug info"
    return -1
}

# 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 < 26} {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 $" {
		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 ".*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 "\[ \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.
    setup_xfail "alpha-*-*" "mips-*-*"
    set description "step into xmalloc call"
    send_gdb "step\n"
    gdb_expect {
	-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
}
