aboutsummaryrefslogtreecommitdiff
blob: 3f1345ef8150af9709a8ab81f7464ff445ed02bd (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
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
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
# Copyright 1997, 1998, 1999, 2001, 2003, 2004, 2006, 2007, 2008, 2009, 2010
# 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.
if $tracelevel then {
	strace $tracelevel
}

# If the test directory was not created by configure then skip
# this test.
if ![file isdirectory ${objdir}/${subdir}] then {
    return 0
}


set testfile weird
set srcfile ${objdir}/${subdir}/weird.s
set binfile ${objdir}/${subdir}/weirdx.o

if { [ get_compiler_info "$binfile" ] } {
    return -1
}

if { $hp_cc_compiler || $hp_aCC_compiler } {
    # The native hp-ux assembler does not support stabs at all.
    # If the compiler is native hp-ux, of course the assembler is too.
    # But if someone builds gcc with the native assembler (not recommended)
    # rather than the gnu assembler, then this logic will not suppress it.
    # -- chastain 2004-01-07
    unsupported "stabs with hp-ux assembler"
    continue
}

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 weird.exp
     return -1
}

remote_file build delete ${srcfile}

# Start with a fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

set binfile [remote_download host ${binfile} object.o]
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\\.\\.\\.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

remote_file host delete ${binfile}

return 0