# Copyright 2005 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

if $tracelevel then {
	strace $tracelevel
}

load_lib "ada.exp"

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 [list 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 [list 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
gdb_test "start" \
         "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}" "" ""

# Stop GDB from asking confirmations. This test will restart the program
# and we don't need GDB to ask us to confirm that we want to kill the
# current process.
gdb_test "set confirm off" "" ""

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

if [is_remote target] {
    unsupported "start the program a second time ";
} else {
    # Start the program, we should land in the program main procedure
    gdb_test "start" \
             "second \\(\\) at .*second.adb.*" \
             "start second"
}

