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