# Copyright 2007, 2008, 2009, 2010, 2011 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-regs.exp"
    return -1
}

gdb_start

# To test adding registers, we need a core set of registers for this
# architecture, or the description will be rejected.

set core-regs ""
set regdir ""
set architecture ""
switch -glob -- [istarget] {
    "arm*-*-*" {
        set core-regs {arm-core.xml}
    }
    "*m68k-*-*" {
        set core-regs {m68k-core.xml}
    }
    "mips*-*-*" {
	set core-regs {mips-cpu.xml mips-cp0.xml mips-fpu.xml}
    }
    "powerpc*-*-*" {
	set regdir "rs6000/"
	set core-regs {power-core.xml}
    }
    "s390*-*-*" {
	set core-regs {s390-core32.xml s390-acr.xml s390-fpr.xml}
    }
    "spu*-*-*" {
	# This may be either the spu-linux-nat target, or the Cell/B.E.
	# multi-architecture debugger in SPU standalone executable mode.
	# We do not support XML register sets on SPU in either case.
	# However, the multi-arch debugger will accept XML registers sets
	# (on the PowerPC side), hence the test below would fail.
	# Simply return unconditionally here.
	unsupported "register tests"
	return 0
    }
    "i?86-*-*" {
	set architecture "i386"
	set regdir "i386/"
        set core-regs {32bit-core.xml 32bit-sse.xml}
    }
    "x86_64-*-*" {
	set architecture "i386:x86-64"
	set regdir "i386/"
        set core-regs {64bit-core.xml 64bit-sse.xml}
    }
}

# If no core registers were specified, assume this target does not
# support target-defined registers.  Verify that we get a warning if
# we try to use them.  This not only tests the warning, but also
# reminds maintainers to add test support when they add the feature.
if {[string equal ${core-regs} ""]} {
    gdb_test "set tdesc file $srcdir/$subdir/single-reg.xml" \
	"warning: Target-supplied registers are not supported.*" \
	"set tdesc file single-reg.xml"
    unsupported "register tests"
    return 0
}

# Otherwise, we support both XML and target defined registers.

# Make sure we reject a description missing standard registers,
# like the PC.
gdb_test "set tdesc file $srcdir/$subdir/single-reg.xml" \
    "warning: Architecture rejected target-supplied description" \
    "set tdesc file single-reg.xml"

# Copy the core registers into the objdir if necessary, so that they
# will be found by <xi:include>.
foreach src ${core-regs} {
    set file [remote_download host "$srcdir/../features/$regdir$src" "$src"]
}

# Similarly, we need to copy files under test into the objdir.
proc load_description { file errmsg } {
    global srcdir
    global subdir
    global gdb_prompt
    global core-regs
    global architecture

    file delete "$subdir/regs.xml"
    set ifd [open "$srcdir/$subdir/$file" r]
    set ofd [open "$subdir/regs.xml" w]
    while {[gets $ifd line] >= 0} {
	if {[regexp {<xi:include href="core-regs.xml"/>} $line]} {
	    if {! [string equal ${architecture} ""]} {
		puts $ofd "  <architecture>${architecture}</architecture>"
	    }
	    foreach src ${core-regs} {
		puts $ofd "  <xi:include href=\"$src\"/>"
	    }
	} else {
	    puts $ofd $line
	}
    }
    close $ifd
    close $ofd
    remote_download host "$subdir/regs.xml" "regs.xml"
    file delete "$subdir/regs.xml"

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename regs.xml"
    set msg "set tdesc filename regs.xml - from $file"
    set cmd_regex [string_to_regexp $cmd]
    gdb_test_multiple $cmd $msg {
	-re "^$cmd_regex\r\n$errmsg$gdb_prompt $" {
	    pass $msg
	}
    }
    remote_file host delete "regs.xml"
}

load_description "extra-regs.xml" ""
gdb_test "ptype \$extrareg" "type = (int|long|long long)"
gdb_test "ptype \$uintreg" "type = uint32_t"
gdb_test "ptype \$vecreg" "type = int8_t \\\[4\\\]"
gdb_test "ptype \$unionreg" \
    "type = union {\r\n *v4int8 v4;\r\n *v2int16 v2;\r\n}"
gdb_test "ptype \$unionreg.v4" "type = int8_t \\\[4\\\]"
gdb_test "ptype \$structreg" \
    "type = struct struct1 {\r\n *v4int8 v4;\r\n *v2int16 v2;\r\n}"
gdb_test "ptype \$structreg.v4" "type = int8_t \\\[4\\\]"
gdb_test "ptype \$bitfields" \
    "type = struct struct2 {\r\n *uint64_t f1 : 35;\r\n *uint64_t f2 : 1;\r\n}"

load_description "core-only.xml" ""
# The extra register from the previous description should be gone.
gdb_test "ptype \$extrareg" "type = void"

foreach src ${core-regs} {
    remote_file host delete "$src"
}
