# Copyright 2007-2012 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 mips-dsp.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
    }
    "tic6x-*-*" {
	set core-regs {tic6x-core.xml}
    }
    "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"
}
