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