aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.xml/tdesc-regs.exp
blob: 8f0eb4192a3d8fd063014443eba3a527a84954e8 (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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# Copyright 2007-2015 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}
    }
    "nios2-*-*" {
	set core-regs {nios2-cpu.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.

set single_reg_xml [gdb_remote_download host  \
			"$srcdir/$subdir/single-reg.xml"]

if {[string equal ${core-regs} ""]} {
    gdb_test "set tdesc file $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 $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 remote_filename($src) \
	[gdb_remote_download host "$srcdir/../features/$regdir$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
    global remote_filename

    set regs_file [standard_output_file regs.xml]

    file delete $regs_file
    set ifd [open "$srcdir/$subdir/$file" r]
    set ofd [open $regs_file 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

    if {[is_remote host]} {
	set regs_file [remote_download host "$subdir/regs.xml" "regs.xml"]
    }

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename [file tail $regs_file]"
    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
	}
    }

    if {[is_remote host]} {
	remote_file host delete "regs.xml"
    }
}

if {![is_remote host]} {
    gdb_test "cd [standard_output_file {}]" "Working directory .*" \
	"cd to directory holding 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 __attribute__ \\(\\(vector_size\\(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 __attribute__ \\(\\(vector_size\\(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 __attribute__ \\(\\(vector_size\\(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"