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

standard_testfile

set gdbfile [standard_output_file ${testfile}.gdb]

# Test rereading executable.  See PR gdb/21337.

proc generate_cmd_file {gdbfile binfile} {
    set ofd [open $gdbfile w]

    puts $ofd "file ${binfile}"
    puts $ofd "shell sleep 1; touch ${binfile}"
    puts $ofd "run"
    puts $ofd "file"
    puts $ofd "file ${binfile}"
    puts $ofd "shell sleep 1; touch ${binfile}"
    puts $ofd "run"
    puts $ofd "file"
    puts $ofd "file ${binfile}"
    puts $ofd "shell sleep 1; touch ${binfile}"
    puts $ofd "run"
    puts $ofd "file"
    puts $ofd "p \"source-command-completed\""
    close $ofd
}

if [use_gdb_stub] {
    return 0
}

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

# Start with a fresh gdb.
clean_restart ${testfile}

# Using the source command to read commands from a file is important,
# otherwise section data is freed and reallocated using the same
# memory locations and the bug is not exposed.
generate_cmd_file $gdbfile $binfile

gdb_test "source $gdbfile" ".*source-command-completed.*" \
    "source $testfile.gdb 1"
# Sometimes the failure only occurs on the second invocation.
gdb_test "source $gdbfile" ".*source-command-completed.*" \
    "source $testfile.gdb 2"
