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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
|
# Copyright 1997-2018 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/>.
# Test that GDB properly ignores invalid stabs.
# Also test that GDB can debug a .o file, and that it doesn't mind
# a file that's more minimal than what a compiler normally puts out.
set testfile weird
set srcfile [standard_output_file weird.s]
set binfile [standard_output_file weirdx.o]
if { [ get_compiler_info ] } {
return -1
}
proc do_tests {} {
global binfile
global gdb_prompt
# Mips/alpha targets that use gcc with mips-tfile put out the stabs
# assembler directives embedded in comments. If the assembler
# file is then processed with native cc, all stabs directives
# will be lost.
# Skip the rest of the stabs tests for this case.
send_gdb "ptype inttype\n"
gdb_expect {
-re "^ptype inttype\r*\ntype = inttype.*$gdb_prompt $" {
pass "stabs found"
}
-re ".*$gdb_prompt $" {
setup_xfail "mips-*-*"
setup_xfail "alpha-*-*"
fail "stabs not found"
return
}
default { fail "checking for stabs" }
}
print_weird_var var0
print_weird_var var1
print_weird_var var2
print_weird_var var3
print_weird_var attr32
print_weird_var attr33
print_weird_var attr35
print_weird_var attr36
print_weird_var attr37
print_weird_var attr38
print_weird_var attr39
print_weird_var attr41
print_weird_var attr42
print_weird_var attr43
print_weird_var attr44
print_weird_var attr46
print_weird_var attr47
print_weird_var attr58
print_weird_var attr59
print_weird_var attr60
print_weird_var attr61
print_weird_var attr62
print_weird_var attr63
print_weird_var attr64
print_weird_var attr65
print_weird_var attr66
print_weird_var attr67
print_weird_var attr68
print_weird_var attr69
print_weird_var attr70
print_weird_var attr71
print_weird_var attr72
print_weird_var attr73
print_weird_var attr74
print_weird_var attr75
print_weird_var attr76
print_weird_var attr77
print_weird_var attr78
print_weird_var attr79
print_weird_var attr80
print_weird_var attr81
print_weird_var attr82
print_weird_var attr83
print_weird_var attr84
print_weird_var attr85
print_weird_var attr86
print_weird_var attr87
print_weird_var attr88
print_weird_var attr89
print_weird_var attr90
print_weird_var attr91
print_weird_var attr92
print_weird_var attr93
print_weird_var attr94
print_weird_var attr95
print_weird_var attr96
print_weird_var attr97
print_weird_var attr98
print_weird_var attr99
print_weird_var attr100
print_weird_var attr101
print_weird_var attr102
print_weird_var attr103
print_weird_var attr104
print_weird_var attr105
print_weird_var attr106
print_weird_var attr107
print_weird_var attr108
print_weird_var attr109
print_weird_var attr110
print_weird_var attr111
print_weird_var attr112
print_weird_var attr113
print_weird_var attr114
print_weird_var attr115
print_weird_var attr116
print_weird_var attr117
print_weird_var attr118
print_weird_var attr119
print_weird_var attr120
print_weird_var attr121
print_weird_var attr122
print_weird_var attr123
print_weird_var attr124
print_weird_var attr125
print_weird_var attr126
gdb_test "p const69" " = 69" "'e' constant on non-enum type"
gdb_test "whatis const69" "type = (unsigned int|inttype)" "whatis const69"
gdb_test "p sizeof (const70)" " = 2" "'e' constant with embedded type"
gdb_test "p constchar" " = 97 'a'" "char constant"
gdb_test "p constString1" " = \"Single quote String1\"" "string constant 1"
gdb_test "p constString2" " = \"Double quote String2\"" "string constant 2"
gdb_test "p constString3" " = \"String3 with embedded quote ' in the middle\"" "string constant 3"
gdb_test "p constString4" { = "String4 with embedded quote \\" in the middle"} "string constant 4"
gdb_test "p bad_neg0" " = \{field0 = 42, field2 =.*field3 = 45\}" "p bad_neg0"
gdb_test "ptype inttype" "type = (unsigned int|inttype)" "ptype on inttype"
gdb_test "p sizeof (float72type)" " = 9" "unrecognized floating point type"
# This big number needs to be kept as one piece
gdb_test "p/x int256var" " = 0x0*2a0000002b0000002c0000002d0000002d0000002c0000002b0000002a" "print very big integer"
gdb_test "whatis consth" "type = inttype" "whatis consth"
gdb_test "whatis consth2" "type = inttype" "whatis consth2"
# GDB does not yet understand S constants
setup_xfail "*-*-*"
gdb_test "p/x bad_neg0const" " = \{field0 = 0x11222211, field2 =.*\
field3 = 0x77888877\}" "print struct constant"
gdb_test "ptype bad_type0" "type = .*" "print bad_type0"
gdb_test "ptype bad_type1" "type = .*" "print bad_type1"
# GDB does not yet support arrays indexed by anything at all unusual
setup_xfail "*-*-*"
gdb_test "p array0" " = \\{42, 43, 44, 45, 46, 47\\}" "array0 with strange index"
setup_xfail "*-*-*"
gdb_test "p array1" " = \\{42, 43, 44\\}" "array1 with strange index"
# GDB does not yet support this feature
gdb_test "whatis one_var" "type = inttype_one" \
"whatis one_var (known failure in gdb 4.10)"
# But do make sure that it prints as something reasonable
gdb_test "whatis one_var" "type = inttype(|_one)" \
"whatis one_var test 2"
gdb_test "whatis two_var" "type = inttype_two" \
"whatis two_var (known failure in gdb 4.10)"
# But do make sure that it prints as something reasonable
gdb_test "whatis two_var" "type = inttype(|_two)" \
"whatis two_var test 2"
setup_xfail "*-*-*"
gdb_test "whatis pointer_to_int_var" "type = int \[*\]"
setup_xfail "*-*-*"
gdb_test "whatis intp_var" "type = intp"
gdb_test "p common0var0" "= 42"
# GDB seems to only understand common blocks local to a function.
# These variables never get relocated to be relative to the common
# block.
# I'm not sure whether it is valid to have a common block which
# is not local to a function.
setup_xfail "*-*-*"
gdb_test "p common0var1" "= 24"
setup_xfail "*-*-*"
gdb_test "p common0var2" "= 22"
}
proc print_weird_var { var } {
global gdb_prompt
# Make sure that the variable gets printed out correctly, without
# any sort of warning message.
gdb_test_multiple "print $var" "variable $var printed property" {
-re "^print $var\r*\n.\[0-9\]* = 42.*$gdb_prompt $" {
pass "variable $var printed properly"
}
-re ".*$gdb_prompt $" {
fail "variable $var printed properly"
}
}
# Make sure that the stabs did get loaded in a sensible way.
# If somehow the stabs got skipped, then the above test can
# pass because GDB assumes int for variables without a stab.
# This doesn't work because 32=45 doesn't preserve the name in
# gdb (as of 14 Sep 93 anyway).
#gdb_test "whatis $var" "type = (unsigned int|inttype)"
# But the size should be right.
gdb_test "print sizeof ($var)" "= 4"
}
# Don't use gdb_load; it doesn't bitch if the loading produced some
# error messages during symbol reading.
global target_os
set sedscript ${srcdir}/${subdir}/aout.sed
set sedoptions ""
switch -glob ${target_triplet} {
"hppa*-*-*" {
set sedscript ${srcdir}/${subdir}/hppa.sed
}
"mips-*-ecoff" {
set sedscript ${srcdir}/${subdir}/ecoff.sed
}
"powerpc-*-aix*" {
set sedscript ${srcdir}/${subdir}/xcoff.sed
set sedoptions "-r"
}
"rs6000-*-aix*" {
set sedscript ${srcdir}/${subdir}/xcoff.sed
set sedoptions "-r"
}
"*-*-aout" {
set sedscript ${srcdir}/${subdir}/aout.sed
}
"*-*-xcoff" {
set sedscript ${srcdir}/${subdir}/xcoff.sed
set sedoptions "-r"
}
"alpha-*-*" {
set sedscript ${srcdir}/${subdir}/ecoff.sed
}
}
# Hope this is a Unix box.
set exec_output [remote_exec build "sed" "${sedoptions} -f ${sedscript}" "${srcdir}/${subdir}/weird.def" "${srcfile}"]
if { [lindex $exec_output 0] != 0 } {
perror "Couldn't make test case. $exec_output"
return -1
}
if { [gdb_compile "${srcfile}" "${binfile}" object ""] != "" } {
untested "failed to compile"
return -1
}
remote_file build delete ${srcfile}
# Start with a fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
set binfile [gdb_remote_download host ${binfile} \
[standard_output_file object.o]]
set binfile_re [string_to_regexp $binfile]
send_gdb "file $binfile\n"
# If $binfile is very long, a \r (but not a \n) will echo in the
# middle of the echo of the command. So to match the echo, we
# would like to match anything not containing \n
# (we would prefer to be sure not to match any warning message).
# But \[^\n\]* doesn't seem to work, so instead use the heuristic
# that a filename won't contain a space and a warning message will.
# But spaces following by backspaces aren't really spaces.
gdb_expect 60 {
-re "^file (\[^ \]| +\008)*\r*\n" {
exp_continue
}
-re "A program is being debugged already.\[\r\n\]+Are you sure you want to change the file\\? \\(y or n\\)" {
send_gdb "y\n"
exp_continue
}
-re "^Reading symbols from .*$binfile_re\\.\\.\\.done\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)\r\n$gdb_prompt $" {
pass "weirdx.o read without error"
}
-re ".*$gdb_prompt $" {
fail "errors reading weirdx.o"
}
timeout {
perror "couldn't load $binfile into $GDB (timed out)."
return -1
}
eof { fail "(eof) cannot read weirdx.o" }
}
do_tests
return 0
|