# Copyright (C) 2018-2026 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 "unload 1"
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 "unload 2"
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 "unload 3"
gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
    "previously little default no executable endianness"
