# Copyright 1998-2020 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 programs in PIE mode, to reproduce PR 21555.
foreach_with_prefix opts {
    { "" "" }
    { "-fPIE" "ldflags=-pie" } } {

	# build the first test case

	set testfile1 "reread1"
	set srcfile1 ${testfile1}.c
	# Cygwin needs $EXEEXT.
	set binfile1 [standard_output_file ${testfile1}$EXEEXT]

	set testfile1_opt [list debug nowarnings \
			       additional_flags=[lindex $opts 0] \
			       [lindex $opts 1] ]
	if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" \
		   executable ${testfile1_opt}] != "" } {
	    untested "failed to compile first testcase"
	    return -1
	}

	# build the second test case

	set testfile2 "reread2"
	set srcfile2 ${testfile2}.c
	set binfile2 [standard_output_file ${testfile2}$EXEEXT]

	set testfile2_opt1 [list debug nowarnings \
				additional_flags=[lindex $opts 0] \
				[lindex $opts 1]]
	set testfile2_op2 [list debug nowarnings \
			       "additional_flags=-DNO_SECTIONS [lindex $opts 0]" \
			       [lindex $opts 1]]
	if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" \
		   executable ${testfile2_opt1}] != ""
	      && [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" \
		      executable ${testfile2_opt2}] != ""} {
	    untested "failed to compile second testcase"
	    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_test "" "Breakpoint.* foo .* at .*$srcfile1:14.*" "run to foo()"

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

	set test "run to foo() second time"
	if [is_remote target] {
	    unsupported $test
	} else {
	    gdb_run_cmd
	    gdb_test "" "Breakpoint.* foo .* at .*:9.*" $test
	}


	### 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.
	    clean_restart ${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_test "" "Breakpoint.* foo .* at .*$srcfile1:14.*" \
		"second pass: run to foo()"

	    # 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_test "" "Breakpoint.* foo .* at .*:9.*" \
		"second pass: run to foo() second time"
	}

    }
# End of tests.

return 0
