aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.xml/tdesc-regs.exp
blob: 35d85417b4f07c577212b460a3d35c727f84fa58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# 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}
    }
    "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"
}