Commit | Line | Data |
---|---|---|
30d1f018 WP |
1 | # Copyright 2019 Free Software Foundation, Inc. |
2 | ||
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 3 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | ||
16 | # This file is a subset of ptype.exp written by Rob Savoye. (rob@cygnus.com) | |
17 | ||
30d0a636 AB |
18 | if [skip_ctf_tests] { |
19 | unsupported "no ctf debug format support" | |
20 | return 0 | |
21 | } | |
30d1f018 WP |
22 | |
23 | standard_testfile .c | |
30d1f018 | 24 | |
30d0a636 AB |
25 | # Using `-gt` generates full-fledged CTF debug information. |
26 | set opts "additional_flags=-gt" | |
30d1f018 WP |
27 | if { [prepare_for_testing "failed to prepare" ${testfile} \ |
28 | [list $srcfile] [list $opts nowarnings]] } { | |
29 | return 0 | |
30 | } | |
31 | ||
32 | # Create and source the file that provides information about the compiler | |
33 | # used to compile the test case. | |
34 | if [get_compiler_info] { | |
35 | return -1 | |
36 | } | |
37 | ||
38 | # Test ptype of unnamed enumeration members before any action causes | |
39 | # the partial symbol table to be expanded to full symbols. This fails | |
40 | # with stabs compilers which fail to use a nameless stab (such as | |
41 | # pre-2.4.5 versions of gcc and most non-gcc compilers). | |
42 | ||
43 | gdb_test_multiple "ptype red1" "ptype unnamed enumeration member" { | |
44 | -re "type = enum primary1_tag \{red1, green1, blue1\}.*$gdb_prompt $" { | |
45 | # The workaround is in effect. As this is a compiler, not GDB, | |
46 | # bug, we'll make it a PASS but perhaps it should be an XFAIL. | |
47 | pass "ptype unnamed enumeration member (worked around)" | |
48 | } | |
49 | -re "type = enum \{red1, green1, blue1\}.*$gdb_prompt $" { | |
50 | pass "ptype unnamed enumeration member" | |
51 | } | |
52 | } | |
53 | ||
54 | # | |
55 | # test ptype command with structures | |
56 | # | |
57 | # Here and elsewhere, we accept | |
58 | # "long", "long int", or "int" for long variables (whatis.exp already | |
59 | # has an XFAIL for "int" (Sun cc bug), so no need to fail it here). | |
60 | gdb_test "ptype struct t_struct" "type = struct t_struct \{.*\[\r\n\] (unsigned |)char v_char_member;.*\[\r\n\] (short|short int) v_short_member;.*\[\r\n\] int v_int_member;.*\[\r\n\] (long|long int|int) v_long_member;.*\[\r\n\] float v_float_member;.*\[\r\n\] double v_double_member;.*\[\r\n\]\}.*" "ptype structure" | |
61 | ||
62 | ||
63 | # Test the equivalence between '.' and '->' for struct member references. | |
64 | ||
65 | if [gdb_test "ptype v_t_struct_p.v_float_member" "type = float"]<0 then { | |
66 | return -1 | |
67 | } | |
68 | if [gdb_test "ptype v_t_struct_p->v_float_member" "type = float"]<0 then { | |
69 | return -1 | |
70 | } | |
71 | if [gdb_test "ptype v_t_struct_p.v_float_member" "type = float"]<0 then { | |
72 | return -1 | |
73 | } | |
74 | if [gdb_test "ptype v_t_struct_p->v_float_member" "type = float"]<0 then { | |
75 | return -1 | |
76 | } | |
77 | ||
78 | # | |
79 | # test ptype command with unions | |
80 | # | |
81 | gdb_test "ptype union t_union" "type = union t_union \{.*\[\r\n\] (unsigned |)char v_char_member;.*\[\r\n\] (short|short int) v_short_member;.*\[\r\n\] int v_int_member;.*\[\r\n\] (long|long int|int) v_long_member;.*\[\r\n\] float v_float_member;.*\[\r\n\] double v_double_member;.*\[\r\n\]\}.*" "ptype union" | |
82 | ||
83 | # | |
84 | # test ptype command with enums | |
85 | # | |
86 | ||
87 | gdb_test "ptype primary" "type = enum .red, green, blue.*" "ptype unnamed enumeration" | |
88 | ||
89 | gdb_test "ptype enum colors" "type = enum colors \{yellow, purple, pink\}.*" "ptype named enumeration" | |
90 | ||
91 | ||
92 | # | |
93 | # test ptype command with enums as typedef | |
94 | # | |
95 | gdb_test "ptype boolean" "type = enum (boolean |)\{FALSE, TRUE\}.*" "ptype unnamed typedef'd enumeration" | |
96 | ||
97 | gdb_test "list main" ".*" | |
98 | ||
99 | # Same thing with struct and union. | |
100 | gdb_test "ptype t_struct3" "type = struct (t_struct3 |)\{.* | |
101 | *double v_double_member;.* | |
102 | *int v_int_member;.*\}" "printing typedef'd struct" | |
103 | ||
104 | gdb_test "ptype t_union3" "type = union (t_union3 |)\{.* | |
105 | *double v_double_member;.* | |
106 | *int v_int_member;.*\}" "printing typedef'd union" | |
107 | ||
108 | gdb_test "ptype enum bvals" "type = enum bvals \{my_false, my_true\}.*" "ptype named typedef'd enumf'd enum" | |
109 | ||
110 | # | |
111 | # test ptype command with out-of-order enum values | |
112 | # | |
113 | gdb_test "ptype enum misordered" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype misordered enumeration" | |
114 | ||
115 | # | |
116 | # test ptype command with a named enum's value | |
117 | # | |
118 | gdb_test "ptype three" "type = enum misordered \{two = 2, one = 1, zero = 0, three = 3\}.*" "ptype named enumeration member" | |
119 | ||
120 | gdb_test "ptype red" "type = enum \{red, green, blue\}.*" "ptype unnamed enumeration member #2" | |
121 | ||
122 | # | |
123 | # test ptype command with arrays | |
124 | # | |
125 | gdb_test "ptype v_char_array" "type = char .2..*" "ptype char array" | |
126 | ||
127 | gdb_test "ptype v_signed_char_array" "type = (|signed )char .2..*" "ptype signed char array" | |
128 | ||
129 | gdb_test "ptype v_unsigned_char_array" "type = unsigned char .2..*" "ptype unsigned char array" | |
130 | ||
131 | gdb_test "ptype v_int_array" "type = int .2..*" "ptype int array" | |
132 | ||
133 | gdb_test "ptype v_signed_int_array" "type = int .2..*" "ptype signed int array" | |
134 | ||
135 | gdb_test "ptype v_unsigned_int_array" "type = unsigned int .2..*" "ptype unsigned int array" | |
136 | ||
137 | gdb_test "ptype v_long_array" "type = (long|int|long int) .2..*" "ptype long array" | |
138 | ||
139 | gdb_test "ptype v_signed_long_array" "type = (long|int|long int) .2..*" "ptype signed long array" | |
140 | ||
141 | gdb_test "ptype v_unsigned_long_array" "type = unsigned long .2..*" "ptype unsigned long array" | |
142 | ||
143 | gdb_test "ptype v_float_array" "type = float .2..*" "ptype float array" | |
144 | ||
145 | gdb_test "ptype v_double_array" "type = double .2..*" "ptype double array" | |
146 | ||
147 | gdb_test "ptype pv_char_array" "type = (|unsigned )char \\(\\*\\)\\\[0?\\\]" | |
148 | ||
149 | # | |
150 | # test ptype command with pointers | |
151 | # | |
152 | gdb_test "ptype v_char_pointer" "type = char \*.*" "ptype char pointer" | |
153 | ||
154 | gdb_test "ptype v_short_pointer" "type = short \*.*" "ptype short pointer" | |
155 | ||
156 | gdb_test "ptype v_long_pointer" "type = long \*.*" "ptype long pointer" | |
157 | ||
158 | gdb_test "ptype v_int_pointer" "type = int \*.*" "ptype int pointer" | |
159 | ||
160 | gdb_test "ptype v_signed_long_pointer" "type = long \*.*" "ptype signed long pointer" | |
161 | ||
162 | gdb_test "ptype v_unsigned_long_pointer" "type = unsigned long \*.*" "ptype unsigned long pointer" | |
163 | ||
164 | gdb_test "ptype v_float_pointer" "type = float \*.*" "ptype float pointer" | |
165 | ||
166 | gdb_test "ptype v_double_pointer" "type = double \*.*" "ptype double pointer" | |
167 | ||
168 | # | |
169 | # test ptype command with basic C types | |
170 | # | |
171 | gdb_test "ptype v_short" "type = short(| int).*" "ptype short" | |
172 | ||
173 | gdb_test "ptype v_int" "type = int.*" "ptype int" | |
174 | ||
175 | # | |
176 | # test ptype command with nested structure and union | |
177 | # | |
178 | gdb_test "ptype struct outer_struct" "type = struct outer_struct \{.*\[\r\n\]+\ | |
179 | .*int outer_int;.*\[\r\n\]+\ | |
180 | .*(struct|) inner_struct inner_struct_instance;.*\[\r\n\]+\ | |
181 | .*(union|) inner_union inner_union_instance;.*\[\r\n\]+\ | |
182 | .*(long|long int|int) outer_long;.*\[\r\n\]\}.*" "ptype outer structure" | |
183 | ||
184 | gdb_test "ptype struct inner_struct" "type = struct inner_struct \{.*\[\r\n\] int inner_int;.*\[\r\n\] (long|long int|int) inner_long;.*\[\r\n\]\}.*" "ptype inner structure" | |
185 | ||
186 | gdb_test "ptype union inner_union" "type = union inner_union \{.*\[\r\n\] int inner_union_int;.*\[\r\n\] (long|long int|int) inner_union_long;.*\[\r\n\]\}.*" "ptype inner union" | |
187 | ||
188 | gdb_test "ptype nested_su" "type = struct outer_struct \{.*\[\r\n\] int outer_int;.*\[\r\n\] (struct |)inner_struct inner_struct_instance;.*\[\r\n\] (union |)inner_union inner_union_instance;.*\[\r\n\] (long|long int|int) outer_long;.*\[\r\n\]\}.*" "ptype nested structure" | |
189 | ||
190 | gdb_test "ptype nested_su.outer_int" "type = int.*" "ptype outer int" | |
191 | ||
192 | gdb_test "ptype nested_su.inner_struct_instance" "type = struct inner_struct \{.*\[\r\n\] int inner_int;.*\[\r\n\] (long|long int|int) inner_long;.*\[\r\n\]\}.*" "ptype nested structure #2" | |
193 | ||
194 | gdb_test "ptype nested_su.inner_struct_instance.inner_int" "type = int.*" "ptype inner int" | |
195 | ||
196 | gdb_test "ptype nested_su.inner_union_instance" "type = union inner_union \{.*\[\r\n\] int inner_union_int;.*\[\r\n\] (long|long int|int) inner_union_long;.*\[\r\n\]\}.*" "ptype nested union" | |
197 | ||
198 | # Print the type description of variable the_highest, and verify that | |
199 | # the type description for the fields whose type is anonymous are | |
200 | # correctly printed (at nesting level 1 and 2). | |
201 | ||
202 | gdb_test "ptype the_highest" \ | |
203 | "type = struct highest \{.*\[\r\n\] *int a;.*\[\r\n\] *struct \{.*\[\r\n\] *int b;.*\[\r\n\] *struct \{\.\.\.\} anonymous_level_2;.*\[\r\n\] *\} anonymous_level_1;.*\[\r\n\]}.*" \ | |
204 | "ptype the_highest" | |
205 | ||
206 | # Print the type descrption for one of the fields of variable the_highest. | |
207 | # The purpose is to verify that the type of a field that was printed above | |
208 | # as "struct {...}" is now printed in a more descriptive way (because the | |
209 | # nesting level is now one level less). | |
210 | ||
211 | gdb_test "ptype the_highest.anonymous_level_1" \ | |
212 | "type = struct \{.*\[\r\n\] *int b;.*\[\r\n\] *struct \{.*\[\r\n\] *int c;.*\[\r\n\] *\} anonymous_level_2;.*\[\r\n\]}.*" \ | |
213 | "ptype the_highest" | |
214 | ||
215 | # Print the type of the identifier ID, and check the response: | |
216 | # - Expect to see PROTOTYPED as the type. PROTOTYPED is not a regular | |
217 | # expression; it's a literal string. | |
218 | # - If we instead see the unprototyped type PLAIN, and we're using STABS | |
219 | # generated by GCC, that's an xfail; as of 9 Feb 2002, GCC never emits | |
220 | # prototyped function types in STABS. Like PROTOTYPED, PLAIN is a | |
221 | # literal string, not a regular expression. | |
222 | # - If we see OVERPROTOTYPED, it's an xfail for RealView; RealView | |
223 | # does not distinguish prototyped and unprototyped functions, and | |
224 | # GDB defaults to prototyped. | |
225 | # - Otherwise, it's a failure. | |
226 | proc ptype_maybe_prototyped { id prototyped plain { overprototyped "NO-MATCH" } } { | |
227 | global gdb_prompt | |
228 | global gcc_compiled | |
229 | ||
230 | # Turn the arguments, which are literal strings, into | |
231 | # regular expressions by quoting any special characters they contain. | |
232 | foreach var { prototyped plain overprototyped } { | |
233 | eval "set val \$$var" | |
234 | regsub -all "\[\]\[*()\]" $val "\\\\&" val | |
235 | regsub -all "short int" $val "short( int)?" val | |
236 | regsub -all "long int" $val "long( int)?" val | |
237 | eval "set $var \$val" | |
238 | } | |
239 | ||
240 | gdb_test_multiple "ptype $id" "ptype $id" { | |
241 | -re "type = $prototyped\[\r\n\]+$gdb_prompt $" { | |
242 | pass "ptype $id" | |
243 | } | |
244 | -re "type = $plain\[\r\n\]+$gdb_prompt $" { | |
245 | if {$gcc_compiled} { setup_xfail_format "stabs" } | |
246 | fail "ptype $id (compiler doesn't emit prototyped types)" | |
247 | } | |
248 | -re "type = $overprototyped\[\r\n\]+$gdb_prompt $" { | |
249 | if { [test_compiler_info "armcc-*"] } { | |
250 | setup_xfail "*-*-*" | |
251 | } | |
252 | fail "ptype $id (compiler doesn't emit unprototyped types)" | |
253 | } | |
254 | } | |
255 | } | |
256 | ||
257 | ptype_maybe_prototyped "old_fptr" "double (*)()" "double (*)()" \ | |
258 | "double (*)(void)" | |
259 | ||
260 | # Test printing type of string constants and array constants, but | |
261 | # requires a running process. These call malloc, and can take a long | |
262 | # time to execute over a slow serial link, so increase the timeout. | |
263 | ||
264 | if [runto_main] then { | |
265 | ||
266 | if [target_info exists gdb,cannot_call_functions] { | |
267 | unsupported "this target can not call functions" | |
268 | continue | |
269 | } | |
270 | ||
271 | # We need to up this because this can be really slow on some boards. | |
272 | # (malloc() is called as part of the test). | |
273 | set prev_timeout $timeout | |
274 | set timeout 60 | |
275 | ||
276 | gdb_test "ptype \"abc\"" "type = char \\\[4\\\]" | |
277 | gdb_test "ptype {'a','b','c'}" "type = char \\\[3\\\]" | |
278 | gdb_test "ptype {0,1,2}" "type = int \\\[3\\\]" | |
279 | gdb_test "ptype {(long)0,(long)1,(long)2}" "type = long \\\[3\\\]" | |
280 | gdb_test "ptype {(float)0,(float)1,(float)2}" "type = float \\\[3\\\]" | |
281 | gdb_test "ptype {{0,1,2},{3,4,5}}" "type = int \\\[2\\\]\\\[3\\\]" | |
282 | gdb_test "ptype {4,5,6}\[2\]" "type = int" | |
283 | gdb_test "ptype *&{4,5,6}\[1\]" "Attempt to take address of value not located in memory." | |
284 | ||
285 | set timeout $prev_timeout | |
286 | ||
287 | # Test ptype of user register | |
288 | gdb_test "ptype \$pc" "void \\(\\*\\)\\(\\)" "ptype \$pc" | |
289 | } |