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