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

# Test the "load" command.

standard_testfile

# Disable generation of position independent executable (PIE).  Otherwise, we
# would have to manually specify an offset to load.

set opts {debug ldflags=-no-pie}

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

if ![runto_main] {
    fail "can't run to main"
    return -1
}

# The native target does not support the load command.
if [gdb_is_target_native] {
    unsupported "the native target does not support the load command"
    return
}

# Manually change the value of the_variable.
gdb_test "print/x the_variable" " = 0x1234" "check initial value of the_variable"
gdb_test_no_output "set the_variable = 0x5555" "manually change the_variable"
gdb_test "print/x the_variable" " = 0x5555" "check manually changed value of the_variable"

# Re-load the binary using the load command.
gdb_test "load ${binfile}" ".*Loading section .data.*Transfer rate:.*" "re-load binary"

# Re-loading the binary should have reset the variable value.
gdb_test "print/x the_variable" " = 0x1234" "check initial value of the_variable"
