# Copyright 2005, 2007, 2008, 2009, 2010 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
}

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

set testdir "exec_changed"
file mkdir ${objdir}/${subdir}/${testdir}

# Build the first test program (note that cygwin needs the $EXEEXT).
set testfile1 "${testdir}/first"
set srcfile1 ${srcdir}/${subdir}/${testfile1}.adb
set binfile1 ${objdir}/${subdir}/${testfile1}$EXEEXT

if {[gdb_compile_ada "${srcfile1}" "${binfile1}" executable {debug}] != ""} {
    return -1
}

# Build the second test program
set testfile2 "${testdir}/second"
set srcfile2 ${srcdir}/${subdir}/${testfile2}.adb
set binfile2 ${objdir}/${subdir}/${testfile2}$EXEEXT

if {[gdb_compile_ada "${srcfile2}" "${binfile2}" executable {debug}] != ""} {
    return -1
}

# Start with a fresh gdb.

set testfile "${testdir}/common"
set binfile ${objdir}/${subdir}/${testfile}$EXEEXT

gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# Load the first executable.

gdb_test "shell mv ${binfile1} ${binfile}" "" ""
gdb_load ${binfile}

# Start the program, we should land in the program main procedure
if { [gdb_start_cmd] < 0 } {
    untested start
    return -1
}

gdb_test "" \
         "first \\(\\) at .*first.adb.*" \
         "start first"

# 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" "" ""
gdb_test "shell touch ${binfile}" "" ""

# Start the program a second time, GDB should land in procedure Second
# this time.

if { [gdb_start_cmd] < 0 } {
    fail "start second"
} else {
    gdb_test "" \
             "second \\(\\) at .*second.adb.*" \
             "start second"
}
