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