# 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 [standard_output_file ${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 [standard_output_file ${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 [standard_output_file ${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
