1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986-2014 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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/>. */
20 #include "gdb_obstack.h"
21 #include "bfd.h" /* Binary File Description */
24 #include "expression.h"
32 #include "typeprint.h"
35 static void m2_print_bounds (struct type *type,
36 struct ui_file *stream, int show, int level,
39 static void m2_typedef (struct type *, struct ui_file *, int, int,
40 const struct type_print_options *);
41 static void m2_array (struct type *, struct ui_file *, int, int,
42 const struct type_print_options *);
43 static void m2_pointer (struct type *, struct ui_file *, int, int,
44 const struct type_print_options *);
45 static void m2_ref (struct type *, struct ui_file *, int, int,
46 const struct type_print_options *);
47 static void m2_procedure (struct type *, struct ui_file *, int, int,
48 const struct type_print_options *);
49 static void m2_union (struct type *, struct ui_file *);
50 static void m2_enum (struct type *, struct ui_file *, int, int);
51 static void m2_range (struct type *, struct ui_file *, int, int,
52 const struct type_print_options *);
53 static void m2_type_name (struct type *type, struct ui_file *stream);
54 static void m2_short_set (struct type *type, struct ui_file *stream,
56 static int m2_long_set (struct type *type, struct ui_file *stream,
57 int show, int level, const struct type_print_options *flags);
58 static int m2_unbounded_array (struct type *type, struct ui_file *stream,
60 const struct type_print_options *flags);
61 static void m2_record_fields (struct type *type, struct ui_file *stream,
62 int show, int level, const struct type_print_options *flags);
63 static void m2_unknown (const char *s, struct type *type,
64 struct ui_file *stream, int show, int level);
66 int m2_is_long_set (struct type *type);
67 int m2_is_long_set_of_type (struct type *type, struct type **of_type);
68 int m2_is_unbounded_array (struct type *type);
72 m2_print_type (struct type *type, const char *varstring,
73 struct ui_file *stream,
75 const struct type_print_options *flags)
84 fputs_filtered (_("<type unknown>"), stream);
88 switch (TYPE_CODE (type))
91 m2_short_set(type, stream, show, level);
94 case TYPE_CODE_STRUCT:
95 if (m2_long_set (type, stream, show, level, flags)
96 || m2_unbounded_array (type, stream, show, level, flags))
98 m2_record_fields (type, stream, show, level, flags);
101 case TYPE_CODE_TYPEDEF:
102 m2_typedef (type, stream, show, level, flags);
105 case TYPE_CODE_ARRAY:
106 m2_array (type, stream, show, level, flags);
110 m2_pointer (type, stream, show, level, flags);
114 m2_ref (type, stream, show, level, flags);
117 case TYPE_CODE_METHOD:
118 m2_unknown (_("method"), type, stream, show, level);
122 m2_procedure (type, stream, show, level, flags);
125 case TYPE_CODE_UNION:
126 m2_union (type, stream);
130 m2_enum (type, stream, show, level);
136 case TYPE_CODE_UNDEF:
137 /* i18n: Do not translate the "struct" part! */
138 m2_unknown (_("undef"), type, stream, show, level);
141 case TYPE_CODE_ERROR:
142 m2_unknown (_("error"), type, stream, show, level);
145 case TYPE_CODE_RANGE:
146 m2_range (type, stream, show, level, flags);
150 m2_type_name (type, stream);
155 /* Print a typedef using M2 syntax. TYPE is the underlying type.
156 NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
160 m2_print_typedef (struct type *type, struct symbol *new_symbol,
161 struct ui_file *stream)
163 CHECK_TYPEDEF (type);
164 fprintf_filtered (stream, "TYPE ");
165 if (!TYPE_NAME (SYMBOL_TYPE (new_symbol))
166 || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))),
167 SYMBOL_LINKAGE_NAME (new_symbol)) != 0)
168 fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol));
170 fprintf_filtered (stream, "<builtin> = ");
171 type_print (type, "", stream, 0);
172 fprintf_filtered (stream, ";\n");
175 /* m2_type_name - if a, type, has a name then print it. */
178 m2_type_name (struct type *type, struct ui_file *stream)
180 if (TYPE_NAME (type) != NULL)
181 fputs_filtered (TYPE_NAME (type), stream);
184 /* m2_range - displays a Modula-2 subrange type. */
187 m2_range (struct type *type, struct ui_file *stream, int show,
188 int level, const struct type_print_options *flags)
190 if (TYPE_HIGH_BOUND (type) == TYPE_LOW_BOUND (type))
191 m2_print_type (TYPE_DOMAIN_TYPE (type), "", stream, show, level,
195 struct type *target = TYPE_TARGET_TYPE (type);
197 fprintf_filtered (stream, "[");
198 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
199 fprintf_filtered (stream, "..");
200 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
201 fprintf_filtered (stream, "]");
206 m2_typedef (struct type *type, struct ui_file *stream, int show,
207 int level, const struct type_print_options *flags)
209 if (TYPE_NAME (type) != NULL)
211 fputs_filtered (TYPE_NAME (type), stream);
212 fputs_filtered (" = ", stream);
214 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
217 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
219 static void m2_array (struct type *type, struct ui_file *stream,
220 int show, int level, const struct type_print_options *flags)
222 fprintf_filtered (stream, "ARRAY [");
223 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
224 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
226 if (TYPE_INDEX_TYPE (type) != 0)
228 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 0);
229 fprintf_filtered (stream, "..");
230 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
233 fprintf_filtered (stream, "%d",
235 / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
237 fprintf_filtered (stream, "] OF ");
238 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
242 m2_pointer (struct type *type, struct ui_file *stream, int show,
243 int level, const struct type_print_options *flags)
245 if (TYPE_CONST (type))
246 fprintf_filtered (stream, "[...] : ");
248 fprintf_filtered (stream, "POINTER TO ");
250 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
254 m2_ref (struct type *type, struct ui_file *stream, int show,
255 int level, const struct type_print_options *flags)
257 fprintf_filtered (stream, "VAR");
258 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level, flags);
262 m2_unknown (const char *s, struct type *type, struct ui_file *stream,
265 fprintf_filtered (stream, "%s %s", s, _("is unknown"));
268 static void m2_union (struct type *type, struct ui_file *stream)
270 fprintf_filtered (stream, "union");
274 m2_procedure (struct type *type, struct ui_file *stream,
275 int show, int level, const struct type_print_options *flags)
277 fprintf_filtered (stream, "PROCEDURE ");
278 m2_type_name (type, stream);
279 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
281 int i, len = TYPE_NFIELDS (type);
283 fprintf_filtered (stream, " (");
284 for (i = 0; i < len; i++)
288 fputs_filtered (", ", stream);
291 m2_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0, flags);
293 if (TYPE_TARGET_TYPE (type) != NULL)
295 fprintf_filtered (stream, " : ");
296 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0, flags);
302 m2_print_bounds (struct type *type,
303 struct ui_file *stream, int show, int level,
306 struct type *target = TYPE_TARGET_TYPE (type);
308 if (TYPE_NFIELDS(type) == 0)
312 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
314 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
318 m2_short_set (struct type *type, struct ui_file *stream, int show, int level)
320 fprintf_filtered(stream, "SET [");
321 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
324 fprintf_filtered(stream, "..");
325 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
327 fprintf_filtered(stream, "]");
331 m2_is_long_set (struct type *type)
333 LONGEST previous_high = 0; /* Unnecessary initialization
334 keeps gcc -Wall happy. */
338 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
341 /* check if all fields of the RECORD are consecutive sets. */
343 len = TYPE_NFIELDS (type);
344 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
346 if (TYPE_FIELD_TYPE (type, i) == NULL)
348 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) != TYPE_CODE_SET)
350 if (TYPE_FIELD_NAME (type, i) != NULL
351 && (strcmp (TYPE_FIELD_NAME (type, i), "") != 0))
353 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
354 if ((i > TYPE_N_BASECLASSES (type))
355 && previous_high + 1 != TYPE_LOW_BOUND (range))
357 previous_high = TYPE_HIGH_BOUND (range);
364 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
365 understands that CHARs might be signed.
366 This should be integrated into gdbtypes.c
367 inside get_discrete_bounds. */
370 m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
372 CHECK_TYPEDEF (type);
373 switch (TYPE_CODE (type))
376 if (TYPE_LENGTH (type) < sizeof (LONGEST))
378 if (!TYPE_UNSIGNED (type))
380 *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
387 return get_discrete_bounds (type, lowp, highp);
391 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
392 SET OF <oftype> of_type is assigned to the
396 m2_is_long_set_of_type (struct type *type, struct type **of_type)
404 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
406 len = TYPE_NFIELDS (type);
407 i = TYPE_N_BASECLASSES (type);
410 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
411 target = TYPE_TARGET_TYPE (range);
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)));
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"));
421 error (_("expecting long_set"));
426 m2_long_set (struct type *type, struct ui_file *stream, int show, int level,
427 const struct type_print_options *flags)
429 struct type *of_type;
431 int len = TYPE_NFIELDS (type);
435 if (m2_is_long_set (type))
437 if (TYPE_TAG_NAME (type) != NULL)
439 fputs_filtered (TYPE_TAG_NAME (type), stream);
443 else if (TYPE_NAME (type) != NULL)
445 fputs_filtered (TYPE_NAME (type), stream);
450 if (TYPE_TAG_NAME (type) != NULL || TYPE_NAME (type) != NULL)
451 fputs_filtered (" = ", stream);
453 if (get_long_set_bounds (type, &low, &high))
455 fprintf_filtered(stream, "SET OF ");
456 i = TYPE_N_BASECLASSES (type);
457 if (m2_is_long_set_of_type (type, &of_type))
458 m2_print_type (of_type, "", stream, show - 1, level, flags);
461 fprintf_filtered(stream, "[");
462 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)),
463 stream, show - 1, level, 0);
465 fprintf_filtered(stream, "..");
467 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)),
468 stream, show - 1, level, 1);
469 fprintf_filtered(stream, "]");
473 /* i18n: Do not translate the "SET OF" part! */
474 fprintf_filtered(stream, _("SET OF <unknown>"));
481 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
482 as a Modula-2 unbounded ARRAY type. */
485 m2_is_unbounded_array (struct type *type)
487 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
490 * check if we have a structure with exactly two fields named
491 * _m2_contents and _m2_high. It also checks to see if the
492 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
493 * of the pointer determines the unbounded ARRAY OF type.
495 if (TYPE_NFIELDS (type) != 2)
497 if (strcmp (TYPE_FIELD_NAME (type, 0), "_m2_contents") != 0)
499 if (strcmp (TYPE_FIELD_NAME (type, 1), "_m2_high") != 0)
501 if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) != TYPE_CODE_PTR)
508 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
509 parameter type then display the type as an
510 ARRAY OF type. Returns TRUE if an unbounded
511 array type was detected. */
514 m2_unbounded_array (struct type *type, struct ui_file *stream, int show,
515 int level, const struct type_print_options *flags)
517 if (m2_is_unbounded_array (type))
521 fputs_filtered ("ARRAY OF ", stream);
522 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
523 "", stream, 0, level, flags);
531 m2_record_fields (struct type *type, struct ui_file *stream, int show,
532 int level, const struct type_print_options *flags)
534 /* Print the tag if it exists. */
535 if (TYPE_TAG_NAME (type) != NULL)
537 if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0)
539 fputs_filtered (TYPE_TAG_NAME (type), stream);
541 fprintf_filtered (stream, " = ");
547 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
548 fprintf_filtered (stream, "RECORD ... END ");
549 else if (TYPE_CODE (type) == TYPE_CODE_UNION)
550 fprintf_filtered (stream, "CASE ... END ");
555 int len = TYPE_NFIELDS (type);
557 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
558 fprintf_filtered (stream, "RECORD\n");
559 else if (TYPE_CODE (type) == TYPE_CODE_UNION)
560 /* i18n: Do not translate "CASE" and "OF". */
561 fprintf_filtered (stream, _("CASE <variant> OF\n"));
563 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
567 print_spaces_filtered (level + 4, stream);
568 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
569 fputs_filtered (" : ", stream);
570 m2_print_type (TYPE_FIELD_TYPE (type, i),
572 stream, 0, level + 4, flags);
573 if (TYPE_FIELD_PACKED (type, i))
575 /* It is a bitfield. This code does not attempt
576 to look at the bitpos and reconstruct filler,
577 unnamed fields. This would lead to misleading
578 results if the compiler does not put out fields
579 for such things (I don't know what it does). */
580 fprintf_filtered (stream, " : %d",
581 TYPE_FIELD_BITSIZE (type, i));
583 fprintf_filtered (stream, ";\n");
586 fprintfi_filtered (level, stream, "END ");
591 m2_enum (struct type *type, struct ui_file *stream, int show, int level)
598 /* If we just printed a tag name, no need to print anything else. */
599 if (TYPE_TAG_NAME (type) == NULL)
600 fprintf_filtered (stream, "(...)");
602 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
604 fprintf_filtered (stream, "(");
605 len = TYPE_NFIELDS (type);
607 for (i = 0; i < len; i++)
611 fprintf_filtered (stream, ", ");
613 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
614 if (lastval != TYPE_FIELD_ENUMVAL (type, i))
616 fprintf_filtered (stream, " = %s",
617 plongest (TYPE_FIELD_ENUMVAL (type, i)));
618 lastval = TYPE_FIELD_ENUMVAL (type, i);
622 fprintf_filtered (stream, ")");