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

if {[gdb_skip_xml_test]} {
    unsupported "tdesc-arch.exp"
    return -1
}

gdb_start

# Find some valid architectures - we just need legitimate values
# to put in our <architecture> elements.
set arch1 ""
set arch2 ""
set msg "read valid architectures"
gdb_test_multiple "set architecture" $msg {
    -re "Requires an argument. Valid arguments are (\[^ \]*), (\[^ \]*), .*auto\\.\r\n$gdb_prompt $" {
	set arch1 $expect_out(1,string)
	set arch2 $expect_out(2,string)
	pass $msg
    }
    -re "Requires an argument. Valid arguments are (\[^ \]*), auto\\.\r\n$gdb_prompt $" {
	# If there is just one supported architecture, we can't do this test.
	unsupported "tdesc-arch.exp"
	return -1
    }
}

set default_arch ""
set msg "read default architecture"
gdb_test_multiple "show architecture" $msg {
    -re "The target architecture is set automatically \\(currently (\[^ \]*)\\)\r\n$gdb_prompt $" {
	set default_arch $expect_out(1,string)
	pass $msg
    }
}

# If that did not work, no point running further tests.
if { "$arch1" == "" || "$arch2" == "" || "$default_arch" == "" } {
    unresolved "architecture XML tests"
    return -1
}

# Run these tests twice, once for $arch1 and once for $arch2, to
# make sure that the tdesc file overrides the global default.

proc set_arch { arch which } {
    global gdb_prompt
    global subdir

    set filename [standard_output_file tdesc-arch.xml]
    set fd [open $filename w]
    puts $fd \
	"<target>
	    <architecture>$arch</architecture>
	 </target>"
    close $fd
    if {[is_remote host]} {
	set filename [remote_download host $filename tdesc-arch.xml]
    }

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename $filename"
    set msg "set tdesc filename tdesc-arch.xml ($which architecture)"
    set cmd_regex [string_to_regexp $cmd]
    gdb_test_multiple $cmd $msg {
	-re "^$cmd_regex\r\n$gdb_prompt $" {
	    pass $msg
	}
	-re "^$cmd_regex\r\nwarning: A handler for the OS ABI.*\r\n$gdb_prompt $" {
	    kfail gdb/2225 $msg
	}
    }

    set cmd "show architecture"
    gdb_test $cmd \
	"The target architecture is set automatically \\(currently $arch\\)" \
	"$cmd ($which architecture)"

    remote_file host delete $filename
}

set_arch $arch1 first
set_arch $arch2 second

# Check an invalid architecture setting.
set filename [standard_output_file tdesc-arch.xml]
set fd [open $filename w]
puts $fd \
    "<target>
       <architecture>invalid</architecture>
     </target>"
close $fd
if {[is_remote host]} {
    set filename [remote_download host $filename "tdesc-arch.xml"]
}

set cmd "set tdesc filename $filename"
gdb_test $cmd \
    "warning:.*Target description specified unknown architecture.*" \
    "set tdesc filename tdesc-arch.xml (invalid architecture)"

set cmd "show architecture"
gdb_test $cmd \
    "The target architecture is set automatically \\(currently $default_arch\\)" \
    "$cmd (invalid architecture)"

remote_file host delete $filename
