1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986-2013 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 #include "gdb_string.h"
38 static void m2_print_bounds (struct type
*type
,
39 struct ui_file
*stream
, int show
, int level
,
42 static void m2_typedef (struct type
*, struct ui_file
*, int, int,
43 const struct type_print_options
*);
44 static void m2_array (struct type
*, struct ui_file
*, int, int,
45 const struct type_print_options
*);
46 static void m2_pointer (struct type
*, struct ui_file
*, int, int,
47 const struct type_print_options
*);
48 static void m2_ref (struct type
*, struct ui_file
*, int, int,
49 const struct type_print_options
*);
50 static void m2_procedure (struct type
*, struct ui_file
*, int, int,
51 const struct type_print_options
*);
52 static void m2_union (struct type
*, struct ui_file
*);
53 static void m2_enum (struct type
*, struct ui_file
*, int, int);
54 static void m2_range (struct type
*, struct ui_file
*, int, int,
55 const struct type_print_options
*);
56 static void m2_type_name (struct type
*type
, struct ui_file
*stream
);
57 static void m2_short_set (struct type
*type
, struct ui_file
*stream
,
59 static int m2_long_set (struct type
*type
, struct ui_file
*stream
,
60 int show
, int level
, const struct type_print_options
*flags
);
61 static int m2_unbounded_array (struct type
*type
, struct ui_file
*stream
,
63 const struct type_print_options
*flags
);
64 static void m2_record_fields (struct type
*type
, struct ui_file
*stream
,
65 int show
, int level
, const struct type_print_options
*flags
);
66 static void m2_unknown (const char *s
, struct type
*type
,
67 struct ui_file
*stream
, int show
, int level
);
69 int m2_is_long_set (struct type
*type
);
70 int m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
);
71 int m2_is_unbounded_array (struct type
*type
);
75 m2_print_type (struct type
*type
, const char *varstring
,
76 struct ui_file
*stream
,
78 const struct type_print_options
*flags
)
87 fputs_filtered (_("<type unknown>"), stream
);
91 switch (TYPE_CODE (type
))
94 m2_short_set(type
, stream
, show
, level
);
97 case TYPE_CODE_STRUCT
:
98 if (m2_long_set (type
, stream
, show
, level
, flags
)
99 || m2_unbounded_array (type
, stream
, show
, level
, flags
))
101 m2_record_fields (type
, stream
, show
, level
, flags
);
104 case TYPE_CODE_TYPEDEF
:
105 m2_typedef (type
, stream
, show
, level
, flags
);
108 case TYPE_CODE_ARRAY
:
109 m2_array (type
, stream
, show
, level
, flags
);
113 m2_pointer (type
, stream
, show
, level
, flags
);
117 m2_ref (type
, stream
, show
, level
, flags
);
120 case TYPE_CODE_METHOD
:
121 m2_unknown (_("method"), type
, stream
, show
, level
);
125 m2_procedure (type
, stream
, show
, level
, flags
);
128 case TYPE_CODE_UNION
:
129 m2_union (type
, stream
);
133 m2_enum (type
, stream
, show
, level
);
139 case TYPE_CODE_UNDEF
:
140 /* i18n: Do not translate the "struct" part! */
141 m2_unknown (_("undef"), type
, stream
, show
, level
);
144 case TYPE_CODE_ERROR
:
145 m2_unknown (_("error"), type
, stream
, show
, level
);
148 case TYPE_CODE_RANGE
:
149 m2_range (type
, stream
, show
, level
, flags
);
153 m2_type_name (type
, stream
);
158 /* Print a typedef using M2 syntax. TYPE is the underlying type.
159 NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
163 m2_print_typedef (struct type
*type
, struct symbol
*new_symbol
,
164 struct ui_file
*stream
)
166 CHECK_TYPEDEF (type
);
167 fprintf_filtered (stream
, "TYPE ");
168 if (!TYPE_NAME (SYMBOL_TYPE (new_symbol
))
169 || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol
))),
170 SYMBOL_LINKAGE_NAME (new_symbol
)) != 0)
171 fprintf_filtered (stream
, "%s = ", SYMBOL_PRINT_NAME (new_symbol
));
173 fprintf_filtered (stream
, "<builtin> = ");
174 type_print (type
, "", stream
, 0);
175 fprintf_filtered (stream
, ";\n");
178 /* m2_type_name - if a, type, has a name then print it. */
181 m2_type_name (struct type
*type
, struct ui_file
*stream
)
183 if (TYPE_NAME (type
) != NULL
)
184 fputs_filtered (TYPE_NAME (type
), stream
);
187 /* m2_range - displays a Modula-2 subrange type. */
190 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
191 int level
, const struct type_print_options
*flags
)
193 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
194 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
,
198 struct type
*target
= TYPE_TARGET_TYPE (type
);
200 fprintf_filtered (stream
, "[");
201 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
202 fprintf_filtered (stream
, "..");
203 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
204 fprintf_filtered (stream
, "]");
209 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
210 int level
, const struct type_print_options
*flags
)
212 if (TYPE_NAME (type
) != NULL
)
214 fputs_filtered (TYPE_NAME (type
), stream
);
215 fputs_filtered (" = ", stream
);
217 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
220 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
222 static void m2_array (struct type
*type
, struct ui_file
*stream
,
223 int show
, int level
, const struct type_print_options
*flags
)
225 fprintf_filtered (stream
, "ARRAY [");
226 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
227 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type
))
229 if (TYPE_INDEX_TYPE (type
) != 0)
231 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
232 fprintf_filtered (stream
, "..");
233 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
236 fprintf_filtered (stream
, "%d",
238 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
240 fprintf_filtered (stream
, "] OF ");
241 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
245 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
246 int level
, const struct type_print_options
*flags
)
248 if (TYPE_CONST (type
))
249 fprintf_filtered (stream
, "[...] : ");
251 fprintf_filtered (stream
, "POINTER TO ");
253 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
257 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
258 int level
, const struct type_print_options
*flags
)
260 fprintf_filtered (stream
, "VAR");
261 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
265 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
268 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
271 static void m2_union (struct type
*type
, struct ui_file
*stream
)
273 fprintf_filtered (stream
, "union");
277 m2_procedure (struct type
*type
, struct ui_file
*stream
,
278 int show
, int level
, const struct type_print_options
*flags
)
280 fprintf_filtered (stream
, "PROCEDURE ");
281 m2_type_name (type
, stream
);
282 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
284 int i
, len
= TYPE_NFIELDS (type
);
286 fprintf_filtered (stream
, " (");
287 for (i
= 0; i
< len
; i
++)
291 fputs_filtered (", ", stream
);
294 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0, flags
);
296 if (TYPE_TARGET_TYPE (type
) != NULL
)
298 fprintf_filtered (stream
, " : ");
299 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0, flags
);
305 m2_print_bounds (struct type
*type
,
306 struct ui_file
*stream
, int show
, int level
,
309 struct type
*target
= TYPE_TARGET_TYPE (type
);
311 if (TYPE_NFIELDS(type
) == 0)
315 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
317 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
321 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
323 fprintf_filtered(stream
, "SET [");
324 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
327 fprintf_filtered(stream
, "..");
328 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
330 fprintf_filtered(stream
, "]");
334 m2_is_long_set (struct type
*type
)
336 LONGEST previous_high
= 0; /* Unnecessary initialization
337 keeps gcc -Wall happy. */
341 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
344 /* check if all fields of the RECORD are consecutive sets. */
346 len
= TYPE_NFIELDS (type
);
347 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
349 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
351 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
353 if (TYPE_FIELD_NAME (type
, i
) != NULL
354 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
356 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
357 if ((i
> TYPE_N_BASECLASSES (type
))
358 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
360 previous_high
= TYPE_HIGH_BOUND (range
);
367 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
368 understands that CHARs might be signed.
369 This should be integrated into gdbtypes.c
370 inside get_discrete_bounds. */
373 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
375 CHECK_TYPEDEF (type
);
376 switch (TYPE_CODE (type
))
379 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
381 if (!TYPE_UNSIGNED (type
))
383 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
390 return get_discrete_bounds (type
, lowp
, highp
);
394 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
395 SET OF <oftype> of_type is assigned to the
399 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
407 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
409 len
= TYPE_NFIELDS (type
);
410 i
= TYPE_N_BASECLASSES (type
);
413 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
414 target
= TYPE_TARGET_TYPE (range
);
416 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
417 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
419 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
420 return (l1
== l2
&& h1
== h2
);
421 error (_("long_set failed to find discrete bounds for its subtype"));
424 error (_("expecting long_set"));
429 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
,
430 const struct type_print_options
*flags
)
432 struct type
*of_type
;
434 int len
= TYPE_NFIELDS (type
);
438 if (m2_is_long_set (type
))
440 if (TYPE_TAG_NAME (type
) != NULL
)
442 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
446 else if (TYPE_NAME (type
) != NULL
)
448 fputs_filtered (TYPE_NAME (type
), stream
);
453 if (TYPE_TAG_NAME (type
) != NULL
|| TYPE_NAME (type
) != NULL
)
454 fputs_filtered (" = ", stream
);
456 if (get_long_set_bounds (type
, &low
, &high
))
458 fprintf_filtered(stream
, "SET OF ");
459 i
= TYPE_N_BASECLASSES (type
);
460 if (m2_is_long_set_of_type (type
, &of_type
))
461 m2_print_type (of_type
, "", stream
, show
- 1, level
, flags
);
464 fprintf_filtered(stream
, "[");
465 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)),
466 stream
, show
- 1, level
, 0);
468 fprintf_filtered(stream
, "..");
470 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)),
471 stream
, show
- 1, level
, 1);
472 fprintf_filtered(stream
, "]");
476 /* i18n: Do not translate the "SET OF" part! */
477 fprintf_filtered(stream
, _("SET OF <unknown>"));
484 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
485 as a Modula-2 unbounded ARRAY type. */
488 m2_is_unbounded_array (struct type
*type
)
490 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
493 * check if we have a structure with exactly two fields named
494 * _m2_contents and _m2_high. It also checks to see if the
495 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
496 * of the pointer determines the unbounded ARRAY OF type.
498 if (TYPE_NFIELDS (type
) != 2)
500 if (strcmp (TYPE_FIELD_NAME (type
, 0), "_m2_contents") != 0)
502 if (strcmp (TYPE_FIELD_NAME (type
, 1), "_m2_high") != 0)
504 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, 0)) != TYPE_CODE_PTR
)
511 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
512 parameter type then display the type as an
513 ARRAY OF type. Returns TRUE if an unbounded
514 array type was detected. */
517 m2_unbounded_array (struct type
*type
, struct ui_file
*stream
, int show
,
518 int level
, const struct type_print_options
*flags
)
520 if (m2_is_unbounded_array (type
))
524 fputs_filtered ("ARRAY OF ", stream
);
525 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, 0)),
526 "", stream
, 0, level
, flags
);
534 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
535 int level
, const struct type_print_options
*flags
)
537 /* Print the tag if it exists. */
538 if (TYPE_TAG_NAME (type
) != NULL
)
540 if (strncmp (TYPE_TAG_NAME (type
), "$$", 2) != 0)
542 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
544 fprintf_filtered (stream
, " = ");
550 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
551 fprintf_filtered (stream
, "RECORD ... END ");
552 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
553 fprintf_filtered (stream
, "CASE ... END ");
558 int len
= TYPE_NFIELDS (type
);
560 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
561 fprintf_filtered (stream
, "RECORD\n");
562 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
563 /* i18n: Do not translate "CASE" and "OF". */
564 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
566 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
570 print_spaces_filtered (level
+ 4, stream
);
571 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
572 fputs_filtered (" : ", stream
);
573 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
575 stream
, 0, level
+ 4, flags
);
576 if (TYPE_FIELD_PACKED (type
, i
))
578 /* It is a bitfield. This code does not attempt
579 to look at the bitpos and reconstruct filler,
580 unnamed fields. This would lead to misleading
581 results if the compiler does not put out fields
582 for such things (I don't know what it does). */
583 fprintf_filtered (stream
, " : %d",
584 TYPE_FIELD_BITSIZE (type
, i
));
586 fprintf_filtered (stream
, ";\n");
589 fprintfi_filtered (level
, stream
, "END ");
594 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
601 /* If we just printed a tag name, no need to print anything else. */
602 if (TYPE_TAG_NAME (type
) == NULL
)
603 fprintf_filtered (stream
, "(...)");
605 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
607 fprintf_filtered (stream
, "(");
608 len
= TYPE_NFIELDS (type
);
610 for (i
= 0; i
< len
; i
++)
614 fprintf_filtered (stream
, ", ");
616 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
617 if (lastval
!= TYPE_FIELD_ENUMVAL (type
, i
))
619 fprintf_filtered (stream
, " = %s",
620 plongest (TYPE_FIELD_ENUMVAL (type
, i
)));
621 lastval
= TYPE_FIELD_ENUMVAL (type
, i
);
625 fprintf_filtered (stream
, ")");