1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986-2018 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
)
77 type
= check_typedef (type
);
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 type
= 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
))
192 /* FIXME: TYPE_TARGET_TYPE used to be TYPE_DOMAIN_TYPE but that was
193 wrong. Not sure if TYPE_TARGET_TYPE is correct though. */
194 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
,
199 struct type
*target
= TYPE_TARGET_TYPE (type
);
201 fprintf_filtered (stream
, "[");
202 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
203 fprintf_filtered (stream
, "..");
204 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
205 fprintf_filtered (stream
, "]");
210 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
211 int level
, const struct type_print_options
*flags
)
213 if (TYPE_NAME (type
) != NULL
)
215 fputs_filtered (TYPE_NAME (type
), stream
);
216 fputs_filtered (" = ", stream
);
218 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
221 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
223 static void m2_array (struct type
*type
, struct ui_file
*stream
,
224 int show
, int level
, const struct type_print_options
*flags
)
226 fprintf_filtered (stream
, "ARRAY [");
227 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
228 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type
))
230 if (TYPE_INDEX_TYPE (type
) != 0)
232 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
233 fprintf_filtered (stream
, "..");
234 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
237 fprintf_filtered (stream
, "%d",
239 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
241 fprintf_filtered (stream
, "] OF ");
242 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
246 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
247 int level
, const struct type_print_options
*flags
)
249 if (TYPE_CONST (type
))
250 fprintf_filtered (stream
, "[...] : ");
252 fprintf_filtered (stream
, "POINTER TO ");
254 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
258 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
259 int level
, const struct type_print_options
*flags
)
261 fprintf_filtered (stream
, "VAR");
262 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
266 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
269 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
272 static void m2_union (struct type
*type
, struct ui_file
*stream
)
274 fprintf_filtered (stream
, "union");
278 m2_procedure (struct type
*type
, struct ui_file
*stream
,
279 int show
, int level
, const struct type_print_options
*flags
)
281 fprintf_filtered (stream
, "PROCEDURE ");
282 m2_type_name (type
, stream
);
283 if (TYPE_TARGET_TYPE (type
) == NULL
284 || TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
286 int i
, len
= TYPE_NFIELDS (type
);
288 fprintf_filtered (stream
, " (");
289 for (i
= 0; i
< len
; i
++)
293 fputs_filtered (", ", stream
);
296 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0, flags
);
298 fprintf_filtered (stream
, ") : ");
299 if (TYPE_TARGET_TYPE (type
) != NULL
)
300 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0, flags
);
302 type_print_unknown_return_type (stream
);
307 m2_print_bounds (struct type
*type
,
308 struct ui_file
*stream
, int show
, int level
,
311 struct type
*target
= TYPE_TARGET_TYPE (type
);
313 if (TYPE_NFIELDS(type
) == 0)
317 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
319 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
323 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
325 fprintf_filtered(stream
, "SET [");
326 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
329 fprintf_filtered(stream
, "..");
330 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
332 fprintf_filtered(stream
, "]");
336 m2_is_long_set (struct type
*type
)
338 LONGEST previous_high
= 0; /* Unnecessary initialization
339 keeps gcc -Wall happy. */
343 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
346 /* check if all fields of the RECORD are consecutive sets. */
348 len
= TYPE_NFIELDS (type
);
349 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
351 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
353 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
355 if (TYPE_FIELD_NAME (type
, i
) != NULL
356 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
358 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
359 if ((i
> TYPE_N_BASECLASSES (type
))
360 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
362 previous_high
= TYPE_HIGH_BOUND (range
);
369 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
370 understands that CHARs might be signed.
371 This should be integrated into gdbtypes.c
372 inside get_discrete_bounds. */
375 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
377 type
= check_typedef (type
);
378 switch (TYPE_CODE (type
))
381 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
383 if (!TYPE_UNSIGNED (type
))
385 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
392 return get_discrete_bounds (type
, lowp
, highp
);
396 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
397 SET OF <oftype> of_type is assigned to the
401 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
409 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
411 len
= TYPE_NFIELDS (type
);
412 i
= TYPE_N_BASECLASSES (type
);
415 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
416 target
= TYPE_TARGET_TYPE (range
);
418 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
419 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
421 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
422 return (l1
== l2
&& h1
== h2
);
423 error (_("long_set failed to find discrete bounds for its subtype"));
426 error (_("expecting long_set"));
431 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
,
432 const struct type_print_options
*flags
)
434 struct type
*of_type
;
436 int len
= TYPE_NFIELDS (type
);
440 if (m2_is_long_set (type
))
442 if (TYPE_TAG_NAME (type
) != NULL
)
444 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
448 else if (TYPE_NAME (type
) != NULL
)
450 fputs_filtered (TYPE_NAME (type
), stream
);
455 if (TYPE_TAG_NAME (type
) != NULL
|| TYPE_NAME (type
) != NULL
)
456 fputs_filtered (" = ", stream
);
458 if (get_long_set_bounds (type
, &low
, &high
))
460 fprintf_filtered(stream
, "SET OF ");
461 i
= TYPE_N_BASECLASSES (type
);
462 if (m2_is_long_set_of_type (type
, &of_type
))
463 m2_print_type (of_type
, "", stream
, show
- 1, level
, flags
);
466 fprintf_filtered(stream
, "[");
467 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)),
468 stream
, show
- 1, level
, 0);
470 fprintf_filtered(stream
, "..");
472 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)),
473 stream
, show
- 1, level
, 1);
474 fprintf_filtered(stream
, "]");
478 /* i18n: Do not translate the "SET OF" part! */
479 fprintf_filtered(stream
, _("SET OF <unknown>"));
486 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
487 as a Modula-2 unbounded ARRAY type. */
490 m2_is_unbounded_array (struct type
*type
)
492 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
495 * check if we have a structure with exactly two fields named
496 * _m2_contents and _m2_high. It also checks to see if the
497 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
498 * of the pointer determines the unbounded ARRAY OF type.
500 if (TYPE_NFIELDS (type
) != 2)
502 if (strcmp (TYPE_FIELD_NAME (type
, 0), "_m2_contents") != 0)
504 if (strcmp (TYPE_FIELD_NAME (type
, 1), "_m2_high") != 0)
506 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, 0)) != TYPE_CODE_PTR
)
513 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
514 parameter type then display the type as an
515 ARRAY OF type. Returns TRUE if an unbounded
516 array type was detected. */
519 m2_unbounded_array (struct type
*type
, struct ui_file
*stream
, int show
,
520 int level
, const struct type_print_options
*flags
)
522 if (m2_is_unbounded_array (type
))
526 fputs_filtered ("ARRAY OF ", stream
);
527 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, 0)),
528 "", stream
, 0, level
, flags
);
536 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
537 int level
, const struct type_print_options
*flags
)
539 /* Print the tag if it exists. */
540 if (TYPE_TAG_NAME (type
) != NULL
)
542 if (!startswith (TYPE_TAG_NAME (type
), "$$"))
544 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
546 fprintf_filtered (stream
, " = ");
552 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
553 fprintf_filtered (stream
, "RECORD ... END ");
554 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
555 fprintf_filtered (stream
, "CASE ... END ");
560 int len
= TYPE_NFIELDS (type
);
562 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
563 fprintf_filtered (stream
, "RECORD\n");
564 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
565 /* i18n: Do not translate "CASE" and "OF". */
566 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
568 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
572 print_spaces_filtered (level
+ 4, stream
);
573 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
574 fputs_filtered (" : ", stream
);
575 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
577 stream
, 0, level
+ 4, flags
);
578 if (TYPE_FIELD_PACKED (type
, i
))
580 /* It is a bitfield. This code does not attempt
581 to look at the bitpos and reconstruct filler,
582 unnamed fields. This would lead to misleading
583 results if the compiler does not put out fields
584 for such things (I don't know what it does). */
585 fprintf_filtered (stream
, " : %d",
586 TYPE_FIELD_BITSIZE (type
, i
));
588 fprintf_filtered (stream
, ";\n");
591 fprintfi_filtered (level
, stream
, "END ");
596 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
603 /* If we just printed a tag name, no need to print anything else. */
604 if (TYPE_TAG_NAME (type
) == NULL
)
605 fprintf_filtered (stream
, "(...)");
607 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
609 fprintf_filtered (stream
, "(");
610 len
= TYPE_NFIELDS (type
);
612 for (i
= 0; i
< len
; i
++)
616 fprintf_filtered (stream
, ", ");
618 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
619 if (lastval
!= TYPE_FIELD_ENUMVAL (type
, i
))
621 fprintf_filtered (stream
, " = %s",
622 plongest (TYPE_FIELD_ENUMVAL (type
, i
)));
623 lastval
= TYPE_FIELD_ENUMVAL (type
, i
);
627 fprintf_filtered (stream
, ")");
This page took 0.052216 seconds and 4 git commands to generate.