ada: Use std::string in print_dynamic_range_bound
[deliverable/binutils-gdb.git] / gdb / ada-typeprint.c
1 /* Support for printing Ada types for GDB, the GNU debugger.
2 Copyright (C) 1986-2017 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, const 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 const char *bound = bounds + *n;
234 const 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 LONGEST B;
257 std::string name_buf (name, name_len);
258 name_buf += suffix;
259
260 if (get_int_var_value (name_buf.c_str (), B))
261 ada_print_scalar (type, B, stream);
262 else
263 fprintf_filtered (stream, "?");
264 }
265
266 /* Print RAW_TYPE as a range type, using any bound information
267 following the GNAT encoding (if available).
268
269 If BOUNDS_PREFERED_P is nonzero, force the printing of the range
270 using its bounds. Otherwise, try printing the range without
271 printing the value of the bounds, if possible (this is only
272 considered a hint, not a guaranty). */
273
274 static void
275 print_range_type (struct type *raw_type, struct ui_file *stream,
276 int bounds_prefered_p)
277 {
278 const char *name;
279 struct type *base_type;
280 const char *subtype_info;
281
282 gdb_assert (raw_type != NULL);
283 name = TYPE_NAME (raw_type);
284 gdb_assert (name != NULL);
285
286 if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE)
287 base_type = TYPE_TARGET_TYPE (raw_type);
288 else
289 base_type = raw_type;
290
291 subtype_info = strstr (name, "___XD");
292 if (subtype_info == NULL)
293 print_range (raw_type, stream, bounds_prefered_p);
294 else
295 {
296 int prefix_len = subtype_info - name;
297 const char *bounds_str;
298 int n;
299
300 subtype_info += 5;
301 bounds_str = strchr (subtype_info, '_');
302 n = 1;
303
304 if (*subtype_info == 'L')
305 {
306 print_range_bound (base_type, bounds_str, &n, stream);
307 subtype_info += 1;
308 }
309 else
310 print_dynamic_range_bound (base_type, name, prefix_len, "___L",
311 stream);
312
313 fprintf_filtered (stream, " .. ");
314
315 if (*subtype_info == 'U')
316 print_range_bound (base_type, bounds_str, &n, stream);
317 else
318 print_dynamic_range_bound (base_type, name, prefix_len, "___U",
319 stream);
320 }
321 }
322
323 /* Print enumerated type TYPE on STREAM. */
324
325 static void
326 print_enum_type (struct type *type, struct ui_file *stream)
327 {
328 int len = TYPE_NFIELDS (type);
329 int i;
330 LONGEST lastval;
331
332 fprintf_filtered (stream, "(");
333 wrap_here (" ");
334
335 lastval = 0;
336 for (i = 0; i < len; i++)
337 {
338 QUIT;
339 if (i)
340 fprintf_filtered (stream, ", ");
341 wrap_here (" ");
342 fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
343 if (lastval != TYPE_FIELD_ENUMVAL (type, i))
344 {
345 fprintf_filtered (stream, " => %s",
346 plongest (TYPE_FIELD_ENUMVAL (type, i)));
347 lastval = TYPE_FIELD_ENUMVAL (type, i);
348 }
349 lastval += 1;
350 }
351 fprintf_filtered (stream, ")");
352 }
353
354 /* Print representation of Ada fixed-point type TYPE on STREAM. */
355
356 static void
357 print_fixed_point_type (struct type *type, struct ui_file *stream)
358 {
359 DOUBLEST delta = ada_delta (type);
360 DOUBLEST small = ada_fixed_to_float (type, 1);
361
362 if (delta < 0.0)
363 fprintf_filtered (stream, "delta ??");
364 else
365 {
366 fprintf_filtered (stream, "delta %g", (double) delta);
367 if (delta != small)
368 fprintf_filtered (stream, " <'small = %g>", (double) small);
369 }
370 }
371
372 /* Print simple (constrained) array type TYPE on STREAM. LEVEL is the
373 recursion (indentation) level, in case the element type itself has
374 nested structure, and SHOW is the number of levels of internal
375 structure to show (see ada_print_type). */
376
377 static void
378 print_array_type (struct type *type, struct ui_file *stream, int show,
379 int level, const struct type_print_options *flags)
380 {
381 int bitsize;
382 int n_indices;
383 struct type *elt_type = NULL;
384
385 if (ada_is_constrained_packed_array_type (type))
386 type = ada_coerce_to_simple_array_type (type);
387
388 bitsize = 0;
389 fprintf_filtered (stream, "array (");
390
391 if (type == NULL)
392 {
393 fprintf_filtered (stream, _("<undecipherable array type>"));
394 return;
395 }
396
397 n_indices = -1;
398 if (ada_is_simple_array_type (type))
399 {
400 struct type *range_desc_type;
401 struct type *arr_type;
402
403 range_desc_type = ada_find_parallel_type (type, "___XA");
404 ada_fixup_array_indexes_type (range_desc_type);
405
406 bitsize = 0;
407 if (range_desc_type == NULL)
408 {
409 for (arr_type = type; TYPE_CODE (arr_type) == TYPE_CODE_ARRAY;
410 arr_type = TYPE_TARGET_TYPE (arr_type))
411 {
412 if (arr_type != type)
413 fprintf_filtered (stream, ", ");
414 print_range (TYPE_INDEX_TYPE (arr_type), stream,
415 0 /* bounds_prefered_p */);
416 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
417 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
418 }
419 }
420 else
421 {
422 int k;
423
424 n_indices = TYPE_NFIELDS (range_desc_type);
425 for (k = 0, arr_type = type;
426 k < n_indices;
427 k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
428 {
429 if (k > 0)
430 fprintf_filtered (stream, ", ");
431 print_range_type (TYPE_FIELD_TYPE (range_desc_type, k),
432 stream, 0 /* bounds_prefered_p */);
433 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
434 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
435 }
436 }
437 }
438 else
439 {
440 int i, i0;
441
442 for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
443 fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
444 }
445
446 elt_type = ada_array_element_type (type, n_indices);
447 fprintf_filtered (stream, ") of ");
448 wrap_here ("");
449 ada_print_type (elt_type, "", stream, show == 0 ? 0 : show - 1, level + 1,
450 flags);
451 /* Arrays with variable-length elements are never bit-packed in practice but
452 compilers have to describe their stride so that we can properly fetch
453 individual elements. Do not say the array is packed in this case. */
454 if (bitsize > 0 && !is_dynamic_type (elt_type))
455 fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
456 }
457
458 /* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
459 STREAM, assuming that VAL_TYPE (if non-NULL) is the type of the
460 values. Return non-zero if the field is an encoding of
461 discriminant values, as in a standard variant record, and 0 if the
462 field is not so encoded (as happens with single-component variants
463 in types annotated with pragma Unchecked_Variant). */
464
465 static int
466 print_choices (struct type *type, int field_num, struct ui_file *stream,
467 struct type *val_type)
468 {
469 int have_output;
470 int p;
471 const char *name = TYPE_FIELD_NAME (type, field_num);
472
473 have_output = 0;
474
475 /* Skip over leading 'V': NOTE soon to be obsolete. */
476 if (name[0] == 'V')
477 {
478 if (!ada_scan_number (name, 1, NULL, &p))
479 goto Huh;
480 }
481 else
482 p = 0;
483
484 while (1)
485 {
486 switch (name[p])
487 {
488 default:
489 goto Huh;
490 case '_':
491 case '\0':
492 fprintf_filtered (stream, " =>");
493 return 1;
494 case 'S':
495 case 'R':
496 case 'O':
497 if (have_output)
498 fprintf_filtered (stream, " | ");
499 have_output = 1;
500 break;
501 }
502
503 switch (name[p])
504 {
505 case 'S':
506 {
507 LONGEST W;
508
509 if (!ada_scan_number (name, p + 1, &W, &p))
510 goto Huh;
511 ada_print_scalar (val_type, W, stream);
512 break;
513 }
514 case 'R':
515 {
516 LONGEST L, U;
517
518 if (!ada_scan_number (name, p + 1, &L, &p)
519 || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
520 goto Huh;
521 ada_print_scalar (val_type, L, stream);
522 fprintf_filtered (stream, " .. ");
523 ada_print_scalar (val_type, U, stream);
524 break;
525 }
526 case 'O':
527 fprintf_filtered (stream, "others");
528 p += 1;
529 break;
530 }
531 }
532
533 Huh:
534 fprintf_filtered (stream, "?? =>");
535 return 0;
536 }
537
538 /* Assuming that field FIELD_NUM of TYPE represents variants whose
539 discriminant is contained in OUTER_TYPE, print its components on STREAM.
540 LEVEL is the recursion (indentation) level, in case any of the fields
541 themselves have nested structure, and SHOW is the number of levels of
542 internal structure to show (see ada_print_type). For this purpose,
543 fields nested in a variant part are taken to be at the same level as
544 the fields immediately outside the variant part. */
545
546 static void
547 print_variant_clauses (struct type *type, int field_num,
548 struct type *outer_type, struct ui_file *stream,
549 int show, int level,
550 const struct type_print_options *flags)
551 {
552 int i;
553 struct type *var_type, *par_type;
554 struct type *discr_type;
555
556 var_type = TYPE_FIELD_TYPE (type, field_num);
557 discr_type = ada_variant_discrim_type (var_type, outer_type);
558
559 if (TYPE_CODE (var_type) == TYPE_CODE_PTR)
560 {
561 var_type = TYPE_TARGET_TYPE (var_type);
562 if (var_type == NULL || TYPE_CODE (var_type) != TYPE_CODE_UNION)
563 return;
564 }
565
566 par_type = ada_find_parallel_type (var_type, "___XVU");
567 if (par_type != NULL)
568 var_type = par_type;
569
570 for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
571 {
572 fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
573 if (print_choices (var_type, i, stream, discr_type))
574 {
575 if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i),
576 outer_type, stream, show, level + 4,
577 flags)
578 <= 0)
579 fprintf_filtered (stream, " null;");
580 }
581 else
582 print_selected_record_field_types (var_type, outer_type, i, i,
583 stream, show, level + 4, flags);
584 }
585 }
586
587 /* Assuming that field FIELD_NUM of TYPE is a variant part whose
588 discriminants are contained in OUTER_TYPE, print a description of it
589 on STREAM. LEVEL is the recursion (indentation) level, in case any of
590 the fields themselves have nested structure, and SHOW is the number of
591 levels of internal structure to show (see ada_print_type). For this
592 purpose, fields nested in a variant part are taken to be at the same
593 level as the fields immediately outside the variant part. */
594
595 static void
596 print_variant_part (struct type *type, int field_num, struct type *outer_type,
597 struct ui_file *stream, int show, int level,
598 const struct type_print_options *flags)
599 {
600 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "",
601 ada_variant_discrim_name
602 (TYPE_FIELD_TYPE (type, field_num)));
603 print_variant_clauses (type, field_num, outer_type, stream, show,
604 level + 4, flags);
605 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
606 }
607
608 /* Print a description on STREAM of the fields FLD0 through FLD1 in
609 record or union type TYPE, whose discriminants are in OUTER_TYPE.
610 LEVEL is the recursion (indentation) level, in case any of the
611 fields themselves have nested structure, and SHOW is the number of
612 levels of internal structure to show (see ada_print_type). Does
613 not print parent type information of TYPE. Returns 0 if no fields
614 printed, -1 for an incomplete type, else > 0. Prints each field
615 beginning on a new line, but does not put a new line at end. */
616
617 static int
618 print_selected_record_field_types (struct type *type, struct type *outer_type,
619 int fld0, int fld1,
620 struct ui_file *stream, int show, int level,
621 const struct type_print_options *flags)
622 {
623 int i, flds;
624
625 flds = 0;
626
627 if (fld0 > fld1 && TYPE_STUB (type))
628 return -1;
629
630 for (i = fld0; i <= fld1; i += 1)
631 {
632 QUIT;
633
634 if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
635 ;
636 else if (ada_is_wrapper_field (type, i))
637 flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type,
638 stream, show, level, flags);
639 else if (ada_is_variant_part (type, i))
640 {
641 print_variant_part (type, i, outer_type, stream, show, level, flags);
642 flds = 1;
643 }
644 else
645 {
646 flds += 1;
647 fprintf_filtered (stream, "\n%*s", level + 4, "");
648 ada_print_type (TYPE_FIELD_TYPE (type, i),
649 TYPE_FIELD_NAME (type, i),
650 stream, show - 1, level + 4, flags);
651 fprintf_filtered (stream, ";");
652 }
653 }
654
655 return flds;
656 }
657
658 /* Print a description on STREAM of all fields of record or union type
659 TYPE, as for print_selected_record_field_types, above. */
660
661 static int
662 print_record_field_types (struct type *type, struct type *outer_type,
663 struct ui_file *stream, int show, int level,
664 const struct type_print_options *flags)
665 {
666 return print_selected_record_field_types (type, outer_type,
667 0, TYPE_NFIELDS (type) - 1,
668 stream, show, level, flags);
669 }
670
671
672 /* Print record type TYPE on STREAM. LEVEL is the recursion (indentation)
673 level, in case the element type itself has nested structure, and SHOW is
674 the number of levels of internal structure to show (see ada_print_type). */
675
676 static void
677 print_record_type (struct type *type0, struct ui_file *stream, int show,
678 int level, const struct type_print_options *flags)
679 {
680 struct type *parent_type;
681 struct type *type;
682
683 type = ada_find_parallel_type (type0, "___XVE");
684 if (type == NULL)
685 type = type0;
686
687 parent_type = ada_parent_type (type);
688 if (ada_type_name (parent_type) != NULL)
689 {
690 const char *parent_name = decoded_type_name (parent_type);
691
692 /* If we fail to decode the parent type name, then use the parent
693 type name as is. Not pretty, but should never happen except
694 when the debugging info is incomplete or incorrect. This
695 prevents a crash trying to print a NULL pointer. */
696 if (parent_name == NULL)
697 parent_name = ada_type_name (parent_type);
698 fprintf_filtered (stream, "new %s with record", parent_name);
699 }
700 else if (parent_type == NULL && ada_is_tagged_type (type, 0))
701 fprintf_filtered (stream, "tagged record");
702 else
703 fprintf_filtered (stream, "record");
704
705 if (show < 0)
706 fprintf_filtered (stream, " ... end record");
707 else
708 {
709 int flds;
710
711 flds = 0;
712 if (parent_type != NULL && ada_type_name (parent_type) == NULL)
713 flds += print_record_field_types (parent_type, parent_type,
714 stream, show, level, flags);
715 flds += print_record_field_types (type, type, stream, show, level,
716 flags);
717
718 if (flds > 0)
719 fprintf_filtered (stream, "\n%*send record", level, "");
720 else if (flds < 0)
721 fprintf_filtered (stream, _(" <incomplete type> end record"));
722 else
723 fprintf_filtered (stream, " null; end record");
724 }
725 }
726
727 /* Print the unchecked union type TYPE in something resembling Ada
728 format on STREAM. LEVEL is the recursion (indentation) level
729 in case the element type itself has nested structure, and SHOW is the
730 number of levels of internal structure to show (see ada_print_type). */
731 static void
732 print_unchecked_union_type (struct type *type, struct ui_file *stream,
733 int show, int level,
734 const struct type_print_options *flags)
735 {
736 if (show < 0)
737 fprintf_filtered (stream, "record (?) is ... end record");
738 else if (TYPE_NFIELDS (type) == 0)
739 fprintf_filtered (stream, "record (?) is null; end record");
740 else
741 {
742 int i;
743
744 fprintf_filtered (stream, "record (?) is\n%*scase ? is", level + 4, "");
745
746 for (i = 0; i < TYPE_NFIELDS (type); i += 1)
747 {
748 fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
749 level + 12, "");
750 ada_print_type (TYPE_FIELD_TYPE (type, i),
751 TYPE_FIELD_NAME (type, i),
752 stream, show - 1, level + 12, flags);
753 fprintf_filtered (stream, ";");
754 }
755
756 fprintf_filtered (stream, "\n%*send case;\n%*send record",
757 level + 4, "", level, "");
758 }
759 }
760
761
762
763 /* Print function or procedure type TYPE on STREAM. Make it a header
764 for function or procedure NAME if NAME is not null. */
765
766 static void
767 print_func_type (struct type *type, struct ui_file *stream, const char *name,
768 const struct type_print_options *flags)
769 {
770 int i, len = TYPE_NFIELDS (type);
771
772 if (TYPE_TARGET_TYPE (type) != NULL
773 && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
774 fprintf_filtered (stream, "procedure");
775 else
776 fprintf_filtered (stream, "function");
777
778 if (name != NULL && name[0] != '\0')
779 fprintf_filtered (stream, " %s", name);
780
781 if (len > 0)
782 {
783 fprintf_filtered (stream, " (");
784 for (i = 0; i < len; i += 1)
785 {
786 if (i > 0)
787 {
788 fputs_filtered ("; ", stream);
789 wrap_here (" ");
790 }
791 fprintf_filtered (stream, "a%d: ", i + 1);
792 ada_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0,
793 flags);
794 }
795 fprintf_filtered (stream, ")");
796 }
797
798 if (TYPE_TARGET_TYPE (type) == NULL)
799 fprintf_filtered (stream, " return <unknown return type>");
800 else if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
801 {
802 fprintf_filtered (stream, " return ");
803 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0, flags);
804 }
805 }
806
807
808 /* Print a description of a type TYPE0.
809 Output goes to STREAM (via stdio).
810 If VARSTRING is a non-empty string, print as an Ada variable/field
811 declaration.
812 SHOW+1 is the maximum number of levels of internal type structure
813 to show (this applies to record types, enumerated types, and
814 array types).
815 SHOW is the number of levels of internal type structure to show
816 when there is a type name for the SHOWth deepest level (0th is
817 outer level).
818 When SHOW<0, no inner structure is shown.
819 LEVEL indicates level of recursion (for nested definitions). */
820
821 void
822 ada_print_type (struct type *type0, const char *varstring,
823 struct ui_file *stream, int show, int level,
824 const struct type_print_options *flags)
825 {
826 struct type *type = ada_check_typedef (ada_get_base_type (type0));
827 char *type_name = decoded_type_name (type0);
828 int is_var_decl = (varstring != NULL && varstring[0] != '\0');
829
830 if (type == NULL)
831 {
832 if (is_var_decl)
833 fprintf_filtered (stream, "%.*s: ",
834 ada_name_prefix_len (varstring), varstring);
835 fprintf_filtered (stream, "<null type?>");
836 return;
837 }
838
839 if (show > 0)
840 type = ada_check_typedef (type);
841
842 if (is_var_decl && TYPE_CODE (type) != TYPE_CODE_FUNC)
843 fprintf_filtered (stream, "%.*s: ",
844 ada_name_prefix_len (varstring), varstring);
845
846 if (type_name != NULL && show <= 0 && !ada_is_aligner_type (type))
847 {
848 fprintf_filtered (stream, "%.*s",
849 ada_name_prefix_len (type_name), type_name);
850 return;
851 }
852
853 if (ada_is_aligner_type (type))
854 ada_print_type (ada_aligned_type (type), "", stream, show, level, flags);
855 else if (ada_is_constrained_packed_array_type (type)
856 && TYPE_CODE (type) != TYPE_CODE_PTR)
857 print_array_type (type, stream, show, level, flags);
858 else
859 switch (TYPE_CODE (type))
860 {
861 default:
862 fprintf_filtered (stream, "<");
863 c_print_type (type, "", stream, show, level, flags);
864 fprintf_filtered (stream, ">");
865 break;
866 case TYPE_CODE_PTR:
867 case TYPE_CODE_TYPEDEF:
868 fprintf_filtered (stream, "access ");
869 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
870 flags);
871 break;
872 case TYPE_CODE_REF:
873 fprintf_filtered (stream, "<ref> ");
874 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
875 flags);
876 break;
877 case TYPE_CODE_ARRAY:
878 print_array_type (type, stream, show, level, flags);
879 break;
880 case TYPE_CODE_BOOL:
881 fprintf_filtered (stream, "(false, true)");
882 break;
883 case TYPE_CODE_INT:
884 if (ada_is_fixed_point_type (type))
885 print_fixed_point_type (type, stream);
886 else
887 {
888 const char *name = ada_type_name (type);
889
890 if (!ada_is_range_type_name (name))
891 fprintf_filtered (stream, _("<%d-byte integer>"),
892 TYPE_LENGTH (type));
893 else
894 {
895 fprintf_filtered (stream, "range ");
896 print_range_type (type, stream, 1 /* bounds_prefered_p */);
897 }
898 }
899 break;
900 case TYPE_CODE_RANGE:
901 if (ada_is_fixed_point_type (type))
902 print_fixed_point_type (type, stream);
903 else if (ada_is_modular_type (type))
904 fprintf_filtered (stream, "mod %s",
905 int_string (ada_modulus (type), 10, 0, 0, 1));
906 else
907 {
908 fprintf_filtered (stream, "range ");
909 print_range (type, stream, 1 /* bounds_prefered_p */);
910 }
911 break;
912 case TYPE_CODE_FLT:
913 fprintf_filtered (stream, _("<%d-byte float>"), TYPE_LENGTH (type));
914 break;
915 case TYPE_CODE_ENUM:
916 if (show < 0)
917 fprintf_filtered (stream, "(...)");
918 else
919 print_enum_type (type, stream);
920 break;
921 case TYPE_CODE_STRUCT:
922 if (ada_is_array_descriptor_type (type))
923 print_array_type (type, stream, show, level, flags);
924 else if (ada_is_bogus_array_descriptor (type))
925 fprintf_filtered (stream,
926 _("array (?) of ? (<mal-formed descriptor>)"));
927 else
928 print_record_type (type, stream, show, level, flags);
929 break;
930 case TYPE_CODE_UNION:
931 print_unchecked_union_type (type, stream, show, level, flags);
932 break;
933 case TYPE_CODE_FUNC:
934 print_func_type (type, stream, varstring, flags);
935 break;
936 }
937 }
938
939 /* Implement the la_print_typedef language method for Ada. */
940
941 void
942 ada_print_typedef (struct type *type, struct symbol *new_symbol,
943 struct ui_file *stream)
944 {
945 type = ada_check_typedef (type);
946 ada_print_type (type, "", stream, 0, 0, &type_print_raw_options);
947 fprintf_filtered (stream, "\n");
948 }
This page took 0.065263 seconds and 5 git commands to generate.