Minor tweaks to make COFF code support both new and old style linker.
[deliverable/binutils-gdb.git] / gdb / c-typeprint.c
... / ...
CommitLineData
1/* Support for printing C and C++ types for GDB, the GNU debugger.
2 Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20#include "defs.h"
21#include "obstack.h"
22#include "bfd.h" /* Binary File Description */
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "expression.h"
26#include "value.h"
27#include "gdbcore.h"
28#include "target.h"
29#include "command.h"
30#include "gdbcmd.h"
31#include "language.h"
32#include "demangle.h"
33#include "c-lang.h"
34#include "typeprint.h"
35
36#include <string.h>
37#include <errno.h>
38
39static void
40c_type_print_args PARAMS ((struct type *, GDB_FILE *));
41
42static void
43c_type_print_varspec_suffix PARAMS ((struct type *, GDB_FILE *, int, int, int));
44
45static void
46cp_type_print_derivation_info PARAMS ((GDB_FILE *, struct type *));
47
48void
49c_type_print_varspec_prefix PARAMS ((struct type *, GDB_FILE *, int, int));
50
51void
52c_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int));
53
54\f
55/* Print a description of a type in the format of a
56 typedef for the current language.
57 NEW is the new name for a type TYPE. */
58
59void
60c_typedef_print (type, new, stream)
61 struct type *type;
62 struct symbol *new;
63 GDB_FILE *stream;
64{
65 switch (current_language->la_language)
66 {
67#ifdef _LANG_c
68 case language_c:
69 case language_cplus:
70 fprintf_filtered(stream, "typedef ");
71 type_print(type,"",stream,0);
72 if(TYPE_NAME ((SYMBOL_TYPE (new))) == 0
73 || !STREQ (TYPE_NAME ((SYMBOL_TYPE (new))), SYMBOL_NAME (new)))
74 fprintf_filtered(stream, " %s", SYMBOL_SOURCE_NAME(new));
75 break;
76#endif
77#ifdef _LANG_m2
78 case language_m2:
79 fprintf_filtered(stream, "TYPE ");
80 if(!TYPE_NAME(SYMBOL_TYPE(new)) ||
81 !STREQ (TYPE_NAME(SYMBOL_TYPE(new)), SYMBOL_NAME(new)))
82 fprintf_filtered(stream, "%s = ", SYMBOL_SOURCE_NAME(new));
83 else
84 fprintf_filtered(stream, "<builtin> = ");
85 type_print(type,"",stream,0);
86 break;
87#endif
88#ifdef _LANG_chill
89 case language_chill:
90 fprintf_filtered(stream, "SYNMODE ");
91 if(!TYPE_NAME(SYMBOL_TYPE(new)) ||
92 !STREQ (TYPE_NAME(SYMBOL_TYPE(new)), SYMBOL_NAME(new)))
93 fprintf_filtered(stream, "%s = ", SYMBOL_SOURCE_NAME(new));
94 else
95 fprintf_filtered(stream, "<builtin> = ");
96 type_print(type,"",stream,0);
97 break;
98#endif
99 default:
100 error("Language not supported.");
101 }
102 fprintf_filtered(stream, ";\n");
103}
104
105
106/* LEVEL is the depth to indent lines by. */
107
108void
109c_print_type (type, varstring, stream, show, level)
110 struct type *type;
111 char *varstring;
112 GDB_FILE *stream;
113 int show;
114 int level;
115{
116 register enum type_code code;
117 int demangled_args;
118
119 c_type_print_base (type, stream, show, level);
120 code = TYPE_CODE (type);
121 if ((varstring != NULL && *varstring != '\0')
122 ||
123 /* Need a space if going to print stars or brackets;
124 but not if we will print just a type name. */
125 ((show > 0 || TYPE_NAME (type) == 0)
126 &&
127 (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
128 || code == TYPE_CODE_METHOD
129 || code == TYPE_CODE_ARRAY
130 || code == TYPE_CODE_MEMBER
131 || code == TYPE_CODE_REF)))
132 fputs_filtered (" ", stream);
133 c_type_print_varspec_prefix (type, stream, show, 0);
134
135 fputs_filtered (varstring, stream);
136
137 /* For demangled function names, we have the arglist as part of the name,
138 so don't print an additional pair of ()'s */
139
140 demangled_args = strchr(varstring, '(') != NULL;
141 c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
142
143}
144
145/* Print the C++ method arguments ARGS to the file STREAM. */
146
147void
148cp_type_print_method_args (args, prefix, varstring, staticp, stream)
149 struct type **args;
150 char *prefix;
151 char *varstring;
152 int staticp;
153 GDB_FILE *stream;
154{
155 int i;
156
157 fprintf_symbol_filtered (stream, prefix, language_cplus, DMGL_ANSI);
158 fprintf_symbol_filtered (stream, varstring, language_cplus, DMGL_ANSI);
159 fputs_filtered (" (", stream);
160 if (args && args[!staticp] && args[!staticp]->code != TYPE_CODE_VOID)
161 {
162 i = !staticp; /* skip the class variable */
163 while (1)
164 {
165 type_print (args[i++], "", stream, 0);
166 if (!args[i])
167 {
168 fprintf_filtered (stream, " ...");
169 break;
170 }
171 else if (args[i]->code != TYPE_CODE_VOID)
172 {
173 fprintf_filtered (stream, ", ");
174 }
175 else break;
176 }
177 }
178 fprintf_filtered (stream, ")");
179}
180
181/* If TYPE is a derived type, then print out derivation information.
182 Print only the actual base classes of this type, not the base classes
183 of the base classes. I.E. for the derivation hierarchy:
184
185 class A { int a; };
186 class B : public A {int b; };
187 class C : public B {int c; };
188
189 Print the type of class C as:
190
191 class C : public B {
192 int c;
193 }
194
195 Not as the following (like gdb used to), which is not legal C++ syntax for
196 derived types and may be confused with the multiple inheritance form:
197
198 class C : public B : public A {
199 int c;
200 }
201
202 In general, gdb should try to print the types as closely as possible to
203 the form that they appear in the source code. */
204
205static void
206cp_type_print_derivation_info (stream, type)
207 GDB_FILE *stream;
208 struct type *type;
209{
210 char *name;
211 int i;
212
213 for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
214 {
215 fputs_filtered (i == 0 ? ": " : ", ", stream);
216 fprintf_filtered (stream, "%s%s ",
217 BASETYPE_VIA_PUBLIC (type, i) ? "public" : "private",
218 BASETYPE_VIA_VIRTUAL(type, i) ? " virtual" : "");
219 name = type_name_no_tag (TYPE_BASECLASS (type, i));
220 fprintf_filtered (stream, "%s", name ? name : "(null)");
221 }
222 if (i > 0)
223 {
224 fputs_filtered (" ", stream);
225 }
226}
227
228/* Print any asterisks or open-parentheses needed before the
229 variable name (to describe its type).
230
231 On outermost call, pass 0 for PASSED_A_PTR.
232 On outermost call, SHOW > 0 means should ignore
233 any typename for TYPE and show its details.
234 SHOW is always zero on recursive calls. */
235
236void
237c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
238 struct type *type;
239 GDB_FILE *stream;
240 int show;
241 int passed_a_ptr;
242{
243 char *name;
244 if (type == 0)
245 return;
246
247 if (TYPE_NAME (type) && show <= 0)
248 return;
249
250 QUIT;
251
252 switch (TYPE_CODE (type))
253 {
254 case TYPE_CODE_PTR:
255 c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
256 fprintf_filtered (stream, "*");
257 break;
258
259 case TYPE_CODE_MEMBER:
260 if (passed_a_ptr)
261 fprintf_filtered (stream, "(");
262 c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
263 fprintf_filtered (stream, " ");
264 name = type_name_no_tag (TYPE_DOMAIN_TYPE (type));
265 if (name)
266 fputs_filtered (name, stream);
267 else
268 c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
269 fprintf_filtered (stream, "::");
270 break;
271
272 case TYPE_CODE_METHOD:
273 if (passed_a_ptr)
274 fprintf_unfiltered (stream, "(");
275 c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
276 if (passed_a_ptr)
277 {
278 fprintf_filtered (stream, " ");
279 c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
280 fprintf_filtered (stream, "::");
281 }
282 break;
283
284 case TYPE_CODE_REF:
285 c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
286 fprintf_filtered (stream, "&");
287 break;
288
289 case TYPE_CODE_FUNC:
290 c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
291 if (passed_a_ptr)
292 fprintf_filtered (stream, "(");
293 break;
294
295 case TYPE_CODE_ARRAY:
296 c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
297 if (passed_a_ptr)
298 fprintf_filtered (stream, "(");
299 break;
300
301 case TYPE_CODE_UNDEF:
302 case TYPE_CODE_STRUCT:
303 case TYPE_CODE_UNION:
304 case TYPE_CODE_ENUM:
305 case TYPE_CODE_INT:
306 case TYPE_CODE_FLT:
307 case TYPE_CODE_VOID:
308 case TYPE_CODE_ERROR:
309 case TYPE_CODE_CHAR:
310 case TYPE_CODE_BOOL:
311 case TYPE_CODE_SET:
312 case TYPE_CODE_RANGE:
313 case TYPE_CODE_STRING:
314 case TYPE_CODE_BITSTRING:
315 /* These types need no prefix. They are listed here so that
316 gcc -Wall will reveal any types that haven't been handled. */
317 break;
318 }
319}
320
321static void
322c_type_print_args (type, stream)
323 struct type *type;
324 GDB_FILE *stream;
325{
326 int i;
327 struct type **args;
328
329 fprintf_filtered (stream, "(");
330 args = TYPE_ARG_TYPES (type);
331 if (args != NULL)
332 {
333 if (args[1] == NULL)
334 {
335 fprintf_filtered (stream, "...");
336 }
337 else
338 {
339 for (i = 1;
340 args[i] != NULL && args[i]->code != TYPE_CODE_VOID;
341 i++)
342 {
343 c_print_type (args[i], "", stream, -1, 0);
344 if (args[i+1] == NULL)
345 {
346 fprintf_filtered (stream, "...");
347 }
348 else if (args[i+1]->code != TYPE_CODE_VOID)
349 {
350 fprintf_filtered (stream, ",");
351 wrap_here (" ");
352 }
353 }
354 }
355 }
356 fprintf_filtered (stream, ")");
357}
358
359/* Print any array sizes, function arguments or close parentheses
360 needed after the variable name (to describe its type).
361 Args work like c_type_print_varspec_prefix. */
362
363static void
364c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
365 struct type *type;
366 GDB_FILE *stream;
367 int show;
368 int passed_a_ptr;
369 int demangled_args;
370{
371 if (type == 0)
372 return;
373
374 if (TYPE_NAME (type) && show <= 0)
375 return;
376
377 QUIT;
378
379 switch (TYPE_CODE (type))
380 {
381 case TYPE_CODE_ARRAY:
382 if (passed_a_ptr)
383 fprintf_filtered (stream, ")");
384
385 fprintf_filtered (stream, "[");
386 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
387 fprintf_filtered (stream, "%d",
388 (TYPE_LENGTH (type)
389 / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
390 fprintf_filtered (stream, "]");
391
392 c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
393 break;
394
395 case TYPE_CODE_MEMBER:
396 if (passed_a_ptr)
397 fprintf_filtered (stream, ")");
398 c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
399 break;
400
401 case TYPE_CODE_METHOD:
402 if (passed_a_ptr)
403 fprintf_filtered (stream, ")");
404 c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
405 if (passed_a_ptr)
406 {
407 c_type_print_args (type, stream);
408 }
409 break;
410
411 case TYPE_CODE_PTR:
412 case TYPE_CODE_REF:
413 c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0);
414 break;
415
416 case TYPE_CODE_FUNC:
417 if (passed_a_ptr)
418 fprintf_filtered (stream, ")");
419 if (!demangled_args)
420 fprintf_filtered (stream, "()");
421 c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
422 passed_a_ptr, 0);
423 break;
424
425 case TYPE_CODE_UNDEF:
426 case TYPE_CODE_STRUCT:
427 case TYPE_CODE_UNION:
428 case TYPE_CODE_ENUM:
429 case TYPE_CODE_INT:
430 case TYPE_CODE_FLT:
431 case TYPE_CODE_VOID:
432 case TYPE_CODE_ERROR:
433 case TYPE_CODE_CHAR:
434 case TYPE_CODE_BOOL:
435 case TYPE_CODE_SET:
436 case TYPE_CODE_RANGE:
437 case TYPE_CODE_STRING:
438 case TYPE_CODE_BITSTRING:
439 /* These types do not need a suffix. They are listed so that
440 gcc -Wall will report types that may not have been considered. */
441 break;
442 }
443}
444
445/* Print the name of the type (or the ultimate pointer target,
446 function value or array element), or the description of a
447 structure or union.
448
449 SHOW positive means print details about the type (e.g. enum values),
450 and print structure elements passing SHOW - 1 for show.
451 SHOW negative means just print the type name or struct tag if there is one.
452 If there is no name, print something sensible but concise like
453 "struct {...}".
454 SHOW zero means just print the type name or struct tag if there is one.
455 If there is no name, print something sensible but not as concise like
456 "struct {int x; int y;}".
457
458 LEVEL is the number of spaces to indent by.
459 We increase it for some recursive calls. */
460
461void
462c_type_print_base (type, stream, show, level)
463 struct type *type;
464 GDB_FILE *stream;
465 int show;
466 int level;
467{
468 register int i;
469 register int len;
470 register int lastval;
471 char *mangled_name;
472 char *demangled_name;
473 enum {s_none, s_public, s_private, s_protected} section_type;
474 QUIT;
475
476 wrap_here (" ");
477 if (type == NULL)
478 {
479 fputs_filtered ("<type unknown>", stream);
480 return;
481 }
482
483 /* When SHOW is zero or less, and there is a valid type name, then always
484 just print the type name directly from the type. */
485 /* If we have "typedef struct foo {. . .} bar;" do we want to print it
486 as "struct foo" or as "bar"? Pick the latter, because C++ folk tend
487 to expect things like "class5 *foo" rather than "struct class5 *foo". */
488
489 if (show <= 0
490 && TYPE_NAME (type) != NULL)
491 {
492 fputs_filtered (TYPE_NAME (type), stream);
493 return;
494 }
495
496 check_stub_type (type);
497
498 switch (TYPE_CODE (type))
499 {
500 case TYPE_CODE_ARRAY:
501 case TYPE_CODE_PTR:
502 case TYPE_CODE_MEMBER:
503 case TYPE_CODE_REF:
504 case TYPE_CODE_FUNC:
505 case TYPE_CODE_METHOD:
506 c_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
507 break;
508
509 case TYPE_CODE_STRUCT:
510 if (HAVE_CPLUS_STRUCT (type))
511 {
512 fprintf_filtered (stream, "class ");
513 }
514 else
515 {
516 fprintf_filtered (stream, "struct ");
517 }
518 goto struct_union;
519
520 case TYPE_CODE_UNION:
521 fprintf_filtered (stream, "union ");
522
523 struct_union:
524 if (TYPE_TAG_NAME (type) != NULL)
525 {
526 fputs_filtered (TYPE_TAG_NAME (type), stream);
527 if (show > 0)
528 fputs_filtered (" ", stream);
529 }
530 wrap_here (" ");
531 if (show < 0)
532 {
533 /* If we just printed a tag name, no need to print anything else. */
534 if (TYPE_TAG_NAME (type) == NULL)
535 fprintf_filtered (stream, "{...}");
536 }
537 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
538 {
539 cp_type_print_derivation_info (stream, type);
540
541 fprintf_filtered (stream, "{\n");
542 if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
543 {
544 if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
545 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
546 else
547 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
548 }
549
550 /* Start off with no specific section type, so we can print
551 one for the first field we find, and use that section type
552 thereafter until we find another type. */
553
554 section_type = s_none;
555
556 /* If there is a base class for this type,
557 do not print the field that it occupies. */
558
559 len = TYPE_NFIELDS (type);
560 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
561 {
562 QUIT;
563 /* Don't print out virtual function table. */
564 if ((TYPE_FIELD_NAME (type, i))[5] == CPLUS_MARKER &&
565 !strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5))
566 continue;
567
568 /* If this is a C++ class we can print the various C++ section
569 labels. */
570
571 if (HAVE_CPLUS_STRUCT (type))
572 {
573 if (TYPE_FIELD_PROTECTED (type, i))
574 {
575 if (section_type != s_protected)
576 {
577 section_type = s_protected;
578 fprintfi_filtered (level + 2, stream,
579 "protected:\n");
580 }
581 }
582 else if (TYPE_FIELD_PRIVATE (type, i))
583 {
584 if (section_type != s_private)
585 {
586 section_type = s_private;
587 fprintfi_filtered (level + 2, stream, "private:\n");
588 }
589 }
590 else
591 {
592 if (section_type != s_public)
593 {
594 section_type = s_public;
595 fprintfi_filtered (level + 2, stream, "public:\n");
596 }
597 }
598 }
599
600 print_spaces_filtered (level + 4, stream);
601 if (TYPE_FIELD_STATIC (type, i))
602 {
603 fprintf_filtered (stream, "static ");
604 }
605 c_print_type (TYPE_FIELD_TYPE (type, i),
606 TYPE_FIELD_NAME (type, i),
607 stream, show - 1, level + 4);
608 if (!TYPE_FIELD_STATIC (type, i)
609 && TYPE_FIELD_PACKED (type, i))
610 {
611 /* It is a bitfield. This code does not attempt
612 to look at the bitpos and reconstruct filler,
613 unnamed fields. This would lead to misleading
614 results if the compiler does not put out fields
615 for such things (I don't know what it does). */
616 fprintf_filtered (stream, " : %d",
617 TYPE_FIELD_BITSIZE (type, i));
618 }
619 fprintf_filtered (stream, ";\n");
620 }
621
622 /* If there are both fields and methods, put a space between. */
623 len = TYPE_NFN_FIELDS (type);
624 if (len && section_type != s_none)
625 fprintf_filtered (stream, "\n");
626
627 /* C++: print out the methods */
628
629 for (i = 0; i < len; i++)
630 {
631 struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
632 int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
633 char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
634 char *name = type_name_no_tag (type);
635 int is_constructor = name && STREQ(method_name, name);
636 for (j = 0; j < len2; j++)
637 {
638 QUIT;
639 if (TYPE_FN_FIELD_PROTECTED (f, j))
640 {
641 if (section_type != s_protected)
642 {
643 section_type = s_protected;
644 fprintfi_filtered (level + 2, stream,
645 "protected:\n");
646 }
647 }
648 else if (TYPE_FN_FIELD_PRIVATE (f, j))
649 {
650 if (section_type != s_private)
651 {
652 section_type = s_private;
653 fprintfi_filtered (level + 2, stream, "private:\n");
654 }
655 }
656 else
657 {
658 if (section_type != s_public)
659 {
660 section_type = s_public;
661 fprintfi_filtered (level + 2, stream, "public:\n");
662 }
663 }
664
665 print_spaces_filtered (level + 4, stream);
666 if (TYPE_FN_FIELD_VIRTUAL_P (f, j))
667 fprintf_filtered (stream, "virtual ");
668 else if (TYPE_FN_FIELD_STATIC_P (f, j))
669 fprintf_filtered (stream, "static ");
670 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
671 {
672 /* Keep GDB from crashing here. */
673 fprintf_unfiltered (stream, "<undefined type> %s;\n",
674 TYPE_FN_FIELD_PHYSNAME (f, j));
675 break;
676 }
677 else if (!is_constructor)
678 {
679 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
680 "", stream, 0);
681 fputs_filtered (" ", stream);
682 }
683 if (TYPE_FN_FIELD_STUB (f, j))
684 {
685 /* Build something we can demangle. */
686 mangled_name = gdb_mangle_name (type, i, j);
687 demangled_name =
688 cplus_demangle (mangled_name,
689 DMGL_ANSI | DMGL_PARAMS);
690 if (demangled_name == NULL)
691 fprintf_filtered (stream, "<badly mangled name %s>",
692 mangled_name);
693 else
694 {
695 char *demangled_no_class =
696 strchr (demangled_name, ':');
697
698 if (demangled_no_class == NULL)
699 demangled_no_class = demangled_name;
700 else
701 {
702 if (*++demangled_no_class == ':')
703 ++demangled_no_class;
704 }
705 fputs_filtered (demangled_no_class, stream);
706 free (demangled_name);
707 }
708 free (mangled_name);
709 }
710 else if (TYPE_FN_FIELD_PHYSNAME (f, j)[0] == '_'
711 && TYPE_FN_FIELD_PHYSNAME (f, j)[1] == CPLUS_MARKER)
712 cp_type_print_method_args (TYPE_FN_FIELD_ARGS (f, j) + 1,
713 "~", method_name, 0, stream);
714 else
715 cp_type_print_method_args (TYPE_FN_FIELD_ARGS (f, j), "",
716 method_name,
717 TYPE_FN_FIELD_STATIC_P (f, j),
718 stream);
719
720 fprintf_filtered (stream, ";\n");
721 }
722 }
723
724 fprintfi_filtered (level, stream, "}");
725 }
726 break;
727
728 case TYPE_CODE_ENUM:
729 fprintf_filtered (stream, "enum ");
730 if (TYPE_TAG_NAME (type) != NULL)
731 {
732 fputs_filtered (TYPE_TAG_NAME (type), stream);
733 if (show > 0)
734 fputs_filtered (" ", stream);
735 }
736
737 wrap_here (" ");
738 if (show < 0)
739 {
740 /* If we just printed a tag name, no need to print anything else. */
741 if (TYPE_TAG_NAME (type) == NULL)
742 fprintf_filtered (stream, "{...}");
743 }
744 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
745 {
746 fprintf_filtered (stream, "{");
747 len = TYPE_NFIELDS (type);
748 lastval = 0;
749 for (i = 0; i < len; i++)
750 {
751 QUIT;
752 if (i) fprintf_filtered (stream, ", ");
753 wrap_here (" ");
754 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
755 if (lastval != TYPE_FIELD_BITPOS (type, i))
756 {
757 fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
758 lastval = TYPE_FIELD_BITPOS (type, i);
759 }
760 lastval++;
761 }
762 fprintf_filtered (stream, "}");
763 }
764 break;
765
766 case TYPE_CODE_VOID:
767 fprintf_filtered (stream, "void");
768 break;
769
770 case TYPE_CODE_UNDEF:
771 fprintf_filtered (stream, "struct <unknown>");
772 break;
773
774 case TYPE_CODE_ERROR:
775 fprintf_filtered (stream, "<unknown type>");
776 break;
777
778 case TYPE_CODE_RANGE:
779 /* This should not occur */
780 fprintf_filtered (stream, "<range type>");
781 break;
782
783 default:
784 /* Handle types not explicitly handled by the other cases,
785 such as fundamental types. For these, just print whatever
786 the type name is, as recorded in the type itself. If there
787 is no type name, then complain. */
788 if (TYPE_NAME (type) != NULL)
789 {
790 fputs_filtered (TYPE_NAME (type), stream);
791 }
792 else
793 {
794 /* At least for dump_symtab, it is important that this not be
795 an error (). */
796 fprintf_filtered (stream, "<invalid type code %d>",
797 TYPE_CODE (type));
798 }
799 break;
800 }
801}
802
This page took 0.028359 seconds and 4 git commands to generate.