# Copyright 1998, 2000, 2001 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

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

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 additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# 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 additional_flags=-w}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Start with a fresh gdb.

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

gdb_start
gdb_reinitialize_dir $srcdir/$subdir

set prms_id 13484
set bug_id 0

# 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" "" ""
after 100
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"

set prms_id 0

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
