# Copyright 2005-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/>.

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

# This testcase verifies the behavior of the `start' command, which
# does not work when we use the gdb stub...
if [use_gdb_stub] {
    untested "skipping tests due to use_gdb_stub"
    return
}

standard_ada_testfile first

# Build the first test program (note that cygwin needs the $EXEEXT).
if {[gdb_compile_ada "${srcfile}" "${binfile}$EXEEXT" executable {debug}] != ""} {
    return -1
}

# Build the second test program
set srcfile2 ${srcdir}/${subdir}/${testdir}/second.adb
set binfile2 [standard_output_file second$EXEEXT]

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

# Start with a fresh gdb.

set common_binfile [standard_output_file common$EXEEXT]

gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# Load the first executable.

gdb_test "shell mv ${binfile} ${common_binfile}" ".*" ""
gdb_load ${common_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 ${common_binfile} ${binfile}" ".*" ""
gdb_test "shell mv ${binfile2} ${common_binfile}" ".*" ""
gdb_test "shell sleep 1" ".*" ""
gdb_test "shell touch ${common_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"
}

# Try again, this time with just changing the file time of first.

clean_restart "${binfile}$EXEEXT"

# Ensure we don't accidently use the main symbol cache.
gdb_test_no_output "mt set symbol-cache-size 0"

# Put something in the symbol lookup cache that will get looked up when
# starting after having re-read symbols.  PR 17855.
gdb_breakpoint break_me

gdb_test "shell touch ${binfile}$EXEEXT" ".*" ""
gdb_test "shell sleep 1" ".*" ""

if { [gdb_start_cmd] < 0 } {
    # PR 17855: At this point gdb may have crashed or gotten an internal
    # error, but we still need to detect this.  Just issue any simple command
    # to verify gdb is still running.  This will establish in gdb.log whether
    # gdb is still running.
    gdb_test_no_output "set \$check_gdb_running = 0" "check gdb running"
    fail "start just first"
} else {
    gdb_test "" \
	"first \\(\\) at .*first.adb.*" \
	"start just first"
}
