# Copyright 1998, 2000, 2001, 2007, 2008, 2009, 2010
# 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 3 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, see <http://www.gnu.org/licenses/>.

if $tracelevel then {
	strace $tracelevel
}

set prototypes 1

# build the first test case

set testfile1 "reread1"
set srcfile1 ${testfile1}.c
# Cygwin needs $EXEEXT.
set binfile1 ${objdir}/${subdir}/${testfile1}$EXEEXT

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable {debug nowarnings}] != "" } {
    untested reread.exp
    return -1
}

# build the second test case

set testfile2 "reread2"
set srcfile2 ${testfile2}.c
set binfile2 ${objdir}/${subdir}/${testfile2}$EXEEXT

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug nowarnings}] != "" } {
    untested reread.exp
    return -1
}

# Start with a fresh gdb.

set testfile "reread"
set binfile ${objdir}/${subdir}/${testfile}$EXEEXT

gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# Load the first executable.

gdb_test "shell mv ${binfile1} ${binfile}" ".*" ""
gdb_load ${binfile}

# Set a breakpoint at foo

gdb_test "break foo" \
    "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
    "breakpoint foo in first file"


# Run, should see "Breakpoint 1, foo () at hello1.c:14"

gdb_run_cmd

gdb_expect {
    -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $"  {
	pass "run to foo()";
    }
    -re ".*$gdb_prompt $" {
	fail "run to foo()";
	gdb_suppress_tests;
    }
    timeout { fail "run to foo() (timeout)" ; gdb_suppress_tests }
}

# Restore first executable to its original name, and move
# second executable into its place.  Ensure that the new
# executable is at least a second newer than the old.

gdb_test "shell mv ${binfile} ${binfile1}" ".*" ""
gdb_test "shell mv ${binfile2} ${binfile}" ".*" ""
gdb_test "shell sleep 1" ".*" ""
gdb_test "shell touch ${binfile}" ".*" ""

# Run a second time; GDB should detect that the executable has changed
# and reset the breakpoints correctly.
# Should see "Breakpoint 1, foo () at reread2.c:9"

if [is_remote target] {
    unsupported "run to foo() second time ";
} else {
    gdb_run_cmd
    gdb_expect {
	#    -re ".*re-reading symbols.*Breakpoint.* foo .* at .*$srcfile2:9.*$gdb_prompt $" {}
	-re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
	    pass "run to foo() second time ";
	}
	-re ".*$gdb_prompt $" {
	    fail "run to foo() second time";
	    gdb_suppress_tests;
	}
	timeout { 
	    fail "run to foo() second time (timeout)" ; 
	    gdb_suppress_tests 
	}
    }
}


### Second pass: verify that GDB checks the executable file's
### timestamp when the program is *restarted*, not just when it exits.

if [is_remote target] {
    unsupported "second pass: GDB should check for changes before running"
} else {

    # Put the older executable back in place.
    gdb_test "shell mv ${binfile} ${binfile2}" ".*" ""
    gdb_test "shell mv ${binfile1} ${binfile}" ".*" ""

    # Restart GDB entirely.
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${binfile}

    # Set a breakpoint on foo and run to it.
    gdb_test "break foo" \
            "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
            "second pass: breakpoint foo in first file"
    gdb_run_cmd
    gdb_expect {
        -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $"  {
            pass "second pass: run to foo()";
        }
        -re ".*$gdb_prompt $" {
            fail "second pass: run to foo()";
            gdb_suppress_tests;
        }
        timeout {
            fail "second pass: run to foo() (timeout)"
            gdb_suppress_tests
        }
    }

    # This time, let the program run to completion.  If GDB checks the
    # executable file's timestamp now, it won't notice any change.
    gdb_test "continue" ".*Program exited.*" \
            "second pass: continue to completion"
    
    # Now move the newer executable into place, and re-run.  GDB
    # should still notice that the executable file has changed,
    # and still re-set the breakpoint appropriately.
    gdb_test "shell mv ${binfile} ${binfile1}" ".*" ""
    gdb_test "shell mv ${binfile2} ${binfile}" ".*" ""
    gdb_run_cmd
    gdb_expect {
	-re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
	    pass "second pass: run to foo() second time ";
	}
	-re ".*$gdb_prompt $" {
	    fail "second pass: run to foo() second time";
	    gdb_suppress_tests;
	}
	timeout { 
	    fail "second pass: run to foo() second time (timeout)" ; 
	    gdb_suppress_tests 
	}
    }
}

# End of tests.

gdb_stop_suppressing_tests

return 0
