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"
36 static void m2_print_bounds (struct type
*type
,
37 struct ui_file
*stream
, int show
, int level
,
40 static void m2_typedef (struct type
*, struct ui_file
*, int, int,
41 const struct type_print_options
*);
42 static void m2_array (struct type
*, struct ui_file
*, int, int,
43 const struct type_print_options
*);
44 static void m2_pointer (struct type
*, struct ui_file
*, int, int,
45 const struct type_print_options
*);
46 static void m2_ref (struct type
*, struct ui_file
*, int, int,
47 const struct type_print_options
*);
48 static void m2_procedure (struct type
*, struct ui_file
*, int, int,
49 const struct type_print_options
*);
50 static void m2_union (struct type
*, struct ui_file
*);
51 static void m2_enum (struct type
*, struct ui_file
*, int, int);
52 static void m2_range (struct type
*, struct ui_file
*, int, int,
53 const struct type_print_options
*);
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
,
57 static int m2_long_set (struct type
*type
, struct ui_file
*stream
,
58 int show
, int level
, const struct type_print_options
*flags
);
59 static int m2_unbounded_array (struct type
*type
, struct ui_file
*stream
,
61 const struct type_print_options
*flags
);
62 static void m2_record_fields (struct type
*type
, struct ui_file
*stream
,
63 int show
, int level
, const struct type_print_options
*flags
);
64 static void m2_unknown (const char *s
, struct type
*type
,
65 struct ui_file
*stream
, int show
, int level
);
67 int m2_is_long_set (struct type
*type
);
68 int m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
);
69 int m2_is_unbounded_array (struct type
*type
);
73 m2_print_type (struct type
*type
, const char *varstring
,
74 struct ui_file
*stream
,
76 const struct type_print_options
*flags
)
85 fputs_filtered (_("<type unknown>"), stream
);
89 switch (TYPE_CODE (type
))
92 m2_short_set(type
, stream
, show
, level
);
95 case TYPE_CODE_STRUCT
:
96 if (m2_long_set (type
, stream
, show
, level
, flags
)
97 || m2_unbounded_array (type
, stream
, show
, level
, flags
))
99 m2_record_fields (type
, stream
, show
, level
, flags
);
102 case TYPE_CODE_TYPEDEF
:
103 m2_typedef (type
, stream
, show
, level
, flags
);
106 case TYPE_CODE_ARRAY
:
107 m2_array (type
, stream
, show
, level
, flags
);
111 m2_pointer (type
, stream
, show
, level
, flags
);
115 m2_ref (type
, stream
, show
, level
, flags
);
118 case TYPE_CODE_METHOD
:
119 m2_unknown (_("method"), type
, stream
, show
, level
);
123 m2_procedure (type
, stream
, show
, level
, flags
);
126 case TYPE_CODE_UNION
:
127 m2_union (type
, stream
);
131 m2_enum (type
, stream
, show
, level
);
137 case TYPE_CODE_UNDEF
:
138 /* i18n: Do not translate the "struct" part! */
139 m2_unknown (_("undef"), type
, stream
, show
, level
);
142 case TYPE_CODE_ERROR
:
143 m2_unknown (_("error"), type
, stream
, show
, level
);
146 case TYPE_CODE_RANGE
:
147 m2_range (type
, stream
, show
, level
, flags
);
151 m2_type_name (type
, stream
);
156 /* Print a typedef using M2 syntax. TYPE is the underlying type.
157 NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
161 m2_print_typedef (struct type
*type
, struct symbol
*new_symbol
,
162 struct ui_file
*stream
)
164 CHECK_TYPEDEF (type
);
165 fprintf_filtered (stream
, "TYPE ");
166 if (!TYPE_NAME (SYMBOL_TYPE (new_symbol
))
167 || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol
))),
168 SYMBOL_LINKAGE_NAME (new_symbol
)) != 0)
169 fprintf_filtered (stream
, "%s = ", SYMBOL_PRINT_NAME (new_symbol
));
171 fprintf_filtered (stream
, "<builtin> = ");
172 type_print (type
, "", stream
, 0);
173 fprintf_filtered (stream
, ";\n");
176 /* m2_type_name - if a, type, has a name then print it. */
179 m2_type_name (struct type
*type
, struct ui_file
*stream
)
181 if (TYPE_NAME (type
) != NULL
)
182 fputs_filtered (TYPE_NAME (type
), stream
);
185 /* m2_range - displays a Modula-2 subrange type. */
188 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
189 int level
, const struct type_print_options
*flags
)
191 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
192 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
,
196 struct type
*target
= TYPE_TARGET_TYPE (type
);
198 fprintf_filtered (stream
, "[");
199 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
200 fprintf_filtered (stream
, "..");
201 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
202 fprintf_filtered (stream
, "]");
207 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
208 int level
, const struct type_print_options
*flags
)
210 if (TYPE_NAME (type
) != NULL
)
212 fputs_filtered (TYPE_NAME (type
), stream
);
213 fputs_filtered (" = ", stream
);
215 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
218 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
220 static void m2_array (struct type
*type
, struct ui_file
*stream
,
221 int show
, int level
, const struct type_print_options
*flags
)
223 fprintf_filtered (stream
, "ARRAY [");
224 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
225 && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type
))
227 if (TYPE_INDEX_TYPE (type
) != 0)
229 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
230 fprintf_filtered (stream
, "..");
231 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
234 fprintf_filtered (stream
, "%d",
236 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
238 fprintf_filtered (stream
, "] OF ");
239 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
243 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
244 int level
, const struct type_print_options
*flags
)
246 if (TYPE_CONST (type
))
247 fprintf_filtered (stream
, "[...] : ");
249 fprintf_filtered (stream
, "POINTER TO ");
251 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
255 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
256 int level
, const struct type_print_options
*flags
)
258 fprintf_filtered (stream
, "VAR");
259 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
, flags
);
263 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
266 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
269 static void m2_union (struct type
*type
, struct ui_file
*stream
)
271 fprintf_filtered (stream
, "union");
275 m2_procedure (struct type
*type
, struct ui_file
*stream
,
276 int show
, int level
, const struct type_print_options
*flags
)
278 fprintf_filtered (stream
, "PROCEDURE ");
279 m2_type_name (type
, stream
);
280 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
282 int i
, len
= TYPE_NFIELDS (type
);
284 fprintf_filtered (stream
, " (");
285 for (i
= 0; i
< len
; i
++)
289 fputs_filtered (", ", stream
);
292 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0, flags
);
294 if (TYPE_TARGET_TYPE (type
) != NULL
)
296 fprintf_filtered (stream
, " : ");
297 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0, flags
);
303 m2_print_bounds (struct type
*type
,
304 struct ui_file
*stream
, int show
, int level
,
307 struct type
*target
= TYPE_TARGET_TYPE (type
);
309 if (TYPE_NFIELDS(type
) == 0)
313 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
315 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
319 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
321 fprintf_filtered(stream
, "SET [");
322 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
325 fprintf_filtered(stream
, "..");
326 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
328 fprintf_filtered(stream
, "]");
332 m2_is_long_set (struct type
*type
)
334 LONGEST previous_high
= 0; /* Unnecessary initialization
335 keeps gcc -Wall happy. */
339 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
342 /* check if all fields of the RECORD are consecutive sets. */
344 len
= TYPE_NFIELDS (type
);
345 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
347 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
349 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
351 if (TYPE_FIELD_NAME (type
, i
) != NULL
352 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
354 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
355 if ((i
> TYPE_N_BASECLASSES (type
))
356 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
358 previous_high
= TYPE_HIGH_BOUND (range
);
365 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
366 understands that CHARs might be signed.
367 This should be integrated into gdbtypes.c
368 inside get_discrete_bounds. */
371 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
373 CHECK_TYPEDEF (type
);
374 switch (TYPE_CODE (type
))
377 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
379 if (!TYPE_UNSIGNED (type
))
381 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
388 return get_discrete_bounds (type
, lowp
, highp
);
392 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
393 SET OF <oftype> of_type is assigned to the
397 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
405 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
407 len
= TYPE_NFIELDS (type
);
408 i
= TYPE_N_BASECLASSES (type
);
411 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
412 target
= TYPE_TARGET_TYPE (range
);
414 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
415 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
417 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
418 return (l1
== l2
&& h1
== h2
);
419 error (_("long_set failed to find discrete bounds for its subtype"));
422 error (_("expecting long_set"));
427 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
,
428 const struct type_print_options
*flags
)
430 struct type
*of_type
;
432 int len
= TYPE_NFIELDS (type
);
436 if (m2_is_long_set (type
))
438 if (TYPE_TAG_NAME (type
) != NULL
)
440 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
444 else if (TYPE_NAME (type
) != NULL
)
446 fputs_filtered (TYPE_NAME (type
), stream
);
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
, flags
);
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
, "]");
474 /* i18n: Do not translate the "SET OF" part! */
475 fprintf_filtered(stream
, _("SET OF <unknown>"));
482 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
483 as a Modula-2 unbounded ARRAY type. */
486 m2_is_unbounded_array (struct type
*type
)
488 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
491 * check if we have a structure with exactly two fields named
492 * _m2_contents and _m2_high. It also checks to see if the
493 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
494 * of the pointer determines the unbounded ARRAY OF type.
496 if (TYPE_NFIELDS (type
) != 2)
498 if (strcmp (TYPE_FIELD_NAME (type
, 0), "_m2_contents") != 0)
500 if (strcmp (TYPE_FIELD_NAME (type
, 1), "_m2_high") != 0)
502 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, 0)) != TYPE_CODE_PTR
)
509 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
510 parameter type then display the type as an
511 ARRAY OF type. Returns TRUE if an unbounded
512 array type was detected. */
515 m2_unbounded_array (struct type
*type
, struct ui_file
*stream
, int show
,
516 int level
, const struct type_print_options
*flags
)
518 if (m2_is_unbounded_array (type
))
522 fputs_filtered ("ARRAY OF ", stream
);
523 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type
, 0)),
524 "", stream
, 0, level
, flags
);
532 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
533 int level
, const struct type_print_options
*flags
)
535 /* Print the tag if it exists. */
536 if (TYPE_TAG_NAME (type
) != NULL
)
538 if (strncmp (TYPE_TAG_NAME (type
), "$$", 2) != 0)
540 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
542 fprintf_filtered (stream
, " = ");
548 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
549 fprintf_filtered (stream
, "RECORD ... END ");
550 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
551 fprintf_filtered (stream
, "CASE ... END ");
556 int len
= TYPE_NFIELDS (type
);
558 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
559 fprintf_filtered (stream
, "RECORD\n");
560 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
561 /* i18n: Do not translate "CASE" and "OF". */
562 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
564 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
568 print_spaces_filtered (level
+ 4, stream
);
569 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
570 fputs_filtered (" : ", stream
);
571 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
573 stream
, 0, level
+ 4, flags
);
574 if (TYPE_FIELD_PACKED (type
, i
))
576 /* It is a bitfield. This code does not attempt
577 to look at the bitpos and reconstruct filler,
578 unnamed fields. This would lead to misleading
579 results if the compiler does not put out fields
580 for such things (I don't know what it does). */
581 fprintf_filtered (stream
, " : %d",
582 TYPE_FIELD_BITSIZE (type
, i
));
584 fprintf_filtered (stream
, ";\n");
587 fprintfi_filtered (level
, stream
, "END ");
592 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
599 /* If we just printed a tag name, no need to print anything else. */
600 if (TYPE_TAG_NAME (type
) == NULL
)
601 fprintf_filtered (stream
, "(...)");
603 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
605 fprintf_filtered (stream
, "(");
606 len
= TYPE_NFIELDS (type
);
608 for (i
= 0; i
< len
; i
++)
612 fprintf_filtered (stream
, ", ");
614 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
615 if (lastval
!= TYPE_FIELD_ENUMVAL (type
, i
))
617 fprintf_filtered (stream
, " = %s",
618 plongest (TYPE_FIELD_ENUMVAL (type
, i
)));
619 lastval
= TYPE_FIELD_ENUMVAL (type
, i
);
623 fprintf_filtered (stream
, ")");
This page took 0.042539 seconds and 5 git commands to generate.