aboutsummaryrefslogtreecommitdiff
blob: ac38436efbf558a644ebd237b3607de16a1eb826 (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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# This test script is part of GDB, the GNU debugger.

# Copyright 1998, 1999, 2001, 2004 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/>.  */

# Tests of wide register displays for GDB on HPPA 2.0 machines

# use this to debug:
#log_user 1

if $tracelevel then {
	strace $tracelevel
	}

if { [skip_hp_tests] } then { continue }

set testfile "reg"

if [istarget "hppa64-hp-hpux*"] {
    verbose "reg.exp is not for PA2.0W."
    return 0
}
set srcfile ${testfile}.s
set binfile ${objdir}/${subdir}/${testfile}

# To build a pa 2.0 executable
#
#     as -o reg reg.s
# or 
#     cc -g -o reg reg.s
#
# The +DA2.0N flag doesn't seem to be needed.
#
# Don't reject if there are warnings, as we expect this warning:
#
#    (Warning) At least one PA 2.0 object file (pa2.0_test2.o) was detected.
#    The linked output may not run on a PA 1.x system.
#

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested reg.exp
     return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# test machine--there's no 2.0n architecture, so we have
# to try to run the app.
#
send_gdb "break main\n"
    gdb_expect {
        -re "Breakpoint.*$gdb_prompt $" {
            pass "initial set-up"
        }
        -re ".*$gdb_prompt $" {
            fail "initial set-up"
        }
        timeout {
            fail "initial set-up (timeout)"
        }
    }

send_gdb "run\n"
    gdb_expect {
        -re ".*Executable file incompatible with hardware.*$gdb_prompt $" {
            # Not hppa2.0 machine
            #
            return 0
        }
        -re "Cannot exec.*$gdb_prompt $" {
            # Not hppa2.0 machine
            #
            return 0
        }
        -re ".*Starting program:.*$gdb_prompt $" {
            pass "Ready to start test"
        }
        timeout {
            fail "initial set-up, part 2 (timeout)"
            return 0
        }
    }

# Let the program set known values.  This secretly deletes
# the breakpoint at main and re-runs to mainend.
#
runto mainend

# Look for known values
#
# The output format changed between gdb 6.1.1 and gdb HEAD 2004-06-01.
#
#   gdb 6.1.1:
#   (gdb) info reg r1
#   r1 1
#
#   gdb HEAD 2004-06-01:
#   (gdb) info reg r1
#   r1             0x1     1
#
# For now, I accept both formats.  In the future, you can remove
# the old gdb 6.1.1 format.
#
# -- chastain 2004-06-26

set ws "\[\r\n\t \]+"

proc hp_integer_reg {regname vhex vdec} {
  global ws
  set value_611 "$regname${ws}$vhex"
  set value_new "$regname${ws}0x$vhex${ws}$vdec"
  gdb_test "info reg $regname" "$value_611|$value_new"
}

hp_integer_reg "r1"      "1"     "1"
hp_integer_reg "r4"      "2"     "2"
hp_integer_reg "r5"      "4"     "4"
hp_integer_reg "r6"      "8"     "8"
hp_integer_reg "r7"     "10"    "16"
hp_integer_reg "r8"     "20"    "32"
hp_integer_reg "r9"     "40"    "64"
hp_integer_reg "r10"    "80"   "128"
hp_integer_reg "r11"   "100"   "256"
hp_integer_reg "r12"   "200"   "512"
hp_integer_reg "r13"   "400"  "1024"
hp_integer_reg "r14"   "800"  "2048"
hp_integer_reg "r15"  "1000"  "4096"
hp_integer_reg "r16"  "2000"  "8192"

# Two odd variants that GDB supports are:
#   "1" means "r1", and
#   "$1" means "r1"

hp_integer_reg "1" "1" "1"
hp_integer_reg "4" "2" "2"

set name "info reg \$1"
gdb_test_multiple "info reg \$1" "$name" {
    -re "r1${ws}1\r\n$gdb_prompt $" {
	pass "$name"
    }
    -re "r1${ws}0x1${ws}1\r\n$gdb_prompt $" {
	pass "$name"
    }
}

# Verify that GDB responds gracefully to a register ID number that
# is out of range.

gdb_test "info reg 999" "Invalid register.*999.*"

# Make sure the floating point status and error registers
# don't show up as floating point numbers!

hp_integer_reg "fpsr" "0" "0"
hp_integer_reg "fpe1" "0" "0"
hp_integer_reg "fpe2" "0" "0"
hp_integer_reg "fpe3" "0" "0"
hp_integer_reg "fpe4" "0" "0"
hp_integer_reg "fpe5" "0" "0"
hp_integer_reg "fpe6" "0" "0"
hp_integer_reg "fpe7" "0" "0"

# Floating point registers.
# TODO: these are old format only.

gdb_test "info reg fr4"  ".*fr4.*(double precision).* 1"
gdb_test "info reg fr5"  ".*fr5.*(double precision).* 2"
gdb_test "info reg fr6"  ".*fr6.*(double precision).* 2"
gdb_test "info reg fr7"  ".*fr7.*(double precision).* 4"
gdb_test "info reg fr8"  ".*fr8.*(double precision).* 8"
gdb_test "info reg fr9"  ".*fr9.*(double precision).* 32"
gdb_test "info reg fr10" ".*fr10.*(double precision).* 256"

# An integer register with a 64-bit value.

set name "info reg r19"
gdb_test_multiple "info reg r19" "$name" {
    -re "r19${ws}deadbeefbadcadee\r\n$gdb_prompt $" {
	# old gdb 6.1.1 format, good result
	pass "$name"
    }
    -re "r19${ws}badcadee\r\n$gdb_prompt $" {
	# old gdb 6.1.1 format, bad result
	fail "$name (32-bit truncation)"
    }
    -re "r19${ws}0xdeadbeefbadcadee${ws}16045690984232431086\r\n$gdb_prompt $" {
	# new gdb HEAD 2004-06-01 format, good result
	pass "$name"
    }
    -re "r19${ws}0xbadcadee${ws}3135024622\r\n$gdb_prompt $" {
	# new gdb HEAD 2004-06-01 format, 32 bit truncation
	fail "$name (32-bit truncation)"
    }
}

set name "print /x \$r19"
gdb_test_multiple "print /x \$r19" "$name" {
    -re "= 0xdeadbeefbadcadee\r\n$gdb_prompt $" {
	pass "$name"
    }
    -re "= 0xbadcadee\r\n$gdb_prompt $" {
	# this was a PASS in the last version so keep it PASS for now
	# -- chastain 2004-06-26
	pass "$name (32-bit truncation)"
    }
}

# Need to add tests of setting wide regs too.  E.g.
#
# set $r4 = 0x1234567890123456
# p/x $r4
#

# done
#
gdb_exit

return 0