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