* elf32-ppc.c: Formatting.
[deliverable/binutils-gdb.git] / gdb / ada-typeprint.c
CommitLineData
14f9c5c9
AS
1/* Support for printing Ada types for GDB, the GNU debugger.
2 Copyright 1986, 1988, 1989, 1991, 1997 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20#include "defs.h"
04ea0df1 21#include "gdb_obstack.h"
14f9c5c9
AS
22#include "bfd.h" /* Binary File Description */
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "expression.h"
26#include "value.h"
27#include "gdbcore.h"
28#include "target.h"
29#include "command.h"
30#include "gdbcmd.h"
31#include "language.h"
32#include "demangle.h"
33#include "c-lang.h"
34#include "typeprint.h"
35#include "ada-lang.h"
36
37#include <ctype.h>
0c30c098 38#include "gdb_string.h"
14f9c5c9
AS
39#include <errno.h>
40
d2e4a39e 41static int print_record_field_types (struct type *, struct type *,
14f9c5c9
AS
42 struct ui_file *, int, int);
43
d2e4a39e 44static void print_array_type (struct type *, struct ui_file *, int, int);
14f9c5c9 45
d2e4a39e
AS
46static void print_choices (struct type *, int, struct ui_file *,
47 struct type *);
14f9c5c9 48
d2e4a39e 49static void print_range (struct type *, struct ui_file *);
14f9c5c9 50
d2e4a39e
AS
51static void print_range_bound (struct type *, char *, int *,
52 struct ui_file *);
14f9c5c9 53
d2e4a39e
AS
54static void
55print_dynamic_range_bound (struct type *, const char *, int,
56 const char *, struct ui_file *);
14f9c5c9 57
d2e4a39e 58static void print_range_type_named (char *, struct ui_file *);
14f9c5c9
AS
59\f
60
d2e4a39e
AS
61
62static char *name_buffer;
14f9c5c9
AS
63static int name_buffer_len;
64
65/* The (demangled) Ada name of TYPE. This value persists until the
66 next call. */
67
d2e4a39e 68static char *
ebf56fd3 69demangled_type_name (struct type *type)
14f9c5c9
AS
70{
71 if (ada_type_name (type) == NULL)
72 return NULL;
d2e4a39e 73 else
14f9c5c9 74 {
d2e4a39e
AS
75 char *raw_name = ada_type_name (type);
76 char *s, *q;
14f9c5c9
AS
77
78 if (name_buffer == NULL || name_buffer_len <= strlen (raw_name))
79 {
80 name_buffer_len = 16 + 2 * strlen (raw_name);
81 name_buffer = xrealloc (name_buffer, name_buffer_len);
82 }
83 strcpy (name_buffer, raw_name);
84
d2e4a39e 85 s = (char *) strstr (name_buffer, "___");
14f9c5c9
AS
86 if (s != NULL)
87 *s = '\0';
88
89 s = name_buffer + strlen (name_buffer) - 1;
90 while (s > name_buffer && (s[0] != '_' || s[-1] != '_'))
91 s -= 1;
92
93 if (s == name_buffer)
94 return name_buffer;
95
d2e4a39e 96 if (!islower (s[1]))
14f9c5c9
AS
97 return NULL;
98
99 for (s = q = name_buffer; *s != '\0'; q += 1)
100 {
101 if (s[0] == '_' && s[1] == '_')
102 {
d2e4a39e
AS
103 *q = '.';
104 s += 2;
14f9c5c9
AS
105 }
106 else
107 {
d2e4a39e
AS
108 *q = *s;
109 s += 1;
14f9c5c9
AS
110 }
111 }
112 *q = '\0';
113 return name_buffer;
114 }
115}
116
117
118/* Print a description of a type in the format of a
119 typedef for the current language.
120 NEW is the new name for a type TYPE. */
121
122void
d2e4a39e
AS
123ada_typedef_print (struct type *type, struct symbol *new,
124 struct ui_file *stream)
14f9c5c9 125{
d2e4a39e
AS
126 fprintf_filtered (stream, "type %.*s is ",
127 ada_name_prefix_len (SYMBOL_SOURCE_NAME (new)),
128 SYMBOL_SOURCE_NAME (new));
14f9c5c9
AS
129 type_print (type, "", stream, 1);
130}
131
132/* Print range type TYPE on STREAM. */
133
134static void
d2e4a39e 135print_range (struct type *type, struct ui_file *stream)
14f9c5c9 136{
d2e4a39e 137 struct type *target_type;
14f9c5c9
AS
138 target_type = TYPE_TARGET_TYPE (type);
139 if (target_type == NULL)
140 target_type = type;
141
d2e4a39e 142 switch (TYPE_CODE (target_type))
14f9c5c9
AS
143 {
144 case TYPE_CODE_RANGE:
145 case TYPE_CODE_INT:
146 case TYPE_CODE_BOOL:
147 case TYPE_CODE_CHAR:
148 case TYPE_CODE_ENUM:
149 break;
150 default:
151 target_type = builtin_type_ada_int;
152 break;
153 }
154
155 if (TYPE_NFIELDS (type) < 2)
156 {
157 /* A range needs at least 2 bounds to be printed. If there are less
158 than 2, just print the type name instead of the range itself.
159 This check handles cases such as characters, for example.
160
161 Note that if the name is not defined, then we don't print anything.
162 */
163 fprintf_filtered (stream, "%.*s",
d2e4a39e
AS
164 ada_name_prefix_len (TYPE_NAME (type)),
165 TYPE_NAME (type));
14f9c5c9
AS
166 }
167 else
168 {
169 /* We extract the range type bounds respectively from the first element
170 and the last element of the type->fields array */
171 const LONGEST lower_bound = (LONGEST) TYPE_LOW_BOUND (type);
172 const LONGEST upper_bound =
d2e4a39e 173 (LONGEST) TYPE_FIELD_BITPOS (type, TYPE_NFIELDS (type) - 1);
14f9c5c9
AS
174
175 ada_print_scalar (target_type, lower_bound, stream);
176 fprintf_filtered (stream, " .. ");
177 ada_print_scalar (target_type, upper_bound, stream);
178 }
179}
180
181/* Print the number or discriminant bound at BOUNDS+*N on STREAM, and
182 set *N past the bound and its delimiter, if any. */
183
184static void
d2e4a39e
AS
185print_range_bound (struct type *type, char *bounds, int *n,
186 struct ui_file *stream)
14f9c5c9
AS
187{
188 LONGEST B;
189 if (ada_scan_number (bounds, *n, &B, n))
190 {
191 ada_print_scalar (type, B, stream);
192 if (bounds[*n] == '_')
193 *n += 2;
194 }
195 else
196 {
197 int bound_len;
d2e4a39e
AS
198 char *bound = bounds + *n;
199 char *pend;
14f9c5c9
AS
200
201 pend = strstr (bound, "__");
202 if (pend == NULL)
203 *n += bound_len = strlen (bound);
d2e4a39e 204 else
14f9c5c9
AS
205 {
206 bound_len = pend - bound;
207 *n += bound_len + 2;
208 }
209 fprintf_filtered (stream, "%.*s", bound_len, bound);
210 }
211}
212
213/* Assuming NAME[0 .. NAME_LEN-1] is the name of a range type, print
214 the value (if found) of the bound indicated by SUFFIX ("___L" or
215 "___U") according to the ___XD conventions. */
216
217static void
d2e4a39e
AS
218print_dynamic_range_bound (struct type *type, const char *name, int name_len,
219 const char *suffix, struct ui_file *stream)
14f9c5c9
AS
220{
221 static char *name_buf = NULL;
222 static size_t name_buf_len = 0;
223 LONGEST B;
224 int OK;
225
226 GROW_VECT (name_buf, name_buf_len, name_len + strlen (suffix) + 1);
227 strncpy (name_buf, name, name_len);
228 strcpy (name_buf + name_len, suffix);
229
230 B = get_int_var_value (name_buf, 0, &OK);
231 if (OK)
232 ada_print_scalar (type, B, stream);
233 else
234 fprintf_filtered (stream, "?");
235}
236
237/* Print the range type named NAME. */
238
239static void
d2e4a39e 240print_range_type_named (char *name, struct ui_file *stream)
14f9c5c9
AS
241{
242 struct type *raw_type = ada_find_any_type (name);
243 struct type *base_type;
244 LONGEST low, high;
d2e4a39e 245 char *subtype_info;
14f9c5c9
AS
246
247 if (raw_type == NULL)
248 base_type = builtin_type_int;
249 else if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE)
250 base_type = TYPE_TARGET_TYPE (raw_type);
251 else
252 base_type = raw_type;
253
254 subtype_info = strstr (name, "___XD");
255 if (subtype_info == NULL && raw_type == NULL)
256 fprintf_filtered (stream, "? .. ?");
257 else if (subtype_info == NULL)
258 print_range (raw_type, stream);
259 else
260 {
261 int prefix_len = subtype_info - name;
262 char *bounds_str;
263 int n;
264
265 subtype_info += 5;
266 bounds_str = strchr (subtype_info, '_');
267 n = 1;
268
d2e4a39e 269 if (*subtype_info == 'L')
14f9c5c9
AS
270 {
271 print_range_bound (raw_type, bounds_str, &n, stream);
272 subtype_info += 1;
273 }
274 else
d2e4a39e
AS
275 print_dynamic_range_bound (raw_type, name, prefix_len, "___L",
276 stream);
14f9c5c9
AS
277
278 fprintf_filtered (stream, " .. ");
279
d2e4a39e 280 if (*subtype_info == 'U')
14f9c5c9
AS
281 print_range_bound (raw_type, bounds_str, &n, stream);
282 else
d2e4a39e
AS
283 print_dynamic_range_bound (raw_type, name, prefix_len, "___U",
284 stream);
14f9c5c9 285 }
d2e4a39e 286}
14f9c5c9
AS
287
288/* Print enumerated type TYPE on STREAM. */
289
290static void
ebf56fd3 291print_enum_type (struct type *type, struct ui_file *stream)
14f9c5c9
AS
292{
293 int len = TYPE_NFIELDS (type);
294 int i, lastval;
295
296 fprintf_filtered (stream, "(");
297 wrap_here (" ");
298
299 lastval = 0;
300 for (i = 0; i < len; i++)
301 {
302 QUIT;
d2e4a39e
AS
303 if (i)
304 fprintf_filtered (stream, ", ");
14f9c5c9
AS
305 wrap_here (" ");
306 fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
307 if (lastval != TYPE_FIELD_BITPOS (type, i))
308 {
309 fprintf_filtered (stream, " => %d", TYPE_FIELD_BITPOS (type, i));
310 lastval = TYPE_FIELD_BITPOS (type, i);
311 }
312 lastval += 1;
313 }
314 fprintf_filtered (stream, ")");
315}
316
317/* Print representation of Ada fixed-point type TYPE on STREAM. */
318
319static void
ebf56fd3 320print_fixed_point_type (struct type *type, struct ui_file *stream)
14f9c5c9
AS
321{
322 DOUBLEST delta = ada_delta (type);
323 DOUBLEST small = ada_fixed_to_float (type, 1.0);
324
325 if (delta < 0.0)
326 fprintf_filtered (stream, "delta ??");
327 else
328 {
329 fprintf_filtered (stream, "delta %g", (double) delta);
d2e4a39e 330 if (delta != small)
14f9c5c9
AS
331 fprintf_filtered (stream, " <'small = %g>", (double) small);
332 }
333}
334
335/* Print representation of special VAX floating-point type TYPE on STREAM. */
336
337static void
ebf56fd3 338print_vax_floating_point_type (struct type *type, struct ui_file *stream)
14f9c5c9
AS
339{
340 fprintf_filtered (stream, "<float format %c>",
341 ada_vax_float_type_suffix (type));
342}
343
344/* Print simple (constrained) array type TYPE on STREAM. LEVEL is the
345 recursion (indentation) level, in case the element type itself has
346 nested structure, and SHOW is the number of levels of internal
347 structure to show (see ada_print_type). */
348
349static void
d2e4a39e
AS
350print_array_type (struct type *type, struct ui_file *stream, int show,
351 int level)
14f9c5c9
AS
352{
353 int bitsize;
354 int n_indices;
355
356 bitsize = 0;
357 fprintf_filtered (stream, "array (");
358
359 n_indices = -1;
d2e4a39e 360 if (show < 0)
14f9c5c9
AS
361 fprintf_filtered (stream, "...");
362 else
363 {
364 if (ada_is_packed_array_type (type))
365 type = ada_coerce_to_simple_array_type (type);
d2e4a39e 366 if (ada_is_simple_array (type))
14f9c5c9 367 {
d2e4a39e 368 struct type *range_desc_type =
14f9c5c9 369 ada_find_parallel_type (type, "___XA");
d2e4a39e 370 struct type *arr_type;
14f9c5c9
AS
371
372 bitsize = 0;
373 if (range_desc_type == NULL)
374 {
375 for (arr_type = type; TYPE_CODE (arr_type) == TYPE_CODE_ARRAY;
376 arr_type = TYPE_TARGET_TYPE (arr_type))
377 {
378 if (arr_type != type)
379 fprintf_filtered (stream, ", ");
380 print_range (TYPE_INDEX_TYPE (arr_type), stream);
381 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
382 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
383 }
384 }
d2e4a39e 385 else
14f9c5c9
AS
386 {
387 int k;
d2e4a39e
AS
388 n_indices = TYPE_NFIELDS (range_desc_type);
389 for (k = 0, arr_type = type;
14f9c5c9
AS
390 k < n_indices;
391 k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
392 {
393 if (k > 0)
394 fprintf_filtered (stream, ", ");
d2e4a39e
AS
395 print_range_type_named (TYPE_FIELD_NAME
396 (range_desc_type, k), stream);
14f9c5c9
AS
397 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
398 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
d2e4a39e 399 }
14f9c5c9
AS
400 }
401 }
d2e4a39e 402 else
14f9c5c9
AS
403 {
404 int i, i0;
405 for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
406 fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
407 }
408 }
409
410 fprintf_filtered (stream, ") of ");
411 wrap_here ("");
d2e4a39e
AS
412 ada_print_type (ada_array_element_type (type, n_indices), "", stream,
413 show == 0 ? 0 : show - 1, level + 1);
14f9c5c9
AS
414 if (bitsize > 0)
415 fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
416}
417
418/* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
419 STREAM, assuming the VAL_TYPE is the type of the values. */
420
421static void
d2e4a39e
AS
422print_choices (struct type *type, int field_num, struct ui_file *stream,
423 struct type *val_type)
14f9c5c9
AS
424{
425 int have_output;
426 int p;
d2e4a39e 427 const char *name = TYPE_FIELD_NAME (type, field_num);
14f9c5c9
AS
428
429 have_output = 0;
430
431 /* Skip over leading 'V': NOTE soon to be obsolete. */
432 if (name[0] == 'V')
433 {
d2e4a39e 434 if (!ada_scan_number (name, 1, NULL, &p))
14f9c5c9
AS
435 goto Huh;
436 }
437 else
438 p = 0;
439
440 while (1)
441 {
d2e4a39e 442 switch (name[p])
14f9c5c9
AS
443 {
444 default:
445 return;
446 case 'S':
447 case 'R':
448 case 'O':
d2e4a39e 449 if (have_output)
14f9c5c9
AS
450 fprintf_filtered (stream, " | ");
451 have_output = 1;
452 break;
453 }
454
d2e4a39e 455 switch (name[p])
14f9c5c9
AS
456 {
457 case 'S':
458 {
459 LONGEST W;
d2e4a39e 460 if (!ada_scan_number (name, p + 1, &W, &p))
14f9c5c9
AS
461 goto Huh;
462 ada_print_scalar (val_type, W, stream);
463 break;
464 }
465 case 'R':
466 {
467 LONGEST L, U;
d2e4a39e
AS
468 if (!ada_scan_number (name, p + 1, &L, &p)
469 || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
14f9c5c9
AS
470 goto Huh;
471 ada_print_scalar (val_type, L, stream);
472 fprintf_filtered (stream, " .. ");
473 ada_print_scalar (val_type, U, stream);
474 break;
475 }
476 case 'O':
477 fprintf_filtered (stream, "others");
478 p += 1;
479 break;
480 }
481 }
482
483Huh:
484 fprintf_filtered (stream, "??");
485
486}
487
488/* Assuming that field FIELD_NUM of TYPE is a VARIANTS field whose
489 discriminant is contained in OUTER_TYPE, print its variants on STREAM.
490 LEVEL is the recursion
491 (indentation) level, in case any of the fields themselves have
492 nested structure, and SHOW is the number of levels of internal structure
493 to show (see ada_print_type). For this purpose, fields nested in a
494 variant part are taken to be at the same level as the fields
495 immediately outside the variant part. */
496
497static void
ebf56fd3
AS
498print_variant_clauses (struct type *type, int field_num,
499 struct type *outer_type, struct ui_file *stream,
500 int show, int level)
14f9c5c9
AS
501{
502 int i;
503 struct type *var_type;
504 struct type *discr_type;
505
506 var_type = TYPE_FIELD_TYPE (type, field_num);
507 discr_type = ada_variant_discrim_type (var_type, outer_type);
508
509 if (TYPE_CODE (var_type) == TYPE_CODE_PTR)
510 {
511 var_type = TYPE_TARGET_TYPE (var_type);
d2e4a39e 512 if (TYPE_FLAGS (var_type) & TYPE_FLAG_STUB)
14f9c5c9
AS
513 {
514 var_type = ada_find_parallel_type (var_type, "___XVU");
515 if (var_type == NULL)
516 return;
517 }
518 }
519
d2e4a39e 520 for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
14f9c5c9
AS
521 {
522 fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
523 print_choices (var_type, i, stream, discr_type);
524 fprintf_filtered (stream, " =>");
d2e4a39e
AS
525 if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i),
526 outer_type, stream, show, level + 4) <= 0)
14f9c5c9
AS
527 fprintf_filtered (stream, " null;");
528 }
529}
530
531/* Assuming that field FIELD_NUM of TYPE is a variant part whose
532 discriminants are contained in OUTER_TYPE, print a description of it
533 on STREAM. LEVEL is the recursion (indentation) level, in case any of
534 the fields themselves have nested structure, and SHOW is the number of
535 levels of internal structure to show (see ada_print_type). For this
536 purpose, fields nested in a variant part are taken to be at the same
537 level as the fields immediately outside the variant part. */
538
539static void
ebf56fd3
AS
540print_variant_part (struct type *type, int field_num, struct type *outer_type,
541 struct ui_file *stream, int show, int level)
14f9c5c9
AS
542{
543 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "",
d2e4a39e
AS
544 ada_variant_discrim_name
545 (TYPE_FIELD_TYPE (type, field_num)));
546 print_variant_clauses (type, field_num, outer_type, stream, show,
547 level + 4);
14f9c5c9
AS
548 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
549}
550
551/* Print a description on STREAM of the fields in record type TYPE, whose
552 discriminants are in OUTER_TYPE. LEVEL is the recursion (indentation)
553 level, in case any of the fields themselves have nested structure,
554 and SHOW is the number of levels of internal structure to show
555 (see ada_print_type). Does not print parent type information of TYPE.
556 Returns 0 if no fields printed, -1 for an incomplete type, else > 0.
557 Prints each field beginning on a new line, but does not put a new line at
558 end. */
559
560static int
ebf56fd3
AS
561print_record_field_types (struct type *type, struct type *outer_type,
562 struct ui_file *stream, int show, int level)
14f9c5c9
AS
563{
564 int len, i, flds;
565
566 flds = 0;
567 len = TYPE_NFIELDS (type);
568
569 if (len == 0 && (TYPE_FLAGS (type) & TYPE_FLAG_STUB) != 0)
570 return -1;
571
572 for (i = 0; i < len; i += 1)
573 {
574 QUIT;
575
d2e4a39e 576 if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
14f9c5c9
AS
577 ;
578 else if (ada_is_wrapper_field (type, i))
579 flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type,
580 stream, show, level);
d2e4a39e 581 else if (ada_is_variant_part (type, i))
14f9c5c9
AS
582 {
583 print_variant_part (type, i, outer_type, stream, show, level);
584 flds = 1;
585 }
586 else
587 {
588 flds += 1;
589 fprintf_filtered (stream, "\n%*s", level + 4, "");
590 ada_print_type (TYPE_FIELD_TYPE (type, i),
591 TYPE_FIELD_NAME (type, i),
592 stream, show - 1, level + 4);
593 fprintf_filtered (stream, ";");
594 }
595 }
596
597 return flds;
598}
599
600/* Print record type TYPE on STREAM. LEVEL is the recursion (indentation)
601 level, in case the element type itself has nested structure, and SHOW is
602 the number of levels of internal structure to show (see ada_print_type). */
603
604static void
d2e4a39e
AS
605print_record_type (struct type *type0, struct ui_file *stream, int show,
606 int level)
14f9c5c9 607{
d2e4a39e
AS
608 struct type *parent_type;
609 struct type *type;
610
14f9c5c9
AS
611 type = type0;
612 if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
613 {
d2e4a39e 614 struct type *type1 = ada_find_parallel_type (type, "___XVE");
14f9c5c9
AS
615 if (type1 != NULL)
616 type = type1;
617 }
618
619 parent_type = ada_parent_type (type);
d2e4a39e
AS
620 if (ada_type_name (parent_type) != NULL)
621 fprintf_filtered (stream, "new %s with ",
14f9c5c9
AS
622 demangled_type_name (parent_type));
623 else if (parent_type == NULL && ada_is_tagged_type (type))
624 fprintf_filtered (stream, "tagged ");
625
626 fprintf_filtered (stream, "record");
627
628 if (show < 0)
629 fprintf_filtered (stream, " ... end record");
630 else
631 {
632 int flds;
633
634 flds = 0;
635 if (parent_type != NULL && ada_type_name (parent_type) == NULL)
d2e4a39e 636 flds += print_record_field_types (parent_type, parent_type,
14f9c5c9
AS
637 stream, show, level);
638 flds += print_record_field_types (type, type, stream, show, level);
d2e4a39e 639
14f9c5c9
AS
640 if (flds > 0)
641 fprintf_filtered (stream, "\n%*send record", level, "");
d2e4a39e 642 else if (flds < 0)
14f9c5c9 643 fprintf_filtered (stream, " <incomplete type> end record");
d2e4a39e 644 else
14f9c5c9
AS
645 fprintf_filtered (stream, " null; end record");
646 }
647}
648
649/* Print the unchecked union type TYPE in something resembling Ada
650 format on STREAM. LEVEL is the recursion (indentation) level
651 in case the element type itself has nested structure, and SHOW is the
652 number of levels of internal structure to show (see ada_print_type). */
653static void
d2e4a39e 654print_unchecked_union_type (struct type *type, struct ui_file *stream,
14f9c5c9
AS
655 int show, int level)
656{
657 fprintf_filtered (stream, "record (?) is");
658
659 if (show < 0)
660 fprintf_filtered (stream, " ... end record");
d2e4a39e 661 else if (TYPE_NFIELDS (type) == 0)
14f9c5c9
AS
662 fprintf_filtered (stream, " null; end record");
663 else
664 {
665 int i;
666
d2e4a39e 667 fprintf_filtered (stream, "\n%*scase ? is", level + 4, "");
14f9c5c9 668
d2e4a39e 669 for (i = 0; i < TYPE_NFIELDS (type); i += 1)
14f9c5c9 670 {
d2e4a39e
AS
671 fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
672 level + 12, "");
14f9c5c9
AS
673 ada_print_type (TYPE_FIELD_TYPE (type, i),
674 TYPE_FIELD_NAME (type, i),
675 stream, show - 1, level + 12);
676 fprintf_filtered (stream, ";");
677 }
678
d2e4a39e
AS
679 fprintf_filtered (stream, "\n%*send case;\n%*send record",
680 level + 4, "", level, "");
14f9c5c9
AS
681 }
682}
d2e4a39e 683
14f9c5c9
AS
684
685
686/* Print function or procedure type TYPE on STREAM. Make it a header
687 for function or procedure NAME if NAME is not null. */
688
689static void
d2e4a39e 690print_func_type (struct type *type, struct ui_file *stream, char *name)
14f9c5c9
AS
691{
692 int i, len = TYPE_NFIELDS (type);
693
694 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
695 fprintf_filtered (stream, "procedure");
696 else
697 fprintf_filtered (stream, "function");
698
d2e4a39e 699 if (name != NULL && name[0] != '\0')
14f9c5c9
AS
700 fprintf_filtered (stream, " %s", name);
701
d2e4a39e 702 if (len > 0)
14f9c5c9
AS
703 {
704 fprintf_filtered (stream, " (");
705 for (i = 0; i < len; i += 1)
706 {
707 if (i > 0)
708 {
709 fputs_filtered ("; ", stream);
710 wrap_here (" ");
711 }
d2e4a39e 712 fprintf_filtered (stream, "a%d: ", i + 1);
14f9c5c9
AS
713 ada_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
714 }
715 fprintf_filtered (stream, ")");
d2e4a39e 716 }
14f9c5c9
AS
717
718 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
719 {
720 fprintf_filtered (stream, " return ");
721 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
722 }
723}
724
725
726/* Print a description of a type TYPE0.
727 Output goes to STREAM (via stdio).
728 If VARSTRING is a non-empty string, print as an Ada variable/field
729 declaration.
730 SHOW+1 is the maximum number of levels of internal type structure
731 to show (this applies to record types, enumerated types, and
732 array types).
733 SHOW is the number of levels of internal type structure to show
734 when there is a type name for the SHOWth deepest level (0th is
735 outer level).
736 When SHOW<0, no inner structure is shown.
737 LEVEL indicates level of recursion (for nested definitions). */
738
739void
d2e4a39e 740ada_print_type (struct type *type0, char *varstring, struct ui_file *stream,
ebf56fd3 741 int show, int level)
14f9c5c9
AS
742{
743 enum type_code code;
744 int demangled_args;
d2e4a39e
AS
745 struct type *type = ada_completed_type (ada_get_base_type (type0));
746 char *type_name = demangled_type_name (type);
14f9c5c9
AS
747 int is_var_decl = (varstring != NULL && varstring[0] != '\0');
748
749 if (type == NULL)
750 {
751 if (is_var_decl)
752 fprintf_filtered (stream, "%.*s: ",
d2e4a39e 753 ada_name_prefix_len (varstring), varstring);
14f9c5c9
AS
754 fprintf_filtered (stream, "<null type?>");
755 return;
756 }
757
758 if (show > 0)
d2e4a39e 759 CHECK_TYPEDEF (type);
14f9c5c9
AS
760
761 if (is_var_decl && TYPE_CODE (type) != TYPE_CODE_FUNC)
d2e4a39e
AS
762 fprintf_filtered (stream, "%.*s: ",
763 ada_name_prefix_len (varstring), varstring);
14f9c5c9
AS
764
765 if (type_name != NULL && show <= 0)
766 {
d2e4a39e 767 fprintf_filtered (stream, "%.*s",
14f9c5c9
AS
768 ada_name_prefix_len (type_name), type_name);
769 return;
770 }
771
772 if (ada_is_aligner_type (type))
773 ada_print_type (ada_aligned_type (type), "", stream, show, level);
774 else if (ada_is_packed_array_type (type))
775 print_array_type (type, stream, show, level);
776 else
d2e4a39e
AS
777 switch (TYPE_CODE (type))
778 {
779 default:
780 fprintf_filtered (stream, "<");
781 c_print_type (type, "", stream, show, level);
782 fprintf_filtered (stream, ">");
783 break;
784 case TYPE_CODE_PTR:
785 fprintf_filtered (stream, "access ");
786 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
787 break;
788 case TYPE_CODE_REF:
789 fprintf_filtered (stream, "<ref> ");
790 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
791 break;
792 case TYPE_CODE_ARRAY:
14f9c5c9 793 print_array_type (type, stream, show, level);
d2e4a39e
AS
794 break;
795 case TYPE_CODE_INT:
796 if (ada_is_fixed_point_type (type))
797 print_fixed_point_type (type, stream);
798 else if (ada_is_vax_floating_type (type))
799 print_vax_floating_point_type (type, stream);
800 else
801 {
802 char *name = ada_type_name (type);
803 if (!ada_is_range_type_name (name))
804 fprintf_filtered (stream, "<%d-byte integer>",
805 TYPE_LENGTH (type));
806 else
807 {
808 fprintf_filtered (stream, "range ");
809 print_range_type_named (name, stream);
810 }
811 }
812 break;
813 case TYPE_CODE_RANGE:
814 if (ada_is_fixed_point_type (type))
815 print_fixed_point_type (type, stream);
816 else if (ada_is_vax_floating_type (type))
817 print_vax_floating_point_type (type, stream);
818 else if (ada_is_modular_type (type))
819 fprintf_filtered (stream, "mod %ld", (long) ada_modulus (type));
820 else
821 {
822 fprintf_filtered (stream, "range ");
823 print_range (type, stream);
824 }
825 break;
826 case TYPE_CODE_FLT:
827 fprintf_filtered (stream, "<%d-byte float>", TYPE_LENGTH (type));
828 break;
829 case TYPE_CODE_ENUM:
830 if (show < 0)
831 fprintf_filtered (stream, "(...)");
832 else
833 print_enum_type (type, stream);
834 break;
835 case TYPE_CODE_STRUCT:
836 if (ada_is_array_descriptor (type))
837 print_array_type (type, stream, show, level);
838 else if (ada_is_bogus_array_descriptor (type))
839 fprintf_filtered (stream,
840 "array (?) of ? (<mal-formed descriptor>)");
841 else
842 print_record_type (type, stream, show, level);
843 break;
844 case TYPE_CODE_UNION:
845 print_unchecked_union_type (type, stream, show, level);
846 break;
847 case TYPE_CODE_FUNC:
848 print_func_type (type, stream, varstring);
849 break;
850 }
14f9c5c9 851}
This page took 0.111075 seconds and 4 git commands to generate.