Upgrade GDB from 7.0 and 7.2 on the vendor branch
[dragonfly.git] / contrib / gdb-7 / gdb / ada-typeprint.c
1 /* Support for printing Ada types for GDB, the GNU debugger.
2    Copyright (C) 1986, 1988, 1989, 1991, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "gdb_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 #include "ada-lang.h"
36
37 #include <ctype.h>
38 #include "gdb_string.h"
39 #include <errno.h>
40
41 static int print_record_field_types (struct type *, struct type *,
42                                      struct ui_file *, int, int);
43
44 static void print_array_type (struct type *, struct ui_file *, int, int);
45
46 static void print_choices (struct type *, int, struct ui_file *,
47                            struct type *);
48
49 static void print_range (struct type *, struct ui_file *);
50
51 static void print_range_bound (struct type *, char *, int *,
52                                struct ui_file *);
53
54 static void
55 print_dynamic_range_bound (struct type *, const char *, int,
56                            const char *, struct ui_file *);
57
58 static void print_range_type (struct type *, struct ui_file *);
59 \f
60
61
62 static char *name_buffer;
63 static int name_buffer_len;
64
65 /* The (decoded) Ada name of TYPE.  This value persists until the
66    next call.  */
67
68 static char *
69 decoded_type_name (struct type *type)
70 {
71   if (ada_type_name (type) == NULL)
72     return NULL;
73   else
74     {
75       char *raw_name = ada_type_name (type);
76       char *s, *q;
77
78       if (name_buffer == NULL || name_buffer_len <= strlen (raw_name))
79         {
80           name_buffer_len = 16 + 2 * strlen (raw_name);
81           name_buffer = xrealloc (name_buffer, name_buffer_len);
82         }
83       strcpy (name_buffer, raw_name);
84
85       s = (char *) strstr (name_buffer, "___");
86       if (s != NULL)
87         *s = '\0';
88
89       s = name_buffer + strlen (name_buffer) - 1;
90       while (s > name_buffer && (s[0] != '_' || s[-1] != '_'))
91         s -= 1;
92
93       if (s == name_buffer)
94         return name_buffer;
95
96       if (!islower (s[1]))
97         return NULL;
98
99       for (s = q = name_buffer; *s != '\0'; q += 1)
100         {
101           if (s[0] == '_' && s[1] == '_')
102             {
103               *q = '.';
104               s += 2;
105             }
106           else
107             {
108               *q = *s;
109               s += 1;
110             }
111         }
112       *q = '\0';
113       return name_buffer;
114     }
115 }
116
117 /* Print TYPE on STREAM, preferably as a range.  */
118
119 static void
120 print_range (struct type *type, struct ui_file *stream)
121 {
122   switch (TYPE_CODE (type))
123     {
124     case TYPE_CODE_RANGE:
125     case TYPE_CODE_ENUM:
126       {
127         struct type *target_type;
128         target_type = TYPE_TARGET_TYPE (type);
129         if (target_type == NULL)
130           target_type = type;
131         ada_print_scalar (target_type, ada_discrete_type_low_bound (type),
132                           stream);
133         fprintf_filtered (stream, " .. ");
134         ada_print_scalar (target_type, ada_discrete_type_high_bound (type),
135                           stream);
136       }
137       break;
138     default:
139       fprintf_filtered (stream, "%.*s",
140                         ada_name_prefix_len (TYPE_NAME (type)),
141                         TYPE_NAME (type));
142       break;
143     }
144 }
145
146 /* Print the number or discriminant bound at BOUNDS+*N on STREAM, and
147    set *N past the bound and its delimiter, if any.  */
148
149 static void
150 print_range_bound (struct type *type, char *bounds, int *n,
151                    struct ui_file *stream)
152 {
153   LONGEST B;
154
155   if (ada_scan_number (bounds, *n, &B, n))
156     {
157       /* STABS decodes all range types which bounds are 0 .. -1 as
158          unsigned integers (ie. the type code is TYPE_CODE_INT, not
159          TYPE_CODE_RANGE).  Unfortunately, ada_print_scalar() relies
160          on the unsigned flag to determine whether the bound should
161          be printed as a signed or an unsigned value.  This causes
162          the upper bound of the 0 .. -1 range types to be printed as
163          a very large unsigned number instead of -1.
164          To workaround this stabs deficiency, we replace the TYPE by NULL
165          to indicate default output when we detect that the bound is negative,
166          and the type is a TYPE_CODE_INT.  The bound is negative when
167          'm' is the last character of the number scanned in BOUNDS.  */
168       if (bounds[*n - 1] == 'm' && TYPE_CODE (type) == TYPE_CODE_INT)
169         type = NULL;
170       ada_print_scalar (type, B, stream);
171       if (bounds[*n] == '_')
172         *n += 2;
173     }
174   else
175     {
176       int bound_len;
177       char *bound = bounds + *n;
178       char *pend;
179
180       pend = strstr (bound, "__");
181       if (pend == NULL)
182         *n += bound_len = strlen (bound);
183       else
184         {
185           bound_len = pend - bound;
186           *n += bound_len + 2;
187         }
188       fprintf_filtered (stream, "%.*s", bound_len, bound);
189     }
190 }
191
192 /* Assuming NAME[0 .. NAME_LEN-1] is the name of a range type, print
193    the value (if found) of the bound indicated by SUFFIX ("___L" or
194    "___U") according to the ___XD conventions.  */
195
196 static void
197 print_dynamic_range_bound (struct type *type, const char *name, int name_len,
198                            const char *suffix, struct ui_file *stream)
199 {
200   static char *name_buf = NULL;
201   static size_t name_buf_len = 0;
202   LONGEST B;
203   int OK;
204
205   GROW_VECT (name_buf, name_buf_len, name_len + strlen (suffix) + 1);
206   strncpy (name_buf, name, name_len);
207   strcpy (name_buf + name_len, suffix);
208
209   B = get_int_var_value (name_buf, &OK);
210   if (OK)
211     ada_print_scalar (type, B, stream);
212   else
213     fprintf_filtered (stream, "?");
214 }
215
216 /* Print RAW_TYPE as a range type, using any bound information
217    following the GNAT encoding (if available).  */
218
219 static void
220 print_range_type (struct type *raw_type, struct ui_file *stream)
221 {
222   char *name;
223   struct type *base_type;
224   char *subtype_info;
225
226   gdb_assert (raw_type != NULL);
227   name = TYPE_NAME (raw_type);
228   gdb_assert (name != NULL);
229
230   if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE)
231     base_type = TYPE_TARGET_TYPE (raw_type);
232   else
233     base_type = raw_type;
234
235   subtype_info = strstr (name, "___XD");
236   if (subtype_info == NULL)
237     print_range (raw_type, stream);
238   else
239     {
240       int prefix_len = subtype_info - name;
241       char *bounds_str;
242       int n;
243
244       subtype_info += 5;
245       bounds_str = strchr (subtype_info, '_');
246       n = 1;
247
248       if (*subtype_info == 'L')
249         {
250           print_range_bound (base_type, bounds_str, &n, stream);
251           subtype_info += 1;
252         }
253       else
254         print_dynamic_range_bound (base_type, name, prefix_len, "___L",
255                                    stream);
256
257       fprintf_filtered (stream, " .. ");
258
259       if (*subtype_info == 'U')
260         print_range_bound (base_type, bounds_str, &n, stream);
261       else
262         print_dynamic_range_bound (base_type, name, prefix_len, "___U",
263                                    stream);
264     }
265 }
266
267 /* Print enumerated type TYPE on STREAM.  */
268
269 static void
270 print_enum_type (struct type *type, struct ui_file *stream)
271 {
272   int len = TYPE_NFIELDS (type);
273   int i, lastval;
274
275   fprintf_filtered (stream, "(");
276   wrap_here (" ");
277
278   lastval = 0;
279   for (i = 0; i < len; i++)
280     {
281       QUIT;
282       if (i)
283         fprintf_filtered (stream, ", ");
284       wrap_here ("    ");
285       fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
286       if (lastval != TYPE_FIELD_BITPOS (type, i))
287         {
288           fprintf_filtered (stream, " => %d", TYPE_FIELD_BITPOS (type, i));
289           lastval = TYPE_FIELD_BITPOS (type, i);
290         }
291       lastval += 1;
292     }
293   fprintf_filtered (stream, ")");
294 }
295
296 /* Print representation of Ada fixed-point type TYPE on STREAM.  */
297
298 static void
299 print_fixed_point_type (struct type *type, struct ui_file *stream)
300 {
301   DOUBLEST delta = ada_delta (type);
302   DOUBLEST small = ada_fixed_to_float (type, 1.0);
303
304   if (delta < 0.0)
305     fprintf_filtered (stream, "delta ??");
306   else
307     {
308       fprintf_filtered (stream, "delta %g", (double) delta);
309       if (delta != small)
310         fprintf_filtered (stream, " <'small = %g>", (double) small);
311     }
312 }
313
314 /* Print simple (constrained) array type TYPE on STREAM.  LEVEL is the
315    recursion (indentation) level, in case the element type itself has
316    nested structure, and SHOW is the number of levels of internal
317    structure to show (see ada_print_type).  */
318
319 static void
320 print_array_type (struct type *type, struct ui_file *stream, int show,
321                   int level)
322 {
323   int bitsize;
324   int n_indices;
325
326   if (ada_is_constrained_packed_array_type (type))
327     type = ada_coerce_to_simple_array_type (type);
328
329   bitsize = 0;
330   fprintf_filtered (stream, "array (");
331
332   if (type == NULL)
333     {
334       fprintf_filtered (stream, _("<undecipherable array type>"));
335       return;
336     }
337
338   n_indices = -1;
339   if (show < 0)
340     fprintf_filtered (stream, "...");
341   else
342     {
343       if (ada_is_simple_array_type (type))
344         {
345           struct type *range_desc_type;
346           struct type *arr_type;
347
348           range_desc_type = ada_find_parallel_type (type, "___XA");
349           ada_fixup_array_indexes_type (range_desc_type);
350
351           bitsize = 0;
352           if (range_desc_type == NULL)
353             {
354               for (arr_type = type; TYPE_CODE (arr_type) == TYPE_CODE_ARRAY;
355                    arr_type = TYPE_TARGET_TYPE (arr_type))
356                 {
357                   if (arr_type != type)
358                     fprintf_filtered (stream, ", ");
359                   print_range (TYPE_INDEX_TYPE (arr_type), stream);
360                   if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
361                     bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
362                 }
363             }
364           else
365             {
366               int k;
367
368               n_indices = TYPE_NFIELDS (range_desc_type);
369               for (k = 0, arr_type = type;
370                    k < n_indices;
371                    k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
372                 {
373                   if (k > 0)
374                     fprintf_filtered (stream, ", ");
375                   print_range_type (TYPE_FIELD_TYPE (range_desc_type, k),
376                                     stream);
377                   if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
378                     bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
379                 }
380             }
381         }
382       else
383         {
384           int i, i0;
385
386           for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
387             fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
388         }
389     }
390
391   fprintf_filtered (stream, ") of ");
392   wrap_here ("");
393   ada_print_type (ada_array_element_type (type, n_indices), "", stream,
394                   show == 0 ? 0 : show - 1, level + 1);
395   if (bitsize > 0)
396     fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
397 }
398
399 /* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
400    STREAM, assuming that VAL_TYPE (if non-NULL) is the type of the values.  */
401
402 static void
403 print_choices (struct type *type, int field_num, struct ui_file *stream,
404                struct type *val_type)
405 {
406   int have_output;
407   int p;
408   const char *name = TYPE_FIELD_NAME (type, field_num);
409
410   have_output = 0;
411
412   /* Skip over leading 'V': NOTE soon to be obsolete.  */
413   if (name[0] == 'V')
414     {
415       if (!ada_scan_number (name, 1, NULL, &p))
416         goto Huh;
417     }
418   else
419     p = 0;
420
421   while (1)
422     {
423       switch (name[p])
424         {
425         default:
426           return;
427         case 'S':
428         case 'R':
429         case 'O':
430           if (have_output)
431             fprintf_filtered (stream, " | ");
432           have_output = 1;
433           break;
434         }
435
436       switch (name[p])
437         {
438         case 'S':
439           {
440             LONGEST W;
441
442             if (!ada_scan_number (name, p + 1, &W, &p))
443               goto Huh;
444             ada_print_scalar (val_type, W, stream);
445             break;
446           }
447         case 'R':
448           {
449             LONGEST L, U;
450
451             if (!ada_scan_number (name, p + 1, &L, &p)
452                 || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
453               goto Huh;
454             ada_print_scalar (val_type, L, stream);
455             fprintf_filtered (stream, " .. ");
456             ada_print_scalar (val_type, U, stream);
457             break;
458           }
459         case 'O':
460           fprintf_filtered (stream, "others");
461           p += 1;
462           break;
463         }
464     }
465
466 Huh:
467   fprintf_filtered (stream, "??");
468
469 }
470
471 /* Assuming that field FIELD_NUM of TYPE is a VARIANTS field whose
472    discriminant is contained in OUTER_TYPE, print its variants on STREAM.
473    LEVEL is the recursion
474    (indentation) level, in case any of the fields themselves have
475    nested structure, and SHOW is the number of levels of internal structure
476    to show (see ada_print_type).  For this purpose, fields nested in a
477    variant part are taken to be at the same level as the fields
478    immediately outside the variant part.  */
479
480 static void
481 print_variant_clauses (struct type *type, int field_num,
482                        struct type *outer_type, struct ui_file *stream,
483                        int show, int level)
484 {
485   int i;
486   struct type *var_type, *par_type;
487   struct type *discr_type;
488
489   var_type = TYPE_FIELD_TYPE (type, field_num);
490   discr_type = ada_variant_discrim_type (var_type, outer_type);
491
492   if (TYPE_CODE (var_type) == TYPE_CODE_PTR)
493     {
494       var_type = TYPE_TARGET_TYPE (var_type);
495       if (var_type == NULL || TYPE_CODE (var_type) != TYPE_CODE_UNION)
496         return;
497     }
498
499   par_type = ada_find_parallel_type (var_type, "___XVU");
500   if (par_type != NULL)
501     var_type = par_type;
502
503   for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
504     {
505       fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
506       print_choices (var_type, i, stream, discr_type);
507       fprintf_filtered (stream, " =>");
508       if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i),
509                                     outer_type, stream, show, level + 4) <= 0)
510         fprintf_filtered (stream, " null;");
511     }
512 }
513
514 /* Assuming that field FIELD_NUM of TYPE is a variant part whose
515    discriminants are contained in OUTER_TYPE, print a description of it
516    on STREAM.  LEVEL is the recursion (indentation) level, in case any of
517    the fields themselves have nested structure, and SHOW is the number of
518    levels of internal structure to show (see ada_print_type).  For this
519    purpose, fields nested in a variant part are taken to be at the same
520    level as the fields immediately outside the variant part.  */
521
522 static void
523 print_variant_part (struct type *type, int field_num, struct type *outer_type,
524                     struct ui_file *stream, int show, int level)
525 {
526   fprintf_filtered (stream, "\n%*scase %s is", level + 4, "",
527                     ada_variant_discrim_name
528                     (TYPE_FIELD_TYPE (type, field_num)));
529   print_variant_clauses (type, field_num, outer_type, stream, show,
530                          level + 4);
531   fprintf_filtered (stream, "\n%*send case;", level + 4, "");
532 }
533
534 /* Print a description on STREAM of the fields in record type TYPE, whose
535    discriminants are in OUTER_TYPE.  LEVEL is the recursion (indentation)
536    level, in case any of the fields themselves have nested structure,
537    and SHOW is the number of levels of internal structure to show
538    (see ada_print_type).  Does not print parent type information of TYPE.
539    Returns 0 if no fields printed, -1 for an incomplete type, else > 0.
540    Prints each field beginning on a new line, but does not put a new line at
541    end.  */
542
543 static int
544 print_record_field_types (struct type *type, struct type *outer_type,
545                           struct ui_file *stream, int show, int level)
546 {
547   int len, i, flds;
548
549   flds = 0;
550   len = TYPE_NFIELDS (type);
551
552   if (len == 0 && TYPE_STUB (type))
553     return -1;
554
555   for (i = 0; i < len; i += 1)
556     {
557       QUIT;
558
559       if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
560         ;
561       else if (ada_is_wrapper_field (type, i))
562         flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type,
563                                           stream, show, level);
564       else if (ada_is_variant_part (type, i))
565         {
566           print_variant_part (type, i, outer_type, stream, show, level);
567           flds = 1;
568         }
569       else
570         {
571           flds += 1;
572           fprintf_filtered (stream, "\n%*s", level + 4, "");
573           ada_print_type (TYPE_FIELD_TYPE (type, i),
574                           TYPE_FIELD_NAME (type, i),
575                           stream, show - 1, level + 4);
576           fprintf_filtered (stream, ";");
577         }
578     }
579
580   return flds;
581 }
582
583 /* Print record type TYPE on STREAM.  LEVEL is the recursion (indentation)
584    level, in case the element type itself has nested structure, and SHOW is
585    the number of levels of internal structure to show (see ada_print_type).  */
586
587 static void
588 print_record_type (struct type *type0, struct ui_file *stream, int show,
589                    int level)
590 {
591   struct type *parent_type;
592   struct type *type;
593
594   type = ada_find_parallel_type (type0, "___XVE");
595   if (type == NULL)
596     type = type0;
597
598   parent_type = ada_parent_type (type);
599   if (ada_type_name (parent_type) != NULL)
600     fprintf_filtered (stream, "new %s with record",
601                       decoded_type_name (parent_type));
602   else if (parent_type == NULL && ada_is_tagged_type (type, 0))
603     fprintf_filtered (stream, "tagged record");
604   else
605     fprintf_filtered (stream, "record");
606
607   if (show < 0)
608     fprintf_filtered (stream, " ... end record");
609   else
610     {
611       int flds;
612
613       flds = 0;
614       if (parent_type != NULL && ada_type_name (parent_type) == NULL)
615         flds += print_record_field_types (parent_type, parent_type,
616                                           stream, show, level);
617       flds += print_record_field_types (type, type, stream, show, level);
618
619       if (flds > 0)
620         fprintf_filtered (stream, "\n%*send record", level, "");
621       else if (flds < 0)
622         fprintf_filtered (stream, _(" <incomplete type> end record"));
623       else
624         fprintf_filtered (stream, " null; end record");
625     }
626 }
627
628 /* Print the unchecked union type TYPE in something resembling Ada
629    format on STREAM.  LEVEL is the recursion (indentation) level
630    in case the element type itself has nested structure, and SHOW is the
631    number of levels of internal structure to show (see ada_print_type).  */
632 static void
633 print_unchecked_union_type (struct type *type, struct ui_file *stream,
634                             int show, int level)
635 {
636   if (show < 0)
637     fprintf_filtered (stream, "record (?) is ... end record");
638   else if (TYPE_NFIELDS (type) == 0)
639     fprintf_filtered (stream, "record (?) is null; end record");
640   else
641     {
642       int i;
643
644       fprintf_filtered (stream, "record (?) is\n%*scase ? is", level + 4, "");
645
646       for (i = 0; i < TYPE_NFIELDS (type); i += 1)
647         {
648           fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
649                             level + 12, "");
650           ada_print_type (TYPE_FIELD_TYPE (type, i),
651                           TYPE_FIELD_NAME (type, i),
652                           stream, show - 1, level + 12);
653           fprintf_filtered (stream, ";");
654         }
655
656       fprintf_filtered (stream, "\n%*send case;\n%*send record",
657                         level + 4, "", level, "");
658     }
659 }
660
661
662
663 /* Print function or procedure type TYPE on STREAM.  Make it a header
664    for function or procedure NAME if NAME is not null.  */
665
666 static void
667 print_func_type (struct type *type, struct ui_file *stream, const char *name)
668 {
669   int i, len = TYPE_NFIELDS (type);
670
671   if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
672     fprintf_filtered (stream, "procedure");
673   else
674     fprintf_filtered (stream, "function");
675
676   if (name != NULL && name[0] != '\0')
677     fprintf_filtered (stream, " %s", name);
678
679   if (len > 0)
680     {
681       fprintf_filtered (stream, " (");
682       for (i = 0; i < len; i += 1)
683         {
684           if (i > 0)
685             {
686               fputs_filtered ("; ", stream);
687               wrap_here ("    ");
688             }
689           fprintf_filtered (stream, "a%d: ", i + 1);
690           ada_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
691         }
692       fprintf_filtered (stream, ")");
693     }
694
695   if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
696     {
697       fprintf_filtered (stream, " return ");
698       ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
699     }
700 }
701
702
703 /* Print a description of a type TYPE0.
704    Output goes to STREAM (via stdio).
705    If VARSTRING is a non-empty string, print as an Ada variable/field
706        declaration.
707    SHOW+1 is the maximum number of levels of internal type structure
708       to show (this applies to record types, enumerated types, and
709       array types).
710    SHOW is the number of levels of internal type structure to show
711       when there is a type name for the SHOWth deepest level (0th is
712       outer level).
713    When SHOW<0, no inner structure is shown.
714    LEVEL indicates level of recursion (for nested definitions).  */
715
716 void
717 ada_print_type (struct type *type0, const char *varstring,
718                 struct ui_file *stream, int show, int level)
719 {
720   struct type *type = ada_check_typedef (ada_get_base_type (type0));
721   char *type_name = decoded_type_name (type0);
722   int is_var_decl = (varstring != NULL && varstring[0] != '\0');
723
724   if (type == NULL)
725     {
726       if (is_var_decl)
727         fprintf_filtered (stream, "%.*s: ",
728                           ada_name_prefix_len (varstring), varstring);
729       fprintf_filtered (stream, "<null type?>");
730       return;
731     }
732
733   if (show > 0)
734     type = ada_check_typedef (type);
735
736   if (is_var_decl && TYPE_CODE (type) != TYPE_CODE_FUNC)
737     fprintf_filtered (stream, "%.*s: ",
738                       ada_name_prefix_len (varstring), varstring);
739
740   if (type_name != NULL && show <= 0)
741     {
742       fprintf_filtered (stream, "%.*s",
743                         ada_name_prefix_len (type_name), type_name);
744       return;
745     }
746
747   if (ada_is_aligner_type (type))
748     ada_print_type (ada_aligned_type (type), "", stream, show, level);
749   else if (ada_is_constrained_packed_array_type (type))
750     {
751       if (TYPE_CODE (type) == TYPE_CODE_PTR)
752         {
753           fprintf_filtered (stream, "access ");
754           print_array_type (TYPE_TARGET_TYPE (type), stream, show, level);
755         }
756       else
757         {
758           print_array_type (type, stream, show, level);
759         }
760     }
761   else
762     switch (TYPE_CODE (type))
763       {
764       default:
765         fprintf_filtered (stream, "<");
766         c_print_type (type, "", stream, show, level);
767         fprintf_filtered (stream, ">");
768         break;
769       case TYPE_CODE_PTR:
770         fprintf_filtered (stream, "access ");
771         ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
772         break;
773       case TYPE_CODE_REF:
774         fprintf_filtered (stream, "<ref> ");
775         ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
776         break;
777       case TYPE_CODE_ARRAY:
778         print_array_type (type, stream, show, level);
779         break;
780       case TYPE_CODE_BOOL:
781         fprintf_filtered (stream, "(false, true)");
782         break;
783       case TYPE_CODE_INT:
784         if (ada_is_fixed_point_type (type))
785           print_fixed_point_type (type, stream);
786         else
787           {
788             char *name = ada_type_name (type);
789
790             if (!ada_is_range_type_name (name))
791               fprintf_filtered (stream, _("<%d-byte integer>"),
792                                 TYPE_LENGTH (type));
793             else
794               {
795                 fprintf_filtered (stream, "range ");
796                 print_range_type (type, stream);
797               }
798           }
799         break;
800       case TYPE_CODE_RANGE:
801         if (ada_is_fixed_point_type (type))
802           print_fixed_point_type (type, stream);
803         else if (ada_is_modular_type (type))
804           fprintf_filtered (stream, "mod %s", 
805                             int_string (ada_modulus (type), 10, 0, 0, 1));
806         else
807           {
808             fprintf_filtered (stream, "range ");
809             print_range (type, stream);
810           }
811         break;
812       case TYPE_CODE_FLT:
813         fprintf_filtered (stream, _("<%d-byte float>"), TYPE_LENGTH (type));
814         break;
815       case TYPE_CODE_ENUM:
816         if (show < 0)
817           fprintf_filtered (stream, "(...)");
818         else
819           print_enum_type (type, stream);
820         break;
821       case TYPE_CODE_STRUCT:
822         if (ada_is_array_descriptor_type (type))
823           print_array_type (type, stream, show, level);
824         else if (ada_is_bogus_array_descriptor (type))
825           fprintf_filtered (stream,
826                             _("array (?) of ? (<mal-formed descriptor>)"));
827         else
828           print_record_type (type, stream, show, level);
829         break;
830       case TYPE_CODE_UNION:
831         print_unchecked_union_type (type, stream, show, level);
832         break;
833       case TYPE_CODE_FUNC:
834         print_func_type (type, stream, varstring);
835         break;
836       }
837 }
838
839 /* Implement the la_print_typedef language method for Ada.  */
840
841 void
842 ada_print_typedef (struct type *type, struct symbol *new_symbol,
843                    struct ui_file *stream)
844 {
845   type = ada_check_typedef (type);
846   ada_print_type (type, "", stream, 0, 0);
847   fprintf_filtered (stream, "\n");
848 }