Bug Summary

File:src/gnu/usr.bin/binutils/gdb/p-typeprint.c
Warning:line 632, column 14
Value stored to 'name' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name p-typeprint.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/binutils/obj/gdb -resource-dir /usr/local/lib/clang/13.0.0 -D PIE_DEFAULT=1 -I . -I /usr/src/gnu/usr.bin/binutils/gdb -I /usr/src/gnu/usr.bin/binutils/gdb/config -D LOCALEDIR="/usr/share/locale" -D HAVE_CONFIG_H -I /usr/src/gnu/usr.bin/binutils/gdb/../include/opcode -I ../bfd -I /usr/src/gnu/usr.bin/binutils/gdb/../bfd -I /usr/src/gnu/usr.bin/binutils/gdb/../include -I ../intl -I /usr/src/gnu/usr.bin/binutils/gdb/../intl -D MI_OUT=1 -D TUI=1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/gnu/usr.bin/binutils/obj/gdb -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -fcommon -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/gnu/usr.bin/binutils/gdb/p-typeprint.c
1/* Support for printing Pascal types for GDB, the GNU debugger.
2 Copyright 2000, 2001, 2002
3 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21/* This file is derived from p-typeprint.c */
22
23#include "defs.h"
24#include "gdb_obstack.h"
25#include "bfd.h" /* Binary File Description */
26#include "symtab.h"
27#include "gdbtypes.h"
28#include "expression.h"
29#include "value.h"
30#include "gdbcore.h"
31#include "target.h"
32#include "language.h"
33#include "p-lang.h"
34#include "typeprint.h"
35
36#include "gdb_string.h"
37#include <errno(*__errno()).h>
38#include <ctype.h>
39
40static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *, int, int, int);
41
42static void pascal_type_print_derivation_info (struct ui_file *, struct type *);
43
44void pascal_type_print_varspec_prefix (struct type *, struct ui_file *, int, int);
45
46
47/* LEVEL is the depth to indent lines by. */
48
49void
50pascal_print_type (struct type *type, char *varstring, struct ui_file *stream,
51 int show, int level)
52{
53 enum type_code code;
54 int demangled_args;
55
56 code = TYPE_CODE (type)(type)->main_type->code;
57
58 if (show > 0)
59 CHECK_TYPEDEF (type)(type) = check_typedef (type);
60
61 if ((code == TYPE_CODE_FUNC ||
62 code == TYPE_CODE_METHOD))
63 {
64 pascal_type_print_varspec_prefix (type, stream, show, 0);
65 }
66 /* first the name */
67 fputs_filtered (varstring, stream);
68
69 if ((varstring != NULL((void*)0) && *varstring != '\0') &&
70 !(code == TYPE_CODE_FUNC ||
71 code == TYPE_CODE_METHOD))
72 {
73 fputs_filtered (" : ", stream);
74 }
75
76 if (!(code == TYPE_CODE_FUNC ||
77 code == TYPE_CODE_METHOD))
78 {
79 pascal_type_print_varspec_prefix (type, stream, show, 0);
80 }
81
82 pascal_type_print_base (type, stream, show, level);
83 /* For demangled function names, we have the arglist as part of the name,
84 so don't print an additional pair of ()'s */
85
86 demangled_args = varstring ? strchr (varstring, '(') != NULL((void*)0) : 0;
87 pascal_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
88
89}
90
91/* If TYPE is a derived type, then print out derivation information.
92 Print only the actual base classes of this type, not the base classes
93 of the base classes. I.E. for the derivation hierarchy:
94
95 class A { int a; };
96 class B : public A {int b; };
97 class C : public B {int c; };
98
99 Print the type of class C as:
100
101 class C : public B {
102 int c;
103 }
104
105 Not as the following (like gdb used to), which is not legal C++ syntax for
106 derived types and may be confused with the multiple inheritance form:
107
108 class C : public B : public A {
109 int c;
110 }
111
112 In general, gdb should try to print the types as closely as possible to
113 the form that they appear in the source code. */
114
115static void
116pascal_type_print_derivation_info (struct ui_file *stream, struct type *type)
117{
118 char *name;
119 int i;
120
121 for (i = 0; i < TYPE_N_BASECLASSES (type)(type)->main_type->type_specific.cplus_stuff->n_baseclasses; i++)
122 {
123 fputs_filtered (i == 0 ? ": " : ", ", stream);
124 fprintf_filtered (stream, "%s%s ",
125 BASETYPE_VIA_PUBLIC (type, i)((!((type)->main_type->type_specific.cplus_stuff->private_field_bits
== ((void*)0) ? 0 : (((type)->main_type->type_specific
.cplus_stuff->private_field_bits)[((i))>>3] & (1
<< (((i))&7))))) && (!((type)->main_type
->type_specific.cplus_stuff->protected_field_bits == ((
void*)0) ? 0 : (((type)->main_type->type_specific.cplus_stuff
->protected_field_bits)[((i))>>3] & (1 << (
((i))&7))))))
? "public" : "private",
126 BASETYPE_VIA_VIRTUAL (type, i)((type)->main_type->type_specific.cplus_stuff->virtual_field_bits
== ((void*)0) ? 0 : (((type)->main_type->type_specific
.cplus_stuff->virtual_field_bits)[((i))>>3] & (1
<< (((i))&7))))
? " virtual" : "");
127 name = type_name_no_tag (TYPE_BASECLASS (type, i)(type)->main_type->fields[i].type);
128 fprintf_filtered (stream, "%s", name ? name : "(null)");
129 }
130 if (i > 0)
131 {
132 fputs_filtered (" ", stream);
133 }
134}
135
136/* Print the Pascal method arguments ARGS to the file STREAM. */
137
138void
139pascal_type_print_method_args (char *physname, char *methodname,
140 struct ui_file *stream)
141{
142 int is_constructor = DEPRECATED_STREQN (physname, "__ct__", 6)(strncmp ((physname), ("__ct__"), (6)) == 0);
143 int is_destructor = DEPRECATED_STREQN (physname, "__dt__", 6)(strncmp ((physname), ("__dt__"), (6)) == 0);
144
145 if (is_constructor || is_destructor)
146 {
147 physname += 6;
148 }
149
150 fputs_filtered (methodname, stream);
151
152 if (physname && (*physname != 0))
153 {
154 int i = 0;
155 int len = 0;
156 char storec;
157 char *argname;
158 fputs_filtered (" (", stream);
159 /* we must demangle this */
160 while (isdigit (physname[0]))
161 {
162 while (isdigit (physname[len]))
163 {
164 len++;
165 }
166 i = strtol (physname, &argname, 0);
167 physname += len;
168 storec = physname[i];
169 physname[i] = 0;
170 fputs_filtered (physname, stream);
171 physname[i] = storec;
172 physname += i;
173 if (physname[0] != 0)
174 {
175 fputs_filtered (", ", stream);
176 }
177 }
178 fputs_filtered (")", stream);
179 }
180}
181
182/* Print any asterisks or open-parentheses needed before the
183 variable name (to describe its type).
184
185 On outermost call, pass 0 for PASSED_A_PTR.
186 On outermost call, SHOW > 0 means should ignore
187 any typename for TYPE and show its details.
188 SHOW is always zero on recursive calls. */
189
190void
191pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
192 int show, int passed_a_ptr)
193{
194 char *name;
195 if (type == 0)
196 return;
197
198 if (TYPE_NAME (type)(type)->main_type->name && show <= 0)
199 return;
200
201 QUIT{ if (quit_flag) quit (); if (deprecated_interactive_hook) deprecated_interactive_hook
(); }
;
202
203 switch (TYPE_CODE (type)(type)->main_type->code)
204 {
205 case TYPE_CODE_PTR:
206 fprintf_filtered (stream, "^");
207 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 1);
208 break; /* pointer should be handled normally in pascal */
209
210 case TYPE_CODE_MEMBER:
211 if (passed_a_ptr)
212 fprintf_filtered (stream, "(");
213 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 0);
214 fprintf_filtered (stream, " ");
215 name = type_name_no_tag (TYPE_DOMAIN_TYPE (type)(type)->main_type->vptr_basetype);
216 if (name)
217 fputs_filtered (name, stream);
218 else
219 pascal_type_print_base (TYPE_DOMAIN_TYPE (type)(type)->main_type->vptr_basetype, stream, 0, passed_a_ptr);
220 fprintf_filtered (stream, "::");
221 break;
222
223 case TYPE_CODE_METHOD:
224 if (passed_a_ptr)
225 fprintf_filtered (stream, "(");
226 if (TYPE_CODE (TYPE_TARGET_TYPE (type))((type)->main_type->target_type)->main_type->code != TYPE_CODE_VOID)
227 {
228 fprintf_filtered (stream, "function ");
229 }
230 else
231 {
232 fprintf_filtered (stream, "procedure ");
233 }
234
235 if (passed_a_ptr)
236 {
237 fprintf_filtered (stream, " ");
238 pascal_type_print_base (TYPE_DOMAIN_TYPE (type)(type)->main_type->vptr_basetype, stream, 0, passed_a_ptr);
239 fprintf_filtered (stream, "::");
240 }
241 break;
242
243 case TYPE_CODE_REF:
244 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 1);
245 fprintf_filtered (stream, "&");
246 break;
247
248 case TYPE_CODE_FUNC:
249 if (passed_a_ptr)
250 fprintf_filtered (stream, "(");
251
252 if (TYPE_CODE (TYPE_TARGET_TYPE (type))((type)->main_type->target_type)->main_type->code != TYPE_CODE_VOID)
253 {
254 fprintf_filtered (stream, "function ");
255 }
256 else
257 {
258 fprintf_filtered (stream, "procedure ");
259 }
260
261 break;
262
263 case TYPE_CODE_ARRAY:
264 if (passed_a_ptr)
265 fprintf_filtered (stream, "(");
266 fprintf_filtered (stream, "array ");
267 if (TYPE_LENGTH (type)(type)->length >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type))((type)->main_type->target_type)->length > 0
268 && TYPE_ARRAY_UPPER_BOUND_TYPE (type)(type)->main_type->upper_bound_type != BOUND_CANNOT_BE_DETERMINED)
269 fprintf_filtered (stream, "[%d..%d] ",
270 TYPE_ARRAY_LOWER_BOUND_VALUE (type)(((((((((type))->main_type->fields[0]).type)))->main_type
->fields[0]).loc.bitpos))
,
271 TYPE_ARRAY_UPPER_BOUND_VALUE (type)(((((((((type))->main_type->fields[0]).type)))->main_type
->fields[1]).loc.bitpos))
272 );
273 fprintf_filtered (stream, "of ");
274 break;
275
276 case TYPE_CODE_UNDEF:
277 case TYPE_CODE_STRUCT:
278 case TYPE_CODE_UNION:
279 case TYPE_CODE_ENUM:
280 case TYPE_CODE_INT:
281 case TYPE_CODE_FLT:
282 case TYPE_CODE_VOID:
283 case TYPE_CODE_ERROR:
284 case TYPE_CODE_CHAR:
285 case TYPE_CODE_BOOL:
286 case TYPE_CODE_SET:
287 case TYPE_CODE_RANGE:
288 case TYPE_CODE_STRING:
289 case TYPE_CODE_BITSTRING:
290 case TYPE_CODE_COMPLEX:
291 case TYPE_CODE_TYPEDEF:
292 case TYPE_CODE_TEMPLATE:
293 /* These types need no prefix. They are listed here so that
294 gcc -Wall will reveal any types that haven't been handled. */
295 break;
296 default:
297 error ("type not handled in pascal_type_print_varspec_prefix()");
298 break;
299 }
300}
301
302static void
303pascal_print_func_args (struct type *type, struct ui_file *stream)
304{
305 int i, len = TYPE_NFIELDS (type)(type)->main_type->nfields;
306 if (len)
307 {
308 fprintf_filtered (stream, "(");
309 }
310 for (i = 0; i < len; i++)
311 {
312 if (i > 0)
313 {
314 fputs_filtered (", ", stream);
315 wrap_here (" ");
316 }
317 /* can we find if it is a var parameter ??
318 if ( TYPE_FIELD(type, i) == )
319 {
320 fprintf_filtered (stream, "var ");
321 } */
322 pascal_print_type (TYPE_FIELD_TYPE (type, i)(((type)->main_type->fields[i]).type), "" /* TYPE_FIELD_NAME seems invalid ! */
323 ,stream, -1, 0);
324 }
325 if (len)
326 {
327 fprintf_filtered (stream, ")");
328 }
329}
330
331/* Print any array sizes, function arguments or close parentheses
332 needed after the variable name (to describe its type).
333 Args work like pascal_type_print_varspec_prefix. */
334
335static void
336pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
337 int show, int passed_a_ptr,
338 int demangled_args)
339{
340 if (type == 0)
341 return;
342
343 if (TYPE_NAME (type)(type)->main_type->name && show <= 0)
344 return;
345
346 QUIT{ if (quit_flag) quit (); if (deprecated_interactive_hook) deprecated_interactive_hook
(); }
;
347
348 switch (TYPE_CODE (type)(type)->main_type->code)
349 {
350 case TYPE_CODE_ARRAY:
351 if (passed_a_ptr)
352 fprintf_filtered (stream, ")");
353 break;
354
355 case TYPE_CODE_MEMBER:
356 if (passed_a_ptr)
357 fprintf_filtered (stream, ")");
358 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 0, 0);
359 break;
360
361 case TYPE_CODE_METHOD:
362 if (passed_a_ptr)
363 fprintf_filtered (stream, ")");
364 pascal_type_print_method_args ("",
365 "",
366 stream);
367 if (TYPE_CODE (TYPE_TARGET_TYPE (type))((type)->main_type->target_type)->main_type->code != TYPE_CODE_VOID)
368 {
369 fprintf_filtered (stream, " : ");
370 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 0);
371 pascal_type_print_base (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, show, 0);
372 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0,
373 passed_a_ptr, 0);
374 }
375 break;
376
377 case TYPE_CODE_PTR:
378 case TYPE_CODE_REF:
379 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 1, 0);
380 break;
381
382 case TYPE_CODE_FUNC:
383 if (passed_a_ptr)
384 fprintf_filtered (stream, ")");
385 if (!demangled_args)
386 pascal_print_func_args (type, stream);
387 if (TYPE_CODE (TYPE_TARGET_TYPE (type))((type)->main_type->target_type)->main_type->code != TYPE_CODE_VOID)
388 {
389 fprintf_filtered (stream, " : ");
390 pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0, 0);
391 pascal_type_print_base (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, show, 0);
392 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, 0,
393 passed_a_ptr, 0);
394 }
395 break;
396
397 case TYPE_CODE_UNDEF:
398 case TYPE_CODE_STRUCT:
399 case TYPE_CODE_UNION:
400 case TYPE_CODE_ENUM:
401 case TYPE_CODE_INT:
402 case TYPE_CODE_FLT:
403 case TYPE_CODE_VOID:
404 case TYPE_CODE_ERROR:
405 case TYPE_CODE_CHAR:
406 case TYPE_CODE_BOOL:
407 case TYPE_CODE_SET:
408 case TYPE_CODE_RANGE:
409 case TYPE_CODE_STRING:
410 case TYPE_CODE_BITSTRING:
411 case TYPE_CODE_COMPLEX:
412 case TYPE_CODE_TYPEDEF:
413 case TYPE_CODE_TEMPLATE:
414 /* These types do not need a suffix. They are listed so that
415 gcc -Wall will report types that may not have been considered. */
416 break;
417 default:
418 error ("type not handled in pascal_type_print_varspec_suffix()");
419 break;
420 }
421}
422
423/* Print the name of the type (or the ultimate pointer target,
424 function value or array element), or the description of a
425 structure or union.
426
427 SHOW positive means print details about the type (e.g. enum values),
428 and print structure elements passing SHOW - 1 for show.
429 SHOW negative means just print the type name or struct tag if there is one.
430 If there is no name, print something sensible but concise like
431 "struct {...}".
432 SHOW zero means just print the type name or struct tag if there is one.
433 If there is no name, print something sensible but not as concise like
434 "struct {int x; int y;}".
435
436 LEVEL is the number of spaces to indent by.
437 We increase it for some recursive calls. */
438
439void
440pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
441 int level)
442{
443 int i;
444 int len;
445 int lastval;
446 enum
447 {
448 s_none, s_public, s_private, s_protected
449 }
450 section_type;
451 QUIT{ if (quit_flag) quit (); if (deprecated_interactive_hook) deprecated_interactive_hook
(); }
;
452
453 wrap_here (" ");
454 if (type == NULL((void*)0))
455 {
456 fputs_filtered ("<type unknown>", stream);
457 return;
458 }
459
460 /* void pointer */
461 if ((TYPE_CODE (type)(type)->main_type->code == TYPE_CODE_PTR) && (TYPE_CODE (TYPE_TARGET_TYPE (type))((type)->main_type->target_type)->main_type->code == TYPE_CODE_VOID))
462 {
463 fputs_filtered (TYPE_NAME (type)(type)->main_type->name ? TYPE_NAME (type)(type)->main_type->name : "pointer",
464 stream);
465 return;
466 }
467 /* When SHOW is zero or less, and there is a valid type name, then always
468 just print the type name directly from the type. */
469
470 if (show <= 0
471 && TYPE_NAME (type)(type)->main_type->name != NULL((void*)0))
472 {
473 fputs_filtered (TYPE_NAME (type)(type)->main_type->name, stream);
474 return;
475 }
476
477 CHECK_TYPEDEF (type)(type) = check_typedef (type);
478
479 switch (TYPE_CODE (type)(type)->main_type->code)
480 {
481 case TYPE_CODE_TYPEDEF:
482 case TYPE_CODE_PTR:
483 case TYPE_CODE_MEMBER:
484 case TYPE_CODE_REF:
485 /* case TYPE_CODE_FUNC:
486 case TYPE_CODE_METHOD: */
487 pascal_type_print_base (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, stream, show, level);
488 break;
489
490 case TYPE_CODE_ARRAY:
491 /* pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
492 pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
493 pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); */
494 pascal_print_type (TYPE_TARGET_TYPE (type)(type)->main_type->target_type, NULL((void*)0), stream, 0, 0);
495 break;
496
497 case TYPE_CODE_FUNC:
498 case TYPE_CODE_METHOD:
499 /*
500 pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
501 only after args !! */
502 break;
503 case TYPE_CODE_STRUCT:
504 if (TYPE_TAG_NAME (type)(type)->main_type->tag_name != NULL((void*)0))
505 {
506 fputs_filtered (TYPE_TAG_NAME (type)(type)->main_type->tag_name, stream);
507 fputs_filtered (" = ", stream);
508 }
509 if (HAVE_CPLUS_STRUCT (type)((type)->main_type->type_specific.cplus_stuff != &cplus_struct_default
)
)
510 {
511 fprintf_filtered (stream, "class ");
512 }
513 else
514 {
515 fprintf_filtered (stream, "record ");
516 }
517 goto struct_union;
518
519 case TYPE_CODE_UNION:
520 if (TYPE_TAG_NAME (type)(type)->main_type->tag_name != NULL((void*)0))
521 {
522 fputs_filtered (TYPE_TAG_NAME (type)(type)->main_type->tag_name, stream);
523 fputs_filtered (" = ", stream);
524 }
525 fprintf_filtered (stream, "case <?> of ");
526
527 struct_union:
528 wrap_here (" ");
529 if (show < 0)
530 {
531 /* If we just printed a tag name, no need to print anything else. */
532 if (TYPE_TAG_NAME (type)(type)->main_type->tag_name == NULL((void*)0))
533 fprintf_filtered (stream, "{...}");
534 }
535 else if (show > 0 || TYPE_TAG_NAME (type)(type)->main_type->tag_name == NULL((void*)0))
536 {
537 pascal_type_print_derivation_info (stream, type);
538
539 fprintf_filtered (stream, "\n");
540 if ((TYPE_NFIELDS (type)(type)->main_type->nfields == 0) && (TYPE_NFN_FIELDS (type)(type)->main_type->type_specific.cplus_stuff->nfn_fields == 0))
541 {
542 if (TYPE_STUB (type)((type)->main_type->flags & (1 << 2)))
543 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
544 else
545 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
546 }
547
548 /* Start off with no specific section type, so we can print
549 one for the first field we find, and use that section type
550 thereafter until we find another type. */
551
552 section_type = s_none;
553
554 /* If there is a base class for this type,
555 do not print the field that it occupies. */
556
557 len = TYPE_NFIELDS (type)(type)->main_type->nfields;
558 for (i = TYPE_N_BASECLASSES (type)(type)->main_type->type_specific.cplus_stuff->n_baseclasses; i < len; i++)
559 {
560 QUIT{ if (quit_flag) quit (); if (deprecated_interactive_hook) deprecated_interactive_hook
(); }
;
561 /* Don't print out virtual function table. */
562 if (DEPRECATED_STREQN (TYPE_FIELD_NAME (type, i), "_vptr", 5)(strncmp (((((type)->main_type->fields[i]).name)), ("_vptr"
), (5)) == 0)
563 && is_cplus_marker ((TYPE_FIELD_NAME (type, i)(((type)->main_type->fields[i]).name))[5]))
564 continue;
565
566 /* If this is a pascal object or class we can print the
567 various section labels. */
568
569 if (HAVE_CPLUS_STRUCT (type)((type)->main_type->type_specific.cplus_stuff != &cplus_struct_default
)
)
570 {
571 if (TYPE_FIELD_PROTECTED (type, i)((type)->main_type->type_specific.cplus_stuff->protected_field_bits
== ((void*)0) ? 0 : (((type)->main_type->type_specific
.cplus_stuff->protected_field_bits)[((i))>>3] & (
1 << (((i))&7))))
)
572 {
573 if (section_type != s_protected)
574 {
575 section_type = s_protected;
576 fprintfi_filtered (level + 2, stream,
577 "protected\n");
578 }
579 }
580 else if (TYPE_FIELD_PRIVATE (type, i)((type)->main_type->type_specific.cplus_stuff->private_field_bits
== ((void*)0) ? 0 : (((type)->main_type->type_specific
.cplus_stuff->private_field_bits)[((i))>>3] & (1
<< (((i))&7))))
)
581 {
582 if (section_type != s_private)
583 {
584 section_type = s_private;
585 fprintfi_filtered (level + 2, stream, "private\n");
586 }
587 }
588 else
589 {
590 if (section_type != s_public)
591 {
592 section_type = s_public;
593 fprintfi_filtered (level + 2, stream, "public\n");
594 }
595 }
596 }
597
598 print_spaces_filtered (level + 4, stream);
599 if (TYPE_FIELD_STATIC (type, i)((type)->main_type->fields[i].static_kind != 0))
600 {
601 fprintf_filtered (stream, "static ");
602 }
603 pascal_print_type (TYPE_FIELD_TYPE (type, i)(((type)->main_type->fields[i]).type),
604 TYPE_FIELD_NAME (type, i)(((type)->main_type->fields[i]).name),
605 stream, show - 1, level + 4);
606 if (!TYPE_FIELD_STATIC (type, i)((type)->main_type->fields[i].static_kind != 0)
607 && TYPE_FIELD_PACKED (type, i)((((type)->main_type->fields[i]).bitsize)!=0))
608 {
609 /* It is a bitfield. This code does not attempt
610 to look at the bitpos and reconstruct filler,
611 unnamed fields. This would lead to misleading
612 results if the compiler does not put out fields
613 for such things (I don't know what it does). */
614 fprintf_filtered (stream, " : %d",
615 TYPE_FIELD_BITSIZE (type, i)(((type)->main_type->fields[i]).bitsize));
616 }
617 fprintf_filtered (stream, ";\n");
618 }
619
620 /* If there are both fields and methods, put a space between. */
621 len = TYPE_NFN_FIELDS (type)(type)->main_type->type_specific.cplus_stuff->nfn_fields;
622 if (len && section_type != s_none)
623 fprintf_filtered (stream, "\n");
624
625 /* Pbject pascal: print out the methods */
626
627 for (i = 0; i < len; i++)
628 {
629 struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i)(type)->main_type->type_specific.cplus_stuff->fn_fieldlists
[i].fn_fields
;
630 int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i)(type)->main_type->type_specific.cplus_stuff->fn_fieldlists
[i].length
;
631 char *method_name = TYPE_FN_FIELDLIST_NAME (type, i)(type)->main_type->type_specific.cplus_stuff->fn_fieldlists
[i].name
;
632 char *name = type_name_no_tag (type);
Value stored to 'name' during its initialization is never read
633 /* this is GNU C++ specific
634 how can we know constructor/destructor?
635 It might work for GNU pascal */
636 for (j = 0; j < len2; j++)
637 {
638 char *physname = TYPE_FN_FIELD_PHYSNAME (f, j)(f)[j].physname;
639
640 int is_constructor = DEPRECATED_STREQN (physname, "__ct__", 6)(strncmp ((physname), ("__ct__"), (6)) == 0);
641 int is_destructor = DEPRECATED_STREQN (physname, "__dt__", 6)(strncmp ((physname), ("__dt__"), (6)) == 0);
642
643 QUIT{ if (quit_flag) quit (); if (deprecated_interactive_hook) deprecated_interactive_hook
(); }
;
644 if (TYPE_FN_FIELD_PROTECTED (f, j)((f)[j].is_protected))
645 {
646 if (section_type != s_protected)
647 {
648 section_type = s_protected;
649 fprintfi_filtered (level + 2, stream,
650 "protected\n");
651 }
652 }
653 else if (TYPE_FN_FIELD_PRIVATE (f, j)((f)[j].is_private))
654 {
655 if (section_type != s_private)
656 {
657 section_type = s_private;
658 fprintfi_filtered (level + 2, stream, "private\n");
659 }
660 }
661 else
662 {
663 if (section_type != s_public)
664 {
665 section_type = s_public;
666 fprintfi_filtered (level + 2, stream, "public\n");
667 }
668 }
669
670 print_spaces_filtered (level + 4, stream);
671 if (TYPE_FN_FIELD_STATIC_P (f, j)((f)[j].voffset == 1))
672 fprintf_filtered (stream, "static ");
673 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j))((f)[j].type)->main_type->target_type == 0)
674 {
675 /* Keep GDB from crashing here. */
676 fprintf_filtered (stream, "<undefined type> %s;\n",
677 TYPE_FN_FIELD_PHYSNAME (f, j)(f)[j].physname);
678 break;
679 }
680
681 if (is_constructor)
682 {
683 fprintf_filtered (stream, "constructor ");
684 }
685 else if (is_destructor)
686 {
687 fprintf_filtered (stream, "destructor ");
688 }
689 else if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j))((f)[j].type)->main_type->target_type != 0 &&
690 TYPE_CODE (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)))(((f)[j].type)->main_type->target_type)->main_type->
code
!= TYPE_CODE_VOID)
691 {
692 fprintf_filtered (stream, "function ");
693 }
694 else
695 {
696 fprintf_filtered (stream, "procedure ");
697 }
698 /* this does not work, no idea why !! */
699
700 pascal_type_print_method_args (physname,
701 method_name,
702 stream);
703
704 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j))((f)[j].type)->main_type->target_type != 0 &&
705 TYPE_CODE (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)))(((f)[j].type)->main_type->target_type)->main_type->
code
!= TYPE_CODE_VOID)
706 {
707 fputs_filtered (" : ", stream);
708 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j))((f)[j].type)->main_type->target_type,
709 "", stream, -1);
710 }
711 if (TYPE_FN_FIELD_VIRTUAL_P (f, j)((f)[j].voffset > 1))
712 fprintf_filtered (stream, "; virtual");
713
714 fprintf_filtered (stream, ";\n");
715 }
716 }
717 fprintfi_filtered (level, stream, "end");
718 }
719 break;
720
721 case TYPE_CODE_ENUM:
722 if (TYPE_TAG_NAME (type)(type)->main_type->tag_name != NULL((void*)0))
723 {
724 fputs_filtered (TYPE_TAG_NAME (type)(type)->main_type->tag_name, stream);
725 if (show > 0)
726 fputs_filtered (" ", stream);
727 }
728 /* enum is just defined by
729 type enume_name = (enum_member1,enum_member2,...) */
730 fprintf_filtered (stream, " = ");
731 wrap_here (" ");
732 if (show < 0)
733 {
734 /* If we just printed a tag name, no need to print anything else. */
735 if (TYPE_TAG_NAME (type)(type)->main_type->tag_name == NULL((void*)0))
736 fprintf_filtered (stream, "(...)");
737 }
738 else if (show > 0 || TYPE_TAG_NAME (type)(type)->main_type->tag_name == NULL((void*)0))
739 {
740 fprintf_filtered (stream, "(");
741 len = TYPE_NFIELDS (type)(type)->main_type->nfields;
742 lastval = 0;
743 for (i = 0; i < len; i++)
744 {
745 QUIT{ if (quit_flag) quit (); if (deprecated_interactive_hook) deprecated_interactive_hook
(); }
;
746 if (i)
747 fprintf_filtered (stream, ", ");
748 wrap_here (" ");
749 fputs_filtered (TYPE_FIELD_NAME (type, i)(((type)->main_type->fields[i]).name), stream);
750 if (lastval != TYPE_FIELD_BITPOS (type, i)(((type)->main_type->fields[i]).loc.bitpos))
751 {
752 fprintf_filtered (stream, " := %d", TYPE_FIELD_BITPOS (type, i)(((type)->main_type->fields[i]).loc.bitpos));
753 lastval = TYPE_FIELD_BITPOS (type, i)(((type)->main_type->fields[i]).loc.bitpos);
754 }
755 lastval++;
756 }
757 fprintf_filtered (stream, ")");
758 }
759 break;
760
761 case TYPE_CODE_VOID:
762 fprintf_filtered (stream, "void");
763 break;
764
765 case TYPE_CODE_UNDEF:
766 fprintf_filtered (stream, "record <unknown>");
767 break;
768
769 case TYPE_CODE_ERROR:
770 fprintf_filtered (stream, "<unknown type>");
771 break;
772
773 /* this probably does not work for enums */
774 case TYPE_CODE_RANGE:
775 {
776 struct type *target = TYPE_TARGET_TYPE (type)(type)->main_type->target_type;
777 if (target == NULL((void*)0))
778 target = builtin_type_long;
779 print_type_scalar (target, TYPE_LOW_BOUND (type)(((type)->main_type->fields[0]).loc.bitpos), stream);
780 fputs_filtered ("..", stream);
781 print_type_scalar (target, TYPE_HIGH_BOUND (type)(((type)->main_type->fields[1]).loc.bitpos), stream);
782 }
783 break;
784
785 case TYPE_CODE_SET:
786 fputs_filtered ("set of ", stream);
787 pascal_print_type (TYPE_INDEX_TYPE (type)(((type)->main_type->fields[0]).type), "", stream,
788 show - 1, level);
789 break;
790
791 case TYPE_CODE_BITSTRING:
792 fputs_filtered ("BitString", stream);
793 break;
794
795 case TYPE_CODE_STRING:
796 fputs_filtered ("String", stream);
797 break;
798
799 default:
800 /* Handle types not explicitly handled by the other cases,
801 such as fundamental types. For these, just print whatever
802 the type name is, as recorded in the type itself. If there
803 is no type name, then complain. */
804 if (TYPE_NAME (type)(type)->main_type->name != NULL((void*)0))
805 {
806 fputs_filtered (TYPE_NAME (type)(type)->main_type->name, stream);
807 }
808 else
809 {
810 /* At least for dump_symtab, it is important that this not be
811 an error (). */
812 fprintf_filtered (stream, "<invalid unnamed pascal type code %d>",
813 TYPE_CODE (type)(type)->main_type->code);
814 }
815 break;
816 }
817}