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

# Test automatic endianness selection.

standard_testfile

set en_auto "The target endianness is set automatically"
set en_set "The target is set to"

clean_restart

# First check that the automatic endianness is updated
# with the `set endian' command.
gdb_test "set endian auto" \
    "$en_auto \\\(currently \(\?:big\|little\) endian\\\)\\." \
    "default target endianness"
gdb_test "set endian big" "$en_set big endian\\." \
    "set target endianness"
gdb_test "set endian auto" "$en_auto \\\(currently big endian\\\)\\." \
    "auto target endianness"
gdb_test "set endian little" "$en_set little endian\\." \
    "set target endianness little"
gdb_test "set endian auto" "$en_auto \\\(currently little endian\\\)\\." \
    "auto target endianness little"
gdb_test "set endian big" "$en_set big endian\\." \
    "set target endianness big"
gdb_test "set endian auto" "$en_auto \\\(currently big endian\\\)\\." \
    "auto target endianness big"

if { [build_executable ${testfile}.exp $testfile] } {
    untested "failed to compile"
    return
}

gdb_file_cmd $binfile

set test "get target endianness"
if { [gdb_test_multiple "show endian" "$test" {
    -re "$en_auto \\\(currently \(big\|little\) endian\\\)\\..*$gdb_prompt" {
	set endian $expect_out(1,string)
	pass "$test"
    }
}] } {
    return
}

# Now check that the automatic endianness is updated
# according to the executable selected.
gdb_unload
gdb_test "set endian big" "$en_set big endian\\." \
    "override target endianness big"
gdb_test "set endian auto" "$en_auto \\\(currently big endian\\\)\\." \
    "override auto target endianness big"

gdb_file_cmd $binfile
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
    "previously big default executable endianness"

gdb_unload
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
    "previously big default no executable endianness"
gdb_test "set endian little" "$en_set little endian\\." \
    "override target endianness little"
gdb_test "set endian auto" "$en_auto \\\(currently little endian\\\)\\." \
    "override auto target endianness little"

gdb_file_cmd $binfile
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
    "previously little default executable endianness"

gdb_unload
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
    "previously little default no executable endianness"
