# Copyright 1998, 2000, 2001, 2007, 2008, 2009, 2010, 2011
# 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_rename_execfile ${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_rename_execfile ${binfile} ${binfile1}
gdb_rename_execfile ${binfile2} ${binfile}
gdb_test "shell sleep 1" ".*" ""
gdb_touch_execfile ${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_rename_execfile ${binfile} ${binfile2}
    gdb_rename_execfile ${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_continue_to_end "second pass"
    
    # 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_rename_execfile ${binfile} ${binfile1}
    gdb_rename_execfile ${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
