xref: /dflybsd-src/contrib/gdb-7/gdb/ada-typeprint.c (revision c0d274d062fd959993bf623f25f7cb6a8a676c4e)
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 
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 }
849