# Copyright 2005-2025 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"

require allow_ada_tests

# This testcase verifies the behavior of the `start' command, which
# does not work when we use the gdb stub...
require !use_gdb_stub

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}" "" \
    "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 } {
    fail 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}" "" \
    "shell mv \${common_binfile} \${binfile}"
gdb_test "shell mv ${binfile2} ${common_binfile}" "" \
    "shell mv \${binfile2} \${common_binfile}"
gdb_test "shell sleep 1" "" "shell sleep 1, once"
gdb_test "shell touch ${common_binfile}" "" \
    "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 accidentally 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" "" \
    "shell touch \${binfile}\$EXEEXT"
gdb_test "shell sleep 1" "" "shell sleep 1, twice"

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