Sync usage with man page.
[netbsd-mini2440.git] / gnu / dist / gdb6 / gdb / m2-typeprint.c
blobe057b65ce3c7b075e6598a83cf25ad4ef011769e
1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
23 #include "defs.h"
24 #include "gdb_obstack.h"
25 #include "bfd.h" /* Binary File Description */
26 #include "symtab.h"
27 #include "gdbtypes.h"
28 #include "expression.h"
29 #include "value.h"
30 #include "gdbcore.h"
31 #include "m2-lang.h"
32 #include "target.h"
33 #include "language.h"
34 #include "demangle.h"
35 #include "c-lang.h"
36 #include "typeprint.h"
37 #include "cp-abi.h"
39 #include "gdb_string.h"
40 #include <errno.h>
42 static void m2_print_bounds (struct type *type,
43 struct ui_file *stream, int show, int level,
44 int print_high);
46 static void m2_typedef (struct type *, struct ui_file *, int, int);
47 static void m2_array (struct type *, struct ui_file *, int, int);
48 static void m2_pointer (struct type *, struct ui_file *, int, int);
49 static void m2_ref (struct type *, struct ui_file *, int, int);
50 static void m2_procedure (struct type *, struct ui_file *, int, int);
51 static void m2_union (struct type *, struct ui_file *);
52 static void m2_enum (struct type *, struct ui_file *, int, int);
53 static void m2_range (struct type *, struct ui_file *, int, int);
54 static void m2_type_name (struct type *type, struct ui_file *stream);
55 static void m2_short_set (struct type *type, struct ui_file *stream,
56 int show, int level);
57 static int m2_long_set (struct type *type, struct ui_file *stream,
58 int show, int level);
59 static void m2_record_fields (struct type *type, struct ui_file *stream,
60 int show, int level);
61 static void m2_unknown (const char *s, struct type *type,
62 struct ui_file *stream, int show, int level);
64 int m2_is_long_set (struct type *type);
65 int m2_is_long_set_of_type (struct type *type, struct type **of_type);
68 void
69 m2_print_type (struct type *type, char *varstring, struct ui_file *stream,
70 int show, int level)
72 enum type_code code;
73 int demangled_args;
75 CHECK_TYPEDEF (type);
76 code = TYPE_CODE (type);
78 QUIT;
80 wrap_here (" ");
81 if (type == NULL)
83 fputs_filtered (_("<type unknown>"), stream);
84 return;
87 switch (TYPE_CODE (type))
89 case TYPE_CODE_SET:
90 m2_short_set(type, stream, show, level);
91 break;
93 case TYPE_CODE_STRUCT:
94 if (m2_long_set (type, stream, show, level))
95 break;
96 m2_record_fields (type, stream, show, level);
97 break;
99 case TYPE_CODE_TYPEDEF:
100 m2_typedef (type, stream, show, level);
101 break;
103 case TYPE_CODE_ARRAY:
104 m2_array (type, stream, show, level);
105 break;
107 case TYPE_CODE_PTR:
108 m2_pointer (type, stream, show, level);
109 break;
111 case TYPE_CODE_REF:
112 m2_ref (type, stream, show, level);
113 break;
115 case TYPE_CODE_MEMBER:
116 m2_unknown (_("member"), type, stream, show, level);
117 break;
119 case TYPE_CODE_METHOD:
120 m2_unknown (_("method"), type, stream, show, level);
121 break;
123 case TYPE_CODE_FUNC:
124 m2_procedure (type, stream, show, level);
125 break;
127 case TYPE_CODE_UNION:
128 m2_union (type, stream);
129 break;
131 case TYPE_CODE_ENUM:
132 m2_enum (type, stream, show, level);
133 break;
135 case TYPE_CODE_VOID:
136 break;
138 case TYPE_CODE_UNDEF:
139 /* i18n: Do not translate the "struct" part! */
140 m2_unknown (_("undef"), type, stream, show, level);
141 break;
143 case TYPE_CODE_ERROR:
144 m2_unknown (_("error"), type, stream, show, level);
145 break;
147 case TYPE_CODE_RANGE:
148 m2_range (type, stream, show, level);
149 break;
151 case TYPE_CODE_TEMPLATE:
152 break;
154 default:
155 m2_type_name (type, stream);
156 break;
161 * m2_type_name - if a, type, has a name then print it.
164 void
165 m2_type_name (struct type *type, struct ui_file *stream)
167 if (TYPE_NAME (type) != NULL)
168 fputs_filtered (TYPE_NAME (type), stream);
172 * m2_range - displays a Modula-2 subrange type.
175 void
176 m2_range (struct type *type, struct ui_file *stream, int show,
177 int level)
179 if (TYPE_HIGH_BOUND (type) == TYPE_LOW_BOUND (type))
180 m2_print_type (TYPE_DOMAIN_TYPE (type), "", stream, show, level);
181 else
183 struct type *target = TYPE_TARGET_TYPE (type);
185 fprintf_filtered (stream, "[");
186 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
187 fprintf_filtered (stream, "..");
188 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
189 fprintf_filtered (stream, "]");
193 static void
194 m2_typedef (struct type *type, struct ui_file *stream, int show,
195 int level)
197 if (TYPE_NAME (type) != NULL)
199 fputs_filtered (TYPE_NAME (type), stream);
200 fputs_filtered (" = ", stream);
202 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
206 * m2_array - prints out a Modula-2 ARRAY ... OF type
209 static void m2_array (struct type *type, struct ui_file *stream,
210 int show, int level)
212 fprintf_filtered (stream, "ARRAY [");
213 if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
214 && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED)
216 if (TYPE_INDEX_TYPE (type) != 0)
218 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 0);
219 fprintf_filtered (stream, "..");
220 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
222 else
223 fprintf_filtered (stream, "%d",
224 (TYPE_LENGTH (type)
225 / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
227 fprintf_filtered (stream, "] OF ");
228 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
231 static void
232 m2_pointer (struct type *type, struct ui_file *stream, int show,
233 int level)
235 if (TYPE_CONST (type))
236 fprintf_filtered (stream, "[...] : ");
237 else
238 fprintf_filtered (stream, "POINTER TO ");
240 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
243 static void
244 m2_ref (struct type *type, struct ui_file *stream, int show,
245 int level)
247 fprintf_filtered (stream, "VAR");
248 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
251 static void
252 m2_unknown (const char *s, struct type *type, struct ui_file *stream,
253 int show, int level)
255 fprintf_filtered (stream, "%s %s", s, _("is unknown"));
258 static void m2_union (struct type *type, struct ui_file *stream)
260 fprintf_filtered (stream, "union");
263 static void
264 m2_procedure (struct type *type, struct ui_file *stream,
265 int show, int level)
267 fprintf_filtered (stream, "PROCEDURE ");
268 m2_type_name (type, stream);
269 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
271 int i, len = TYPE_NFIELDS (type);
273 fprintf_filtered (stream, " (");
274 for (i = 0; i < len; i++)
276 if (i > 0)
278 fputs_filtered (", ", stream);
279 wrap_here (" ");
281 m2_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
283 if (TYPE_TARGET_TYPE (type) != NULL)
285 fprintf_filtered (stream, " : ");
286 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
291 static void
292 m2_print_bounds (struct type *type,
293 struct ui_file *stream, int show, int level,
294 int print_high)
296 struct type *target = TYPE_TARGET_TYPE (type);
298 if (target == NULL)
299 target = builtin_type_int;
301 if (TYPE_NFIELDS(type) == 0)
302 return;
304 if (print_high)
305 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
306 else
307 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
310 static void
311 m2_short_set (struct type *type, struct ui_file *stream, int show, int level)
313 fprintf_filtered(stream, "SET [");
314 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
315 show - 1, level, 0);
317 fprintf_filtered(stream, "..");
318 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
319 show - 1, level, 1);
320 fprintf_filtered(stream, "]");
324 m2_is_long_set (struct type *type)
326 LONGEST previous_high = 0; /* unnecessary initialization
327 keeps gcc -Wall happy */
328 int len, i;
329 struct type *range;
331 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
335 * check if all fields of the RECORD are consecutive sets
337 len = TYPE_NFIELDS (type);
338 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
340 if (TYPE_FIELD_TYPE (type, i) == NULL)
341 return 0;
342 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) != TYPE_CODE_SET)
343 return 0;
344 if (TYPE_FIELD_NAME (type, i) != NULL
345 && (strcmp (TYPE_FIELD_NAME (type, i), "") != 0))
346 return 0;
347 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
348 if ((i > TYPE_N_BASECLASSES (type))
349 && previous_high + 1 != TYPE_LOW_BOUND (range))
350 return 0;
351 previous_high = TYPE_HIGH_BOUND (range);
353 return len>0;
355 return 0;
359 * m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
360 * understands that CHARs might be signed.
361 * This should be integrated into gdbtypes.c
362 * inside get_discrete_bounds.
366 m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
368 CHECK_TYPEDEF (type);
369 switch (TYPE_CODE (type))
371 case TYPE_CODE_CHAR:
372 if (TYPE_LENGTH (type) < sizeof (LONGEST))
374 if (!TYPE_UNSIGNED (type))
376 *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
377 *highp = -*lowp - 1;
378 return 0;
381 /* fall through */
382 default:
383 return get_discrete_bounds (type, lowp, highp);
388 * m2_is_long_set_of_type - returns TRUE if the long set was declared as
389 * SET OF <oftype> of_type is assigned to the
390 * subtype.
394 m2_is_long_set_of_type (struct type *type, struct type **of_type)
396 int len, i;
397 struct type *range;
398 struct type *target;
399 LONGEST l1, l2;
400 LONGEST h1, h2;
402 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
404 len = TYPE_NFIELDS (type);
405 i = TYPE_N_BASECLASSES (type);
406 if (len == 0)
407 return 0;
408 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
409 target = TYPE_TARGET_TYPE (range);
410 if (target == NULL)
411 target = builtin_type_int;
413 l1 = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
414 h1 = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)));
415 *of_type = target;
416 if (m2_get_discrete_bounds (target, &l2, &h2) >= 0)
417 return (l1 == l2 && h1 == h2);
418 error (_("long_set failed to find discrete bounds for its subtype"));
419 return 0;
421 error (_("expecting long_set"));
422 return 0;
425 static int
426 m2_long_set (struct type *type, struct ui_file *stream, int show, int level)
428 struct type *index_type;
429 struct type *range_type;
430 struct type *of_type;
431 int i;
432 int len = TYPE_NFIELDS (type);
433 LONGEST low;
434 LONGEST high;
436 if (m2_is_long_set (type))
438 if (TYPE_TAG_NAME (type) != NULL)
440 fputs_filtered (TYPE_TAG_NAME (type), stream);
441 if (show == 0)
442 return 1;
444 else if (TYPE_NAME (type) != NULL)
446 fputs_filtered (TYPE_NAME (type), stream);
447 if (show == 0)
448 return 1;
451 if (TYPE_TAG_NAME (type) != NULL || TYPE_NAME (type) != NULL)
452 fputs_filtered (" = ", stream);
454 if (get_long_set_bounds (type, &low, &high))
456 fprintf_filtered(stream, "SET OF ");
457 i = TYPE_N_BASECLASSES (type);
458 if (m2_is_long_set_of_type (type, &of_type))
459 m2_print_type (of_type, "", stream, show - 1, level);
460 else
462 fprintf_filtered(stream, "[");
463 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)),
464 stream, show - 1, level, 0);
466 fprintf_filtered(stream, "..");
468 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)),
469 stream, show - 1, level, 1);
470 fprintf_filtered(stream, "]");
473 else
474 /* i18n: Do not translate the "SET OF" part! */
475 fprintf_filtered(stream, _("SET OF <unknown>"));
477 return 1;
479 return 0;
482 void
483 m2_record_fields (struct type *type, struct ui_file *stream, int show,
484 int level)
486 /* Print the tag if it exists.
488 if (TYPE_TAG_NAME (type) != NULL)
490 if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0)
492 fputs_filtered (TYPE_TAG_NAME (type), stream);
493 if (show > 0)
494 fprintf_filtered (stream, " = ");
497 wrap_here (" ");
498 if (show < 0)
500 if (TYPE_CODE (type) == DECLARED_TYPE_STRUCT)
501 fprintf_filtered (stream, "RECORD ... END ");
502 else if (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION)
503 fprintf_filtered (stream, "CASE ... END ");
505 else if (show > 0)
507 int i;
508 int len = TYPE_NFIELDS (type);
510 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
511 fprintf_filtered (stream, "RECORD\n");
512 else if (TYPE_CODE (type) == TYPE_CODE_UNION)
513 /* i18n: Do not translate "CASE" and "OF" */
514 fprintf_filtered (stream, _("CASE <variant> OF\n"));
516 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
518 QUIT;
520 print_spaces_filtered (level + 4, stream);
521 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
522 fputs_filtered (" : ", stream);
523 m2_print_type (TYPE_FIELD_TYPE (type, i),
525 stream, 0, level + 4);
526 if (TYPE_FIELD_PACKED (type, i))
528 /* It is a bitfield. This code does not attempt
529 to look at the bitpos and reconstruct filler,
530 unnamed fields. This would lead to misleading
531 results if the compiler does not put out fields
532 for such things (I don't know what it does). */
533 fprintf_filtered (stream, " : %d",
534 TYPE_FIELD_BITSIZE (type, i));
536 fprintf_filtered (stream, ";\n");
539 fprintfi_filtered (level, stream, "END ");
543 void
544 m2_enum (struct type *type, struct ui_file *stream, int show, int level)
546 int lastval, i, len;
548 if (show < 0)
550 /* If we just printed a tag name, no need to print anything else. */
551 if (TYPE_TAG_NAME (type) == NULL)
552 fprintf_filtered (stream, "(...)");
554 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
556 fprintf_filtered (stream, "(");
557 len = TYPE_NFIELDS (type);
558 lastval = 0;
559 for (i = 0; i < len; i++)
561 QUIT;
562 if (i > 0)
563 fprintf_filtered (stream, ", ");
564 wrap_here (" ");
565 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
566 if (lastval != TYPE_FIELD_BITPOS (type, i))
568 fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
569 lastval = TYPE_FIELD_BITPOS (type, i);
571 lastval++;
573 fprintf_filtered (stream, ")");