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
|
# Copyright (C) 1992, 1994 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 2 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, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu
# This file was written by Fred Fish. (fnf@cygnus.com)
if $tracelevel then {
strace $tracelevel
}
set prms_id 0
set bug_id 0
set binfile "opaque"
set srcfile $binfile.c
if ![file exists $objdir/$subdir/$binfile] then {
perror "$objdir/$subdir/$binfile does not exist."
return 0
}
# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $objdir/$subdir/$binfile
source gdb.base/opaque-info.exp
#
# Test basic opaque structure handling (statically).
# The ordering of the tests is significant. We first try the things that
# might fail if gdb fails to connect the uses of opaque structures to
# the actual opaque structure definition.
# When we start up, gdb sets the file containing main() as the current
# source file. The actual structure foo is defined in a different file.
# A pointer (foop) to an instance of the opaque struct is defined in the same
# source file as main(). Ensure that gdb correctly "connected" the definition
# in the other file with the pointer to the opaque struct in the file containing
# "foop".
# Define a procedure to set up an xfail for all targets that do not support
# this sort of cross reference.
# Any target gcc that has a DBX_NO_XREFS definition in its config file will
# not support it.
# XCOFF does not seem to support it either. See the very end of gcc/xcoffout.h.
# Native alpha ecoff doesn't support it either.
# I don't think this type of cross reference works for any COFF target
# either.
proc setup_xfail_on_opaque_pointer {} {
global gcc_compiled
setup_xfail "rs6000-*-*" "a29k-*-udi" "vax-*-*" "i*86-sequent-bsd*"
if {!$gcc_compiled} then {
setup_xfail "alpha-*-*"
}
}
setup_xfail_on_opaque_pointer
send "whatis foop\n"
expect {
-re "whatis foop\r
type = struct foo \[*\]+\r
$prompt $" { pass "whatis on opaque struct pointer (statically)"}
-re ".*$prompt $" { fail "whatis on opaque struct *" }
timeout { fail "(timeout) whatis on opaque struct *" }
}
# Ensure that we know the form of the structure that foop points to.
setup_xfail_on_opaque_pointer
send "ptype foop\n"
expect {
-re "ptype foop\r
type = struct foo \{\r
int a;\r
int b;\r
\} \[*\]+\r
$prompt $" { pass "ptype on opaque struct pointer (statically)" }
-re ".*$prompt $" { fail "ptype on opaque struct *" }
timeout { fail "(timeout) ptype on opaque struct *" }
}
# An instance of the opaque structure (afoo) is defined in a different file.
# Ensure that we can locate afoo and the structure definition.
send "whatis afoo\n"
expect {
-re "whatis afoo\r
type = struct foo\r
$prompt $" { pass "whatis on opaque struct instance (statically)" }
-re ".*$prompt $" { fail "whatis on opaque struct" }
timeout { fail "(timeout) whatis on opaque struct" }
}
# Ensure that we know the form of "afoo".
send "ptype afoo\n"
expect {
-re "ptype afoo\r
type = struct foo \{\r
int a;\r
int b;\r
\}\r
$prompt $" { pass "ptype on opaque struct instance (statically)" }
-re ".*$prompt $" { fail "ptype on opaque struct instance" }
timeout { fail "(timeout) ptype on opaque struct" }
}
# Ensure that we know what a struct foo looks like.
send "ptype struct foo\n"
expect {
-re "ptype struct foo\r
type = struct foo \{\r
int a;\r
int b;\r
\}\r
$prompt $" { pass "ptype on opaque struct tagname (statically)" }
-re ".*$prompt $" { fail "ptype on opaque struct" }
timeout { fail "(timeout) ptype on opaque struct" }
}
#
# Done with static tests, now test dynamic opaque structure handling.
# We reload the symbol table so we forget about anything we might
# have learned during the static tests.
#
if [istarget "mips-idt-*"] then {
# Restart because IDT/SIM runs out of file descriptors.
gdb_exit
gdb_start
}
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $objdir/$subdir/$binfile
# Run to main, where struct foo is incomplete.
if ![runto main] {
perror "cannot run to breakpoint at main"
}
# The current source file is now the one containing main(). The structure foo
# is defined in a different file, but we have a pointer to an instance of
# the opaque structure in the current file. Ensure we know it's type.
setup_xfail_on_opaque_pointer
send "whatis foop\n"
expect {
-re "whatis foop\r
type = struct foo \[*\]+\r
$prompt $" { pass "whatis on opaque struct pointer (dynamically)"}
-re ".*$prompt $" { fail "whatis on opaque struct pointer" }
timeout { fail "(timeout) whatis on opaque struct ptr" }
}
# Ensure that we know the form of the thing foop points to.
setup_xfail_on_opaque_pointer
send "ptype foop\n"
expect {
-re "ptype foop\r
type = struct foo \{\r
int a;\r
int b;\r
\} \[*\]+\r
$prompt $" { pass "ptype on opaque struct pointer (dynamically)" }
-re ".*$prompt $" { fail "ptype on opaque struct *" }
timeout { fail "(timeout) ptype on opaque struct *" }
}
send "whatis afoo\n"
expect {
-re "whatis afoo\r
type = struct foo\r
$prompt $" { pass "whatis on opaque struct instance (dynamically)" }
-re ".*$prompt $" { fail "whatis on opaque struct" }
timeout { fail "(timeout) whatis on opaque struct" }
}
# Ensure that we know the form of afoo, an instance of a struct foo.
send "ptype afoo\n"
expect {
-re "ptype afoo\r
type = struct foo \{\r
int a;\r
int b;\r
\}\r
$prompt $" { pass "ptype on opaque struct instance (dynamically)" }
-re ".*$prompt $" { fail "ptype on opaque struct instance" }
timeout { fail "(timeout) ptype on opaque struct" }
}
# Ensure that we know the form of an explicit struct foo.
send "ptype struct foo\n"
expect {
-re "ptype struct foo\r
type = struct foo \{\r
int a;\r
int b;\r
\}\r
$prompt $" { pass "ptype on opaque struct tagname (dynamically)" }
-re ".*$prompt $" { fail "ptype on opaque struct" }
timeout { fail "(timeout) ptype on opaque struct" }
}
# Now reload the symbols again so we forget about anything we might
# have learned reading the symbols during the previous tests.
if [istarget "mips-idt-*"] then {
# Restart because IDT/SIM runs out of file descriptors.
gdb_exit
gdb_start
}
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $objdir/$subdir/$binfile
# Run to getfoo, where struct foo is complete.
if ![runto getfoo] {
perror "cannot run to breakpoint at getfoo"
}
# Ensure that we know what foop is.
setup_xfail_on_opaque_pointer
send "whatis foop\n"
expect {
-re "whatis foop\r
type = struct foo \[*\]+\r
$prompt $" { pass "whatis on opaque struct pointer (dynamically)"}
-re ".*$prompt $" { fail "whatis on opaque struct pointer" }
timeout { fail "(timeout) whatis on opaque struct ptr" }
}
# Ensure that we know the form of the thing foop points to.
setup_xfail_on_opaque_pointer
send "ptype foop\n"
expect {
-re "ptype foop\r
type = struct foo \{\r
int a;\r
int b;\r
\} \[*\]+\r
$prompt $" { pass "ptype on opaque struct pointer (dynamically)" }
-re ".*$prompt $" { fail "ptype on opaque struct *" }
timeout { fail "(timeout) ptype on opaque struct *" }
}
send "whatis afoo\n"
expect {
-re "whatis afoo\r
type = struct foo\r
$prompt $" { pass "whatis on opaque struct instance (dynamically)" }
-re ".*$prompt $" { fail "whatis on opaque struct" }
timeout { fail "(timeout) whatis on opaque struct" }
}
# Ensure that we know the form of afoo, an instance of a struct foo.
send "ptype afoo\n"
expect {
-re "ptype afoo\r
type = struct foo \{\r
int a;\r
int b;\r
\}\r
$prompt $" { pass "ptype on opaque struct instance (dynamically)" }
-re ".*$prompt $" { fail "ptype on opaque struct instance" }
timeout { fail "(timeout) ptype on opaque struct" }
}
# Ensure that we know the form of an explicit struct foo.
send "ptype struct foo\n"
expect {
-re "ptype struct foo\r
type = struct foo \{\r
int a;\r
int b;\r
\}\r
$prompt $" { pass "ptype on opaque struct tagname (dynamically)" }
-re ".*$prompt $" { fail "ptype on opaque struct" }
timeout { fail "(timeout) ptype on opaque struct" }
}
|