summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/opaque.exp
blob: 4d3f11b32a9bed96920ec92e11981f2ce0de5dea (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
# Copyright 1992-2022 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/>.

# This file was written by Fred Fish. (fnf@cygnus.com)

standard_testfile opaque0.c opaque1.c

# Some tests require GCC.
set gcc_compiled [is_c_compiler_gcc]

if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2] debug]} {
    return -1
}

#
# 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 (FIXME: Is this still true; I suspect maybe not).

# 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 "vax-*-*" "i*86-sequent-bsd*"
       if {!$gcc_compiled} {
               setup_xfail "alpha-*-*"
       }
}

# This seems easier than trying to track different versions of xlc; I'm
# not sure there is much rhyme or reason regarding which tests it fails
# and which ones it passes.
if {[istarget "rs6000-*-aix*"] && !$gcc_compiled} {
    warning "xfails in opaque.exp may not be set up correctly for xlc"
}

setup_xfail_on_opaque_pointer
gdb_test "whatis foop" \
    "type = struct foo \[*\]+" \
    "whatis on opaque struct pointer (statically)"


# Ensure that we know the form of the structure that foop points to.

setup_xfail_on_opaque_pointer
if {!$gcc_compiled} { setup_xfail "rs6000-*-*" }
gdb_test "ptype foop" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\} \[*\]+" \
    "ptype on opaque struct pointer (statically)"


# An instance of the opaque structure (afoo) is defined in a different file.
# Ensure that we can locate afoo and the structure definition.

gdb_test "whatis afoo" \
    "type = struct foo" \
    "whatis on opaque struct instance (statically)"


# Ensure that we know the form of "afoo".

gdb_test "ptype afoo" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\}" \
    "ptype on opaque struct instance (statically)"


# Ensure that we know what a struct foo looks like.

gdb_test "ptype struct foo" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\}" \
    "ptype on opaque struct tagname (statically)"


#
# 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.
#

gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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
gdb_test "whatis foop" \
    "type = struct foo \[*\]+" \
    "whatis on opaque struct pointer (dynamically)"


# Ensure that we know the form of the thing foop points to.

setup_xfail_on_opaque_pointer
if {!$gcc_compiled} { setup_xfail "rs6000-*-*" }
gdb_test "ptype foop" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\} \[*\]+" \
    "ptype on opaque struct pointer (dynamically) 1"

gdb_test "whatis afoo" \
    "type = struct foo" \
    "whatis on opaque struct instance (dynamically) 1"


# Ensure that we know the form of afoo, an instance of a struct foo.

gdb_test "ptype afoo" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\}" \
    "ptype on opaque struct instance (dynamically) 1"


# Ensure that we know the form of an explicit struct foo.

if {!$gcc_compiled} { setup_xfail "rs6000-*-*" }
gdb_test "ptype struct foo" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\}" \
    "ptype on opaque struct tagname (dynamically) 1"


# Now reload the symbols again so we forget about anything we might
# have learned reading the symbols during the previous tests.

gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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
gdb_test "whatis foop" \
    "type = struct foo \[*\]+" \
    "whatis on opaque struct pointer (dynamically) 1"


# Ensure that we know the form of the thing foop points to.

setup_xfail_on_opaque_pointer
gdb_test "ptype foop" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\} \[*\]+" \
    "ptype on opaque struct pointer (dynamically) 2"

gdb_test "whatis afoo" \
    "type = struct foo" \
    "whatis on opaque struct instance (dynamically) 2"


# Ensure that we know the form of afoo, an instance of a struct foo.

gdb_test "ptype afoo" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\}" \
    "ptype on opaque struct instance (dynamically) 2"


# Ensure that we know the form of an explicit struct foo.

gdb_test "ptype struct foo" \
    "type = struct foo \{\[\r\n\]+    int a;\[\r\n\]+    int b;\[\r\n\]+\}" \
    "ptype on opaque struct tagname (dynamically) 2"