# Copyright (C) 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 automatic endianness selection.

standard_testfile

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

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] } {
    gdb_suppress_entire_file "$pf_prefix cannot build executable"
}

if { [gdb_file_cmd $binfile] } {
    gdb_suppress_entire_file "$pf_prefix cannot select executable"
}
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"
    }
}] } {
    gdb_suppress_entire_file \
	"$pf_prefix cannot determine executable endianness"
    set endian ""
}

# Now check that the automatic endianness is updated
# according to the executable selected.
if { [gdb_unload] } {
    gdb_suppress_entire_file "$pf_prefix cannot unselect executable"
}
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"
if { [gdb_file_cmd $binfile] } {
    gdb_suppress_entire_file "$pf_prefix cannot select executable"
}
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)" \
    "previously big default executable endianness"
if { [gdb_unload] } {
    gdb_suppress_entire_file "$pf_prefix cannot unselect executable"
}
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"
if { [gdb_file_cmd $binfile] } {
    gdb_suppress_entire_file "$pf_prefix cannot select executable"
}
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)" \
    "previously little default executable endianness"
if { [gdb_unload] } {
    gdb_suppress_entire_file "$pf_prefix cannot unselect executable"
}
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)" \
    "previously little default no executable endianness"
