# Copyright 2005-2021 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}

set readnow_p [readnow ${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 {
    if { $readnow_p } {
	setup_kfail "gdb/26800" *-*-*
    }
    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 {
    if { $readnow_p } {
	setup_kfail "gdb/26800" *-*-*
    }
    gdb_test "" \
	"first \\(\\) at .*first.adb.*" \
	"start just first"
}
