# Copyright 1998-2013 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/>.

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}] != ""
      && [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug nowarnings additional_flags=-DNO_SECTIONS}] != ""} {
    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
