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