Add casts to memory allocation related calls
[deliverable/binutils-gdb.git] / gdb / ada-typeprint.c
1 /* Support for printing Ada types for GDB, the GNU debugger.
2 Copyright (C) 1986-2015 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 #include "defs.h"
20 #include "gdb_obstack.h"
21 #include "bfd.h" /* Binary File Description */
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "expression.h"
25 #include "value.h"
26 #include "gdbcore.h"
27 #include "target.h"
28 #include "command.h"
29 #include "gdbcmd.h"
30 #include "language.h"
31 #include "demangle.h"
32 #include "c-lang.h"
33 #include "typeprint.h"
34 #include "ada-lang.h"
35 #include <ctype.h>
36
37 static int print_selected_record_field_types (struct type *, struct type *,
38 int, int,
39 struct ui_file *, int, int,
40 const struct type_print_options *);
41
42 static int print_record_field_types (struct type *, struct type *,
43 struct ui_file *, int, int,
44 const struct type_print_options *);
45 \f
46
47
48 static char *name_buffer;
49 static int name_buffer_len;
50
51 /* The (decoded) Ada name of TYPE. This value persists until the
52 next call. */
53
54 static char *
55 decoded_type_name (struct type *type)
56 {
57 if (ada_type_name (type) == NULL)
58 return NULL;
59 else
60 {
61 const char *raw_name = ada_type_name (type);
62 char *s, *q;
63
64 if (name_buffer == NULL || name_buffer_len <= strlen (raw_name))
65 {
66 name_buffer_len = 16 + 2 * strlen (raw_name);
67 name_buffer = (char *) xrealloc (name_buffer, name_buffer_len);
68 }
69 strcpy (name_buffer, raw_name);
70
71 s = (char *) strstr (name_buffer, "___");
72 if (s != NULL)
73 *s = '\0';
74
75 s = name_buffer + strlen (name_buffer) - 1;
76 while (s > name_buffer && (s[0] != '_' || s[-1] != '_'))
77 s -= 1;
78
79 if (s == name_buffer)
80 return name_buffer;
81
82 if (!islower (s[1]))
83 return NULL;
84
85 for (s = q = name_buffer; *s != '\0'; q += 1)
86 {
87 if (s[0] == '_' && s[1] == '_')
88 {
89 *q = '.';
90 s += 2;
91 }
92 else
93 {
94 *q = *s;
95 s += 1;
96 }
97 }
98 *q = '\0';
99 return name_buffer;
100 }
101 }
102
103 /* Return nonzero if TYPE is a subrange type, and its bounds
104 are identical to the bounds of its subtype. */
105
106 static int
107 type_is_full_subrange_of_target_type (struct type *type)
108 {
109 struct type *subtype;
110
111 if (TYPE_CODE (type) != TYPE_CODE_RANGE)
112 return 0;
113
114 subtype = TYPE_TARGET_TYPE (type);
115 if (subtype == NULL)
116 return 0;
117
118 if (is_dynamic_type (type))
119 return 0;
120
121 if (ada_discrete_type_low_bound (type)
122 != ada_discrete_type_low_bound (subtype))
123 return 0;
124
125 if (ada_discrete_type_high_bound (type)
126 != ada_discrete_type_high_bound (subtype))
127 return 0;
128
129 return 1;
130 }
131
132 /* Print TYPE on STREAM, preferably as a range if BOUNDS_PREFERED_P
133 is nonzero. */
134
135 static void
136 print_range (struct type *type, struct ui_file *stream,
137 int bounds_prefered_p)
138 {
139 if (!bounds_prefered_p)
140 {
141 /* Try stripping all TYPE_CODE_RANGE layers whose bounds
142 are identical to the bounds of their subtype. When
143 the bounds of both types match, it can allow us to
144 print a range using the name of its base type, which
145 is easier to read. For instance, we would print...
146
147 array (character) of ...
148
149 ... instead of...
150
151 array ('["00"]' .. '["ff"]') of ... */
152 while (type_is_full_subrange_of_target_type (type))
153 type = TYPE_TARGET_TYPE (type);
154 }
155
156 switch (TYPE_CODE (type))
157 {
158 case TYPE_CODE_RANGE:
159 case TYPE_CODE_ENUM:
160 {
161 struct type *target_type;
162 LONGEST lo = 0, hi = 0; /* init for gcc -Wall */
163 int got_error = 0;
164
165 target_type = TYPE_TARGET_TYPE (type);
166 if (target_type == NULL)
167 target_type = type;
168
169 TRY
170 {
171 lo = ada_discrete_type_low_bound (type);
172 hi = ada_discrete_type_high_bound (type);
173 }
174 CATCH (e, RETURN_MASK_ERROR)
175 {
176 /* This can happen when the range is dynamic. Sometimes,
177 resolving dynamic property values requires us to have
178 access to an actual object, which is not available
179 when the user is using the "ptype" command on a type.
180 Print the range as an unbounded range. */
181 fprintf_filtered (stream, "<>");
182 got_error = 1;
183 }
184 END_CATCH
185
186 if (!got_error)
187 {
188 ada_print_scalar (target_type, lo, stream);
189 fprintf_filtered (stream, " .. ");
190 ada_print_scalar (target_type, hi, stream);
191 }
192 }
193 break;
194 default:
195 fprintf_filtered (stream, "%.*s",
196 ada_name_prefix_len (TYPE_NAME (type)),
197 TYPE_NAME (type));
198 break;
199 }
200 }
201
202 /* Print the number or discriminant bound at BOUNDS+*N on STREAM, and
203 set *N past the bound and its delimiter, if any. */
204
205 static void
206 print_range_bound (struct type *type, char *bounds, int *n,
207 struct ui_file *stream)
208 {
209 LONGEST B;
210
211 if (ada_scan_number (bounds, *n, &B, n))
212 {
213 /* STABS decodes all range types which bounds are 0 .. -1 as
214 unsigned integers (ie. the type code is TYPE_CODE_INT, not
215 TYPE_CODE_RANGE). Unfortunately, ada_print_scalar() relies
216 on the unsigned flag to determine whether the bound should
217 be printed as a signed or an unsigned value. This causes
218 the upper bound of the 0 .. -1 range types to be printed as
219 a very large unsigned number instead of -1.
220 To workaround this stabs deficiency, we replace the TYPE by NULL
221 to indicate default output when we detect that the bound is negative,
222 and the type is a TYPE_CODE_INT. The bound is negative when
223 'm' is the last character of the number scanned in BOUNDS. */
224 if (bounds[*n - 1] == 'm' && TYPE_CODE (type) == TYPE_CODE_INT)
225 type = NULL;
226 ada_print_scalar (type, B, stream);
227 if (bounds[*n] == '_')
228 *n += 2;
229 }
230 else
231 {
232 int bound_len;
233 char *bound = bounds + *n;
234 char *pend;
235
236 pend = strstr (bound, "__");
237 if (pend == NULL)
238 *n += bound_len = strlen (bound);
239 else
240 {
241 bound_len = pend - bound;
242 *n += bound_len + 2;
243 }
244 fprintf_filtered (stream, "%.*s", bound_len, bound);
245 }
246 }
247
248 /* Assuming NAME[0 .. NAME_LEN-1] is the name of a range type, print
249 the value (if found) of the bound indicated by SUFFIX ("___L" or
250 "___U") according to the ___XD conventions. */
251
252 static void
253 print_dynamic_range_bound (struct type *type, const char *name, int name_len,
254 const char *suffix, struct ui_file *stream)
255 {
256 static char *name_buf = NULL;
257 static size_t name_buf_len = 0;
258 LONGEST B;
259 int OK;
260
261 GROW_VECT (name_buf, name_buf_len, name_len + strlen (suffix) + 1);
262 strncpy (name_buf, name, name_len);
263 strcpy (name_buf + name_len, suffix);
264
265 B = get_int_var_value (name_buf, &OK);
266 if (OK)
267 ada_print_scalar (type, B, stream);
268 else
269 fprintf_filtered (stream, "?");
270 }
271
272 /* Print RAW_TYPE as a range type, using any bound information
273 following the GNAT encoding (if available).
274
275 If BOUNDS_PREFERED_P is nonzero, force the printing of the range
276 using its bounds. Otherwise, try printing the range without
277 printing the value of the bounds, if possible (this is only
278 considered a hint, not a guaranty). */
279
280 static void
281 print_range_type (struct type *raw_type, struct ui_file *stream,
282 int bounds_prefered_p)
283 {
284 const char *name;
285 struct type *base_type;
286 const char *subtype_info;
287
288 gdb_assert (raw_type != NULL);
289 name = TYPE_NAME (raw_type);
290 gdb_assert (name != NULL);
291
292 if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE)
293 base_type = TYPE_TARGET_TYPE (raw_type);
294 else
295 base_type = raw_type;
296
297 subtype_info = strstr (name, "___XD");
298 if (subtype_info == NULL)
299 print_range (raw_type, stream, bounds_prefered_p);
300 else
301 {
302 int prefix_len = subtype_info - name;
303 char *bounds_str;
304 int n;
305
306 subtype_info += 5;
307 bounds_str = strchr (subtype_info, '_');
308 n = 1;
309
310 if (*subtype_info == 'L')
311 {
312 print_range_bound (base_type, bounds_str, &n, stream);
313 subtype_info += 1;
314 }
315 else
316 print_dynamic_range_bound (base_type, name, prefix_len, "___L",
317 stream);
318
319 fprintf_filtered (stream, " .. ");
320
321 if (*subtype_info == 'U')
322 print_range_bound (base_type, bounds_str, &n, stream);
323 else
324 print_dynamic_range_bound (base_type, name, prefix_len, "___U",
325 stream);
326 }
327 }
328
329 /* Print enumerated type TYPE on STREAM. */
330
331 static void
332 print_enum_type (struct type *type, struct ui_file *stream)
333 {
334 int len = TYPE_NFIELDS (type);
335 int i;
336 LONGEST lastval;
337
338 fprintf_filtered (stream, "(");
339 wrap_here (" ");
340
341 lastval = 0;
342 for (i = 0; i < len; i++)
343 {
344 QUIT;
345 if (i)
346 fprintf_filtered (stream, ", ");
347 wrap_here (" ");
348 fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
349 if (lastval != TYPE_FIELD_ENUMVAL (type, i))
350 {
351 fprintf_filtered (stream, " => %s",
352 plongest (TYPE_FIELD_ENUMVAL (type, i)));
353 lastval = TYPE_FIELD_ENUMVAL (type, i);
354 }
355 lastval += 1;
356 }
357 fprintf_filtered (stream, ")");
358 }
359
360 /* Print representation of Ada fixed-point type TYPE on STREAM. */
361
362 static void
363 print_fixed_point_type (struct type *type, struct ui_file *stream)
364 {
365 DOUBLEST delta = ada_delta (type);
366 DOUBLEST small = ada_fixed_to_float (type, 1.0);
367
368 if (delta < 0.0)
369 fprintf_filtered (stream, "delta ??");
370 else
371 {
372 fprintf_filtered (stream, "delta %g", (double) delta);
373 if (delta != small)
374 fprintf_filtered (stream, " <'small = %g>", (double) small);
375 }
376 }
377
378 /* Print simple (constrained) array type TYPE on STREAM. LEVEL is the
379 recursion (indentation) level, in case the element type itself has
380 nested structure, and SHOW is the number of levels of internal
381 structure to show (see ada_print_type). */
382
383 static void
384 print_array_type (struct type *type, struct ui_file *stream, int show,
385 int level, const struct type_print_options *flags)
386 {
387 int bitsize;
388 int n_indices;
389 struct type *elt_type = NULL;
390
391 if (ada_is_constrained_packed_array_type (type))
392 type = ada_coerce_to_simple_array_type (type);
393
394 bitsize = 0;
395 fprintf_filtered (stream, "array (");
396
397 if (type == NULL)
398 {
399 fprintf_filtered (stream, _("<undecipherable array type>"));
400 return;
401 }
402
403 n_indices = -1;
404 if (ada_is_simple_array_type (type))
405 {
406 struct type *range_desc_type;
407 struct type *arr_type;
408
409 range_desc_type = ada_find_parallel_type (type, "___XA");
410 ada_fixup_array_indexes_type (range_desc_type);
411
412 bitsize = 0;
413 if (range_desc_type == NULL)
414 {
415 for (arr_type = type; TYPE_CODE (arr_type) == TYPE_CODE_ARRAY;
416 arr_type = TYPE_TARGET_TYPE (arr_type))
417 {
418 if (arr_type != type)
419 fprintf_filtered (stream, ", ");
420 print_range (TYPE_INDEX_TYPE (arr_type), stream,
421 0 /* bounds_prefered_p */);
422 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
423 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
424 }
425 }
426 else
427 {
428 int k;
429
430 n_indices = TYPE_NFIELDS (range_desc_type);
431 for (k = 0, arr_type = type;
432 k < n_indices;
433 k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
434 {
435 if (k > 0)
436 fprintf_filtered (stream, ", ");
437 print_range_type (TYPE_FIELD_TYPE (range_desc_type, k),
438 stream, 0 /* bounds_prefered_p */);
439 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
440 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
441 }
442 }
443 }
444 else
445 {
446 int i, i0;
447
448 for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
449 fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
450 }
451
452 elt_type = ada_array_element_type (type, n_indices);
453 fprintf_filtered (stream, ") of ");
454 wrap_here ("");
455 ada_print_type (elt_type, "", stream, show == 0 ? 0 : show - 1, level + 1,
456 flags);
457 /* Arrays with variable-length elements are never bit-packed in practice but
458 compilers have to describe their stride so that we can properly fetch
459 individual elements. Do not say the array is packed in this case. */
460 if (bitsize > 0 && !is_dynamic_type (elt_type))
461 fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
462 }
463
464 /* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
465 STREAM, assuming that VAL_TYPE (if non-NULL) is the type of the
466 values. Return non-zero if the field is an encoding of
467 discriminant values, as in a standard variant record, and 0 if the
468 field is not so encoded (as happens with single-component variants
469 in types annotated with pragma Unchecked_Variant). */
470
471 static int
472 print_choices (struct type *type, int field_num, struct ui_file *stream,
473 struct type *val_type)
474 {
475 int have_output;
476 int p;
477 const char *name = TYPE_FIELD_NAME (type, field_num);
478
479 have_output = 0;
480
481 /* Skip over leading 'V': NOTE soon to be obsolete. */
482 if (name[0] == 'V')
483 {
484 if (!ada_scan_number (name, 1, NULL, &p))
485 goto Huh;
486 }
487 else
488 p = 0;
489
490 while (1)
491 {
492 switch (name[p])
493 {
494 default:
495 goto Huh;
496 case '_':
497 case '\0':
498 fprintf_filtered (stream, " =>");
499 return 1;
500 case 'S':
501 case 'R':
502 case 'O':
503 if (have_output)
504 fprintf_filtered (stream, " | ");
505 have_output = 1;
506 break;
507 }
508
509 switch (name[p])
510 {
511 case 'S':
512 {
513 LONGEST W;
514
515 if (!ada_scan_number (name, p + 1, &W, &p))
516 goto Huh;
517 ada_print_scalar (val_type, W, stream);
518 break;
519 }
520 case 'R':
521 {
522 LONGEST L, U;
523
524 if (!ada_scan_number (name, p + 1, &L, &p)
525 || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
526 goto Huh;
527 ada_print_scalar (val_type, L, stream);
528 fprintf_filtered (stream, " .. ");
529 ada_print_scalar (val_type, U, stream);
530 break;
531 }
532 case 'O':
533 fprintf_filtered (stream, "others");
534 p += 1;
535 break;
536 }
537 }
538
539 Huh:
540 fprintf_filtered (stream, "?? =>");
541 return 0;
542 }
543
544 /* Assuming that field FIELD_NUM of TYPE represents variants whose
545 discriminant is contained in OUTER_TYPE, print its components on STREAM.
546 LEVEL is the recursion (indentation) level, in case any of the fields
547 themselves have nested structure, and SHOW is the number of levels of
548 internal structure to show (see ada_print_type). For this purpose,
549 fields nested in a variant part are taken to be at the same level as
550 the fields immediately outside the variant part. */
551
552 static void
553 print_variant_clauses (struct type *type, int field_num,
554 struct type *outer_type, struct ui_file *stream,
555 int show, int level,
556 const struct type_print_options *flags)
557 {
558 int i;
559 struct type *var_type, *par_type;
560 struct type *discr_type;
561
562 var_type = TYPE_FIELD_TYPE (type, field_num);
563 discr_type = ada_variant_discrim_type (var_type, outer_type);
564
565 if (TYPE_CODE (var_type) == TYPE_CODE_PTR)
566 {
567 var_type = TYPE_TARGET_TYPE (var_type);
568 if (var_type == NULL || TYPE_CODE (var_type) != TYPE_CODE_UNION)
569 return;
570 }
571
572 par_type = ada_find_parallel_type (var_type, "___XVU");
573 if (par_type != NULL)
574 var_type = par_type;
575
576 for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
577 {
578 fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
579 if (print_choices (var_type, i, stream, discr_type))
580 {
581 if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i),
582 outer_type, stream, show, level + 4,
583 flags)
584 <= 0)
585 fprintf_filtered (stream, " null;");
586 }
587 else
588 print_selected_record_field_types (var_type, outer_type, i, i,
589 stream, show, level + 4, flags);
590 }
591 }
592
593 /* Assuming that field FIELD_NUM of TYPE is a variant part whose
594 discriminants are contained in OUTER_TYPE, print a description of it
595 on STREAM. LEVEL is the recursion (indentation) level, in case any of
596 the fields themselves have nested structure, and SHOW is the number of
597 levels of internal structure to show (see ada_print_type). For this
598 purpose, fields nested in a variant part are taken to be at the same
599 level as the fields immediately outside the variant part. */
600
601 static void
602 print_variant_part (struct type *type, int field_num, struct type *outer_type,
603 struct ui_file *stream, int show, int level,
604 const struct type_print_options *flags)
605 {
606 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "",
607 ada_variant_discrim_name
608 (TYPE_FIELD_TYPE (type, field_num)));
609 print_variant_clauses (type, field_num, outer_type, stream, show,
610 level + 4, flags);
611 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
612 }
613
614 /* Print a description on STREAM of the fields FLD0 through FLD1 in
615 record or union type TYPE, whose discriminants are in OUTER_TYPE.
616 LEVEL is the recursion (indentation) level, in case any of the
617 fields themselves have nested structure, and SHOW is the number of
618 levels of internal structure to show (see ada_print_type). Does
619 not print parent type information of TYPE. Returns 0 if no fields
620 printed, -1 for an incomplete type, else > 0. Prints each field
621 beginning on a new line, but does not put a new line at end. */
622
623 static int
624 print_selected_record_field_types (struct type *type, struct type *outer_type,
625 int fld0, int fld1,
626 struct ui_file *stream, int show, int level,
627 const struct type_print_options *flags)
628 {
629 int i, flds;
630
631 flds = 0;
632
633 if (fld0 > fld1 && TYPE_STUB (type))
634 return -1;
635
636 for (i = fld0; i <= fld1; i += 1)
637 {
638 QUIT;
639
640 if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
641 ;
642 else if (ada_is_wrapper_field (type, i))
643 flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type,
644 stream, show, level, flags);
645 else if (ada_is_variant_part (type, i))
646 {
647 print_variant_part (type, i, outer_type, stream, show, level, flags);
648 flds = 1;
649 }
650 else
651 {
652 flds += 1;
653 fprintf_filtered (stream, "\n%*s", level + 4, "");
654 ada_print_type (TYPE_FIELD_TYPE (type, i),
655 TYPE_FIELD_NAME (type, i),
656 stream, show - 1, level + 4, flags);
657 fprintf_filtered (stream, ";");
658 }
659 }
660
661 return flds;
662 }
663
664 /* Print a description on STREAM of all fields of record or union type
665 TYPE, as for print_selected_record_field_types, above. */
666
667 static int
668 print_record_field_types (struct type *type, struct type *outer_type,
669 struct ui_file *stream, int show, int level,
670 const struct type_print_options *flags)
671 {
672 return print_selected_record_field_types (type, outer_type,
673 0, TYPE_NFIELDS (type) - 1,
674 stream, show, level, flags);
675 }
676
677
678 /* Print record type TYPE on STREAM. LEVEL is the recursion (indentation)
679 level, in case the element type itself has nested structure, and SHOW is
680 the number of levels of internal structure to show (see ada_print_type). */
681
682 static void
683 print_record_type (struct type *type0, struct ui_file *stream, int show,
684 int level, const struct type_print_options *flags)
685 {
686 struct type *parent_type;
687 struct type *type;
688
689 type = ada_find_parallel_type (type0, "___XVE");
690 if (type == NULL)
691 type = type0;
692
693 parent_type = ada_parent_type (type);
694 if (ada_type_name (parent_type) != NULL)
695 {
696 const char *parent_name = decoded_type_name (parent_type);
697
698 /* If we fail to decode the parent type name, then use the parent
699 type name as is. Not pretty, but should never happen except
700 when the debugging info is incomplete or incorrect. This
701 prevents a crash trying to print a NULL pointer. */
702 if (parent_name == NULL)
703 parent_name = ada_type_name (parent_type);
704 fprintf_filtered (stream, "new %s with record", parent_name);
705 }
706 else if (parent_type == NULL && ada_is_tagged_type (type, 0))
707 fprintf_filtered (stream, "tagged record");
708 else
709 fprintf_filtered (stream, "record");
710
711 if (show < 0)
712 fprintf_filtered (stream, " ... end record");
713 else
714 {
715 int flds;
716
717 flds = 0;
718 if (parent_type != NULL && ada_type_name (parent_type) == NULL)
719 flds += print_record_field_types (parent_type, parent_type,
720 stream, show, level, flags);
721 flds += print_record_field_types (type, type, stream, show, level,
722 flags);
723
724 if (flds > 0)
725 fprintf_filtered (stream, "\n%*send record", level, "");
726 else if (flds < 0)
727 fprintf_filtered (stream, _(" <incomplete type> end record"));
728 else
729 fprintf_filtered (stream, " null; end record");
730 }
731 }
732
733 /* Print the unchecked union type TYPE in something resembling Ada
734 format on STREAM. LEVEL is the recursion (indentation) level
735 in case the element type itself has nested structure, and SHOW is the
736 number of levels of internal structure to show (see ada_print_type). */
737 static void
738 print_unchecked_union_type (struct type *type, struct ui_file *stream,
739 int show, int level,
740 const struct type_print_options *flags)
741 {
742 if (show < 0)
743 fprintf_filtered (stream, "record (?) is ... end record");
744 else if (TYPE_NFIELDS (type) == 0)
745 fprintf_filtered (stream, "record (?) is null; end record");
746 else
747 {
748 int i;
749
750 fprintf_filtered (stream, "record (?) is\n%*scase ? is", level + 4, "");
751
752 for (i = 0; i < TYPE_NFIELDS (type); i += 1)
753 {
754 fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
755 level + 12, "");
756 ada_print_type (TYPE_FIELD_TYPE (type, i),
757 TYPE_FIELD_NAME (type, i),
758 stream, show - 1, level + 12, flags);
759 fprintf_filtered (stream, ";");
760 }
761
762 fprintf_filtered (stream, "\n%*send case;\n%*send record",
763 level + 4, "", level, "");
764 }
765 }
766
767
768
769 /* Print function or procedure type TYPE on STREAM. Make it a header
770 for function or procedure NAME if NAME is not null. */
771
772 static void
773 print_func_type (struct type *type, struct ui_file *stream, const char *name,
774 const struct type_print_options *flags)
775 {
776 int i, len = TYPE_NFIELDS (type);
777
778 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
779 fprintf_filtered (stream, "procedure");
780 else
781 fprintf_filtered (stream, "function");
782
783 if (name != NULL && name[0] != '\0')
784 fprintf_filtered (stream, " %s", name);
785
786 if (len > 0)
787 {
788 fprintf_filtered (stream, " (");
789 for (i = 0; i < len; i += 1)
790 {
791 if (i > 0)
792 {
793 fputs_filtered ("; ", stream);
794 wrap_here (" ");
795 }
796 fprintf_filtered (stream, "a%d: ", i + 1);
797 ada_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0,
798 flags);
799 }
800 fprintf_filtered (stream, ")");
801 }
802
803 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
804 {
805 fprintf_filtered (stream, " return ");
806 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0, flags);
807 }
808 }
809
810
811 /* Print a description of a type TYPE0.
812 Output goes to STREAM (via stdio).
813 If VARSTRING is a non-empty string, print as an Ada variable/field
814 declaration.
815 SHOW+1 is the maximum number of levels of internal type structure
816 to show (this applies to record types, enumerated types, and
817 array types).
818 SHOW is the number of levels of internal type structure to show
819 when there is a type name for the SHOWth deepest level (0th is
820 outer level).
821 When SHOW<0, no inner structure is shown.
822 LEVEL indicates level of recursion (for nested definitions). */
823
824 void
825 ada_print_type (struct type *type0, const char *varstring,
826 struct ui_file *stream, int show, int level,
827 const struct type_print_options *flags)
828 {
829 struct type *type = ada_check_typedef (ada_get_base_type (type0));
830 char *type_name = decoded_type_name (type0);
831 int is_var_decl = (varstring != NULL && varstring[0] != '\0');
832
833 if (type == NULL)
834 {
835 if (is_var_decl)
836 fprintf_filtered (stream, "%.*s: ",
837 ada_name_prefix_len (varstring), varstring);
838 fprintf_filtered (stream, "<null type?>");
839 return;
840 }
841
842 if (show > 0)
843 type = ada_check_typedef (type);
844
845 if (is_var_decl && TYPE_CODE (type) != TYPE_CODE_FUNC)
846 fprintf_filtered (stream, "%.*s: ",
847 ada_name_prefix_len (varstring), varstring);
848
849 if (type_name != NULL && show <= 0 && !ada_is_aligner_type (type))
850 {
851 fprintf_filtered (stream, "%.*s",
852 ada_name_prefix_len (type_name), type_name);
853 return;
854 }
855
856 if (ada_is_aligner_type (type))
857 ada_print_type (ada_aligned_type (type), "", stream, show, level, flags);
858 else if (ada_is_constrained_packed_array_type (type)
859 && TYPE_CODE (type) != TYPE_CODE_PTR)
860 print_array_type (type, stream, show, level, flags);
861 else
862 switch (TYPE_CODE (type))
863 {
864 default:
865 fprintf_filtered (stream, "<");
866 c_print_type (type, "", stream, show, level, flags);
867 fprintf_filtered (stream, ">");
868 break;
869 case TYPE_CODE_PTR:
870 case TYPE_CODE_TYPEDEF:
871 fprintf_filtered (stream, "access ");
872 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
873 flags);
874 break;
875 case TYPE_CODE_REF:
876 fprintf_filtered (stream, "<ref> ");
877 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
878 flags);
879 break;
880 case TYPE_CODE_ARRAY:
881 print_array_type (type, stream, show, level, flags);
882 break;
883 case TYPE_CODE_BOOL:
884 fprintf_filtered (stream, "(false, true)");
885 break;
886 case TYPE_CODE_INT:
887 if (ada_is_fixed_point_type (type))
888 print_fixed_point_type (type, stream);
889 else
890 {
891 const char *name = ada_type_name (type);
892
893 if (!ada_is_range_type_name (name))
894 fprintf_filtered (stream, _("<%d-byte integer>"),
895 TYPE_LENGTH (type));
896 else
897 {
898 fprintf_filtered (stream, "range ");
899 print_range_type (type, stream, 1 /* bounds_prefered_p */);
900 }
901 }
902 break;
903 case TYPE_CODE_RANGE:
904 if (ada_is_fixed_point_type (type))
905 print_fixed_point_type (type, stream);
906 else if (ada_is_modular_type (type))
907 fprintf_filtered (stream, "mod %s",
908 int_string (ada_modulus (type), 10, 0, 0, 1));
909 else
910 {
911 fprintf_filtered (stream, "range ");
912 print_range (type, stream, 1 /* bounds_prefered_p */);
913 }
914 break;
915 case TYPE_CODE_FLT:
916 fprintf_filtered (stream, _("<%d-byte float>"), TYPE_LENGTH (type));
917 break;
918 case TYPE_CODE_ENUM:
919 if (show < 0)
920 fprintf_filtered (stream, "(...)");
921 else
922 print_enum_type (type, stream);
923 break;
924 case TYPE_CODE_STRUCT:
925 if (ada_is_array_descriptor_type (type))
926 print_array_type (type, stream, show, level, flags);
927 else if (ada_is_bogus_array_descriptor (type))
928 fprintf_filtered (stream,
929 _("array (?) of ? (<mal-formed descriptor>)"));
930 else
931 print_record_type (type, stream, show, level, flags);
932 break;
933 case TYPE_CODE_UNION:
934 print_unchecked_union_type (type, stream, show, level, flags);
935 break;
936 case TYPE_CODE_FUNC:
937 print_func_type (type, stream, varstring, flags);
938 break;
939 }
940 }
941
942 /* Implement the la_print_typedef language method for Ada. */
943
944 void
945 ada_print_typedef (struct type *type, struct symbol *new_symbol,
946 struct ui_file *stream)
947 {
948 type = ada_check_typedef (type);
949 ada_print_type (type, "", stream, 0, 0, &type_print_raw_options);
950 fprintf_filtered (stream, "\n");
951 }
This page took 0.049566 seconds and 5 git commands to generate.