]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/gdb/gdb/c-typeprint.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / gdb / gdb / c-typeprint.c
1 /* Support for printing C and C++ types for GDB, the GNU debugger.
2    Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
3    1999, 2000, 2001, 2002, 2003
4    Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
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 "demangle.h"
34 #include "c-lang.h"
35 #include "typeprint.h"
36 #include "cp-abi.h"
37
38 #include "gdb_string.h"
39 #include <errno.h>
40
41 /* Flag indicating target was compiled by HP compiler */
42 extern int hp_som_som_object_present;
43
44 static void cp_type_print_method_args (struct type *mtype, char *prefix,
45                                        char *varstring, int staticp,
46                                        struct ui_file *stream);
47
48 static void c_type_print_args (struct type *, struct ui_file *);
49
50 static void cp_type_print_derivation_info (struct ui_file *, struct type *);
51
52 static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int,
53                                          int, int);
54
55 /* Print "const", "volatile", or address space modifiers. */
56 static void c_type_print_modifier (struct type *, struct ui_file *,
57                                    int, int);
58 \f
59
60
61
62 /* LEVEL is the depth to indent lines by.  */
63
64 void
65 c_print_type (struct type *type, char *varstring, struct ui_file *stream,
66               int show, int level)
67 {
68   enum type_code code;
69   int demangled_args;
70   int need_post_space;
71
72   if (show > 0)
73     CHECK_TYPEDEF (type);
74
75   c_type_print_base (type, stream, show, level);
76   code = TYPE_CODE (type);
77   if ((varstring != NULL && *varstring != '\0')
78       ||
79   /* Need a space if going to print stars or brackets;
80      but not if we will print just a type name.  */
81       ((show > 0 || TYPE_NAME (type) == 0)
82        &&
83        (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
84         || code == TYPE_CODE_METHOD
85         || code == TYPE_CODE_ARRAY
86         || code == TYPE_CODE_MEMBER
87         || code == TYPE_CODE_REF)))
88     fputs_filtered (" ", stream);
89   need_post_space = (varstring != NULL && strcmp (varstring, "") != 0);
90   c_type_print_varspec_prefix (type, stream, show, 0, need_post_space);
91
92   if (varstring != NULL)
93     {
94       fputs_filtered (varstring, stream);
95
96       /* For demangled function names, we have the arglist as part of the name,
97          so don't print an additional pair of ()'s */
98
99       demangled_args = strchr (varstring, '(') != NULL;
100       c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
101     }
102 }
103
104 /* If TYPE is a derived type, then print out derivation information.
105    Print only the actual base classes of this type, not the base classes
106    of the base classes.  I.E.  for the derivation hierarchy:
107
108    class A { int a; };
109    class B : public A {int b; };
110    class C : public B {int c; };
111
112    Print the type of class C as:
113
114    class C : public B {
115    int c;
116    }
117
118    Not as the following (like gdb used to), which is not legal C++ syntax for
119    derived types and may be confused with the multiple inheritance form:
120
121    class C : public B : public A {
122    int c;
123    }
124
125    In general, gdb should try to print the types as closely as possible to
126    the form that they appear in the source code. 
127    Note that in case of protected derivation gcc will not say 'protected' 
128    but 'private'. The HP's aCC compiler emits specific information for 
129    derivation via protected inheritance, so gdb can print it out */
130
131 static void
132 cp_type_print_derivation_info (struct ui_file *stream, struct type *type)
133 {
134   char *name;
135   int i;
136
137   for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
138     {
139       fputs_filtered (i == 0 ? ": " : ", ", stream);
140       fprintf_filtered (stream, "%s%s ",
141                         BASETYPE_VIA_PUBLIC (type, i) ? "public"
142                : (TYPE_FIELD_PROTECTED (type, i) ? "protected" : "private"),
143                         BASETYPE_VIA_VIRTUAL (type, i) ? " virtual" : "");
144       name = type_name_no_tag (TYPE_BASECLASS (type, i));
145       fprintf_filtered (stream, "%s", name ? name : "(null)");
146     }
147   if (i > 0)
148     {
149       fputs_filtered (" ", stream);
150     }
151 }
152
153 /* Print the C++ method arguments ARGS to the file STREAM.  */
154
155 static void
156 cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring,
157                            int staticp, struct ui_file *stream)
158 {
159   struct field *args = TYPE_FIELDS (mtype);
160   int nargs = TYPE_NFIELDS (mtype);
161   int varargs = TYPE_VARARGS (mtype);
162   int i;
163
164   fprintf_symbol_filtered (stream, prefix, language_cplus, DMGL_ANSI);
165   fprintf_symbol_filtered (stream, varstring, language_cplus, DMGL_ANSI);
166   fputs_filtered ("(", stream);
167
168   /* Skip the class variable.  */
169   i = staticp ? 0 : 1;
170   if (nargs > i)
171     {
172       while (i < nargs)
173         {
174           type_print (args[i++].type, "", stream, 0);
175
176           if (i == nargs && varargs)
177             fprintf_filtered (stream, ", ...");
178           else if (i < nargs)
179             fprintf_filtered (stream, ", ");
180         }
181     }
182   else if (varargs)
183     fprintf_filtered (stream, "...");
184   else if (current_language->la_language == language_cplus)
185     fprintf_filtered (stream, "void");
186
187   fprintf_filtered (stream, ")");
188 }
189
190
191 /* Print any asterisks or open-parentheses needed before the
192    variable name (to describe its type).
193
194    On outermost call, pass 0 for PASSED_A_PTR.
195    On outermost call, SHOW > 0 means should ignore
196    any typename for TYPE and show its details.
197    SHOW is always zero on recursive calls.
198    
199    NEED_POST_SPACE is non-zero when a space will be be needed
200    between a trailing qualifier and a field, variable, or function
201    name.  */
202
203 void
204 c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
205                              int show, int passed_a_ptr, int need_post_space)
206 {
207   char *name;
208   if (type == 0)
209     return;
210
211   if (TYPE_NAME (type) && show <= 0)
212     return;
213
214   QUIT;
215
216   switch (TYPE_CODE (type))
217     {
218     case TYPE_CODE_PTR:
219       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 1, 1);
220       fprintf_filtered (stream, "*");
221       c_type_print_modifier (type, stream, 1, need_post_space);
222       break;
223
224     case TYPE_CODE_MEMBER:
225       if (passed_a_ptr)
226         fprintf_filtered (stream, "(");
227       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
228       fprintf_filtered (stream, " ");
229       name = type_name_no_tag (TYPE_DOMAIN_TYPE (type));
230       if (name)
231         fputs_filtered (name, stream);
232       else
233         c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
234       fprintf_filtered (stream, "::");
235       break;
236
237     case TYPE_CODE_METHOD:
238       if (passed_a_ptr)
239         fprintf_filtered (stream, "(");
240       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
241       if (passed_a_ptr)
242         {
243           fprintf_filtered (stream, " ");
244           c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
245           fprintf_filtered (stream, "::");
246         }
247       break;
248
249     case TYPE_CODE_REF:
250       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 1, 0);
251       fprintf_filtered (stream, "&");
252       c_type_print_modifier (type, stream, 1, need_post_space);
253       break;
254
255     case TYPE_CODE_FUNC:
256       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
257       if (passed_a_ptr)
258         fprintf_filtered (stream, "(");
259       break;
260
261     case TYPE_CODE_ARRAY:
262       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
263       if (passed_a_ptr)
264         fprintf_filtered (stream, "(");
265       break;
266
267     case TYPE_CODE_TYPEDEF:
268       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
269       break;
270
271     case TYPE_CODE_UNDEF:
272     case TYPE_CODE_STRUCT:
273     case TYPE_CODE_UNION:
274     case TYPE_CODE_ENUM:
275     case TYPE_CODE_INT:
276     case TYPE_CODE_FLT:
277     case TYPE_CODE_VOID:
278     case TYPE_CODE_ERROR:
279     case TYPE_CODE_CHAR:
280     case TYPE_CODE_BOOL:
281     case TYPE_CODE_SET:
282     case TYPE_CODE_RANGE:
283     case TYPE_CODE_STRING:
284     case TYPE_CODE_BITSTRING:
285     case TYPE_CODE_COMPLEX:
286     case TYPE_CODE_TEMPLATE:
287     case TYPE_CODE_NAMESPACE:
288       /* These types need no prefix.  They are listed here so that
289          gcc -Wall will reveal any types that haven't been handled.  */
290       break;
291     default:
292       error ("type not handled in c_type_print_varspec_prefix()");
293       break;
294     }
295 }
296
297 /* Print out "const" and "volatile" attributes.
298    TYPE is a pointer to the type being printed out.
299    STREAM is the output destination.
300    NEED_SPACE = 1 indicates an initial white space is needed */
301
302 static void
303 c_type_print_modifier (struct type *type, struct ui_file *stream,
304                        int need_pre_space, int need_post_space)
305 {
306   int did_print_modifier = 0;
307   const char *address_space_id;
308
309   /* We don't print `const' qualifiers for references --- since all
310      operators affect the thing referenced, not the reference itself,
311      every reference is `const'.  */
312   if (TYPE_CONST (type)
313       && TYPE_CODE (type) != TYPE_CODE_REF)
314     {
315       if (need_pre_space)
316         fprintf_filtered (stream, " ");
317       fprintf_filtered (stream, "const");
318       did_print_modifier = 1;
319     }
320
321   if (TYPE_VOLATILE (type))
322     {
323       if (did_print_modifier || need_pre_space)
324         fprintf_filtered (stream, " ");
325       fprintf_filtered (stream, "volatile");
326       did_print_modifier = 1;
327     }
328
329   address_space_id = address_space_int_to_name (TYPE_INSTANCE_FLAGS (type));
330   if (address_space_id)
331     {
332       if (did_print_modifier || need_pre_space)
333         fprintf_filtered (stream, " ");
334       fprintf_filtered (stream, "@%s", address_space_id);
335       did_print_modifier = 1;
336     }
337
338   if (did_print_modifier && need_post_space)
339     fprintf_filtered (stream, " ");
340 }
341
342
343
344
345 static void
346 c_type_print_args (struct type *type, struct ui_file *stream)
347 {
348   int i;
349   struct field *args;
350
351   fprintf_filtered (stream, "(");
352   args = TYPE_FIELDS (type);
353   if (args != NULL)
354     {
355       int i;
356
357       /* FIXME drow/2002-05-31: Always skips the first argument,
358          should we be checking for static members?  */
359
360       for (i = 1; i < TYPE_NFIELDS (type); i++)
361         {
362           c_print_type (args[i].type, "", stream, -1, 0);
363           if (i != TYPE_NFIELDS (type))
364             {
365               fprintf_filtered (stream, ",");
366               wrap_here ("    ");
367             }
368         }
369       if (TYPE_VARARGS (type))
370         fprintf_filtered (stream, "...");
371       else if (i == 1
372                && (current_language->la_language == language_cplus))
373         fprintf_filtered (stream, "void");
374     }
375   else if (current_language->la_language == language_cplus)
376     {
377       fprintf_filtered (stream, "void");
378     }
379
380   fprintf_filtered (stream, ")");
381 }
382
383
384 /* Return true iff the j'th overloading of the i'th method of TYPE
385    is a type conversion operator, like `operator int () { ... }'.
386    When listing a class's methods, we don't print the return type of
387    such operators.  */
388 static int
389 is_type_conversion_operator (struct type *type, int i, int j)
390 {
391   /* I think the whole idea of recognizing type conversion operators
392      by their name is pretty terrible.  But I don't think our present
393      data structure gives us any other way to tell.  If you know of
394      some other way, feel free to rewrite this function.  */
395   char *name = TYPE_FN_FIELDLIST_NAME (type, i);
396
397   if (strncmp (name, "operator", 8) != 0)
398     return 0;
399
400   name += 8;
401   if (! strchr (" \t\f\n\r", *name))
402     return 0;
403
404   while (strchr (" \t\f\n\r", *name))
405     name++;
406
407   if (!('a' <= *name && *name <= 'z')
408       && !('A' <= *name && *name <= 'Z')
409       && *name != '_')
410     /* If this doesn't look like the start of an identifier, then it
411        isn't a type conversion operator.  */
412     return 0;
413   else if (strncmp (name, "new", 3) == 0)
414     name += 3;
415   else if (strncmp (name, "delete", 6) == 0)
416     name += 6;
417   else
418     /* If it doesn't look like new or delete, it's a type conversion
419        operator.  */
420     return 1;
421
422   /* Is that really the end of the name?  */
423   if (('a' <= *name && *name <= 'z')
424       || ('A' <= *name && *name <= 'Z')
425       || ('0' <= *name && *name <= '9')
426       || *name == '_')
427     /* No, so the identifier following "operator" must be a type name,
428        and this is a type conversion operator.  */
429     return 1;
430
431   /* That was indeed the end of the name, so it was `operator new' or
432      `operator delete', neither of which are type conversion operators.  */
433   return 0;
434 }
435
436
437 /* Given a C++ qualified identifier QID, strip off the qualifiers,
438    yielding the unqualified name.  The return value is a pointer into
439    the original string.
440
441    It's a pity we don't have this information in some more structured
442    form.  Even the author of this function feels that writing little
443    parsers like this everywhere is stupid.  */
444 static char *
445 remove_qualifiers (char *qid)
446 {
447   int quoted = 0;               /* zero if we're not in quotes;
448                                    '"' if we're in a double-quoted string;
449                                    '\'' if we're in a single-quoted string.  */
450   int depth = 0;                /* number of unclosed parens we've seen */
451   char *parenstack = (char *) alloca (strlen (qid));
452   char *scan;
453   char *last = 0;               /* The character after the rightmost
454                                    `::' token we've seen so far.  */
455
456   for (scan = qid; *scan; scan++)
457     {
458       if (quoted)
459         {
460           if (*scan == quoted)
461             quoted = 0;
462           else if (*scan == '\\' && *(scan + 1))
463             scan++;
464         }
465       else if (scan[0] == ':' && scan[1] == ':')
466         {
467           /* If we're inside parenthesis (i.e., an argument list) or
468              angle brackets (i.e., a list of template arguments), then
469              we don't record the position of this :: token, since it's
470              not relevant to the top-level structure we're trying
471              to operate on.  */
472           if (depth == 0)
473             {
474               last = scan + 2;
475               scan++;
476             }
477         }
478       else if (*scan == '"' || *scan == '\'')
479         quoted = *scan;
480       else if (*scan == '(')
481         parenstack[depth++] = ')';
482       else if (*scan == '[')
483         parenstack[depth++] = ']';
484       /* We're going to treat <> as a pair of matching characters,
485          since we're more likely to see those in template id's than
486          real less-than characters.  What a crock.  */
487       else if (*scan == '<')
488         parenstack[depth++] = '>';
489       else if (*scan == ')' || *scan == ']' || *scan == '>')
490         {
491           if (depth > 0 && parenstack[depth - 1] == *scan)
492             depth--;
493           else
494             {
495               /* We're going to do a little error recovery here.  If we
496                  don't find a match for *scan on the paren stack, but
497                  there is something lower on the stack that does match, we
498                  pop the stack to that point.  */
499               int i;
500
501               for (i = depth - 1; i >= 0; i--)
502                 if (parenstack[i] == *scan)
503                   {
504                     depth = i;
505                     break;
506                   }
507             }
508         }
509     }
510
511   if (last)
512     return last;
513   else
514     /* We didn't find any :: tokens at the top level, so declare the
515        whole thing an unqualified identifier.  */
516     return qid;
517 }
518
519
520 /* Print any array sizes, function arguments or close parentheses
521    needed after the variable name (to describe its type).
522    Args work like c_type_print_varspec_prefix.  */
523
524 void
525 c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
526                              int show, int passed_a_ptr, int demangled_args)
527 {
528   if (type == 0)
529     return;
530
531   if (TYPE_NAME (type) && show <= 0)
532     return;
533
534   QUIT;
535
536   switch (TYPE_CODE (type))
537     {
538     case TYPE_CODE_ARRAY:
539       if (passed_a_ptr)
540         fprintf_filtered (stream, ")");
541
542       fprintf_filtered (stream, "[");
543       if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
544         && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED)
545         fprintf_filtered (stream, "%d",
546                           (TYPE_LENGTH (type)
547                            / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
548       fprintf_filtered (stream, "]");
549
550       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
551                                    0, 0);
552       break;
553
554     case TYPE_CODE_MEMBER:
555       if (passed_a_ptr)
556         fprintf_filtered (stream, ")");
557       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
558                                    0, 0);
559       break;
560
561     case TYPE_CODE_METHOD:
562       if (passed_a_ptr)
563         fprintf_filtered (stream, ")");
564       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
565                                    0, 0);
566       if (passed_a_ptr)
567         {
568           c_type_print_args (type, stream);
569         }
570       break;
571
572     case TYPE_CODE_PTR:
573     case TYPE_CODE_REF:
574       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
575                                    1, 0);
576       break;
577
578     case TYPE_CODE_FUNC:
579       if (passed_a_ptr)
580         fprintf_filtered (stream, ")");
581       if (!demangled_args)
582         {
583           int i, len = TYPE_NFIELDS (type);
584           fprintf_filtered (stream, "(");
585           if (len == 0
586               && (TYPE_PROTOTYPED (type)
587                   || current_language->la_language == language_cplus))
588             {
589               fprintf_filtered (stream, "void");
590             }
591           else
592             for (i = 0; i < len; i++)
593               {
594                 if (i > 0)
595                   {
596                     fputs_filtered (", ", stream);
597                     wrap_here ("    ");
598                   }
599                 c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
600               }
601           fprintf_filtered (stream, ")");
602         }
603       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
604                                    passed_a_ptr, 0);
605       break;
606
607     case TYPE_CODE_TYPEDEF:
608       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
609                                    passed_a_ptr, 0);
610       break;
611
612     case TYPE_CODE_UNDEF:
613     case TYPE_CODE_STRUCT:
614     case TYPE_CODE_UNION:
615     case TYPE_CODE_ENUM:
616     case TYPE_CODE_INT:
617     case TYPE_CODE_FLT:
618     case TYPE_CODE_VOID:
619     case TYPE_CODE_ERROR:
620     case TYPE_CODE_CHAR:
621     case TYPE_CODE_BOOL:
622     case TYPE_CODE_SET:
623     case TYPE_CODE_RANGE:
624     case TYPE_CODE_STRING:
625     case TYPE_CODE_BITSTRING:
626     case TYPE_CODE_COMPLEX:
627     case TYPE_CODE_TEMPLATE:
628     case TYPE_CODE_NAMESPACE:
629       /* These types do not need a suffix.  They are listed so that
630          gcc -Wall will report types that may not have been considered.  */
631       break;
632     default:
633       error ("type not handled in c_type_print_varspec_suffix()");
634       break;
635     }
636 }
637
638 /* Print the name of the type (or the ultimate pointer target,
639    function value or array element), or the description of a
640    structure or union.
641
642    SHOW positive means print details about the type (e.g. enum values),
643    and print structure elements passing SHOW - 1 for show.
644    SHOW negative means just print the type name or struct tag if there is one.
645    If there is no name, print something sensible but concise like
646    "struct {...}".
647    SHOW zero means just print the type name or struct tag if there is one.
648    If there is no name, print something sensible but not as concise like
649    "struct {int x; int y;}".
650
651    LEVEL is the number of spaces to indent by.
652    We increase it for some recursive calls.  */
653
654 void
655 c_type_print_base (struct type *type, struct ui_file *stream, int show,
656                    int level)
657 {
658   int i;
659   int len, real_len;
660   int lastval;
661   char *mangled_name;
662   char *demangled_name;
663   char *demangled_no_static;
664   enum
665     {
666       s_none, s_public, s_private, s_protected
667     }
668   section_type;
669   int need_access_label = 0;
670   int j, len2;
671
672   QUIT;
673
674   wrap_here ("    ");
675   if (type == NULL)
676     {
677       fputs_filtered ("<type unknown>", stream);
678       return;
679     }
680
681   /* When SHOW is zero or less, and there is a valid type name, then always
682      just print the type name directly from the type.  */
683   /* If we have "typedef struct foo {. . .} bar;" do we want to print it
684      as "struct foo" or as "bar"?  Pick the latter, because C++ folk tend
685      to expect things like "class5 *foo" rather than "struct class5 *foo".  */
686
687   if (show <= 0
688       && TYPE_NAME (type) != NULL)
689     {
690       c_type_print_modifier (type, stream, 0, 1);
691       fputs_filtered (TYPE_NAME (type), stream);
692       return;
693     }
694
695   CHECK_TYPEDEF (type);
696
697   switch (TYPE_CODE (type))
698     {
699     case TYPE_CODE_TYPEDEF:
700     case TYPE_CODE_ARRAY:
701     case TYPE_CODE_PTR:
702     case TYPE_CODE_MEMBER:
703     case TYPE_CODE_REF:
704     case TYPE_CODE_FUNC:
705     case TYPE_CODE_METHOD:
706       c_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
707       break;
708
709     case TYPE_CODE_STRUCT:
710       c_type_print_modifier (type, stream, 0, 1);
711       /* Note TYPE_CODE_STRUCT and TYPE_CODE_CLASS have the same value,
712        * so we use another means for distinguishing them.
713        */
714       if (HAVE_CPLUS_STRUCT (type))
715         {
716           switch (TYPE_DECLARED_TYPE (type))
717             {
718             case DECLARED_TYPE_CLASS:
719               fprintf_filtered (stream, "class ");
720               break;
721             case DECLARED_TYPE_UNION:
722               fprintf_filtered (stream, "union ");
723               break;
724             case DECLARED_TYPE_STRUCT:
725               fprintf_filtered (stream, "struct ");
726               break;
727             default:
728               /* If there is a CPLUS_STRUCT, assume class if not
729                * otherwise specified in the declared_type field.
730                */
731               fprintf_filtered (stream, "class ");
732               break;
733             }                   /* switch */
734         }
735       else
736         {
737           /* If not CPLUS_STRUCT, then assume it's a C struct */
738           fprintf_filtered (stream, "struct ");
739         }
740       goto struct_union;
741
742     case TYPE_CODE_UNION:
743       c_type_print_modifier (type, stream, 0, 1);
744       fprintf_filtered (stream, "union ");
745
746     struct_union:
747
748       /* Print the tag if it exists. 
749        * The HP aCC compiler emits
750        * a spurious "{unnamed struct}"/"{unnamed union}"/"{unnamed enum}"
751        * tag  for unnamed struct/union/enum's, which we don't
752        * want to print.
753        */
754       if (TYPE_TAG_NAME (type) != NULL &&
755           strncmp (TYPE_TAG_NAME (type), "{unnamed", 8))
756         {
757           fputs_filtered (TYPE_TAG_NAME (type), stream);
758           if (show > 0)
759             fputs_filtered (" ", stream);
760         }
761       wrap_here ("    ");
762       if (show < 0)
763         {
764           /* If we just printed a tag name, no need to print anything else.  */
765           if (TYPE_TAG_NAME (type) == NULL)
766             fprintf_filtered (stream, "{...}");
767         }
768       else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
769         {
770           cp_type_print_derivation_info (stream, type);
771
772           fprintf_filtered (stream, "{\n");
773           if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
774             {
775               if (TYPE_STUB (type))
776                 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
777               else
778                 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
779             }
780
781           /* Start off with no specific section type, so we can print
782              one for the first field we find, and use that section type
783              thereafter until we find another type. */
784
785           section_type = s_none;
786
787           /* For a class, if all members are private, there's no need
788              for a "private:" label; similarly, for a struct or union
789              masquerading as a class, if all members are public, there's
790              no need for a "public:" label. */
791
792           if ((TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_CLASS) ||
793               (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_TEMPLATE))
794             {
795               QUIT;
796               len = TYPE_NFIELDS (type);
797               for (i = TYPE_N_BASECLASSES (type); i < len; i++)
798                 if (!TYPE_FIELD_PRIVATE (type, i))
799                   {
800                     need_access_label = 1;
801                     break;
802                   }
803               QUIT;
804               if (!need_access_label)
805                 {
806                   len2 = TYPE_NFN_FIELDS (type);
807                   for (j = 0; j < len2; j++)
808                     {
809                       len = TYPE_FN_FIELDLIST_LENGTH (type, j);
810                       for (i = 0; i < len; i++)
811                         if (!TYPE_FN_FIELD_PRIVATE (TYPE_FN_FIELDLIST1 (type, j), i))
812                           {
813                             need_access_label = 1;
814                             break;
815                           }
816                       if (need_access_label)
817                         break;
818                     }
819                 }
820             }
821           else if ((TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_STRUCT) ||
822                    (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION))
823             {
824               QUIT;
825               len = TYPE_NFIELDS (type);
826               for (i = TYPE_N_BASECLASSES (type); i < len; i++)
827                 if (TYPE_FIELD_PRIVATE (type, i) || TYPE_FIELD_PROTECTED (type, i))
828                   {
829                     need_access_label = 1;
830                     break;
831                   }
832               QUIT;
833               if (!need_access_label)
834                 {
835                   len2 = TYPE_NFN_FIELDS (type);
836                   for (j = 0; j < len2; j++)
837                     {
838                       QUIT;
839                       len = TYPE_FN_FIELDLIST_LENGTH (type, j);
840                       for (i = 0; i < len; i++)
841                         if (TYPE_FN_FIELD_PRIVATE (TYPE_FN_FIELDLIST1 (type, j), i) ||
842                             TYPE_FN_FIELD_PROTECTED (TYPE_FN_FIELDLIST1 (type, j), i))
843                           {
844                             need_access_label = 1;
845                             break;
846                           }
847                       if (need_access_label)
848                         break;
849                     }
850                 }
851             }
852
853           /* If there is a base class for this type,
854              do not print the field that it occupies.  */
855
856           len = TYPE_NFIELDS (type);
857           for (i = TYPE_N_BASECLASSES (type); i < len; i++)
858             {
859               QUIT;
860               /* Don't print out virtual function table.  */
861               /* HP ANSI C++ case */
862               if (TYPE_HAS_VTABLE (type)
863                   && (strncmp (TYPE_FIELD_NAME (type, i), "__vfp", 5) == 0))
864                 continue;
865               /* Other compilers */
866               if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0
867                   && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
868                 continue;
869
870               /* If this is a C++ class we can print the various C++ section
871                  labels. */
872
873               if (HAVE_CPLUS_STRUCT (type) && need_access_label)
874                 {
875                   if (TYPE_FIELD_PROTECTED (type, i))
876                     {
877                       if (section_type != s_protected)
878                         {
879                           section_type = s_protected;
880                           fprintfi_filtered (level + 2, stream,
881                                              "protected:\n");
882                         }
883                     }
884                   else if (TYPE_FIELD_PRIVATE (type, i))
885                     {
886                       if (section_type != s_private)
887                         {
888                           section_type = s_private;
889                           fprintfi_filtered (level + 2, stream, "private:\n");
890                         }
891                     }
892                   else
893                     {
894                       if (section_type != s_public)
895                         {
896                           section_type = s_public;
897                           fprintfi_filtered (level + 2, stream, "public:\n");
898                         }
899                     }
900                 }
901
902               print_spaces_filtered (level + 4, stream);
903               if (TYPE_FIELD_STATIC (type, i))
904                 {
905                   fprintf_filtered (stream, "static ");
906                 }
907               c_print_type (TYPE_FIELD_TYPE (type, i),
908                             TYPE_FIELD_NAME (type, i),
909                             stream, show - 1, level + 4);
910               if (!TYPE_FIELD_STATIC (type, i)
911                   && TYPE_FIELD_PACKED (type, i))
912                 {
913                   /* It is a bitfield.  This code does not attempt
914                      to look at the bitpos and reconstruct filler,
915                      unnamed fields.  This would lead to misleading
916                      results if the compiler does not put out fields
917                      for such things (I don't know what it does).  */
918                   fprintf_filtered (stream, " : %d",
919                                     TYPE_FIELD_BITSIZE (type, i));
920                 }
921               fprintf_filtered (stream, ";\n");
922             }
923
924           /* If there are both fields and methods, put a blank line
925               between them.  Make sure to count only method that we will
926               display; artificial methods will be hidden.  */
927           len = TYPE_NFN_FIELDS (type);
928           real_len = 0;
929           for (i = 0; i < len; i++)
930             {
931               struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
932               int len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
933               int j;
934               for (j = 0; j < len2; j++)
935                 if (!TYPE_FN_FIELD_ARTIFICIAL (f, j))
936                   real_len++;
937             }
938           if (real_len > 0 && section_type != s_none)
939             fprintf_filtered (stream, "\n");
940
941           /* C++: print out the methods */
942           for (i = 0; i < len; i++)
943             {
944               struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
945               int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
946               char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
947               char *name = type_name_no_tag (type);
948               int is_constructor = name && strcmp (method_name, name) == 0;
949               for (j = 0; j < len2; j++)
950                 {
951                   char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
952                   int is_full_physname_constructor =
953                    is_constructor_name (physname) 
954                    || is_destructor_name (physname)
955                    || method_name[0] == '~';
956
957                   /* Do not print out artificial methods.  */
958                   if (TYPE_FN_FIELD_ARTIFICIAL (f, j))
959                     continue;
960
961                   QUIT;
962                   if (TYPE_FN_FIELD_PROTECTED (f, j))
963                     {
964                       if (section_type != s_protected)
965                         {
966                           section_type = s_protected;
967                           fprintfi_filtered (level + 2, stream,
968                                              "protected:\n");
969                         }
970                     }
971                   else if (TYPE_FN_FIELD_PRIVATE (f, j))
972                     {
973                       if (section_type != s_private)
974                         {
975                           section_type = s_private;
976                           fprintfi_filtered (level + 2, stream, "private:\n");
977                         }
978                     }
979                   else
980                     {
981                       if (section_type != s_public)
982                         {
983                           section_type = s_public;
984                           fprintfi_filtered (level + 2, stream, "public:\n");
985                         }
986                     }
987
988                   print_spaces_filtered (level + 4, stream);
989                   if (TYPE_FN_FIELD_VIRTUAL_P (f, j))
990                     fprintf_filtered (stream, "virtual ");
991                   else if (TYPE_FN_FIELD_STATIC_P (f, j))
992                     fprintf_filtered (stream, "static ");
993                   if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
994                     {
995                       /* Keep GDB from crashing here.  */
996                       fprintf_filtered (stream, "<undefined type> %s;\n",
997                                         TYPE_FN_FIELD_PHYSNAME (f, j));
998                       break;
999                     }
1000                   else if (!is_constructor &&   /* constructors don't have declared types */
1001                            !is_full_physname_constructor &&     /*    " "  */
1002                            !is_type_conversion_operator (type, i, j))
1003                     {
1004                       type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
1005                                   "", stream, -1);
1006                       fputs_filtered (" ", stream);
1007                     }
1008                   if (TYPE_FN_FIELD_STUB (f, j))
1009                     /* Build something we can demangle.  */
1010                     mangled_name = gdb_mangle_name (type, i, j);
1011                   else
1012                     mangled_name = TYPE_FN_FIELD_PHYSNAME (f, j);
1013
1014                   demangled_name =
1015                     cplus_demangle (mangled_name,
1016                                     DMGL_ANSI | DMGL_PARAMS);
1017                   if (demangled_name == NULL)
1018                     {
1019                       /* in some cases (for instance with the HP demangling),
1020                          if a function has more than 10 arguments, 
1021                          the demangling will fail.
1022                          Let's try to reconstruct the function signature from 
1023                          the symbol information */
1024                       if (!TYPE_FN_FIELD_STUB (f, j))
1025                         {
1026                           int staticp = TYPE_FN_FIELD_STATIC_P (f, j);
1027                           struct type *mtype = TYPE_FN_FIELD_TYPE (f, j);
1028                           cp_type_print_method_args (mtype,
1029                                                      "",
1030                                                      method_name,
1031                                                      staticp,
1032                                                      stream);
1033                         }
1034                       else
1035                         fprintf_filtered (stream, "<badly mangled name '%s'>",
1036                                           mangled_name);
1037                     }
1038                   else
1039                     {
1040                       char *p;
1041                       char *demangled_no_class
1042                         = remove_qualifiers (demangled_name);
1043
1044                       /* get rid of the `static' appended by the demangler */
1045                       p = strstr (demangled_no_class, " static");
1046                       if (p != NULL)
1047                         {
1048                           int length = p - demangled_no_class;
1049                           demangled_no_static = (char *) xmalloc (length + 1);
1050                           strncpy (demangled_no_static, demangled_no_class, length);
1051                           *(demangled_no_static + length) = '\0';
1052                           fputs_filtered (demangled_no_static, stream);
1053                           xfree (demangled_no_static);
1054                         }
1055                       else
1056                         fputs_filtered (demangled_no_class, stream);
1057                       xfree (demangled_name);
1058                     }
1059
1060                   if (TYPE_FN_FIELD_STUB (f, j))
1061                     xfree (mangled_name);
1062
1063                   fprintf_filtered (stream, ";\n");
1064                 }
1065             }
1066
1067           fprintfi_filtered (level, stream, "}");
1068
1069           if (TYPE_LOCALTYPE_PTR (type) && show >= 0)
1070             fprintfi_filtered (level, stream, " (Local at %s:%d)\n",
1071                                TYPE_LOCALTYPE_FILE (type),
1072                                TYPE_LOCALTYPE_LINE (type));
1073         }
1074       if (TYPE_CODE (type) == TYPE_CODE_TEMPLATE)
1075         goto go_back;
1076       break;
1077
1078     case TYPE_CODE_ENUM:
1079       c_type_print_modifier (type, stream, 0, 1);
1080       /* HP C supports sized enums */
1081       if (hp_som_som_object_present)
1082         switch (TYPE_LENGTH (type))
1083           {
1084           case 1:
1085             fputs_filtered ("char ", stream);
1086             break;
1087           case 2:
1088             fputs_filtered ("short ", stream);
1089             break;
1090           default:
1091             break;
1092           }
1093       fprintf_filtered (stream, "enum ");
1094       /* Print the tag name if it exists.
1095          The aCC compiler emits a spurious 
1096          "{unnamed struct}"/"{unnamed union}"/"{unnamed enum}"
1097          tag for unnamed struct/union/enum's, which we don't
1098          want to print. */
1099       if (TYPE_TAG_NAME (type) != NULL &&
1100           strncmp (TYPE_TAG_NAME (type), "{unnamed", 8))
1101         {
1102           fputs_filtered (TYPE_TAG_NAME (type), stream);
1103           if (show > 0)
1104             fputs_filtered (" ", stream);
1105         }
1106
1107       wrap_here ("    ");
1108       if (show < 0)
1109         {
1110           /* If we just printed a tag name, no need to print anything else.  */
1111           if (TYPE_TAG_NAME (type) == NULL)
1112             fprintf_filtered (stream, "{...}");
1113         }
1114       else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
1115         {
1116           fprintf_filtered (stream, "{");
1117           len = TYPE_NFIELDS (type);
1118           lastval = 0;
1119           for (i = 0; i < len; i++)
1120             {
1121               QUIT;
1122               if (i)
1123                 fprintf_filtered (stream, ", ");
1124               wrap_here ("    ");
1125               fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
1126               if (lastval != TYPE_FIELD_BITPOS (type, i))
1127                 {
1128                   fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
1129                   lastval = TYPE_FIELD_BITPOS (type, i);
1130                 }
1131               lastval++;
1132             }
1133           fprintf_filtered (stream, "}");
1134         }
1135       break;
1136
1137     case TYPE_CODE_VOID:
1138       fprintf_filtered (stream, "void");
1139       break;
1140
1141     case TYPE_CODE_UNDEF:
1142       fprintf_filtered (stream, "struct <unknown>");
1143       break;
1144
1145     case TYPE_CODE_ERROR:
1146       fprintf_filtered (stream, "<unknown type>");
1147       break;
1148
1149     case TYPE_CODE_RANGE:
1150       /* This should not occur */
1151       fprintf_filtered (stream, "<range type>");
1152       break;
1153
1154     case TYPE_CODE_TEMPLATE:
1155       /* Called on "ptype t" where "t" is a template.
1156          Prints the template header (with args), e.g.:
1157          template <class T1, class T2> class "
1158          and then merges with the struct/union/class code to
1159          print the rest of the definition. */
1160       c_type_print_modifier (type, stream, 0, 1);
1161       fprintf_filtered (stream, "template <");
1162       for (i = 0; i < TYPE_NTEMPLATE_ARGS (type); i++)
1163         {
1164           struct template_arg templ_arg;
1165           templ_arg = TYPE_TEMPLATE_ARG (type, i);
1166           fprintf_filtered (stream, "class %s", templ_arg.name);
1167           if (i < TYPE_NTEMPLATE_ARGS (type) - 1)
1168             fprintf_filtered (stream, ", ");
1169         }
1170       fprintf_filtered (stream, "> class ");
1171       /* Yuck, factor this out to a subroutine so we can call
1172          it and return to the point marked with the "goback:" label... - RT */
1173       goto struct_union;
1174     go_back:
1175       if (TYPE_NINSTANTIATIONS (type) > 0)
1176         {
1177           fprintf_filtered (stream, "\ntemplate instantiations:\n");
1178           for (i = 0; i < TYPE_NINSTANTIATIONS (type); i++)
1179             {
1180               fprintf_filtered (stream, "  ");
1181               c_type_print_base (TYPE_INSTANTIATION (type, i), stream, 0, level);
1182               if (i < TYPE_NINSTANTIATIONS (type) - 1)
1183                 fprintf_filtered (stream, "\n");
1184             }
1185         }
1186       break;
1187
1188     case TYPE_CODE_NAMESPACE:
1189       fputs_filtered ("namespace ", stream);
1190       fputs_filtered (TYPE_TAG_NAME (type), stream);
1191       break;
1192
1193     default:
1194       /* Handle types not explicitly handled by the other cases,
1195          such as fundamental types.  For these, just print whatever
1196          the type name is, as recorded in the type itself.  If there
1197          is no type name, then complain. */
1198       if (TYPE_NAME (type) != NULL)
1199         {
1200           c_type_print_modifier (type, stream, 0, 1);
1201           fputs_filtered (TYPE_NAME (type), stream);
1202         }
1203       else
1204         {
1205           /* At least for dump_symtab, it is important that this not be
1206              an error ().  */
1207           fprintf_filtered (stream, "<invalid type code %d>",
1208                             TYPE_CODE (type));
1209         }
1210       break;
1211     }
1212 }