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